模型上下文协议(MCP)为客户端-服务器连接定义了严格的生命周期,确保能力协商与状态管理的规范性:
- 初始化阶段:进行能力协商并确定协议版本
- 运行阶段:正常的协议通信
- 终止阶段:连接的优雅关闭

初始化阶段(Initialization)
初始化阶段必须是客户端与服务器的首次交互。在此阶段,双方需完成以下操作:
- 确认协议版本兼容性
- 交换并协商支持的能力
- 共享实现细节
客户端必须通过发送初始化 (initialize) 请求来启动该阶段,请求中需包含以下内容:
- 支持的协议版本
- 客户端能力列表
- 客户端实现信息
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {
"roots": {
"listChanged": true
},
"sampling": {}
},
"clientInfo": {
"name": "ExampleClient",
"version": "1.0.0"
}
}
}
服务器必须响应其自身的能力和信息:
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"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),表明已准备好开始正常操作:
json
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}
- 在服务器响应初始化请求之前,客户端不应发送除心跳检测(ping)之外的任何请求。
- 在收到初始化通知之前,服务器不应发送除心跳检测(ping)和日志记录之外的任何请求。
版本协商(Version Negotiation)
在初始化请求中,客户端必须发送其支持的协议版本,且该版本应为客户端支持的最新版本。
如果服务器支持客户端请求的协议版本,则必须返回相同版本;否则,服务器必须返回其支持的另一个协议版本(通常应为服务器支持的最新版本)。
若客户端不支持服务器返回的版本,则应断开连接。
能力协商(Capability Negotiation)
客户端与服务器能力协商确定会话期间可用的可选协议功能
关键能力包括:
Category | Capability | Description |
---|---|---|
Client | roots | 提供文件系统根目录的能力 |
Client | sampling | 支持LLM采样请求 |
Client | experimental | 支持非标准实验性功能的说明 |
Server | prompts | 提供提示词模版 |
Server | resources | 提供可读资源 |
Server | tools | 暴露可调用工具 |
Server | logging | 生成结构化日志消息 |
Server | experimental | 支持非标准实验性功能的说明 |
能力对象可描述以下子功能:
- listChanged:支持列表变更通知(适用于提示词、资源和工具)
- subscribe:支持订阅单个项目的变更(仅限资源)
运行阶段(Operation)
在运行阶段,客户端与服务器将根据协商确定的能力进行消息交互。
双方应当遵循以下准则:
- 严格遵守协商达成的协议版本
- 仅使用已成功协商通过的功能
终止阶段(Shutdown)
在终止阶段,通常由客户端主动关闭协议连接。
无需定义特定的终止消息------直接通过底层传输机制发出连接终止信号即可。
stdio
在使用标准输入输出传输时,应按以下流程终止连接:
- 首先关闭子进程(服务端)的输入流
- 等待服务端退出,若未在合理时间内退出则发送SIGTERM信号
- 发送SIGTERM后若仍未及时退出,则发送SIGKILL信号
服务端可通过关闭向客户端的输出流并退出来主动终止连接。
HTTP
对于HTTP传输协议,终止流程通过关闭相关HTTP连接实现。
超时(Timeouts)
所有实现方案均应设置请求超时机制,以避免连接挂起和资源耗尽。当请求在超时期限内未收到成功或错误响应时,发送方应当发送该请求的取消通知以及停止等待响应。
SDK及中间件应支持按请求单独配置超时参数。
实现方案可选择在收到请求对应的进度通知时重置超时计时器(这表明处理仍在进行)。但无论收到多少进度通知,实现方案都应设置最终超时上限,以限制异常客户端或服务端的影响。
异常处理(Error Handing)
实现方案应妥善处理以下异常场景:
- 协议版本不匹配
- 必需能力协商失败
- 请求超时
初始化错误示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Unsupported protocol version",
"data": {
"supported": ["2024-11-05"],
"requested": "1.0.0"
}
}
}