傳輸
協議版本: 草案
MCP 使用 JSON-RPC 來編碼消息。JSON-RPC 消息必須使用 UTF-8 編碼。
協議目前定義了兩種用於客戶端-服務器通信的標準傳輸機制:
- stdio,通過標準輸入和標準輸出進行通信
- 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 傳輸中,服務器作為可以處理多個客戶端連接的獨立進程運行。
服務器必須提供兩個端點:
- 一個 SSE 端點,供客戶端建立連接並從服務器接收消息
- 一個常規 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 消息格式和生命週期要求。自定義傳輸應該記錄其特定的連接建立和消息交換模式,以幫助互操作性。