傳輸

協議版本: 2024-11-05

MCP 目前定義了兩種標準傳輸機制用於客戶端-服務器通信:

  1. stdio,通過標準輸入和標準輸出進行通信
  2. 帶有服務器發送事件的 HTTP (SSE)

客戶端應該儘可能支持 stdio。

客戶端和服務器也可以以可插拔的方式實現自定義傳輸

stdio

stdio 傳輸中:

  • 客戶端將 MCP 服務器啟動為子進程。
  • 服務器在其標準輸入(stdin)上接收 JSON-RPC 消息,並將響應寫入其標準輸出(stdout)。
  • 消息由換行符分隔,並且不得包含嵌入的換行符。
  • 服務器可以為日誌記錄目的向其標準錯誤(stderr)寫入 UTF-8 字符串。客戶端可以捕獲、轉發或忽略此日誌記錄。
  • 服務器不得向其 stdout 寫入任何不是有效 MCP 消息的內容。
  • 客戶端不得向服務器的 stdin 寫入任何不是有效 MCP 消息的內容。
  sequenceDiagram
    participant Client
    participant Server Process

    Client->>+Server Process: 啟動子進程
    loop 消息交換
        Client->>Server Process: 寫入 stdin
        Server Process->>Client: 寫入 stdout
        Server Process--)Client: 可選的 stderr 日誌
    end
    Client->>Server Process: 關閉 stdin,終止子進程
    deactivate Server Process

HTTP with SSE

SSE 傳輸中,服務器作為獨立進程運行,可以處理多個客戶端連接。

服務器必須提供兩個端點:

  1. 一個 SSE 端點,供客戶端建立連接並接收來自服務器的消息
  2. 一個常規的 HTTP POST 端點,供客戶端向服務器發送消息

當客戶端連接時,服務器必須發送一個包含 URI 的 endpoint 事件,客戶端用於發送消息。所有後續客戶端消息必須作為 HTTP POST 請求發送到此端點。

服務器消息作為 SSE message 事件發送,消息內容在事件數據中編碼為 JSON。

  sequenceDiagram
    participant Client
    participant Server

    Client->>Server: 打開 SSE 連接
    Server->>Client: endpoint 事件
    loop 消息交換
        Client->>Server: HTTP POST 消息
        Server->>Client: SSE message 事件
    end
    Client->>Server: 關閉 SSE 連接

自定義傳輸

客戶端和服務器可以實現額外的自定義傳輸機制以滿足其特定需求。協議是傳輸不可知的,可以在支持雙向消息交換的任何通信通道上實現。

選擇支持自定義傳輸的實現者必須確保它們保留 MCP 定義的 JSON-RPC 消息格式和生命週期要求。自定義傳輸應該記錄其特定的連接建立和消息交換模式,以幫助互操作性。