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でデータベースへの接続を認証できることも確認できています。

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