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

チュートリアル: 私は誰?

このチュートリアルでは、MCP Auth をセットアップしてユーザーを認証 (Authentication) し、認可 (Authorization) サーバーからアイデンティティ情報を取得する手順を案内します。

このチュートリアルを完了すると、次のことができるようになります:

  • ✅ MCP Auth を使ってユーザーを認証 (Authentication) する基本的な理解
  • ✅ ユーザーのアイデンティティ情報を取得するツールを提供する MCP サーバー

概要

このチュートリアルでは、以下のコンポーネントを使用します:

  • MCP サーバー:MCP 公式 SDK を使ってリクエストを処理するシンプルな MCP サーバー
  • MCP inspector:MCP サーバーのためのビジュアルテストツール。OAuth / OIDC クライアントとして認可フローを開始し、アクセス トークン (Access token) を取得する役割も担います。
  • 認可 (Authorization) サーバー:ユーザーのアイデンティティを管理し、アクセス トークン (Access token) を発行する OAuth 2.1 または OpenID Connect プロバイダー

これらのコンポーネント間のやり取りを高レベルで示した図です:

認可 (Authorization) サーバーを理解する

ユーザーのアイデンティティ情報の取得

このチュートリアルを完了するには、認可 (Authorization) サーバーがユーザーのアイデンティティ情報を取得するための API を提供している必要があります:

Logto は OpenID Connect プロバイダーであり、標準の userinfo エンドポイント をサポートしてユーザーのアイデンティティ情報を取得できます。

userinfo エンドポイントにアクセスできるアクセス トークン (Access token) を取得するには、少なくとも openidprofile の 2 つのスコープ (Scope) が必要です。スコープ (Scope) の設定については後述しますので、そのまま読み進めてください。

Dynamic Client Registration

Dynamic Client Registration はこのチュートリアルでは必須ではありませんが、MCP クライアントの登録プロセスを認可 (Authorization) サーバーと自動化したい場合に便利です。詳細は Dynamic Client Registration は必要ですか? をご覧ください。

MCP サーバーのセットアップ

MCP 公式 SDK を使って、認可 (Authorization) サーバーからユーザーのアイデンティティ情報を取得する whoami ツール付きの MCP サーバーを作成します。

新しいプロジェクトの作成

mkdir mcp-server
cd mcp-server
uv init # または `pipenv` や `poetry` で仮想環境を作成

MCP SDK と依存パッケージのインストール

pip install "mcp[cli]" starlette uvicorn

または uvpoetry など、お好みのパッケージマネージャーを使用してください。

MCP サーバーの作成

まず、whoami ツールを実装した MCP サーバーを作成します。

whoami.py というファイルを作成し、次のコードを追加します:

from mcp.server.fastmcp import FastMCP
from starlette.applications import Starlette
from starlette.routing import Mount
from typing import Any

mcp = FastMCP("WhoAmI")

@mcp.tool()
def whoami() -> dict[str, Any]:
    """現在のユーザー情報を返すツール"""
    return {"error": "Not authenticated"}

app = Starlette(
    routes=[Mount('/', app=mcp.sse_app())]
)

サーバーを起動します:

uvicorn whoami:app --host 0.0.0.0 --port 3001

MCP サーバーの検証

MCP inspector のクローンと起動

MCP サーバーが起動したので、MCP inspector を使って whoami ツールが利用できるか確認します。

現状の実装制限のため、MCP inspector をフォークし、認証 (Authentication)・認可 (Authorization) により柔軟かつ拡張可能にしました。オリジナルリポジトリにもプルリクエストを提出済みです。

MCP inspector を起動するには、以下のコマンドを使用します(Node.js が必要です):

git clone https://github.com/mcp-auth/inspector.git
cd inspector
npm install
npm run dev

その後、ブラウザで http://localhost:6274/(またはターミナルに表示された他の URL)にアクセスして MCP inspector を開きます。

MCP inspector を MCP サーバーに接続

