使用说明
RefMD MCP服务器
模型上下文协议服务器,通过托管SSE端点公开RefMD文档,因此聊天机器人可以通过RefMD的API浏览和编辑Markdown。
特性
- 与托管MCP客户端(如Claude、Cursor)兼容的流式HTTP/SSE传输
- 资源模板
refmd://document/{id}读取文档Markdown和元数据 - 通过RefMD API列出、搜索、创建和更新文档的工具
- 分块文档读取可选
offset/limit参数(每次调用最多返回120000个字符) - 通过以下方式进行部分Markdown修补
refmd-patch-document-content(插入/删除/替换,而不重新上传整个文件)
先决条件
- Node.js 18+
- 访问现有的RefMD实例
- 个人访问令牌(JWT)或可以通过登录的凭据
/api/auth/login
配置
服务器现在通过OAuth 2.1使用PKCE对用户进行身份验证。使用以下变量进行配置:
| 变量 | 描述 |
|---|---|
REFMD_API_BASE |
必修的。 RefMD API的基本URL(例如。 https://refmd.example.com). |
OAUTH_CLIENT_IDS |
允许的逗号分隔列表 client_id 价值观。留空以允许任何。 |
OAUTH_ALLOWED_REDIRECTS |
逗号分隔的允许重定向URI列表。默认为允许HTTPS URL和 http://localhost。包括ChatGPT的回调URL(https://chat.openai.com/aip/mcp/oauth/callback). |
OAUTH_ISSUER |
可选的公共颁发者URL(默认为当前请求源)。 |
ACCESS_TOKEN_TTL_SECONDS |
可选访问令牌生存期(默认 3600). |
REFRESH_TOKEN_TTL_SECONDS |
可选刷新令牌生存期(默认 2592000即30天)。 |
MCP_DB_DRIVER |
可选。设置为 sqlite, postgres,或 mysql 以持久化OAuth令牌。默认为内存存储。 |
MCP_DB_URL |
配置的驱动程序的可选连接字符串(例如。 postgres://user:pass@host/db).对于SQLite,您可以省略此项并使用 MCP_DB_SQLITE_PATH. |
MCP_DB_SQLITE_PATH |
SQLite存储的可选文件系统路径(默认为 ./data/refmd-mcp.sqlite).接受普通路径或 file:/// URL;使用SQLite时,确保路径解析为持久存储。 |
PORT / HOST |
可选侦听端口/主机(默认值: 3334 / 0.0.0.0). |
允许多个托管客户端:设置
OAUTH_CLIENT_IDS以逗号分隔的列表(例如。chatgpt-connector,Claude)并镜像同一组OAUTH_ALLOWED_REDIRECTS。将任一变量留空将使其对任何HTTPS重定向保持开放,但一旦指定了一个值,您就必须列出要允许的每个连接器。
远程MCP客户端(包括Claude Web)需要OAuth保护资源元数据文档
https://<host>/.well-known/oauth-protected-resource这样他们就可以跟随resource_metadata提示在WWW-Authenticate挑战。服务器自动提供该文档(包括镜像别名,如/mcp/.well-known/...),因此请确保您的反向代理转发这些路径。
如果在反向代理中终止TLS,请确保它转发标准
Forwarded标题或X-Forwarded-Proto/X-Forwarded-Host因此OAuth元数据通告了正确的https://起源。集OAUTH_ISSUER=https://your-domain如果你更喜欢显式覆盖。
ℹ️ 启用持久性时安装相应的数据库驱动程序:
npm install better-sqlite3对于SQLite,npm install pg对于PostgreSQL,或npm install mysql2适用于MySQL/MariaDB。
安装和构建
cd mcp-server
npm install
npm run build
跑
npm start
REFMD_API_BASE="https://refmd.example.com" \
OAUTH_CLIENT_IDS="chatgpt-connector" \
OAUTH_ALLOWED_REDIRECTS="https://chat.openai.com/aip/mcp/oauth/callback" \
npm start
服务器公开了两种传输方式:
http://<host>:<port>/sse--SSE传输(与Claude SSE等兼容)http://<host>:<port>/mcp--可流式HTTP传输(每次交换一次POST)
OAuth流程
- 使用以下配置您的客户端(例如ChatGPT自定义连接器):
- 授权URL:
https://your-domain.example.com/oauth/authorize - 令牌URL:
https://your-domain.example.com/oauth/token - 吊销URL:
https://your-domain.example.com/oauth/revoke - 范围: (留空)
- PKCE: 已启用(ChatGPT自动使用S256)
- 授权URL:
- 出现提示时,浏览器显示RefMD MCP同意页面。粘贴从生成的RefMD API令牌 个人资料→ API令牌 并批准。
- 连接器接收访问令牌并可以调用
/sse或/mcp随着Authorization: Bearer <token>.
令牌可以从RefMD(配置文件页面)或通过以下方式撤销 POST /oauth/revoke.
使用Docker运行
# Build image
docker build -t refmd-mcp .
docker run -p 3334:3334 \
-e REFMD_API_BASE="https://refmd.example.com" \
-e OAUTH_CLIENT_IDS="chatgpt-connector" \
-e OAUTH_ALLOWED_REDIRECTS="https://chat.openai.com/aip/mcp/oauth/callback" \
-e MCP_DB_DRIVER="sqlite" \
-e MCP_DB_SQLITE_PATH="/data/refmd-mcp.sqlite" \
-v refmd-mcp-data:/data \
refmd-mcp
装载一个持久卷(如上所示),以便SQLite数据库文件在容器重启后仍然存在。
连接聊天客户端
- 克劳德(CLI):
claude mcp add --transport sse refmd https://your-domain.example.com/sse - 光标/VS代码/MCP检查器: 选择SSE传输并提供相同的URL。
连接后,资源显示在 refmd://document/{id}可用工具包括 refmd-list-documents, refmd-search-documents, refmd-create-document, refmd-read-document, refmd-update-document-content以及更多。
阅读大型文档
这 refmd-read-document 工具和 refmd://document/{id} 资源都支持可选的分页参数,因此大型Markdown文件保持在模型上下文协议有效载荷限制范围内:
offset(默认值0):起始字符位置(从零开始)。limit(默认值120000,上限为120000):响应中返回的最大字符数。
示例资源URI: refmd://document/123e4567-e89b-12d3-a456-426614174000?offset=60000&limit=60000.
每个响应都包含范围元数据和下一个偏移量,因此客户端可以发出后续调用,直到检索到完整文档。
修补文档内容
使用 refmd-patch-document-content 插入、删除或替换特定跨距的工具,而无需发送整个Markdown正文:
{
"id": "document-uuid",
"operations": [
{ "op": "insert", "offset": 120, "text": "New paragraph." },
{ "op": "delete", "offset": 42, "length": 5 }
]
}
偏移量/长度以Unicode码位计算,以匹配RefMD的编辑器行为。服务器在发出文档更改事件之前,会自动验证范围并应用操作,因此下游集成保持同步。
发布工作流程
GitHub操作工作流 CI MCP Server 运送集装箱图像。它在按下/PR时自动运行 mcp-server 并在以下情况下向GHCR发布:
- 推送是一个标签匹配
mcp-server-v*(版本发布),或 - 工作流是通过以下方式手动触发的
publish=true.
标签发布到 ghcr.io/<owner>/refmd-mcp 包括语义版本(1.2.0, 1.2, 1),原始git标签,以及 latest.使用 extra-tag 手动调用工作流时输入其他标签。
发展
在TSX的监视模式下运行:
npm run dev
任何代码更改都需要重新生成(npm run build)在部署或运行之前 npm start.
