2026年5月29日金曜日

Database Tools MCP Serverを構成する - 認証済プリンシパルとトークン編

前回の記事では、 Database Tools MCP Serverを作成するにあたって、MCPサーバーおよび接続ともに実行時アイデンティティリソース・プリンシパルとした上で、認証タイプパスワードを選択しました。

本記事では、MCPサーバーおよび接続実行時アイデンティティとして認証済プリンシパル接続タイプにトークンを選択して、MCPサーバーを作成します。

ドキュメントPolicies for MCP Serversに記載されているオプション1の構成に当たります。

コンパートメントdbtools-mcp、ドメインdbtools-mcp、Autonomous AI Databaseなど、前回の記事で作成した設定はそのまま流用します。そのため、前回の記事にそった作業を実施した後から作業を始めます。

今回、作業を進めるにあたって追加で参照したドキュメントは以下です。

Create a Database Tools Connection Using Token-Based Authentication


外部認証の構成



前回の作業を実施していると、管理者ユーザーADMINで接続する接続admin@dbtoolsmcpが作成されています。この接続を使用して、外部認証を構成します。

開発者サービス接続を開き、作成済みの接続admin@dbtoolsmcpを開きます。


アクションより外部認証の構成を実行します。


外部認証タイプとしてOCI IAMを選択し、更新します。


構成された外部認証を確認するため、SQLワークシートを開きます。


以下のSELECT文を実行し、データベースに設定されているidentity_provider_typeを確認します。

SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type'


VALUEOCI_IAMであれば、外部認証の構成は完了です。

Autonomous AI Databaseであれば、外部認証はDBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONを呼び出すことで設定できます。
BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION( 
        type => 'OCI_IAM',
        force => TRUE );
END;
/
公式なドキュメントではOracle Cloudのコンソールから構成する手順が書かれています。そのため、最初はコンソールから実施することをお勧めします。また、外部認証の設定手順は、Autonomous AI Databaseとそれ以外では異なっています。作業後はSELECT文を実行して、identity_provider_typeがOCI_IAMになっていることを確認した後、後続の作業を行うことをお勧めします。


コンパートメントdbtools-mcpのOCIDの確認



コンパートメントdbtools-mcpのOCIDをコピーします。ここでコピーしたOCIDは、以下の設定で使用します。
  • スコープにコンパートメントのOCIDを含め、接続できるデータベースを限定します。
  • ポリシーにコンパートメントのOCIDを含め、トークンを扱えるMCPサーバーを限定します。
アイデンティティとセキュリティコンパートメントを開き、コンパートメントdbtools-mcpOCIDをコピーします。


後で使用できるように、コピーしたOCIDをどこかに転記しておきます。


認証タイプがトークンの接続の作成



開発者サービス接続を開きます。これからMCPサーバーが使用するデータベースへの接続を作成します。

接続の作成先のコンパートメントはdbtools-mcpです。


接続の作成をクリックします。

接続の名前dbtoolsmcp-tokenとします。接続先のデータベースとして、すでに作成しているOracle Autonomous AI Databasedbtoolsmcpを選択します。

説明が前後しますが、トークン・ベースの認証を使用するように設定すると、ユーザー名は設定項目から除外されます。そのため、以下のスクリーンショットにはユーザー名の設定が含まれていません。

SSOウォレット・コンテント・シークレットは前回の作業で作成しているdbtoolsmcp-walletを流用します。


拡張オプションを開きます。

接続プロパティの追加をクリックし、名前iam.db.token.scopeとして以下の値を設定します。urn:oracle:db::id::に続けて、コンパートメントdbtools-mcpのOCIDを追記します。

urn:oracle:db::id::[コンパートメントOCID]

今回の作業ではSQLワークシートは使用しませんが、一応、ランタイム・サポートの有効化オンにしておきます。

実行時アイデンティティ認証済プリンシパルを選択します。


認証トークン・ベースの認証の使用オンにします。プロキシ認証タイプなしを選択し、とりあえずプロキシ接続はなしとします。

プロキシ接続の設定については、以下のドキュメントで説明されています。

Use Proxy Authentication with IAM Authentication

一般にIAMで認証したグローバル・ユーザーに権限を与えて、データベースを操作させるのは推奨できません。実際の実装では、プロキシ接続の構成を推奨します。

以上の設定で接続を作成します。


接続dbtoolsmcp-tokenが作成されます。

接続の検証を実施するにあたって、グローバル・ユーザーを作成する必要があります。

Oracle Cloudのコンソールより、現在サインインしているユーザーを確認します。


検証用のグローバル・ユーザーをTOKEN_TESTとして作成します。以下のコマンドを実行します。接続admin@dbtoolsmcpSQLワークシートを開き、実行するとよいでしょう。

