生命周期阶段
生命周期分为三个主要阶段:
-
初始化阶段 (Initialization)
- 客户端与服务器建立协议版本兼容性。
- 交换并协商能力。
- 分享实现细节。
- 客户端必须发送
initialize
请求,包含支持的协议版本、客户端能力和客户端实现信息。 - 服务器必须响应其自身能力和信息。
- 成功初始化后,客户端必须发送
initialized
通知,表明已准备好开始正常操作。
-
操作阶段 (Operation)
- 客户端和服务器根据协商的能力交换消息。
- 双方应尊重协商的协议版本,并仅使用成功协商的能力。
-
关闭阶段 (Shutdown)
- 通常由客户端干净地终止协议连接。
- 没有定义特定的关闭消息,而是使用底层传输机制来信号连接终止。
- 对于
stdio
传输,客户端应先关闭对子进程(服务器)的输入流,等待服务器退出,必要时发送SIGTERM
或SIGKILL
。 - 对于 HTTP 传输,关闭相关 HTTP 连接即可。
关键细节
1. 初始化阶段
-
initialize
请求- 客户端必须发送包含以下内容的
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" } } }
-
initialized
通知- 成功初始化后,客户端必须发送
initialized
通知:{ "jsonrpc": "2.0", "method": "notifications/initialized" }
- 成功初始化后,客户端必须发送
-
版本协商
- 客户端在
initialize
请求中必须发送其支持的协议版本。 - 如果服务器支持请求的协议版本,则必须以相同版本响应。
- 如果服务器不支持请求的版本,则必须以服务器支持的版本响应。
- 如果客户端不支持服务器响应的版本,则应断开连接。
- 客户端在
-
能力协商
- 客户端和服务器的能力决定了会话期间可用的可选协议功能。
- 关键能力包括:
- 客户端:
roots
:提供文件系统根目录的能力。sampling
:支持 LLM 采样请求。experimental
:描述对非标准实验性功能的支持。
- 服务器:
prompts
:提供提示模板。resources
:提供可读资源。tools
:暴露可调用工具。logging
:发出结构化日志消息。experimental
:描述对非标准实验性功能的支持。
- 客户端:
- 能力对象可以描述子能力,例如:
listChanged
:支持列表更改通知(适用于提示、资源和工具)。subscribe
:支持订阅单个项目更改(仅限资源)。
2. 操作阶段
- 客户端和服务器根据协商的能力交换消息。
- 双方应尊重协商的协议版本,并仅使用成功协商的能力。
3. 关闭阶段
- 通常由客户端干净地终止协议连接。
- 没有定义特定的关闭消息,而是使用底层传输机制来信号连接终止。
stdio
传输- 客户端应先关闭对子进程(服务器)的输入流。
- 等待服务器退出,必要时发送
SIGTERM
或SIGKILL
。
- HTTP 传输
- 关闭相关 HTTP 连接即可。
错误处理
- 实现应准备好处理以下错误情况:
- 协议版本不匹配。
- 无法协商所需能力。
- 初始化请求超时。
- 关闭超时。
- 实现应为所有请求实现适当的超时,以防止连接挂起和资源耗尽。
- 示例初始化错误:
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32602, "message": "Unsupported protocol version", "data": { "supported": ["2024-11-05"], "requested": "1.0.0" } } }
相关链接
- Messages
- Versioning
- lifecycle