1. 什么是生命周期? #
生命周期描述 MCP 客户端与服务器从建立连接到断开连接的完整过程。协议规定三个阶段,确保能力协商正确、状态管理清晰。
协议修订版:2025-11-25
| 通俗理解 | 说明 |
|---|---|
| 像 TCP 握手 | 先协商版本和能力,再正常通信,最后优雅关闭 |
| 必须遵守 | 所有 MCP 实现都必须支持生命周期管理 |
| 三个阶段 | 初始化 → 运行 → 关闭 |
2. 本章你将学到 #
- 生命周期的三个阶段及其顺序
- 初始化时客户端与服务器如何交换能力
- 版本协商与能力协商的规则
- 关闭连接、超时与错误处理
3. 生命周期一览 #
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 初始化 │ ──► │ 运行 │ ──► │ 关闭 │
│ 能力协商 │ │ 正常通信 │ │ 优雅终止 │
└─────────────┘ └─────────────┘ └─────────────┘| 阶段 | 说明 |
|---|---|
| 初始化 | 客户端发 initialize,服务器响应能力,客户端发 initialized 通知 |
| 运行 | 按协商的能力交换消息(工具调用、资源读取、采样等) |
| 关闭 | 通过传输层(如关闭 stdio、断开 HTTP)终止连接 |
4. 流程图 #
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Note over Client,Server: 初始化阶段
activate Client
Client->>Server: initialize 请求
activate Server
Server-->>Client: 初始化响应(能力、版本)
Client->>Server: initialized 通知
deactivate Client
Note over Client,Server: 运行阶段
Note over Client,Server: 正常协议操作
Note over Client,Server: 关闭阶段
activate Client
Client->>Server: 断开连接(传输层)
deactivate Server
deactivate Client
5. 初始化阶段 #
初始化必须是客户端与服务器之间的首次交互。在此阶段:
| 目标 | 说明 |
|---|---|
| 版本兼容 | 协商双方都支持的协议版本 |
| 能力交换 | 客户端声明能做什么,服务器声明能提供什么 |
| 实现信息 | 交换名称、版本、描述等,便于调试和展示 |
5.1 初始化流程 #
- 客户端发送
initialize请求(协议版本、能力、实现信息) - 服务器响应
initialize(协议版本、能力、实现信息) - 客户端发送
initialized通知,表示准备就绪
在收到
initialized之前,服务器不应发送除ping、logging以外的请求。
5.2 客户端 initialize 请求示例 #
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {
"roots": { "listChanged": true },
"sampling": {},
"elicitation": { "form": {}, "url": {} }
},
"clientInfo": {
"name": "ExampleClient",
"title": "Example Client",
"version": "1.0.0"
}
}
}| 关键字段 | 说明 |
|---|---|
protocolVersion |
客户端支持的协议版本(如 2025-11-25) |
capabilities |
客户端能力(roots、sampling、elicitation 等) |
clientInfo |
客户端名称、版本、描述、图标等 |
5.3 服务器 initialize 响应示例 #
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": { "listChanged": true },
"resources": { "subscribe": true, "listChanged": true },
"prompts": { "listChanged": true },
"logging": {}
},
"serverInfo": {
"name": "ExampleServer",
"title": "Example Server",
"version": "1.0.0"
},
"instructions": "Optional instructions for the client"
}
}| 关键字段 | 说明 |
|---|---|
protocolVersion |
协商后的协议版本 |
capabilities |
服务器能力(tools、resources、prompts 等) |
serverInfo |
服务器名称、版本、描述、图标等 |
5.4 initialized 通知 #
初始化成功后,客户端必须发送:
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}5.5 版本协商 #
| 规则 | 说明 |
|---|---|
| 客户端 | 发送其支持的最新协议版本 |
| 服务器 | 若支持请求版本,以相同版本响应;否则以自身支持的最新版本响应 |
| 不兼容 | 若客户端不支持服务器返回的版本,应当断开连接 |
| HTTP | 后续请求须包含 MCP-Protocol-Version 头 |
5.6 能力协商 #
| 类别 | 能力 | 说明 |
|---|---|---|
| 客户端 | roots |
提供文件系统根目录列表 |
| 客户端 | sampling |
支持 LLM 采样请求 |
| 客户端 | elicitation |
支持服务器征询(向用户请求信息) |
| 客户端 | tasks |
支持任务增强 |
| 服务器 | tools |
暴露可调用工具 |
| 服务器 | resources |
提供可读资源 |
| 服务器 | prompts |
提供提示模板 |
| 服务器 | logging |
发送结构化日志 |
| 服务器 | completions |
支持参数自动补全 |
| 服务器 | tasks |
支持任务增强 |
子能力示例:
listChanged:支持列表变更通知(提示、资源、工具)subscribe:支持订阅单个资源的变更
6. 运行阶段 #
在运行阶段,客户端和服务器根据已协商的能力交换消息。
| 要求 | 说明 |
|---|---|
| 遵守版本 | 使用协商的协议版本 |
| 遵守能力 | 仅使用已成功协商的能力 |
7. 关闭阶段 #
一方(通常为客户端)通过底层传输终止连接,无专用「关闭消息」。
7.1 stdio 传输 #
| 角色 | 关闭方式 |
|---|---|
| 客户端 | 1. 关闭对服务器子进程的输入流 2. 等待退出,或超时后发 SIGTERM3. 仍不退出则发 SIGKILL |
| 服务器 | 关闭输出流并退出 |
7.2 HTTP 传输 #
通过关闭关联的 HTTP 连接表示关闭。
8. 超时与错误处理 #
8.1 超时 #
| 建议 | 说明 |
|---|---|
| 请求超时 | 为每个请求设置超时,防止连接挂起 |
| 超时后 | 发送取消通知,停止等待 |
| 进度通知 | 收到进度通知时可重置超时,但应强制执行最大超时 |
8.2 错误处理 #
实现应当处理以下情况:
- 协议版本不匹配
- 无法协商所需能力
- 请求超时
初始化错误示例(版本不兼容):
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Unsupported protocol version",
"data": {
"supported": ["2024-11-05"],
"requested": "1.0.0"
}
}
}