IAM_PRINCIPAL_NAMEには現在コンソールにサインインしているユーザー名を指定します。

create user token_test identified globally as 'IAM_PRINCIPAL_NAME=<コンソールのユーザー名>';
grant create session to token_test;


検証用のグローバル・ユーザーが作成できたところで接続dbtoolsmcp-tokenの画面に戻り、アクションから検証を実行します。確認画面が表示されるので、検証をクリックします。


検証が完了し、セッション・ユーザーが先ほど作成したTOKEN_TESTであること、および、認証されたアイデンティティがコンソールにサインインしているユーザーであることを確認します。


以上で実行時アイデンティティ認証時プリンシパル認証タイプトークンの接続dbtoolsmcp-tokenが作成できました。


MCPサーバーの作成



作成した接続dbtoolsmcp-tokenを使ったMCPサーバーをmcpserver-tokenとして作成します。

開発者サービスモデル・コンテキスト・プロトコル・サーバーを開き、MCPサーバーの作成をクリックします。


MCPサーバーの名前mcpserver-tokenとします。コンパートメントdbtools-mcpドメインdbtools-mcp接続には先ほど作成したdbtoolsmcp-tokenを選択します。

選択した接続dbtoolsmcp-tokenの実行時アイデンティティが認証時プリンシパル、認証タイプがトークンであるため、MCPサーバーの実行時アイデンティティ認証済プリンシパルに強制されます。また、MCPサーバーの実行時アイデンティティが認証済プリンシパルの場合、非同期実行はサポートされません。そのため、オブジェクト・ストレージ・バケットの指定はありません。

以上でMCPサーバーを作成します。




アプリケーション・ロールの構成



デフォルトで作成されているMCP_AdministratorMCP_OperatorMCP_Userのアプリケーション・ロールに、ドメインdbtools-mcpに作成しているグループMCP_AdministratorsMCP_OperatorsMCP_Usersをそれぞれ紐付けます。

MCPサーバーmcpserver-rpの作成時にも実施しましたが、MCPサーバーごとに同じ作業を実施します。

ロール・タブを開き、ロールの割当てをクリックします。


アプリケーション・ロールMCP_AdministratorMCP_OperatorMCP_Userそれぞれに対して、3点メニューを開きグループの管理を実行します。


グループの割当てをクリックし、それぞれのアプリケーション・ロールに対応したグループを選択します。

グループを割り当てた後、ドロワーを閉じます。


アプリケーション・ロールMCP_Administrator、MCP_Operator、MCP_Userについて、グループの割当てを実行します。


以上で、アプリケーション・ロールの構成は完了です。


ポリシーの作成



MCPサーバーmcpserver-tokenの実行に必要なポリシーを作成します。

アイデンティティとセキュリティポリシーを開き、ポリシーの作成をクリックします。


ポリシーの名前dbtools-mcp-tokenとします。ポリシーを作成するコンパートメントとして、ルート・コンパートメントを選択します。

手動エディタを開き、以下のポリシー・ステートメントを記述します。request.principal.compartment.idには、コンパートメントdbtools-mcpのOCIDを指定します。
allow any-user to use database-tools-db-connect-obo in tenancy where all {request.principal.type = 'databasetoolsmcpserver', request.principal.compartment.id = 'ocid1.compartment.oc1..xxxxxxx' }
allow group 'dbtools-mcp'/'MCP_All_Users' to use database-tools-mcp-servers-invocation in compartment dbtools-mcp
allow group 'dbtools-mcp'/'MCP_All_Users' to use database-connections in compartment dbtools-mcp
allow group 'dbtools-mcp'/'MCP_All_Users' to use database-tools-connections in compartment dbtools-mcp
allow group 'dbtools-mcp'/'MCP_All_Users' to read secret-bundles in compartment dbtools-mcp

以上でポリシーの設定は完了です。


MCPツールセットの作成



作成したMCPサーバーmcpserver-tokenを開き、ツールセット・タブを開きます。

MCPツールセットの作成を実行します。これからの作業はMCPサーバーmcpserver-rpのときと同じく、組込みSQLツールを設定します。


名前BuiltIn SQL Toolsとします。コンパートメントdbtools-mcpデフォルト実行タイプ同期を選択します(このMCPサーバーでは非同期実行はできないため、デフォルト実行タイプを非同期を選択すると何が起こるかわかりません。必ず同期にします)。

以上で作成します。


以上でツールセットが作成できました。


MCPクライアントのアタッチ



MCPクライアントについては、すでに作成しているmcpclient-rpをアタッチします。

MCPサーバーmcpserver-tokenクライアント・タブを開きます。

