Yandex Wiki Search
БесплатноНе проверенMCP server for Yandex Wiki: full-text search, pages, comments, attachments and dynamic tables. 33 typed tools, server-side read-only mode, Docker-ready.
Описание
MCP server for Yandex Wiki: full-text search, pages, comments, attachments and dynamic tables. 33 typed tools, server-side read-only mode, Docker-ready.
README
English | Русский

Connect Claude, Cursor, Windsurf, or any MCP client to Yandex Wiki: full-text search, pages, comments, attachments, and dynamic tables ("grids") — 33 tools with typed schemas.
An unofficial project — not affiliated with or endorsed by Yandex.
- 🔍 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), clone, 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:
Add to Cursor Install in VS Code Add to LM Studio Install in Claude Desktop
The Claude Desktop badge downloads the .mcpb bundle of the latest release —
double-click it and Claude Desktop installs the server, prompting for the token
and org ID (uv must be installed).
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.
Need the old MCP SDK (1.x)?
The server runs on MCP Python SDK v2. That is invisible to clients — one v2 server
answers every protocol revision back to 2024-11-05 as well as the current one, so
there is nothing to change on your side and nothing to reinstall.
The only reason to hold back is a shared environment that pins mcp<2 for something
else. 1.0.1 is the last release built on the 1.x SDK and stays on PyPI:
pip install "yandex-wiki-search-mcp<1.1"
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
33 tools. All write tools disappear when WIKI_READ_ONLY=true.
Search & read (10)
| Tool | What it does |
|---|---|
page_search |
Full-text search across the entire Wiki (pages and files), ranked results with a text excerpt each; server-side filters, and cursor paging through ~100 results in the highlight mode (up to 50 in one call otherwise) |
page_get |
Get a page by page_id or slug (accepts full Wiki URLs too) |
page_get_descendants |
Traverse a page subtree — one flat list of {id, slug} from all nesting levels; from_root=true walks the whole Wiki; fetch_all drains the cursor in one call |
page_get_comments |
List page comments (fetch_all supported) |
page_get_resources |
List page resources (attachments + grids) with server-side title search (fetch_all supported) |
page_get_attachments |
List page attachments (fetch_all supported) |
page_read_attachment |
Read an attachment's content straight into the conversation (nothing is saved anywhere) — PNG/JPEG/GIF/WebP as a native image block that vision-capable clients render, text as text (SVG included: it is XML, and an image block a vision API cannot decode fails the host's next call), other binaries as a base64 blob. The format is decided by the file's magic bytes, not by the wire's claim. Capped to protect the model's context window: 128 KiB for text/binary, 2 MiB for images; anything larger is refused with a pointer to page_download_attachment or download_url from page_get_attachments |
page_get_grids |
List grids attached to a page (fetch_all supported) |
grid_get |
Get a grid by grid_id with row/column/revision filters |
user_get_current |
Who am I — username and home_cluster (the caller's personal-section slug) |
Pages: write (12)
| Tool | What it does |
|---|---|
page_create |
Create a page |
page_update |
Update page title and/or full content; set or clear a redirect to another page |
page_edit |
Edit content by exact-text replacements without resending the whole page; a missing or ambiguous match fails the call before anything is written; writes back with allow_merge so a concurrent edit is merged, not overwritten |
page_append_content |
Append content to top, bottom, or a named anchor |
page_clone |
Copy a page to a new slug — the copy gets a new id; children, comments, and history stay with the original; occupied slugs are refused. The API has no true move/rename (details) |
page_add_comment |
Add a comment or reply in a thread |
page_delete_comment |
Delete a comment; returns the page's updated comment count |
page_delete_attachment |
Delete an attachment from a page |
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 — not registered under OAUTH_ENABLED=true, where "local" would mean the shared server's filesystem |
page_download_attachment |
Download an attachment to a local file — streamed to disk with no size cap, nothing enters the conversation. Written atomically (.part → fsync → rename), refuses to overwrite unless asked, and lands with the permissions a normal write would give (0666 & ~umask, never executable); replacing a file keeps that file's own mode. The directory fsync that makes the rename itself crash-durable, and the mode inheritance, are POSIX-only. Gated the same way as page_upload_attachment under OAuth |
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_row |
Move a row |
grid_add_columns |
Add typed columns |
grid_delete_columns |
Delete columns by slug |
grid_move_column |
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–August 2026;
the official hosted server's tool list captured live from mcp.wiki.yandex.net
(wiki-mcp-server 1.28.1, 2026-08-11).
| yandex-wiki-search-mcp | Yandex's official MCP (hosted) | ya-yandex-wiki-mcp | slartus/mcp-yandex-wiki | ya-wiki-mcp | |
|---|---|---|---|---|---|
| Full-text search | ✅ up to 50 results, server-side filters + highlighting | ❌ no search tool | ❌ | ✅ up to 10 results | ❌ |
| Pages: create / update / append / delete + recover | ✅ all, plus partial edits via text replacement (page_edit) |
partial — no append / recover; has partial edits via text replacement | ✅ all | partial — no append / recover | partial — no recover |
| Pages: clone to a new slug | ✅ page_clone |
❌ | ❌ | ❌ | ✅ |
| Grids: write tools | ✅ 11 | ✅ 12, incl. column update + row pin/color | ✅ 11 | ❌ read-only | ✅ 11, incl. clone |
| Comments, attachment upload | ✅ incl. deletion, inline image preview, and download to disk | comments ✅ / upload ❌ (download + preview instead) | ✅ | ❌ | ❌ |
| Server-side read-only mode | ✅ | ❌ | ✅ | ❌ | ❌ |
| 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 | ✅ / ✅ / ✅ | — hosted service, closed source, nothing to install | ✅ / ✅ / ✅ | ❌ manual install | ❌ / ✅ / ❌ |
| Multi-user OAuth for HTTP deployments | ✅ | ❌ per-user token pasted into static headers, no OAuth flow | ✅ | ❌ | ❌ |
Also worth knowing:
- best-doctor/mcp-yandex-wiki (Python) — page create / update plus reads, with a separate
-roread-only entry point; no delete / recover, no grids, no search; PyPI only - 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 - bim-ba/ycli (Python) — one toolkit for Tracker + Wiki + Forms: a CLI, a Python SDK, a Claude Code plugin, and an MCP server whose Wiki surface is 42
wiki_*tools (15 read / 27 write, annotated, with a--read-onlyflag); no full-text search tool, and attachment downloads stay CLI/SDK-only
As of August 2026, full-text search exists only here (up to 50 results) and in slartus (up to 10) — Yandex's own hosted server ships without a search tool — and 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 POST /v1/search endpoint — the same backend that powers the
Wiki web search bar, undocumented until Yandex published its
API reference in
August 2026. Search first, then open a result with page_get by its slug.
- Two wire modes. By default: up to 50 results in one call (
limitis clamped to 1–50; the API rejects anything else) and no pagination — the response cursors are alwaysnull. Withhighlight=true: pages are hard-capped at 10 results regardless oflimit, matches come wrapped in<em>, andcursor(the page number echoed back innext_cursor) walks up to ~100 results. The set ends whenresultscomes back empty ornext_cursorisnullon a non-empty page — past the endnext_cursorkeeps counting up over empty pages, so it alone does not mean "more exists". - Filters run server-side, before the limit — a filtered search does not lose matches to it:
slug_prefix(section filter, deep prefixes liketech-doc/mlare fine),result_type(page/file),authors(page owners byuid/cloud_uid—user_get_currentsupplies your own, turning "find my pages about X" into two calls), andcreated_between/modified_betweendate intervals (both bounds required — the API rejects open ones). - Quoted
"exact phrase"queries work;pageresults get absolutehttps://wiki.yandex.ru/...links,fileresults get direct download links. contentis a ~510-character excerpt, not the page and not a summary: it is cut from wherever the match sits, the query terms need not be inside it, and its line breaks and tabs are the page's own layout (table cells arrive tab-separated) rather than separators between fragments. Passhighlight=trueto get matches wrapped in<em>tags. Read the page withpage_getbefore answering from it. Empty forfileresults.
Traversing the tree
page_get_descendants returns a subtree as one flat list of {id, slug} from every
nesting level. Passing from_root=true instead of page_id/slug walks the whole
Wiki — the way in when no starting slug is known, so search is not the only entry
point. Prefer a section slug when you have one: wikis run to thousands of pages, and
fetch_all stops at its ~500-item cap with truncated: true.
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 |
STATELESS_HTTP / JSON_RESPONSE |
no | true / true |
streamable-http only: keep no per-session state / answer with JSON instead of SSE |
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 |
TOOL_RESULT_TEXT |
no | pretty |
Text duplicate of structured tool results: pretty (indent=2) | compact (single line, 10-30% off the text block) | none (structured only — check your client renders structuredContent first) |
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. page_upload_attachment and page_download_attachment are
not registered in this mode: they read and write files on the machine the server
runs on, which is not the caller's machine in a shared deployment.
| 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 |
OAUTH_CLIENT_SECRET_EXPIRY_SECONDS |
2592000 (30 days) |
Lifetime of a dynamically registered MCP client. Registration is unauthenticated by protocol design, so without an expiry every registration is kept forever; clients are told the deadline at registration and re-register when it passes. Empty disables it |
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 |
Choosing the organization per user. WIKI_ORG_ID / WIKI_CLOUD_ORG_ID are optional
under OAuth, because each request can name its own organization: append ?orgId=... (or
?cloudOrgId=...) to the MCP server URL your client connects to. A query parameter wins
over the server-wide setting, so one deployment can serve several organizations. If a
request carries neither, the tool call fails with a message pointing at both options —
set the environment variable as the default if all your users share one organization.
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 \
--log-opt max-size=10m --log-opt max-file=3 \
ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest
[!NOTE] The server writes no log files of its own — everything goes to stderr, which Docker's default
json-filedriver stores without a size limit. The--log-optflags above cap it; drop them only if your daemon already sets a default.
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
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
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 (re-verified 2026-08-11, after Yandex documented the scopes — see docs/api-notes.md): a
wiki:readtoken can still 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. - Unrelated keys in a shared
.envare ignored, but a misspelled setting (WIKI_READ_ONL) stops the server instead of silently falling back to a default you did not choose.
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. How the server is put together — the layers, the code map, testing seams, CI and the release process — is described in docs/architecture.md. Verified API behavior and probe scripts are documented in docs/api-notes.md.
The Wiki API drifts (the search endpoint silently changed contract once already, back
when it was undocumented) — scripts/contract_sweep.py re-verifies every client method
against a live organization and reports validation mismatches and undeclared keys:
uv run python scripts/contract_sweep.py users/YOU/contract-sweep # ~30 live checks
uv run python scripts/contract_sweep.py users/YOU/contract-sweep --cleanup # remove fixtures
The API drift check workflow runs the same sweep
weekly when the DRIFT_* repository secrets are configured
(instructions in the workflow header); without them it skips quietly.
Credits
This project began as 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. It has since grown its own surface —
full-text search, typed input and output schemas across all 33 tools, YFM helpers,
cursor draining, multi-user OAuth and a live contract sweep against the API — while 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 then-undocumented POST /v1/search endpoint (Yandex
published a reference for it only in August 2026) 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.
Trademarks
"Yandex" and "Yandex Wiki" are trademarks of YANDEX LLC. This is an unofficial, community-built project: not affiliated with, sponsored, or endorsed by Yandex — the names are used nominatively, to state which service the server talks to. The logo is an original mark that reproduces neither Yandex Wiki nor MCP branding (design notes).
mcp-name: io.github.dlbolshov/yandex-wiki-search-mcp
Установка Yandex Wiki Search
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/dlbolshov/yandex-wiki-search-mcpFAQ
Yandex Wiki Search MCP бесплатный?
Да, Yandex Wiki Search MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Yandex Wiki Search?
Нет, Yandex Wiki Search работает без API-ключей и переменных окружения.
Yandex Wiki Search — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Yandex Wiki Search в Claude Desktop, Claude Code или Cursor?
Открой Yandex Wiki Search на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
GitHub
PRs, issues, code search, CI status
автор: GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
автор: mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
автор: duxiaohuiSupabase
Database, auth and storage
автор: SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare Yandex Wiki Search with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории development
