Docmost OSS MCP桥接工具

一个轻量级的Node.js桥接工具,用于连接AI代理(如Cursor、Claude Desktop等)与自托管的Docmost OSS实例,提供文档搜索、空间管理等功能。

  • by dJPoida
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 dJPoida/docmost-oss-mcp-shim

使用说明

Docmost OSS MCP垫片

AI代理之间的轻量级Node.js桥梁(如 光标, 克劳德桌面版,或任何模型上下文协议工具)和您的 自托管Docmost OSS实例.

Docmost版本兼容性

此垫片的目标是 Docmost OSS v0.25.0及更高版本,与 v0.90.1 作为当前测试版本。

  • 最低要求: v0.25.0——基于光标的分页和 items/meta 搜索、历史记录、评论和空间页面列表使用的响应信封。
  • 推荐/测试: v0.90.1——验证此迁移的版本。
  • 不支持: v0.23.x及更早版本——这些使用偏移/页面分页和数组形状的搜索响应,而此填充程序不再实现。

如果要从v0.23.x升级,请先更新Docmost,然后部署一个包含光标分页支持的填充构建。

✨ 特性

  • 🔌 即插即用MCP集成 -适用于Cursor、Claude Desktop和任何兼容MCP的AI代理
  • 🐳 Docker就绪 -在任何平台上使用Docker Compose在几秒钟内部署
  • 🥧 Raspberry Pi兼容 -在ARM设备上运行良好
  • 🔒 安全 -API密钥认证和会话管理
  • 🔍 全文检索 -从IDE中搜索文档
  • 📚 空间管理 -列出并浏览所有Docmost空间
  • 🚀 自动身份验证 -自动处理Docmost登录和cookie管理
  • 📦 Docmost v0.25+兼容 -目标Docmost OSS v0.25.0+(在v0.90.1上测试)

🤖 适用于MCP用户(AI代理)

使用光标快速入门

将此添加到您的Cursor MCP配置中(~/.cursor/mcp.json):

{
  "mcpServers": {
    "docmost": {
      "command": "npx",
      "args": ["-y", "--package=github:dJPoida/docmost-oss-mcp-shim#v0.5.0", "docmost-mcp"],
      "env": {
        "MCP_DOCMOST_SHIM_URL": "http://YOUR_SHIM_SERVER_IP:3888",
        "MCP_SHIM_KEY": "your-secure-random-string"
      }
    }
  }
}

