2026年4月23日木曜日

Claude CodeとOpenAI Codexから呼び出すMCPサーバーをMicrosoft Entra IDで認証する

先日の記事「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-sh

sh-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"
} } } }
Microsoft Entra IDの設定を記事「Role based JWT profileで保護したORDS REST APIにアクセスする - Microsoft Entra ID編」にそって実装している場合、以下のようになります。
  • 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については、以前の記事「OpenAI CodexからリモートMCPサーバー経由でOracle Databaseに問い合わせる」が、そのまま適用できます。

プロジェクト・ディレクトリ以下の.codex/config.tomlに、以下を記述します。
[mcp_servers.ords-sampleserver]
type = "http"
url = "https://ホスト名/ords/apexdev/sampleserver/mcp"
bearer_token_env_var = "ORACLE_MCP_TOKEN"
あとは元記事にあるようにaz loginaz account get-access-tokenを実行し、環境変数ORACLE_MCP_TOKENにアクセス・トークンを設定した上でCodexを起動します。

open -a Codex

CodexからMCPサーバーords-sampleserverを使用することができます。とはいえ、元記事と同様に、アクセス・トークンの有効期間は通常1時間程度なので、az account get-access-tokenコマンドは定期的に発行する必要があるし、また、更新したアクセス・トークンをCodexに認識させるためには、Codexを再起動する必要があります。


MCPプロトコルとしては、DCRよりClient ID Metadata Documentを採用する方向のようなので(MCP Protocol Version 2025-11-25)、ユーザー認証の部分についてはこれから改善されると思われます。


2026年4月22日水曜日

Claude CodeおよびOpenAI CodexでAgent Skillsを参照しMCPサーバー経由でOracle Databaseに問い合わせる

Claude CodeおよびOpenAI Codexでプロジェクトを作成し、そのプロジェクトに含めたAgent Skillsを参照してOracle Databaseに問い合わせを行います。データベースへの問い合わせには、SQLclのMCPサーバーを使用します。接続先のデータベースとして、Oracleが提供しているFreeSQL(https://freesql.com/)を使用します。

Claude CodeとOpenAI Codexの間でAgent Skillsを共用するために、Microsoftが提供しているAPM(Agent Package Manager)を採用します。

作業はmacOSで実施します。Claude Desktop、Codex、git、apm、SQLcl(コマンド名はsql)、JavaはWindowsでも動作するため、Windowsでも同様に作業できるでしょう。

OracleのFreeSQL.comには、Oracleが提供しているサンプル・スキーマがインストール済みです。今回使用するAgent Skillsには、サンプル・スキーマSales Historyへの問い合わせ方法を記述しています。

SQLclとgitはインストール済みとします。

最初にAPMをインストールします。APMのQuick Startに記載されているコマンドを実行します。

macOSでは以下のコマンドを実行します。

curl -sSL https://aka.ms/apm-unix | sh

~ % curl -sSL https://aka.ms/apm-unix | sh

-e 

╔══════════════════════════════════════════════════════════════╗

                        APM Installer                       

              The NPM for AI-Native Development              

╚══════════════════════════════════════════════════════════════╝

-e 

-e Detected platform: darwin-arm64

-e Target binary: apm-darwin-arm64.tar.gz

-e Note: Will need sudo permissions to install to /usr/local/bin

-e Fetching latest release information...

-e Latest version: v0.9.0

-e Download URL: https://github.com/microsoft/apm/releases/download/v0.9.0/apm-darwin-arm64.tar.gz

-e Downloading APM...

-e ✓ Download successful

-e Extracting binary...

-e ✓ Extraction successful

-e Testing binary...

-e ✓ Binary test successful

-e Installing APM CLI to /usr/local/bin...

Password:

-e ✓ APM installed successfully!

-e Version: Agent Package Manager (APM) CLI version 0.9.0 (303a3a2)

-e Location: /usr/local/bin/apm -> /usr/local/lib/apm/apm


-e 🎉 Installation complete!


-e Quick start:

  apm init my-app          # Create a new APM project

  cd my-app && apm install # Install dependencies

  apm run                  # Run your first prompt


-e Documentation: https://github.com/microsoft/apm

-e Need help? Create an issue at https://github.com/microsoft/apm/issues

~ % 


確認を兼ねて、インストールされたAPMのバージョンを表示してみます。

apm --version

 ~ % apm --version

Agent Package Manager (APM) CLI version 0.9.0 (303a3a2)

~ % 


APM向けにスキルを記述したリポジトリsh-sales-analysisをクローンします。

git clone https://github.com/ujnak/sh-sales-analysis.git
cd sh-sales-analysis

.apm/instructions/sh-schema.instructions.mdおよび.apm/skills/*/SKILL.mdが、Agent Skillsとして含まれています。スキルを参照した上でOracle Databaseに問い合わせができることを確認するためだけのスキルで、スキル自体はClaudeに生成させたものをそのまま使用しています。そのため、スキルとして参考になるものではありません。

スキル以外にapm.ymlを含んでいます。

Documents % git clone https://github.com/ujnak/sh-sales-analysis.git


Cloning into 'sh-sales-analysis'...

remote: Enumerating objects: 19, done.

remote: Counting objects: 100% (19/19), done.

remote: Compressing objects: 100% (14/14), done.

remote: Total 19 (delta 0), reused 19 (delta 0), pack-reused 0 (from 0)

Receiving objects: 100% (19/19), 9.78 KiB | 9.78 MiB/s, done.

Documents % cd sh-sales-analysis 

sh-sales-analysis %  


次にデータベースを準備します。

FreeSQに接続します。


右上のSign Inをクリックし、FreeSQLにサインインします。FreeSQLへのサインインには、Oracleアカウントを使用します。

FreeSQLにサインインすると、Connect to the Database, Connect to Javaと表示されるボタンがあります。これをクリックします。


ドロワーが開きます。最初はパスワードが生成されていないため、Regenerateボタンをクリックします。

Regenerateをクリックすると、Use SQLcl to get startedにパスワードを含んだ、データベースへの接続文字列が表示されます。この接続文字列をコピーします。


手元のPCに戻りSQLclを起動します。

sql /nolog

sh-sales-analysis % sql /nolog          


SQLcl: 水 4月 22 14:11:30 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


SQL> 


FreeSQLよりコピーした接続文字列を指定して、データベースに接続します。接続は名前をつけて保存します。

接続の名前はfreesqlとしています。

conn -save freesql -savepwd YUJI_********_SCHEMA_2XU9P/*************************************@//db.freesql.com:1521/26ai_un3c1

SQL> conn -save freesql -savepwd YUJI_***********_SCHEMA_2XU9P/********************************@//db.freesql.com:1521/26ai_un3c1

名前: freesql

接続文字列: //db.freesql.com:1521/26ai_un3c1

ユーザー: YUJI_****************_SCHEMA_2XU9P

パスワード: ******

接続しました.

SQL> 


保存された接続をリストします。

connmgr list

SQL> connmgr list

.

├── adb-apexdev

├── freesql

├── local-26ai-apexdev

└── local-26ai-sys

SQL> 


以上で、SQLclのMCPサーバーから利用できるデータベース接続としてfreesqlが保存されました。

調べてみたのですが、FreeSQLで生成したパスワードの有効期限は不明でした。1時間くらいは有効だろうと思いますが、作業中はFreeSQL.comは、サインインした状態を維持しておくと良いでしょう。

リポジトリsh-sales-analysisをクローンしたディレクトリに移動し、Claude Code向けにスキルをインストールします。

apm install --target claude

sh-sales-analysis % apm install --target claude

[>] Installing dependencies from apm.yml...


  [+] <project root> (local)

  |-- 1 rule(s) integrated -> .claude/rules/

  |-- 4 skill(s) integrated -> .claude/skills/

+- MCP Servers (1)

|  + oracle-sh (already configured)

+- All servers up to date


[*] Installed 1 APM dependency.

sh-sales-analysis % 


MCPサーバーについて、apm.ymlに以下のように記載しています。SQLcl(sqlコマンド)がインストールされているパスは変更が必要かもしれません。
dependencies:
  mcp:
  - name: oracle-sh
    registry: false
    transport: stdio
    command: /opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql
    args:
        - -mcp
        - -R
        - 4
scripts: {}
ターゲットがClaudeの場合、apm.ymlに記載したMCPサーバーの設定がインストールされないようです。そのため、手動でMCPサーバーを設定します。ディレクトリsh-sales-analysisの下に設定ファイル.mcp.jsonを作成します。内容として以下を記述します。
{
  "mcpServers": {
    "oracle-sh": {
      "command": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
      "args": [
          "-mcp","-R","4"
      ]
    }
  }
}
以上でディレクトリ(Claudeではフォルダーと呼んでいます)の準備ができました。

ClaudeのDesktopアプリからCodeを開きます。

新規セッションを開始し、スキルをインストールしたフォルダーを選択します。


参照できるスキルを一覧します。

「参照できるスキルを一覧して。」

分析系スキルとして、インストールしたスキルが一覧されます。


使用できるMCPサーバーを一覧します。

「使用できるMCPサーバーを一覧して。」

.mcp.jsonに設定したMCPサーバーが一覧されます。


スキルとMCPサーバーを組み合わせて、分析を実施します。

「MCPサーバーoracle-shのfreesqlに接続して、Oracle SHスキーマの販売データを総合分析を実施して。」



MCPサーバーのツール実行と、スキルの参照が行われたことは確認できます。スキルの内容が適切かどうかを検証していないので、Claude Codeの出力については、なんとも言えません。しかし、MCPサーバー経由でデータベースを検索できて、かつ、スキルに従って分析作業が実行されたことは確認できます。

続いて、同様の作業をOpenAI Codex向けに実施します。

Codex向けにスキルをインストールします。

apm install --target codex

sh-sales-analysis % apm install --target codex

[>] Installing dependencies from apm.yml...


  [+] <project root> (local)

  |-- 4 skill(s) integrated -> .agents/skills/

+- MCP Servers (1)

|  >  oracle-sh (self-defined, stdio)

|     +- Configuring for Codex...

  Installing oracle-sh...

Successfully configured MCP server 'oracle-sh' for Codex CLI

  + oracle-sh

|  +  oracle-sh -> Codex (configured)

+- Configured 1 server


[*] Installed 1 APM dependency and 1 MCP server.

sh-sales-analysis % 


apm.ymlにはMCPサーバーが設定されていますが、これはグローバル・スコープでインストールされる(~/.codex/config.tomlに追加される)ようです。apm install --helpのオプション--globalに「 MCP servers target global-capable runtimes only (Copilot CLI, Codex CLI).」と記載されているので、そういうものかもしれません。

MCPサーバーをプロジェクト・ローカルにインストールするために、手動でconfig.tomlを作成します。プロジェクト・フォルダーに設定ファイル.codex/config.tomlを作成し、以下を記述します。
[mcp_servers.oracle-sh]
command = "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql"
args = [ "-mcp", "-R", "4"]
id = ""
次回からはMCPサーバーをインストール対象から外すようにします。

apm install --only apm --target codex

Codexでの作業に移ります。

Codexでは新しいプロジェクトを追加する際に、リポジトリsh-sales-analysisをクローンしたディレクトリを選択します。


参照できるスキルを一覧します。

「参照できるスキルを一覧して。」

分析系スキルとして、インストールしたスキルが一覧されます。


使用できるMCPサーバーを一覧します。

「使用できるMCPサーバーを一覧して。」

config.tomlに設定したMCPサーバーが一覧されます。


スキルとMCPサーバーを組み合わせて、分析を実施します。

「MCPサーバーoracle-shのfreesqlに接続して、Oracle SHスキーマの販売データを総合分析を実施して。」



Codexでも、MCPサーバー経由でデータベースを検索できて、かつ、スキルに従って分析作業が実行されたことが確認できます。

コーディング作業をするわけではないので、最初はClaude CodeではなくCoworkで試していたのですが、Coworkでのスキルの追加はプラグインで行い、プロジェクト・フォルダー以下のスキルは参照しないようです。そのため、Claude Codeを使った作業に切り替えました。

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