orange-mcp-wikidata 0.1.0
MCP Wikidata Server
Requires Python: >=3.6

## Wikidata MCP Server

A server implementation for Wikidata API using the Model Context Protocol (MCP).
This project provides tools to interact with Wikidata, such as **searching identifiers** (entity and property), **extracting metadata** (label and description) and **executing sparql query**.

---

### Installation

Install `uv` if it is not installed yet.

```bash
$ curl -LsSf https://astral.sh/uv/install.sh | sh
```

Then, install dependencies.

```bash
$ git clone https://github.com/zzaebok/mcp-wikidata.git
$ cd mcp-wikidata
$ uv sync
# if you want to run client example together
$ uv sync --extra example
```

---

### Run

Run the server with:

```bash
$ uv run src/server.py
```

If you want to test it with a simple client code (with `langchain-mcp-adapters`), run the client with:

```bash
# in another shell
$ uv run src/client.py
```

The LLM extracts valid entity and property identifiers, executes a sparql query, and finally recommend a movie directed by Bong Joon-ho.

<details>
  <summary><i>See the execution output</i></summary>

```python
{
  "messages": [
      HumanMessage(
          content="Can you recommend me a movie directed by Bong Joonho?",
      ),
      AIMessage(
          tool_calls=[
              {
                  "name": "search_entity",
                  "args": {"query": "Bong Joon-ho"},
              }
          ],
      ),
      ToolMessage(
          content="Q495980",
          name="search_entity",
      ),
      AIMessage(
          tool_calls=[
              {
                  "name": "get_properties",
                  "args": {"entity_id": "Q495980"},
              }
          ],
      ),
      ToolMessage(
          content='["P345", "P244", "P214", "P227", ...]',
          name="get_properties",
      ),
      AIMessage(
          tool_calls=[
              {
                  "name": "search_property",
                  "args": {"query": "director"},
              }
          ],
      ),
      ToolMessage(
          content="P57",
          name="search_property",
      ),
      AIMessage(
          tool_calls=[
              {
                  "name": "execute_sparql",
                  "args": {
                      "sparql_query": 'SELECT ?film ?filmLabel WHERE {\n  ?film wdt:P57 wd:Q495980.\n  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }\n} LIMIT 1'
                  },
              }
          ],
      ),
      ToolMessage(
          content='[{"film": {"type": "uri", "value": "http://www.wikidata.org/entity/Q483761"}, "filmLabel": {"xml:lang": "en", "type": "literal", "value": "Mother"}}]',
          name="execute_sparql",
      ),
      AIMessage(
          content='I recommend the movie "Mother," which was directed by Bong Joon-ho.',
      ),
  ]
}
```

</details>

---

### Wikidata MCP Tools

The following tools are implemented in the server:

| Tool                                                 | Description                                                                |
| ---------------------------------------------------- | -------------------------------------------------------------------------- |
| `search_entity(query: str)`                          | Search for a Wikidata entity ID by its query.                              |
| `search_property(query: str)`                        | Search for a Wikidata property ID by its query.                            |
| `get_properties(entity_id: str)`                     | Get the properties associated with a given Wikidata entity ID.             |
| `execute_sparql(sparql_query: str)`                  | Execute a SPARQL query on Wikidata.                                        |
| `get_metadata(entity_id: str, language: str = "en")` | Retrieve the English label and description for a given Wikidata entity ID. |

---

#### License

MIT License