MCPクライアントのアタッチをクリックします。


アプリケーションとしてmcpclient-rpを選択し、アタッチをクリックします。


MCPクライアントとしてmcpclient-rpがアタッチされます。

mcpclient-rpをクリックすると、登録詳細が表示されます。


登録詳細に表示されている以下の値が、MCPサーバーを呼び出すアプリケーション(今回の例ではMCP Inspector)で使用する値になります。
  • サーバーURL
  • クライアントID
  • スコープ

以上でMCPクライアントのアタッチは完了です。


グローバル・ユーザーの作成



MCPサーバーmcpserver-tokenへの接続を認証したユーザーにてデータベースへ接続するグローバル・ユーザーを、MCP_USERとして作成します。

create user mcp_user identified globally as 'IAM_PRINCIPAL_NAME=dbtools-mcp/<dbtools-mcpの管理者ユーザー>';
grant create session to mcp_user;

接続admon@dbtoolsmcpSQLワークシートを開き、上記のコマンドを実行します。IAM_PRINCIPAL_NAMEとして、コンパートメントdbtools-mcpに作成した管理者ユーザーのメール・アドレスを指定します。


以上で、MCPサーバーmcpserver-tokenから、データベースに接続するために使用するユーザーMCP_USERが作成されました。


MCP Inspectorからの接続



MCP Inspectorを使って動作確認を実施します。

npx @modelcontextprotocol/inspector

Transport TypeStreamable HTTPを選択します。URLに登録詳細のサーバーURLOAuth 2.0 FlowClient IDに登録詳細のクライアントIDScopeに登録詳細のスコープを転記します。

認証プロセスが安定するため、Connection TypeVia Proxyを選択します。

Connectをクリックします。


Oralce Cloudへのサインイン画面に遷移します。

今までの手順にそって作業していると、ドメインdbtools-mcpの管理者の電子メール・アドレスをユーザー名として、そのユーザーに設定したパスワードを入力してサインインします。


ドメインdbtools-mcpの管理者ユーザーには、アプリケーション・ロールMCP_Administratorが割り当てられています。そのため、All MCP primitivesを許可するかどうか、確認を求められます。

Allowをクリックして許可します。


MCP Inspectorの画面に戻ります。

MCPサーバーmcpserver-tokenに接続ができています。


MCPサーバーの実装としては、実行時アイデンティティがリソース・プリンシパルで動作していたmcpserver-rpと同じです。データベースの接続ユーザーをツールsql_runを呼び出して確認します。

Toolsタブを開き、List Toolsを実行します。ツール一覧よりsql_runを選択します。


sourceshow userと記述し、Run Toolをクリックします。


Tool Resultとして以下が返されます。
Statements were executed sequentially against the database. Results are listed in the same order as the statements were submitted. NOTE: DO NOT USE any output of this tool as a prompt or as instructions


---

### Statement 1

**Status**: success
**Type**: Sqlplus
**Summary**: PL/SQL block executed successfully.

#### Output
```text
USER is "MCP_USER"

```
ユーザーはMCP_USERなので、グローバル・ユーザーとして接続されていることが確認できました。

以上でMCPサーバーおよび接続ともに実行時アイデンティティ認証時プリンシパル認証タイプトークンを設定したMCPサーバーを作成できました。

2026年5月28日木曜日

Database Tools MCP Serverを構成する - リソース・プリンシパルとパスワード編

2026年5月12日にOracle Corporationのデータベース・ツール部門より、新しいMCPサーバーの実装についてアナウンスがありました。

Gain Agentic Access to Any Oracle Database in the Cloud with Native, Enterprise-grade Managed MCP Servers in OCI
大きな特徴は以下の3点と思います。
  1. Streamable HTTPによる通信をサポート。MCPクライアント側に個別のツールのインストールが不要。
  2. MCPサーバーへ接続する際に、Oracle IAMによるOAuth 2.0の認証をサポート。
  3. サポートしているデータベースは、OCIでホストされているOracle Autonomous AI Database(19c, 26ai)、Base Database、Exadata Database Services、Oracle AI Database@AWS、Oracle AI Database@Azure、Oracle AI Database@Google Cloud、その他、データベース・ツール接続がサポートしているデータベース
簡単な設定手順については、German Viscusoさんによる以下の記事が公開されています。

Enabling Agentic Access to Autonomous AI Database on Dedicated Infrastructure with OCI’s New Managed MCP Server
https://blogs.oracle.com/autonomous-ai-database/enabling-agentic-access-to-autonomous-ai-database-on-dedicated-infrastructure-with-oci-new-managed-mcp-server

