wikidata-mcp-server について
wikidata-mcp-serverは、Wikidataナレッジグラフを扱う研究者やエージェント向けのサーバーです。エンティティ検索、取得、SPARQLクエリ、外部ID解決に対応し、大きすぎるエンティティやステートメントは絞り込み取得に役立つ概要を返します。
主な機能
- 01項目とプロパティの検索
- 02エンティティ、ステートメント、サイトリンクの取得
- 03エンティティラベルの一括解決
- 04SPARQL SELECTクエリの実行
- 05外部識別子からエンティティを解決
活用シーン
- 01キーワードによるWikidataエンティティの検索
- 02SPARQLによるグラフデータの照会と整理
- 03DOI、PMID、ORCIDからエンティティを検索
MCP 対応
STDIOまたはStreamable HTTP経由で、7つのツールと1つのエンティティリソースをMCPクライアントに公開します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://wikidata.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-wikidata https://wikidata.caseyjhand.com/mcp{"mcpServers":{"cyanheads-wikidata":{"type":"http","url":"https://wikidata.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-wikidata":{"type":"http","url":"https://wikidata.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-wikidata":{"type":"http","url":"https://wikidata.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-wikidata":{"serverUrl":"https://wikidata.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
7| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| type | enum | いいえ | 検索するエンティティの種類です。Q-ID(人物、場所、概念)には "item"、P-ID(述語)には "property" を使用してください。item | property |
| limit | integer | いいえ | 返す結果の最大数です。範囲:1–50。 |
| query | string | はい | エンティティのラベル、別名、説明との照合に使用する検索語です。 |
| offset | integer | いいえ | ページネーションのオフセットです。0 から始め、結果ページを進めるたびに limit を加算します。 |
| language | string | いいえ | 返されるラベルと説明に使用する Wikidata の言語コードです(例:"en"、"de"、"zh-hant")。大文字と小文字は区別されません。"_" は "-" として扱われ、空欄の場合は "en" になります。 |
詳細
@cyanheads/wikidata-mcp-server
MCP を介して Wikidata のエンティティを検索・取得し、SPARQL クエリを実行して、外部識別子を解決します。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://wikidata.caseyjhand.com/mcp
概要
Wikidata のナレッジグラフを利用できます。エンティティを検索・取得し、SPARQL でグラフをたどり、DOI、PMID、ORCID、OpenAlex、IMDb などの外部識別子を対応する Wikidata 項目に解決します。API キーは不要です。
ツール
| ツール | 説明 |
|---|---|
wikidata_search_entities | テキストクエリで項目またはプロパティを検索し、ラベル、説明、マッチに関するメタデータとともに QID/PID を返します |
wikidata_get_entity | QID または PID でエンティティ全体を取得します。フィールドや言語での絞り込みも指定できます |
wikidata_get_labels | 最大 50 個の QID または PID を、読みやすいラベルと説明に一括で解決します |
wikidata_get_statements | エンティティのプロパティ主張を、修飾子の詳細と QID ラベルの解決を含めて取得します |
wikidata_get_sitelinks | Wikidata 項目に対応する Wikipedia および Wikimedia プロジェクトの記事 URL を取得します |
wikidata_sparql_query | Wikidata Query Service に対して SPARQL SELECT クエリを実行します |
wikidata_resolve_external_id | 外部識別子(DOI、PubMed ID、ORCID、OpenAlex ID など)で Wikidata エンティティを検索します |
リソース
| リソース | 説明 |
|---|---|
wikidata://entity/{id} | Wikidata エンティティの簡潔な Markdown サマリー。ラベル、英語の説明、instance-of、Wikipedia リンク、画像、主張の件数を含みます |
すべてのリソースデータはツールからも取得できます。
機能リファレンス
wikidata_search_entities ツール
- ラベル、別名、説明を検索します。人物、場所、作品には
type="item"、P-ID にはtype="property"を指定します - Wikidata の言語コード(
en、de、pt-br。大文字と小文字は区別されません)を受け付けます。オフセットページネーションに対応し、1 回の呼び出しで最大 50 件を返します - 各検索結果には、ラベルと別名のどちらに一致したかを示す一致メタデータが含まれます
wikidata_get_entity ツール
- Q-ID(例:
Q76)では項目を、P-ID(例:P31)ではプロパティを取得します。fieldsではlabels、descriptions、aliases、statements、sitelinksを選択し、上流からの取得範囲を絞り込みます(Q76 全体は 344,114 バイトですが、labelsのみなら 6,703 バイトです) languagesは、多言語マップを指定した言語コードに絞り込みます- エンティティが大きすぎてインライン表示できない場合は、フィールドカテゴリとバイト数の概要を返します。その
retrieval_noticeには、取得可能なfieldsのセットが記載され、サイズ超過したステートメントやサイトリンクを絞り込めるツールが示されます
wikidata_get_labels ツール
- MediaWiki の
wbgetentitiesAPI を使用し、1 回の呼び出しで最大 50 個の ID を指定できます。リクエストごとに 1 つ以上の言語コードを指定できます - 部分的な結果の場合は、
found件数とnotFoundID を報告します - SPARQL クエリの後に使うことを想定しています。まずクエリを実行し、その後 QID を人が読みやすい形式にします
wikidata_get_statements ツール
propertiesで取得対象を特定の P-ID に絞り込みます(省略するとすべてが対象です)。値、修飾子、参照に含まれる項目 QID と数量単位は、resolve_labels=falseを指定しない限りラベルに解決されます- 参照はソースごとにまとめられます。不明な値または存在しない値は
somevalue/novalueとして返されます - ステートメントのセットが大きすぎてインライン表示できない場合は、P-ID とバイト数の概要を大きい順に返します(絞り込みなしの場合、Q30 には 1,717 件のステートメントにまたがる 467 個のプロパティがあります)。
retrieval_noticeの提案に従い、サイズの合計が 24,000 以下となるpropertiesを指定して再度呼び出してください
wikidata_get_sitelinks ツール
- サイトコード(例:
enwiki)を記事タイトルと URL に対応付けます。sitesで特定のコードに絞り込めます wikis_only=trueを指定すると、Wikipedia のリンクのみを残します(Wiktionary、Wikiquote、Wikisource などは除外されます)- Q-ID のみ対応しており、P-ID はサポートされていません
wikidata_sparql_query ツール
- Wikidata Query Service(Blazegraph)に対して SELECT クエリを実行します。ASK、CONSTRUCT、DESCRIBE、更新クエリ、通常の検索テキストは、リクエスト送信前に拒否されます
- 標準のプレフィックス(
wd:、wdt:、p:、ps:、pq:、wikibase:、bd:)と、クエリで?<var>Label、?<var>Description、または?<var>AltLabel変数を使用した場合のwikibase:labelSERVICE は自動的に追加されます。languageには 1 つのコード、またはfr,enのようなフォールバックリストを指定します - 結果は SPARQL 1.1 JSON バインディング形式で、レスポンスあたり最大 64,000 バイトに制限され、行全体の区切りで切り詰められます。結果が大きすぎる場合は、先頭の行と
returnedCount、totalCountを返し、ORDER BYとLIMIT/OFFSETを使ったページネーションまたは集計を促す通知が含まれます - クライアントの
timeoutは 1~55 秒です(サーバーのハードリミットは 60 秒)。レート制限は 1 分あたり 60 リクエスト、IP あたり同時 5 リクエストです
wikidata_resolve_external_id ツール
- DOI(P356)、PMID(P698)、ORCID(P496)、OpenAlex ID(P10283)、IMDb ID(P345)などの外部 ID を QID に解決します。空白とリゾルバー URL のプレフィックスは削除され、DOI、PMID、ORCID は正規化されます
- プロパティのデータ型は
external-idである必要があります。項目値型またはメディア型のプロパティ(例:P31、P18)は拒否されます - 見つからない場合は
match=nullを返します(Query Service はライブの wiki より更新が遅れるため、null は存在しない証拠にはなりません)。同じ ID を複数のエンティティが使用している場合はmultipleMatchesを返します。ラベルには指定したlanguageが使われ、該当するものがなければmulにフォールバックします
wikidata://entity/{id} リソース
- コンパクトな Markdown の概要です。ラベル(全言語)、英語の説明、instance-of(
P31)、enwiki の Wikipedia リンク、画像(P18)、ステートメント数が含まれます text/markdownとして返されます。エンティティの全データを取得するにはwikidata_get_entityを使用してくださいidには Q-ID または P-ID を指定します。いずれもツールで受け付ける識別子です
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、プラグイン可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを提供します。
Wikidata 固有の機能:
- エンティティとステートメントの取得には Wikidata REST API v1 を使用します。ルックアップ操作に SPARQL のオーバーヘッドはありません
- 効率的なラベルの一括解決には MediaWiki
wbgetentitiesAPI を使用します - SPARQL では Wikidata Query Service(Blazegraph)を使用し、プレフィックスヘッダーとラベル SERVICE を自動挿入します
- Wikimedia のポリシーに準拠した
User-Agentを設定できます(WIKIDATA_USER_AGENT) - REST と SPARQL のエンドポイントでタイムアウトを個別に設定できます(
WIKIDATA_REST_TIMEOUT_MS、WIKIDATA_SPARQL_TIMEOUT_MS)
エージェントに適した出力:
- すべてのツールは、追跡可能性を高めるため、関連する入力パラメーターをレスポンスに含めます
wikidata_get_labelsは SPARQL の結果セットに続けて使用することを想定しており、クエリを実行した後、1 回の呼び出しで人間が読みやすい形式に変換できます- 外部 ID に重複したクレームがある Wikidata のデータ整合性の問題が発生した場合、
wikidata_resolve_external_idは誤って null を返す代わりにmultipleMatchesを返します - サイズの大きすぎるエンティティやステートメントセットには、切り詰められたレスポンスや過大なレスポンスの代わりに、フィールド/プロパティのサイズと、正確な再呼び出し方法を示す
retrieval_noticeを含むkind: "outline"ペイロードを返します
はじめに
公開ホストインスタンス
https://wikidata.caseyjhand.com/mcp で公開インスタンスを利用できます。インストールは不要です。Streamable HTTP を提供しており、クライアントごとに設定形式が異なります。
Claude Code の場合:
claude mcp add --transport http wikidata-mcp-server https://wikidata.caseyjhand.com/mcp
Cline の場合(cline_mcp_settings.json):
{
"mcpServers": {
"wikidata-mcp-server": {
"type": "streamableHttp",
"url": "https://wikidata.caseyjhand.com/mcp"
}
}
}
Cursor の場合(mcp.json):
{
"mcpServers": {
"wikidata-mcp-server": {
"url": "https://wikidata.caseyjhand.com/mcp"
}
}
}
Claude Desktop では、Settings → Connectors からリモートサーバーを追加できます。
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加します。
{
"mcpServers": {
"wikidata-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/wikidata-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、npx を使用します(Bun は不要です)。
{
"mcpServers": {
"wikidata-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/wikidata-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、Docker を使用します。
{
"mcpServers": {
"wikidata-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/wikidata-mcp-server:latest"]
}
}
}
Streamable HTTP を使用する場合は、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以上(または Node.js ≥ 24.0.0)。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/wikidata-mcp-server.git
- ディレクトリに移動します:
cd wikidata-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env and set any overrides
設定
すべての設定は、起動時に Zod スキーマを使用して検証されます。主な環境変数:
| 変数 | 説明 | デフォルト |
|---|---|---|
MCP_TRANSPORT_TYPE | トランスポート:stdio または http | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート | 3010 |
MCP_HTTP_ENDPOINT_PATH | MCP サーバーがマウントされる HTTP エンドポイントのパス | /mcp |
MCP_PUBLIC_URL | TLS 終端リバースプロキシ環境向けのパブリックオリジンの上書き値 | なし |
MCP_AUTH_MODE | 認証:none、jwt、または oauth | none |
MCP_SESSION_MODE | HTTP セッションモード:stateful、stateless、または auto | stateless |
MCP_LOG_LEVEL | ログレベル(debug、info、notice、warning、error) | info |
MCP_GC_PRESSURE_INTERVAL_MS | オプトインによる強制 GC の間隔(ミリ秒、Bun のみ) | 0(無効) |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ) | <project-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1 | in-memory |
WIKIDATA_USER_AGENT | Wikimedia リクエストに使用する User-Agent 文字列(ポリシーにより、説明的な値が必要です) | wikidata-mcp-server/0.1 (https://github.com/cyanheads/wikidata-mcp-server) |
WIKIDATA_SPARQL_TIMEOUT_MS | SPARQL レスポンスの最大待機時間(ミリ秒) | 55000 |
WIKIDATA_REST_TIMEOUT_MS | REST API レスポンスの最大待機時間(ミリ秒) | 10000 |
OTEL_ENABLED | OpenTelemetry を有効にする | false |
すべてのオプションの上書き設定については、.env.example を参照してください。
サーバーの実行
ローカル開発
-
本番バージョンをビルドして実行します:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行します:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Docker
docker build -t wikidata-mcp-server .
docker run --rm -p 3010:3010 wikidata-mcp-server
Dockerfile のデフォルトでは、HTTP トランスポート、ステートレスセッションモードを使用し、ログを /var/log/wikidata-mcp-server に出力します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツールとリソースを登録し、サービスを初期化します。 |
src/mcp-server/tools | ツールの定義(*.tool.ts)です。エンティティ検索、ステートメント、サイトリンク、SPARQL、外部 ID 解決のための 7 つのツールがあります。 |
src/mcp-server/resources | リソースの定義です。エンティティ概要リソースがあります。 |
src/services/wikidata | Wikidata サービスレイヤーです。REST API クライアント、SPARQL クライアント、ステートメントの正規化、型定義を提供します。 |
src/config | Zod を使用して、サーバー固有の環境変数を解析・検証します。 |
tests/ | src/ の構成に対応した単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。概要は次のとおりです。
- ハンドラーは例外をスローし、フレームワークがキャッチします。ツールのロジック内で
try/catchを使用しないでください。 - ログには
ctx.logを、ストレージにはctx.stateを使用してください。 - 新しいツールとリソースは、
createApp()の配列に登録してください。 - 外部 API 呼び出しをラップする際は、生データを検証し、ドメイン型に正規化してから出力スキーマに従って返してください。不足しているフィールドを捏造しないでください。
コントリビューション
課題の報告を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。