2026年6月2日火曜日

SQLcl MCPサーバーとDatabase Tools MCPサーバーのSQLの非同期実行を確認する

SQLclに実装されているMCPサーバーおよびOracle Cloudで作成できるDatabase Tools MCP Serverの双方で、任意のSQLを実行できるツールが提供されています。その両方の汎用SQL実行ツールで、非同期実行がサポートされています。

MCPのプロトコルとしては、ツールの非同期実行はSEP-1686: Tasksなどで提案されていました。この提案は2025-11-25では実験的な実装にとどまっています。MCPの2026-07-28では、MCPの非同期プロトコルへの設計変更に合わせてtasks/get、tasks/update、tasks/cancelなど、タスクのライフサイクルを扱えるようにプロトコルが拡張されています。

現時点のMCPにはツールの非同期実行はプロコトルに含まれていないため、SQLclとDatabase Tools MCP Serverが提供しているSQLの非同期実行は、あくまでプロンプトとツールを組み合わせて独自に実装しています。

これらの汎用SQLツールの非同期実行がどのように動作するか確認します。

動作確認にはMCP Inspectorを使用します。動作確認を行なう環境として、以下の2種類を対象とします。
  • SQLclからローカルのOracle AI Database 26ai Freeに接続する
  • Database Tools MCP ServerからOracle Autonomous Database 19cに接続する(作成手順については、こちらの記事


SQLclのツールsql_runでの非同期実行



以下のバージョンのSQLclを使って、動作の確認を行います。バージョンが変わることにより、ツールの説明、ツール名、パラメータなどが変わる可能性はあります。

SQLcl: リリース26.1.2.0 Production ビルド: 26.1.2.132.1334

LLMはMCPサーバーのtools/listのレスポンスであるJSONドキュメントを参照して、呼び出すツールを決めます。汎用のSQL実行ツールはsql_runなので、tools/listのsql_runの説明を確認します。
{
  "name": "sql_run",
  "description": "Executes a SQL statement or PL/SQL block against the connected Oracle database. Returns CSV-formatted...",
  "inputSchema": {
    "type": "object",
    "properties": {
      "sql": {
        "type": "string",
        "description": "The SQL query to execute"
      },
      "model": {
        "type": "string",
        "description": "The name (and version) of the language model being used by the MCP client to process requests",
        "default": "UNKNOWN-LLM"
      },
      "execution_type": {
        "type": "string",
        "enum": [
          "SYNCHRONOUS",
          "ASYNCHRONOUS"
        ],
        "description": "The execution type of the sql query",
        "default": "SYNCHRONOUS"
      }
    },
    "required": [
      "sql"
    ]
  }
}
sql_runのdescriptionが長く、MCP Inspectorのtools/listのアウトプットでは省略されています。

パラメータについてはexecution_typeとしてSYNCHRONOUSASYNCHRONOUSが選択でき、デフォルトSYNCHRONOUSとなっています。requiredに含まれる引数はsqlのみなので、指定がないときはSQLは同期実行されます。

MCP InspectorからSQLclのMCPサーバーを呼び出し、SQLを非同期実行してみます。最初にconnectコマンドを呼び出し、データベースに接続しておきます。

MCP Inspectorでsql_runを選択します。

ツールの説明(description)に、非同期実行について以下の説明があります。
Use this tool for standard queries, DML, DDL, and PL/SQL that complete in a few seconds.
Set `execution_type=ASYNCHRONOUS` for queries that scan large tables or may take
longer than a few seconds. If the command keeps running in the background,
the response includes structured content containing `tool_request_id`.
execution_typeASYNCHRONOUSを渡したときに、SQLの実行時間がごく短い時間(数秒)を超えると、SQLの実行結果の代わりにtool_request_idを返すとなっています。

tool_request_idを受け取ったLLMが処理結果を参照するには、ここで受け取ったIDを引数としてツールrequest_statusを呼び出します。

execution_typeASYNCHRONOUSを設定してツールsql_runを呼び出し、SELECT文を実行してみます。

最初に以下のSELECT文を実行します。

select count(*) from all_users, all_users

以下のレスポンスが得られました。処理時間が短いため同期処理と同様の結果が返されます。
""COUNT(*)"
1849

"

次に以下のSELECT文を実行します。

select count(*) from all_objects, all_tables

以下のレスポンスが得られました。tool_request_idが返されています。
{
  "tool_request_id": "2"
}
Unstructured Contentとして以下が返されています。

タスクはID: 2で、バックグラウンドで実行するよう正常に設定されました


tool_request_idとして2が得られているので、この値でツールrequest_statusを呼び出してみます。

SELECT文の実行が終了していると、実行結果が返されます。
""COUNT(*)"
17097924

"


もう少し実行時間がかかるSELECT文を実行してみます。

select count(*) from all_objects, all_objects

tool_request_idとして 3 が返されました。


tool_request_idとしてを渡し、ツールrequest_statusを呼び出します。

レスポンスとして"実行中"が返されます。SQLclが日本語ロケールの環境で実行されているため、RUNNING実行中と翻訳されているように見受けられます。


処理が完了した後にrequest_statusを呼び出すと、SELECT文の結果が表示されます。


非同期実行の出力は、 ~/.dbtools/sqlcl/jobslogs/ (SQLclのホーム以下)にファイルとして出力されているようです。検索結果にセンシティブな情報が含まれる場合には注意が必要かと思います。

意図的に処理中のSELECT文を中断し、結果を確認してみます。

先ほど実行した以下のSELECT文のSQL_IDを確認します。

select count(*) from all_objects, all_objects

データベースにSYSDBA権限を持つユーザーで接続して作業します。

SQLclが実行するSQLには、コメントにmodel名が挿入されます。以下のSELECT文を実行し、SQL_IDを特定します。

select sql_id, sql_text from v$sql where sql_text like '%UNKNOWN-LLM%all_objects, all_objects%'

SQL> select sql_id, sql_text from v$sql where sql_text like '%UNKNOWN-LLM%all_objects, all_objects%';


SQL_ID           SQL_TEXT                                                                                           

________________ __________________________________________________________________________________________________ 

1aa9f3gqhtbby    select sql_id, sql_text from v$sql where sql_text like '%UNKNOWN-LLM%all_objects, all_objects%'    

ag0h1g4t92axp    select /* LLM in use is UNKNOWN-LLM */ count(*) from all_objects, all_objects                      


SQL> 


SQL_IDはag0h1g4t92axpでした。

最初はexecution_typeSYNCHRONOUSを指定(同期処理)して実行し、そのSELECT文の実行をキャンセルします。

sql_runを実行します。


以下のSELECT文を実行し、実行中のSELECT文をキャンセルするALTER文を生成します。

select 'alter system cancel sql ' || chr(39) || sid || ',' || serial# || chr(39) from v$session where username = 'APEXDEV' and status = 'ACTIVE' and sql_id = 'ag0h1g4t92axp';

実行結果として得られたalter文を続けて実行します。

SQL> select 'alter system cancel sql ' || chr(39) || sid || ',' || serial# || chr(39) from v$session where username = 'APEXDEV' and status = 'ACTIVE' and sql_id = 'ag0h1g4t92axp';


'ALTERSYSTEMCANCELSQL'||CHR(39)||SID||','||SERIAL#||CHR(39)    

______________________________________________________________ 

alter system cancel sql '196,56849'                            


SQL> alter system cancel sql '196,56849';


Systemが変更されました。


SQL> 


データベースが返すエラー・メッセージが、ツールの出力になっています。Tool ResultSuccessです。


ResponseのJSONを確認したところ、isError属性はfalseになっていました。
{
  "content": [
    {
      "type": "text",
      "text": "\n次のコマンド行の開始中にエラーが発生しました : 1 -\nselect /* LLM in use is UNKNOWN-LLM */ count(*) from all_objects, all_objects\nコマンド行 : 1 列 : 1 でのエラー\nエラー・レポート -\nSQLエラー: ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました。\n\nhttps://docs.oracle.com/error-help/db/ora-01013/01013. 00000 -  \"User requested cancel of current operation.\"\n*Cause:    The user interrupted an Oracle operation by entering CTRL-C,\n           Control-C, or another canceling operation.\n*Action:   No action needed.\n\nMore Details :\nhttps://docs.oracle.com/error-help/db/ora-01013/\n"
    }
  ],
  "isError": false
}
SQLclのMCPサーバーのツールsql_runは、実行するSQLの成否ではなくツールが呼び出せたかどうかでisError属性を決めているように見えます。LLMはツールの出力を見て、SQLの実行が成功したか失敗したかを判断することになります。

同じSELECT文を非同期で実行し、同期処理のときと同様の手順でSELECT文をキャンセルします。

tool_request_idとして6が得られています。


同期処理のときと同じ作業を行い、SELECT文をキャンセルします。

ツールrequest_statusを、引数tool_request_id6を与えて呼び出します。同期実行のときのツール出力と、同じエラー・メッセージが返されます。


SQLclのツールsql_runの非同期処理は以上のように動作していました。

ツールrequest_statusdescriptionには以下のように記載されています。
Possible outcomes:
- RUNNING: The request is still in progress; no final result is available yet. Retry after a short delay.
- FAILED: The request completed with an error; the response contains error details.
- FINISHED: The request completed successfully; the response contains the final result payload produced by the original tool.
RUNNINGのときは、ツールのレスポンスとして"実行中"が返されます。FAILEDのときは、レスポンスとしてerror detailsが返されるとあり、FINISHEDのときは、レスポンスとしてorginal toolが生成した最終結果が返される、とあります。そのため、記載された説明と確認した動作は一致していると言えます。


Database Tools SQL Serverのsql_runでの非同期実行



Database Tools MCP Serverでツールsql_runの非同期実行を有効にするには、実行時アイデンティティリソース・プリンシパルとします。認証済プリンシパルでは非同期実行が有効化されないようです。

同期/非同期の実行を指定する引数はexecutionTypeです。inputSchemaのプロパティexecutionTypeのdescriptionとして、以下の記述があります。
When set to `SYNCHRONOUS`:
The tool blocks and waits until the tool call completes, then returns the final result. If execution does not complete within the configured timeout, the tool returns an error (timeout).

When set to `ASYNCHRONOUS`:
The tool attempts to return a result quickly:
1) If execution completes within ~55 seconds, the tool returns the final result in this response.
2) If execution takes longer than ~55 seconds, the tool returns a toolRequestId instead of the final result. Use that toolRequestId with request_status to poll until the final result is available.

