2026年7月8日水曜日

ORDS 26.2のMCPサーバーを構成する - Okta編

先日の記事「ORDS 26.2のMCPサーバーを構成する - Auth0編」では、MCPサーバーの認証/認可にAuth0を使用しました。今回の記事では、IdPとしてOktaを使用します。

ORDS MCPサーバーから接続するデータベースおよびORDSのコンテナの準備は、記事「ORDS 26.2のMCPサーバーを構成する - Auth0編」と同じです。ORDS MCPサーバーが動作するコンテナを実行しAuth0の構成を始める直前まで、Auth0の記事にそって作業を進めます。

Oktaのアプリケーション構成


作業の多くは記事「Role based JWT profileで保護したORDS REST APIにアクセスする - Okta Integrator編」と重なりますが、省略せずに紹介します。

Okta Admin Consoleにサインインします。

ディレクトリグループを開き、グループを追加します。


追加するグループの名前ORDS_MCP_HRとします。これは、ORDS MCPサーバーで、コネクション・プールmcp-hrへのアクセスを許可するロールとして使用します。説明は「Role for HR Schema」と記述します。

保存をクリックします。


グループに再度アクセスし、グループ一覧を更新します。

作成したグループORDS_MCP_HRを開き、ユーザーを割り当てます。


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


グループORDS_MCP_HRにユーザーを割り当てます。


ユーザーの割り当てを完了します。


アプリケーション・メニューのアプリケーションを開き、アプリ統合を作成します。



サインイン方法としてOIDC - OpenID Connectを選択します。OIDCを選択するとアプリケーションタイプの選択が現れます。アプリケーションタイプシングルページアプリケーションを選択します。

へ進みます。


アプリ統合を設定します。

アプリ統合名ORDS MCP2とします。

所有の証明トークンリクエストのDPoP(Demonstrating Proof of Posession)ヘッダーを必須にするは、チェックを外します。

付与タイプリフレッシュトークンにチェックを入れます。

サインインリダイレクトURIにMCP InspectorのRedirect URLを設定します。ポート番号6274が使用されている場合は、ポート番号が異なるかもしれません。

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

サインアウトリダイレクトURIは何を設定すべきか不明なので、x をクリックして削除しておきます。

割り当てアクセス制御として選択されたグループにアクセスを制限を選択し、選択されたグループに先ほど作成したグループORDS_MCP_HRを含めます。

以上を設定し保存します。


アプリ統合としてORDS MCP2が作成されます。

クライアントIDはMCP InspectorのOAuth 2.0 FlowClient IDに設定する値です。メモしておきます。


セキュリティAPIを開き、認証サーバーを追加します。(タブには認可サーバーと書いてあります)


追加する認証サーバーの名前ORDSMCP2とします。

オーディエンスはORDS MCPサーバーのエンドポイントURLであるhttp://localhost:8585/mcpを設定します。このオーディエンスは、ORDSのグローバル・プロパティmcp.security.jwt.profile.audienceの値になります。

mcp.security.jwt.profile.audience = http://localhost:8585/mcp

説明としてORDS MCP Serverを入力します。

以上で保存します。


追加された認証サーバーの設定タブを開き、メタデータURIを確認します。


このメタデータURIを元に、ORDSのグローバル・プロパティの値を求めます。メタデータURIは以下の形式です。URLの最後の文字列が認証サーバーのIDになります。

https://integrator-XXXXXXX.okta.com/.well-known/oauth-authentication-server/oauth/{id}

グローバル・プロパティmcp.security.jwt.profile.authorization.server.urlの値は、以下になります。

mcp.security.jwt.profile.authorization.server.url = https://integrator-XXXXXXX.okta.com/oauth/{id}

ORDS MCPサーバーが認証サーバーのメタデータを取得するURLが有効かどうか確認します。

メタデータURIの/.well-known/oauth-authorization-serverの部分をURLの末尾に移動します。

https://integrator-XXXXXXX.okta.com/oauth2/{id}/.well-known/oauth-authorization-server

