傳輸

協議版本: 草案

MCP 使用 JSON-RPC 來編碼消息。JSON-RPC 消息必須使用 UTF-8 編碼。

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

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

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

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

stdio

stdio 傳輸中:

  • 客戶端將 MCP 服務器啟動為子進程。
  • 服務器在其標準輸入 (stdin) 上接收 JSON-RPC 消息,並將響應寫入其標準輸出 (stdout)。
  • 消息由換行符分隔,不得包含嵌入的換行符。
  • 服務器可以為日誌目的將 UTF-8 字符串寫入其標準錯誤 (stderr)。客戶端可以捕獲、轉發或忽略此日誌。
  • 服務器不得向其 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 與 SSE

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

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

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

當客戶端連接時,服務器必須發送一個包含 URI 的 endpoint 事件,客戶端使用該 URI 發送消息。所有後續客戶端消息必須作為 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 消息格式和生命週期要求。自定義傳輸應該記錄其特定的連接建立和消息交換模式,以幫助互操作性。