先日の記事「Claude CodeおよびOpenAI CodexでAgent Skillsを参照しMCPサーバー経由でOracle Databaseに問い合わせる」にて、SQLclのMCPサーバーをClaude CodeとOpenAI Codexから呼び出しました。SQLclからデータベースへの接続では、データベース・ユーザーによるユーザー認証を行っています。
以前に、SQLclのMCPサーバーからデータベースに接続する際に、Microsoft Entra IDでユーザー認証する手順を紹介しています。
この作業を実施し、Claude CodeとCodexからMCPサーバーを呼び出す際に、Entra IDによるユーザー認証を行なってみます。
この他に、Microsoft Entra IDで保護したリモートMCPサーバーに、Claude CodeとCodexから接続する設定も確認してみます。
SQLclのMCPサーバーをEntra IDで認証するように構成すると、tnsnames.oraに以下のようなTNS名を追加されています。
salesadb_azint = (
description= (retry_count=20)(retry_delay=3)
(address=(protocol=tcps)(port=1522)(host=adb.us-ashburn-1.oraclecloud.com))
(connect_data=(service_name=************_salesadb_low.adb.oraclecloud.com))
(security=(ssl_server_dn_match=yes)(TOKEN_AUTH=AZURE_INTERACTIVE)
(TENANT_ID=3940****-****-****-****-********2758)
(CLIENT_ID=370e****-****-****-****-********30d7)
(AZURE_DB_APP_ID_URI=api://70ec****-****-****-****-********2b4a))
)
そのtnsnames.oraが配置されているディレクトリを、環境変数TNS_ADMINで参照させます。
.mcp.jsonの設定に、以下のように"env"を追加します。
{
"mcpServers": {
"oracle-sh": {
"command": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
"args": [
"-mcp",
"-R",
"4"
],
"env": {
"TNS_ADMIN": "/Users/*********/Documents/mcp-salesadb"
}
}
}
TNS_ADMINに設定されるディレクトリ以下をリポジトリで共有すると、接続先とスキルをまとめて配布できるでしょう。
元記事にあるように、SQLclにSDKとしてjdbc-azureをインストールしておきます。
sql /nolog
sdk list
SQL> sdk list
+------------+-----------+---------+----------------------------------------------------------------------+
| SDK | INSTALLED | VERSION | DOCS |
+------------+-----------+---------+----------------------------------------------------------------------+
| jdbc-oci | NO | 1.0.6 | https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/ |
| jdbc-azure | YES | 1.0.6 | https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/ |
+------------+-----------+---------+----------------------------------------------------------------------+
SQL>
上記ではjdbc-azureがインストール済みです。未インストールの場合は、インストールします。
sdk install jdbc-azure
SDKをインストールしたのち、SQLclを再起動します。
Microsoft Entra IDでユーザー認証をする接続を、SQLclに保存します。
conn -save salesadb-az -savepwd /@salesadb_azint
SQL> conn -save salesadb-az -savepwd /@salesadb_azint
名前: salesadb-az
接続文字列: salesadb_azint
ユーザー:
パスワード: 未保存
接続しました.
SQL>
保存した接続は、Claude Codeに登録されているMCPサーバーから使用できます。
「oracle-shで利用できる接続を一覧して。」
「salesadb-azに繋いで。」
「Oracle SHスキーマの販売データを総合分析を実施して。」
TNSエントリのTOKEN_AUTHにAZURE_INTERACTIVEを設定している場合、データベースに接続する際にブラウザが開き、Entra IDによるユーザー認証が要求されます。元記事と同様にURLのorganizationsの部分をテナントIDに置き換える必要はありますが、ユーザー認証が完了するとClaude CodeからMCPサーバーを介してデータベースにアクセスできます。
OpenAI Codexでは.codex/config.tomlに、以下のように環境変数TNS_ADMINの設定を追加します。
[mcp_servers.oracle-sh]
command = "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql"
args = [ "-mcp", "-R", "4"]
[mcp_servers.oracle-sh.env]
TNS_ADMIN = "/Users/*********/Documents/mcp-salesadb"
Codexでも、Claude Codeと同様のプロンプトを送信します。
「oracle-shで利用できる接続を一覧して。」
「salesadb-azに繋いで。」
「Oracle SHスキーマの販売データを総合分析を実施して。」
Claude Codeのときと同様に、データベースに接続する際にブラウザが起動し、Entra IDによるユーザー認証が要求されます。URLのorganizationsの部分をテナントIDに置き換える必要があります。
ユーザー認証が完了すると、CodexからMCPサーバーを介してデータベースにアクセスできます。
Claude CodeやCodexと、MCPサーバーの実体であるSQLclはstdio(標準入出力)で通信しています。ユーザー認証はしていません。SQLclがデータベースに接続する際に、ユーザー認証をしています。そのため、環境変数TNS_ADMINがMCPサーバーとして起動されるSQLclに渡されていれば、MCPクライアントがなんであれEntra IDによるユーザー認証が行われます。
次にリモートMCPサーバーを登録して、ユーザー認証を行なってみます。
プロジェクトのフォルダに移動し、作成済みのMCPサーバーを削除します。
claude mcp remove oracle-shsh-sales-analysis % claude mcp remove oracle-sh
Removed MCP server "oracle-sh" from project config
File modified: /Users/**********/Documents/sh-sales-analysis/.mcp.json
sh-sales-analysis %
リモートMCPサーバーとしてords-sampleserverを追加します。claude mcp add-jsonコマンドを使用します。
claude mcp add-json ords-sampleserver \
'{"type":"http","url":"https://ホスト名/ords/apexdev/sampleserver/mcp","oauth":{"clientId":"ORDS MCP Clientのアプリケーション(クライアントID)","callbackPort":8789,"scopes":"api://ORDS MCPのアプリケーション(クライアント)ID/mcp:connect"}}' \
--scope project
オプションの--scope projectは、プロジェクト・ディレクトリ下の.mcp.jsonに追加するという意味です。OAuthのscope指定ではありません。MCPサーバーはclaude mcp addコマンドでも追加できますが、OAuthのscopeを指定するオプションは無いため、add-jsonによるエントリの追加を行っています。
sh-sales-analysis % claude mcp add-json ords-sampleserver '{"type":"http","url":"https://************/ords/apexdev/sampleserver/mcp","oauth":{"clientId":"********-****-****-****-************","callbackPort":8789,"scopes":"api://********-****-****-****-************/mcp:connect"}}' --scope project
Added http MCP server ords-sampleserver to project config
sh-sales-analysis %
claude mcp add-jsonコマンドを実行すると、.mcp.jsonの内容が以下のようになります。
{
"mcpServers": {
"ords-sampleserver": {
"type": "http",
"url": "https://ホスト名/ords/apexdev/sampleserver/mcp",
"oauth": {
"clientId": "745d****-****-****-****-********d428",
"callbackPort": 8789,
"scopes": "api://378e****-****-****-****-********d5ed/mcp:connect"
}
}
}
}
- url: OpenRestyによるリバース・プロキシが動作しているホスト名で置き換えます。
- oauth.clientId: Entra IDにクライアントとして作成したアプリORDS MCP Clientのアプリケーション(クライアント)IDの値で置き換えます。
- oauth.scopes: Entra IDにサーバーとして作成したアプリORDS MCPに作成したスコープです。apiに続く識別子は、ORDS MCPのアプリケーション(クライアント)IDの値で置き換えます。
oauth.callbackPortとして8789を設定しています。この値を含む以下のURLを、Entra IDにリダイレクトURIとして設定します。
http://localhost:8789/callback
プラットフォームの種類はWebです。
以上の設定で、Claude CodeからリモートMCPサーバーords-sampleserverを呼び出す際に、Entra IDでユーザー認証できるようになります。
Claude CodeからMCPサーバーords-sampleserverを呼び出してみます。
「ords-sampleserverに接続して。」
Microsoft認証ページを開くというリンクをクリックしてと案内されます。
リンクをクリックするとブラウザが開き、サインインを促されます。
サインインします。
サインインに成功した後に、ブラウザに表示されるURLをコピーします。
Claude CodeにコピーしたURLを貼り付けると、サインインが完了します。
この後からリモートMCPサーバーのツールを呼び出せます。
デスクトップ・アプリでの認証は、上記のように一手間あります。コマンドラインでの認証では、URLのコピーと貼り付けは不要です。
認証情報はデスクトップ・アプリとコマンドラインで共有されるようです。コマンドラインでユーザー認証を行うと、デスクトップ・アプリでもMCPサーバーのツールにアクセスできるようになります。
プロジェクト・ディレクトリ以下の.codex/config.tomlに、以下を記述します。
[mcp_servers.ords-sampleserver]
type = "http"
url = "https://ホスト名/ords/apexdev/sampleserver/mcp"
bearer_token_env_var = "ORACLE_MCP_TOKEN"
あとは元記事にあるようにaz loginとaz account get-access-tokenを実行し、環境変数ORACLE_MCP_TOKENにアクセス・トークンを設定した上でCodexを起動します。
open -a Codex
CodexからMCPサーバーords-sampleserverを使用することができます。とはいえ、元記事と同様に、アクセス・トークンの有効期間は通常1時間程度なので、az account get-access-tokenコマンドは定期的に発行する必要があるし、また、更新したアクセス・トークンをCodexに認識させるためには、Codexを再起動する必要があります。
完