2026年9月10日木曜日

国土地理院が公開している自然災害伝承碑データより伝承碑の位置を表示するAPEXアプリをCodexで作成する

国土交通省の機関である国土地理院よりオープン・データとして、自然災害伝承碑データが公開されています。過去に発生した災害を後世に伝えるために全国各地に建立されている伝承碑の、位置情報および災害名、災害種別、伝承内容などがオープン・データに含まれています。

国土地理院 - 自然災害伝承碑データの提供について
https://www.gsi.go.jp/bousaichiri/denshouhi_datainfo.html

このオープン・データのGeoJSONファイルより、OpenAI Codexを使って伝承碑が存在する場所や伝承碑の説明を表示するAPEXアプリケーションを作成します。一覧する伝承碑を絞り込むために、ファセット検索も組み込みます。

Codexが作成したAPEXアプリケーションは以下のように動作します。


OpenAI CodexとモデルにGPT-6 Astra(軽)を使用しました。

Oracle APEXのアプリケーションを作成するため、Oracle Corporationから配布されているOracle DatabaseとAPEXlangのスキルを使用しています。

APEXlangのスキルはOracle APEXのリリース・サイクルとは独立してアップデートされています。APEXlangスキルのリリース・ノートは以下のリンクで公開されています。本記事の公開時点での最新リリースは2026.8.26です。


以前は指示通りに生成できなかったアプリケーションも、更新されたAPEXlangスキルでは生成できる可能性があります。

OpenAI CodexやClaude CodeといったAIコーディング・エージェントとAPEXlangを使ったアプリケーション作成については、Oracle APEX 26.1がリリースされたときにOracle CorporationのScott SpendoliniさんがAPEX Office Hoursで紹介されています。


このセッションの中で、SQLcl MCPサーバーの構成が推奨されています。


少なくてもCodexはSQLclをCLIで扱えるので、SQLclの構成は必要なさそうです。本記事ではSQLcl MCPサーバーは構成せず、SQLclのみでデータベースを操作しています。

また、あらかじめスターター・アプリケーションを作成することが推奨されていますが、最新のAPEXlangスキルでは、これも不要に見えます。本記事ではスターター・アプリケーションは作成していません。


GitHubにあるAPEXlangのREADME.mdにPrompt Examples by Taskとして、いくつかのプロンプトが紹介されています。


その中にWhole app from beginning to endとして、以下のプロンプトが紹介されています。
Create a dashboard page for order operations with KPI cards, a monthly revenue chart, and an interactive report. Use existing schema evidence and ask before guessing missing columns.
一般的なスターター・アプリケーションは不要と思われますが、APEX 26.1で導入されたボイラープレートのように、会社固有のテーマ、あらかじめ作成済みの認証スキーム、LOV、プラグインを含んでいるアプリケーションであれば、作成してプロジェクト・フォルダにエクスポートしておくと、アプリケーションの作成に必要な要件や指示が減り、時間とコストの節約になるでしょう。

以下よりCodexで行なった作業を紹介します。

最初にローカルのPCに作業フォルダを作成します。今回はndmm_monumentsとしてフォルダを作成しました。

国土地理院 - 自然災害伝承碑データの提供についてのページにアクセスし、ページの一番下にある免責事項同意するをクリックすると、データのダウンロード・ページに移ります。

GeoJSON形式のデータをダウンロードします。


ファイルは000250767.zipとしてダウンロードされます。このファイルを作業フォルダに配置し解凍します。解凍するとフォルダ20260827_GeoJSONが作成され、その下に20260827.geojsonとして、GeoJSON形式のデータファイルが作成されます。

ndmm_monuments % ls -l 20260827_GeoJSON

total 4760

-rw-rw-rw-@ 1 ********  staff     6729 12月 23  2021 0_はじめにお読みください(国土地理院コンテンツ利用規約).txt

-rw-rw-rw-@ 1 ********  staff     1229  1月 15  2024 1_データについて_geojson.txt

-rw-rw-rw-@ 1 ********  staff  2422479  8月 31 07:35 20260827.geojson

ndmm_monuments % 


作業フォルダにOracle DatabaseとAPEXlangのスキルをインストールします。スキルのインストール方法には色々ありますが、本記事ではMicrosoft APMを使用します。APMはあらかじめインストールしておきます。

作業ディレクトリに移動し、Oracle APEXとOracle DBのスキルをインストールします。

