はじめに
互換性のある OAuth 2.1 または OpenID Connect プロバイダーを選択する
MCP 仕様では、認可 (Authorization) に関していくつかの 特定の要件 があります:
- OAuth 2.1 IETF DRAFT
- OAuth 2.0 認可サーバーメタデータ (RFC 8414)
- OAuth 2.0 動的クライアント登録プロトコル (RFC 7591)
最後の 2 つは必須ではありませんが、最初のものは安全かつ準拠した実装を確保するために必要です。
新しい MCP ドラフトでは、RFC 8414 が認可サーバー(プロバイダー)に必須となります。新しいドラフトが確定次第、ドキュメントを更新します。
互換性のある MCP プロバイダーリスト で、プロバイダーがサポートされているか確認できます。
MCP Auth SDK をインストールする
MCP Auth は Python と TypeScript の両方で利用可能です。他の言語やフレームワークのサポートが必要な場合はお知らせください!
- Python
- Node.js
pip install mcpauth
または、pipenv や poetry などお好みのパッケージマネージャーを利用できます。
npm install mcp-auth
または、pnpm や yarn などお好みのパッケージマネージャーを利用できます。
MCP Auth を初期化する
最初のステップは、プロバイダーの認可サーバーメタデータで MCP Auth インスタンスを初期化することです。プロバイダーが次のいずれかに準拠している場合:
組み込み関数を使ってメタデータを取得し、MCP Auth インスタンスを初期化できます:
- Python
- Node.js
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
)
)
import { MCPAuth, fetchServerConfig } from 'mcp-auth';
const mcpAuth = new MCPAuth({
server: await fetchServerConfig('<auth-server-issuer>', { type: 'oidc' }), // または 'oauth'
});
メタデータ URL やエンドポイントを手動で指定する必要がある場合は、他の MCP Auth 初期化方法 をご覧ください。
メタデータエンドポイントをマウントする
現在の MCP 仕様に準拠するため、MCP Auth は OAuth 2.0 認可サーバーメタデータエンドポイント (/.well-known/oauth-authorization-server
) を MCP サーバーにマウントします:
- Python
- Node.js
from starlette.applications import Starlette
app = Starlette(routes=[
mcp_auth.metadata_route(),
])
import express from 'express';
const app = express();
app.use(mcpAuth.delegatedRouter());
メタデータ内の URL はそのまま保持されるため、認可サーバーの役割は完全にプロバイダーに委譲されます。/.well-known/oauth-authorization-server
にアクセスして MCP サーバーでメタデータエンドポイントをテストできます。
なぜメタデータエンドポイントだけなのか?
公式 SDK では /authorize
や /token
などの認可エンドポイントをマウントする認証ルーターが提供されている場合がありますが、私たちがそうしない理由は次の通りです:
- メタデータエンドポイントのみをマウントすることで、プロバイダーの機能を最大限活用でき、「車輪の再発明」を避け、MCP サーバーに不要な複雑さを持ち込まずに済みます。
- MCP サーバーの役割をリソースサーバーへ移行する 取り組みも進行中であり、OAuth 2.0 保護リソースメタデータ (RFC 9728) が必要となります。つまり、MCP サーバーは 今後は認可ロジックを一切処理せず(メタデータエンドポイントも含む)、プロバイダーに認証 (Authentication) と認可 (Authorization) を委ねるリソースサーバーとしてのみ機能します。
新しい MCP 仕様が確定次第、MCP Auth も対応予定です。それまでは現行仕様に対応したバージョンをご利用いただけます。
Bearer 認証ミドルウェアを利用する
MCP Auth インスタンスを初期化したら、Bearer 認証ミドルウェアを適用して MCP ルートを保護できます:
- Python
- Node.js
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)],
),
])
import express from 'express';
import { MCPAuth } from 'mcp-auth';
const app = express();
const server = new McpServer(/* ... */);
const mcpAuth = new MCPAuth({
/* ... */
});
app.use(mcpAuth.bearerAuth('jwt', { requiredScopes: ['read', 'write'] }));
上記の例では、jwt
トークンタイプを指定し、read
と write
のスコープを必須としています。これにより JWT (JSON Web Token) を自動的に検証し、認証済みユーザー情報を含むオブジェクトが生成されます。
JWT (JSON Web Token) について初めて聞いた方もご安心ください。ドキュメント内で必要に応じて説明します。簡単な紹介は Auth Wiki もご覧いただけます。
Bearer 認証の設定について詳しくは、Bearer 認証の設定 をご覧ください。
MCP 実装で認証情報を取得する
Bearer 認証ミドルウェアを適用すると、MCP 実装内で認証済みユーザー(またはアイデンティティ)の情報にアクセスできます:
- Python
- Node.js
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
ツールハンドラーの第 2 引数に authInfo
オブジェクトが含まれ、認証済みユーザー情報を利用できます:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
const server = new McpServer(/* ... */);
server.tool('add', { a: z.number(), b: z.number() }, async ({ a, b }, { authInfo }) => {
// ここで `authInfo` オブジェクトを使って認証情報にアクセスできます
});
次のステップ
引き続き、MCP Auth を MCP サーバーと統合するエンドツーエンドの例や、MCP クライアントでの認証フローの扱い方について学んでいきましょう。