メインコンテンツまでスキップ
バージョン: Latest(v3.0) 🔥

MCP Oauth2

1. はじめに

mcp-oauth2Kong plugin/policy であり、MCP HTTP endpointsOAuth2/OIDC を使用して保護します(一般的には Keycloak と共に使用されます)。

提供される機能:

  • Client discovery を通じて /.well-known/oauth-protected-resource (RFC 9728) により、MCP クライアントは認証サーバーとサポートされているスコープを学ぶことができます。
  • JWT access-token validation: iss (発行者)、aud (受信者)、および JWKS を使用して署名を確認します。
  • (オプション)authorization by scope/role (例: mcp_scopes のようなクレームから)を、スコープを許可された MCP JSON-RPC メソッドにマッピングすることによって提供します。

2. APIM コンソールの設定

ステップ 1: バックエンドを MCP サーバーに設定した新しい API を作成します。

MCP サーバー: http://wikipedia-mcp.default.svc.cluster.local:8080/mcp 

VS Code からこの API を通じて MCP サーバーにアクセスする必要があるため、VS Code は追加のパスセグメントを持つ URL をサポートしていないので、Base Path を “/” (パスなし)に設定します。

ステップ 2: mcp-oauth2 ポリシーを API に適用します。

ステップ 3: mcp-oauth2 ポリシーボタンをクリックして、以下の設定詳細を表示します。

Section 1: PROTECTED RESOURCE METADATA (RFC 9728)

FieldTypeRequiredDefaultDescription
Protected Resource Metadata PathstringYes/.well-known/oauth-protected-resource• プラグインがRFC 9728の保護されたリソースメタデータ文書を提供するURLパスです。
• MCPクライアントはこれを取得して、認証サーバーとサポートされているスコープを発見します。
• ほとんど変更する必要はありません。
Authorization Servers:
  • 信頼された認証サーバーの配列です。このMCPエンドポイントのトークンを発行するKeycloakレルム(または他のOAuth2プロバイダー)ごとに1つのエントリを追加します。
  • +をクリックして、さらにエントリを追加します。 | Field | Type | Required | Description | | --- | --- | --- | --- | | Url | string | Yes | • public URL of the authorization server(クライアントが認証/トークンを取得する場所)です。
    • jwks_uriが相対パスの場合、base URL for building the JWKS URLでもあります。

    Example: https://keycloak-demo.apimags.skcloud.io/realms/master | | Issuer | string | Yes | • JWTのiss(発行者)クレームに対して一致します。
    • トークンの発行者が一致しない場合、拒否されます。
    exact string matchである必要があります。 • プロトコル、ホスト、ポート、パスを含む(末尾のスラッシュは不要です)。
    Find it at: {realm-url}/.well-known/openid-configuration → 発行者フィールド。 | | Audience | string | Yes | • JWTのaud(受信者)クレームに対して一致します。
    • 他のサービス向けのトークンが受け入れられないようにします。
    Must exactly match KeycloakのAudience Mapperで設定された値です。 | | JWKS URI | 文字列 | はい | • プラグインがJWT署名を検証するために認証サーバーの公開署名鍵(JWKS)を取得するエンドポイント。
    • 次のようになります: Relative path (Urlに追加される): /.well-known/jwks.json Absolute URL (そのまま使用される): https://keycloak-demo.apimags.skcloud.io /realms/master/protocol/openid-connect/certs  Kongがクライアントと同じホスト名を介して認証サーバーにアクセスできない場合は、絶対URLを使用してください(例: Docker/k8sネットワーキング)。  Default: /.well-known/jwks.json |
Section 2: SUPPORTED OAUTH2 SCOPES 

FieldTypeRequiredDefaultDescription
Scopes Supported文字列の配列はいクライアントに要求するスコープを伝えるために、保護されたリソースメタデータ文書に記載されています。これは informational only • クライアントの発見をガイドしますが、何も強制しません。
各スコープを入力し、Enter を押して追加します。

Example: mcp:tools
Section 3: TOKEN VALIDATION

FieldTypeRequiredDefaultDescription
Authorization Header Name文字列はい認証 • Authorization Header Name = トークン検証のためにサーバー/プラグインがアクセス・トークンを見つけるために読むHTTPヘッダー名。
• 通常は Authorization のままにします。
• クライアントは次のようにトークンを送信します: Authorization: Bearer <access_token>
• APIが異なるヘッダー
にトークンを期待する場合のみ変更します(例: X-Authorization)。