apm install oracle/skills/apex --target codex
apm install oracle/skills/db --target codex
apm deps list

APEXlangのスキルはoracle/skills/apexに含まれています。

ndmm_monuments % apm install oracle/skills/apex --target codex

[*] Validating 1 package...

[+] oracle/skills/apex

[*] Updated apm.yml with 1 new package(s)

[>] Installing 1 new package...

[>] Resolving skills-apex...

[i] Targets: codex  (source: --target flag)

  [+] github.com/oracle/skills/apex #default @fcbc9430

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

  [!] 1 dependency unpinned: oracle/skills -- add #tag or #sha to prevent drift

[*] Installed 1 APM dependency in 6.4s.

ndmm_monuments % apm install oracle/skills/db --target codex

[*] Validating 1 package...

[+] oracle/skills/db

[*] Updated apm.yml with 1 new package(s)

[>] Installing 1 new package...

[>] Resolving skills-db...

[i] Targets: codex  (source: --target flag)

  [+] github.com/oracle/skills/db #default @fcbc9430

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

  [!] 1 dependency unpinned: oracle/skills -- add #tag or #sha to prevent drift

[*] Installed 1 APM dependency in 6.7s.

ndmm_monuments % apm deps list                              

                                       APM Dependencies (Project)                                      

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━┓

Package                     Version Source   Prompts Instructions Agents Skills Hooks

┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━╇━━━━━━━┩

oracle/skills/apex          unknown github       -          -         -      1      -  

oracle/skills/db            unknown github       -          -         -      1      -  

oracle/skills/apex/apexlang unknown orphaned     -          -         -      1      -  

└─────────────────────────────┴─────────┴──────────┴─────────┴──────────────┴────────┴────────┴───────┘

[!] 1 orphaned package(s) found (not in resolved dependency graph):

[!]   - oracle/skills/apex/apexlang

[i] Run 'apm prune' to remove orphaned packages

ndmm_monuments % 


OpenAI ChatGPTのデスクトップ・アプリよりCodexを選択し、プロジェクトを作成します。

プロジェクトタイプローカルを選択します。次へ進みます。


プロジェクト名自然災害伝承碑マップとします。ソースフォルダに作成済みの作業フォルダーを割り当てます。

以上でプロジェクトを作成します。


プロジェクトを作成したのち、最初の指示として以下を与えました。概ね口頭での話し言葉で実施してほしい作業を伝えています。

SQLclの実行ファイルの位置、SQLclの保存済みの接続名、接続先となるスキーマ名やAPEXワークスペース名は作業を行う環境に合わせて変更します。
国土地理院からダウンロードした日本の自然災害伝承碑のGeoJSONのデータを、Oracle DatabaseにロードしてOracle APEXのマップ上に表示するアプリケーションを作成します。

データベースに接続するために使用するSQLclの実行ファイルは/opt/homebrew/bin/sqlclです。

接続先となるデータベースは、SQLclの保存済みの接続local-26ai-apexdevを使って接続します。

APEXアプリケーションを作成するワークスペースはAPEXDEVです。

保存済みの接続local-26ai-apexdevでは、スキーマAPEXDEVに接続されます。これはAPEXのワークスペースAPEXDEVのデフォルト・パーシング・スキーマです。

表などのデータベース・オブジェクトはスキーマAPEXDEV以下に作成します。

データを保存する表は、これから伝える条件で作成してください。

自然災害伝承碑のデータを利用するにあたって、公開されている以下のファイルの内容に配慮してください。
20260827_GeoJSON/0_はじめにお読みください(国土地理院コンテンツ利用規約).txt
20260827_GeoJSON/1_データについて_geojson.txt

ソースとなる自然災害伝承データは、 ファイル20260827_GeoJSON/20260827.geojsonに保存されています。

このGeoJSONファイルをデータベースの表にロードしてください。

作成する表はNDMM_MONUMENTSとします。

GeoJSONの1つのFeatureを1行として保存し、proppertiesはそれぞれ列として定義します。

Featureには、"ID", 碑名",  "建立年","所在地", "災害名", "災害種別", "伝承内容", "公開日", "修正等公開日", "制限事項" があります。

これらのFeatureを表の列として定義します。この他に自然災害伝承碑の座標を列として定義します。

表の列として定義するにあたり、列名は英語にしてください。データ型はファイルから実際のデータ型を参照して適切なデータ型を選んでください。

geometryについては、SDO_GEOMETRY型の列として保存してください。

