调 MCP server 时,最麻烦的往往不是协议本身,而是你看不到真实现场。

一个工具在 Claude Code、Codex、Cursor 里没有被调用,可能是能力声明没被客户端读到,可能是模型没有选它,可能是参数 schema 不合预期,也可能是请求已经发出但 server 卡住了。你当然可以打开日志、加断点、跑 MCP Inspector,但这些手段经常只能看到“测试客户端”的行为,或者只能看到请求已经到达 server 之后的状态。

今天想记下的 kerlenton/mcpsnoop,切的是这个很具体的问题:它把自己放在真实 MCP client 和真实 MCP server 中间,作为一个透明代理复制每一帧 JSON-RPC,再用终端 TUI 展示出来。换句话说,它不是另起一个调试客户端,而是让你看见 Codex、Claude Code、Cursor 等真实客户端到底和 server 说了什么。

按 GitHub repository page、README、release page、commits page、LICENSE 和 Git history 在 2026-07-08 能看到的公开信息,kerlenton/mcpsnoop 当前有 226 stars13 forks。仓库主语言是 Go,GitHub 语言统计中 Go 约 99.5%,许可证是 MIT。仓库初始化提交是 2026-06-27 10:25:46 UTC,GitHub 搜索结果显示最近 push 是 2026-07-08 09:19:34 UTC。默认分支是 main,最新 release 是 v0.4.0,发布时间为 2026-07-08 09:11 UTC

项目概览

属性详情
仓库kerlenton/mcpsnoop
定位透明 MCP proxy、JSON-RPC trace、终端 TUI、会话导出
Stars226
Forks13
主语言Go
许可证MIT
仓库初始化提交2026-06-27 10:25:46 UTC
最近 push2026-07-08 09:19:34 UTC
最新版本v0.4.0
版本发布时间2026-07-08 09:11 UTC
核心入口mcpsnoop demomcpsnoop -- <server>mcpsnoop http --target ...mcpsnoop export

它看的是“真实路径”

mcpsnoop 的 README 把问题讲得很直接:MCP Inspector 会作为自己的 client 连接 server,所以它不一定能复现你的真实 client 行为。真实问题可能恰好发生在 client 选择工具、发送参数、处理 capability 或等待响应的那一段。

mcpsnoop 的用法更像给 server 命令套一层壳:

{
  "mcpServers": {
    "my-server": {
      "command": "mcpsnoop",
      "args": ["--", "node", "build/index.js"]
    }
  }
}

-- 后面还是原本启动 server 的命令。真实 client 照常启动这个 server,mcpsnoop 在中间转发字节,同时把 JSON-RPC 帧复制到本机日志和 TUI。对于 streamable HTTP server,它也提供 mcpsnoop http --target http://localhost:3000/mcp --listen :7000 这种反向代理模式。

这个设计的好处是边界清楚。它不要求你改 server 代码,也不要求 client 用另一个调试协议。你看到的就是同一个 client、同一个 server、同一条数据路径上的请求和响应。

比日志更适合看 MCP 会话

纯日志当然也能排查问题,但 MCP 的失败经常不是一行 error 能解释的。

  • 工具列表有没有被客户端正确看到;
  • 某个 tools/call 请求到底带了什么参数;
  • server 有没有发出 stderr
  • 哪些调用是 slowpendingerror
  • 某个 request id 对应的 response 是哪一条;
  • capability、sampling、roots 这类双向请求有没有出现。

mcpsnoop 把这些都放进 TUI 里处理。README 里列出的快捷键包括进入详情、过滤、按列排序、复制、暂停、follow、查看 capability、replay 调用和导出 session。过滤语法也偏实用,可以按 tool:method:id:dir:kind:status: 组合,比如只看 method:tools/call status:error

这比“在一堆 JSON 日志里 grep”舒服很多,尤其适合调试 agent 为什么没有按预期调用工具,或者 server 为什么偶尔挂住。

导出和远程排查是加分点

mcpsnoop 不只看 live stream。它会把 session 落到本机磁盘,TUI 可以 backfill 过去的会话,也可以把捕获结果导出成 jsonhtmltext。这对复盘很有用:你可以在 bug report 里附一个删敏后的 HTML,或者把 JSON 交给脚本进一步分析。

README 还专门写了远程工作流:live view 时用 SSH remote socket forwarding,把远端机器上的 mcpsnoop socket 转回本机;post-mortem 时可以直接通过 SSH 把远端 session JSONL 管道到 mcpsnoop open -。这个选择很克制,不另外发明一套远程传输,而是复用已有 SSH 的认证、加密和审计边界。

最新 v0.4.0 也延续了这个方向。release 页面显示,这个版本加入了常见 secret key 的 redaction preset,并支持从 stdin 直接打开 session。对调试工具来说,这些细节比多一个炫酷面板更重要。

适合谁用

如果你只是装了一个成熟 MCP server,平时也不改它,mcpsnoop 可能不是每天都需要打开的工具。

但下面几类人会很快用上:

  • 正在写 MCP server,需要确认真实 client 是否看到正确能力;
  • 在 Codex、Claude Code、Cursor 等多个 client 间测试同一个 server;
  • 排查“模型明明应该调用工具却没有调用”的问题;
  • 想看慢调用、挂起调用和错误响应的完整 JSON-RPC 上下文;
  • 需要把一次 MCP 故障导出给同事或 issue 讨论。

它的价值不在于替代 Inspector,而是补上 Inspector 不容易覆盖的那一层:真实客户端流量。

需要注意的地方

第一,项目很新。仓库初始化提交在 2026-06-27,当前 release 已到 v0.4.0,迭代速度很快,但 API 和交互仍可能继续变化。

第二,它会捕获真实 payload。MCP tool arguments、prompt 片段、工具返回、错误输出里都可能有密钥或内部数据。README 里提供了 --redact-secrets--redact-key,但也说明这是尽力而为的 JSON key scrub,不会神奇地清掉所有非 JSON 或任意字符串里的秘密。

第三,透明代理仍然是代理。调试生产环境前,要确认它的运行位置、日志保存路径、文件权限和团队的数据处理规则。尤其是导出 HTML 或 JSON 时,要把它当作日志证据处理。

第四,它主要解决“看见 MCP 流量”,不是自动解释所有 agent 行为。看到模型没有调用工具之后,下一步仍然要回到 prompt、tool description、schema、权限和 client 实现去判断原因。

小结

MCP 生态继续长大后,调试工具会变得越来越重要。不是因为协议复杂到不能理解,而是因为真实链路里有 client、模型、server、工具描述、JSON schema、权限和网络状态,任何一层都可能让工具调用消失或变形。

mcpsnoop 的思路很朴素:先把真实 JSON-RPC 现场摆出来。它是一个小 Go 二进制,可以包装 stdio server,也可以代理 HTTP server,用终端 TUI 看 live trace,再把 session 导出做复盘。对正在做 MCP server 或重度使用 AI coding client 的开发者来说,这正好补上了“我到底发了什么、收到了什么”的那块空白。