Skip to main content
Glama

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": "..."
}

Поддерживаются два режима аутентификации:

Режим

Когда использовать

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 прогоняет всю цепочку — вход, чтение, запись, повторное чтение, удаление:

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.json

  • Windows: %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 "$@"

Инструменты

Инструмент

Аргументы

Действие

list_spaces

limit

Перечисляет пространства рабочего пространства

search

query, space_id?, limit

Полнотекстовый поиск по страницам

get_page

page_id

Открывает страницу по id или slug

get_recent

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). Если его опустить, вернётся ошибка 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.

Related MCP Connectors

Related MCP Servers