Prefer SYNCHRONOUS for short queries where you need immediate results. Prefer ASYNCHRONOUS for long-running scripts (e.g., large queries, bulk DML, DDL, or PL/SQL) and be prepared to poll using request_status.
SQLclの非同期処理と動作は似ているのですが、SQLclは数秒であるのに対して、Database Tools MCP Serverでは55秒が非同期処理の閾値になっています。

Always FreeのAutonomous AI DatabaseはローカルのOracle AI Database 26ai Freeより、ディクショナリの検索に時間がかかるため、以下のSQLを非同期で実行してみます。

select count(*) from all_tables, all_tables

Database Tools MCP Serverでは、かなりの時間(55秒)待ってから、toolRequestIdとして、以下が以下が返されました。

{
  "toolRequestId": "ZGF0YWJhc2V0b29sc3J0d29ya3JlcXVlc3Q6b2NpZDEuZGF0YWJhc2V0b29sc3J0d29ya3JlcXVlc3Qub2MxLmNhLXRvcm9udG8tMS5hYWFhYWFhYWpiaWo2aHRzcWVkNmJzY2Vsc3UyYmR2amNhM3FweWYzNHdkajJ0bXAyM2N6YjV2aWNiZ3E="
}


toolRequestIdに上記の値を渡し、ツールrequest_statusを呼び出します。同期実行で返されるレスポンスと同じレスポンスが返されます。


