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を使うこともできるのではと思います。

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