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 暴露在外面安全吗?关注我,不错过后续内容。

相关推荐
三声三视10 小时前
uni-app 鸿蒙端传参变成 [object Object]?顺着源码追到 ArkTS router 底层才搞明白
人工智能·ai·uni-app·aigc·ai编程·harmonyos
DisonTangor15 小时前
【微软开源】Mage-Flow 深度解读:微软4B参数图像生成与编辑模型,单卡A100仅需0.59秒
人工智能·microsoft·ai作画·开源·aigc
大模型搬砖师18 小时前
金融、制造、互联网:三个行业的 AI 网关落地实录
aigc·ai编程·gpu算力
imbackneverdie19 小时前
知网官宣:禁止 AI 列为论文署名作者,标注 Gemini、DeepSeek 等 AI 为作者的稿件统一下架
大数据·人工智能·ai·职场和发展·aigc·科研·高校
春风野草20 小时前
AI Agent 工程底座实战:模型路由、限流、错误处理和成本意识
aigc·ai编程
程序员在囧途1 天前
AIGC SaaS 多租户平台怎么做行业客户二次演示?从 https://aigc.likeadmin.cn 到开源应用中心复盘链路
开源·aigc
后端小肥肠1 天前
Doubao-Seed-Evolving实测:我做了个情绪价值拉满的星座记账 Skill
人工智能·aigc·agent
李剑一1 天前
看完DeepSeek梁文锋内部交流会发言实录,我或许明白了为什么一直坚持不融资的DeepSeek开启了融资之路,也明白了中国人做AI一定是能够成功的
aigc·agent
狂师1 天前
从 LLM 评测到 AI Agent 评测,我的一些思考!
人工智能·程序员·aigc
win4r1 天前
🚀Graph Engineering范式:Codex Multi-agent V2支持Kimi、MiniMax、GPT多模型混用+动态派生subagent,并行执行、Pi Agent工具调用,效率倍增
aigc·ai编程·vibecoding