メインコンテンツまでスキップ

サードパーティ AI エージェントによる MCP サーバーへのアクセスを有効化

このガイドでは、 mcp-auth を使用して Logto を MCP サーバーと統合し、標準の OpenID Connect フローを利用してユーザーを認証し、アイデンティティ情報を安全に取得する方法を説明します。

このガイドで学べること:

  • MCP サーバーの認可サーバーとして Logto を設定する方法
  • MCP サーバーに「whoami」ツールをセットアップし、現在のユーザーのクレーム (Claims) を返す方法
  • サードパーティ AI エージェント (MCP クライアント) でフローをテストする方法

このチュートリアルを終えると、MCP サーバーは次のことができるようになります:

  • Logto テナントでユーザーを認証 (Authentication) する
  • 「whoami」ツールの呼び出し時に、subusernamenameemail などのクレーム (Claims) を返す

サードパーティ AI エージェント (MCP クライアント) と自分の MCP クライアントの違い

例を見てみましょう。あなたが MCP サーバーを運用し、メールアクセスや自動化を管理している開発者だとします。

公式メールアプリ(自分の MCP クライアント)

  • ユーザーがメールを閲覧・管理できる公式メールアプリを提供します。
  • 動作イメージ:公式メールアプリは Logto を使って MCP サーバーに接続し、ユーザーを認証 (Authentication) します。Alice がサインインすると、追加の許可画面なしで自動的にメールへアクセスできます(信頼されたアプリのため)。

サードパーティ AI エージェント(サードパーティ MCP クライアント)

  • MCP サーバーを中心にエコシステムを構築しているため、他の開発者が「SmartMail AI」(メールを要約したり会議を自動でスケジューリングする AI アシスタント)をサードパーティクライアントとして統合します。
  • 動作イメージ:SmartMail AI(サードパーティ MCP クライアント)は、MCP サーバー経由でユーザーのメールへアクセスしたいと考えています。Alice が自分のアカウントで SmartMail AI にサインインすると:
    • SmartMail AI がメールやカレンダーの閲覧許可を求める同意画面 (Consent screen) が表示されます。
    • Alice はこのアクセスを許可または拒否できます。
    • Alice が同意したデータのみが SmartMail AI と共有され、明示的な再同意なしに追加データへアクセスすることはできません。

このアクセス(権限)制御により、MCP サーバーがすべてのデータを管理していても、SmartMail AI のようなサードパーティアプリはユーザーが明示的に許可した範囲のデータしかアクセスできません。このプロセスは MCP サーバーのアクセス制御実装によって強制され、回避できません。

まとめ

クライアント種別同意画面が必要?誰が管理?
公式メールアプリ自分のメールアプリケーションいいえ開発者(あなた)
サードパーティ AI エージェントSmartMail AI アシスタントはい他の開発者
注記:

自分の AI エージェントやアプリと MCP サーバーを統合したい場合は、 Logto で MCP ベースのアプリに認証 (Authentication) を有効化する ガイドを参照してください。

前提条件

  • Logto Cloud (またはセルフホスト型)テナント
  • Node.js または Python 環境

アーキテクチャの理解

  • MCP サーバー:MCP クライアントにツールやリソースを提供するサーバー。
  • MCP クライアント:認証 (Authentication) フローを開始し、統合をテストするために使用されるクライアント。このガイドではサードパーティ AI エージェントをクライアントとして使用します。
  • Logto:OpenID Connect プロバイダー(認可 (Authorization) サーバー)として機能し、ユーザーアイデンティティを管理します。

規範的でないシーケンス図でプロセス全体の流れを示します:

注記:

MCP は急速に進化しているため、上記の図は最新の状態ではない場合があります。最新情報は mcp-auth ドキュメントを参照してください。

Logto でサードパーティ AI エージェントを設定する

サードパーティ AI エージェントが MCP サーバー にアクセスできるようにするには、Logto で サードパーティアプリ を設定する必要があります。このアプリは AI エージェントを表し、認証 (Authentication) および認可 (Authorization) に必要な認証情報を取得するために使用されます。

Logto で開発者がサードパーティアプリを作成できるようにする

マーケットプレイスを構築する場合や、開発者が Logto でサードパーティアプリを作成できるようにしたい場合は、Logto Management API を活用してプログラム的にサードパーティアプリを作成できます。これにより、開発者は自分のアプリケーションを登録し、認証 (Authentication) に必要な認証情報を取得できます。

クライアント登録プロセスを処理する独自のサービスをホストする必要があります。このサービスは Logto Management API と連携し、開発者に代わってサードパーティアプリを作成します。

または、Logto コンソールで手動でサードパーティアプリを作成し、プロセスに慣れることもできます。

Logto でサードパーティアプリを手動で作成する

