MCP server for Yandex Wiki with full-text search
Project description
Yandex Wiki Search MCP
mcp-name: io.github.dlbolshov/yandex-wiki-search-mcp
MCP server for the Yandex Wiki API with full-text search, focused on Wiki pages, comments, resources, attachments, and recovery workflows. It is the only Yandex Wiki MCP server that combines full-text content discovery, a server-side read-only mode, and a ready-to-use Docker image. The tool surface also includes first-class support for Yandex Wiki dynamic tables ("grids").
Fork of APonkratov/yandex-wiki-mcp (ya-yandex-wiki-mcp), see Credits.
Supported tools
page_search: full-text search across the entire Wiki (the headline feature)page_get_grids: list grids attached to a pagegrid_get: get a grid bygrid_idpage_get: get a page bypage_idorslugpage_get_descendants: get a page subtreepage_get_comments: get page commentspage_get_resources: get page resources, including attachments and gridspage_get_attachments: get page attachmentsgrid_create: create a grid on a pagegrid_update: update grid title and/or default sortgrid_delete: delete a gridgrid_copy: copy a grid to an existing target pagegrid_add_rows: add rows to a gridgrid_delete_rows: delete rows from a gridgrid_update_cells: update individual grid cellsgrid_add_columns: add columns to a gridgrid_delete_columns: delete columns from a gridgrid_move_rows: move a row inside a gridgrid_move_columns: move a column inside a gridpage_create: create a pagepage_update: update page title and/or full contentpage_append_content: append content to top, bottom, or anchorpage_add_comment: add a page comment or replypage_delete: delete a page and receive recovery tokenpage_recover: recover a page by recovery tokenpage_upload_attachment: upload a local file in chunks and attach it to a page
Full-text search
page_search wraps the undocumented-but-public POST /v1/search endpoint — the same
backend that powers the Wiki web search bar. It is the content discovery entry point:
search first, then open a result with page_get by its slug. The endpoint was first
discovered and published by slartus/mcp-yandex-wiki,
which directly inspired this tool; this project independently re-verified and extended
those findings (e.g. page_size accepts up to 50, not 10).
- Returns up to 50 results per call (
page_sizeis clamped to 1–50 client-side; the API rejects anything else with HTTP 400). - Search is global only — there is no server-side section or type filter. The optional
slug_prefixandresult_typearguments are applied client-side after fetching, so combine them withpage_size=50to avoid missing matches.slug_prefixmatches on path-segment boundaries (tech-doc/mldoes not matchtech-doc/mlops). - Results come in two types:
page(relative url, normalized by the tool to an absolutehttps://wiki.yandex.ru/...link) andfile(absolute...?download=1download link). - Quoted
"exact phrase"queries work and produce phrase-matched results. total_documentsalways equals the number of returned results — it is not a global hit count.
Notes on the Yandex Wiki API
Findings verified live against a production Yandex 360 organization (see the probe
scripts in scripts/):
POST /v1/searchis undocumented;page_sizemax is 50 (0, negative, or >50 → HTTP 400); there is no server-side pagination or filtering —page/offset/limitand any section/type body params are ignored, andtotal_pagesis always 1 (or 0 when empty).- OAuth scopes are not enforced by the Wiki API — a token with only
wiki:readcan still write. Read-only is guaranteed only by not registering write tools (WIKI_READ_ONLY=true). Credit: first reported publicly by slartus/mcp-yandex-wiki and independently confirmed here. - HTTP 403 is about user permissions, not token scopes — e.g. readonly system pages owned by
yandex360-wiki(per slartus, see above). - Any
POST /pages/{id}bumpsmodified_at, even with an empty body — the page is marked as modified (per slartus, see above). - Quoted
"exact phrase"search works;-minusand boolean operators are ignored. - There is no revisions/history/backlinks API — "who links here" workflows are not possible.
created_at/modified_at/comments_count/is_readonlyare not top-level page fields; fetch them viapage_getwithfields=["attributes"].- Error responses come in two envelope shapes (
messageas string-or-null plusdetails, or as a list pluslevel); the client parses both. - No rate-limit headers are exposed (
X-RateLimit-*/Retry-Afterabsent). GET /pages/{id}/resources?q=is the only server-side text filter in the whole API (title search within one page's attachments/grids) — exposed viapage_get_resources.
The org-neutral scripts in scripts/ (probe_api*.sh, smoke.sh) are living
documentation of this behavior and can be re-run against your own organization
(credentials via env vars or a $SECRETS file; probe output goes to raw/, which is
gitignored because it contains real org data).
Quickstart (Claude Desktop / Cursor / Windsurf)
Docker, read-only (recommended for agents):
{
"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":"...","WIKI_ORG_ID":"..."}
}
}
}
uvx (PyPI):
{
"mcpServers": {
"yandex-wiki-search": {
"command": "uvx",
"args": ["yandex-wiki-search-mcp"],
"env": {
"WIKI_TOKEN": "...",
"WIKI_ORG_ID": "...",
"WIKI_READ_ONLY": "true"
}
}
}
}
Why these tools
The toolset is based on the public Yandex Wiki API areas that are most useful in an MCP workflow:
- full-text discovery of pages and files
- page read/write operations
- grid read/write operations
- subtree traversal for documentation sections
- comments for review and collaboration flows
- resources and attachments for document management
- recovery tokens for safe automation
- upload sessions for large local files
Grid Notes
- All non-read tools are disabled when
WIKI_READ_ONLY=true. - Grid mutation tools use optimistic locking where the Wiki API requires
revision. grid_copyreturns operation metadata from the Wiki API, not a ready copied grid object.grid_add_columnsrequiresrequiredon every column because the real Wiki API validates it.grid_update.default_sortis verified against the real API as a list of single-entry mappings, for example[{"status": "asc"}, {"priority": "desc"}].
These areas are documented in the official Yandex Wiki API references and examples:
- API overview:
https://yandex.ru/support/wiki/en/api-ref/about - API examples:
https://yandex.ru/support/wiki/ru/api-ref/examples - Page resources:
https://yandex.ru/support/wiki/ru/api-ref/pagesresources/pagesresources__resources - Grids API index:
https://yandex.ru/support/wiki/ru/api-ref/grids/
Authentication
Set one of these:
WIKI_TOKENWIKI_IAM_TOKEN
And exactly one organization header source:
WIKI_ORG_IDWIKI_CLOUD_ORG_ID
Optional:
TRANSPORT=stdio|sse|streamable-httpWIKI_API_BASE_URL=https://api.wiki.yandex.netWIKI_WEB_BASE_URL=https://wiki.yandex.ru(base for absolute page links inpage_searchresults)WIKI_READ_ONLY=true|false
Run locally
uv sync --dev
uv run yandex-wiki-search-mcp
Docker deployment
The Docker image requires the same core environment variables as the local launch:
- one of
WIKI_TOKENorWIKI_IAM_TOKEN - exactly one of
WIKI_ORG_IDorWIKI_CLOUD_ORG_ID TRANSPORT=streamable-httpfor HTTP deployment
Optional:
HOST=0.0.0.0PORT=8000WIKI_API_BASE_URL=https://api.wiki.yandex.netWIKI_READ_ONLY=true|false
Using Pre-built Image (Recommended)
# Using environment file
docker run --env-file .env -p 8000:8000 ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest
# With inline environment variables
docker run -e WIKI_TOKEN=your_token \
-e WIKI_ORG_ID=your_org_id \
-e TRANSPORT=streamable-http \
-p 8000:8000 \
ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest
The MCP endpoint is available at http://localhost:8000/mcp.
Building the Image Locally
docker build -t yandex-wiki-search-mcp .
Docker Compose
Using pre-built image:
version: '3.8'
services:
mcp-wiki:
image: ghcr.io/dlbolshov/yandex-wiki-search-mcp:latest
ports:
- "8000:8000"
environment:
- WIKI_TOKEN=${WIKI_TOKEN}
- WIKI_ORG_ID=${WIKI_ORG_ID}
- TRANSPORT=streamable-http
Building locally:
version: '3.8'
services:
mcp-wiki:
build: .
ports:
- "8000:8000"
environment:
- WIKI_TOKEN=${WIKI_TOKEN}
- WIKI_ORG_ID=${WIKI_ORG_ID}
- TRANSPORT=streamable-http
If you enable Redis-backed OAuth storage later, the existing compose.yaml can be used as the Redis service baseline.
Contributing
Before creating a commit or opening a merge request, run the full local verification set from CONTRIBUTING.md.
Tests
uv run pytest
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) and rebranding; 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.
Project details
Release history Release notifications | RSS feed
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.3.0.tar.gz.
File metadata
- Download URL: yandex_wiki_search_mcp-0.3.0.tar.gz
- Upload date:
- Size: 37.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2da3b3228013fccc863d0ba81fc6494d89cccf37021f7099f6b850264c2400f6
|
|
| MD5 |
8c103ec757b13c37103a0670fc6e193a
|
|
| BLAKE2b-256 |
a5b2388084d5fd2def42dd614dcd9598655c2b1c3537c1662c3d3de48d785951
|
Provenance
The following attestation bundles were made for yandex_wiki_search_mcp-0.3.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.3.0.tar.gz -
Subject digest:
2da3b3228013fccc863d0ba81fc6494d89cccf37021f7099f6b850264c2400f6 - Sigstore transparency entry: 2200802076
- Sigstore integration time:
-
Permalink:
dlbolshov/yandex-wiki-search-mcp@f17fa97b8a1659e9f0222bb53693510608b46891 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/dlbolshov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f17fa97b8a1659e9f0222bb53693510608b46891 -
Trigger Event:
push
-
Statement type:
File details
Details for the file yandex_wiki_search_mcp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: yandex_wiki_search_mcp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 42.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1ffec7e6a53a9bc99cd0537895b8893ccae980ddeaaebe4ce108959f80e17b3
|
|
| MD5 |
b2b80133e3af0a40f2d360d2c317a6d3
|
|
| BLAKE2b-256 |
24d2a851a66f3bba43ceb2295ea0b84f10cad46e80af320cbb461dfe078a4741
|
Provenance
The following attestation bundles were made for yandex_wiki_search_mcp-0.3.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.3.0-py3-none-any.whl -
Subject digest:
b1ffec7e6a53a9bc99cd0537895b8893ccae980ddeaaebe4ce108959f80e17b3 - Sigstore transparency entry: 2200802130
- Sigstore integration time:
-
Permalink:
dlbolshov/yandex-wiki-search-mcp@f17fa97b8a1659e9f0222bb53693510608b46891 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/dlbolshov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f17fa97b8a1659e9f0222bb53693510608b46891 -
Trigger Event:
push
-
Statement type: