跳轉到主要內容

快速開始

選擇相容的 OAuth 2.1 或 OpenID Connect 提供者

MCP 規範對授權 (Authorization) 有一些特定要求

  • OAuth 2.1 IETF DRAFT
  • OAuth 2.0 授權伺服器中繼資料 (Authorization Server Metadata)(RFC 8414
  • OAuth 2.0 動態用戶端註冊協議(Dynamic Client Registration Protocol,RFC 7591

雖然後兩者不是強制性的,但第一項是確保安全且合規實作所必需的。

註解

在新的 MCP 草案中,RFC 8414 將成為授權伺服器(提供者)的強制要求。待新草案定稿後,我們會更新文件。

你可以查看 MCP 相容提供者清單來確認你的提供者是否受支援。

安裝 MCP Auth SDK

MCP Auth 同時支援 Python 與 TypeScript。如果你需要其他語言或框架的支援,歡迎告訴我們!

pip install mcpauth

或使用你偏好的其他套件管理工具,例如 pipenv 或 poetry。

初始化 MCP Auth

第一步是用你的提供者授權伺服器中繼資料初始化 MCP Auth 實例。如果你的提供者符合下列其中一項:

你可以使用內建函式來擷取中繼資料並初始化 MCP Auth 實例:

from mcpauth import MCPAuth
from mcpauth.config import AuthServerType
from mcpauth.utils import fetch_server_config

mcp_auth = MCPAuth(
    server=fetch_server_config(
      '<auth-server-url>',
      type=AuthServerType.OIDC # 或 AuthServerType.OAUTH
    )
)

如果你需要手動指定中繼資料 URL 或端點,請參考 其他初始化 MCP Auth 的方式

掛載中繼資料端點

為符合現行 MCP 規範,MCP Auth 會將 OAuth 2.0 授權伺服器中繼資料端點(/.well-known/oauth-authorization-server)掛載到你的 MCP 伺服器:

from starlette.applications import Starlette

app = Starlette(routes=[
    mcp_auth.metadata_route(),
])

中繼資料中的 URL 會保持原樣,因此授權伺服器的角色完全委託給提供者。你可以在 MCP 伺服器上造訪 /.well-known/oauth-authorization-server 測試中繼資料端點。

為什麼只掛載中繼資料端點?

你可能會看到官方 SDK 提供一個 auth router,會掛載 /authorize/token 等授權端點。我們不這麼做的原因如下:

  1. 僅掛載中繼資料端點,讓你能充分利用提供者的所有能力,無需「重新造輪子」並為 MCP 伺服器引入不必要的複雜度。
  2. 目前也正推動將 MCP 伺服器角色轉為資源伺服器 (resource server),並要求支援 OAuth 2.0 受保護資源中繼資料(Protected Resource Metadata,RFC 9728)。這代表 MCP 伺服器將不再處理任何授權邏輯(包含中繼資料端點),僅作為資源伺服器,並依賴提供者進行驗證 (Authentication) 與授權 (Authorization)。
註解

當新 MCP 規範定稿後,我們會更新 MCP Auth 以支援新版規範。在此之前,你可以繼續使用目前版本,與現行規範相容。

使用 Bearer 驗證中介軟體

初始化 MCP Auth 實例後,你可以套用 Bearer 驗證中介軟體來保護你的 MCP 路由:

from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.routing import Mount
from mcpauth import MCPAuth
from mcp.server.fastmcp import FastMCP

mcp = FastMCP()
mcp_auth = MCPAuth(
  # 用你的授權伺服器設定初始化
)
bearer_auth = mcp_auth.bearer_auth_middleware(
    "jwt", required_scopes=["read", "write"]
)

app = Starlette(routes=[
    mcp_auth.metadata_route(),
    Mount(
        "/",
        app=mcp.sse_app(),
        middleware=[Middleware(bearer_auth)],
    ),
])

在上述範例中,我們指定了 jwt 權杖類型,並要求 readwrite 權限範圍 (scopes)。這會自動驗證 JWT (JSON Web Token),並將驗證後的使用者資訊填入物件中。

資訊

沒聽過 JWT (JSON Web Token) 嗎?別擔心,繼續閱讀文件,我們會在需要時說明。你也可以參考 Auth Wiki 取得快速介紹。

更多 Bearer 驗證設定資訊,請參考 設定 Bearer 驗證

在 MCP 實作中取得驗證資訊

套用 Bearer 驗證中介軟體後,你可以在 MCP 實作中存取已驗證使用者(或身分)的資訊:

套用 Bearer 驗證中介軟體後,MCP Auth 會將已驗證使用者資訊存入 context 變數。你可以在 MCP 工具處理函式中這樣存取:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP()
mcp_auth = MCPAuth(
  # 用你的授權伺服器設定初始化
)

@mcp.tool()
def add(a: int, b: int):
    """
    一個加總兩數的工具。
    已驗證使用者資訊會在 context 中可用。
    """
    auth_info = mcp_auth.auth_info # 於目前 context 取得驗證資訊
    if auth_info:
        print(f"Authenticated user: {auth_info.claims}")
    return a + b

下一步

繼續閱讀,學習如何將 MCP Auth 與你的 MCP 伺服器整合的端到端範例,以及如何在 MCP 用戶端處理驗證流程。