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サーバーを作成できました。