配置:

  • 替换 YOUR_SHIM_SERVER_IP 使用您的垫片服务器(例如Raspberry Pi)的IP地址
  • 替换 your-secure-random-string 与相同 SHIM_API_KEY 在您的垫片服务器上配置
  • 更新版本标签(#v0.5.0)以匹配最新版本

可用工具

您的AI代理可以使用这些Docmost工具:

  • docmost_listSpaces -列出可用工作区/空间
  • docmost_search -按查询搜索页面(支持可选 spaceId,光标分页通过 limit/cursor/beforeCursor)
  • docmost_getPage -获取包括附件和图表在内的完整页面内容✅ 新
  • docmost_getSpacePages -获取特定空间中的所有页面✅ 新
  • docmost_getAttachment -获取附件内容,包括draw.io图表✅ 新
  • docmost_getPageHistory -获取页面版本历史和演变✅ 新
  • docmost_getPageBreadcrumbs -获取页面层次结构和导航上下文✅ 新
  • docmost_getComments -在页面上获取评论和讨论✅ 新
  • docmost_health -检查垫片服务器运行状况

可用资源

浏览您的Docmost文档层次结构:

  • docmost://spaces -所有可用空间列表
  • docmost://all-pages -所有空间中所有页面的完整概述✅ 新
  • docmost://space/{spaceId} -特定空间内的页面
  • docmost://page/{pageId} -单个页面元数据

可用提示

获取文档查找的指导性帮助:

  • search-docs -有效文档搜索的最佳实践

✅ 增强功能(v0.5.0+)

主要更新:全页面内容访问! 此集成现在支持:

✅ 什么有效:

  • 列出空间及其元数据
  • 搜索页面并查看内容亮点/片段(带光标分页)
  • 🆕 阅读整页内容,包括文本、标题和嵌入内容
  • 🆕 访问draw.io图表和其他嵌入式附件
  • 🆕 下载实际附件内容(SVG、图像、文件)
  • 🆕 在空间内浏览完整的页面层次结构
  • 🆕 获取附件元数据和引用
  • 🆕 访问页面版本历史并跟踪文档演变
  • 🆕 了解页面层次结构和导航上下文
  • 🆕 阅读评论和讨论以获取更多背景信息
  • 🆕 一次获取所有文档的全面概述
  • 通过MCP资源浏览页面层次结构
  • 获取文档查找的指导提示
  • 缓存响应以提高性能
  • 具有指数回退的自动重试,以实现网络弹性

❌ 此MCP不能做什么(只读设计):

  • 创建或修改页面
  • 更新页面内容或元数据
  • 管理用户、空间或权限
  • 任何行政职能

该MCP被设计为 只读文档访问工具 对于AI代理。它提供了对文档内容、结构和上下文的全面访问,同时与行政职能保持了明确的分离。所有内容编辑都必须在Docmost UI中手动完成。

游标用法示例

只需问Cursor自然语言问题,它就会自动使用Docmost工具:

  • “在我的Docmost中搜索部署文档”
  • “列出我的所有Docmost空间”
  • “显示带有draw.io图的环境概述页面”
  • “获取环境空间中的所有页面”
  • “给我一个所有文档页面的概述”
  • “从环境概述页面下载draw.io图表”
  • “显示环境概述页面的版本历史记录”
  • “获取此页面的面包屑和层次结构”
  • “显示对此文档的任何评论或讨论”
  • “查找有关环境变量的页面”

Cursor将发现您的文档,并帮助您在不离开IDE的情况下导航它!


🛠️ 适用于Shim服务器操作员

🚀 为什么存在

Docmost的开源版本不公开API密钥或外部自动化功能。
这个填充程序通过充当AI代理和Docmost实例之间经过身份验证的桥梁来填补这一空白。

✅ 无需企业许可证
✅ 无需手动管理cookie
✅ 用于AI代理的简单REST API
✅ 生产就绪的Docker部署
✅ 适用于Raspberry Pi和ARM设备

⚙️ 设置

1.️⃣ 需求

  • 节点 v22+
  • 跑步自托管 Docmost OSS 实例(Docker或裸机), v0.25.0或更高版本 (测试于 v0.90.1)
  • 垫片的Docmost用户帐户(例如。 my.docmost.mcp.user@gmail.com)

2.️⃣ 安装

git clone https://github.com/dJPoida/docmost-oss-mcp-shim.git
cd docmost-oss-mcp-shim
npm install

3.️⃣ 配置

创建 .env 项目根目录中的文件:

# Docmost Connection (Required)
DOCMOST_BASE_URL=http://your-docmost-server:3000
DOCMOST_EMAIL=your-mcp-user@example.com
DOCMOST_PASSWORD=your-secure-password

# Shim Network Settings (Optional)
HOST=0.0.0.0  # Use 0.0.0.0 for Docker, 127.0.0.1 for local-only
PORT=3888

# Security (Required for remote access)
SHIM_API_KEY=your-secure-random-string

# Debug Logging (Optional)
DEBUG_SHIM=0  # Set to 1 for verbose logging

# Cache Settings (Optional)
CACHE_SPACES_TTL=300      # Spaces cache TTL in seconds (default: 5 minutes)
CACHE_SEARCH_TTL=120      # Search cache TTL in seconds (default: 2 minutes)
CACHE_MAX_ENTRIES=100     # Maximum cache entries (default: 100)

# Retry Settings (Optional)
RETRY_MAX_ATTEMPTS=3       # Maximum retry attempts (default: 3)
RETRY_MIN_TIMEOUT=1000     # Minimum retry timeout in ms (default: 1s)
RETRY_MAX_TIMEOUT=30000    # Maximum retry timeout in ms (default: 30s)

重要提示:

  • 为垫片创建一个专用的Docmost用户(不要使用您的个人帐户)
  • 使用 HOST=0.0.0.0 Docker部署允许外部连接
  • 为生成强随机字符串 SHIM_API_KEY 生产中

▶️ 跑

npm start

然后验证:

curl http://127.0.0.1:3888/health
# → {"ok":true}

🧠 运作原理

所有Docmost端点都使用 发布 请求背后 /api/*.
垫片反映了这种行为,并自动管理会话Cookie。

Shim端点 上游Docmost API 方法 说明
/spaces /api/spaces POST 列出可用工作区/空间
/search /api/search POST 按查询搜索页面
/pages /api/pages/create POST 创建新页面
/pages /api/pages/update POST 更新现有页面

身份验证是通过 authToken cookie发布者 /api/auth/login.
填充程序会自动登录,并在会话过期时刷新会话。

分页(Docmost v0.25.0+)

从Docmost v0.25.0开始,分页API使用基于光标的分页,而不是偏移量/页码。分页垫片端点返回:

{
  "items": [],
  "meta": {
    "limit": 20,
    "hasNextPage": true,
    "hasPrevPage": false,
    "nextCursor": "opaque-cursor-token",
    "prevCursor": null
  }
}

请求参数:

  • limit --每页项目数(1-100,默认值20)
  • cursor --正向分页标记(nextCursor 根据之前的回复)
  • beforeCursor --反向分页标记(prevCursor 根据之前的回复)

/spaces 和 /all-pages 仍然返回完整数组以保持兼容性,但在需要时在内部遍历游标页面。

🔒 安全

  • 不要 将此服务器暴露到公共互联网。
    将其绑定到localhost或反向代理后面。
  • 用一 专用Docmost帐户 为了实现自动化。
  • 保护 .env 档案;它包含登录凭据。
  • 启用 SHIM_API_KEY 如果你希望外部工具连接。

🧪 测试端点

# Health check
curl http://127.0.0.1:3888/health

# Detailed health check (includes Docmost connectivity)
curl http://127.0.0.1:3888/health/detailed | jq .

# List spaces
curl -H "X-SHIM-KEY: change-this-long-random-string"      http://127.0.0.1:3888/spaces | jq .

# Search for pages (cursor pagination)
curl -X POST -H "Content-Type: application/json"      -H "X-SHIM-KEY: change-this-long-random-string"      -d '{"query": "Docmost", "limit": 20}'      http://127.0.0.1:3888/search | jq .

# Search next page (use nextCursor from previous response)
curl -X POST -H "Content-Type: application/json"      -H "X-SHIM-KEY: change-this-long-random-string"      -d '{"query": "Docmost", "limit": 20, "cursor": "YOUR_NEXT_CURSOR"}'      http://127.0.0.1:3888/search | jq .

# Get pages in a space
curl -H "X-SHIM-KEY: change-this-long-random-string"      http://127.0.0.1:3888/spaces/YOUR_SPACE_ID/pages | jq .

# Get specific page metadata
curl -H "X-SHIM-KEY: change-this-long-random-string"      http://127.0.0.1:3888/pages/YOUR_PAGE_ID | jq .

# Create new page
curl -X POST -H "Content-Type: application/json"      -H "X-SHIM-KEY: change-this-long-random-string"      -d '{"spaceId": "YOUR_SPACE_ID", "title": "MCP Test Page", "content": "Hello world"}'      http://127.0.0.1:3888/pages | jq .

# Update page
curl -X PUT -H "Content-Type: application/json"      -H "X-SHIM-KEY: change-this-long-random-string"      -d '{"pageId": "YOUR_PAGE_ID", "title": "MCP Test Page (Updated)"}'      http://127.0.0.1:3888/pages | jq .

# Debug current session / cookies / cache stats
curl http://127.0.0.1:3888/debug/session | jq .

🧑‍💻 发展

npm run build     # compile TypeScript and bundle MCP server with dependencies
npm run lint      # run ESLint on TypeScript and JavaScript files
npm run format    # format with Prettier
npm run dev       # development mode with auto-rebuild
npm run dev:watch # watch mode for development
DEBUG_SHIM=1 npm start  # enable verbose logging

注: MCP服务器和Express服务器都是用TypeScript编写的。构建过程编译TypeScript,并将MCP服务器与所有依赖项捆绑在一起,以实现npx兼容性。预提交钩子会自动构建并将编译后的文件包含在提交中。

MCP服务器捆绑

MCP服务器使用 esb构建捆绑 以确保与 npx 从GitHub包执行:

  • 问题: npx 从GitHub下载时不安装依赖项,导致模块解析错误
  • 解决方案:将MCP SDK和所有依赖项捆绑到一个JavaScript文件中
  • 结果:捆绑版本(docmostServer.bundle.js)与无缝协作 npx 无需单独安装依赖项

构建过程:

  1. TypeScript编译(tsc)-将源代码编译为JavaScript
  2. esb构建捆绑(scripts/bundle-mcp.js)-捆绑MCP SDK和依赖项
  3. 最终输出: dist/mcp/docmostServer.bundle.js -包含所有内容的单个文件

这确保了用户可以通过以下方式运行MCP服务器 npx 没有任何依赖性问题。

发布新版本

自动版本缓冲

每次提交时,项目都会自动更新补丁版本:

  • 每一个承诺 自动调整补丁版本(0.2.9→0.2.10)
  • 适用于任何git工具 -IDE侧边栏、命令行等。
  • 创建标签 准备发布时:
    npm run tag  # Creates git tag from current version
    git push --tags  # Push tags to remote
    

手册版本管理

对于主要/次要版本更改:

  1. 手动更新版本 在 package.json (例如,0.2.7→ 0.3.0)
  2. 提交并标记:
    git commit -am "commit message"
    git tag <version>
    git push && git push --tags
    

MCP用户更新

新版本发布后,MCP用户可以将其Cursor配置更新为最新版本标签:

{
  "mcpServers": {
    "docmost": {
      "command": "npx",
      "args": ["-y", "--package=github:dJPoida/docmost-oss-mcp-shim#v0.2.27", "docmost-mcp"]
    }
  }
}

项目结构

src/
  server/            # Express shim server (runs on remote machine)
    server.ts        # Main server entry point
    routes.ts        # defines REST endpoints
    docmostClient.ts # handles login, cookies, API calls
    logger.ts        # lightweight debug logger
    cache.ts         # LRU cache implementation
    types.ts         # shared TypeScript interfaces
  mcp/               # MCP server TypeScript source
    docmostServer.ts # MCP server implementation

scripts/
  bundle-mcp.js      # esbuild bundling script for MCP server

dist/
  server/            # Compiled Express server
  mcp/               # Compiled MCP server files
    docmostServer.js           # Original compiled MCP server
    docmostServer.bundle.js    # Bundled MCP server with dependencies (used by npx)

双服务器架构:

  • Express Shim服务器 (src/server/)-在远程机器上运行,连接到Docmost OSS
  • MCP服务器 (src/mcp/)-在开发人员的计算机上运行,连接到Express垫片

🐳 Docker部署

使用Docker Compose(推荐)

  1. 创建 .env 文件 使用您的Docmost证书:

    DOCMOST_BASE_URL=http://your-docmost-server:3000
    DOCMOST_EMAIL=your-mcp-user@example.com
    DOCMOST_PASSWORD=your-secure-password
    SHIM_API_KEY=change-this-long-random-string
    DEBUG_SHIM=0
    
  2. 启动服务:

    docker-compose up -d
    
  3. 检查日志:

    docker-compose logs -f
    
  4. 停止服务:

    docker-compose down
    

使用Docker CLI

# Build the image
docker build -t docmost-oss-mcp-shim .

# Run the container
docker run -d \
  --name docmost-mcp-shim \
  --restart unless-stopped \
  -p 3888:3888 \
  -e DOCMOST_BASE_URL=http://your-docmost-server:3000 \
  -e DOCMOST_EMAIL=your-mcp-user@example.com \
  -e DOCMOST_PASSWORD=your-secure-password \
  -e SHIM_API_KEY=change-this-long-random-string \
  docmost-oss-mcp-shim

Raspberry Pi部署

Docker镜像是多拱形的,适用于Raspberry Pi(ARM):

# On your Raspberry Pi
git clone https://github.com/dJPoida/docmost-oss-mcp-shim.git
cd docmost-oss-mcp-shim

# Create .env file with your settings
cat > .env << EOF
DOCMOST_BASE_URL=http://your-docmost-server:3000
DOCMOST_EMAIL=your-mcp-user@example.com
DOCMOST_PASSWORD=your-secure-password
SHIM_API_KEY=$(openssl rand -hex 32)
DEBUG_SHIM=0
EOF

# Start the service
docker-compose up -d

# Check status
docker-compose ps
docker-compose logs -f

性能说明:

  • 默认资源限制(0.5 CPU,256MB RAM)在Raspberry Pi 3B+及更高版本上运行良好
  • 调整限制 docker-compose.yml 如果旧硬件需要

🔍 故障排除

MCP连接问题

问题: 光标显示“未找到服务器信息”

解决:

  1. 验证填充服务器是否正在运行: curl http://YOUR_SERVER_IP:3888/health
  2. 检查 MCP_DOCMOST_SHIM_URL 在 ~/.cursor/mcp.json 是正确的
  3. 确保 MCP_SHIM_KEY 匹配 SHIM_API_KEY 在你的 .env 文件
  4. 配置更改后重新启动Cursor

问题: “连接被拒绝”

解决:

  1. 确保Docker容器正在运行: docker-compose ps
  2. 检查端口3888是否可访问: telnet YOUR_SERVER_IP 3888
  3. 验证防火墙规则是否允许连接到端口3888
  4. 对于Docker:确保 HOST=0.0.0.0 在 .env 文件

身份验证问题

问题: “凭据无效”或“登录失败”

解决:

  1. 验证中的凭据 .env 文件正确
  2. 在Docmost web UI中手动测试登录
  3. 检查Docker日志: docker-compose logs -f
  4. 启用调试日志记录: DEBUG_SHIM=1 在 .env

Docker问题

问题: 集装箱立即出口

解决:

  1. 检查日志: docker-compose logs
  2. 验证 .env 文件存在并且格式正确
  3. 确保Docmost服务器可以从Docker容器访问
  4. 尝试新建: docker-compose down && docker-compose up --build

问题: 在构建过程中“npm ci失败”

解决方案: 这在v0.2.27+中已修复。更新到最新版本。

MCP服务器加载问题

问题: 使用npx时找不到模块“@modelcontextprotocol/sdk”

解决方案: 在v0.5.3+版本中,通过捆绑依赖项修复了此问题。MCP服务器现在将所有必需的依赖关系打包到一个文件中,消除了npx依赖关系解决问题。

问题: MCP服务器因模块解析错误而无法启动

解决方案: 确保您使用的是包含捆绑MCP服务器的最新版本(v0.5.3+)。捆绑过程会自动包含所有依赖项,使服务器与GitHub包中的npx执行兼容。


🩵 许可证

MIT——可自由重用于自托管设置。
与官方Docmost项目无关。


🆕 新功能(v0.3.0+)

增强可靠性

  • 自动重试逻辑:网络请求以指数回退(1s)自动重试→ 2s → 4s)
  • 全面健康检查: /health/detailed 端点验证Docmost连接和身份验证
  • TypeScript迁移:具有共享接口的Express服务器的完全类型安全

性能改进

  • LRU缓存:使用可配置的TTL缓存空格和搜索结果
  • 光标分页支持:搜索、历史记录、评论和空间页面列表支持Docmost光标分页(items + meta)
  • 缓存失效:缓存在内容更改时自动失效

增强的MCP功能

  • MCP资源:浏览文档层次结构(docmost://spaces, docmost://space/{id}, docmost://page/{id})
  • MCP提示:常见任务的指导性帮助(创建页面、搜索文档、更新页面标题)
  • 扩展刀具参数:搜索/历史/评论工具支持 limit, cursor,以及 beforeCursor

配置选项

# Cache settings
CACHE_SPACES_TTL=300      # 5 minutes
CACHE_SEARCH_TTL=120      # 2 minutes
CACHE_MAX_ENTRIES=100

# Retry settings
RETRY_MAX_ATTEMPTS=3
RETRY_MIN_TIMEOUT=1000
RETRY_MAX_TIMEOUT=30000

🔁 架构概述

flowchart LR
  subgraph A[AI Agent / Cursor MCP]
    X1["docmost_search()"]
    X2["docmost_createPage()"]
    X3["MCP Resources"]
    X4["MCP Prompts"]
  end

  subgraph B[MCP Server TypeScript]
    M1["docmost_search"]
    M2["docmost_createPage"]
    M3["docmost_listSpaces"]
    M4["Resources & Prompts"]
  end

  subgraph C[Express Shim Server]
    S1["/search (POST)"]
    S2["/pages (POST/PUT)"]
    S3["/spaces (GET)"]
    S4["/spaces/:id/pages (GET)"]
    S5["/pages/:id (GET)"]
    S6["/health/detailed (GET)"]
  end

  subgraph D[Docmost OSS Server]
    D1["/api/search"]
    D2["/api/pages/create"]
    D3["/api/spaces"]
  end

  subgraph E[Cache Layer]
    E1["LRU Cache"]
    E2["Retry Logic"]
  end

  A -->|MCP Protocol| B
  B -->|HTTP + X-SHIM-KEY| C
  C -->|Cached/Retry| E
  E -->|authToken cookie| D