テストやアドホックな統合のために、Logto コンソールでサードパーティアプリを手動で作成できます。これは、完全なクライアント登録フローを実装せずに統合をすばやくテストしたい場合に便利です。

  1. Logto コンソールにサインインします。

  2. アプリケーションアプリケーションの作成サードパーティアプリ -> OIDC を選択します。

  3. アプリ名やその他の必須項目を入力し、アプリケーションの作成 をクリックします。

  4. 権限 タブをクリックし、ユーザー セクションで「追加」をクリックします。

  5. 開いたダイアログで -> ユーザーデータ -> profileemail 権限を選択し、保存 をクリックします。

  6. サードパーティアプリで、openid profile email 権限(スコープ)をリクエストするようにスコープを設定します。

    注意: OIDC には openid が必須であり、profileemail は前のステップで追加した権限です。

  7. サードパーティアプリの リダイレクト URI を適切に設定します。Logto 側のリダイレクト URI も忘れずに更新してください。

サードパーティアプリの権限

内部的には、サードパーティアプリは標準的な OAuth 2.0 / OIDC クライアントにすぎません。つまり、任意の OAuth 2.0 / OIDC ライブラリやフレームワークを使って Logto と統合できます(開発者自身またはサードパーティ開発者が実装可能です)。

OAuth 2.0 や OIDC に慣れていない場合は、「従来型 Web」クイックスタートガイドのいずれかから始めることをおすすめします。

注意すべき点は以下の通りです:

  1. Logto では現在、サードパーティアプリは「従来型 Web」アプリである必要があります。つまり、クライアントシークレットを安全に保存するためにバックエンドサーバー(またはバックエンド・フォー・フロントエンド)が必要です。
  2. 多くのクイックスタートガイドはファーストパーティアプリ向けに書かれていますが、サードパーティアプリ統合の参考としても利用できます。
  3. 主な違いは、サードパーティアプリでは同意画面が表示され、ユーザーにデータへのアクセス許可を明示的に求める点です。

詳細は クイックスタートガイド で確認できます。

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

プロジェクトの作成と依存関係のインストール

mkdir mcp-server
cd mcp-server
uv init # または独自のプロジェクト構成を使用
uv add "mcp[cli]" starlette uvicorn mcpauth # または任意のパッケージマネージャーを使用

Logto で MCP 認証 (Authentication) を構成する

先ほどコピーした発行者 (Issuer) エンドポイント <your-logto-issuer-endpoint> を忘れずに置き換えてください。

whoami.py 内:

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

auth_issuer = '<your-logto-issuer-endpoint>'
auth_server_config = fetch_server_config(auth_issuer, type=AuthServerType.OIDC)
mcp_auth = MCPAuth(server=auth_server_config)

トークン検証の実装

アクセス トークン (Access token) を検証しユーザー情報を取得するため、次のようにアクセス トークン (Access token) 検証を実装します:

import requests
from mcpauth.types import AuthInfo

def verify_access_token(token: str) -> AuthInfo:
endpoint = auth_server_config.metadata.userinfo_endpoint
response = requests.get(
endpoint,
headers={"Authorization": f"Bearer {token}"},
)
response.raise_for_status()
data = response.json()
return AuthInfo(
token=token,
subject=data.get("sub"),
issuer=auth_server_config.metadata.issuer,
claims=data,
)

"whoami" ツールの実装

次に、クライアントから送信されたアクセス トークン (Access token) を使用して userinfo エンドポイントにリクエストし、現在のユーザーのアイデンティティ クレーム (Claims) を返す "whoami" ツールを実装します。

注記:

現時点の SDK バージョンでは Streamable HTTP トランスポートの公式サポートがないため、例として SSE トランスポートを使用しています。理論的には、HTTP 互換の任意のトランスポートを利用できます。

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

mcp = FastMCP("WhoAmI")

@mcp.tool()
def whoami() -> dict:
"""
現在のユーザーのアイデンティティ情報を返します。
"""
return (
mcp_auth.auth_info.claims
if mcp_auth.auth_info
else {"error": "Not authenticated"}
)

bearer_auth = Middleware(mcp_auth.bearer_auth_middleware(verify_access_token))
app = Starlette(
routes=[
mcp_auth.metadata_route(), # 発見用の OIDC メタデータを提供
Mount('/', app=mcp.sse_app(), middleware=[bearer_auth]),
],
)

サーバーの起動:

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

統合をテストする

  1. MCP サーバーを起動します。
  2. AI エージェントを起動します。
  3. クライアントで whoami ツールを呼び出し、現在のユーザーのクレーム (Claims) を取得します。
  4. クライアントは 401 Unauthorized レスポンスを受け取り、ユーザーを Logto へリダイレクトして認証 (Authentication) します。
  5. 認証 (Authentication) が成功すると、クライアントはアクセス トークン (Access token) を受け取り、それを使って MCP サーバーへリクエストを送信します。
  6. クライアントはアクセス トークン (Access token) を使って MCP サーバーからクレーム (Claims) を取得できるようになります。

完全な MCP サーバーコードは mcp-auth/python リポジトリで確認できます。