進む前に、MCP inspector で次の設定を確認してください:

  • Transport TypeSSE に設定
  • URL:MCP サーバーの URL を設定(例:http://localhost:3001/sse

「Connect」ボタンをクリックして、MCP inspector が MCP サーバーに接続できるか確認します。問題なければ MCP inspector に「Connected」ステータスが表示されます。

チェックポイント: whoami ツールの実行

  1. MCP inspector の上部メニューで「Tools」タブをクリック
  2. 「List Tools」ボタンをクリック
  3. ページに whoami ツールが表示されているはずです。クリックして詳細を開きます。
  4. 右側に「Run Tool」ボタンが表示されるのでクリック
  5. ツールの結果として {"error": "Not authenticated"} という JSON レスポンスが表示されます。

MCP inspector first run

認可 (Authorization) サーバーとの連携

このセクションを完了するには、いくつかの考慮事項があります:

認可 (Authorization) サーバーの発行者 (Issuer) URL

通常は認可 (Authorization) サーバーのベース URL です(例:https://auth.example.com)。プロバイダーによっては https://example.logto.app/oidc のようなパスが付く場合もあるので、ドキュメントを確認してください。

認可 (Authorization) サーバーのメタデータ取得方法
  • 認可 (Authorization) サーバーが OAuth 2.0 Authorization Server Metadata または OpenID Connect Discovery に準拠していれば、MCP Auth の組み込みユーティリティで自動取得できます。
  • 準拠していない場合は、MCP サーバーの設定でメタデータ URL やエンドポイントを手動指定する必要があります。詳細はプロバイダーのドキュメントを参照してください。
MCP inspector を認可 (Authorization) サーバーのクライアントとして登録する方法
  • 認可 (Authorization) サーバーが Dynamic Client Registration をサポートしていれば、このステップはスキップできます。MCP inspector が自動でクライアント登録します。
  • サポートしていない場合は、MCP inspector を手動でクライアント登録する必要があります。
ユーザーのアイデンティティ情報の取得方法と認可リクエストパラメーターの設定方法
  • OpenID Connect プロバイダーの場合:認可フロー開始時に openidprofile のスコープ (Scope) をリクエストする必要があります。これにより、認可 (Authorization) サーバーから返されるアクセス トークン (Access token) で userinfo エンドポイント にアクセスできます。

    ※ 一部プロバイダーは userinfo エンドポイントをサポートしていない場合があります。

  • OAuth 2.0 / OAuth 2.1 プロバイダーの場合:アクセス トークン (Access token) でユーザーのアイデンティティ情報を取得する方法や必要なパラメーターはプロバイダーのドキュメントを参照してください。

プロバイダーごとに要件は異なりますが、以下の手順で MCP inspector と MCP サーバーをプロバイダー固有の設定で連携できます。

MCP inspector をクライアントとして登録

Logto との連携はシンプルです。OpenID Connect プロバイダーであり、標準の userinfo エンドポイント をサポートしています。

Logto は Dynamic Client Registration をまだサポートしていないため、MCP inspector を Logto テナントのクライアントとして手動登録する必要があります:

  1. MCP inspector を開き、「OAuth Configuration」ボタンをクリック。Redirect URL (auto-populated) の値(例:http://localhost:6274/oauth/callback)をコピー
  2. Logto Console(またはセルフホスト Logto Console)にサインイン
  3. 「Applications」タブで「Create application」をクリック。ページ下部で「Create app without framework」をクリック
  4. アプリケーション詳細を入力し、「Create application」をクリック:
    • Select an application type:「Single-page application」を選択
    • Application name:例「MCP Inspector」など任意の名前
  5. 「Settings / Redirect URIs」セクションで、先ほどコピーした Redirect URL (auto-populated) を貼り付け、「Save changes」をクリック
  6. 上部カードに「App ID」が表示されるのでコピー
  7. MCP inspector に戻り、「OAuth Configuration」の「Client ID」欄に「App ID」を貼り付け
  8. 「Auth Params」欄に {"scope": "openid profile email"} を入力。これで Logto から返されるアクセス トークン (Access token) に必要なスコープ (Scope) が含まれます。

MCP auth のセットアップ

MCP サーバープロジェクトで MCP Auth SDK をインストールし、認可 (Authorization) サーバーのメタデータを使うように設定します。

まず mcpauth パッケージをインストール:

pip install mcpauth

または uvpoetry など、お好みのパッケージマネージャーを使用してください。

MCP Auth は初期化のために認可 (Authorization) サーバーのメタデータが必要です。プロバイダーごとに設定方法が異なります:

発行者 (Issuer) URL は Logto Console のアプリケーション詳細ページ「Endpoints & Credentials / Issuer endpoint」セクションで確認できます。例:https://my-project.logto.app/oidc

whoami.py を更新して MCP Auth の設定を追加します:

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

auth_issuer = '<issuer-endpoint>'  # 発行者エンドポイントに置き換えてください
auth_server_config = fetch_server_config(auth_issuer, type=AuthServerType.OIDC)
mcp_auth = MCPAuth(server=auth_server_config)

次に、MCP インスペクターから提供されたアクセス トークン (Access token) を使用して認可サーバーからユーザーのアイデンティティ情報を取得するカスタム アクセス トークン (Access token) 検証関数を作成します。

import pydantic
import requests
from mcpauth.exceptions import (
    MCPAuthTokenVerificationException,
    MCPAuthTokenVerificationExceptionCode,
)
from mcpauth.types import AuthInfo

def verify_access_token(token: str) -> AuthInfo:
    """
    提供された Bearer トークンを認可サーバーからユーザー情報を取得して検証します。
    トークンが有効な場合、ユーザー情報を含む `AuthInfo` オブジェクトを返します。

    :param token: MCP インスペクターから受け取った Bearer トークン。
    """

    issuer = auth_server_config.metadata.issuer
    endpoint = auth_server_config.metadata.userinfo_endpoint # プロバイダーは userinfo エンドポイントをサポートしている必要があります
    if not endpoint:
        raise ValueError(
            "Userinfo エンドポイントが認証サーバーメタデータに設定されていません。"
        )

    try:
        response = requests.get(
            endpoint,
            headers={"Authorization": f"Bearer {token}"}, # 標準の Bearer トークンヘッダー
        )
        response.raise_for_status() # HTTP エラーの場合は例外を発生させる
        json = response.json() # JSON レスポンスをパース
        return AuthInfo(
            token=token,
            subject=json.get("sub"), # 'sub' はサブジェクト(ユーザー ID)の標準クレーム
            issuer=issuer, # メタデータから発行者を使用
            claims=json, # userinfo エンドポイントから返されたすべてのクレーム (Claims)(JSON フィールド)を含める
        )
    # `AuthInfo` は Pydantic モデルなので、バリデーションエラーは通常レスポンスが期待された構造と一致しない場合に発生します
    except pydantic.ValidationError as e:
        raise MCPAuthTokenVerificationException(
            MCPAuthTokenVerificationExceptionCode.INVALID_TOKEN,
            cause=e,
        )
    # リクエスト中に発生するその他の例外を処理
    except Exception as e:
        raise MCPAuthTokenVerificationException(
            MCPAuthTokenVerificationExceptionCode.TOKEN_VERIFICATION_FAILED,
            cause=e,
        )

MCP サーバーの更新

あと少しです!MCP Auth のルートとミドルウェア関数を適用し、whoami ツールが実際のユーザーアイデンティティ情報を返すよう MCP サーバーを更新します。

@mcp.tool()
def whoami() -> dict[str, Any]:
    """現在のユーザー情報を返すツール"""
    return (
        mcp_auth.auth_info.claims
        if mcp_auth.auth_info # Bearer auth ミドルウェアでセットされます
        else {"error": "Not authenticated"}
    )

# ...

bearer_auth = Middleware(mcp_auth.bearer_auth_middleware(verify_access_token))
app = Starlette(
    routes=[
        # メタデータルート(`/.well-known/oauth-authorization-server`)を追加
        mcp_auth.metadata_route(),
        # Bearer auth ミドルウェアで MCP サーバーを保護
        Mount('/', app=mcp.sse_app(), middleware=[bearer_auth]),
    ],
)

チェックポイント: 認証 (Authentication) 付きで whoami ツールを実行

MCP サーバーを再起動し、ブラウザで MCP inspector を開きます。「Connect」ボタンをクリックすると、認可 (Authorization) サーバーのサインインページにリダイレクトされます。

サインイン後 MCP inspector に戻り、前回と同じ手順で whoami ツールを実行してください。今回は認可 (Authorization) サーバーから返されたユーザーのアイデンティティ情報が表示されるはずです。

MCP inspector whoami tool result

情報

MCP Auth Python SDK リポジトリ で MCP サーバー(OIDC 版)の完全なコードを確認できます。

締めくくり

🎊 おめでとうございます!チュートリアルを無事完了しました。ここまでの内容を振り返りましょう:

  • whoami ツール付きの基本的な MCP サーバーのセットアップ
  • MCP Auth を使った MCP サーバーと認可 (Authorization) サーバーの連携
  • MCP Inspector でユーザー認証 (Authentication) とアイデンティティ情報の取得

さらに発展的なトピックとして、以下もぜひご検討ください:

他のチュートリアルやドキュメントもぜひご覧いただき、MCP Auth を最大限に活用してください。