データベースに表を作成したら、ファイル20260827_GeoJSON/20260827.geojsonの内容を作成した表NDMM_MONUMENTSにロードしてください。

データをすべて表NDMM_MONUMENTSにロードした後、geometryを保存した列にOracle Spatialの空間索引を作成してください。

これから、新規に作成するAPEXアプリケーションの要件を説明します。

新規に作成するAPEXアプリケーションの名前は「自然災害伝承碑マップ」とします。

アプリケーション別名はndmm_monumentsとします。

上記の表NDMM_MONUMENTSをデータ・ソースとしたファセット検索付きのマップ・リージョンを持つページを作成してください。

作成したページには、国土地理院コンテンツ利用規約に沿って、出典と行なった加工と編集について表示してください。

マップ・リージョンの他に、マップ上に表示されている自然災害伝承碑の行を一覧するクラシック・レポートのリージョンを作成してください。

災害種別と災害名をファセットとしてください。

マップ上にそれぞれの自然災害伝承碑を配置してください。

マップ上のポイントをクリックして開く情報ボックスに、表NDMM_MOMENTSのgeometryを除く列を表示するようにしてください。
APEXlangのスキルには、与えられた指示から作業プランをMarkdownファイルに生成してから作業を始めるようなワークフローが定義されている模様です。作業フォルダ以下には、そういった作業途中で生成されたファイルが残されています。


APEXlang形式のアプリケーションの保存先を聞かれたり、Chromeが起動して作成されたAPEXアプリケーションへのサインインを求められました。Chromeの操作のために、コンピュータの制御をCodex Computer Useが行えるように許可しておく必要があります。

22分で表の作成とデータロードを含めて、指示したAPEXアプリケーションが作成されました。


最初に作成されたアプリケーションです。修正したい部分がいくつか見つかりました。


災害種別のファセットが"洪水・土砂災害"のように、複数の種別がファセットの選択肢として1つになっていました。これはもともとGeoJSONの"災害種別"のプロパティの値が"洪水・土砂災害"であったためです。これをで分割して、それぞれを災害種別として選択できるように変更を依頼しました。

「災害種別のファセットは複数の値を「はい」にして、区切り文字を・、そして選択した値はANDで表示する伝承碑を選択するように、ファセットの設定を変更してください。」


3分40秒で修正が完了しました。

表示中の自然災害伝承碑を一覧するクラシック・レポートとリージョンの間にパディングが含まれていていたため、削除するよう依頼しました。

「表示中の自然災害伝承碑のクラシック・レポートのパディングを削除して、リージョンの外枠との隙間を無くしてください。」


約7分で修正が完了しました。

クラシック・レポートのページ送りのコントロールがクラシック・レポートの右下のみに配置されていました。これを右上にも配置するよう依頼しました。

「ページ送りのコントールをリージョンの右下だけでなく、右上にも追加してください。」


13分半で修正が完了しました。人の感覚ではちょっとした作業なのですが、AIの作業としては時間がかかっていて不思議な感じがします。

地図をズーム・イン/アウトしたり移動したときに、地図の表示範囲に含まれる伝承碑がクラシック・レポートに一覧されています。この処理がファセットに適用されていませんでした。

同様の処理をファセットに実装するよう依頼しました。

「地図上に表示されている伝承碑はクラシック・レポートに反映されていますが、検索条件を表示するファセットには反映されていません。クラシック・レポートと同様にファセットにも反映するようにしてください。」

2回アプリケーションへのログインを要求されていますが、これは1回目は修正に失敗していてエラーが発生していました。そのエラーを修正した後に2回目のログインを要求されています。


約11分で修正が完了しました。

地図上のポイントをクリックしたときに表示される情報ボックスの大きさが縦に長く、地図上に全体が表示されずに溢れていたため、情報ボックスが横長になるように修正を依頼しました。

「地図上の伝承碑のポイントをクリックしたときに表示される情報ボックスですが、地図の領域からはみ出てすべての情報が表示されません。横幅を2倍に広げて、縦方向の長さは半分にしてください。」


約5分で修正が完了しました。

以上で、記事の先頭のGIF動画のアプリケーションが作成されました。

修正点のまとめです。


