2026年9月8日火曜日

MCP Toolbox for DatabasesをOracle IAMでOIDC認証する

先日の記事「GoogleのMCP Toolbox for DatabasesをOracle Databaseで使用してみる」にて構成したOracle Databaseに接続するMCP Toolbox for Databasesに、OpenID Connectによる認証を実装します。IdPにはOracle IAMを使用します。

MCP Toolbox for DatabaseでのOpenID Connectの設定については、以下で説明されています。

Documentation / Configuration / Authentication / Generic OIDC Auth
Generic OIDC Auth

MCPとしての認証は2. MCP Authorizationに記載があります。ドキュメントに記載されている設定例は以下です。
kind: authService
name: my-generic-auth
type: generic
audience: ${YOUR_TOKEN_AUDIENCE}
authorizationServer: https://your-idp.example.com
mcpEnabled: true
scopesRequired:
  - read
  - write
kind, name, type, mcpEnabled(これはtrueにする)は、MCP Toolboxとしての設定です。IdP側(今回はOracle IAM)から入手する必要がある設定値はaudienceauthorizationServerscopesRequiredになります。

MCP Toolboxとしては、authorizationServerの値はアクセス・トークンのiss(Issuer)の値と一致し、かつ、/.well-known/openid-configurationを加えることでOIDCのDiscovery URLとなることを期待しているようです。そのDiscovery URLより取得できるドキュメントに含まれる属性jwks_uriより、JWTの署名検証用の公開鍵を取得します。

Oracle IAMが発行するトークンのデフォルトの発行者(Issuer - issの値)はhttps://identity.oraclecloud.com/です。この発行者に/.well-known/openid-configurationをつけてもOIDC Discovery URLにはならないため、Oracle IAM側の発行者は変更する必要があります。

audienceはOracle IAMのドメインに作成した統合アプリケーションプライマリ・オーディエンスとして設定した値になります。プライマリ・オーディエンスを設定するには、統合アプリケーションにリソース・サーバーを構成する必要があります。

Oracle IAMではクライアントから提示されたスコープにより、リソース・サーバーが選択されます。そのため、リソース・サーバーにスコープを設定し、そのスコープがユーザー認証時にサーバーに送信されるように接続元のクライアント(今回はMCP Inspector)を構成する必要があります。リソース・サーバーに構成されたスコープは、MCP ToolboxのscopesRequiredに含めます。

MCP Toolboxに設定する値は、上記のように決まります。

以下より、Oracle IAMのドメインでの設定を行います。作業には費用がかからないドメイン・タイプFreeの、Defaultドメインを使用します。

Oracle Cloudのコンソールから、アイデンティティとセキュリティドメインを開きます。

ドメインDefaultを開きます。


ドメインURLをコピーします。このURLに/.well-known/openid-configurationを付けるとOIDC Discovery URLとなります。この値がMCP ToolboxのauthorizationServerの値の元になります。MCP ToolboxはauthorizationServerの値がIssuerの値であることを期待しているため、このドメインURL発行者とする必要があります。ドメインURLの末尾のポート番号:443があると発行者として設定できないため、発行者として登録するURLから:443を削除します。

結果としてMCP ToolboxのauthorizationServerとして設定する値は、ドメインURLから末尾の:443を除いたURLになります。


発行者を上記のドメインURLに変更します。

セキュリティ・タブを選択し、Oauth設定 - デフォルトのトークン発行ポリシーOAuth設定の編集を開きます。


デフォルトのトークン発行ポリシー発行者ドメインURL(ポート番号無し)を設定します。

変更の保存をクリックします。


デフォルトのトークン発行ポリシー発行者が更新されたことを確認します。


統合アプリケーションを作成します。

統合アプリケーション・タブを開き、アプリケーションの追加をクリックします。


アプリケーションのタイプとして機密アプリケーションを選択します。

ワークフローの起動をクリックします。


作成する機密アプリケーションの名前MCP Hotelsとします。説明は何でもよいのですが、Search for a hotelと記述しています。認証と認可権限付与を認可として実施オンにします。

