2025年11月28日金曜日

ORDSで実行するMCPサーバーをMLE/JavaScriptで記述する

先日の記事「ORDSのRESTサービスをClaude Desktopのカスタムコネクタとして登録して呼び出す」で、ORDSにMCPサーバーを実装しました。今回はPL/SQLの代わりにMLE/JavaScriptでMCPサーバーを実装してみます。

Oracle REST Data ServicesのProduct ManagerであるPeter O'Brienさんの、以下のブログ記事を参考に実装しています。

Implement an MCP Server with ORDS and MLE JavaScript
https://peterobrien.blog/2025/08/16/implement-an-mcp-server-with-ords-and-mle-javascript/

作成するリモートMCPサーバーはPL/SQLの実装と同じく、ツールとして任意のSELECT文を実行するrun_sqlとスキーマ情報を取得するget_schemaを含みます。

PL/SQLでの実装では、ツールを画面で定義したり、ORDSのRESTサービスとツールの紐付けを画面上でできるようにAPEXアプリを作成していました。MLE/JavaScriptによる実装は、Peter O'Brienさんの記事を参考にして、すべてをスクリプトで実装しています。

元記事にあるtools/list、tools/callの処理は、ツールであるrun_sqlおよびget_schemaが含まれるように書き直しています。

PL/SQLでは実装していた、ヘッダーMcp-Session-Idを使ったセッション管理については省略しています。そのためDELETEハンドラはありません。


今回はAutonomous AI DatabaseのSQL Developer Webより実装します。PL/SQLのときと同様にリモートMCPサーバーには認証による保護がかけられません。対応としてORDSのRESTサービスの事前認証済リクエストを活用してみます。

Autonomous AI DatabaseのSQL Developer Web(Database Actions)に接続し、管理者ユーザーのADMINにてサインインします。


RESTサービスを実装するデータベース・ユーザーを作成します。

管理データベース・ユーザーを開きます。


ユーザーの作成をクリックします。


作成するユーザー名は任意です。本記事ではMCPSERVERとしました。パスワードを設定します。

REST、GraphQL、MongoDB APIおよびWebアクセスオンにし、Webアクセス拡張機能承認が必要オフにします。REST別名は小文字のmcpserverとします。このREST別名はリモートMCPサーバーのURLに含まれます。

以上でユーザーの作成を実行します。


データベース・ユーザーMCPSERVERが作成されます。


本記事ではRESTハンドラをMLE/JavaScriptで記述します。そのため、作成したデータベース・ユーザーMCPSERVERに、MLE/JavaScriptを実行する権限を与えます。

開発SQLワークシートを開き、以下の2行のコマンドを実行します。

GRANT EXECUTE ON JAVASCRIPT TO MCPSERVER;
GRANT EXECUTE DYNAMIC MLE TO MCPSERVER;


以上で管理者ユーザーADMINの作業は完了です。

ADMINをサインアウトして、SQL Developer WebにユーザーMCPSERVERでサインインしなおします。


開発SQLワークシートを開き、RESTサービス(MCPサーバー)を実装したコードを貼り付けて実行します。


開発RESTを開きます。コードを実行したことで、Module、Template、Handlerが作成されていることが確認できます。


この状態で、リモートMCPサーバーを保護なしで呼び出すことができます。

権限による保護を適用します。

セキュリティ権限を開きます。


権限の作成をクリックします。


ラベルsamplejs MCP server access名前oracle.mcp.samplejs説明MCPサーバーsamplejsの保護と記述します。


ロールタブを開き、RESTful Servicesを選択します。


保護されたモジュールを開き、samplejsを選択します。

以上で権限を作成します。


権限oracle.mcp.samplejsが作成されました。これでリモートMCPサーバーであるRESTサービスは、認証しないと呼び出せない状態になりました。


ユーザー認証は実装できないので、代わりに事前承認済リクエストを作成します。

モジュールを開きます。

作成済みのモジュールsamplejsの3点メニューより、テンプレートを開きます。


モジュールsamplejsに含まれるテンプレートmcpの3点メニューより、ハンドラを開きます。


テンプレートmcpに含まれるPOSTハンドラの3点メニューより、事前承認済リクエストから事前承認済リクエストの作成を実行します。


トークンの有効期限(秒)を調整し、作成をクリックします。


事前承認済リクエストが作成されます。

使用するのはURLだけなので、URLコピーします。OKをクリックしてダイアログを閉じます。


以上で作業は完了です。

Claude Desktopにカスタムコネクタを追加します。リモートMCPサーバーURLに、上記でコピーした事前承認済リクエストを指定します。

コネクタの設定画面を開き、カスタムコネクタの追加をクリックします。


コネクタの名前samplejsとします。リモートMCPサーバーURL事前承認済リクエストを設定します。

追加をクリックします。


ダイアログが再度開いたら、キャンセルをクリックして閉じます。


カスタムコネクタとしてsamplejsが追加されます。設定をクリックして確認します。


設定を開くと、ツールとしてget_schemarun_sqlが認識されていることが確認できます。


Claude Desktopで新規チャットを開始し、ツールsamplejsの動作を確認します。

「samplejsから確認できるデータを教えて。」

今までの手順通りに作業をしていると、スキーマMCPSERVERはほぼ空です。なので、実装したツールを呼び出して出来ることも少ないのですが、ツール自体が動作することは確認できます。


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