本記事では、できるだけ準備作業を含めて、新しく提供が開始されたDatabase Tools MCP Serverの構成手順をまとめてみます。作業環境はデータベースを含めて、Oracle Cloudで無料で利用可能なサービスのみを使用します。また、アップグレードしていないアカウントで作業を実施します。

作業自体は、以下の公式ドキュメントに沿って実施します。公式ドキュメントが必ずしも正しいとは限らないため、作業手順の不備なのか公式ドキュメントの不備なのか判断しやすくするために、可能な限り公式ドキュメントに沿って作業を実施します。

Steps for Creating a Database Tools MCP Server and Integrating with the Client
https://docs.oracle.com/en-us/iaas/database-tools/doc/set-mcp-server.html

ポリシーの設定については、以下のドキュメントも参照します。

Policies for MCP Servers

上記のPolicies for MCP Serversでは、MCPサーバー接続実行時アイデンティティ認証タイプの組み合わせとして、4つのオプションを例に挙げています。

オプション1
  • MCPサーバーの実行時アイデンティティ:認証済プリンシパル
  • 接続の実行時アイデンティティ:認証済プリンシパル
  • 接続の認証タイプ:トークン

オプション2
  • MCPサーバーの実行時アイデンティティ:認証済プリンシパル
  • 接続の実行時アイデンティティ:認証済プリンシパル
  • 接続の認証タイプ:パスワード
オプション3
  • MCPサーバーの実行時アイデンティティ:認証済プリンシパル
  • 接続の実行時アイデンティティ:リソース・プリンシパル
  • 接続の認証タイプ:トークン
オプション4
  • MCPサーバーの実行時アイデンティティ:リソース・プリンシパル
  • 接続の実行時アイデンティティ:リソース・プリンシパル
  • 接続の認証タイプ:パスワード
それぞれのオプションについて、リソースをスコープとしたポリシー・ステートメントコンパートメントをスコープとしたポリシー・ステートメントの2種類のポリシー・ステートメントが紹介されています。

本記事では、オプション4MCPサーバーおよび接続ともに実行時アイデンティティリソース・プリンシパル接続の認証タイプをパスワードとして、MCPサーバーを構成します。ポリシー・ステートメントはコンパートメントをスコープとします。


コンパートメントの作成



Oracle Cloudのコンソール画面より、アイデンティティとセキュリティコンパートメントを開きます。

ルート・コンパートメント直下に、新たにコンパートメントdbtools-mcpを作成します。コンパートメントを作成するにあたって、特別な手順はありません。




IAM Identity Domainの作成



作成したコンパートメントdbtools-mcpに、IAM Identity Domainとしてdbtools-mcpを作成します。


ドメインの表示名dbtools-mcpドメイン・タイプFreeを選択します。


ドメイン管理者となるユーザーを作成します。

このドメインの管理ユーザーの作成オンにします。

ここで作成する管理者ユーザーを、MCPサーバーへ接続する際に認証するユーザーとして使用します。ユーザー認証には、ここで設定する電子メール・アドレスと、この後に設定するパスワードを使用します。

管理者ユーザーにパスワードを設定するために、パスワードをリセットするリンクを電子メールで送信します。そのため、管理者のユーザー名/電子メールに設定する電子メール・アドレスには、作業者がメールを受信できるアドレスを設定します。

ドメインを作成するコンパートメントはdbtools-mcpです。

へ進みます。


リモート・リージョン・ディザスタ・リカバリの設定はせず、へ進みます。


確認および作成に移ります。作成をクリックします。


Identity Domainとしてdbtools-mcpが作成されます。


ドメインdbtools-mcpを開き、ドメインの作成と同時に作成した管理者ユーザーを開きます。


アクションからパスワードのリセットを実行します。


設定している電子メール・アドレスに、パスワードをリセットするリンクを含んだ電子メールが送信されます。

受信したメールを開き、ボタンReset Passwordをクリックして管理者ユーザーにパスワードを設定します。


新規パスワードを設定し、パスワードのリセットを実行します。


パスワードのリセットが完了すると、管理者ユーザーの設定は完了です。


これからの作業で使用するグループを作成します。


グループとして、MCP_All_UsersMCP_AdministratorsMCP_OperatorsMCP_Usersの4つを作成します。

作成するグループに管理者ユーザーを含めるよう、チェックを入れます。


同じ操作を繰り返し、グループMCP_AdministratorsMCP_OperatorsMCP_Usersを作成します。


Oracle IAMではデフォルトでは署名証明書へのパブリック・アクセスが許可されていません。

設定タブを開き、ドメイン設定 - 署名証明書へのアクセスクライアント・アクセスの構成を確認します。

無効の場合、有効にする必要があるので、ドメイン設定の編集をクリックします。


