跳到主要内容
模型上下文协议 (MCP) 为客户端与服务器之间的连接定义了一套严格的生命周期,以确保适当的能力协商和状态管理。
  1. 初始化:能力协商与协议版本达成一致
  2. 运行:正常的协议通信
  3. 关闭:优雅地终止连接

生命周期阶段

初始化

初始化阶段必须是客户端与服务器之间的首次交互。在此阶段,客户端与服务器
  • 建立协议版本兼容性
  • 交换并协商各项能力
  • 共享实现细节
客户端必须通过发送包含以下内容的 initialize 请求来启动此阶段:
  • 支持的协议版本
  • 客户端能力
  • 客户端实现信息
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-11-25",
    "capabilities": {
      "roots": {
        "listChanged": true
      },
      "sampling": {},
      "elicitation": {
        "form": {},
        "url": {}
      },
      "tasks": {
        "requests": {
          "elicitation": {
            "create": {}
          },
          "sampling": {
            "createMessage": {}
          }
        }
      }
    },
    "clientInfo": {
      "name": "ExampleClient",
      "title": "Example Client Display Name",
      "version": "1.0.0",
      "description": "An example MCP client application",
      "icons": [
        {
          "src": "https://example.com/icon.png",
          "mimeType": "image/png",
          "sizes": ["48x48"]
        }
      ],
      "websiteUrl": "https://example.com"
    }
  }
}
服务器必须响应其自身的能力和信息
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-11-25",
    "capabilities": {
      "logging": {},
      "prompts": {
        "listChanged": true
      },
      "resources": {
        "subscribe": true,
        "listChanged": true
      },
      "tools": {
        "listChanged": true
      },
      "tasks": {
        "list": {},
        "cancel": {},
        "requests": {
          "tools": {
            "call": {}
          }
        }
      }
    },
    "serverInfo": {
      "name": "ExampleServer",
      "title": "Example Server Display Name",
      "version": "1.0.0",
      "description": "An example MCP server providing tools and resources",
      "icons": [
        {
          "src": "https://example.com/server-icon.svg",
          "mimeType": "image/svg+xml",
          "sizes": ["any"]
        }
      ],
      "websiteUrl": "https://example.com/server"
    },
    "instructions": "Optional instructions for the client"
  }
}
初始化成功后,客户端必须发送 initialized 通知,以表明其已准备好开始正常操作
{
  "jsonrpc": "2.0",
  "method": "notifications/initialized"
}
  • 在服务器响应 initialize 请求之前,客户端不应发送除 ping 之外的请求。
  • 在接收到 initialized 通知之前,服务器不应发送除 ping日志记录 之外的请求。

版本协商

initialize 请求中,客户端必须发送其支持的协议版本。这应当是客户端支持的最新版本。 如果服务器支持所请求的协议版本,则必须以相同版本响应。否则,服务器必须以其支持的另一个协议版本进行响应。这应当是服务器支持的最新版本。 如果客户端不支持服务器响应中的版本,则应当断开连接。
如果使用 HTTP,客户端必须在随后发送给 MCP 服务器的所有请求中包含 MCP-Protocol-Version: <protocol-version> HTTP 标头。详细信息请参阅传输层中的协议版本标头部分

能力协商

客户端和服务器的能力决定了在会话期间将启用哪些可选的协议功能。 主要能力包括:
类别能力描述
客户端roots提供文件系统 根目录 的能力
客户端sampling支持 LLM 采样 请求
客户端elicitation支持服务器 引导 (elicitation) 请求
客户端tasks支持 任务增强型 客户端请求
客户端experimental描述对非标准实验性功能的支持
服务器prompts提供 提示词模板
服务器resources提供可读的 资源
服务器tools公开可调用的 工具
服务器logging发出结构化的 日志消息
服务器completions支持参数 自动补全
服务器tasks支持 任务增强型 服务器请求
服务器experimental描述对非标准实验性功能的支持
能力对象可以描述子能力,例如:
  • listChanged:支持列表变更通知(适用于提示词、资源和工具)
  • subscribe:支持订阅单个项目的变更(仅限资源)

运行

在运行阶段,客户端和服务器根据协商后的能力交换消息。 双方必须
  • 遵守协商后的协议版本
  • 仅使用已成功协商的能力

关闭

在关闭阶段,一方(通常是客户端)会干净利落地终止协议连接。协议未定义专门的关闭消息——应使用底层传输机制来发出连接终止信号。

stdio

对于 stdio 传输,客户端应当通过以下方式启动关闭:
  1. 首先,关闭子进程(服务器)的输入流
  2. 等待服务器退出,如果服务器未在合理时间内退出,则发送 SIGTERM
  3. 如果服务器在 SIGTERM 之后未在合理时间内退出,则发送 SIGKILL
服务器可以通过关闭其发往客户端的输出流并退出,从而启动关闭过程。

HTTP

对于 HTTP 传输,通过关闭相关的 HTTP 连接来指示关闭。

超时

实现应当为所有已发送的请求设置超时,以防止连接挂起和资源耗尽。当在超时时间内未收到成功或错误响应时,发送方应当为该请求发出 取消通知 并停止等待响应。 SDK 和其他中间件应当允许按请求配置这些超时时间。 实现可以选择在收到与请求对应的 进度通知 时重置超时计时器,因为这暗示工作正在实际进行。然而,无论是否有进度通知,实现应当始终强制执行最大超时时间,以限制行为异常的客户端或服务器带来的影响。

错误处理

实现应当准备好处理以下错误情况:
  • 协议版本不匹配
  • 协商必要能力失败
  • 请求 超时
初始化错误示例
{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "Unsupported protocol version",
    "data": {
      "supported": ["2024-11-05"],
      "requested": "1.0.0"
    }
  }
}