ブラウザに認証サーバーのメタデータが表示されるので、その中からissuerjwks_uriを取り出します。


グローバル・プロパティのmcp.security.jwt.profile.issuerとして、このissuerの値を設定します。また、mcp.security.jwt.profile.jwk.urlとして、このjwks_uriの値を設定します。

概ね、以下のような形式になります。

mcp.security.jwt.profile.issuer = https://integrator-XXXXXXX.okta.com/oauth/{id}
mcp.security.jwt.profile.jwk.url = https://integrator-XXXXSXX.okta.com/oauth2/{id}/v1/keys

mcp.security.jwt.profile.jwk.urlに設定するURL(jwks_uriの値)については、ブラウザから開いてみて存在を確認しておくとよいでしょう。

アクセス制御のためのロールを返すカスタム・クレームは、Auth0での構成と同じにするためroles2とします。よって、グローバル・プロパティmcp.security.jwt.profile.role.claim.nameの値は/roles2になります。

mcp.security.jwt.profile.role.claim.name = /roles2

これで、ORDS MCPサーバーに設定するグローバル・プロパティの値はすべて集まりました。

スコープ・タブを開き、スコープを追加します。


追加するスコープは、ORDS MCPサーバーのデフォルト・スコープである"urn:oracle:dbtools:ords:mcpserver:all"です。

スコープの名前はurn:oracle:dbtools:ords:mcpserver:allです。フレーズを表示に「Access to ORDS MCP Server」、説明に「Access to ORDS MCP Server」と記述します。

ユーザーの同意はどれでもよいですが、今回は必須を選択します。サービスをブロックデフォルトスコープメタデータチェックを外します。

以上でスコープを作成します。


ORDS MCPサーバーのデフォルト・スコープurn:oracle:dbtools:ords:mcpserver:allが追加されます。


クレーム・タブを開き、roles2scopeカスタム・クレームとして追加します。


追加するクレームの名前roles2とします。このクレームは、ORDS MCPサーバーが認識するロールを保持します。トークンタイプに含めるアクセス・トークンです。

値タイプグループを選択し、フィルター次で始まるORDS_を設定します。このフィルターにより、roles2クレームに先ほど作成したグループORDS_MCP_HRが含まれます。

クレームを無効化はチェックしません。

含める以下のスコープを選択し、スコープとして先ほど作成したORDS MCPサーバーのデフォルト・スコープurn:oracle:dbtools:ords:mcpserver:allを選択します。

以上で作成します。


同様の手順でscopeクレームを追加します。

追加するクレームの名前scopeとします。トークンタイプに含めるアクセストークン値タイプを選択し、として以下を記述します。

String.replace(Arrays.toCsvString(access.scope),","," ")

クレームを無効化はチェックせず、含めるいずれかのスコープを選択します。

以上で作成します。


roles2クレームとscopeクレームが作成されました。


アクセスポリシーを開き、ポリシーを追加します。


ポリシーの名前ORDS MCP2とします。説明に「ORDS MCP2」と記述し、次に割り当てる次のクライアントを選択し、クライアントにORDS MCP2を含めます。

以上でポリシーを作成します。


アクセスポリシーとしてORDS MCP2が作成されました。

ルールを追加します。


ルール名Defaultとします。デフォルトの設定は変更せず(最低限コア付与認証コードチェックされていれば動くはず)、ルールを作成します。


アクセス・ポリシーORDS MCP2とルールDefaultが作成されます。


トークンのプレビューを開き、これまでの設定で生成されるアクセス・トークンを確認します。

要求プロパティーOAuth/OIDCクライアントORDS MCP2付与タイプ認証コードユーザーサインインする予定のユーザースコープにORDS MCPサーバーのデフォルト・スコープであるurn:oracle:dbtools:ords:mcpserver:allを設定します。

以上でトークンのプレビューをクリックします。