Section 4: UPSTREAM TOKEN FORWARDING 

FieldTypeRequiredDefaultDescription
Forward Authorization Headerbooleanいいえfalse• false - MCPサーバーに転送する前にAuthorizationヘッダーを削除します(より安全なデフォルト)。
• true - Bearer <token> ヘッダーを上流のMCPサーバーに転送します。
• MCPサーバーがトークンを読み取る必要がある場合は有効にします(例:ユーザーのアイデンティティやクレームを抽出するため)。
Section 5: ACL

FieldTypeRequiredDefaultDescription
Enable ACLbooleanいいえfalsefalse - 有効なトークンはすべてのMCPメソッドへのアクセスを許可します(トークンの検証は引き続き行われます)。
true - トークンを検証した後、プラグインはトークンのスコープ/ロールをScope Method Mappingと照らし合わせて、特定のJSON-RPCメソッドが許可されているかどうかを確認します。
ACL Claimstringいいえscope• ユーザーの権限を含むJWTクレームの名前。プラグインはこのクレームを読み取り、その値をACLチェックに使用します。
• 一般的な値:
→ mcp_scopes - Keycloakプロトコルマッパーからのカスタムクレーム

⚠️ Keycloakプロトコルマッパーでトークンクレーム名をexactly matchする必要があります。
Section 6: SCOPE METHOD MAPPING

各スコープ/ロールを、そのスコープが呼び出すことを許可されているMCP JSON-RPCメソッドのリストにマッピングします。Enable ACLがtrueのときのみ有効です。

FieldTypeRequiredDescription
ScopestringYes (per entry)スコープ/ロール名。JWTクレームに指定された値と一致する必要があります ACL Claim.
Example: mcp:tools
Methodsarray of stringsYes (per entry)このスコープが呼び出すことを許可されているMCP JSON-RPCメソッド名。各メソッド名を入力し、Enterを押して追加します。
Example: tools/list, tools/call

⚠️ When ACL is enabled but Scope Method Mapping is empty: すべてのリクエストは拒否されます。少なくとも1つのマッピングを構成する必要があります。

💡 Permissions are additive: ユーザーは、メソッドを許可するために1つのスコープのみが必要です。トークン内のいずれかのスコープがメソッドを許可している場合、アクセスが許可されます。

Section 7: TIMEOUTS & CACHING
FieldTypeRequiredDefaultDescription
Token Cache TTL (s)numberNo300検証されたトークンがKongの共有メモリにキャッシュされる時間(秒単位)。この期間中、同じトークンでの繰り返しリクエストはJWTデコードと署名検証をスキップします。
キャッシュされていても、プラグインはすべてのリクエストでJWT expクレームを再チェックし、期限切れのトークンを無効にします。
HTTP Timeout (ms)numberNo10000認証サーバーからJWKS(公開署名キー)を取得するためのHTTPリクエストのタイムアウト(ミリ秒単位)。この時間内に認証サーバーが応答しない場合、トークンの検証は失敗します。

• 認証サーバーが遅いネットワーク上にある場合やコールドスタート中の場合は増加させてください。
• 認証サーバーに到達できない場合は、より早く失敗するために減少させてください。

3. Keycloak Setup

3.1. Keycloak OAuth2 Foundation

これらの手順は、MCPクライアントが認証サーバーを発見し、正しいオーディエンスでトークンを取得できるようにKeycloakを構成します。

3.1.1 Create the Client Scope

What this does: クライアントがリクエストできる名前付きスコープを作成します。クライアントがスコープを要求すると、 Keycloak はそれをトークンに含めます - このスコープに添付されたマッパーも発火します。

Step 1: Navigate to Keycloak Admin → Client scopes → Create client scope

Step 2: input data → Click Save.

FieldValueWhy
Namemcp:toolsあなたのMCPクライアントがリクエストするスコープ名
ProtocolOpenID Connect標準のOAuth2/OIDCプロトコル
Display on consent screenONログイン中にクライアントがリクエストしている内容を示します
Consent screen textAccess MCP toolsユーザー向けの人間が読める説明
Include in token scopeONスコープ値がJWTスコープクレームに表示されることを保証します

3.1.2 Add the Audience Mapper

What this does: アクセス・トークンに aud (オーディエンス) クレームを追加します。このプラグインは、トークンのオーディエンスが設定された値と一致することを検証します - これにより、other サービス用に発行されたトークンがあなたのMCPエンドポイントで受け入れられないようにします。

