yandex-wiki-search-mcp について
yandex-wiki-search-mcpは、MCPクライアントをYandex Wikiに接続し、検索とコンテンツ管理を可能にします。型付きツールでページ、コメント、添付ファイル、グリッドを扱い、サーバー側の読み取り専用モードも備えます。
主な機能
- 01フィルター付きWiki全文検索
- 02ページの作成、編集、追記、復元
- 03コメントと添付ファイルの管理
- 04動的テーブルの読み取りと変更
- 05型付きスキーマとツール安全注釈
- 06サーバー側の読み取り専用モード
活用シーン
- 01Yandex Wiki内の関連ページ検索
- 02ドキュメントの更新とコメント追加
- 03Wikiグリッドの行と列の管理
- 04読み取りを許可しつつエージェントの書き込みを無効化
MCP 対応
MCPサーバーは、型付きツールを通じてYandex Wikiの検索、ページ、コメント、添付ファイル、グリッド操作を公開します。stdioとStreamable HTTPに対応し、読み取り専用モードでは書き込みツールを登録しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
English | Русский

Claude、Cursor、Windsurf、または任意の MCP クライアントを Yandex Wiki に接続できます。全文検索、 ページ、コメント、添付ファイル、動的テーブル(「グリッド」)に対応し、型付きスキーマを備えた 33 個のツールを提供します。
非公式プロジェクトです。Yandex とは提携しておらず、同社からの承認も受けていません。
- 🔍 Wiki 全体の全文検索 — Wiki のウェブ検索バーを支えるものと同じバックエンドを使用し、1 回のクエリで最大 50 件の結果を取得できます
- 📄 ページのライフサイクル全体に対応 — 作成、更新、追記(先頭/末尾/アンカー位置)、複製、復元トークンを使った削除、コメント、ファイルのアップロード
- 📊 動的テーブル(グリッド) — 行、列、セル、コピー、並べ替えに対応する 11 個の書き込みツール
- 🔒 サーバー側の読み取り専用モード —
WIKI_READ_ONLY=trueを設定すると書き込みツールが登録されないため、エージェントが回避することはできません - 🧩 型付きツールインターフェース — すべてのツールに入力 JSON スキーマと安全性注釈(読み取り専用/破壊的/冪等性のヒント)が付属します。ネイティブ画像またはリソースブロックで応答する
page_read_attachmentを除き、すべてのツールに出力スキーマも付属します - 🐳 あらゆる環境で実行可能 — デスクトップクライアント向けの stdio、チーム向けの streamable-http + Docker(オプションのマルチユーザー OAuth に対応)
クイックスタート
- Wiki へのアクセス権を持つ Yandex OAuth トークン(公式ガイド)と、組織 ID を取得します。
- クライアントにインストールします。
Claude Desktop のバッジから最新リリースの .mcpb バンドルをダウンロードできます。
ダブルクリックすると Claude Desktop がサーバーをインストールし、トークンと組織 ID の入力を求めます
(uv をインストールしておく必要があります)。
Claude Desktop / Windsurf / JSON 設定を使う任意のクライアント(uvx)
{
"mcpServers": {
"yandex-wiki-search": {
"command": "uvx",
"args": ["yandex-wiki-search-mcp"],
"env": {
"WIKI_TOKEN": "YOUR_TOKEN",
"WIKI_ORG_ID": "YOUR_ORG_ID",
"WIKI_READ_ONLY": "true"
}
}
}
}
Claude Code(CLI)
claude mcp add yandex-wiki-search \
-e WIKI_TOKEN=YOUR_TOKEN -e WIKI_ORG_ID=YOUR_ORG_ID -e WIKI_READ_ONLY=true \
-- uvx yandex-wiki-search-mcp
Docker(Python 不要)
{
"mcpServers": {
"yandex-wiki-search": {
"command": "docker",
"args": ["run","--rm","-i",
"-e","WIKI_TOKEN","-e","WIKI_ORG_ID","-e","WIKI_READ_ONLY=true",
"ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest"],
"env": {"WIKI_TOKEN":"YOUR_TOKEN","WIKI_ORG_ID":"YOUR_ORG_ID"}
}
}
}
ヒント
まずは
WIKI_READ_ONLY=trueに設定してください。サーバーには書き込みツールが登録されません。 エージェントに編集を任せてもよいと判断したら、falseに切り替えてください。
- エージェントに質問してみましょう。例は以下をご覧ください。
古い MCP SDK(1.x)が必要ですか?
このサーバーは MCP Python SDK v2 で動作します。クライアントからはその違いは見えません。v2 サーバーは現在のプロトコルに加え、2024-11-05 までのすべてのプロトコル改訂にも応答するため、設定変更も再インストールも不要です。
以前のバージョンを使う必要があるのは、別の用途のために mcp<2 に固定された共有環境を使っている場合だけです。1.0.1 は 1.x SDK でビルドされた最後のリリースで、PyPI で引き続き利用できます。
pip install "yandex-wiki-search-mcp<1.1"
できること
「オンボーディング資料を探して、重要な手順を要約してください。」
「インシデント対応についての資料はありますか? 最も関連性の高いページを開いてください。」
「
team/weekly-notesというページを作成して、今日のスタンドアップの要約を追記してください。」「オンコールのローテーション表に、alice を来週の担当として追加してください。」
「この PDF をプロジェクトページにアップロードして、ページの末尾にリンクしてください。」
「下書きページを削除してください。ただし、気が変わったときのために復旧トークンは残してください。」
ツール
33 個のツールがあります。WIKI_READ_ONLY=true の場合、書き込みツールはすべて表示されません。
検索と読み取り(10)
| ツール | 機能 |
|---|---|
page_search | Wiki 全体(ページとファイル)を全文検索し、各結果にテキスト抜粋を付けて順位付けして返します。サーバー側のフィルターに対応し、highlight モードではカーソルを使って約 100 件までページングできます(それ以外のモードでは 1 回の呼び出しにつき最大 50 件です) |
page_get | page_id または slug でページを取得します(Wiki の完全な URL も指定できます) |
page_get_descendants | ページのサブツリーをたどり、すべての階層から {id, slug} のフラットな一覧を返します。from_root=true を指定すると Wiki 全体をたどり、fetch_all を指定すると 1 回の呼び出しでカーソルの残りをすべて取得します |
page_get_comments | ページのコメントを一覧表示します(fetch_all に対応) |
page_get_resources | サーバー側のタイトル検索を使って、ページのリソース(添付ファイルとグリッド)を一覧表示します(fetch_all に対応) |
page_get_attachments | ページの添付ファイルを一覧表示します(fetch_all に対応) |
page_read_attachment | 添付ファイルの内容を直接会話に読み込みます(どこにも保存されません)。PNG/JPEG/GIF/WebP はネイティブの画像ブロックとして渡され、画像認識に対応したクライアントが表示します。テキストはテキストとして扱われます(SVG を含みます。SVG は XML であり、画像ブロックをデコードできない画像 API を使うと、ホストの次の呼び出しが失敗します)。その他のバイナリは Base64 のデータとして扱われます。形式はワイヤー上の申告ではなく、ファイルのマジックバイトに基づいて判定されます。モデルのコンテキストウィンドウを保護するため、サイズには上限があります。テキスト/バイナリは 128 KiB、画像は 2 MiB までです。これを超えるファイルは拒否され、page_get_attachments の page_download_attachment または download_url を使うよう案内されます |
page_get_grids | ページに添付されたグリッドを一覧表示します(fetch_all に対応) |
grid_get | grid_id と行/列/リビジョンのフィルターを指定してグリッドを取得します |
user_get_current | 現在のユーザーを返します。username と home_cluster(呼び出し元の個人セクションのスラッグ)を取得します |
ページ:書き込み(12)
| ツール | 機能 |
|---|---|
page_create | ページを作成します |
page_update | ページのタイトルや全コンテンツを更新します。別のページへのリダイレクトを設定または解除できます |
page_edit | ページ全体を再送信せずに、完全一致するテキストを置換してコンテンツを編集します。一致が見つからない場合、または複数の候補がある場合は、何も書き込まずに呼び出しが失敗します。allow_merge を指定して書き戻すため、同時編集があった場合は上書きせずにマージされます |
page_append_content | コンテンツを先頭、末尾、または名前付きアンカーに追加します |
page_clone | ページを新しいスラッグにコピーします。コピーには新しい ID が割り当てられます。子ページ、コメント、履歴は元のページに残ります。使用済みのスラッグは拒否されます。API には真の移動/名前変更機能はありません(詳細) |
page_add_comment | コメントまたはスレッドへの返信を追加します |
page_delete_comment | コメントを削除し、更新後のページのコメント数を返します |
page_delete_attachment | ページから添付ファイルを削除します |
page_delete | ページを削除し、復元トークンを返します |
page_recover | 復元トークンを使って削除したページを復元します |
page_upload_attachment | ローカルファイルを分割してアップロードし、ページに添付します。TRANSPORT=stdio かつ OAuth が無効の場合にのみ登録されます。HTTP では「ローカル」は呼び出し元ではなくサーバーのファイルシステムを意味するためです |
page_download_attachment | 添付ファイルをローカルファイルにダウンロードします。サイズ制限なしでディスクにストリーミングされ、会話には入りません。書き込みはアトミックに行われます(.part → fsync → rename)。指定がない限り上書きを拒否し、通常の書き込みと同じ権限(0666 & ~umask。実行可能にはなりません)で保存します。ファイルを置き換える場合は、そのファイル固有のモードを維持します。rename 自体のクラッシュ耐性を確保するディレクトリの fsync とモードの継承に対応するのは POSIX のみです。page_upload_attachment と同じ条件で制限され、stdio のみで利用できます |
グリッド:書き込み(11)
テーブルを展開
| ツール | 説明 |
|---|---|
grid_create | ページにグリッドを作成します |
grid_update | グリッドのタイトルやデフォルトの並べ替えを更新します |
grid_copy | 既存の対象ページにグリッドをコピーします(非同期操作) |
grid_delete | グリッドを削除します |
grid_add_rows | 指定した位置、または指定した行の後に行を追加します |
grid_update_cells | 行と列を指定して個々のセルを更新します |
grid_delete_rows | 行を削除します |
grid_move_row | 行を移動します |
grid_add_columns | 型を指定した列を追加します |
grid_delete_columns | スラッグを指定して列を削除します |
grid_move_column | 列を移動します |
グリッドに関する詳細:
- 変更操作では楽観的ロックを使用します。先にグリッドを取得し、最新の
revisionを渡してください。 grid_update.default_sortには[{"column": "status", "direction": "asc"}]の形式のエントリーを指定します。サーバーが API の想定するワイヤ形式に変換します。grid_add_columnsでは、実際の API が検証するため、すべての列にrequiredを指定する必要があります。grid_copyが返すのは操作のメタデータであり、コピー済みのグリッドオブジェクトではありません。
2026年7月〜8月時点で、各代替製品のドキュメントおよび公開コードと照合して確認した情報です。
公式ホスト型サーバーのツール一覧は、mcp.wiki.yandex.net からリアルタイムで取得しました
(wiki-mcp-server 1.28.1、2026-08-11)。
| yandex-wiki-search-mcp | Yandex公式MCP(ホスト型) | ya-yandex-wiki-mcp | slartus/mcp-yandex-wiki | ya-wiki-mcp | |
|---|---|---|---|---|---|
| 全文検索 | ✅ 最大50件、サーバー側フィルター+ハイライト | ❌ 検索ツールなし | ❌ | ✅ 最大10件 | ❌ |
| ページ:作成/更新/追記/削除+復元 | ✅ すべて対応。テキスト置換による部分編集(page_edit)にも対応 | 部分対応 — 追記/復元なし。テキスト置換による部分編集には対応 | ✅ すべて対応 | 部分対応 — 追記/復元なし | 部分対応 — 復元なし |
| ページ:新しいスラッグへの複製 | ✅ page_clone | ❌ | ❌ | ❌ | ✅ |
| グリッド:書き込みツール | ✅ 11個 | ✅ 12個。列の更新+行の固定/色設定を含む | ✅ 11個 | ❌ 読み取り専用 | ✅ 11個。複製を含む |
| コメント、添付ファイルのアップロード | ✅ 削除、インライン画像プレビュー、ディスクへのダウンロードを含む | コメント ✅/アップロード ❌(代わりにダウンロード+プレビューに対応) | ✅ | ❌ | ❌ |
| サーバー側の読み取り専用モード | ✅ | ❌ ユーザーごとのトークンを静的ヘッダーに貼り付ける方式。OAuthフローなし | ✅ | ❌ | ❌ |
| 型付き出力スキーマ+ツール注釈 | ✅ | ❌ | ❌ | ❌ | ❌ ツールはプレーン文字列を返す |
| YFM ヘルパー | ✅ 構文チートシートのリソース+書き込みツール内の yfm_warnings | ❌ | ❌ | ❌ | ✅ Markdown→YFM コンバーター+ページツリーキャッシュ、プロンプトテンプレート |
| Docker/PyPI/MCP Registry | ✅/✅/✅ | — ホスト型サービス、クローズドソース、インストール不要 | ✅/✅/✅ | ❌ 手動インストール | ❌/✅/❌ |
| HTTP デプロイ向けマルチユーザー OAuth | ✅ | ❌ ユーザーごとのトークンを静的ヘッダーに貼り付ける方式。OAuthフローなし | ✅ | ❌ | ❌ |
知っておくとよい情報:
- best-doctor/mcp-yandex-wiki(Python)— ページの作成/更新と読み取りに対応。独立した読み取り専用エントリーポイント
-roあり。削除/復元、グリッド、検索には非対応。PyPI のみ - brekhov-ilya/yandex-wiki-mcp(npm)— ページの読み取り/書き込み/移動に対応、グリッドは読み取り専用。自動更新付きの対話型 PKCE トークンフローに対応。全文検索には非対応
- n-r-w/yandex-mcp(Go)— Yandex Tracker と Wiki を1つのサーバーに統合。設計上読み取り専用(Wiki 読み取りツール5個)、検索なし。
ycCLI の IAM トークンによる認証のみ対応 — Yandex OAuth トークンは非対応 - bim-ba/ycli(Python)— Tracker+Wiki+Forms 向けの統合ツールキット:CLI、Python SDK、Claude Code プラグイン、および Wiki に関する42個の
wiki_*ツールを備えた MCP サーバー(読み取り15/書き込み27、注釈付き、--read-onlyフラグあり)。全文検索ツールはなく、添付ファイルのダウンロードは CLI/SDK のみ
2026年8月時点で、全文検索に対応しているのはこのプロジェクト(最大50件)と slartus(最大10件)のみです。Yandex の公式ホスト型サーバーには検索ツールがありません。また、検索、グリッドへの書き込み、サーバー側の読み取り専用モード、型付きスキーマを組み合わせているのは、このプロジェクトだけです。
このプロジェクトは ya-yandex-wiki-mcp のフォークであり、slartus/mcp-yandex-wiki の調査結果も活用しています — クレジットを参照してください。
全文検索
page_search は POST /v1/search エンドポイントをラップします。Wiki のウェブ検索バーを支えるものと同じバックエンドで、Yandex が 2026 年 8 月に
API reference を公開するまで文書化されていませんでした。まず検索し、結果の slug を指定して page_get で開きます。
- 通信モードは 2 種類あります。デフォルトでは、1 回の呼び出しで最大 50 件の結果を返します(
limitは 1~50 に制限され、それ以外は API に拒否されます)。ページネーションはなく、レスポンスのカーソルは常にnullです。highlight=trueの場合、limitに関係なくページあたりの結果数は最大 10 件で、マッチ箇所は<em>で囲まれます。また、cursor(next_cursorで返されるページ番号)を使って最大 約 100 件の結果をたどれます。resultsが空で返された場合、または空でないページでnext_cursorがnullの場合に結果の終端に達しています。終端を過ぎると、空のページでもnext_cursorは増え続けるため、それだけでは「さらに結果がある」ことを意味しません。 - フィルターはサーバー側で
limitを適用する前に実行されます。フィルターを指定した検索でも、該当結果がlimitによって失われることはありません。指定できるフィルターは、slug_prefix(セクションの絞り込み。tech-doc/mlのような深い階層のプレフィックスも使用可能)、result_type(page/file)、authors(uid/cloud_uidによるページ所有者の指定。user_get_currentで自分の ID を取得でき、「自分の X に関するページを探す」を 2 回の呼び出しで実行できます)、created_between/modified_between(日付の範囲。両方の境界値が必須で、片方を省略すると API に拒否されます)です。 "exact phrase"のように引用符で囲んだ完全一致フレーズも検索できます。pageの結果にはhttps://wiki.yandex.ru/...の絶対 URL が、fileの結果には直接ダウンロードリンクが付与されます。contentは約 510 文字の抜粋で、ページ本文でも要約でもありません。マッチ箇所に応じた位置から切り出されるため、検索語が抜粋内に含まれるとは限りません。また、改行やタブは断片間の区切りではなく、ページ本来のレイアウトを反映しています(表のセルはタブ区切りで返されます)。highlight=trueを指定すると、マッチ箇所が<em>タグで囲まれます。ページの内容に基づいて回答する前に、page_getでページを読み込んでください。fileの結果では空になります。
ツリーをたどる
page_get_descendants は、あらゆる階層の {id, slug} を含むサブツリーを、1 つのフラットなリストとして返します。page_id/slug の代わりに from_root=true を指定すると、Wiki 全体をたどれます。開始する slug がわからない場合の入口となるため、検索だけが探索方法ではありません。セクションの slug がわかっている場合は、そちらを指定してください。Wiki には数千ページに及ぶものがあり、fetch_all は約 500 件の上限に達すると truncated: true を返して処理を停止します。
検証済みの API 動作に関する追加情報(スコープ、403 の意味、エラー形式、上限)はこちらをご覧ください:docs/api-notes.md。
設定
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
WIKI_TOKEN | 2つのうちいずれか | — | Yandex OAuth トークン(両方設定されている場合は優先されます) |
WIKI_IAM_TOKEN | — | IAM トークン(Yandex Cloud の組織) | |
WIKI_ORG_ID | 2つのうちちょうど1つ | — | Yandex 360 の組織 ID(X-Org-Id) |
WIKI_CLOUD_ORG_ID | — | Yandex Cloud の組織 ID(X-Cloud-Org-Id) | |
WIKI_READ_ONLY | いいえ | false | true にすると、サーバー側ですべての書き込みツールが無効になります |
TRANSPORT | いいえ | stdio | stdio | sse | streamable-http |
HOST / PORT | いいえ | 127.0.0.1 / 8000 | HTTP トランスポートのみ。Docker イメージでは、公開ポートから到達できるアドレスとして HOST=0.0.0.0 が設定されます。ネイティブ環境では、ほかのマシンからアクセスさせる場合にのみ設定してください |
MCP_ALLOWED_HOSTS | いいえ | OAuth なしの場合はループバック | HTTP トランスポートのみ:MCP エンドポイントが応答する Host 名を、カンマ区切りで指定します。それぞれポートの有無を指定できます(wiki.example.com,mcp-wiki:8000)。未設定の場合、OAuth を使用しないサーバーは localhost、127.0.0.1、[::1] のみに応答します。これにより、DNS リバインディングを通じて Web ページからサーバーを操作されるのを防ぎます。クライアントが使用するほかの名前(Compose のサービス名、LAN アドレス、リバースプロキシのホスト名など)も指定してください。指定しないと 421 が返されます。このリストはループバックのデフォルト値を置き換えるため、ローカルクライアントからの接続も引き続き許可する場合は、localhost と 127.0.0.1 も含めてください。OAuth の使用時は、これを設定しない限り何もチェックされません。* を指定するとチェックが無効になります |
STATELESS_HTTP / JSON_RESPONSE | いいえ | true / true | streamable-http のみ:セッションごとの状態を保持しない/SSE の代わりに JSON で応答します |
LOG_LEVEL | いいえ | INFO | ログは stderr に出力されます。DEBUG では Wiki API リクエスト(メソッド、パス、ステータス、所要時間)も記録されます。ヘッダーや本文は記録されません |
WIKI_API_BASE_URL | いいえ | https://api.wiki.yandex.net | Wiki API エンドポイント |
WIKI_WEB_BASE_URL | いいえ | https://wiki.yandex.ru | page_search の結果に含まれるページの絶対リンクのベース URL |
WIKI_AUTH_SCHEME | いいえ | OAuth | WIKI_TOKEN の Authorization ヘッダーのスキーム(OAuth | Bearer) |
WIKI_MAX_RETRIES | いいえ | 2 | 接続切断、および再試行しても安全なリクエストに対する 429/502/503/504 の再試行回数。対象は GET(添付ファイルのダウンロードを除く)、検索、アップロードのパートです。タイムアウトは再試行しません。0 にすると再試行が無効になります。429 で拒否された書き込みは再試行されません。エラーは処理が適用されていないことを示すため、再送信できます |
TOOL_RESULT_TEXT | いいえ | pretty | 構造化されたツール結果のテキスト複製:pretty(indent=2)| compact(1行、テキストブロックを10~30%削減)| none(構造化データのみ。クライアントが先に structuredContent を表示することを確認してください) |
複数ユーザー OAuth + Redis(HTTP デプロイのみ)
OAUTH_ENABLED=true にすると、サーバーは OAuth プロバイダーになります。各 MCP ユーザーは自身の Yandex アカウントで認証し、Wiki API へのリクエストには各ユーザー個人のトークンが使用されます。このモードでは page_upload_attachment と page_download_attachment は登録されません。また、HTTP トランスポートではいずれも登録されません。これらのツールはサーバーが実行されているマシン上のファイルを読み書きするため、HTTP 経由では呼び出し元のマシン上のファイルを操作できないからです。
| 変数 | デフォルト | 説明 |
|---|---|---|
OAUTH_ENABLED | false | OAuth プロバイダーを有効にします |
OAUTH_STORE | memory | memory | redis |
OAUTH_SERVER_URL | https://oauth.yandex.ru | Yandex OAuth サーバー |
OAUTH_USE_SCOPES | true | 認可時に Wiki スコープを要求します |
OAUTH_CLIENT_ID / OAUTH_CLIENT_SECRET | — | Yandex OAuth アプリの認証情報 |
OAUTH_REGISTRATION_IDLE_SECONDS | 2592000 (30 days) | 動的に登録された MCP クライアントが未使用のまま保持される期間です。プロトコルの設計上、登録は認証なしで行われるため、有効期限を設けない場合、すべての登録が永久に保持されます。一度もサインインに使用されなかった登録は、登録からこの期間が経過すると削除されます。サインインまたはトークンの更新のたびに期間が再開され、発行したトークンの有効期限が切れる時点を起点に計算されます。対象となるのは、31 日間有効なリフレッシュトークン、または Yandex がそれより長い有効期限(通常は 1 年)のアクセストークンです。クライアントシークレット自体は期限切れになりません(client_secret_expires_at: 0)。登録が削除された後にクライアントが再度接続する場合は、再登録が必要です。TypeScript MCP SDK のクライアント(mcp-remote など)は自動的に再登録しますが、MCP Python SDK クライアントは再登録しないため、保存されているクライアント情報を消去する必要があります。空にすると有効期限は無効になります。有効期限を設定して登録された場合、次回のサインインまたは更新時に有効期限がなくなります。以前の名前は OAUTH_CLIENT_SECRET_EXPIRY_SECONDS で、引き続き読み取られます |
MCP_SERVER_PUBLIC_URL | — | このサーバーの公開 URL(OAuth コールバック用) |
OAUTH_ENCRYPTION_KEYS | — | カンマ区切りの base64 形式の 32 バイトキー(redis ストアでは必須) |
REDIS_ENDPOINT / REDIS_PORT / REDIS_DB / REDIS_PASSWORD / REDIS_POOL_MAX_SIZE | localhost / 6379 / 0 / — / 10 | Redis 接続 |
ユーザーごとの組織の選択。 OAuth では、各リクエストで独自の組織を指定できるため、WIKI_ORG_ID / WIKI_CLOUD_ORG_ID は省略可能です。クライアントが接続する MCP サーバー URL に ?orgId=...(または ?cloudOrgId=...)を追加してください。クエリパラメーターはサーバー全体の設定より優先されるため、1 つのデプロイで複数の組織に対応できます。リクエストにどちらも含まれていない場合、ツール呼び出しは両方の設定方法を示すメッセージとともに失敗します。ユーザー全員が同じ組織を利用する場合は、環境変数をデフォルトとして設定してください。
注釈付きの全項目については .env.example を、Redis の基本設定については compose.yaml を参照してください。
デプロイ
%%{init: {"flowchart": {"wrappingWidth": 300}}}%%
flowchart LR
L["Local MCP client<br/>Claude / Cursor /<br/>Windsurf / VS Code<br/>single user"]
T["Team MCP clients<br/>multi-user,<br/>optional OAuth"]
S["yandex-wiki-search-mcp"]
W["Yandex Wiki API"]
R[("Redis<br/>optional OAuth<br/>token store")]
L -- "stdio" --> S
T -- "streamable-http" --> S
S --> W
S -.-> R
Docker による HTTP サーバー(MCP エンドポイントは http://localhost:8000/mcp です):
docker run --env-file .env -e TRANSPORT=streamable-http -p 127.0.0.1:8000:8000 \
--log-opt max-size=10m --log-opt max-file=3 \
ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest
警告
OAUTH_ENABLED=trueを設定しない場合、HTTP エンドポイント自体に認証機能はありません。ポートにアクセスできる人なら誰でも、あなたのWIKI_TOKENを使えます。例ではループバックのみに公開し、他のマシンからのアクセスを防いでいます。また、サーバーはループバックのHost名にのみ応答するため、名前を127.0.0.1に再バインドする Web ページからのアクセスも防ぎます(MCP_ALLOWED_HOSTSを参照)。いずれも認証ではありません。マシン上のプロセスであれば、引き続き使用できます。アクセス範囲を広げる場合は、認証を行うリバースプロキシの背後に置くか、OAuth を有効にしてください。
メモ
サーバーはログファイルを独自に書き込みません。すべて stderr に出力され、Docker のデフォルトの
json-fileドライバーによって サイズ制限なし で保存されます。上記の--log-optフラグでサイズを制限してください。Docker デーモンですでにデフォルト値を設定している場合に限り、これらのフラグを省略してください。
Docker Compose
services:
mcp-wiki:
image: ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest # or: build: .
ports:
- "127.0.0.1:8000:8000"
environment:
- WIKI_TOKEN=${WIKI_TOKEN}
- WIKI_ORG_ID=${WIKI_ORG_ID}
- TRANSPORT=streamable-http
# Only if another container reaches it as http://mcp-wiki:8000:
# - MCP_ALLOWED_HOSTS=localhost,127.0.0.1,mcp-wiki
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Redis を使用した OAuth ストレージには、既存の compose.yaml を基本設定として使用してください。
- 読み取り専用はサーバー側で適用されます:
WIKI_READ_ONLY=trueの場合、書き込みツールは登録されません。誤った判断をしたエージェントが呼び出せるものはありません。 - プレーントークンでの HTTP は認証されません:HTTP トランスポートを使用し、OAuth が無効の場合、ポートに到達できるすべての呼び出し元は
WIKI_TOKENの所有者として動作します。エンドポイントの?orgId=/?cloudOrgId=は設定値より優先されるため、そのトークンがアクセスできる組織すべてが対象です。ループバック上で使用するか、認証プロキシの背後に置くか、OAuth を有効にしてください。ループバックだけでは、ページが自身の名前を127.0.0.1に再バインドするケースを防げません。そのため、サーバーはデフォルトでループバックのもののみ、MCP_ALLOWED_HOSTSにあるHost名に応答します。ローカルファイルシステム用ツール(page_upload_attachment、page_download_attachment)は stdio 経由でのみ登録されるため、HTTP サーバーが呼び出し元に代わって自身のディスクを読み書きすることはありません。 - Wiki API は OAuth スコープを適用しません(Yandex がスコープを文書化した後、2026-08-11 に再確認済みです。詳細は docs/api-notes.md を参照してください):
wiki:readトークンでも書き込みが可能なため、トークンのスコープに頼らず、読み取り専用モードを使用してください。 - シークレットはすべて
SecretStrです。ログとreprではマスクされ、DEBUGの HTTP ログにヘッダーやボディが含まれることはありません。 - 削除は復元可能です。
page_deleteはpage_recover用の復元トークンを返します。 - 共有
.env内の無関係なキーは無視されますが、設定の入力ミス(WIKI_READ_ONLなど)があると、選択していないデフォルト値へ黙ってフォールバックせず、サーバーが停止します。
開発
uv sync --dev
uv run yandex-wiki-search-mcp # run locally
uv run pytest # tests
uv は Python 3.11~3.14 の中からインタープリターを選択します。この範囲のバージョンには uv.lock にホイールが用意されています(.python-versions)。マシンに該当するものがない場合はダウンロードします。
コミットする前に、CONTRIBUTING.md に記載された検証一式を実行してください。 サーバーの構成(各レイヤー、コードマップ、テストの接点、CI、リリースプロセス)については、docs/architecture.md を参照してください。 検証済みの API の動作とプローブ用スクリプトについては、docs/api-notes.md に記載されています。
Wiki API は仕様が変化します(検索エンドポイントの契約は、未文書化だった頃に一度すでに予告なく変更されました)。scripts/contract_sweep.py は、稼働中の組織に対してすべてのクライアントメソッドを再検証し、バリデーションの不一致と未宣言のキーを報告します。
uv run python scripts/contract_sweep.py users/YOU/contract-sweep # live contract checks
uv run python scripts/contract_sweep.py users/YOU/contract-sweep --cleanup # remove fixtures
.env に SWEEP_SLUG=users/YOU/contract-sweep を設定すると(.env.example を参照)、slug 引数を省略できます。サーバー自体がこの変数を読み取ることはありません。
API drift check ワークフローは、DRIFT_* リポジトリシークレットが設定されている場合、同じスイープを毎週実行します(手順はワークフローヘッダーに記載されています)。シークレットが設定されていない場合は、何も通知せずスキップします。
クレジット
このプロジェクトは、Yandex Wiki API 用の優れた、十分にテストされた Python MCP サーバーである、Aleksandr Ponkratov による APonkratov/yandex-wiki-mcp(ya-yandex-wiki-mcp)のフォークとして始まりました。ライセンスは Apache-2.0 です。その後、全文検索、33 個すべてのツールに対する型付き入力スキーマと 32 個のツールに対する出力スキーマ、YFM ヘルパー、カーソルの読み切り、複数ユーザー向け OAuth、API に対するライブ契約スイープなど、独自の機能を追加してきました。元の著作権表示とライセンスは保持されています(LICENSE と NOTICE を参照してください)。
全文検索のアイデアと重要な API の発見は、slartus/mcp-yandex-wiki(JavaScript、MIT)に由来します。このプロジェクトは、当時未文書化だった POST /v1/search エンドポイントを最初に発見し(Yandex がそのリファレンスを公開したのは 2026 年 8 月でした)、OAuth スコープが適用されないことも報告しました。同プロジェクトからコードは一切取得していません。発見とアイデアのみを、稼働中の組織に対して独自に再検証し、拡張して利用しています。
商標
「Yandex」および「Yandex Wiki」は、YANDEX LLC の商標です。これはコミュニティによって構築された非公式プロジェクトであり、Yandex とは提携関係になく、支援や承認も受けていません。これらの名称は、サーバーがどのサービスと通信するかを示すため、記述的に使用しています。ロゴは独自に作成したもので、Yandex Wiki または MCP のブランドを再現したものではありません (デザインに関する説明)。
mcp-name: io.github.dlbolshov/yandex-wiki-search-mcp
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。