生成されたトークンから、以下を確認します。
  • issの値がORDSのグローバル・プロパティmcp.security.jwt.profile.issuerに設定する予定の値と一致していること。
  • audの値がhttp://localhost:8585/mcp(グローバル・プロパティmcp.security.jwt.profile.audienceに設定する予定の値)であること。
  • scopeurn:oracle:dbtools:ords:mcpserver:allが含まれていること。
  • カスタム・クレームとしてroles2があり、値の配列にORDS_MCP_HRが含まれていること。

以上でOktaの設定は完了です。


ORDS MCPサーバーの構成



ORDSの構成に移ります。

コンテナに接続して、ORDSの構成コマンドを実行します。

docker exec -it ords-mcp bash

ords-mcp2 % docker exec -it ords-mcp bash

[oracle@aeba9d22c0f9 ~]$ 


ORDSのグローバル・プロパティを設定します。XXXXXの部分はOktaに作成したアプリケーションORDS MCP2のドメインの値、{id}は認証サーバーのIDに置き換えます。

ロールによるアクセス制御を行うため、mcp.security.jwt.profile.role.claim.name/roles2を設定しています。
ords --config /etc/ords/config config set --global feature.mcp true
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.issuer https://integrator-XXXXXXX.okta.com/oauth2/{id}
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.audience http://localhost:8585/mcp
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.jwk.url https://integrator-XXXXXXX.okta.com/oauth2/{id}/v1/keys
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.authorization.server.url https://integrator-XXXXXXX.okta.com/oauth2/{id}
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.role.claim.name /roles2
続いて、スキーマHRに接続するコネクション・プールとしてmcp-hrを構成します。ORDS MCPサーバーはコンテナ内で実行されているため、コンテナ外にあるデータベースの接続先としてhost.docker.internalを設定しています。

ロールによるアクセス制御を行うため、mcp.roleORDS_MCP_HRを設定しています。
ords --config /etc/ords/config config --db-pool mcp-hr set db.connectionType basic
ords --config /etc/ords/config config --db-pool mcp-hr set db.hostname host.docker.internal
ords --config /etc/ords/config config --db-pool mcp-hr set db.port 1521
ords --config /etc/ords/config config --db-pool mcp-hr set db.servicename freepdb1
ords --config /etc/ords/config config --db-pool mcp-hr set db.username HR
ords --config /etc/ords/config config --db-pool mcp-hr set db.description "Sample Schema Human Resources"
ords --config /etc/ords/config config --db-pool mcp-hr set mcp.role ORDS_MCP_HR
コネクション・プールmcp-hrがデータベースに接続する際に使用するパスワードを設定します。スキーマHRに設定したパスワードです。

ords --config /etc/ords/config config --db-pool mcp-hr secret db.password

[oracle@aeba9d22c0f9 ~]$ ords --config /etc/ords/config config --db-pool mcp-hr secret db.password


ORDS: Release 26.2 Production on Wed Jul 08 06:44:35 2026


Copyright (c) 2010, 2026, Oracle.


Configuration:

  /etc/ords/config


Enter the database password: ********

Confirm password: ********

[oracle@aeba9d22c0f9 ~]$ 


コンテナから抜けて再起動します。

exit
docker restart ords-mcp


[oracle@aeba9d22c0f9 ~]$ exit

exit

ords-mcp2 % docker restart ords-mcp

ords-mcp

ords-mcp2 % 




MCP Inspectorによる接続確認



MCP Inspectorを起動し、MCPサーバーに接続します。

npx @modelcontextprotocol/inspector

ORDS MCPサーバーに接続するにあたって、以下を設定します。

Transport Type: Streamable HTTP
URL; http://localhost:8585/mcp
Connection Type: Via Proxy
OAuth2 2.0 Flow Client ID: アプリケーションORDS MCP2のクライアントID
Scope: urn:oracle:dbtools:ords:mcpserver:all

以上でConnectをクリックします。


Oktaへサインインすると、アプリケーションへのアクセス許可を求められます。

アクセスを許可するをクリックします。


MCPサーバーに接続されます。

Toolsタブを開き、List Toolsを実行します。

呼び出し可能なツールとしてdatabase_listschema_informationsql_runがリストされます。


以降はORDS MCPサーバーの使い方になります。

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