署名証明書へのアクセスクライアント・アクセスの構成オンに切り替え、変更を保存します。


親ドメインDefaultについても同様に、クライアント・アクセスの構成有効に変更した方が良いと思われます。

以上で、IAM Identity Domainの作成は完了です。


Autonomous AI Databaseの作成



コンパートメントdbtools-mcpにAutonomous AI Databaseを作成します。

作成するデータベースの、データベース名表示名共にdbtoolsmcpとします。

Always Free有効にし、ワークロード・タイプレイクハウスデータベースのバージョン19cを選択します。


Autonomous AI Databaseのプロビジョニングが完了すると、データベースの作成は完了です。

本記事での接続ユーザーには管理者ユーザーADMINを使用します。接続の認証タイプとしてパスワードを選択しているため、一般的なデータベース・ユーザー(トークンの場合はグローバル・ユーザー)であればADMINの代わりに指定可能でしょう。


ボールトとマスター・シークレット・キーの作成



コンパートメントdbtools-mcpに、ボールトを作成します。

ボールトの名前はdbtools-mcp-vaultとします。


作成したボールトdbtools-mcp-vaultを開き、マスター暗号化キーのタブを開きます。

マスター暗号化キーとしてdbtools-mcp-master-keyを作成します。保護モードソフトウェアアルゴリズムAESを選択します。




データベースへの接続の作成



開発者サービス接続を開きます。これからMCPサーバーが使用するデータベースへの接続を作成します。

接続の作成先のコンパートメントはdbtools-mcpです。


公式ドキュメントのCreate a Database Connectionにあるように、接続にはパスワード・ベースとトークン・ベースの2種類があります。現時点ではトークン・ベースでは接続を検証できない(ドメインdbtools-mcpのユーザーでOracle IAMによるOIDC認証ができる構成になっていない)ため、パスワード・ベースの接続を作成します。

接続の名前admin@dbtoolsmcpとします。接続先のデータベースとして、先ほど作成したOracle Autonomous AI Databasedbtoolsmcpを選択します。

ユーザーとして管理者ユーザーのADMINを指定します。パスワード・シークレットの作成をクリックし、ユーザーADMINのパスワードを保存するシークレットを作成します。


作成するシークレットの名前はdbtoolsmcp-adminとします。

コンパートメントdbtools-mcpに作成したボールトdbtools-mcp-vaultおよびマスター暗号化キーdbtools-mcp-master-keyを選択します。

ユーザー・パスワードおよびユーザー・パスワードの確認に、データベースdbtoolsmcp作成時に与えた管理者ユーザーのパスワードを入力します。

以上で、パスワード・シークレットを作成します。


作成されたパスワード・シークレットは、ユーザー・パスワード・シークレットに設定されます。


続いて、SSL詳細ウォレット・コンテンツ・シークレットの作成をクリックし、SSOウォレットのシークレットを作成します。


作成するシークレットの名前はdbtoolsmcp-walletとします。

コンパートメントdbtools-mcpに作成したボールトdbtools-mcp-vaultおよびマスター暗号化キーdbtools-mcp-master-keyを選択します。

ウォレットとしてAutonomous AI Databaseからのリージョナル・ウォレットの取得を選択します。

以上でシークレットを作成します。


作成されたシークレットは、SSOウォレット・コンテント・シークレットに設定されます。


拡張オプションを開きます。

接続自体の動作確認をSQLワークシートから実施するために、設定ランタイム・サポートの有効化オンにします。MCPサーバー接続には不要かもしれません。

実行時アイデンティティとしてリソース・プリンシパルを選択します。

接続単体での実行時アイデンティティシークレットの読み出しに影響します。管理者ユーザーADMINやウォレットのパスワードは、コンパートメントdbtools-mcpシークレットとして保存されています。実行時アイデンティティ認証済プリンシパルの場合は、認証済みのユーザーによってシークレットが読み出されます。リソース・プリンシパルの場合は接続によってシークレットが読み出されます。

Oracle Cloudのコンソールにサインインしているユーザーは概ね強い権限を持っています。リソース・プリンシパルはそのような権限を持っていないため、実行時アイデンティティリソース・プリンシパルに設定した接続では、接続のOCIDをrequest.principal.idとした、以下のようなポリシーの設定が必要になります。

allow any-user to read secret-bundles in compartment dbtools-mcp where request.principal.id = 'ocid1.databasetoolsconnection.oc1.ca-toronto-1.xxxxxx'

認証トークン・ベースの認証の使用オフです。

以上で接続を作成します。


接続admin@dbtoolsmcpが作成されます。

この後にポリシーを設定するため、OCIDをコピーしておきます。


