Skip to content

MCP 协议与调用原理 ​

一个 Agent 已经能查询库存,IDE 助手也想使用同一个查询能力。把查询封装成 MCP 工具后,两个应用可以各自连接同一个服务,通过统一的消息发现工具、传递参数并取得结果。

1. MCP 是什么 ​

MCP(Model Context Protocol,模型上下文协议)是 AI 应用接入外部工具和上下文的开放协议。连接中有三个角色。MCP 架构规范

角色职责例子
Host管理连接、协调模型交互、决定哪些能力可以使用IDE 助手、聊天应用、自建 Agent
MCP Client维护与一个 Server 的连接,协商协议版本和能力,发送协议消息IDE 助手内部的 MCP 客户端实例
MCP Server声明能力、处理协议请求,并返回数据或工具结果提供库存查询和商品文档的服务

一个 Host 可以管理多个 Client,分别连接库存、文档等不同的 Server。Client 通常运行在 Host 应用内部,Host 决定从各 Server 取得的哪些内容会进入模型上下文。

2. Server 可以提供什么 ​

能力提供的内容常用协议方法
Tools可执行的操作,例如查库存或计算金额tools/list、tools/call
Resources由 URI 标识、可读取的上下文,例如商品手册resources/list、resources/read
Prompts可传参的提示模板,例如生成巡检报告的模板prompts/list、prompts/get

Server 在初始化响应中声明支持的能力。以 Tools 为例,工具定义包含名称、用途说明和 JSON Schema 参数约束,Host 可以把其中适合当前任务的工具提供给模型。Tools、Resources、Prompts

3. 一次工具调用怎么走 ​

下图以调用加法工具 add 为例,按从上到下的顺序展示连接、发现、调用和返回。右侧两列之间传递的是 MCP 消息,左侧模型与 Host 之间传递的是模型请求和工具调用结果。

MCP 工具调用时序图,展示模型、Host、MCP Client 和 MCP Server 之间的消息流向

  1. 建立连接。 Client 发出 initialize,与 Server 协商协议版本并交换能力。Client 确认初始化完成后发送 notifications/initialized。
  2. 发现工具。 Client 发送 tools/list,拿到包括 add 在内的工具定义。Host 选择本次对话可以使用的工具,并把对应定义和用户问题一起交给模型。
  3. 执行并返回。 模型提出调用 add,Host 按权限策略处理请求,允许后通过 Client 发送 tools/call。Server 执行工具并返回结果,Host 再把结果交给模型生成回答。MCP 生命周期规范、MCP 工具规范

模型发出的结构化工具请求属于 Function Call。Host 可以用它触发 MCP,也可以在测试或固定流程中直接发起 MCP 调用。一个可复用的排查顺序是先用 Client 验证工具可发现、可执行,再检查模型是否提交了工具调用请求。

请求和响应长什么样 ​

MCP 使用 JSON-RPC 2.0。调用请求用 method 指定协议操作,在 params 里传工具名和参数。

json
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "add",
    "arguments": { "a": 19, "b": 23 }
  }
}

成功响应沿用请求的 id,工具输出位于 result。

json
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [{ "type": "text", "text": "42" }]
  }
}

工具执行失败时,Server 可以在工具结果里用 isError: true 表示失败。遇到未知工具等协议层错误时,Server 返回 JSON-RPC 的 error 对象。MCP 工具错误处理

4. 消息怎么传输 ​

传输方式消息如何送达常见场景
stdioClient 启动本地子进程,通过标准输入和标准输出交换 JSON-RPC 消息。服务日志写到标准错误。IDE 助手接入本机工具
Streamable HTTPClient 向 MCP 端点发 POST,Server 可以返回 JSON 或 SSE 事件流。多个 Agent 连接独立部署的工具服务

接入现有 Server 时,先确认传输方式。stdio 需要启动命令和参数,Streamable HTTP 需要 MCP 端点地址。旧版 HTTP+SSE 有自己的连接方式,配置时应与服务端支持的传输一致。对会写入或删除数据的工具,Host 应提供确认,Server 仍需检查调用权限和参数。MCP 传输规范、MCP 工具安全要求

想实际跑一遍 tools/list 和 tools/call,可以接着看 Spring AI MCP 实践。