English | Русский
Yandex Wiki Search MCP
Connect Claude, Cursor, Windsurf, or any MCP client to Yandex Wiki: full-text search, pages, comments, attachments, and dynamic tables ("grids") — 26 tools with typed schemas.
- 🔍 Full-text search across the entire wiki — the same backend that powers the Wiki web search bar, up to 50 results per query
- 📄 Full page lifecycle — create, update, append (top / bottom / anchor), delete with a recovery token, comments, file uploads
- 📊 Dynamic tables (grids) — 11 write tools: rows, columns, cells, copy, sort
- 🔒 Server-side read-only mode —
WIKI_READ_ONLY=truesimply doesn't register write tools, so the agent can't bypass it - 🧩 Typed tool surface — every tool ships input and output JSON schemas plus safety annotations (read-only / destructive / idempotent hints)
- 🐳 Runs anywhere — stdio for desktop clients, streamable-http + Docker (with optional multi-user OAuth) for teams
Quick start
- Get a Yandex OAuth token with Wiki access (official guide) and your organization ID.
- Install into your client:
Claude Desktop / Windsurf / any JSON-config client (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 (no Python required)
{
"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"}
}
}
}
[!TIP] Start with
WIKI_READ_ONLY=true— the server won't even register write tools. Flip it tofalseonce you trust your agent with edits.
- Ask your agent something — see below.
What can it do
"Find our onboarding docs and summarize the key steps."
"What do we have on incident response? Open the most relevant page."
"Create a page
team/weekly-notesand append today's standup summary.""Add a row to the on-call rotation grid: alice, next week."
"Upload this PDF to the project page and link it at the bottom."
"Delete the draft page, but keep the recovery token in case I change my mind."
Tools
26 tools. All write tools disappear when WIKI_READ_ONLY=true.
Search & read (8)
| Tool | What it does |
|---|---|
page_search |
Full-text search across the entire Wiki (pages and files), up to 50 ranked results with snippets |
page_get |
Get a page by page_id or slug (accepts full Wiki URLs too) |
page_get_descendants |
Traverse a page subtree with pagination |
page_get_comments |
List page comments |
page_get_resources |
List page resources (attachments + grids) with server-side title search |
page_get_attachments |
List page attachments |
page_get_grids |
List grids attached to a page |
grid_get |
Get a grid by grid_id with row/column/revision filters |
Pages: write (7)
| Tool | What it does |
|---|---|
page_create |
Create a page |
page_update |
Update page title and/or full content |
page_append_content |
Append content to top, bottom, or a named anchor |
page_add_comment |
Add a comment or reply in a thread |
page_delete |
Delete a page and receive a recovery token |
page_recover |
Recover a deleted page by recovery token |
page_upload_attachment |
Upload a local file in chunks and attach it to a page |
Grids: write (11)
Expand the table
| Tool | What it does |
|---|---|
grid_create |
Create a grid on a page |
grid_update |
Update grid title and/or default sort |
grid_copy |
Copy a grid to an existing target page (async operation) |
grid_delete |
Delete a grid |
grid_add_rows |
Add rows at a position or after a given row |
grid_update_cells |
Update individual cells by row + column |
grid_delete_rows |
Delete rows |
grid_move_rows |
Move a row |
grid_add_columns |
Add typed columns |
grid_delete_columns |
Delete columns by slug |
grid_move_columns |
Move a column |
Grid specifics:
- Mutations use optimistic locking — fetch the grid first and pass the latest
revision. grid_update.default_sorttakes[{"column": "status", "direction": "asc"}]entries; the server converts them to the wire format the API expects.grid_add_columnsrequiresrequiredon every column because the real API validates it.grid_copyreturns operation metadata, not a ready copied grid object.
How it compares
Facts verified against the alternatives' docs and published code, July 2026.
| yandex-wiki-search-mcp | ya-yandex-wiki-mcp | slartus/mcp-yandex-wiki | best-doctor/mcp-yandex-wiki | ya-wiki-mcp | |
|---|---|---|---|---|---|
| Full-text search | ✅ up to 50 results, client-side filters | ❌ | ✅ up to 10 results | ❌ | ❌ |
| Pages: create / update / append / delete + recover | ✅ all | ✅ all | partial — no append / recover | partial — no delete / recover | partial — no recover; has clone |
| Grids: write tools | ✅ 11 | ✅ 11 | ❌ read-only | ❌ no grid tools | ✅ 11, incl. clone |
| Comments, attachment upload | ✅ | ✅ | ❌ | ❌ | ❌ |
| Server-side read-only mode | ✅ | ✅ | ❌ | ✅ separate -ro entry point |
❌ |
| Typed output schemas + tool annotations | ✅ | ❌ | ❌ | ❌ | ❌ tools return plain strings |
| YFM helpers | ✅ syntax cheat sheet resource + yfm_warnings in write tools |
❌ | ❌ | ❌ | ✅ Markdown→YFM converter + page-tree cache, prompt templates |
| Docker / PyPI / MCP Registry | ✅ / ✅ / ✅ | ✅ / ✅ / ✅ | ❌ manual install | PyPI only | PyPI only; no source repo linked |
| Multi-user OAuth for HTTP deployments | ✅ | ✅ | ❌ | ❌ | ❌ |
Also worth knowing:
- brekhov-ilya/yandex-wiki-mcp (npm) — pages read / write / move, grids read-only; interactive PKCE token flow with auto-refresh, no full-text search
- n-r-w/yandex-mcp (Go) — Yandex Tracker + Wiki in one server, read-only by design (5 wiki read tools), no search; auth via IAM tokens from the
ycCLI only — Yandex OAuth tokens are not supported
As of July 2026, full-text search exists only here (up to 50 results) and in slartus (up to 10); the combination of search, grid writes, server-side read-only mode, and typed schemas is unique to this project.
This project is a fork of ya-yandex-wiki-mcp and builds on findings from
slartus/mcp-yandex-wiki — see Credits.
Full-text search
page_search wraps the undocumented-but-public POST /v1/search endpoint — the same
backend that powers the Wiki web search bar. Search first, then open a result with
page_get by its slug.
- Up to 50 results per call (
page_sizeis clamped to 1–50; the API rejects anything else). - Search is global only —
slug_prefixandresult_typefilters are applied client-side after fetching, so combine them withpage_size=50to avoid missing matches. - Quoted
"exact phrase"queries work;pageresults get absolutehttps://wiki.yandex.ru/...links,fileresults get direct download links.
More verified API behavior (scopes, 403 semantics, error envelopes, limits): docs/api-notes.md.
Configuration
| Variable | Required | Default | Description |
|---|---|---|---|
WIKI_TOKEN |
one of the two | — | Yandex OAuth token (takes precedence when both are set) |
WIKI_IAM_TOKEN |
— | IAM token (Yandex Cloud organizations) | |
WIKI_ORG_ID |
exactly one of the two | — | Yandex 360 organization ID (X-Org-Id) |
WIKI_CLOUD_ORG_ID |
— | Yandex Cloud organization ID (X-Cloud-Org-Id) |
|
WIKI_READ_ONLY |
no | false |
true disables all write tools server-side |
TRANSPORT |
no | stdio |
stdio | sse | streamable-http |
HOST / PORT |
no | 0.0.0.0 / 8000 |
HTTP transports only |
LOG_LEVEL |
no | INFO |
Logs go to stderr; DEBUG additionally logs Wiki API requests (method, path, status, duration — never headers or bodies) |
WIKI_API_BASE_URL |
no | https://api.wiki.yandex.net |
Wiki API endpoint |
WIKI_WEB_BASE_URL |
no | https://wiki.yandex.ru |
Base for absolute page links in page_search results |
WIKI_AUTH_SCHEME |
no | OAuth |
Authorization header scheme for WIKI_TOKEN (OAuth | Bearer) |
WIKI_MAX_RETRIES |
no | 2 |
Retries for dropped connections and 429/502/503/504 on read requests; 0 disables them |
Multi-user OAuth + Redis (HTTP deployments only)
With OAUTH_ENABLED=true the server becomes an OAuth provider: each MCP user
authorizes with their own Yandex account, and requests to the Wiki API are made with
their personal token.
| Variable | Default | Description |
|---|---|---|
OAUTH_ENABLED |
false |
Enable the OAuth provider |
OAUTH_STORE |
memory |
memory | redis |
OAUTH_SERVER_URL |
https://oauth.yandex.ru |
Yandex OAuth server |
OAUTH_USE_SCOPES |
true |
Request Wiki scopes during authorization |
OAUTH_CLIENT_ID / OAUTH_CLIENT_SECRET |
— | Your Yandex OAuth app credentials |
MCP_SERVER_PUBLIC_URL |
— | Public URL of this server (OAuth callbacks) |
OAUTH_ENCRYPTION_KEYS |
— | Comma-separated base64 32-byte keys (required for redis store) |
REDIS_ENDPOINT / REDIS_PORT / REDIS_DB / REDIS_PASSWORD / REDIS_POOL_MAX_SIZE |
localhost / 6379 / 0 / — / 10 |
Redis connection |
See .env.example for the full annotated list and compose.yaml for a Redis baseline.
Deployment
flowchart LR
C["MCP client<br/>Claude / Cursor / Windsurf / VS Code"]
S["yandex-wiki-search-mcp"]
W["Yandex Wiki API"]
R[("Redis<br/>optional OAuth token store")]
C -- "stdio (local, single user)" --> S
C -- "streamable-http (+ OAuth, multi-user)" --> S
S --> W
S -.-> R
HTTP server via Docker (the MCP endpoint is http://localhost:8000/mcp):
docker run --env-file .env -e TRANSPORT=streamable-http -p 8000:8000 \
ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest
Docker Compose
services:
mcp-wiki:
image: ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest # or: build: .
ports:
- "8000:8000"
environment:
- WIKI_TOKEN=${WIKI_TOKEN}
- WIKI_ORG_ID=${WIKI_ORG_ID}
- TRANSPORT=streamable-http
For Redis-backed OAuth storage, use the existing compose.yaml as the baseline.
Security
- Read-only is server-side: with
WIKI_READ_ONLY=truewrite tools are never registered — there is nothing for a confused agent to call. - Wiki API does not enforce OAuth scopes (verified live — see docs/api-notes.md): a
wiki:readtoken can write, so use the read-only mode rather than relying on token scopes. - Secrets are
SecretStrthroughout — masked in logs andrepr;DEBUGHTTP logging never includes headers or bodies. - Deletion is recoverable:
page_deletereturns a recovery token forpage_recover.
Development
uv sync --dev
uv run yandex-wiki-search-mcp # run locally
uv run pytest # tests
Before committing, run the full verification set from CONTRIBUTING.md. Verified API behavior and probe scripts are documented in docs/api-notes.md.
Credits
This project is a fork of APonkratov/yandex-wiki-mcp
(ya-yandex-wiki-mcp) by Aleksandr Ponkratov, an excellent, well-tested Python MCP server
for the Yandex Wiki API, licensed under Apache-2.0. This fork adds full-text search
(page_search), typed tool schemas, and more; the original copyright and license are
preserved (see LICENSE and NOTICE).
The idea and key API findings behind full-text search come from
slartus/mcp-yandex-wiki (JavaScript, MIT):
it was the first to discover the undocumented POST /v1/search endpoint and to report
that OAuth scopes are not enforced. No code was taken from it — only findings and ideas,
independently re-verified against a live organization and extended here.
mcp-name: io.github.dlbolshov/yandex-wiki-search-mcp
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yandex_wiki_search_mcp-0.7.0.tar.gz.
File metadata
- Download URL: yandex_wiki_search_mcp-0.7.0.tar.gz
- Upload date:
- Size: 53.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce0f432f22bb734c16b69a2b5ec6e312e40b1cadd267ba74b67a49e17e3fcb55
|
|
| MD5 |
bb73ec794d39afb2fbfe6100d431aadd
|
|
| BLAKE2b-256 |
a4f4a10c9c994a51c146f692fbfbd5ae8a549356f0d26c189a927ecc16e409fe
|
Provenance
The following attestation bundles were made for yandex_wiki_search_mcp-0.7.0.tar.gz:
Publisher:
release.yml on dlbolshov/yandex-wiki-search-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yandex_wiki_search_mcp-0.7.0.tar.gz -
Subject digest:
ce0f432f22bb734c16b69a2b5ec6e312e40b1cadd267ba74b67a49e17e3fcb55 - Sigstore transparency entry: 2256815226
- Sigstore integration time:
-
Permalink:
dlbolshov/yandex-wiki-search-mcp@f86d0c8190500399b2fa5ae256044c6a5dbacfc5 -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/dlbolshov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f86d0c8190500399b2fa5ae256044c6a5dbacfc5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file yandex_wiki_search_mcp-0.7.0-py3-none-any.whl.
File metadata
- Download URL: yandex_wiki_search_mcp-0.7.0-py3-none-any.whl
- Upload date:
- Size: 53.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e426bac1ee25a8030710b1fd3692262e57641419794c91d27a0ab0a8730cda6e
|
|
| MD5 |
0c09a4c75594f34e4de6f41f14b58891
|
|
| BLAKE2b-256 |
1168067e48ef4c4ea089db087720566e4ead57afaa8e38c774d40aaf13fe2b00
|
Provenance
The following attestation bundles were made for yandex_wiki_search_mcp-0.7.0-py3-none-any.whl:
Publisher:
release.yml on dlbolshov/yandex-wiki-search-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yandex_wiki_search_mcp-0.7.0-py3-none-any.whl -
Subject digest:
e426bac1ee25a8030710b1fd3692262e57641419794c91d27a0ab0a8730cda6e - Sigstore transparency entry: 2256815230
- Sigstore integration time:
-
Permalink:
dlbolshov/yandex-wiki-search-mcp@f86d0c8190500399b2fa5ae256044c6a5dbacfc5 -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/dlbolshov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f86d0c8190500399b2fa5ae256044c6a5dbacfc5 -
Trigger Event:
push
-
Statement type: