2026年5月1日金曜日

Gemini CLIからOracle Databaseに接続するMCPサーバーを呼び出す

GoogleのGemini CLIからMCPサーバーを通してOracle Databaseにアクセスしてみました。

macOS上のGemini CLI 0.40.1で作業を実施しています。Gemini CLIでのMCPサーバーの設定については、主に以下のドキュメントを参照しています。

MCP servers with Gemini CLI

データベースやMCPサーバーの構成手順はClaude Code、CodexやOpenCodeのときと同じです。Microsoft Entra IDの設定も含めて、それらはそのまま流用します。

以前に作成したスキルを流用するため、GitHubのリポジトリsh-sales-analysisをクローンします。

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

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

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

remote: Enumerating objects: 28, done.

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

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

remote: Total 28 (delta 3), reused 27 (delta 2), pack-reused 0 (from 0)

Receiving objects: 100% (28/28), 10.77 KiB | 5.39 MiB/s, done.

Resolving deltas: 100% (3/3), done.

% cd sh-sales-analysis

sh-sales-analysis % 


リポジトリに含まれる販売分析のスキルを、Gemini CLI向けにインストールします。APMのv0.9.3以降より、ターゲットとしてGemini CLIをサポートしています。

apm install --only apm --target gemini --force

sh-sales-analysis % apm install --only apm --target gemini --force

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


  [+] <project root> (local)

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


[*] Installed 1 APM dependency.

sh-sales-analysis % 


SQLclのMCPサーバーを構成します。.gemini/settings.jsonにMCPサーバーに関する設定を追記します。
{
  "mcp": {
    "allowed": ["oracle-sh"],
    "excluded": []
  },
  "mcpServers": {
    "oracle-sh": {
      "command": "/opt/homebrew/Caskroom/sqlcl/26.1.0.086.1709/sqlcl/bin/sql",
      "args": ["-R", "4", "-mcp"],
      "env": {
        "TNS_ADMIN": "/Users/username/Documents/mcp-salesadb"
      },
      "trust": false
    }
  }
}
Gemini CLIを実行します。

gemini

MCPサーバーが1つ、スキルが4つ認識されていることが確認できます。


/authコマンドを実行してGoogleのモデルを呼び出せるように認証する、また、MCPサーバーの設定を読み出すには/permissionsコマンドを実行し、プロジェクト・フォルダを信頼する必要があるようです。

認識されているMCPサーバーをリストします。

/mcp list

SQLclのMCPサーバーとしてoracle-shが認識されていることが確認できます。


oracle-shで利用可能な接続を一覧します。

「 oracle-shで利用できる接続を一覧して。」


ローカルで実行しているデータベースへの接続local-26ai-apexdevに接続します。

「local-26ai-apexdevに接続して。」


スキルを参照した検索を実行します。

「 売り上げの地域別のランキングを調べて。」

スキルとしてrankingが選択されました。使用するかどうか確認を求められたので、Allow for this sessionを選択しています。


実行するSELECT文を生成し、ツールrun-sqlを呼び出します。結果が表形式で返されました。


続いて、リモートMCPサーバーsampleserverを呼び出してみます。

OAuthに関連しして設定できる属性は、以下にリストされています。


.gemini/settings.jsonで、この中のclientIdclientSecretscopesを以下のように指定します。redirectUriとして設定するURLは、Entra IDに作成したアプリにリダイレクトURIとして追加しておきます。
{
  "mcp": {
    "allowed": ["ords-sampleserver"],
    "excluded": []
  },
  "mcpServers": {
    "ords-sampleserver": {
      "httpUrl": "https://ホスト名/ords/apexdev/sampleserver/mcp",
      "oauth": {
         "clientId": "${ORDS_MCP_CLIENT_ID}",
         "clientSecret": "${ORDS_MCP_CLIENT_SECRET}",
         "scopes": ["api://378e****-****-****-****-********d5ed/mcp:connect"],
         "redirectUri": "http://localhost:60655/oauth/callback"
      }
    }
  }
}
.gemini/settings.jsonを更新し、Gemini CLIを実行します。

クライアントIDとクライアント・シークレットは、Gemini CLIを起動する前に環境変数ORDS_MCP_CLIENT_IDおよびORDS_MCP_CLIENT_SECRETとして設定します。

Microsoft Entra IDの設定手順は、記事「Role based JWT profileで保護したORDS REST APIにアクセスする - Microsoft Entra ID編」にて紹介しています。

httpUrlのホスト名はOpenRestyがリバース・プロキシとして動作しているホスト名に置き換えます。またoauth.scopesはEntra IDに登録されているアプリORDS MCPに設定されたスコープに置き換えます。

環境変数を設定し、geminiを起動します。

export ORDS_MCP_CLIENT_ID=[OAuthクライアントID]
export ORDS_MCP_CLIENT_SECRET=[OAuthクライアント・シークレット]
gemini

認識されているMCPサーバーをリストします。

/mcp list

リモートMCPサーバーords-sampleserverのステータスは、Disconnect (OAuth not authenticated)と表示されています。


OAuthでの認証を実行します。

/mcp auth ords-sampleserver


以下のエラーが発生しました。

Failed to authenticate with MCP server 'ords-sampleserver': Protected resource 378e****-****-****-****-********d5ed does not match
expected https://ホスト名/ords/apexdev/sampleserver/mcp

リモートMCPサーバーの保護については、リバース・プロキシが稼働しているホストが返す、/.well-known/oauth-protected-resourceに以下のように設定しています。
{
  "resource": "378e****-****-****-****-********d5ed",
  "authorization_servers": [ 
    "https://login.microsoftonline.com/3940****-****-****-****-********2758/v2.0"
  ],
  "scopes_supported": ["api://378e****-****-****-****-********d5ed/mcp:connect"]
}
エラー・メッセージは、ここでresourceに設定している値がhttpUrlとして設定しているリモートMCPサーバーのアドレスに一致していないため、認証できないと言っています。

確認のために、/.well-known/oauth-protected-resourceのresourceに、httpUrlの値を設定してみます。

以下のように、OAuthによる認証が先に進みます。

Authentication required for MCP Server: 'ords-sampleserver.' Opening authentication page in your browser.

Do you want to continue?

1. Yes
2. No


1. Yesを選択し、OAuthによる認証を実行します。

ブラウザ開きますが、resourceの指定が正しくないため(と思われる)Entra IDでの認証がinvalid_targetで失敗します。

Authentication Failed

Error: invalid_target

AADSTS9010010: The resource parameter provided in the request doesn't match with the requested scopes.

resourceの値をhttpUrlと一致させれられるIdPであればGemini CLIでの認証を通せると思われますが、Microsoft Entra IDでそのような設定をする方法は見つけられませんでした。

Microsoft Entra IDでのリモートMCPサーバーの保護については残念でしたが、Gemini CLIでSQclのMCPサーバーを呼び出せること、また、Microsoft APMで管理しているスキルが使用できることが確認できました。また、SQLclでの接続であれば、OAuthでデータベースへの接続を認証できることも確認できています。

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

  

2026年4月30日木曜日

Microsoft APMのapm.ymlにOracle Databaseのスキルを含める

Oracle Corporationが公開しているGitHubのリポジトリに、skillsが含まれています。

https://github.com/oracle/skills

SkillsはできるだけMicrosoft APM(Agent Package Manager)で管理したいので、上記で公開されているOracleのスキルをapm.ymlに追加する方法を確認しました。

Git管理下のスキルはdependenciesのapmに、以下のように追加します。(Example: apm.ymlに記載されています)。
dependencies:
  apm:
    # Oracle Database Skills
    - git: https://github.com/oracle/skills
      path: db
      ref: main
refにはブランチ名、タグ、コミット、完全なSHAの値のどれかを指定できます。

2026年4月30日現在では、指定できるパスとしてはapexdbfusiongraalociの5つがありますが、dbgraalを除くと、以下の内容のSKILL.mdがあるだけのようです。
# Oracle Cloud Infrastructure Skills

This file is a sample domain skeleton.

For the repo-wide structure and authoring pattern, read the root `README.md` and `SKILL_AUTHORING_GUIDE.md`.
dependenciesのapmにOracle Databaseのスキルを追加して、それぞれインストールしてみます。

OpenCode向けにインストールします。

apm install --only apm --target opencode --force

% apm install --only apm --target opencode --force

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

  [+] github.com/oracle/skills/db#main #main @66074f9d (cached)

  |-- Skill integrated -> .opencode/skills/


  [+] <project root> (local)

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


[*] Installed 2 APM dependencies.

% ls .opencode/skills/db

admin architecture devops migrations performance SKILL.md

agent containers features monitoring plsql sql-dev

appdev design frameworks ords security sqlcl

% 


Claude Code向けにインストールします。

apm install --only apm --target claude --force

% apm install --only apm --target claude --force

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

  [+] github.com/oracle/skills/db#main #main @66074f9d (cached)

  |-- Skill integrated -> .claude/skills/


  [+] <project root> (local)

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

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


[*] Installed 2 APM dependencies.

% ls .claude/skills/db

admin architecture devops migrations performance SKILL.md

agent containers features monitoring plsql sql-dev

appdev design frameworks ords security sqlcl

% 


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

apm install --only apm --target codex --force

% apm install --only apm --target codex --force 

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

  [+] github.com/oracle/skills/db#main #main @66074f9d (cached)

  |-- Skill integrated -> .agents/skills/


  [+] <project root> (local)

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


[*] Installed 2 APM dependencies.

% ls .agents/skills/db

admin architecture devops migrations performance SKILL.md

agent containers features monitoring plsql sql-dev

appdev design frameworks ords security sqlcl

% 


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

2026年4月24日金曜日

OpenCodeから呼び出すMCPサーバーをMicrosoft Entra IDで認証する

先日の記事にて、Claude CodeおよびOpenAI CodexからMCPサーバーを通してOracle Databaseにアクセスしてみました。同じ作業をOpenCodeから実施してみます。

最初にOpenCodeをインストールします。https://opencode.aiを開くと、ページの先頭にOpenCodeをインストールするコマンドが書かれています。私の環境はmacOSなので、brewでインストールしました。


データベースやMCPサーバーの構成手順はClaude CodeやCodexのときと同じです。Microsoft Entra IDの設定も含めて、それらはそのまま流用します。

OpenCodeが使用するLLMはLM Studioで実行します。私の環境はメモリに余裕があるので、GPT-OSS 120Bを使うことにしました。ツール呼び出しに強いモデルを選ぶと良いでしょう。

API Model Identifierはmlx-community/gpt-oss-120b、The local server is reachable at: はhttp://127.0.0.1:1234となっています。これらの値は、後でOpenCodeの設定ファイルopencode.jsoncに記述します。


以前に作成したスキルを流用するため、GitHubのリポジトリsh-sales-analysisをクローンします。

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


% 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.

% cd sh-sales-analysis

sh-sales-analysis % 


リポジトリに含まれる販売分析のスキルを、OpenCode向けにインストールします。MCPサーバーはOpenCode向けにインストールされないため、対象から除外します。

apm install --only apm --target opencode

sh-sales-analysis % apm install --only apm --target opencode

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


  [+] <project root> (local)

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


[*] Installed 1 APM dependency.

sh-sales-analysis % 


プロジェクト・ディレクトリ直下にファイルopencode.jsoncを作成し、以下の内容を記述します。最初は、SQLclのMCPサーバーを使用してOracle Databaseに接続します。

選択するLLMのモデルや、SQLclのパスであるmcp.oracle-sh.commandの設定、環境変数TNS_ADMINが指すディレクトリmcp.oracle-sh.environment.TNS_ADMINの設定は、それぞれの構成に応じて変更します。

SQLclのMCPサーバーでは更新処理ができないように設定(オプション-R 4を付加)しているため、ツール呼び出しは無条件で許可しています。

環境の準備が整ったらOpenCodeを実行します。

opencode

OpenCodeが起動します。


/mcpsまたは/statusコマンドを実行し、MCPサーバーoracle-shがconnectedであることを確認します。


以下のプロンプトを入力します。

「スキーマSHの情報より、販売分析を実施してください。」


LLMのThinkingの出力として、スキルsales-analysisに従って作業すること、データベースの接続としてsalesadb-azを選択してスキーマSHの情報を参照すること、などが出力されています。データベースの接続は、初回はlist-connectionsの結果が一覧され、どの接続を使うか入力を求められました。以降は、ユーザーに問い合わせることなく、前回選択したsalesadb-azに接続しています(そのようにThinkingに出力されている)。

データベースの接続としてsalesadb-azが選択されると、これは接続文字列のTOKEN_AUTHにAZURE_INTERACTIVEが設定されているため、ブラウザが起動しMicrosoft Entra IDへのサインインが求められます。正しくサインインするには、URLに含まれるorganizationsテナントIDに置き換える必要があります。

最終的に、スキルsales-analysisにそった出力が生成されます。


続いて、リモートMCPサーバーsampleserverを呼び出して、同じプロンプトを実行してみます。

opencode.jsoncを以下に置き換えます。mcpの設定が変更されています。

IdPがMicrosoft Entra IDの場合、clientIdclientSecretscopeの指定が必要です。他のIdPであれば、おそらく、これらの設定は不要でしょう(必要だったとしてもclientIdのみ)。

クライアントIDとクライアント・シークレットは、OpenCodeを起動する前に環境変数ORDS_MCP_CLIENT_IDおよびORDS_MCP_CLIENT_SECRETとして設定します。

Microsoft Entra IDの設定手順は、記事「Role based JWT profileで保護したORDS REST APIにアクセスする - Microsoft Entra ID編」にて紹介しています。

urlホスト名はOpenRestyがリバース・プロキシとして動作しているホスト名に置き換えます。またoauth.scopeはEntra IDに登録されているアプリORDS MCPに設定されたスコープに置き換えます。

リモートMCPサーバーの認証を実施します。

export ORDS_MCP_CLIENT_ID=[OAuthクライアントID]
export ORDS_MCP_CLIENT_SECRET=[OAuthクライアント・シークレット]
opencode mcp auth ords-sampleserver


sh-sales-analysis % export ORDS_MCP_CLIENT_ID=[クライアントID]

sh-sales-analysis % export ORDS_MCP_CLIENT_SECRET=[クライアント・シークレット]

sh-sales-analysis % opencode mcp auth ords-sampleserver


  MCP OAuth Authentication

  ords-sampleserver has expired credentials. Re-authenticating...

  Starting OAuth flow.


Entra IDのアプリにリダイレクトURIを設定していないため、以下のエラーが発生します。

リダイレクトURIとして設定するURLは以下です。おそらく、ポート番号は固定ではないでしょう。

http://127.0.0.1:19876/mcp/oauth/callback


ポート番号が固定、もしくはOpenCodeで固定する方法があるという前提で、上記のコールバックURLをMicrosoft Entra IDに登録します。

Entra IDに作成したクライアントに対応するアプリ(元記事の手順に従うとORDS MCP Clientとして作成したアプリ)のリダイレクトURIの追加を実行します。


プラットフォームとしてWebを選択します。


Microsoft Entra IDでは、http://127.0.0.1で始まるURLはリダイレクトURIとして設定できないようです。

"HTTPS" または "http://localhost" で始める必要があります


ChatGPTに聞いたところ、マニフェストを直接編集すれば追加できるとのことなので、マニュフェストを編集します。


マニフェストに以下のようにweb.redirectUrisの属性がある場合は、その属性にリダイレクトURIを追加します。
    "web": {
        "homePageUrl": null,
        "logoutUrl": null,
        "redirectUris": [
            "http://localhost:8789/callback",
            "https://chatgpt.com/connector/oauth/br-kYl0HI26f",
            "https://claude.ai/api/mcp/auth_callback",
            "http://127.0.0.1:19876/mcp/oauth/callback"
        ],
新しいバージョンの書式であれば、replyUrlsWithTypeの配列に追加します。
    "replyUrlsWithType": [
        {
            "url": "http://127.0.0.1:19876/mcp/oauth/callback",
            "type": "Web"
        },
        {
            "url": "http://localhost:8789/callback",
            "type": "Web"
        },
リダイレクトURIを追加して保存します。


再度、リモートMCPサーバーを認証します。今度は認証に成功します。

opencode mcp auth ords-sampleserver

sh-sales-analysis % opencode mcp auth ords-sampleserver


  MCP OAuth Authentication

  ords-sampleserver has expired credentials. Re-authenticating...

  Authentication successful!

  Done


sh-sales-analysis % 


OpenCodeを実行します。

opencode


SQLclのMCPサーバーと同じプロンプトを入力します。

「スキーマSHの情報より、販売分析を実施してください。」


例えば日本語や特定の業務に特化したLLMがあり、Oracle Databaseに保管されたデータを使った分析を行いたい、そして分析手順をスキル(Agent Skills)にしたいといった場合、その作業はコーディングではありませんがOpenCodeを使うこともできるのではと思います。

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

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)、ユーザー認証の部分についてはこれから改善されると思われます。