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

生命周期阶段

初始化 (Initialization)

初始化阶段必须是客户端与服务器之间的第一次交互。在此阶段,客户端和服务器将:
  • 建立协议版本兼容性
  • 交换并协商功能 (Capabilities)
  • 共享实现细节
客户端必须通过发送包含以下内容的 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:支持订阅单个项目的变更(仅限资源)

运行 (Operation)

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

关闭 (Shutdown)

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

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"
    }
  }
}