docmost-mcp-oss
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@docmost-mcp-osssearch Docmost pages for 'Q3 planning' and summarize"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
docmost-mcp-oss
An MCP server built with FastMCP that exposes the REST API of Docmost as tools for AI assistants (Claude Desktop, Claude Code, Cursor, VS Codeβ¦).
Managed with uv.
π Full API research:
docs/DOCMOST-API.md. Verified against a real Docmost instance (not just the documentation).
Why a custom MCP?
Docmost ships with an official MCP, but it requires a Business/Enterprise license and is enabled from Settings β AI settings β MCP. This project uses the internal API (the same one the web UI consumes), which is also available in the self-hosted OSS edition.
About the name: the -oss suffix distinguishes this package from the unrelated
docmost-mcp already on PyPI. They are different
projects by different authors, and they would collide if installed side by side (both used to
ship the same import package). This one targets self-hosted Docmost and can edit page bodies;
install it as docmost-mcp-oss.
Related MCP server: wikidocs-mcp
Exposed tools (20)
Category | Tools |
Pages |
|
Spaces |
|
Comments |
|
User |
|
Two tools stand out:
get_pagereturns metadata and content in Markdown (it combines/pages/infowith/pages/export, because the former does not return the body).update_page_contentreplaces the body of an existing page. The REST API can't do this: it writes directly to the Yjs document over the collaboration WebSocket. Requires theyjsextra and takes ~13 s (Docmost persists with a 10 s debounce).
Editing the body of an existing page
Docmost's REST API ignores the content field in /pages/create and /pages/update (they respond 200 but save nothing): the body lives in the Yjs collaboration server.
That's why there are two distinct paths:
Operation | How |
Read content |
|
Create pagewith content |
|
Replace the body of an existing page |
|
Rename |
|
Delete / restore / move | β |
update_page_content opens the wss://<host>/collab WebSocket, syncs the document, replaces the content and waits for it to persist. Markdown is
converted using Docmost's own converter, so it supports the full schema (tables, lists, code, quotes, imagesβ¦).
uv sync --extra yjs # enables update_page_contentTechnical details of the protocol: docs/YJS-EDITING.md.
Installation
As a tool, from PyPI (no clone needed)
uvx docmost-mcp-oss # stdio, for MCP clients
uvx docmost-mcp-oss --check # verify the connection to your instanceAdd --with pycrdt --with websockets (or install docmost-mcp-oss[yjs]) to enable
update_page_content, the tool that edits existing page bodies.
From source (for development)
uv creates the virtual environment and installs the dependencies (pinned in uv.lock):
uv syncNo need to activate the environment: use uv run β¦.
Configuration
cp .env.example .env # then edit the valuesDOCMOST_URL=https://docmost.example.com
# Option A β API Key
DOCMOST_API_KEY=dm_xxx
# Option B β login (works on OSS)
DOCMOST_EMAIL=you@example.com
DOCMOST_PASSWORD=your-passwordVerify the connection:
uv run docmost-mcp-oss --check
# -> OK: authenticated as you@example.com (https://docmost.example.com)Usage
stdio (recommended for local use)
uv run docmost-mcp-ossHTTP (for remote access)
uv run docmost-mcp-oss --http --port 8000
# MCP endpoint: http://127.0.0.1:8000/mcpConnecting to MCP clients
Every client below launches the same stdio command. The examples install from
PyPI with uvx; to run from a clone instead, replace uvx docmost-mcp-oss with
uv --directory /path/to/docmost-mcp-oss run docmost-mcp-oss.
To enable update_page_content (editing existing page bodies), use the yjs
extra β replace docmost-mcp-oss with --from "docmost-mcp-oss[yjs]" docmost-mcp-oss, or see the note at the end of this section.
Claude Code
claude mcp add docmost \
-e DOCMOST_URL=https://docmost.example.com \
-e DOCMOST_EMAIL=you@example.com \
-e DOCMOST_PASSWORD=your-password \
-- uvx docmost-mcp-ossEquivalent JSON, in .mcp.json at the root of your project (or under
mcpServers in ~/.claude.json for a user-wide server):
{
"mcpServers": {
"docmost": {
"type": "stdio",
"command": "uvx",
"args": ["docmost-mcp-oss"],
"env": {
"DOCMOST_URL": "https://docmost.example.com",
"DOCMOST_EMAIL": "you@example.com",
"DOCMOST_PASSWORD": "your-password"
}
}
}
}Codex
β οΈ Codex configures MCP servers in TOML, not JSON. Add this to
~/.codex/config.toml:
[mcp_servers.docmost]
command = "uvx"
args = ["docmost-mcp-oss"]
[mcp_servers.docmost.env]
DOCMOST_URL = "https://docmost.example.com"
DOCMOST_EMAIL = "you@example.com"
DOCMOST_PASSWORD = "your-password"Or let the CLI write it for you:
codex mcp add docmost \
--env DOCMOST_URL=https://docmost.example.com \
--env DOCMOST_EMAIL=you@example.com \
--env DOCMOST_PASSWORD=your-password \
-- uvx docmost-mcp-ossphoson-cli
phoson reads JSON from the file named by mcp_config_file in
~/.phoson/config.toml (defaults to ~/.phoson/mcps.json). Entries need an
explicit "enabled": true:
{
"mcpServers": {
"docmost": {
"command": "uvx",
"args": ["docmost-mcp-oss"],
"env": {
"DOCMOST_URL": "https://docmost.example.com",
"DOCMOST_EMAIL": "you@example.com",
"DOCMOST_PASSWORD": "your-password"
},
"enabled": true
}
}
}Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"docmost": {
"command": "uvx",
"args": ["docmost-mcp-oss"],
"env": {
"DOCMOST_URL": "https://docmost.example.com",
"DOCMOST_EMAIL": "you@example.com",
"DOCMOST_PASSWORD": "your-password"
}
}
}
}Cursor (.cursor/mcp.json)
Same shape as Claude Desktop, inside the mcpServers key.
Enabling body editing
update_page_content needs the yjs extra, which is optional to keep the base
install small. Point the client at the extra instead of the bare package:
Client | Launcher to use |
|
|
Any |
|
For example, in Claude Code:
claude mcp add docmost \
-e DOCMOST_URL=https://docmost.example.com \
-e DOCMOST_EMAIL=you@example.com \
-e DOCMOST_PASSWORD=your-password \
-- uvx --from "docmost-mcp-oss[yjs]" docmost-mcp-ossTests
Command | What it validates | Needs instance |
| Client against a mocked Docmost (12 cases) | No |
| MCP tool registry | No |
| Read-only against a real instance | Yes |
| Tools through the MCP layer | Yes |
| Body editing via Yjs (7 checks) | Yes |
| Lint | No |
The live tests read credentials from .docmost-creds.json (ignored by git):
{
"url": "https://docmost.example.com",
"email": "you@example.com",
"password": "your-password"
}--write adds a create β update β get β delete cycle over a test page
(use --write keep to keep it).
Implementation notes
Things that are not obvious and that the client already handles:
All endpoints are
POSTand respond with{data, success, status}; the client unwrapsdata.Content does not come from
/pages/info: it is fetched via/pages/export(markdown|html), which responds with the raw file, no wrapper.Only
/pages/importpersists content over REST;/pages/createand/pages/updateignorecontent. To edit the body of an already-created page you must write to the Yjs document (see above).Authentication: both real variants are supported β the
authTokencookie (httpOnly) anddata.tokens.accessTokenforwarded asBearer./searchrequiresqueryandspaceId; if you don't provide a space, it fans out across all accessible spaces and merges byrank./pages/sidebar-pagesrequiresspaceId; if you only provide a page, its space is resolved first.Lexical search (PostgreSQL FTS): stopwords ("a", "de", "the") return 0 results.
Heterogeneous response shapes: some builds return
{items, meta}and others raw lists; the client normalizes both.Permissions: the MCP acts as the authenticated user; it can never do more than the user can.
Structure
docmost-mcp-oss/
βββ docmost_mcp_oss/
β βββ __init__.py
β βββ client.py # async HTTP client for the Docmost REST API
β βββ collab.py # Yjs WebSocket: read/write page bodies
β βββ server.py # FastMCP server + tools
βββ docs/
β βββ DOCMOST-API.md # API research (OSS + real instance)
β βββ YJS-EDITING.md # collaboration WebSocket protocol
βββ tests/
β βββ test_client.py # mocked, no network
β βββ test_tools.py # MCP tool registry, no network
β βββ smoke_live.py # real instance, read-only
β βββ smoke_mcp_live.py # MCP layer against a real instance
β βββ smoke_yjs_live.py # body editing via Yjs
βββ .github/workflows/ci.yml # lint, tests and packaging
βββ CONTRIBUTING.md
βββ LICENSE # MIT
βββ pyproject.toml # metadata, dependencies and ruff config
βββ uv.lock # reproducible resolution (it is versioned)
βββ .env.exampleLicense
MIT Β© 2026 Abel Santillan Rodriguez
Related MCP Connectors
Persistent docs and memory for AI agents β read, write, organize & search a shared workspace.
Share HTML/Markdown documents via URL instantly. Create, edit, delete docs from any AI tool.
Read spaces, collections, pages and content; search docs and manage GitBook organization spaces.
Versioned documentation registry and semantic search for AI tools and coding assistants.
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.3 npm30MIT

mcp-server-ispace-wikiofficial
AlicenseAqualityBmaintenanceEnables AI assistants to perform CRUD operations, search, batch operations, and commenting on iSpace Wiki documents.32MIT