MCP 协议源码级解析:一次工具调用背后发生了什么
视角
大多数 MCP 教程停在「怎么用」。这篇往下挖一层:协议消息流。抓包用的是我自己的 Java MCP Server(见前文)。
一次调用的完整时序
C → S: initialize (能力协商)
C ← S: capabilities (声明: tools/list, tools/call)
C → S: tools/list
C ← S: [query_users, query_orders, ...]
C → S: tools/call(query_users, {keyword: "admin"})
C ← S: result(content: [...])三个值得借鉴的设计
- 能力协商前置:initialize 阶段双方声明能力,运行期不再猜——比 REST 世界「文档靠猜」优雅得多
- 结构与内容分离:tools/list 给 schema,调用方本地校验参数,坏请求根本不出网
- 通知与请求分离:通知不需要回复,心跳/取消走独立通道,语义干净
会话与断线
MCP 基于 JSON-RPC over stdio/SSE,会话状态在传输层。SSE 断线重连后 Last-Event-ID 续传,服务端需要保留事件缓冲——这里是我实现时踩坑最多的地方。
小结
读完协议再写 Server,很多「奇怪的限制」都会变成「合理的决策」。
原文首发于本站,欢迎 RSS 订阅;有帮助点个赞,有问题评论区见。
评论 · 2 条