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 之间传递的是模型请求和工具调用结果。
- 建立连接。 Client 发出
initialize,与 Server 协商协议版本并交换能力。Client 确认初始化完成后发送notifications/initialized。 - 发现工具。 Client 发送
tools/list,拿到包括add在内的工具定义。Host 选择本次对话可以使用的工具,并把对应定义和用户问题一起交给模型。 - 执行并返回。 模型提出调用
add,Host 按权限策略处理请求,允许后通过 Client 发送tools/call。Server 执行工具并返回结果,Host 再把结果交给模型生成回答。MCP 生命周期规范、MCP 工具规范
模型发出的结构化工具请求属于 Function Call。Host 可以用它触发 MCP,也可以在测试或固定流程中直接发起 MCP 调用。一个可复用的排查顺序是先用 Client 验证工具可发现、可执行,再检查模型是否提交了工具调用请求。
请求和响应长什么样
MCP 使用 JSON-RPC 2.0。调用请求用 method 指定协议操作,在 params 里传工具名和参数。
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "add",
"arguments": { "a": 19, "b": 23 }
}
}成功响应沿用请求的 id,工具输出位于 result。
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [{ "type": "text", "text": "42" }]
}
}工具执行失败时,Server 可以在工具结果里用 isError: true 表示失败。遇到未知工具等协议层错误时,Server 返回 JSON-RPC 的 error 对象。MCP 工具错误处理
4. 消息怎么传输
| 传输方式 | 消息如何送达 | 常见场景 |
|---|---|---|
| stdio | Client 启动本地子进程,通过标准输入和标准输出交换 JSON-RPC 消息。服务日志写到标准错误。 | IDE 助手接入本机工具 |
| Streamable HTTP | Client 向 MCP 端点发 POST,Server 可以返回 JSON 或 SSE 事件流。 | 多个 Agent 连接独立部署的工具服务 |
接入现有 Server 时,先确认传输方式。stdio 需要启动命令和参数,Streamable HTTP 需要 MCP 端点地址。旧版 HTTP+SSE 有自己的连接方式,配置时应与服务端支持的传输一致。对会写入或删除数据的工具,Host 应提供确认,Server 仍需检查调用权限和参数。MCP 传输规范、MCP 工具安全要求
想实际跑一遍 tools/list 和 tools/call,可以接着看 Spring AI MCP 实践。