Step 1: Navigate to The mcp:tools scope you just created → Mappers tab → Configure a new mapper → Select Audience

Step 2: input data → Click Save
FieldValueWhy
Nameaudience-configこのマッパーの説明的な名前
Included Custom Audienceaudience-nameKongプラグイン設定のaudienceフィールドと一致する必要があります
Add to access tokenONプラグインはアクセストークンを読み取ります。IDトークンではありません。
Add to ID tokenOFFIDトークンはクライアントアプリ用であり、リソースサーバー用ではありません。

3.1.3. 新しいクライアントを作成

What this does: MCPクライアントがKeycloakに接続するためのクライアントを作成します。

Step 1: Navigate to Clients → Create client

Step 2: input data Client ID → Click Next.

FieldValueDescription
Client IDMcp-clientクライアントID
Step 3: Config → Click Next.

Step 4: Config → Click Save.

3.2. Keycloak: グループベースのACL設定

このセクションでは、fine-grained access controlを設定して、異なるユーザーに異なるMCP権限を付与します。アーキテクチャは次のとおりです。

グループ → レルムロール → プロトコルマッパー → "mcp_scopes" JWTクレーム → ACL

3.2.1. レルムロールを作成

What these are: 名前付き権限層。各ロールは、ユーザーが呼び出すことを許可されたMCPメソッドのセットを表します。ロール名はJWTのmcp_scopesクレームに表示されます。

Step 1: Navigate to: Realm roles → Create role (repeat for each)

Step 2: For each role, just fill in the Role name and click Save. No additional configuration needed.
Role NamePurposeExample MCP Methods
mcp:toolsツールへのアクセスtools/list
mcp:resourcesリソースへのアクセスresources/read

3.2.2. グループの作成

What these are: ユーザーのための組織的コンテナです。ユーザーごとに役割を割り当てるのではなく、グループに役割を割り当て、その後ユーザーをグループに追加します。

Step 1: Navigate to: Groups → Create group

Step 2: To create a sub-group: Click on the parent group → Create child group
Group NameDescription
mcp-member基本メンバーアクセス
mcp-adminすべてのMCPツール、リソースへのフルアクセス

3.2.3. グループに役割を割り当てる

Step 1: Navigate to Groups → Click a group → Role mapping tab → Assign role
GroupRoles to Assign
Mcp-adminmcp:tools, mcp:resources
Mcp-membermcp:tools

クリックして Assign

3.2.4. プロトコルマッパーの作成 (mcp_scopes クレーム)

What this does: Keycloakにユーザーの領域役割(mcp:プレフィックスでフィルタリングされた)を、アクセス トークン内のmcp_scopesというカスタムクレームとして含めるように指示します。これは、KongプラグインがACLの決定を行うために読み取るクレームです。 Step 4: Navigate to Client scopes → mcp:tools → Mappers tab → Add mapper → By configuration → Select User Realm Role

Step 2: input data

FieldValueWhy
Namemcp-scopes-mapper説明的な名前
Mapper Typeユーザー領域ロールユーザーの領域ロールをトークンクレームにマッピングします
Token Claim Namemcp_scopesKongプラグイン設定のacl_claimと一致する必要があります
MultivaluedONユーザーは複数のロールを持つことができます
Add to access tokenONプラグインはアクセストークンを読み取ります
Add to ID tokenOFFリソースサーバーの検証には必要ありません
Add to userinfoOFF必要ありません

Critical: Token Claim Name (mcp_scopes) は、Kongプラグイン設定のacl_claimフィールドと一致する必要があります。不一致があると、プラグインはトークン内の権限を見つけることができません。

3.2.5. ユーザーをグループに追加

Step 1: Navigate to Users → Click on a user → Groups tab → Join group → Select the appropriate group

Step 2: Click Join
UserGroupResulting JWT mcp_scopes
canhng1Mcp-memberMcp:tools, Mcp:resources
adminmcp-adminMcp:resources

4. Visual Studio Codeを使用したテスト

4.1. Kongプロキシをローカルに転送

4.2. 新しいMCPサーバーを作成する

Vs Codeを開き、Ctrl + Shift + Pを押して、MCP: Add serverを選択します…。HTTPを選択し、http://localhost:8100.を入力します。サーバーにVisual Studio Code内で使用するためのユニークな名前を付けます。mcp.jsonには、次のようなエントリが表示されるはずです:

4.3. サーバーを起動し、Keyloak認証を使用してモックMCPサーバーに接続する

ログイン成功、22のツールでモックMCPサーバーに接続されました。