実は先日までCodexとGPT-5.6 Sol(中)で、同じ仕様のAPEXアプリケーションを作成していました。初回はコマンドラインのCodexで作成し、Codexだけで作成できることを確認するのにだいたい1日かかりました。次に作業環境をデスクトップ・アプリのCodexに移し、GPT-5.6 Sol(中)で同じ指示でアプリケーションを作成しました。これは半日程度かかりました。なかなか動くコードが生成されず、プロンプトの与え方を色々と変えたり追加のプロンプトが必要だったことと、Computer Useが今ひとつでCodexによるデバッグに制限があったためだと考えています。

GPT-5.6 Solで作業をしていたプロジェクトは削除し、新しくプロジェクトを作成した上でGPT-6 Astraで作業しているのですが、昨日までの作業の成功例が反映された結果、GPT-6 Astraの作業がスムーズに進んだ可能性はあります。

そのような可能性はありますが、それでもGPT-6 AstraによるAPEXアプリケーションの生成は印象的でした。

全ての指示を文字で与えていますが、与えた指示自体は話ことばにしています。おそらくAPEXアプリケーションは、AIコーディング・エージェントと会話をしながらでも作成できるでしょう。

今回、Codexが作成したAPEXアプリケーションのエクスポートを以下に置いています。
https://github.com/ujnak/APEXlang-exports/tree/main/ndmm_monuments

GPT-6 Astraが生成したコードも印象的です。

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

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2026年9月8日火曜日

MCP Toolbox for DatabasesをOracle IAMでOIDC認証する

先日の記事「GoogleのMCP Toolbox for DatabasesをOracle Databaseで使用してみる」にて構成したOracle Databaseに接続するMCP Toolbox for Databasesに、OpenID Connectによる認証を実装します。IdPにはOracle IAMを使用します。

MCP Toolbox for DatabaseでのOpenID Connectの設定については、以下で説明されています。

Documentation / Configuration / Authentication / Generic OIDC Auth
Generic OIDC Auth

MCPとしての認証は2. MCP Authorizationに記載があります。ドキュメントに記載されている設定例は以下です。
kind: authService
name: my-generic-auth
type: generic
audience: ${YOUR_TOKEN_AUDIENCE}
authorizationServer: https://your-idp.example.com
mcpEnabled: true
scopesRequired:
  - read
  - write
kind, name, type, mcpEnabled(これはtrueにする)は、MCP Toolboxとしての設定です。IdP側(今回はOracle IAM)から入手する必要がある設定値はaudienceauthorizationServerscopesRequiredになります。

MCP Toolboxとしては、authorizationServerの値はアクセス・トークンのiss(Issuer)の値と一致し、かつ、/.well-known/openid-configurationを加えることでOIDCのDiscovery URLとなることを期待しているようです。そのDiscovery URLより取得できるドキュメントに含まれる属性jwks_uriより、JWTの署名検証用の公開鍵を取得します。

Oracle IAMが発行するトークンのデフォルトの発行者(Issuer - issの値)はhttps://identity.oraclecloud.com/です。この発行者に/.well-known/openid-configurationをつけてもOIDC Discovery URLにはならないため、Oracle IAM側の発行者は変更する必要があります。

audienceはOracle IAMのドメインに作成した統合アプリケーションプライマリ・オーディエンスとして設定した値になります。プライマリ・オーディエンスを設定するには、統合アプリケーションにリソース・サーバーを構成する必要があります。

Oracle IAMではクライアントから提示されたスコープにより、リソース・サーバーが選択されます。そのため、リソース・サーバーにスコープを設定し、そのスコープがユーザー認証時にサーバーに送信されるように接続元のクライアント(今回はMCP Inspector)を構成する必要があります。リソース・サーバーに構成されたスコープは、MCP ToolboxのscopesRequiredに含めます。

MCP Toolboxに設定する値は、上記のように決まります。

以下より、Oracle IAMのドメインでの設定を行います。作業には費用がかからないドメイン・タイプFreeの、Defaultドメインを使用します。

Oracle Cloudのコンソールから、アイデンティティとセキュリティドメインを開きます。

ドメインDefaultを開きます。


ドメインURLをコピーします。このURLに/.well-known/openid-configurationを付けるとOIDC Discovery URLとなります。この値がMCP ToolboxのauthorizationServerの値の元になります。MCP ToolboxはauthorizationServerの値がIssuerの値であることを期待しているため、このドメインURL発行者とする必要があります。ドメインURLの末尾のポート番号:443があると発行者として設定できないため、発行者として登録するURLから:443を削除します。

