Gain Agentic Access to Any Oracle Database in the Cloud with Native, Enterprise-grade Managed MCP Servers in OCI
大きな特徴は以下の3点と思います。
- Streamable HTTPによる通信をサポート。MCPクライアント側に個別のツールのインストールが不要。
- MCPサーバーへ接続する際に、Oracle IAMによるOAuth 2.0の認証をサポート。
- サポートしているデータベースは、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
本記事では、できるだけ準備作業を含めて、新しく提供が開始された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種類のポリシー・ステートメントが紹介されています。
本記事では、オプション4のMCPサーバーおよび接続ともに実行時アイデンティティをリソース・プリンシパル、接続の認証タイプをパスワードとして、MCPサーバーを構成します。ポリシー・ステートメントはコンパートメントをスコープとします。
コンパートメントの作成
Oracle Cloudのコンソール画面より、アイデンティティとセキュリティのコンパートメントを開きます。
ルート・コンパートメント直下に、新たにコンパートメントdbtools-mcpを作成します。コンパートメントを作成するにあたって、特別な手順はありません。
IAM Identity Domainの作成
作成したコンパートメントdbtools-mcpに、IAM Identity Domainとしてdbtools-mcpを作成します。
ドメイン管理者となるユーザーを作成します。
このドメインの管理ユーザーの作成をオンにします。
ここで作成する管理者ユーザーを、MCPサーバーへ接続する際に認証するユーザーとして使用します。ユーザー認証には、ここで設定する電子メール・アドレスと、この後に設定するパスワードを使用します。
管理者ユーザーにパスワードを設定するために、パスワードをリセットするリンクを電子メールで送信します。そのため、管理者のユーザー名/電子メールに設定する電子メール・アドレスには、作業者がメールを受信できるアドレスを設定します。
ドメインを作成するコンパートメントはdbtools-mcpです。
次へ進みます。
リモート・リージョン・ディザスタ・リカバリの設定はせず、次へ進みます。
確認および作成に移ります。作成をクリックします。
Identity Domainとしてdbtools-mcpが作成されます。
ドメインdbtools-mcpを開き、ドメインの作成と同時に作成した管理者ユーザーを開きます。
アクションからパスワードのリセットを実行します。
設定している電子メール・アドレスに、パスワードをリセットするリンクを含んだ電子メールが送信されます。
受信したメールを開き、ボタンReset Passwordをクリックして管理者ユーザーにパスワードを設定します。
新規パスワードを設定し、パスワードのリセットを実行します。
パスワードのリセットが完了すると、管理者ユーザーの設定は完了です。
これからの作業で使用するグループを作成します。
作成するグループに管理者ユーザーを含めるよう、チェックを入れます。
同じ操作を繰り返し、グループMCP_Administrators、MCP_Operators、MCP_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-master-keyを作成します。保護モードはソフトウェア、アルゴリズムにAESを選択します。
データベースへの接続の作成
開発者サービスの接続を開きます。これからMCPサーバーが使用するデータベースへの接続を作成します。
接続の作成先のコンパートメントはdbtools-mcpです。
公式ドキュメントのCreate a Database Connectionにあるように、接続にはパスワード・ベースとトークン・ベースの2種類があります。現時点ではトークン・ベースでは接続を検証できない(ドメインdbtools-mcpのユーザーでOracle IAMによるOIDC認証ができる構成になっていない)ため、パスワード・ベースの接続を作成します。
接続の名前はadmin@dbtoolsmcpとします。接続先のデータベースとして、先ほど作成したOracle Autonomous AI Databaseのdbtoolsmcpを選択します。
ユーザーとして管理者ユーザーの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からのリージョナル・ウォレットの取得を選択します。
以上でシークレットを作成します。
接続自体の動作確認を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をコピーしておきます。
ルート・コンパートメントにポリシーを作成します。
手動エディタに切り替え、先ほどのsecret-bunledsの読み出しを許可するポリシー・ステートメントを記述します。request.principal.idとして、作成した接続admin@dbtoolsmcpのOCIDを指定します。
作成した接続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_Administrator、MCP_Operator、MCP_Userのアプリケーション・ロールに、ドメインdbtools-mcpに作成しているグループMCP_Administrators、MCP_Operators、MCP_Usersをそれぞれ紐付けます。
ロール・タブを開き、ロールの割当てをクリックします。
ロールの割当てを有効にすると、それぞれのロールの3点メニューより、グループの管理を実行できるようになります。
ドメインdbtools-mcpのOracle Cloudサービスより、mcpserver-rpを開いた画面に遷移しています。
グループを割り当てた後、ドロワーを閉じます。
グループを割り当てた直後は、割当て済ユーザーの数にグループのユーザーがカウントされないようです。一度、画面をリロードすると割当て済ユーザーの数が更新されます。
以上でアプリケーション・ロールの構成は完了です。
ポリシーの作成
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_run、request_status、schema_informationが含まれます。それぞれ、許可ロールにMCP_Operator、MCP_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/debug
MCP InspectorのリダイレクトURLは、MCP Inspectorの画面のOAuth 2.0 FlowのRedirect URLのフィールドに設定されています。
debug付きのリダイレクトURLはReconnectの際に呼び出されることがあるようです。
以上でMCPクライアントmcpclient-rpを登録します。
MCPクライアントとしてmcpclient-rpが作成されます。
mcpclient-rpをクリックすると、登録詳細が表示されます。
- サーバーURL
- クライアントID
- スコープ
Claude CoworkやOpenAI Codexなどをサポートするために、リダイレクトURIを追加する必要がある場合は、ドメインdbtools-mcpの統合アプリケーションにあるmcpclient-rpを開いて作業します。
MCP Inspectorからの接続
MCP Inspectorを起動します。
npx @modelcontextprotocol/inspector
MCP Inspectorを実行するブラウザは、Oracle Cloudのコンソールを操作しているブラウザとは別にするか、一旦ブラウザを再起動します。
Transport TypeにStreamable HTTPを選択します。URLに登録詳細のサーバーURL、OAuth 2.0 FlowのClient IDに登録詳細のクライアントID、Scopeに登録詳細のスコープを転記します。
認証プロセスが安定するため、Connection TypeにVia Proxyを選択します。
Streamable HTTPでMCPセッションが確立している場合は、Disconnect時にHTTPのDELETEメッセージが送信されますが、Database Tools MCP ServerではMCPセッションがないため、Disconnectを押すとクライアントのステータスがDisconnectedになるだけで、MCPサーバー側にDELETEメッセージは送信されないようです。
Connectをクリックします。
MCP Inspectorの画面に戻ります。
Oralce Cloudへのサインイン画面に遷移します。
今までの手順にそって作業していると、ドメインdbtools-mcpの管理者の電子メール・アドレスをユーザー名として、そのユーザーに設定したパスワードを入力してサインインします。
ドメインdbtools-mcpの管理者ユーザーには、アプリケーション・ロールMCP_Administratorが割り当てられています。そのため、All MCP primitivesを許可するかどうか、確認を求められます。
Allowをクリックして許可します。
MCPサーバーmcpserver-rpに接続ができています。
以上でMCP InspectorよりMCPサーバーmcpserver-rpのツールを呼び出せる状態になりました。
MCPサーバーの実装の確認
Authタブを開き、Authentication Completeの下にあるAccess Tokensを開きます。
スコープにoffline_accessが含まれていることより予想できましたが、refresh_tokenの存在を確認できます。そのため、この接続はリフレッシュ・トークンが有効な7日間は再認証せずに使用できることがわかります。
Historyにあるinitializeを開き、リクエストとレスポンスを確認します。レスポンスのcapabilitiesには、以下のようにtoolsのみが含まれています。また、listChangedがfalseなので、ツールセットが変更されてもサーバーから通知されることがないことがわかります。ストリーミングによる通信も発生しないはず(発生しても受け付けない)です。
capabilities: {
tools: {
listChanged: false
}
}
Database Tools MCP Serverが返すHTTPのレスポンス・ヘッダーにはMcp-Session-Idヘッダーが含まれていないようです。そのため、MCPサーバーへ送信されるリクエストは基本的にステートレスで、前後のリクエストを認識するといったことはありません。
次に公式ドキュメントの「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を設定するようにしています。
今回の記事は以上になります。
完






























































