MCP 定义了一种标准化的通信协议,使客户端和服务器能够以一致且可预测的方式交换消息。这种标准化对于社区内部的互操作性至关重要。
注:构建 MCP 服务器时无需掌握所有细节。本文探讨 MCP 协议通信的细节,可作为了解 MCP 运作方式的补充阅读。
1. 消息格式:JSON-RPC
MCP 协议使用 JSON-RPC 2.0 作为客户端和服务器之间所有通信的消息格式。JSON-RPC 是一种基于 JSON 编码的轻量级远程过程调用协议,具有以下特点:
易于阅读和调试
支持在任何编程环境中实现
规格清晰,应用广泛
2. 消息类型
MCP协议定义了三种类型的消息:请求(request)、回复(response)、通知(notification)
1)请求(Request)
由 Client 发给 Server,用于发起某个操作。请求消息包含以下字段:
一个唯一的标识符(id)
要调用的方法名(如 "tools/call")
方法所需的参数(params,如果有)
{
"jsonrpc":"2.0",
"id":1,
"method":"tools/call",
"params":{
"name":"天气",
"arguments":{
"location":"上海"
}
}
}
2)响应(Response)
由 Server 回复给 Client,用于响应前面发送的 Request。响应消息包含:
与对应 Request 相同的 id
要么是成功结果(result),要么是错误信息(error)
成功结果
{
"jsonrpc":"2.0",
"id":1,
"result":{
"temperature":20,
"conditions":"部分多云"
}
}
错误信息
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Invalid location parameter"
}
}
3)通知(Notification)
通常由 Server 发送给 Client的单向消息,不需要响应。用于传递事件更新或进度通知等信息。
示例:
{
"jsonrpc":"2.0",
"method":"progress",
"params":{
"message":"Processing data...",
"percent":50
}
}
3. 通信的生命周期
客户端和服务器的通信生命周期包含三个阶段:初始化(Initialisation)、交换消息(Message Exchange)、终止(Termination)
1)初始化(Initialisation)
Client 与 Server 建立连接,建立本本兼容性、交换和协商能力,分享实现的细节。
客户端发送初始化请求(initialize request),包含:协议版本、客户端功能、客户端实现信息。例如:
{
"jsonrpc": "2.0",
"id":1,
"method":"initialize",
"params": {
"protocolVersion":"2025-03-26",
"capabilities": {
"roots": {
"listChanged": true
},
"sampling": {}
},
"clientInfo": {
"name":"ExampleClient",
"version":"1.0.0"
}
}
}
服务器回复(initialize response)自身的协议版本和功能信息:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-03-26",
"capabilities": {
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": true,
"listChanged": true
},
"tools": {
"listChanged": true
}
},
"serverInfo": {
"name": "ExampleServer",
"version": "1.0.0"
},
"instructions": "Optional instructions for the client"
}
}
客户端发送初始化通知(initialized notification)作为确认,表示已经准备好开始正常消息交换(connection ready for use)
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}
2)交换消息(Message Exchange)
Client和Server之间进行正常的协议消息交换(请求、响应、通知等)。
客户端或服务端发送请求信息,另一方响应。这个过程可以针对每个工具、资源或提示类型重复进行。
3)终止(Termination)
在终止阶段,客户端通知服务器断开连接,服务器确认关闭请求。客户端发送退出后关闭连接。
4. 能力协商
Capability Negotiation
在初始化阶段,客户端和服务器明确声明其支持的功能,决定了在会话期间可用哪些功能。
服务器声明其功能,例如资源订阅、工具支持和提示模板
客户端声明支持采样和通知处理等能力
双方必须在整个会话期间尊重声明的功能
可以通过协议扩展来协商额外的功能
关键能力包括:
能力对象可以描述子能力,例如:
- listChanged :支持列表变更通知(用于提示、资源和工具)
- subscribe :支持订阅单个项目的变化(仅限资源)
以下是客户端和服务器之间能力协商的一个流程图:
每种能力都会在会话期间解锁特定的协议功能。例如:
- 已实现的服务器功能必须在服务器的能力说明中进行宣传
- 发出资源订阅通知需要服务器声明支持订阅
- 工具调用需要服务器声明工具功能
- 采样需要客户端在其功能中声明支持
这种能力协商确保客户端和服务器对支持的功能有清晰的理解,同时保持协议的可扩展性。
掌握通信的消息类型和生命周期,将帮助你深入了解 MCP 的通信机制。
下一节,我们将进一步介绍 MCP 的三种通信机制,帮助你全面构建基于 MCP 的 AI 应用生态。
原文地址:https://www.cnblogs.com/mcpmarket/p/18963503