結果としてMCP ToolboxにauthorizationServerとして設定する値は、ドメインURLから末尾の:443を除いたURLになります。


発行者を上記のドメインURLに変更します。

セキュリティ・タブを選択し、Oauth設定 - デフォルトのトークン発行ポリシーOAuth設定の編集を開きます。


デフォルトのトークン発行ポリシー発行者ドメインURL(ポート番号無し)を設定します。

変更の保存をクリックします。


デフォルトのトークン発行ポリシー発行者が更新されたことを確認します。


統合アプリケーションを作成します。

統合アプリケーション・タブを開き、アプリケーションの追加をクリックします。


アプリケーションのタイプとして機密アプリケーションを選択します。

ワークフローの起動をクリックします。


作成する機密アプリケーションの名前MCP Hotelsとします。説明は何でもよいのですが、Search for a hotelと記述しています。認証と認可権限付与を認可として実施オンにします。

以上を設定して送信します。


統合アプリケーションMCP Hotelsが作成されます。


OAuth構成・タブを選択し、OAuth構成の編集をクリックします。リソース・サーバー構成クライアント構成の双方を実施します。


クライアント構成はリソース・サーバーの構成を参照するため、リソース・サーバー構成を先に実施します。

このアプリケーションをリソース・サーバーとして今すぐ構成します、を選択します。選択すると、設定画面が表示されます。

必須ではありませんが、トークン・リフレッシュの許可オンにします。

プライマリ・オーディエンスはMCP Toolbox for Databasesの構成に依存します。今回はローカルホストでデフォルトのポート番号である5000番で接続を待ち受けるように構成しているため、プライマリ・オーディエンスは以下になります。最後にスラッシュをつけます。

http://localhost:5000/

これはMCP Toolboxのaudienceとして設定する値になります。また、MCP Toolboxの起動オプションの--toolbox-urlとして指定する値でもあります。

スコープの追加オンにし、スコープとしてmcphotelsを追加します。

ここで設定したスコープmcphotelsは、MCP ToolboxのscopesRequiredに含めます

リソース・サーバーを構成したところで、一旦送信します。


追加したスコープmcphotelsは、表示名MCP Hotels説明Search for a hotel.としています。


先ほどと同様にOAuth構成の編集を開き、今度はクライアント構成を実施します。

このアプケーションをクライアントとして今すぐ構成します、を選択します。選択すると、設定画面が表示されます。

認可認可される権限付与タイプとして、クライアント資格証明(これはおそらく無くてもよい)、リフレッシュ・トークン(リソース・サーバーでリフレッシュ・トークンを構成し、クライアントからもリフレッシュ・トークンを要求する場合に必要)、認可コード(必須)をチェックします。

HTTPS以外のURLを許可オンにし、今回クライアントとして使用するMCP InspectorのリダイレクトURLとして、以下の4つを設定します。

http://localhost:6274/oauth/callback
http://localhost:6274/oauth/callback/debug
http://127.0.0.1:6274/oauth/callback
http://127.0.0.1:6274/oauth/callback/debug

Claude CodeやOpenAI Codexから呼び出す場合は、それぞれのアプリケーションで決められているリダイレクトURLを追加します。

ページの下に移動し、リソースの追加をオンにします。

スコープの追加をクリックし、スコープとして統合アプリケーションMCP Hotelshttp://localhost:5000/mcphotels(リソース・サーバーのプライマリ・オーディエンスhttp://localhost:5000/とスコープmcphotelsが連結)を追加します。

以上で送信します。


リソースの追加を行う画面です。

統合アプリケーションMCP Hotelsより範囲(スコープのこと)の選択にある、スコープhttp://localhost:5000/mcphotelsにチェックを入れます。


ここで選択したスコープhttp://localhost:5000/mcphotelsは、MCP InspectorのOAuth設定のスコープに含めます

以上で統合アプリケーションMCP Hotelsの構成は完了です。

OAuth構成よりクライアントIDクライアント・シークレットを取得します。

これらの値は、MCP InspectorのOAuth SettingsClient IDClient Secretとして設定します。


作成した統合アプリケーションMCP Hotelsアクティブ化します。


ユーザー・タブを開き、この統合アプリケーションで認証できるユーザーを割り当てます。

ユーザーの割当てをクリックします。


今回の作業を行なっているユーザーを割り当てます。


作成した統合アプリケーションで認証できるユーザーが割り当てられました。


以上で、Oracle IAMでの作業は完了です。

