生命周期
ℹ️
协议版本: 2024-11-05
模型上下文协议(MCP)为客户端-服务器连接定义了严格的生命周期,确保适当的能力协商和状态管理。
- 初始化:能力协商和协议版本协议
- 操作:正常协议通信
- 关闭:连接的优雅终止
sequenceDiagram participant Client participant Server Note over Client,Server: 初始化阶段 activate Client Client->>+Server: 初始化请求 Server-->>Client: 初始化响应 Client--)Server: 已初始化通知 Note over Client,Server: 操作阶段 rect rgb(200, 220, 250) note over Client,Server: 正常协议操作 end Note over Client,Server: 关闭 Client--)-Server: 断开连接 deactivate Server Note over Client,Server: 连接已关闭
生命周期阶段
初始化
初始化阶段必须是客户端和服务器之间的第一次交互。在此阶段,客户端和服务器:
- 建立协议版本兼容性
- 交换和协商能力
- 共享实现细节
客户端必须通过发送一个包含以下内容的initialize
请求来启动此阶段:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolRevision": "2024-11-05",
"capabilities": {
"sampling": {
"provider": true
}
}
}
}
服务器必须使用以下结构响应initialize
请求:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"capabilities": {
"resources": {
"provider": true,
"subscription": true
}
}
}
}
在接收到初始化响应后,客户端必须发送initialized
通知以完成初始化阶段:
{
"jsonrpc": "2.0",
"method": "initialized",
"params": {}
}
操作
初始化完成后,客户端和服务器进入操作阶段,在此阶段可以进行以下活动:
- 客户端请求服务器公开的资源
- 服务器向客户端发送通知
- 客户端请求服务器执行工具操作
- 服务器请求客户端执行 LLM 采样
操作阶段的持续时间限制仅受传输层约束。
关闭
会话可以通过以下方式终止:
- 客户端发送
shutdown
请求,然后发送exit
通知 - 客户端或服务器中断传输层连接
良好行为的客户端应该在关闭连接前发送shutdown
请求:
{
"jsonrpc": "2.0",
"id": 42,
"method": "shutdown"
}
服务器应该以空结果响应:
{
"jsonrpc": "2.0",
"id": 42,
"result": null
}
收到关闭响应后,客户端应该发送exit
通知:
{
"jsonrpc": "2.0",
"method": "exit"
}
收到exit
通知后,服务器必须结束其进程或关闭连接。
能力
MCP 使用能力系统在初始化期间协商功能支持。客户端和服务器都声明它们支持的功能,这些声明构成了会话期间可用的功能集。
能力为协议提供以下好处:
- 逐步采用新功能
- 避免协议分支
- 实现特定功能的清晰通信
每个能力的支持水平是静态的,在会话期间不得更改。
初始化能力
客户端在初始化请求中提供其能力,服务器在初始化响应中提供其能力。最终的功能集由这两个能力声明的交集确定,但客户端能力主要用于指示其支持什么,而服务器能力指示其提供什么。
所有工具、资源处理程序和其他特性都是可选的。客户端和服务器可以协商它们需要和支持的确切功能集。
以下能力类别可用:
服务器能力
能力 | 描述 |
---|---|
resources | 访问和订阅资源 |
prompts | 使用提示模板和上下文感知提示 |
tools | 调用定义的工具和操作 |
utilities | 日志记录和参数补全等辅助功能 |
客户端能力
能力 | 描述 |
---|---|
sampling | 执行 LLM 采样 |
workspaceRoot | 报告工作空间根目录 |