yandex-wiki-search-mcp
This server provides 26 tools to interact with Yandex Wiki, covering search, page management, and dynamic table (grid) manipulation.
Search & Read (8 tools)
page_search– Full-text search across the entire wiki (pages and files), returning up to 50 ranked results with snippets; supports exact phrases and client-side filterspage_get– Retrieve a page by numeric ID, slug, or full Wiki URL, with optional fields (content, breadcrumbs, attributes, access policy)page_get_descendants– Traverse a page subtree with cursor-based paginationpage_get_comments– List all comments on a pagepage_get_resources– List all resources (attachments + grids) linked to a pagepage_get_attachments– List file attachments on a pagepage_get_grids– List dynamic tables attached to a pagegrid_get– Retrieve a dynamic table by ID with optional row/column filters, sort expressions, and revision selection
Page Write (7 tools)
page_create– Create a new page with a slug, title, and YFM/Markdown contentpage_update– Replace a page's title and/or full content, with silent-update and three-way merge optionspage_append_content– Add content to the top, bottom, or a named anchor of a pagepage_add_comment– Post a comment or reply to an existing threadpage_delete– Delete a page and receive a recovery tokenpage_recover– Restore a deleted page using its recovery tokenpage_upload_attachment– Upload a local file and attach it to a page (optionally appending Wiki file macro markup)
Grid Write (11 tools)
grid_create/grid_update/grid_copy/grid_delete– Create, update title/sort, copy to another page, or permanently delete a gridgrid_add_rows/grid_update_cells/grid_delete_rows/grid_move_rows– Insert, edit, remove, or reorder rowsgrid_add_columns/grid_delete_columns/grid_move_columns– Add typed columns (string, number, checkbox, date, select, staff, etc.), remove, or reorder them
Key Features
Read-only mode: Setting
WIKI_READ_ONLY=truedisables all write tools server-side so agents cannot bypass itOptimistic locking: Grid mutation tools require passing the latest
revisionto prevent conflicting concurrent editsRecoverable deletions:
page_deletereturns a token usable withpage_recoverTyped schemas & safety annotations: Every tool includes full JSON input/output schemas plus read-only, destructive, or idempotent hints
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") — 27 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), 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:
{
"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 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{
"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"}
}
}
}Start withWIKI_READ_ONLY=true — the server won't even register write tools.
Flip it to false once you trust your agent with edits.
Ask your agent something — see below.
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"Related MCP server: mediawiki-mcp-server
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
27 tools. All write tools disappear when WIKI_READ_ONLY=true.
Search & read (8)
Tool | What it does |
| Full-text search across the entire Wiki (pages and files), up to 50 ranked results with a text excerpt each |
| Get a page by |
| Traverse a page subtree — one flat list of |
| List page comments ( |
| List page resources (attachments + grids) with server-side title search ( |
| List page attachments ( |
| List grids attached to a page ( |
| Get a grid by |
Pages: write (8)
Tool | What it does |
| Create a page |
| Update page title and/or full content |
| Append content to top, bottom, or a named anchor |
| 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) |
| Add a comment or reply in a thread |
| Delete a page and receive a recovery token |
| Recover a deleted page by recovery token |
| Upload a local file in chunks and attach it to a page — not registered under |
Grids: write (11)
Tool | What it does |
| Create a grid on a page |
| Update grid title and/or default sort |
| Copy a grid to an existing target page (async operation) |
| Delete a grid |
| Add rows at a position or after a given row |
| Update individual cells by row + column |
| Delete rows |
| Move a row |
| Add typed columns |
| Delete columns by slug |
| 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.
yandex-wiki-search-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 |
Pages: clone to a new slug | ✅ | ❌ | ❌ | ❌ | ✅ |
Grids: write tools | ✅ 11 | ✅ 11 | ❌ read-only | ❌ no grid tools | ✅ 11, incl. clone |
Comments, attachment upload | ✅ | ✅ | ❌ | ❌ | ❌ |
Server-side read-only mode | ✅ | ✅ | ❌ | ✅ separate | ❌ |
Typed output schemas + tool annotations | ✅ | ❌ | ❌ | ❌ | ❌ tools return plain strings |
YFM helpers | ✅ syntax cheat sheet resource + | ❌ | ❌ | ❌ | ✅ 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 (
limitis 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 withlimit=50to avoid missing matches.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, nothing is highlighted, 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. 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 |
| one of the two | — | Yandex OAuth token (takes precedence when both are set) |
| — | IAM token (Yandex Cloud organizations) | |
| exactly one of the two | — | Yandex 360 organization ID ( |
| — | Yandex Cloud organization ID ( | |
| no |
|
|
| no |
|
|
| no |
| HTTP transports only |
| no |
|
|
| no |
| Logs go to stderr; |
| no |
| Wiki API endpoint |
| no |
| Base for absolute page links in |
| no |
|
|
| no |
| Retries for dropped connections and |
| no |
| Text duplicate of structured tool results: |
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 is not registered in this mode: it
reads files from the machine the server runs on, which is not the caller's machine
in a shared deployment.
Variable | Default | Description |
|
| Enable the OAuth provider |
|
|
|
|
| Yandex OAuth server |
|
| Request Wiki scopes during authorization |
| — | Your Yandex OAuth app credentials |
|
| 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 |
| — | Public URL of this server (OAuth callbacks) |
| — | Comma-separated base64 32-byte keys (required for |
|
| 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 -.-> RHTTP 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:latestThe server writes no log files of its own — everything goes to stderr, which
Docker's defaultjson-file driver stores without a size limit. The
--log-opt flags above cap it; drop them only if your daemon already sets a
default.
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 (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.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 # testsBefore 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 (its undocumented search endpoint silently changed contract once
already) — 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 fixturesThe 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 27 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 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
Maintenance
Related MCP Servers
- AlicenseBqualityBmaintenanceA secure MCP server for interacting with MediaWiki instances, allowing users to search, read, create, and manage wiki content like pages, categories, and files. It supports both public and private wikis with comprehensive authentication for full read and write operations.19AGPL 3.0
- AlicenseAqualityAmaintenanceMCP server for MediaWiki wikis. Search, read, edit, and manage wiki content from AI assistants. Includes formatting, link checking, revision history, and markdown conversion.4321MIT
- AlicenseAqualityBmaintenanceEnables reading, creating, updating, and appending content to Yandex Wiki pages via MCP. Supports both read-write and read-only modes.79MIT
- Alicense-qualityCmaintenanceMinimal MCP server for Yandex Wiki that enables reading, writing, searching, and managing wiki pages and attachments.1MIT
Related MCP Connectors
MCP server for AgentDocs (agentdocs.eu): read, search, write, comment on & share Markdown docs.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Self-hostable team wiki; agents read & write it via MCP; Atlas turns your repo into a cited wiki.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dlbolshov/yandex-wiki-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server