跳到內容

MCP Server 的 OAuth 2.1 要求

MCP Server 在 OAuth 2.1 中扮演 Resource Server 角色,負責接受帶有 Access Token 的請求並驗證其合法性。以下是 MCP 規範對 Server 的具體要求。

MCP Server MUST 實作 RFC 9728(OAuth 2.0 Protected Resource Metadata),讓 Client 知道該向哪個 Authorization Server 取得 Token。

回傳的 metadata MUST 包含 authorization_servers 欄位,至少列出一個 Authorization Server。

MCP Server MUST 實作以下至少一種方式讓 Client 取得 metadata:

方式一:WWW-Authenticate Header

在回傳 401 Unauthorized 時,透過 WWW-Authenticate header 提供 resource_metadata URL:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource",
scope="files:read"

Server SHOULDWWW-Authenticate header 中包含 scope 參數,告訴 Client 該請求需要哪些權限。

方式二:Well-Known URI

在 well-known 路徑上提供 metadata:

  • /.well-known/oauth-protected-resource/{server-path}(有 path 時)
  • /.well-known/oauth-protected-resource(根路徑)

與 RFC 9728 的差異:RFC 9728 對 resource_metadata 參數的要求是 MAY,MCP 將 Server 端提升為 MUST(兩種 discovery 機制至少實作一種)。Client 端則 MUST 兩種都支援——有 resource_metadata header 時優先使用,否則 fallback 到 well-known URI。

MCP 的 Authorization Server MUST 提供至少一種 Discovery 機制:

要求等級
實作 OAuth 2.1MUST
提供 AS Metadata(RFC 8414)或 OIDC DiscoveryMUST(至少一個)
支援 Client ID Metadata DocumentsSHOULD
支援 Dynamic Client Registration(RFC 7591)MAY
Public Client 的 Refresh Token 必須做 rotationMUST
核發短效 Access TokenSHOULD
所有端點使用 HTTPSMUST
精確比對 redirect URIMUST

Authorization Server 若使用 RFC 8414:

  • MUST 在 metadata 中包含 code_challenge_methods_supported 欄位

Authorization Server 若使用 OIDC Discovery:

  • MUST 在 metadata 中包含 code_challenge_methods_supported 欄位(OIDC 規範本身沒有定義此欄位,但 MCP 要求必須提供)

若 Authorization Server 支援 Client ID Metadata Documents:

  • SHOULD 在 AS Metadata 中宣告 client_id_metadata_document_supported: true
  • 收到 URL 格式的 client_id 時,SHOULD 前往該 URL 取得 metadata 文件
  • MUST 驗證文件中的 client_id 與 URL 完全一致
  • MUST 驗證 authorization request 中的 redirect_uri 有出現在 metadata 的 redirect_uris

MCP Server 作為 Resource Server,MUST 遵循 OAuth 2.1 Section 5.2 驗證 Access Token。

要求等級
驗證 Token 是否專門為自己核發(audience)MUST
拒絕非自己 Authorization Server 核發的 TokenMUST
不接受也不轉發其他 Token(Token passthrough 禁止)MUST
無效或過期的 Token 回傳 401MUST

如果 MCP Server 需要呼叫上游 API,它可能同時扮演 OAuth Client 的角色。此時:

  • 對上游 API 使用的 Token MUST 是由上游的 Authorization Server 核發的,是一個獨立的 Token
  • MUST NOT 把從 MCP Client 收到的 Token 直接轉發給上游

這是為了防止 Confused Deputy Problem

收到 Token scope 不足的請求時:

  • Server SHOULD 回傳 403 Forbidden,並在 WWW-Authenticate header 中包含:
    • error="insufficient_scope"
    • scope="required_scope1 required_scope2"(所需的 scope)
    • resource_metadata(Protected Resource Metadata URL)
HTTP/1.1 403 Forbidden
WWW-Authenticate: Bearer error="insufficient_scope",
scope="files:read files:write",
resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource"

Server MUST 回傳適當的 HTTP 狀態碼:

狀態碼說明使用時機
401Unauthorized需要授權或 Token 無效
403ForbiddenScope 不足
400Bad Request授權請求格式錯誤