前言
上一篇文章我们手写了一个 MCP Server,但很多朋友问:MCP 协议到底是怎么工作的?Claude Code 是怎么发现 Server 上的工具、调用它们、拿到结果的?
今天这篇文章彻底拆解 MCP 协议的通信机制,让你对"工具调用"的每一环节都心里有数。
MCP 不是一个"API",是一个"协议"
MCP(Model Context Protocol)是 Anthropic 开源的一个应用层协议,用于 AI 应用(Host)与外部工具 / 数据源(Server)之间的标准化通信。
没有 MCP 的时候,每个 AI 工具各自定义接口,接入新工具就要写适配器。有了 MCP,Server 暴露统一接口,任何 MCP Host 都能直接调用。
MCP 的核心设计思想是**"先发现,后调用"**------Server 主动告诉 Host 自己提供了什么,而不是 Host 硬编码工具列表。
通信模型:JSON-RPC 2.0
MCP 底层使用 JSON-RPC 2.0 作为消息格式。每次通信由三部分组成:
请求格式:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
jsonrpc:固定为"2.0"id:请求唯一标识,响应带回同样的 idmethod:调用的方法名params:方法参数
响应格式:
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [...]
}
}
生命周期中的每个操作------初始化、发现工具、调用工具------都对应一组 JSON-RPC 消息。
第一步:初始化握手
Claude Code 启动并连接 MCP Server 时,第一件事是握手。
Client 发送 initialize 请求,包含协议版本和自身能力声明。Server 回复自己的版本和能力,确认兼容性。
握手阶段双方确认协议版本是否匹配。如果版本不兼容,连接会被拒绝。握手完成后,Client 发送 notifications/initialized 通知进入就绪状态。
第二步:工具发现
初始化完成后,Claude Code 调用 tools/list 获取所有可用工具。
每个工具必须包含三个字段:
- name:工具名,Claude Code 根据此名称发起调用
- description:工具描述,Claude 模型用它判断何时调用此工具
- inputSchema:参数 schema,JSON Schema 格式
这个阶段很关键,模型的判断力高度依赖 description 的质量。描述写得太模糊,模型可能在不该调时调用;写得太具体,又可能错过适用场景。
第三步:工具调用
当 Claude 模型判断需要调用某个工具时,Claude Code 发送 tools/call 请求,带上工具名和参数。
Server 收到后执行实际逻辑(读文件、查数据库、调 API),然后把结果返回。
可返回的内容类型包括:
text:纯文本结果image:base64 编码的图像resource:URI 引用资源
错误处理也很讲究。如果工具执行失败,不是抛异常,而是把 isError 设为 true 并附上错误信息。Claude Code 读到 isError: true 后会告诉模型"调用失败了",模型可以决定重试或换一种方式。
传输层:stdio 模式 vs SSE 模式
MCP 支持两种传输方式。
stdio 模式是 Claude Code 的默认模式。Claude Code 把 MCP Server 作为子进程启动,通过 stdin/stdout 传输 JSON-RPC 消息。
优点:零网络配置、子进程隔离、启动快。适合本地工具。
配置示例:
json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
}
}
}
SSE 模式适合远程 Server,通过 HTTP SSE 传输消息。
优点:可远程部署、可做负载均衡和鉴权、适合生产环境。缺点:需要网络配置、有网络延迟。
实战:调试 MCP 通信
想知道 Claude Code 到底在和 MCP Server 说什么?最简单的方法是在 Server 代码里加日志,输出每一条收到的 JSON-RPC 消息和发出的响应。
也可以用 MCP Inspector 官方调试工具:
bash
npx @modelcontextprotocol/inspector node server.js
它会启动一个 Web UI,实时展示所有 JSON-RPC 消息的收发过程,对排查问题非常有帮助。
总结
MCP 协议的设计思路可以概括为四点:
- 标准化:统一接口,任何 MCP Host 都能接任何 MCP Server
- 发现式:Server 主动宣告能力,Host 按需调用
- 松耦合:JSON-RPC 协议,不绑定编程语言或传输层
- 可扩展:Tool、Resource、Prompt 三层能力,满足不同场景
整个交互流程:握手 → 发现 → 调用 → 返回 →(可选)重试
留个思考题:当你用同样的 MCP Server 对接 Claude Code 和其他 MCP Host(比如 Continue.dev)时,哪些步骤会变?欢迎在评论区讨论你的发现。
下篇预告:MCP 鉴权与安全------你的 Server 暴露在外面安全吗?关注我,不错过后续内容。