載入中

StreamableHTTP 是 MCP 針對一個根本性問題所提出的解決方案:某些 MCP 功能需要伺服器向客戶端發出請求,但 HTTP 讓這件事變得具有挑戰性。讓我們來探討 StreamableHTTP 如何繞過這項限制,以及您何時可能需要打破這個變通方法。

核心問題

某些 MCP 功能,例如取樣(sampling)、通知(notifications)和日誌記錄(logging),依賴於伺服器主動向客戶端發出請求。然而,HTTP 的設計是讓客戶端向伺服器發出請求,而不是反過來。StreamableHTTP 透過使用伺服器發送事件(Server-Sent Events,SSE)的巧妙變通方法解決了這個問題。

StreamableHTTP 的運作方式

這個魔法是透過一個多步驟的流程實現的,該流程在客戶端和伺服器之間建立持久連線。

下方列出的三則初始化訊息;Initialized Notification 攜帶 session ID,且不會收到任何結果回傳。

初始連線設定

這個流程的開始方式與任何 MCP 連線相同:

  • 客戶端向伺服器發送 Initialize Request
  • 伺服器以包含特殊 mcp-session-id 標頭的 Initialize Result 回應
  • 客戶端發送帶有 session ID 的 Initialized Notification

這個 session ID 至關重要——它能唯一識別客戶端,並且必須包含在所有後續的請求中。

SSE 變通方法

初始化完成後,客戶端可以發出 GET 請求以建立伺服器發送事件連線。這會建立一個長時間存在的 HTTP 回應,伺服器可以隨時利用它將訊息串流回客戶端。

GET mcp-server.com/mcp/ 帶有 mcp-session-id 標頭,並由可任意長時間保持開啟的 SSE 回應來回覆。

這個 SSE 連線是實現伺服器對客戶端通訊的關鍵。伺服器現在可以透過這個持久通道發送請求、通知和其他訊息。

工具呼叫與雙重 SSE 連線

當客戶端進行工具呼叫時,情況會變得更複雜。系統會建立兩個獨立的 SSE 連線:

在來自 MCP 伺服器的兩個 SSE 回應之間,客戶端發送帶有 mcp-session-id 標頭的 Call Tool Request POST。

  • 主要 SSE 連線: 用於伺服器發起的請求,並會無限期保持開啟
  • 工具專屬 SSE 連線: 為每次工具呼叫建立,並在工具結果發送後自動關閉

訊息路由

不同類型的訊息會透過不同的連線進行路由:

  • 進度通知: 透過主要 SSE 連線發送
  • 日誌訊息與工具結果: 透過工具專屬 SSE 連線發送

Call Tool Request POST 發送至 mcp-server.com/mcp/,帶有 mcp-session-id 標頭;SSE 回應可以保持任意長時間的開啟狀態。

會打破變通方法的設定旗標

StreamableHTTP 包含兩個重要的設定選項:

  • stateless_http
  • json_response

將這些設為 True 可能會破壞 SSE 變通機制。在某些情境下,您可能會想啟用這些旗標,但這樣做會限制依賴伺服器對客戶端通訊的完整 MCP 功能。

重點整理

StreamableHTTP 比其他 MCP 傳輸方式更為複雜,因為它必須繞過 HTTP 的限制。基於 SSE 的變通方法使完整的 MCP 功能得以在 HTTP 上運作,但理解雙連線模型對於除錯和最佳化至關重要。

在使用 StreamableHTTP 建構 MCP 應用程式時,請記住初始化後的所有請求都需要 session ID,而系統會自動管理多個 SSE 連線,以處理不同類型的伺服器對客戶端通訊。