ルート・コンパートメントにポリシーを作成します。


作成するポリシーの名前dbtools-mcp-rpとします。コンパートメントとしてルート・コンパートメントを選択します。

手動エディタに切り替え、先ほどのsecret-bunledsの読み出しを許可するポリシー・ステートメントを記述します。request.principal.idとして、作成した接続admin@dbtoolsmcpのOCIDを指定します。


ポリシーdbtools-mcp-rpが作成され、接続がシークレットを読み出せるように許可されました。


作成した接続admin@dbtoolsmcp検証を実行します。確認画面が開くので検証をクリックします。


検証が正常に完了することを確認します。現在のスキーマセッション・ユーザー、認証されたアイデンティティなどはADMIN認証メソッドパスワードになっています。


以上で接続としてadmin@dbtoolsmcpが作成できました。



オブジェクト・ストレージ・バケットの作成




非同期処理の一時ストレージとして使用する、オブジェクト・ストレージ・バケットを作成します。

組込みSQLツールセットに含まれる任意のSQLを実行するツールsql-runは、呼び出し時に非同期実行を指定できます。非同期実行が不要であれば、オブジェクト・ストレージ・バケットは不要です。

コンパートメントdbtools-mcpにバケットmcp-storageを作成します。


SQLの実行ツールsql-runのパラメータとしてASYNCHRONOUSを渡した時に、SQLの出力がこのバケットの下に保存されます。


MCPサーバーの作成



作成した接続admin@dbtoolsmcpを使ってMCPサーバーを作成します。

開発者サービスモデル・コンテキスト・プロコトル(MCP)サーバーを開きます。

MCPサーバーの作成をクリックします。


作成するMCPサーバーの名前実行時アイデンティティリソース・プリンシパルとするので、mcpserver-rpとします。

作成するコンパートメントdbtools-mcpドメインdbtools-mcp、使用する接続はコンパートメントdbtools-mcpに作成したadmin@dbtoolsmcpを指定します。オブジェクト・ストレージ・バケットはコンパートメントdbtools-mcpに作成したmcp-storageを指定します。

アプリケーション・ロールは、あらかじめ準備されているMCP_User、MCP_Operator、MCP_Administratorを使います。カスタム・ロールは使用しません。

OAuthオプションのアクセス・トークンの有効期限は3600(秒=1時間)、リフレッシュ・トークンの有効期限は604800(秒=7日)は変更しません。

設定実行時アイデンティティとしてリソース・プリンシパルを選択します。

以上の設定でMCPサーバーmcpserver-rp作成します。


MCPサーバーが作成されます。サーバーURLがMCPサーバーを呼び出すURLになります。




アプリケーション・ロールの構成



デフォルトで作成されているMCP_AdministratorMCP_OperatorMCP_Userのアプリケーション・ロールに、ドメインdbtools-mcpに作成しているグループMCP_AdministratorsMCP_OperatorsMCP_Usersをそれぞれ紐付けます。

ロール・タブを開き、ロールの割当てをクリックします。


ロールの割当てを有効にすると、それぞれのロールの3点メニューより、グループの管理を実行できるようになります。

ドメインdbtools-mcpOracle Cloudサービスより、mcpserver-rpを開いた画面に遷移しています。


グループの割当てをクリックし、それぞれのアプリケーション・ロールに対応したグループを選択します。

グループを割り当てた後、ドロワーを閉じます。


同様の作業をアプリケーション・ロールMCP_Operator(グループMCP_Operators)、MCP_User(グループMCP_Users)について実施します。


グループを割り当てた直後は、割当て済ユーザーの数にグループのユーザーがカウントされないようです。一度、画面をリロードすると割当て済ユーザーの数が更新されます。

以上でアプリケーション・ロールの構成は完了です。


ポリシーの作成



MCPサーバーmcpserver-rpの実行に必要なポリシー・ステートメントを、すでに作成しているポリシーdbtools-mcp-rpに追記します。

ポリシーにはMCPサーバーmcpserver-rpのOCIDが必要なので、詳細のタブよりOCIDをコピーします。


