メインコンテンツにスキップ

はじめに

互換性のある OAuth 2.1 または OpenID Connect プロバイダーを選択する

MCP 仕様では、認可 (Authorization) に関していくつかの 特定の要件 があります:

最後の 2 つは必須ではありませんが、最初のものは安全かつ準拠した実装を確保するために必要です。

メモ

新しい 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 はそのまま保持されるため、認可サーバーの役割は完全にプロバイダーに委譲されます。/.well-known/oauth-authorization-server にアクセスして MCP サーバーでメタデータエンドポイントをテストできます。

なぜメタデータエンドポイントだけなのか?

公式 SDK では /authorize/token などの認可エンドポイントをマウントする認証ルーターが提供されている場合がありますが、私たちがそうしない理由は次の通りです:

  1. メタデータエンドポイントのみをマウントすることで、プロバイダーの機能を最大限活用でき、「車輪の再発明」を避け、MCP サーバーに不要な複雑さを持ち込まずに済みます。
  2. MCP サーバーの役割をリソースサーバーへ移行する 取り組みも進行中であり、OAuth 2.0 保護リソースメタデータ (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 のスコープを必須としています。これにより JWT (JSON Web Token) を自動的に検証し、認証済みユーザー情報を含むオブジェクトが生成されます。

情報

JWT (JSON Web Token) について初めて聞いた方もご安心ください。ドキュメント内で必要に応じて説明します。簡単な紹介は Auth Wiki もご覧いただけます。

Bearer 認証の設定について詳しくは、Bearer 認証の設定 をご覧ください。

MCP 実装で認証情報を取得する

Bearer 認証ミドルウェアを適用すると、MCP 実装内で認証済みユーザー(またはアイデンティティ)の情報にアクセスできます:

Bearer 認証ミドルウェアが適用されると、MCP Auth は認証済みユーザー情報をコンテキスト変数に保存します。MCP ツールハンドラー内で次のようにアクセスできます:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP()
mcp_auth = MCPAuth(
  # 認証サーバー設定で初期化
)

@mcp.tool()
def add(a: int, b: int):
    """
    2 つの数値を加算するツール。
    認証済みユーザー情報はコンテキストで利用可能です。
    """
    auth_info = mcp_auth.auth_info # 現在のコンテキストで認証情報にアクセス
    if auth_info:
        print(f"Authenticated user: {auth_info.claims}")
    return a + b

次のステップ

引き続き、MCP Auth を MCP サーバーと統合するエンドツーエンドの例や、MCP クライアントでの認証フローの扱い方について学んでいきましょう。