wikipedia-mcp-server について
wikipedia-mcp-serverは、Wikipediaの検索や記事閲覧機能をMCPクライアントに提供します。多言語版、指定セクションの取得、近隣ページの検索に対応しています。
主な機能
- 01Wikipedia記事の検索
- 02要約と全文の取得
- 03指定セクションの取得
- 04位置情報付き近隣ページの検索
- 05記事の言語版一覧の取得
活用シーン
- 01トピックの資料や背景の調査
- 02記事から関連セクションだけを読む
- 03座標付近のページを調べる
MCP 対応
検索、記事・セクションの取得、近隣ページ検索、言語版の照会など、6種類のWikipediaツールをMCPクライアントに公開します。STDIOとStreamable HTTPに対応しています。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://wikipedia.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-wikipedia https://wikipedia.caseyjhand.com/mcp{"mcpServers":{"cyanheads-wikipedia":{"type":"http","url":"https://wikipedia.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-wikipedia":{"type":"http","url":"https://wikipedia.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-wikipedia":{"type":"http","url":"https://wikipedia.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-wikipedia":{"serverUrl":"https://wikipedia.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
6| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | ページあたりの最大結果数(デフォルトは 10、最大は 50)。正の整数である必要があります。 |
| query | string | はい | 検索クエリ(例:"Python programming language")。空にすることはできません。 |
| offset | integer | いいえ | ページネーション用の結果オフセット(デフォルトは 0)。次のページを取得するには、前回のレスポンスの nextOffset を渡します。1 ページあたりの件数は引き続き limit で指定します。オフセットが一致件数の合計を超えると、エラーではなく空の結果配列が返されます。Wikipedia は 10,000 件を超える結果を提供しないため、オフセットがその値以上の場合は失敗します。代わりにクエリを絞り込んでください。 |
| language | string | いいえ | Wikipedia 言語版コード(デフォルトは "en")。例:"fr"、"de"、"ja"。 |
詳細
@cyanheads/wikipedia-mcp-server
MCP 経由で Wikipedia の記事を検索し、要約や全文を読み、セクションを指定し、近くのページを探し、言語版を一覧表示できます。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://wikipedia.caseyjhand.com/mcp
概要
あらゆる言語版の Wikipedia を利用できます。記事を検索し、要約または必要なセクションだけを読み、座標の近くにあるジオタグ付きページを探し、記事の言語版を一覧表示できます。
ツール
| ツール | 説明 |
|---|---|
wikipedia_search_articles | Wikipedia 全体を全文検索し、短い説明、Wikidata QID、プレーンテキストの抜粋、ページ ID を含む関連度順の結果と、Wikipedia によるスペル候補を返します。 |
wikipedia_get_summary | 任意の記事の短い要約を取得します。プレーンテキスト、Wikidata QID、説明、サムネイル URL、ページ種別、正規 URL、改訂版、座標を返します。 |
wikipedia_get_article | 記事全体、または指定したセクションを、セクションマーカーを保持した整形済みプレーンテキストで取得します。正規 URL と読み取り元の改訂版も返します。 |
wikipedia_get_sections | セクションを指定して読み取るための section_index 値を含む目次を取得します。 |
wikipedia_search_nearby | WGS 84 座標から指定半径内にあるジオタグ付き Wikipedia 記事を距離順に取得します。短い説明と Wikidata QID も含まれます。 |
wikipedia_get_languages | 記事で利用可能なすべての言語版について、タイトルと URL を取得します。または、指定した言語版だけを取得できます。 |
機能リファレンス
wikipedia_search_articles tool
- フリーテキストの
query(空の場合はempty_queryで失敗します)、正の整数のlimit(デフォルトは 10、上限は 50)、およびページネーション用のoffsetを受け取り、エンリッチメントとしてnextOffsetを返します。上限が適用された呼び出しでのみ、requestedLimit、appliedLimit、および上限に関する通知が含まれます。Wikipedia は 10,000 件目を超える結果を返さないため、offsetがその値以上の場合はoffset_too_largeで失敗し、その範囲の最後で終わるページにはエンリッチメントとしてtruncatedが含まれます - CirrusSearch の演算子には、
incategory:"1648 treaties"、morelike:Peace of Westphalia、intitle:Python、hastemplate:Infobox、insource:Pythonなどがあります(対応状況はインストール環境によって異なります)。sortのデフォルトはrelevanceです。代替値はlast_edit_desc、create_timestamp_desc、incoming_links_desc、title_natural_ascです。エンリッチメントにはsortがそのまま含まれます。ページネーション時は、sortとqueryを変更せずに使用してください - 各結果にはプレーンテキストの抜粋、ページ ID、単語数に加えて、記事にある場合は短い
descriptionと Wikidata QID(wikibase_item)が含まれます。エンリッチメントのsuggestionには、Wikipedia によるスペル修正(einstien→einstein)が含まれます - 無効または複雑すぎる
insource:/…/およびintitle:/…/の正規表現は、invalid_query、upstreamCode、および正規表現を修正または簡略化するか、演算子を削除するよう促す案内を返して失敗します。正規表現検索が混雑している場合は、再試行できます
wikipedia_get_summary tool
titleを受け取り、REST の要約抜粋(リード冒頭の一部です。リード全体を読むにはsection_index: 0を指定してwikipedia_get_articleを使用します)に加えて、短い説明、サムネイル URL、Wikidata QID(wikibase_item)、およびジオタグ付き記事の場合はwikipedia_search_nearbyにそのまま渡せるlatitude/longitudeを返しますpage_typeはstandard/disambiguation/no-extractを区別します(disambiguationの場合はwikipedia_search_articlesで再検索してください)。url、revision_id、last_modifiedは読み取った版を示し、?oldid=<revision_id>はその版への固定リンクです- 既存のページに要約抜粋がない場合も、メタデータと空の
extractを返して成功し、正規 URL を開くかsection_index: 0を試すよう案内します。名前空間ページには記事本文ではなく、ドキュメントが含まれる場合があります。説明が空の場合は省略されます。タイトルが見つからない場合は、引き続きnot_foundで失敗します
wikipedia_get_article ツール
section_indexを指定しない場合:== Section ==マーカー付きの記事全文を返します。ただし、WIKIPEDIA_ARTICLE_OVERFLOW_BYTES(デフォルトは 80,000 bytes)を超える場合は、セクションの概要(truncated: true)を返します。wikipedia_get_sectionsのsection_indexを指定した場合(導入部は0):そのセクションと入れ子になったサブセクションを返します- 概要の項目には、利用可能な場合、検証済みの
section_indexが含まれます。導入部は0です。曖昧な見出しやインデックスのない見出しには、セクション一覧へのフォールバックが使われます。目次の検証は短時間で 1 回だけ試行し、検証できない場合はその旨を示します - リダイレクトでは
redirected_fromと、セクションを対象とする場合はredirect_sectionが示されます。全文の読み取りは全文のまま返され、対象を絞った読み取り方法も案内されます。明示的にsection_indexを指定した場合は、0を含め、そちらが優先されます - すべての読み取りで
urlとrevision_idが返されます(?oldid=<revision_id>は読み取ったテキストへの恒久リンクです)。概要を含む全文の読み取りでは、last_modifiedも返されます。WIKIPEDIA_BASE_URLが設定されている場合、セクションの読み取りではurlが省略されます - セクションの読み取りでは、系統樹のクレードをインデント付きの分岐としてコードフェンス内に表示し、各行のラベルと葉を対応付け、名前のない分岐も保持します。解析できないツリーは
[table omitted: unparseable clade]として残ります。ツリーにはtable_indexがありません - セクションの読み取りでは、データテーブルはパイプ区切りの行として、インフォボックスは
label: valueの行として返されます。これらは記事全文の抽出では除外されます。レンダリング後のサイズが 40,000 bytes を超えるテーブルは、[table omitted: N rows (table T)]マーカーとして残ります。セクションとともにtable_index: Tを渡すと、そのテーブルを完全な行単位のページで読み取れます。続きは、同じ入力値でnext_cursorをcursorとして渡してください。続きの読み取りでは、1 ページ目のリビジョンが使われます。キャプションとヘッダーは 1 回だけ表示されます。各ページのテーブルテキストは、両方のサーフェスで 40,000 UTF-8 bytes 以内に収まります。ただし、分割できない大きな行、または 1 ページ目のキャプション/ヘッダーだけが返される場合は例外で、その場合はoversized_row: trueが付きます
wikipedia_get_sections ツール
titleを受け取り、セクションタイトル、見出しレベル、階層番号(例:"2.1")、およびwikipedia_get_articleに渡すsection_indexを返します。最初の項目は導入部です(index: 0、タイトルはIntroduction)- 見出しタイトルには、記事レンダラーと同じスクリプト、数式、空白、および単一パスのエンティティ正規化が適用されます。そのため、セクション一覧、記事の読み取り、検証済みの概要項目で
CO₂は同じ表記になります - スタブ記事または非常に短い記事では
no_sectionsで失敗します。その場合は代わりにwikipedia_get_articleで読み取ってください - リダイレクトの別名では
redirected_fromと、省略可能なredirect_sectionが示されます。redirect_section_indexは、一意のアンカーが実際の数値の目次インデックスに一致する場合にのみ表示されます
wikipedia_search_nearby ツール
latitudeは −90…90、longitudeは −180…180(WGS 84)、radius_metersは 10~10,000(デフォルトは 1000)、limitは正の整数(デフォルトは 10、上限は 500)です。limitを超えるページネーションはありません。補足情報のtruncatedフラグは、limitの上限によって一致結果がさらにあることを示します。Wikipedia の上限である 500 件の場合は、半径を狭めて再検索してください。上限が適用された呼び出しにのみ、requestedLimit、appliedLimit、上限適用の通知が含まれますdistance_metersの昇順で記事を返し、座標、短いdescription、Wikidata QID(wikibase_item)を含みます。各記事の位置は、その記事自体の GeoData 座標タグによって決まり、Wikidata 項目の座標では決まりません。そのため、誤ったタグが付いた記事は、そのタグが示す位置に表示されます
wikipedia_get_languages ツール
titleを受け取り、各言語版のlanguage_code、edition_code、記事タイトル、URLに加え、解決後のタイトルであるsource_titleを返します。他のツールでlanguageとして渡すのはlanguage_codeではなくedition_codeです。この 2 つは異なる場合があります(gswとals)editionsを指定すると、一覧を要求されたコードに絞り込みます。記事が存在しないコードはmissingに返され、total_languagesはフィルター適用前の件数のままです。記事に翻訳がない場合はno_other_languagesで失敗します。フィルターに一致する項目がない場合は、失敗ではなく空のリストを返します
特長
@cyanheads/mcp-ts-core を基盤としています。stdio および Streamable HTTP トランスポート、差し替え可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースを備えた構造化ログに対応しています。
Wikipedia 固有の機能:
- 2 種類の API を統合しています。概要には MediaWiki REST API(
/api/rest_v1/)、検索、全文、セクション、地理検索、言語リンクには Action API(/w/api.php)を使用します - 必須リクエストではすべてリトライとバックオフを行います。HTTP 200 の本文内で Action API が返す一時的な拒否(検索過多、レート制限、読み取り専用)も対象です。上流の
Retry-Afterを尊重し、各リクエストのリトライは 30 s 以内に制限されます。検索結果の説明取得はベストエフォートで短時間の試行を 1 回だけ行います。Wikimedia API ポリシーに従い、User-Agentヘッダーを設定します - すべての読み取り処理では、単一のレンダラーを通して HTML を同一形式のプレーンテキストに変換します。
== Heading ==マーカーを使用し、リスト項目は 1 行に 1 つ、上付き文字は保持し、コードはフェンスで囲みます。対象は、Action API の HTML 抽出による記事全文、パーサーが生成するセクションの HTML によるセクション、REST のextract_htmlによる概要です。セクションの読み取りには、抽出データに含まれないデータテーブル、インフォボックス、レイアウトテーブル内のリストも含まれます - すべてのツールで呼び出しごとに
languageパラメーターを指定できます(デフォルトはen)。1 つのセッションですべての Wikipedia 言語版にアクセスできます。記事タイトルを読み取る際は、すべてリダイレクトに従います - MediaWiki の
action=sitematrixエンドポイントから取得する、最新の言語版レジストリ(24 時間キャッシュ)で言語を検証します。これにより、形式上は有効でも実在しない言語版がタイムアウトを引き起こす前に検出できます
エージェントに適した出力:
- 概要の
page_typeはstandard/disambiguation/no-extractを区別するため、文字列の解析は不要です - 概要、検索結果、近隣検索結果の
wikibase_item(Wikidata QID)により、wikidata-mcp-server と直接相互参照できます - 記事本文、抜粋、タイトルは、Markdown の
content[]表示に渡す際にバックスラッシュでエスケープされます。そのため、マークアップや Markdown 構文について記述した記事も、クライアントに解釈されずそのまま表示されます。structuredContentには同じテキストがエスケープされずに格納されます。フェンス付きコードブロックとテーブル行の区切りはエスケープされず、テーブルセルはエスケープされます - 目次項目の
section_indexは、wikipedia_get_articleの対象読み取りパラメーターに直接対応します。インデックス 0 も含まれます - MediaWiki でページ名に使用できない文字(
< > [ ] { }、複数タイトルの区切り文字|、パーセントエスケープ、特殊なチルダ、相対パス)は、リクエスト前に拒否され、invalid_titleが返されます。末尾の#fragmentは受け付けられ、通常どおり解決されます - あらゆる種類のエラーに復旧のヒントを付けます。呼び出し元は実行可能な次の手順(例:「正しいタイトルを見つけるには
wikipedia_search_articlesを使用してください」)を確認できます
はじめに
公開ホストインスタンス
公開インスタンスは https://wikipedia.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP 経由で任意の MCP クライアントから接続してください。
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "streamable-http",
"url": "https://wikipedia.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/wikipedia-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、npx を使用する場合(Bun は不要です):
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/wikipedia-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、Docker を使用します。
{
"mcpServers": {
"wikipedia-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/wikipedia-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 v24 以降)。
- API キーは不要です。Wikipedia の API は公開されています。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/wikipedia-mcp-server.git
- ディレクトリに移動します:
cd wikipedia-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します(任意):
cp .env.example .env
# edit .env if you want to customize WIKIPEDIA_USER_AGENT or logging
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
WIKIPEDIA_USER_AGENT | Wikimedia API リクエストごとに送信される User-Agent ヘッダーです。デプロイ環境に合わせてカスタマイズしてください。 | wikipedia-mcp-server/0.2.8 (https://github.com/cyanheads/wikipedia-mcp-server) |
WIKIPEDIA_BASE_URL | 単一インスタンスを対象とする任意の上書き設定です。未設定(デフォルト)の場合、言語ごとのホストを組み立て、呼び出しごとに language でエディションを選択します。完全なベース URL(例:プライベートな MediaWiki ミラー)を設定すると、すべての呼び出しをその固定ホストにルーティングします。この場合、language でホストは切り替わりません。 | (未設定) |
WIKIPEDIA_ARTICLE_OVERFLOW_BYTES | 全文記事の読み取り(section_index を指定しない wikipedia_get_article)でこのバイト数を超えると、全文の代わりにセクションの概要を返します。このドメインに合わせて調整されており、通常の記事は全文のままです。概要が返されるのは、実際に巨大な記事(第二次世界大戦:約86 KB、アメリカ合衆国:約94 KB)のみです。セクションを指定した読み取りには影響しません。 | 80000 |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモード:stateless、stateful、または auto(stateful に解決されます)。Docker イメージでは stateless が設定されています。 | auto |
MCP_AUTH_MODE | 認証モード:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424)です。 | info |
LOGS_DIR | ログファイルのディレクトリです(Node.js のみ)。 | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 失敗した各ツール呼び出しの引数と結果を、キー名で機密情報を伏せ、LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(デフォルトは 16384)を上限としてログに記録します。自由形式の値に含まれるシークレットは伏せられません。 | false |
OTEL_ENABLED | OpenTelemetry の計装(スパン、メトリクス、完了ログ)を有効にします。 | false |
任意の上書き設定の全一覧は .env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t wikipedia-mcp-server .
docker run --rm -p 3010:3010 wikipedia-mcp-server
Dockerfile では、デフォルトで HTTP トランスポート、ステートレスセッションモードを使用し、ログを /var/log/wikipedia-mcp-server に出力します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツールを登録し、Wikipedia サービスを初期化します。 |
src/config | Zod を使用してサーバー固有の環境変数を解析・検証します。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。ツールごとに1ファイルを使用します。 |
src/services/wikipedia | WikipediaService です。リトライ/バックオフと言語検証に対応した REST API および Action API クライアントを提供します。 |
tests/ | src/ に対応する単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで
try/catchを使用しないでください - リクエストスコープのログには
ctx.log、テナントスコープのストレージにはctx.stateを使用してください - 新しいツールは
src/mcp-server/tools/definitions/index.tsに登録してください - 外部 API 呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから出力スキーマを返します。不足しているフィールドを捏造しないでください
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。