処理に時間がかかるSELECT文を非同期実行します。

select count(*) from all_objects, all_objects

toolRequestIdが返されます。


MCPサーバーから発行された非同期処理は、接続ランタイム作業リクエストとして実行されています。コンソールから接続admin@dbtoolsmcp作業リクエストを一覧すると、処理の進捗を確認できます。

ランタイム作業リクエストSQLスケジュール済削除の実行SQLの実行で、1つの非同期実行のセットになります。


SQLの処理が継続している状態で、ツールrequest_statusを呼び出してみます。

原因はわかりませんが、ツールrequest_statusも55秒程度待機した後に、引数toolRequestIdに与えたIDをtoolRequestIdとして返してきます。SQLclのMCPサーバーでは、レスポンスとして"実行中"が返される処理です。


実行中のランタイム作業リクエストを、コンソールから中断する方法は提供されていないようです。ランタイム作業リクエストのOCIDを取得し、以下のコマンドを実行して実行中のランタイム作業リクエストをキャンセルします。
oci raw-request \
  --http-method DELETE \
  --target-uri https://dbtools.<リージョン>.oci.oraclecloud.com/20230222/workRequests/<キャンセルするランタイム作業リクエストのOCID>

~ % oci raw-request \

  --http-method DELETE \

  --target-uri https://dbtools.ca-toronto-1.oci.oraclecloud.com/20230222/workRequests/ocid1.databasetoolsrtworkrequest.oc1.ca-toronto-1.aaaaaaaaelifb474vvkwzxorjrfyrrntl2zlcyuxbv2hxhlnyjv3u2ioog6a

/opt/homebrew/Cellar/oci-cli/3.84.0/libexec/lib/python3.14/site-packages/urllib3/poolmanager.py:329: FutureWarning: The 'strict' parameter is no longer needed on Python 3+. This will raise an error in urllib3 v3.0.

  warnings.warn(

{

  "data": "",

  "headers": {

    "Content-Type": "application/octet-stream",

    "Date": "Tue, 02 Jun 2026 04:57:56 GMT",

    "Strict-Transport-Security": "max-age=63072000; includeSubDomains",

    "Transfer-Encoding": "chunked",

    "Vary": "Origin",

    "X-Content-Type-Options": "nosniff, nosniff",

    "opc-request-id": "E47D86BC52A649778BF9A566F66514CC/7BB81289697F3EE0D4621E6A59595AD0/0EC494DAE6979A7E61F1C804405C3234"

  },

  "status": "202 Accepted"

}

~ % 


Database Tools MCP Serverのツールsql_runの非同期処理は以上のように動作していました。

データベースでは検索にある程度時間がかかるクエリはあります。すべて同期処理で順次呼び出しでは、実用的なサービスを作るのは難しいです。SQLclやDatabase Tools MCP Serverが提供するSQLの非同期実行は、それらの一部の実装を助けるかもしれません。しかし、現状ではMCPの2026-07-28が広く採用されて、タスクとして非同期実行を実装できるようになることを期待しています。

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