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を設定するようにしています。

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