更新:2026年2月26日:OAuth2による保護の説明を削除。
ただし、ORDSでSSEを実装できるわけではないので、SSEでの通信ができない旨をクライアント側に伝える必要があります。また、実装できる機能は制限されます。
以下の記事でツール呼び出し向けに実装しているget_schemaとrun_sqlを、リモートMCPサーバーのtools/listで一覧し、tools/callで呼び出せるようにします。
ツールとして使用するget_schemaとrun_sqlの実装や設定をワークスペースに作成するため、以下のAPEXアプリケーションをインポートします。表OPENAI_TOOLSとファンクションget_schema、run_sqlが作成され、属性などの定義情報が表に挿入されます。
https://github.com/ujnak/apexapps/blob/master/exports/chat-with-generative-ai-hc-242.zip
さらに以下のAPEXアプリケーションをインポートすると、本記事に記載されているパッケージや表を個別に作成しなくても、サポートするオブジェクトとして作成されます。
https://github.com/ujnak/apexapps/blob/master/exports/mcp_handler.zip
実装したMCPサーバーの動作確認をMCP Inspectorで行なっています。Claude Desktopのカスタムコネクタとしても登録できます。Claude Desktopのカスタムコネクタとして登録する手順は、こちらの記事「ORDSのRESTサービスをClaude Desktopのカスタムコネクタとして登録して呼び出す」で紹介しています。
MCP Inspectorを起動します。
% npx @modelcontextprotocol/inspector
Starting MCP inspector...
⚙️ Proxy server listening on port 6277
🔍 MCP Inspector is up and running at http://127.0.0.1:6274 🚀
MCP Inspector is up and running at ... に続いて表示されているURLに、ブラウザより接続します。
Transport TypeにStreamable HTTPを選択し、URLにORDSのRESTサービスのURLを入力します。
Connectをクリックすると、methodがinitializeのリクエストが送信されます。(logging/setloglevelも送信されています)。そのレスポンスを受けて、接続が確立します。レスポンスに含まれるcapabilitiesはtoolsだけです。
Toolsタブを開き、List Toolsをクリックします。
methodがtools/listのリクエストが送信され、そのレスポンスとしてget_schemaとrun_sqlが呼び出し可能なツールとして返されます。
ツールからget_schemaを選択して、Run Toolをクリックします。methodがtools/callのリクエストが送信され、そのレスポンスとしてget_shemaの出力が返されます。
同様にツールからrun_sqlを選択します。パラメータのsqlに以下を入力し、Run Toolをクリックします。
select * from eba_countries_v
run_sqlが呼び出され、上記のSELECT文の出力が返されます。
Disconnectをクリックします。
MCPのプロトコルとしてはHTTPのDELETEが送信されますが、現在のORDSではDELETEメソッドの呼び出し時にContent-Typeの指定があるとエラーが発生するため、切断処理が行われません。
JavaScriptコンソールを開いて確認すると、HTTPのDELETEリクエストがステータス・コード400で失敗していることが確認できます。ORDSのRESTサービスとして登録したDELETEハンドラが呼び出される前にエラーとなっているため、アプリケーション側では対応できません。Claude Desktopにカスタムコネクタとして設定したときも同様で、切断できません。
MCPサーバーはこちらの記事「Oracle APEXの実行環境にnginxによるリバース・プロキシを構成する - Oracle Linux 10編 」で紹介している、DNSのホスト名が登録されていて、かつHTTPSで通信可能な環境を使用します。Always FreeのAutonomous Databaseもこの条件を満たしているため、作業環境として使用できます。
主にJSONRPCを扱うパッケージとしてMCP_HTTP_SERVER_PKGを作成しています。プロシージャORDS_HANDLERを、ORDSのRESTサービスから呼び出します。
MCPサーバーとして必要なinitialize、tools/list、tools/callの処理は、パッケージMCP_SAMPLEに実装しています。
これらのパッケージやパッケージを登録する表MCP_HTTP_SERVERSの作成を、サポート・スクリプトとして含んだAPEXアプリケーションMCP Handlerのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/mcp_handler.zip
このアプリケーションをインストールして実行すると、以下のような画面が開きます。初期状態では、レポートは空です。
ORDS URIにORDSのRESTサービスのURIを設定します。/ords/ORDS別名/モジュール名になります。リモートMCPサーバーのエンドポイントの末尾は/mcpになるので、テンプレート名は必ずmcpになります。ORDS URIからはmcpの部分は除きます。
methodのinitizliazeを受け付けたときに開始するセッションとして、APEXのセッションを流用しています。そのため、APEX_SESSION.CREATE_SESSIONに与えるアプリケーションIDとページIDを、Apex App ID、Apex Page IDに設定します。これはデフォルトで、このアプリ自体のアプリケーションIDとページIDを割り当てているので変更は不要です。
Package NameにリモートMCPサーバーの処理を実装しているパッケージ名を設定します。methodがinitializeであれば、このパッケージに含まれるプロシージャINITIALIZEが呼び出されます。methodがtools/listであれば、/を_に置き換えたプロシージャTOOLS_LISTを呼び出します。tools/callはプロシージャTOOLS_CALLが呼び出されます。MCPサーバーにpromptsやresourcesは実装していませんが、initializeのレスポンスのcapabilitiesに含めて、パッケージにpromptsやresourcesをプロシージャとして実装することで、フレームワークを変更することなく機能を追加できます。
Log LevelはAPEX_DEBUG.ENABLEに与える数値です。しかし、何故かAPEX_DEBUG.INFOの出力をビューAPEX_DEBUG_MESSAGESから確認できていません。
Tool Setの指定は、Chat with Generative AIのアプリケーションのToolsに登録した、Tool Setを指定します。今回のテストでは、ファンクションget_schemaとrun_sqlをまとめたCountriesを選択しています。
続いて、ORDSのRESTサービスの設定を行います。こちらについてはインストール・スクリプトを先ほどのmcp_handler.zipに含めているので、APEXアプリケーションを実行するとRESTサービスも作成されます。
RESTサービスとしてsampleserverが作成されますが、作成した時点でOAuth2で保護されています。
SQLワークショップのRESTfulサービスを開き、権限oracle.example.mcpからモジュールsampleserverを除外し、変更を適用します。
以上でMCP Inspectorによる動作確認ができる状態になっています。
今回の記事は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完









