mcpField
M
md-log-mcp

md-log-mcp

本地服务
github.com/md-log生产力33 周前更新

关于 md-log-mcp

md-log-mcp 将编码 Agent 接入托管服务 md-log,以不可变版本保存 Markdown 报告供人工审阅。它支持 stdio 和远程 HTTP,并提供文档与文件夹管理、搜索及图片上传工具。

主要功能

  1. 01按路径保存和读取 Markdown 报告
  2. 02保留不可变版本历史并恢复旧版本
  3. 03通过并发检查编辑和追加内容
  4. 04上传图片并嵌入资源引用
  5. 05搜索报告并管理文件夹
  6. 06通过 stdio 或远程 HTTP 连接

适用场景

  1. 01归档 Agent 工作报告以供人工审阅
  2. 02在网页、手机或平板上批注报告
  3. 03追踪报告变更并恢复早期版本
  4. 04将截图与 Markdown 分析一同保存

MCP 相关

该 MCP 服务提供 17 个工具,用于操作 md-log 文档、资源和文件夹。客户端可通过托管的 Streamable HTTP 端点连接,或在本地通过 stdio 运行连接器;请求使用 Personal Access Token。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"com-md-log-md-log": {
"command": "npx",
"args": [
"-y",
"md-log-mcp"
],
"env": {
"MDLOG_API_BASE_URL": "<MDLOG_API_BASE_URL>",
"MDLOG_PAT": "<MDLOG_PAT>"
}
}
}
}
启动命令npx -y md-log-mcp
需要配置的环境变量
MDLOG_API_BASE_URLmd-log backend API base URL (must include /api/v1)
MDLOG_PAT密钥md-log Personal Access Token (mdlog_pat_...)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmmd-log-mcp1.3.0

工具

17

收录的工具列表 · 更新于 2 周前

参数类型必填说明
pathstring是指向 .md 文件的 POSIX 路径,例如 'reports/2026/error-report.md'。文件夹会自动创建。
assetsarray否保存前要上传的嵌入图片。每张图片都会上传,随后将 `content` 中的 `placeholder` 替换为生成的 asset:// 引用。
contentstring是文件的完整 Markdown 内容。
commit_messagestring否简要概述此版本改了什么以及原因,写成 1-2 行,供查看版本历史的人类审阅者快速浏览(内容会存储在版本中,并显示在 Web 和移动端的版本旁)。务必提供——请自行总结更改(例如 'Reworked the retention job to batch-delete expired blobs; fixes slow GC')。对于全新文件,请简要说明文档内容。

详细介绍

md-log-mcp

npm version MCP Registry License: MIT Node

审阅报告,而非差异。 MCP 服务可让你的 AI 编码 Agent — Claude Code、Claude Desktop、Codex、Cursor — 将工作和分析保存为不可变、有版本记录的 Markdown 报告,并写入 md-log。md-log 是面向 “氛围编程” 的人工参与审阅与归档层。随后,你可以在网页、手机和平板上阅读这些报告,并用触控笔添加批注(S-Pen / Apple Pencil)——每次保存都会生成一个新的不可变版本。

