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: [...])

三个值得借鉴的设计

  1. 能力协商前置:initialize 阶段双方声明能力,运行期不再猜——比 REST 世界「文档靠猜」优雅得多
  2. 结构与内容分离:tools/list 给 schema,调用方本地校验参数,坏请求根本不出网
  3. 通知与请求分离:通知不需要回复,心跳/取消走独立通道,语义干净

会话与断线

MCP 基于 JSON-RPC over stdio/SSE,会话状态在传输层。SSE 断线重连后 Last-Event-ID 续传,服务端需要保留事件缓冲——这里是我实现时踩坑最多的地方。

小结

读完协议再写 Server,很多「奇怪的限制」都会变成「合理的决策」。


原文首发于本站,欢迎 RSS 订阅;有帮助点个赞,有问题评论区见。

评论 · 2 条

还没有评论,来抢沙发吧
回复
验证码