以上を設定して送信します。


統合アプリケーションMCP Hotelsが作成されます。


OAuth構成・タブを選択し、OAuth構成の編集をクリックします。リソース・サーバー構成クライアント構成の双方を実施します。


クライアント構成はリソース・サーバーの構成を参照するため、リソース・サーバー構成を先に実施します。

このアプリケーションをリソース・サーバーとして今すぐ構成します、を選択します。選択すると、設定画面が表示されます。

必須ではありませんが、トークン・リフレッシュの許可オンにします。

プライマリ・オーディエンスはMCP Toolbox for Databasesの構成に依存します。今回はローカルホストでデフォルトのポート番号である5000番で接続を待ち受けるように構成しているため、プライマリ・オーディエンスは以下になります。最後にスラッシュをつけます。

http://localhost:5000/

これはMCP Toolboxのaudienceとして設定する値になります。また、MCP Toolboxの起動オプションの--toolbox-urlとして指定する値でもあります。

スコープの追加オンにし、スコープとしてmcphotelsを追加します。

ここで設定したスコープmcphotelsは、MCP ToolboxのscopesRequiredに含めます

リソース・サーバーを構成したところで、一旦送信します。


追加したスコープmcphotelsは、表示名MCP Hotels説明Search for a hotel.としています。


先ほどと同様にOAuth構成の編集を開き、今度はクライアント構成を実施します。

このアプケーションをクライアントとして今すぐ構成します、を選択します。選択すると、設定画面が表示されます。

認可認可される権限付与タイプとして、クライアント資格証明(これはおそらく無くてもよい)、リフレッシュ・トークン(リソース・サーバーでリフレッシュ・トークンを構成し、クライアントからもリフレッシュ・トークンを要求する場合に必要)、認可コード(必須)をチェックします。

HTTPS以外のURLを許可オンにし、今回クライアントとして使用するMCP InspectorのリダイレクトURLとして、以下の4つを設定します。

http://localhost:6274/oauth/callback
http://localhost:6274/oauth/callback/debug
http://127.0.0.1:6274/oauth/callback
http://127.0.0.1:6274/oauth/callback/debug

Claude CodeやOpenAI Codexから呼び出す場合は、それぞれのアプリケーションで決められているリダイレクトURLを追加します。

ページの下に移動し、リソースの追加をオンにします。

スコープの追加をクリックし、スコープとして統合アプリケーションMCP Hotelshttp://localhost:5000/mcphotels(リソース・サーバーのプライマリ・オーディエンスhttp://localhost:5000/とスコープmcphotelsが連結)を追加します。

以上で送信します。


リソースの追加を行う画面です。

統合アプリケーションMCP Hotelsより範囲(スコープのこと)の選択にある、スコープhttp://localhost:5000/mcphotelsにチェックを入れます。


ここで選択したスコープhttp://localhost:5000/mcphotelsは、MCP InspectorのOAuth設定のスコープに含めます

以上で統合アプリケーションMCP Hotelsの構成は完了です。

OAuth構成よりクライアントIDクライアント・シークレットを取得します。

これらの値は、MCP InspectorのOAuth SettingsClient IDClient Secretとして設定します。


作成した統合アプリケーションMCP Hotelsアクティブ化します。


ユーザー・タブを開き、この統合アプリケーションで認証できるユーザーを割り当てます。

ユーザーの割当てをクリックします。


今回の作業を行なっているユーザーを割り当てます。


作成した統合アプリケーションで認証できるユーザーが割り当てられました。


以上で、Oracle IAMでの作業は完了です。

先日の記事で作成したtools.yamlに以下を追記します。OIDC認証の設定oracle-iam-authに加え、アクセス・トークンのsubクレームの値を表示するツールshow_sub_claimを定義しています。