先日の記事で作成したtools.yamlに以下を追記します。OIDC認証の設定oracle-iam-authに加え、アクセス・トークンのsubクレームの値を表示するツールshow_sub_claimを定義しています。

ツールshow_sub_claimの第1パラメータとしてuser_idを設定しています。この値はauthServicesで設定しているoracle-iam-auth、つまりOracle IAMによるOIDC認証で得られたアクセス・トークンのsubの値になります。この値はSELECT文のバインド変数:1に割り当てられます。user_idはパラメータとして定義しているため、MCP Inspectorからツールを呼び出す際に値の入力を求められます。値を入力してもアクセス・トークンのsubの値で置き換えられますが、requiredfalseを設定(デフォルトはtrueなので、必ず値が必要)することにより、user_idを入力しなくてもツールを実行できるようにしています。
---
kind: authService
name: oracle-iam-auth
type: generic
authorizationServer: [発行者として設定したドメインURL(ポート番号無し)]
audience: http://localhost:5000/
mcpEnabled: true
scopesRequired:
  - openid
  - mcphotels
---
# show sub claim in access token
kind: tool
name: show_sub_claim
type: oracle-sql
source: my-oracle-instance
statement: |
  SELECT :1 sub from dual
description: |
  Show sub claim value in the access token
parameters:
  - name: user_id 
    type: string
    required: false
    description: Auto-populated from token
    authServices:
      - name: oracle-iam-auth
        field: sub
authRequired:
  - oracle-iam-auth
MCP Toolboxを実行する際に--toolbox-urlとしてaudience(resource)を指定します。

./toolbox --config tools.yaml --toolbox-url http://localhost:5000/

mcp-toolbox % ./toolbox --config tools.yaml --toolbox-url http://localhost:5000/

2026-09-08T13:20:06.905274+09:00 INFO "Starting MCP Toolbox for Databases version 1.10.0+binary.darwin.arm64.21f972f" 

2026-09-08T13:20:06.983898+09:00 INFO "Initialized 1 sources: my-oracle-instance" 

2026-09-08T13:20:08.061104+09:00 INFO "Initialized 1 authServices: orcle-iam-auth" 

2026-09-08T13:20:08.061141+09:00 INFO "Initialized 0 embeddingModels: " 

2026-09-08T13:20:08.06143+09:00 INFO "Initialized 4 tools: show_sub_claim, execute_sql, list_all_hotels, list_hotels_in_the_location" 

2026-09-08T13:20:08.061451+09:00 INFO "Initialized 0 prompts: " 

2026-09-08T13:20:08.061472+09:00 INFO "Initialized 1 groups: default" 

2026-09-08T13:20:08.061722+09:00 WARN "wildcard (*) allows any website to access the primitives. This creates a security risk regardless of whether you are in a production or local development environment. Recommended to use --allowed-origins with specific local addresses." 

2026-09-08T13:20:08.061774+09:00 WARN "wildcard (*) hosts allow any domain to access this resource, making it vulnerable to DNS rebinding attacks regardless of whether you are in a production or local development environment. For improved security, use the --allowed-hosts flag to specify trusted domains." 

2026-09-08T13:20:08.062055+09:00 INFO "Server ready to serve!" 



MCP Inspectorに登録済みのMCP ToolboxのServer Settingsを開きます。


OAuth SettingsClient IDClient SecretScopesを設定します。Scopesに設定する値は以下です。指定するスコープにプライマリ・オーディエンスを含めます。

openid http://localhost:5000/mcphotels


以上で設定はすべて完了です。

動作確認を実施します。

MCP InspectorよりMCP ToolboxのMCPサーバーに接続します。


Oracle CloudのIdentity Domainへのサインインが求められます。


Authenticatorを使ったユーザー認証が行われサインインが完了すると、アプリケーションMCP Hotelsへのアクセス許可が要求されます。

アクセスを許可すると、MCP Toolboxへの接続が完了します。


Toolsタブを開き、ツールshow_sub_claimを選択します。

パラメータuser_idには値を設定できますが、user_idの値はアクセス・トークンのsubの値に置き換えられるため、設定する意味はありません。

user_idには値を設定せずExecute Toolを実行します。


ツールの実行結果として、SUBにサインインに使用したメール・アドレスが返されます。


ツールoracle-sqlに設定するSELECT文にOIDCで認証したユーザー名を渡せるため、ツールの検索範囲をユーザーごとに制限することができます。

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