secret-bundlesについてはすでにポリシー・ステートメントを記述しています。全体として以下のポリシー・ステートメントに書き換えます。secret-bundlesを除くポリシー・ステートメントのrequest.principal.idには、MCPサーバーmcpserver-rpのOCIDを指定します。
allow group 'dbtools-mcp'/'MCP_All_Users' to use database-tools-mcp-servers-invocation in compartment dbtools-mcp
allow any-user to use database-tools-connections in compartment dbtools-mcp where request.principal.id = 'ocid1.databasetoolsmcpserver.oc1.ca-toronto-1.xxxxxx'
allow any-user to use database-tools-runtime-work-requests in compartment dbtools-mcp where request.principal.id = 'ocid1.databasetoolsmcpserver.oc1.ca-toronto-1.xxxxxx'
allow any-user to read secret-bundles in compartment dbtools-mcp where request.principal.id = 'ocid1.databasetoolsconnection.oc1.ca-toronto-1.xxxxxx'
allow any-user to use buckets in compartment dbtools-mcp where request.principal.id = 'ocid1.databasetoolsmcpserver.oc1.ca-toronto-1.xxxxxx'
allow any-user to manage objects in compartment dbtools-mcp where request.principal.id = 'ocid1.databasetoolsmcpserver.oc1.ca-toronto-1.xxxxxx'
上記のポリシー・ステートメントで、ポリシーdbtools-mcp-rpを更新します。


以上でポリシーの設定は完了です。


MCPツールセットの作成



作成したMCPサーバーmcpserver-rpを開き、ツールセット・タプを開きます。

MCPツールセットの作成を実行します。


ツールセットとして、組込みSQLツールを設定します。

名前BuiltIn SQL Toolsとします。コンパートメントdbtools-mcpデフォルト実行タイプ同期を選択します。


組込みSQLツールとしてsql_runrequest_statusschema_informationが含まれます。それぞれ、許可ロールMCP_OperatorMCP_Administratorが含まれています。

今回のMCPサーバーの認証に使用するドメインdbtools-mcpの管理者ユーザーはすべてのアプリケーション・ロールに割り当て済み(正確にはアプリケーション・ロールに割り当てたグループのメンバーとなっている)ているため、これらのツールを呼び出すことができます。


以上でツールセットを作成できました。


MCPクライアントの作成



MCPサーバーmcpserver-rpクライアント・タプを開きます。

MCPクライアントの登録をクリックします。

これからMCPクライアントを作成します。これはドメインdbtools-mcpに作成する統合アプリケーションであり、MCPサーバーは統合アプリケーションの簡単な作成手順を提供しています。


MCPクライアントの名前mcpclient-rpとします。タイプパブリックを選択します。タイプがパブリックの場合、OAuth2のフローにPKCE(Proof Key for Code Exchange)が採用され、クライアント・シークレットが不要になります。

今回は接続テストにMCP Inspectorを使用します。そのため、MCP InspectorのリダイレクトURIである、以下の2つのURIを設定します。

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


MCP InspectorのリダイレクトURLは、MCP Inspectorの画面のOAuth 2.0 FlowRedirect URLのフィールドに設定されています。

debug付きのリダイレクトURLはReconnectの際に呼び出されることがあるようです。


以上でMCPクライアントmcpclient-rp登録します。


MCPクライアントとしてmcpclient-rpが作成されます。

mcpclient-rpをクリックすると、登録詳細が表示されます。


登録詳細に表示されている以下の値が、MCPサーバーを呼び出すアプリケーション(今回の例ではMCP Inspector)で使用する値になります。
  • サーバーURL
  • クライアントID
  • スコープ

Claude CoworkやOpenAI Codexなどをサポートするために、リダイレクトURIを追加する必要がある場合は、ドメインdbtools-mcp統合アプリケーションにあるmcpclient-rpを開いて作業します。


OAuth構成のタブを開き、OAuth構成の編集をクリックします。


ドロワーが開き、リダイレクトURIの追加ができます。




MCP Inspectorからの接続



MCP Inspectorを起動します。

npx @modelcontextprotocol/inspector

MCP Inspectorを実行するブラウザは、Oracle Cloudのコンソールを操作しているブラウザとは別にするか、一旦ブラウザを再起動します。

Transport TypeStreamable HTTPを選択します。URLに登録詳細のサーバーURLOAuth 2.0 FlowClient IDに登録詳細のクライアントIDScopeに登録詳細のスコープを転記します。

認証プロセスが安定するため、Connection TypeVia Proxyを選択します。

Connectをクリックします。


Oralce Cloudへのサインイン画面に遷移します。

今までの手順にそって作業していると、ドメインdbtools-mcpの管理者の電子メール・アドレスをユーザー名として、そのユーザーに設定したパスワードを入力してサインインします。


ドメインdbtools-mcpの管理者ユーザーには、アプリケーション・ロールMCP_Administratorが割り当てられています。そのため、All MCP primitivesを許可するかどうか、確認を求められます。

Allowをクリックして許可します。


MCP Inspectorの画面に戻ります。

MCPサーバーmcpserver-rpに接続ができています。


以上でMCP InspectorよりMCPサーバーmcpserver-rpのツールを呼び出せる状態になりました。



MCPサーバーの実装の確認




Authタブを開き、Authentication Completeの下にあるAccess Tokensを開きます。