这是一个 Model Context Protocol 服务 — 两种传输方式,一套工具 — 可让 Claude Code(以及其他 Agent)将 .md 文件 — 包括文本 和 嵌入式截图 — 直接保存到 md-log,这个面向氛围编程的人工参与审阅与归档层。推荐使用托管远程端点(https://mcp.md-log.com/mcp,只需 URL + 密钥,无需安装);也可以选择本地 stdio(npx -y md-log-mcp)传输方式。Agent 按路径写入报告(my-project/2026-07-07-error-report.md);缺少的文件夹会自动创建,图片会上传,其引用会改写为 asset:// 链接,每次保存都会生成一个新的不可变版本。之后,你可以在手机、平板和网页上阅读、编辑报告,并使用触控笔添加批注(支持时可使用 S-Pen / Apple Pencil)。

md-log 是一项托管在 https://app.md-log.com 的服务——你无需自行运行任何服务。此软件包只是连接器:一个轻量级的身份验证 HTTP 客户端,用于验证 POSIX 路径、协调资源上传、将错误映射为稳定的 Agent 代码,并将所有内容转发给托管的 md-log 服务——该服务是身份验证、存储、版本管理和配额的唯一管理方。你只需要从 Web 应用获取一个 Personal Access Token。

技术栈

  • @modelcontextprotocol/sdk(TypeScript)——一个 McpServer(17 个工具),两种传输方式。
  • stdio 传输(md-log-mcp)——通过 stdin/stdout 传输 JSON-RPC;默认的本地模式(因此 stdout 专用于协议,日志写入 stderr)。PAT 从环境变量读取。
  • Streamable HTTP 传输(md-log-mcp-http)——远程模式:Agent 通过 URL 连接,无需本地安装;每个请求都会从 Authorization 标头中读取 PAT。请参阅远程(Streamable HTTP)模式。
  • TypeScript,使用 tsup 打包为 ESM dist/server.js(stdio)和 dist/http.js(HTTP)。运行时依赖:MCP SDK 和 zod(输入架构)。网络层仅使用 Node 内置的 fetch/http——不使用 Web 框架。
  • PAT 身份验证——将 md-log Personal Access Token 作为 Authorization: Bearer 发送给后端。

要求

  • Node 22+
  • 一个在 md-log Web 应用中创建的 Personal Access Token(PAT)(Settings → Tokens;令牌仅显示一次)

仅此而已——md-log 服务托管在 https://app.md-log.com;无需安装或自托管。

工具(17 个)

每个工具都会返回双重输出——供人阅读的 content[].text 和机器可读的 structuredContent——并会在任何后端调用之前验证 POSIX 路径(NFC 规范化;拒绝 ../.、控制字符、空/空白路径段、反斜杠和保留名称;限制名称最长 255 字节、路径最长 1024 字节;文件必须使用 .md 扩展名)。所有请求都会发送到 MDLOG_API_BASE_URL 中的基础 URL(其中已包含 /api/v1)。

工具功能
save_markdown ⭐核心工具。按路径创建或覆盖 .md 文件(强制采用最后写入者胜出);缺失的文件夹会自动创建。可选择先上传嵌入的图片(每张图片通过 data_base64 或本地 file_path 提供),并将内容中的每个 placeholder 替换为 asset://<key> 链接。接受 commit_message——建议填写 1-2 行变更摘要,显示在版本历史中。
upload_asset上传一张图片(预留 → 预签名 PUT → 完成),并返回可嵌入为 ![alt](asset://<key>) 的 asset://<key> 引用。图片通过 data_base64(内联 base64)或 file_path(由服务端读取的本地文件) 二选一提供,且必须且只能提供一项;使用 file_path 时,filename 默认为文件名,content_type 根据扩展名推断(png/jpg/jpeg/gif/webp/avif)。
append_to_markdown使用乐观并发控制向现有文件追加内容(GET 当前内容 → 拼接 → 携带 base_version_no 条件 PUT)。发生冲突时自动重试一次,之后返回 CONFLICT。接受 commit_message——建议填写 1-2 行变更摘要,显示在版本历史中。
edit_markdown通过精确字面替换修改文件的部分内容(读取 → 应用修改 → 携带 base_version_no 条件 PUT;发生冲突时自动重试一次,并重新应用每项修改)。一次可传入多项修改:edits: [{old_string, new_string, replace_all?}, …](最多 50 项,按顺序应用)——它们会作为 一次写入 = 一个版本 = 一条通知 完成;修改单项时仍可使用 old_string/new_string 简写(不可同时使用)。每个 old_string 必须恰好匹配一次,重叠位置也计入匹配("\n\n" 出现在 "\n\n\n" 中时存在歧义 → detail.overlapping: true)——0 次匹配或存在歧义的 >1 次匹配都会以 VALIDATION 拒绝整个调用(detail.reason = NO_MATCH / AMBIGUOUS_MATCH,detail.edit_index = 失败的修改项),且不会写入任何内容;如需有意修改所有匹配项,请设置 replace_all:true。其他 detail.reason 包括:输入格式 — MIXED_INPUT、MISSING_EDIT、EMPTY_EDITS、TOO_MANY_EDITS、EMPTY_OLD_STRING、IDENTICAL_STRINGS(读取前拒绝);结果 — NO_CHANGE(修改相互抵消)、DOCUMENT_TOO_LARGE(某一步会超过 25 MiB 上限)、TOO_MANY_REPLACEMENTS(一次调用中替换的匹配项超过文档上限)、BATCH_TOO_SLOW(调用运行 2 s 后停止执行第一项之后的修改——请拆分为多次调用)。冲突重试时发生的匹配失败会带有 detail.after_concurrent_write: true。不会创建文件(路径不存在时返回 NOT_FOUND),且没有强制模式——进行任何部分修改时,请优先使用此工具,而不是 update_markdown。
update_markdown替换文件的全部内容。传入 expected_version 进行乐观并发控制(不匹配时返回 CONFLICT);省略该参数则强制采用最后写入者胜出。现在,对不存在的路径传入 expected_version 会返回 CONFLICT(detail.server_version_no = 0),而不会静默创建文件。进行部分修改时请改用 edit_markdown。接受 commit_message——建议填写 1-2 行变更摘要,显示在版本历史中。
restore_version将文件回滚到较早的 version_no(来自 list_versions):该版本的内容会成为一个新的当前版本——历史记录不可变,因此回滚操作本身也可以撤销。恢复到文件当前所在版本会被接受为无操作。接受 commit_message。
get_markdown按路径读取文件内容(直接返回内联内容,或为大型文档返回预签名内容 URL)。传入 version(来自 list_versions 的 version_no)可读取旧的不可变版本。
list_versions列出文件不可变的版本历史,按从新到旧排序(version_no、commit_message、作者、registered_at、大小)。
delete_markdown软删除文件。必须设置 confirm:true(否则返回 VALIDATION);会先将路径解析为文档键。
create_folder相当于 mkdir -p——创建所有缺失的路径段;已存在的文件夹也视为成功。
list_folders返回完整的文件夹树。
list_files列出文件夹路径下的文档和直接子文件夹。
search_markdown按标题(子串)和正文全文搜索(当前版本;整词匹配,按相关度排序,正文匹配会附带片段)。
move_markdown按路径移动和/或重命名 .md 文件(from_path → to_path);目标文件夹会自动创建;文档保留其键,因此版本历史和审阅者批注都会保留。
move_folder将文件夹(整个子树)移至新的父文件夹下(new_parent_path 为空/省略时移至根目录);父文件夹会自动创建;服务端会拒绝循环移动。
rename_folder就地重命名文件夹(由服务端重写所有后代路径)。
delete_folder删除文件夹。必须设置 confirm:true;默认仅删除空文件夹——传入 cascade:true 可软删除整个子树(rm -r)。
向 Agent 显示的错误代码

后端故障会返回 { isError: true, content:[{type:"text", ...}] },并在 structuredContent.error.code 中提供映射后的代码:

NOT_FOUND · CONFLICT(在 detail 中包含服务端头信息 {server_version_no, server_checksum, …})· UNAUTHORIZED · RATE_LIMITED · QUOTA_EXCEEDED · BACKEND_UNAVAILABLE · VALIDATION · FOLDER_EXISTS(create_folder 会将其作为成功吞掉)· ERROR。

身份验证

MCP/PC 通道使用个人访问令牌(mdlog_pat_…)进行身份验证。该令牌在 Web 应用的设置中生成一次,并通过环境变量提供。客户端会在每个请求中附加 Authorization: Bearer <PAT>(以及兼容性所需的 X-API-Token)。后端是身份验证和配额的唯一真实来源。

变量必需示例说明
MDLOG_API_BASE_URL是https://app.md-log.com/api/v1托管服务的基础 URL,包括 /api/v1。不会追加版本后缀;末尾的斜杠会被移除。
MDLOG_PAT是mdlog_pat_xxxxxxxxxxxxxxxxxxxxxxxxBearer PAT。请安全存储(OS 钥匙串)——切勿提交。
MDLOG_MAX_DOCUMENT_BYTES否26214400(25 MiB)客户端预检后端的单文档正文大小上限,单位为 UTF-8 字节(韩文每个字符占 3 字节)。超出上限的保存操作会立即失败,并返回指出实际大小的 VALIDATION 错误,而不是含糊的后端 400。两种传输方式均适用。仅在使用具有不同上限的可自托管后端时更改。

如果缺少任一变量,或基础 URL 格式错误,服务端会在启动时立即失败并显示清晰的提示信息。

构建

npm install
npm run build      # tsup → dist/server.js (ESM, Node 22)
npm run typecheck  # tsc --noEmit (optional)

冒烟测试

scripts/smoke.mjs 会通过标准输入输出启动构建后的服务端(MCP SDK Client + StdioClientTransport),然后依次运行 initialize → tools/list → save_markdown(嵌入了一个微型 data: PNG 的简短报告)→ get_markdown(读回内容并检查标记)→ search_markdown——逐步输出 PASS/FAIL,任何步骤失败都会以非零状态码退出。使用真实 PAT 对在线后端运行:

npm run build
MDLOG_API_BASE_URL="http://localhost:8080/api/v1" \
MDLOG_PAT="mdlog_pat_xxxx" \
node scripts/smoke.mjs        # or: npm run smoke

连接客户端

在 Web 应用的设置 → Tokens中生成 PAT,安全存储后,将 md-log 添加到 MCP 客户端。切勿提交 PAT。

📄 连接指南(HTML) — md-log.com/guides/customer-guide.html:使用 Web 应用中生成的 MCP 密钥(PAT) 通过 URL 连接(推荐),或通过 npx 本地连接(Claude Code · Desktop · Codex · Cursor)。

推荐 — 远程(URL),无需安装

将客户端指向托管端点,并将 PAT 作为 Bearer 标头传入。无需安装任何内容——不需要 Node.js,也不需要 npx。(连接托管服务甚至不需要此软件包。)

# Claude Code
claude mcp add --transport http md-log https://mcp.md-log.com/mcp \
  --header "Authorization: Bearer mdlog_pat_xxxxxxxxxxxxxxxxxxxxxxxx"
// Cursor / Claude Desktop / any client that takes JSON — the `type` field MUST be "http"
{
  "mcpServers": {
    "md-log": {
      "type": "http",
      "url": "https://mcp.md-log.com/mcp",
      "headers": { "Authorization": "Bearer mdlog_pat_xxxxxxxxxxxxxxxxxxxxxxxx" }
    }
  }
}

通过远程端点连接时,请以内嵌方式(base64)嵌入图像;通过路径(file_path)上传本地图像仅适用于下文的本地方式。

备选方案 — 本地(通过 npx 使用标准输入输出)

此方式会将此连接器作为本地子进程运行(需要 Node 22+;npx 会获取已发布的软件包,无需构建)。如果你更倾向于使用本地进程、需要上传本地文件(file_path)图像,或在没有托管 MCP 端点的情况下自托管 md-log,请使用此方式。

{
  "mcpServers": {
    "md-log": {
      "command": "npx",
      "args": ["-y", "md-log-mcp"],
      "env": {
        "MDLOG_API_BASE_URL": "https://app.md-log.com/api/v1",
        "MDLOG_PAT": "mdlog_pat_xxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

生成并保护 PAT。 在 Web 设置 → Tokens中创建令牌(仅显示一次),并确保不将其纳入版本控制——建议使用 OS 钥匙串。在 macOS 上,例如:

security add-generic-password -a "$USER" -s md-log-pat -w "mdlog_pat_xxxx"
export MDLOG_PAT="$(security find-generic-password -a "$USER" -s md-log-pat -w)"

如果 PAT 泄露,请在 Web 应用中撤销该令牌并生成新令牌。

远程(Streamable HTTP)模式

第二个可执行文件 md-log-mcp-http 通过 MCP 的 Streamable HTTP 传输提供相同的 17 个工具——使用单个 POST /mcp 端点——因此 Agent 可通过URL 连接,无需本地安装。如果你想集中托管连接器(在 TLS 反向代理后运行容器或小型 VM),而不是让每位用户都运行 npx,请使用此模式。

与 stdio 模式的区别:

  • 每个请求使用独立 PAT。 不会从环境变量读取令牌;每个请求都携带自己的 Authorization: Bearer <mdlog_pat_…> 标头,因此一个端点可供多位用户使用——每位用户使用自己的 md-log 令牌。(此模式下会忽略 MDLOG_PAT。)
  • 无状态。 每个请求都会创建新的客户端和服务;没有会话存储(适合副本部署和自动扩缩)。
  • 不访问本地文件。 file_path 图像来源会被拒绝(否则将读取服务端的磁盘);请以内联 data_base64 方式发送图像。其他方面完全相同。
运行
npm run build
MDLOG_API_BASE_URL="https://app.md-log.com/api/v1" \
node dist/http.js            # or: npm run start:http
# → md-log-mcp-http ready — POST http://127.0.0.1:8787/mcp
配置(环境变量)
变量必需默认值说明
MDLOG_API_BASE_URL是—托管的 md-log 基础 URL,包括 /api/v1。
MDLOG_HTTP_HOST否127.0.0.1绑定接口。默认仅限本地主机;只有在 TLS 反向代理后方才设置为 0.0.0.0。
MDLOG_HTTP_PORT否8787TCP 端口。
MDLOG_HTTP_PATH否/mcpMCP 端点路径。
MDLOG_HTTP_ALLOWED_ORIGINS否(无)以逗号分隔的浏览器 Origin 允许列表(防御 DNS 重绑定)。请求若携带不在列表中的 Origin,将返回 403;非浏览器客户端(不带 Origin)始终允许访问。
MDLOG_HTTP_ALLOWED_HOSTS否(无)可选的、以逗号分隔的 Host 允许列表(额外防御 DNS 重绑定)。
MDLOG_HTTP_MAX_BODY_BYTES否33554432 (32 MiB)请求正文最大字节数(base64 图像会膨胀约 33%)。

安全措施(符合 MCP 规范):默认绑定到 127.0.0.1,每个 MCP 请求都要求携带 Bearer 令牌,通过允许列表验证 Origin 以防御 DNS 重绑定,并限制正文大小。GET /health 存活探测(无需身份验证)会返回 {"status":"ok"}。对 MCP 端点执行 GET/DELETE 会返回 405(无状态:没有独立的 SSE 流,也没有可终止的会话)。

通过 URL 连接 Agent
{
  "mcpServers": {
    "md-log": {
      "type": "http",
      "url": "https://your-host.example/mcp",
      "headers": { "Authorization": "Bearer mdlog_pat_xxxxxxxxxxxxxxxxxxxxxxxx" }
    }
  }
}

客户端配置格式因工具而异(Claude Code / Cursor / 等)——必需项是端点URL和 Authorization: Bearer <PAT> 标头。公开部署前务必终止 TLS;每个请求都会携带 PAT。

脚本

  • npm run build — 打包为 dist/server.js(stdio)和 dist/http.js(Streamable HTTP)(tsup、ESM、Node 22)。
  • npm run dev — 文件变更时重新构建(tsup --watch)。
  • npm run typecheck — tsc --noEmit。
  • npm run smoke — 针对在线后端运行 stdio 冒烟测试(需要环境变量和已构建的程序)。
  • npm run smoke:http — 无需后端的 HTTP 传输冒烟测试(握手 + 身份验证/来源/file_path 防护)。
  • npm start — 运行已构建的 stdio 服务(node dist/server.js)。
  • npm run start:http — 运行已构建的 HTTP 服务(node dist/http.js)。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。