生命週期

協議版本: 草案

模型上下文協議 (MCP) 為客戶端-服務器連接定義了嚴格的生命週期,確保適當的能力協商和狀態管理。

  1. 初始化:能力協商和協議版本協議
  2. 操作:正常協議通信
  3. 關閉:連接的優雅終止
  sequenceDiagram
    participant Client
    participant Server

    Note over Client,Server: 初始化階段
    activate Client
    Client->>+Server: initialize 請求
    Server-->>Client: initialize 響應
    Client--)Server: initialized 通知

    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": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "roots": {
        "listChanged": true
      },
      "sampling": {}
    },
    "clientInfo": {
      "name": "ExampleClient",
      "version": "1.0.0"
    }
  }
}

服務器必須響應其自身的能力和信息:

{
  "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 通知以表明它已準備好開始正常操作:

{
  "jsonrpc": "2.0",
  "method": "notifications/initialized"
}
  • 在服務器響應 initialize 請求之前,客戶端不應發送除了 ping 以外的請求。
  • 在收到 initialized 通知之前,服務器不應發送除了 pinglogging 以外的請求。

版本協商

initialize 請求中,客戶端必須發送它支持的協議版本。 這應該是客戶端支持的_最新_版本。

如果服務器支持請求的協議版本,它必須響應相同的版本。否則,服務器必須響應它支持的另一個協議版本。這應該是服務器支持的_最新_版本。

如果客戶端不支持服務器響應中的版本,它應該斷開連接。

能力協商

客戶端和服務器能力確定在會話期間將可用哪些可選協議功能。

關鍵能力包括:

類別能力描述
客戶端roots提供文件系統根目錄的能力
客戶端sampling支持 LLM 採樣請求
客戶端experimental描述對非標準實驗性功能的支持
服務器prompts提供提示模板
服務器resources提供可讀的資源
服務器tools公開可調用的工具
服務器logging發出結構化日誌消息
服務器experimental描述對非標準實驗性功能的支持

能力對象可以描述子能力,如:

  • listChanged:支持列表變更通知(適用於提示、資源和工具)
  • subscribe:支持訂閱單個項目的變更(僅適用於資源)

操作

在操作階段,客戶端和服務器根據協商的能力交換消息。

雙方應該

  • 尊重協商的協議版本
  • 只使用成功協商的能力

關閉

在關閉階段,一方(通常是客戶端)乾淨地終止協議連接。沒有定義特定的關閉消息——相反,應使用底層傳輸機制來發出連接終止信號:

stdio

對於 stdio 傳輸,客戶端應該通過以下方式啟動關閉:

  1. 首先,關閉到子進程(服務器)的輸入流
  2. 等待服務器退出,或者如果服務器在合理時間內沒有退出,則發送 SIGTERM
  3. 如果服務器在收到 SIGTERM 後的合理時間內沒有退出,則發送 SIGKILL

服務器可以通過關閉其到客戶端的輸出流並退出來啟動關閉。

HTTP

對於 HTTP 傳輸,關閉通過關閉相關的 HTTP 連接來指示。

錯誤處理

實現應該準備處理這些錯誤情況:

  • 協議版本不匹配
  • 無法協商所需的能力
  • 初始化請求超時
  • 關閉超時

實現應該為所有請求實現適當的超時,以防止連接掛起和資源耗盡。

初始化錯誤示例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "不支持的協議版本",
    "data": {
      "supported": ["2024-11-05"],
      "requested": "1.0.0"
    }
  }
}