ツールshow_sub_claimの第1パラメータとしてuser_idを設定しています。この値はauthServicesで設定しているoracle-iam-auth、つまりOracle IAMによるOIDC認証で得られたアクセス・トークンのsubの値になります。この値はSELECT文のバインド変数:1に割り当てられます。user_idはパラメータとして定義しているため、MCP Inspectorからツールを呼び出す際に値の入力を求められます。値を入力してもアクセス・トークンのsubの値で置き換えられますが、requiredfalseを設定(デフォルトはtrueなので、必ず値が必要)することにより、user_idを入力しなくてもツールを実行できるようにしています。
---
kind: authService
name: oracle-iam-auth
type: generic
authorizationServer: [発行者として設定したドメインURL(ポート番号無し)]
audience: http://localhost:5000/
mcpEnabled: true
scopesRequired:
  - openid
  - mcphotels
---
# show sub claim in access token
kind: tool
name: show_sub_claim
type: oracle-sql
source: my-oracle-instance
statement: |
  SELECT :1 sub from dual
description: |
  Show sub claim value in the access token
parameters:
  - name: user_id 
    type: string
    required: false
    description: Auto-populated from token
    authServices:
      - name: oracle-iam-auth
        field: sub
authRequired:
  - oracle-iam-auth
MCP Toolboxを実行する際に--toolbox-urlとしてaudience(resource)を指定します。

./toolbox --config tools.yaml --toolbox-url http://localhost:5000/

mcp-toolbox % ./toolbox --config tools.yaml --toolbox-url http://localhost:5000/

2026-09-08T13:20:06.905274+09:00 INFO "Starting MCP Toolbox for Databases version 1.10.0+binary.darwin.arm64.21f972f" 

2026-09-08T13:20:06.983898+09:00 INFO "Initialized 1 sources: my-oracle-instance" 

2026-09-08T13:20:08.061104+09:00 INFO "Initialized 1 authServices: orcle-iam-auth" 

2026-09-08T13:20:08.061141+09:00 INFO "Initialized 0 embeddingModels: " 

2026-09-08T13:20:08.06143+09:00 INFO "Initialized 4 tools: show_sub_claim, execute_sql, list_all_hotels, list_hotels_in_the_location" 

2026-09-08T13:20:08.061451+09:00 INFO "Initialized 0 prompts: " 

2026-09-08T13:20:08.061472+09:00 INFO "Initialized 1 groups: default" 

2026-09-08T13:20:08.061722+09:00 WARN "wildcard (*) allows any website to access the primitives. This creates a security risk regardless of whether you are in a production or local development environment. Recommended to use --allowed-origins with specific local addresses." 

2026-09-08T13:20:08.061774+09:00 WARN "wildcard (*) hosts allow any domain to access this resource, making it vulnerable to DNS rebinding attacks regardless of whether you are in a production or local development environment. For improved security, use the --allowed-hosts flag to specify trusted domains." 

2026-09-08T13:20:08.062055+09:00 INFO "Server ready to serve!" 



MCP Inspectorに登録済みのMCP ToolboxのServer Settingsを開きます。


OAuth SettingsClient IDClient SecretScopesを設定します。Scopesに設定する値は以下です。指定するスコープにプライマリ・オーディエンスを含めます。

openid http://localhost:5000/mcphotels


以上で設定はすべて完了です。

動作確認を実施します。

MCP InspectorよりMCP ToolboxのMCPサーバーに接続します。


Oracle CloudのIdentity Domainへのサインインが求められます。


Authenticatorを使ったユーザー認証が行われサインインが完了すると、アプリケーションMCP Hotelsへのアクセス許可が要求されます。

アクセスを許可すると、MCP Toolboxへの接続が完了します。


Toolsタブを開き、ツールshow_sub_claimを選択します。

パラメータuser_idには値を設定できますが、user_idの値はアクセス・トークンのsubの値に置き換えられるため、設定する意味はありません。

user_idには値を設定せずExecute Toolを実行します。


ツールの実行結果として、SUBにサインインに使用したメール・アドレスが返されます。


ツールoracle-sqlに設定するSELECT文にOIDCで認証したユーザー名を渡せるため、ツールの検索範囲をユーザーごとに制限することができます。

今回の記事は以上になります。