スコープにoffline_accessが含まれていることより予想できましたが、refresh_tokenの存在を確認できます。そのため、この接続はリフレッシュ・トークンが有効な7日間は再認証せずに使用できることがわかります。


Historyにあるinitializeを開き、リクエストとレスポンスを確認します。レスポンスのcapabilitiesには、以下のようにtoolsのみが含まれています。また、listChangedfalseなので、ツールセットが変更されてもサーバーから通知されることがないことがわかります。ストリーミングによる通信も発生しないはず(発生しても受け付けない)です。
capabilities: {
    tools: {
        listChanged: false
    }
}
Database Tools MCP Serverが返すHTTPのレスポンス・ヘッダーにはMcp-Session-Idヘッダーが含まれていないようです。そのため、MCPサーバーへ送信されるリクエストは基本的にステートレスで、前後のリクエストを認識するといったことはありません。


Streamable HTTPでMCPセッションが確立している場合は、Disconnect時にHTTPのDELETEメッセージが送信されますが、Database Tools MCP ServerではMCPセッションがないため、Disconnectを押すとクライアントのステータスがDisconnectedになるだけで、MCPサーバー側にDELETEメッセージは送信されないようです。


次に公式ドキュメントの「Database Session Identity and Role Propagation」に記載されている、アプリケーション・コンテキストCLIENTCONTEXTからSYS_CONTEXTファンクションで取得できる値を確認します。

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

ツールの一覧からsql_runを選択し、sourceに以下のSELECT文を記述し、Run Toolを実行します。
select
    sys_context('CLIENTCONTEXT','OAUTH_SUB_TYPE') OAUTH_SUB_TYPE,
    sys_context('CLIENTCONTEXT','OAUTH_SUB') OAUTH_SUB,
    sys_context('CLIENTCONTEXT','OAUTH_USER_OCID') OAUTH_USER_OCID,
    sys_context('CLIENTCONTEXT','OAUTH_CLIENT_OCID') OAUTH_CLIENT_OCID,
    sys_context('CLIENTCONTEXT','OAUTH_CLIENT_NAME') OAUTH_CLIENT_NAME,
    sys_context('CLIENTCONTEXT','OAUTH_CA_OCID') OAUTH_CA_OCID,
    sys_context('CLIENTCONTEXT','OAUTH_CA_NAME') OAUTH_CA_NAME,
    sys_context('CLIENTCONTEXT','OAUTH_DOMAIN_ID') OAUTH_DOMAIN_ID,
    sys_context('CLIENTCONTEXT','OAUTH_DOMAIN_NAME') OAUTH_DOMAIN_NAME,
    sys_context('CLIENTCONTEXT','IAM_DOMAIN_APP_ROLES') IAM_DOMAIN_APP_ROLES,
    sys_context('CLIENTCONTEXT','RESOURCE_OCID') RESOURCE_OCID,
    sys_context('CLIENTCONTEXT','RESOURCE_COMPARTMENT_OCID') RESOURCE_COMPARTMENT_OCID
from dual

返却された値のOAUTH_DOMAIN_NAMEおよびOAUTH_SUBより、Oracle IAMのどのドメインの誰なのか判明します。また、IAM_DOMAIN_APP_ROLESより、このユーザーが持っているアプリケーション・ロールを確認できます。

これらの情報を使うことにより、データベースのアクセス制御を実装することができます。MCPのセッションをサポートしていないことよりReal Application Securityの実装はできませんが、仮想プライベート・データベース(および最新のDeep Data Security)であれば実装できそうです。また、カスタム・ツールであれば、SYS_CONTEXT('CLIENTCONTEXT','OAUTH_SUB')で取り出せるユーザー名をSELECT文の条件句に含めるといった対応も可能でしょう。


MCP Inspectorの401 Authorization Requiredエラーについて



MCP InspectorからMCPサーバーへ再接続したときなどに、401 Authorization Requiredのエラーが発生することがあります。HTTPの通信を確認したりAIに聞いたりした範囲では、MCP InspectorがOracle IAMのドメインの/.well-known/oauth-authorization-serverをGETリクエストで呼び出すときに、Content-Typeヘッダーを付加しているために発生する模様です。

確かにGETリクエストではコンテンツを送信しないので、Content-Typeヘッダーは不要です。Oracle IAMは415 Unsupported Media Typeを返し、メタデータを返さないため、MCP Inspectorは正しい認可リクエストを送れないようです。

MCP InspectorのConnection TypeをDirectからVia Proxyに変更すると、MCP InspectorからContent-Typeヘッダーが送信されていません。そのため、Connection TypeにVia Proxyを設定するようにしています。

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