深入解讀 MCP 協議最新版本的 4 大升級【上】:傳輸機制與安全授權

MCP 協議的最新修訂版本(2025-03-26)已經在路上,儘管 SDK 尚未發佈,但規範內容已經基本定型,前期的各種解讀也在網絡上陸續出現。我們將結合官方文檔、Github 上的 PR 與社區討論等,爲大家深入解讀該版本中的四個較大的升級。

我們將分成兩篇進行介紹。

01

Streamable HTTP 傳輸模式

在新版本中,MCP 引入了新的 Streamable HTTP 遠程傳輸機制來代替之前的 HTTP+SSE 的遠程傳輸模式(stdio 的本地模式不變)。

  1. 背景與動機

當前 MCP 採用的 HTTP+SSE 的遠程傳輸模式總結爲(圖中未涵蓋服務端發送請求如 Sampling 的場景):

這種方式存在問題有:

  1. 變更說明

最新規範的 Streamable HTTP 傳輸機制總結爲(圖中未涵蓋服務端發送請求如 Sampling 的場景):

    這裏的主要變化包括:

StreamableHTTP 在舊方案的基礎上,提升了傳輸層的靈活性與健壯性:

  1. 影響與應用

    新的應用客戶端必須設置 Accept 頭支持兩種返回類型(application/json 和 text/event-stream),以同時支持服務器返回 JSON 或 SSE 流。如:

POST /mcp HTTP/1.1
Host: mcp.example.com
Accept: application/json, text/event-stream
Content-Type: application/json
{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}

如果不要求流式輸出,則服務端返回一個 JSON 響應;如果要求流式模式,則響應頭爲 Content-Type: text/event-stream,並以 SSE 事件方式發送一個或多個 JSON-RPC 消息。

    客戶端通過以下方式開啓 SSE 的長連接,用來接收服務端的異步的消息推送:

GET /mcp HTTP/1.1
Host: mcp.example.com
Accept: text/event-stream

 此外,爲了實現兼容性,你需要小心的控制客戶端與服務端應用對連接方式的支持,以兼容舊版本的對端。具體我們將在 SDK 升級後進行解析。

02

引入基於 OAuth 2.1 的授權框架

MCP 2025-03-26 規範引入了基於 OAuth 2.1 的授權框架,爲基於 HTTP 交互的客戶端與服務端提供了標準化的安全機制。當然,這種機制僅適用於遠程模式,對於通過標準輸入輸出(stdio)傳輸的交互則無需考慮此規範。

如果你對 OAuth 流程毫無概念,參考文後方法獲得一個極簡的例子代碼。

  1. 背景與動機

目前的大多數 MCP 應用採用基於 stdio 的本地傳輸模式,部署幾乎是一對一的,安全邊界清晰。但在基於 SSE 傳輸模式的遠程 MCP 服務端場景中,尤其是隨着第三方 MCP 共享服務的迅速增長,缺少統一的授權機制導致無法安全地管理對服務端功能的訪問權限。引入 OAuth 2.1 可以使資源所有者通過標準的授權流程安全地控制訪問權限。 

例如, 在企業環境中,一個 MCP 服務端可能連接內部數據庫或敏感 API,通過 OAuth2.1 授權,可以確保只有經過用戶同意的 MCP 客戶端才能訪問這些資源。這使構建安全的 AI 智能體成爲可能:用戶可隨時撤銷授權令牌,終止其對數據的訪問。此外,由於使用標準 OAuth 流程,企業開發者可以方便地將現有企業的身份認證與授權服務整合到 MCP 服務器中。

  1. 變更說明

若選擇遵循 MCP 新規範中的 OAuth2.1 授權流程,MCP 客戶端在向服務端的受限資源發起請求之前,必須先通過瀏覽器引導用戶授權訪問 MCP 服務端,完成 OAuth 授權流程以獲取訪問的安全令牌(Access Token)。隨後,客戶端需攜帶此令牌訪問 MCP 服務端;若服務器返回未授權響應,並提示客戶端啓動授權流程。

此外,規範建議 MCP 服務端支持 OAuth 動態客戶端註冊和授權服務器元數據發現,以便客戶端能夠自動獲取服務器的授權端點信息。

整體授權流程描述如下圖: 

【角色定義】

【流程描述】

(1) 客戶端發現授權服務器的元數據

客戶端訪問標準路徑(一般爲. well-known/oauth-authorization-server),希望自動發現服務器的授權端點、令牌端點等元數據。這不是一種必須實現的服務端機制,所以有兩種可能的返回結果:

(2) 動態客戶端註冊(可選)

在調用授權服務的過程中,需提供一個 client_id(比如調用 Google 的 OAuth 授權服務,需要在後臺創建獲得 client_id)。若 MCP 服務端支持動態客戶端註冊,客戶端無需預先註冊,即可在運行時直接向 MCP 服務端進行註冊,從而獲得一組新的 client_id、client_secret 以及其他授權配置信息。

如果您的 MCP 服務可能擁有衆多客戶端應用,建議實現動態客戶端註冊機制。

(3) 客戶端準備授權請求(包含 PKCE 參數)

PKCE(Proof Key for Code Exchange)是 OAuth 2.1 強制要求的保護機制,旨在防範 “授權碼被攔截盜用” 的攻擊。它涉及一組 PKCE 參數,包括:

在授權過程中,客戶端會攜帶 code_challenge 以獲取授權碼;在使用授權碼交換安全令牌時,客戶端再提供 code_verifier。授權服務器將驗證 code_verifier 與先前的 code_challenge 是否匹配,只有在匹配的情況下,纔會發放令牌,從而有效防止授權碼被劫持。

(4) 啓動瀏覽器,進行用戶授權

客戶端打開系統瀏覽器,跳轉到 MCP 服務端的授權地址。並帶上這些信息:client_id、redirect_uri、response_type=code、scope、code_challenge 等。此時瀏覽器界面顯示讓用戶確認授權,比如 “授權 MCP xxx 訪問你的 MCP 服務資源”。

(5) 用戶同意授權

用戶在瀏覽器上點擊 “允許授權”(也可能需要額外的輸入驗證信息)。

(6) 服務端驗證並生成授權碼

此時服務端驗證用戶身份與授權請求是否合法,如果用戶同意授權,就生成一個臨時的授權碼(code)。

(7) 授權碼回調到客戶端

MCP 服務端通過瀏覽器重定向到 MCP 客戶端前面提供的重定向 URI(redirect_uri),並在參數中附帶授權碼 code=xxx。

(8) 客戶端接收回調

客戶端捕獲這個回調請求,拿到授權碼;並使用授權碼訪問 MCP 服務端的令牌頒發的端點,換取訪問令牌(Access Token),一般需要帶上 code,code_verifier,client_id 等信息。MCP 服務端驗證授權碼合法,且 code_verifier 驗證通過,就會下發安全令牌。

(9) 客戶端使用安全令牌調用 MCP 服務端功能

客戶端拿到安全令牌後,正式調用 MCP 服務端的受保護功能。令牌在 HTTP 的請求頭中攜帶即可:

POST /mcp
Authorization: Bearer {access_token}
Content-Type: application/json

接着就可以發起 MCP 調用,比如 tool/call、resource/fetch 等。

  1. 影響和應用

總體而言,OAuth 授權框架的加入對原有功能不造成破壞,但要求在需要安全接入的場景下,客戶端和服務器都進行相應升級來配合這一流程。

我們將在下篇接着介紹另外兩項 MCP 協議升級:批處理與工具註解。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ip2d62wFzQj51uaRORvflw