MCP 协议拆解:Claude Code 的工具调用背后发生了什么?

前言

上一篇文章我们手写了一个 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:请求唯一标识,响应带回同样的 id
  • method:调用的方法名
  • 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 协议的设计思路可以概括为四点:

  1. 标准化:统一接口,任何 MCP Host 都能接任何 MCP Server
  2. 发现式:Server 主动宣告能力,Host 按需调用
  3. 松耦合:JSON-RPC 协议,不绑定编程语言或传输层
  4. 可扩展:Tool、Resource、Prompt 三层能力,满足不同场景

整个交互流程:握手 → 发现 → 调用 → 返回 →(可选)重试

留个思考题:当你用同样的 MCP Server 对接 Claude Code 和其他 MCP Host(比如 Continue.dev)时,哪些步骤会变?欢迎在评论区讨论你的发现。


下篇预告:MCP 鉴权与安全------你的 Server 暴露在外面安全吗?关注我,不错过后续内容。

相关推荐
kfaino2 小时前
码农的AI翻身(六)你好,我叫 Parameter
后端·aigc
用户6369790981435 小时前
AI Skill构建的十个层次:从提示词到业务闭环
aigc
怕浪猫6 小时前
第6章 多智能体协作:从单兵作战到群体智能
aigc·openai·ai编程
山间小僧7 小时前
「AI学习笔记」Harness Engineering: 从 Claude Code 源码看 Harness Engineering 最佳实践
aigc·openai·ai编程
kfaino14 小时前
码农的AI翻身(五)你好,我叫 Transformer
后端·aigc
狼爷1 天前
百年工业史启示:为什么AI落地普遍无效?读懂保罗·戴维的「天轴陷阱」
aigc
刘棕霆1 天前
22—AI Skill 测评中断后怎么续跑:active-pipeline.json 断点恢复设计
aigc·ai编程·测试
leeyi1 天前
Batch 处理:并发控制与可中断批处理
aigc·agent·ai编程
kfaino1 天前
码农的AI翻身·前传 一个大模型从出生到上岗的全过程
后端·aigc