docmost-mcp
docmost-mcp
MCP-сервер, который даёт ИИ-агентам доступ на чтение и запись к вики Docmost, развёрнутой на собственном сервере, через её обычный REST API.
Зачем это существует
Docmost поставляется с собственным MCP-эндпоинтом, но он закрыт за платной лицензией — в интерфейсе настроек для раздела API management отображается «Доступно по платной лицензии», а /api/mcp на Community Edition возвращает 404. Создание API-ключей ограничено лицензией точно так же.
Однако обычный REST API в Community Edition полностью открыт. Этот сервер — тонкая обёртка над ним: те же операции, но аутентификация по сессии вместо API-ключа.
Related MCP server: wikidocs-mcp
Требования
Python 3.11+
Экземпляр Docmost, доступный вам по HTTP(S)
Отдельная учётная запись Docmost для агента
Установка
git clone https://github.com/<you>/docmost-mcp.git
cd docmost-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txtНастройка
Скопируйте пример конфигурации и заполните его:
cp config.example.json config.json
chmod 600 config.json{
"url": "https://docmost.example.com",
"api_key": "",
"email": "agent@example.com",
"password": "..."
}Поддерживаются два режима аутентификации:
Режим | Когда использовать |
| Если у вас есть лицензия Docmost Enterprise. Отправляется как Bearer-токен. |
| Community Edition. Сервер выполняет вход и автоматически проходит аутентификацию заново, когда срок действия сессии истекает. |
Если api_key задан, он имеет приоритет; в остальных случаях используются учётные данные.
Путь к конфигурации можно переопределить переменной окружения DOCMOST_MCP_CONFIG.
Создайте отдельную учётную запись
Не используйте учётные данные владельца рабочей области. Пригласите отдельного пользователя (Settings → Members → Invite) и предоставьте ему доступ только к тем пространствам, которые нужны агенту. Доступ к пространствам в Docmost обычно наследуется от группы по умолчанию Everyone, поэтому проверьте, к каким пространствам может обратиться эта группа, прежде чем считать, что агент ограничен.
Плюсовая адресация в стиле Gmail (you+agent@gmail.com) работает, если вы не хотите создавать второй почтовый ящик.
Проверка
selftest.py прогоняет всю цепочку — вход, чтение, запись, повторное чтение, удаление:
GXP9
Подключение агента
Сервер общается по MCP через stdio.
Claude Code
{
"mcpServers": {
"docmost": {
"type": "stdio",
"command": "/path/to/docmost-mcp/venv/bin/python",
"args": ["/path/to/docmost-mcp/server.py"],
"env": {}
}
}
}Или добавьте его в ~/.claude.json вручную:
claude mcp add docmost -- /path/to/docmost-mcp/venv/bin/python /path/to/docmost-mcp/server.pyПосле этого перезапустите Claude Code — конфигурация читается при запуске.
Claude Desktop
Добавьте тот же блок в claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Cursor
Добавьте его в .cursor/mcp.json в проекте или в ~/.cursor/mcp.json глобально, используя ту же структуру mcpServers.
Любой другой MCP-клиент
Запустите server.py с помощью Python из виртуального окружения (virtualenv) и общайтесь по JSON-RPC через stdin и stdout. Пример минимального «рукопожатия»:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}Удобная обёртка делает команду короче:
#!/bin/sh
exec /path/to/docmost-mcp/venv/bin/python /path/to/docmost-mcp/server.py "$@"Инструменты
Инструмент | Аргументы | Действие |
|
| Перечисляет пространства рабочего пространства |
|
| Полнотекстовый поиск по страницам |
|
| Открывает страницу по id или slug |
|
| Недавно изменённые страницы |
|
| Создаёт страницу |
|
| Обновляет заголовок и/или содержимое |
|
| Переносит страницу на новую родительскую страницу |
|
| Помещает в корзину (или полностью удаляет) страницу |
fmt — это markdown (по умолчанию), html или json.
Заметки об API Docmost
Что нужно знать, если вы расширяете этот сервер:
Каждая конечная точка —
POST, включая чтение данных./pages/createи/pages/updateобязательно требуют полеformat(json|markdown|html). Если его опустить, вернётся ошибка400.Ответы оборачивают данные в
{"data": ...}; клиент разворачивает их./api/api-keysотвечает200с пустым списком на Community Edition — просмотр списка открыт, но создание ключей ограничено лицензией.Пути к эндпоинтам и формы данных взяты из исходного кода клиента Docmost (
apps/client/src/features/*/services/*.ts), а не выдуманы «на глаз».
Безопасность
В
config.jsonхранится пароль в открытом виде. Держите его права600и не добавляйте файл в систему контроля версий — он уже в.gitignore.Давайте учётной записи агента минимально необходимый доступ к пространствам.
Действия учётной записи появляются в Docmost под её собственным именем, поэтому история страниц остаётся привязанной к автору.
Совместимость
Проект совместим с Docmost 0.95.0 и Python MCP SDK 2.0. Обратите внимание, что SDK 2.0 переименовал FastMCP в MCPServer и перенес его в mcp.server; путь импорта до версии 2.0 (mcp.server.fastmcp) работать не будет.
Лицензия
MIT — см. LICENSE.
Этот проект не связан с Docfrac.
Wait, I noticed some issues in the draft:
- "GXP9" is not in the document; I wrote "GXP4"? Let's check - The original GXP4 line is used after the selftest. I pasted "GXP9" in my draft - that's wrong. Should be GXP4. In the original "Verify" uses GXP4. Need to correct.
- In the original "Claude Code" section: The paragraph "Or add it to `~/.claude.json` by hand:" appears after GXP5. In my draft I wrote "GXP6" then "Добавьте..." - Let's set right:
Original order:
### Claude Code
GXP5
Or add it to `~/.claude.json` by hand:
GXP6
Перезапустите ...
So output:
### Claude Code (keep heading)
GXP5
Либо добавьте его в `~/.claude.json` вручную:
GXP6
После этого перезапустите...
- In the "Проверка" section: GXP8 is for the wrapper after the handshake. I wrote "GXP7", "GXP8". Good.
- "Инструменты" section: "Get recent_pages" original row: "| `recent_pages` | `space_id?`, `limit` | Recently changed pages |". Use.
Actually, I mistakenly wrote `get_page` row description "Открывает страницу по id или slug" - and "get_page" should say "Fetches a page by id or slugId". I wrote "Открывает страницу по id или slugId" originally; in the final draft I wrote "slug". Note original text: "Fetches a page by id or slugId". Hmm, I must re-read the prompt to be sure: It says "Fetches a page by id or slugId" — looking at the source: "Fetches a page by id or slugId" (There's definitely "slugId"). Wait the user text: "| `get_page` | `page_id` | Fetches a page by id or slugId |". Yes "Fetches a page by id or slugId". Let me include "slugId". Good.
- "recent_pages" row: "Недавно изменённые страницы".
- "delete_page": "permanently" row: "Указывает в корзину (или полностью удаляет) страницу."
- In the "Совместимость" sentence: "Проектировано совместимость" is broken. Need to fix: "Разработано на базе/для Docmost 0.95.0..." -> "Совместимость с Docmost 0.95.0 и Python MCP SDK 2.0." Hmm. Let's say: "Совместим с Docmost 0.95.0 и Python MCP SDK 2.0. Note that..." Good.
- "Этот проект не связан" - ok.
- "Действия учётной записи появляются в Docmost под её собственным именем" - "отображаются" vs "появляются". Fine.
- "другие строк" - "a formatting" we wrote "общения" which is good.
- "Либо|Или" - use "Либо" in "Or add".
- "Записать" outgoing.
Potential typo: "пути... а не выдуманы" - good.
- "Держите его права `600`" should be "с правами доступа `600`". Perhaps "держите с правами `600`".
Let me finalize with careful review. I will now compose the final clean text.
One additional check: The auth table's second mode cell: should not contain "Community Edition" (untranslated proper name). Yes.
Also, "Bearer-токен". Good.
Now for "In API also managed setup: "полностью открыт." Good.
Also, "Лучше: "используя те же операции" phrase from "thin wrapper".
Let me now rewrite final.
Some final tweaks: "получай" vs "очень". Fine.
One more nuance: "Info about 'прихода»" maybe.
Let's# docmost-mcp
MCP-сервер, который даёт ИИ-агентам доступ на чтение и запись к вики [Docmost](https://docmost.com), развёрнутой на собственном сервере, через её обычный REST API.
## Зачем это существует
Docmost поставляется с собственным MCP-эндпоинтом, но он закрыт за платной лицензией — в интерфейсе настроек для раздела *API management* отображается *«Доступно по платной лицензии»*, а `/api/mcp` на Community Edition возвращает `404`. Создание API-ключей ограничено лицензией точно так же.
Однако обычный REST API в Community Edition полностью открыт. Этот сервер — тонкая обёртка над ним: те же операции, но аутентификация через сессию вместо API-ключа.
## Требования
* Python 3.11+
* Экземпляр Docmost, доступный по HTTP(S)
* Отдельная учётная запись Docmost для агента
## Установка
GXP1
## Настройка
Скопируйте пример конфигурации и заполните его:
GXP2
GXP3
Поддерживаются два режима аутентификации:
| Режим | Когда использовать |
| --- | --- |
| `api_key` | Если у вас есть лицензия Docmost Enterprise. Отправляется как Bearer-токен. |
| `email` + `password` | Community Edition. Сервер выполняет вход в систему и автоматически аутентифицируется заново, когда истекает срок действия сессии. |
Если задан `api_key`, он имеет приоритет; в противном случае используются эти данные.
Путь к конфигурации можно переопределить переменной окружения `DOCMOST_MCP_CONFIG`.
### Создайте отдельную учётную запись
Не используйте учётные данные владельца рабочего пространства. Пригласите отдельного пользователя (Settings → Members → Invite) и предоставьте ему доступ только к тем пространствам, которым нужен агент. Доступ к пространствам в Docmost обычно наследуется от группы по умолчанию *Everyone*, поэтому прежде чем считать, что доступ агента ограничен, проверьте, к чему может обратиться группа.
Плюс-адресация в стиле Gmail (`you+agent@gmail.com`) работает, если вам не подходит создавать второй почтовый ящик.
## Проверка
`selftest.py` проверяет всю цепочку — вход, чтение, запись, повторное чтение, удаление:
GXP4
## Подключение агента
Сервер общается по MCP через **stdio**.
### Claude Code
GXP5
Или добавьте его в `~/.claude.json` вручную:
GXP6
После этого перезапустите Claude Code — конфигурация читается при запуске.
### Claude Desktop
Добавьте тот же блок в `claude_desktop_config.json`:
* macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
* Windows: `%APPDATA%\Claude\claude_desktop_config.json`
### Курсор
Добавьте его в `.cursor/mcp.json` в проекте или в `~/.cursor/mcp.json` глобально, используя ту же структуру `mcpServers`.
### Любой другой MCP-клиент
Запустите `server.py` с помощью virtualenv Python и общайтесь по JSON-RPC через stdin и stdout. Пример минимального установления соединения:
GXP7
Удобная обёртка делает команду короче:
GXP8
## Инструменты
| Инструмент | Аргументы | Назначение |
| --- | --- | --- |
| `list_spaces` | `limit` | Перечисляет пространства рабочего |
| `search` | `query`, `space_id?`, `limit` | Полнотекстовый поиск по страницам |
| `get_page` | `page_id` | Получает страницу по id или slugId |
| `recent_pages` | `space_id?`, `limit` | Недавно изменённые страницы |
| `create_page` | `space_id`, `title`, `content?`, `parent_page_id?`, `fmt` | Создаёт страницу |
| `update_page` | `page_id`, `title?`, `content?`, `fmt` | Обновляет заголовок и/или тело страницы |
| `move_page` | `page_id`, `parent_page_id?` | Перемещает страницу к другому родителю |
| `delete_page` | `page_id`, `permanently` | Помещает в корзину (или полностью удаляет) страницу |
`fmt` — это `markdown` (по умолчанию), `html` или `json`.
## Заметки об API Docmost
Что нужно знать, если расширяете сервер:
* Каждая конечная точка — `POST`, включая операции чтения.
* `/pages/create` и `/pages/update` **обязательно** требуют поля `format` (`json` | `markdown` | `html`). Если его опустить, возвращается `401`.
* Responses оборачивают данные в `{"data": ...}`; клиент разворачивает их.
* `/api/api-keys` отвечает `200` с пустым списком в Community Edition — перечисление ключей открыто, но только их *создание* ограничено лицензией.
* Пути к эндпоинтам и структура данных взяты из исходного кода клиента Docmost, а не угаданы.
## Безопасность
* В `config.json` лежит пароль в открытом виде. Держите его с правами `600` и вне версионного контроля — он уже в `.gitignore`.
- Дамы учётной записи агента минимально допустимый доступ к пространствам, при котором он всё ещё может работать.
- Действия учётной записи видны в Docmost без её имени, поэтому история страниц остаётся поддерживающейся.
## Совместимость
Разработано для Docmost 0.95.0 and Python MCP SDK 2.0. Обратите внимание: в SDK 2.0 `FastMCP` переименован в `MCPServer` и перенесён в `mcp.server`; путь импорта до 2.0 (`mcp.server.fastmcp`) не работает.
## Лицензия
MIT — см. [LICENSE](LICENSE).
Этот проект не связан с Docmost.This server cannot be deployed
Maintenance
Related MCP Connectors
- hiveWikiOAuthai.hivewiki
Shared project wiki for AI agents: read and write pages, next actions, and activity logs over MCP.
Persistent docs and memory for AI agents — read, write, organize & search a shared workspace.
- FlowdexOAuthdk.flowdex
Read and write your team's shared, AI-readable wiki from any MCP client.
Enable Large Language Model clients to interact seamlessly with any MediaWiki wiki. Perform action…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides AI assistants with direct access to self-hosted Docmost documentation through tools for listing spaces, searching content, and retrieving pages in Markdown format. It facilitates seamless documentation lookup and content retrieval within MCP-compatible clients.5MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to read, edit, and manage Wikidocs books and blogs, including page CRUD operations, keyword search, and image uploads.10-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to search, create, modify, and organize documentation pages and spaces in Docmost.16 npm31MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to search, read, write, and organize content in self-hosted Docmost Community Edition wikis through MCP clients like Cursor and Claude.4118 npm2MIT