ラベル REST の投稿を表示しています。 すべての投稿を表示
ラベル REST の投稿を表示しています。 すべての投稿を表示

2025年9月9日火曜日

OpenAPI to MCP Generatorを使ってORDS RESTモジュールをMCPサーバーにする

Oracle REST Data Servicesに作成したRESTモジュールから、OpenAPI(Swagger)のドキュメントを生成することができます。ORDSのプロダクト・マネージャのJeff Smithさんは、以前にこのOpenAPIのドキュメントを使って、ORDSのRESTモジュールからMCPサーバーを作成する方法をブログ記事「Build an MCP to connect AI to Oracle Database w/OpenAPI」で紹介されています。

同じことをしても仕方がないのと、記事を読んだ感じでは「それほど簡単ではない」という印象を持ちました。OpenAPIからMCPサーバーを作成する方法について、ChatGPTのGPT-5に聞いたところ表題のOpenAPI to MCP Generatorを紹介されました。

OpenAPI to MCP Generator (openapi-mcp-generator)
https://github.com/harsha-iiiv/openapi-mcp-generator

以下より、このOpenAPI to MCP Generatorを使って、ORDS REST APIのサンプルとしてインストールできるoracle.example.hrのモジュールをMCPサーバーにしてみます。作業には、手元のMacbookでコンテナとして実行しているAPEX環境を使用します。

SQLワークショップRESTfulサービスの画面を開き、サンプル・サービスをインストールします。サンプル・サービスはRESTモジュールoracle.example.hrとして作成されます。

今回は簡単に使えるサンプルをインストールするために、APEXのRESTfulサービスの画面を使用しています。この画面はすでに非推奨になっており、現在はRESTサービスの開発にはSQL Developer Webの使用が推奨されています。

モジュールoracle.example.hrを選択し、これからの作業に必要な情報を確認します。

モジュール名oracle.example.hrベース・パス/hr/となっています。ボタンSwaggerドキュメントの生成をクリックすると、OpenAPIドキュメントが生成されます。これは、以下のURLへのアクセスと同じです。OpenAPIのドキュメントを取得するURLは、完全なURLベース・パスの前に/open-api-catalog/が挿入されます。

http://localhost:8181/ords/apexdev/open-api-catalog/hr/

RESTサービスをOAuth2で保護した上で、MCPサーバーとしてアクセスできるようにします。APEXのワークスペース・スキーマに接続し、以下のスクリプトを実行することでRESTサービスをOAuth2で保護します。


スクリプトを実行するとclient_idおよびclient_secretが画面に印刷されます。client_secretが印刷されるのは1度だけです。コピーを忘れた場合はスクリプトを再実行し、client_secertを更新する必要があります。

SQL> @protect-sample-hr-emp-module.sql

Role HR Example Role has already created.

Privilege oracle.example.hr has already created.

OAuth client mcp_client has already created.

client_id: Ai3VSXvO9k5qI2cLWg-H-g..

client_secret: y9_uZIaNT1cqvOcV8lxSEw..

Role HR Example Role has granted to OAuth user mcp_client.



PL/SQLプロシージャが正常に完了しました。


SQL> 


run.shというファイルを作成し、その中で上記のclient_idを環境変数OAUTH_CLIENT_ID_OAUTH2client_secretOAUTH_CLIENT_SECRET_OAUTH2に設定します。末尾の .. (ピリオド2つ)も値の一部なので、忘れずに値に含めます。

設定した後にnodeコマンドでORDSのRESTサービスのプロキシとなるMCPサーバーを起動します。

このサーバーは、これから作成します。
#!/bin/sh
export OAUTH_CLIENT_ID_OAUTH2=[client_idの値]
export OAUTH_CLIENT_SECRET_OAUTH2=[client_secretの値]
# Workaround for OAuth2 client credentials authentication.
export OAUTH_CLIENT_ID_SCHEMENAME=${OAUTH_CLIENT_ID_OAUTH2}
export OAUTH_CLIENT_SECRET_SCHEMENAME=${OAUTH_CLIENT_SECRET_OAUTH2}
node /Users/_____/Documents/hr-emp-mcp/server/build/index.js
ファイルのrun.shを作業ディレクトリに配置し、実行権限を与えます。

chmod 755 run.sh

hr-emp-mcp % chmod 755 run.sh

hr-emp-mcp % 


これからはOpenAPI to MCP Generetorに関する作業です。詳細はGitHubのページを参照することをお勧めします。以下より、今回の作業で実施した内容を記述します。

最初にopenapi-mcp-generatorをインストールします。

npm install -g openapi-mcp-generator

hr-emp-mcp % npm install -g openapi-mcp-generator


changed 107 packages in 4s


22 packages are looking for funding

  run `npm fund` for details

hr-emp-mcp % 


RESTモジュールoracle.example.hrを呼び出すMCPサーバーを生成します。今回の作業ではSTDIOのサーバーを生成しています。この他にStreamableHTTPにも対応しているようです。

openapi-mcp-generator --input http://localhost:8181/ords/apexdev/open-api-catalog/hr/ --output ./server

inputOpenAPIのドキュメントを返すURLを指定しています。output作業ディレクトリの下にserverというディレクトリを指定しています。ディレクトリserverの下に、MCPサーバーのコードが生成されています。

hr-emp-mcp % openapi-mcp-generator --input http://localhost:8181/ords/apexdev/open-api-catalog/hr/ --output ./server

Parsing OpenAPI spec: http://localhost:8181/ords/apexdev/open-api-catalog/hr/

OpenAPI spec parsed successfully.

Generating server code...

Generating package.json...

Generating tsconfig.json...

Generating .gitignore...

Generating ESLint config...

Generating Prettier config...

Generating Jest config...

Generating .env.example file...

Generating OAuth2 documentation...

Creating project directory structure at: ./server

 -> Created server/src/index.ts

 -> Created server/package.json

 -> Created server/tsconfig.json

 -> Created server/.gitignore

 -> Created server/.eslintrc.json

 -> Created server/.prettierrc

 -> Created server/jest.config.js

 -> Created server/.env.example

 -> Created server/docs/oauth2-configuration.md


---

MCP server project 'ords-generated-api-for-oracle-example-hr' successfully generated at: ./server


Next steps:

1. Navigate to the directory: cd ./server

2. Install dependencies: npm install

3. Build the TypeScript code: npm run build

4. Run the server: npm start

   (This runs the built JavaScript code in build/index.js)

---

ynakakoshi@Ns-Macbook hr-emp-mcp % 


Next stepsに書かれている作業を行います。

cd ./server
npm install
npm run build

hr-emp-mcp % cd ./server 

server % npm install


added 105 packages, and audited 106 packages in 3s


22 packages are looking for funding

  run `npm fund` for details


found 0 vulnerabilities

server % npm run build


> ords-generated-api-for-oracle-example-hr@1.0.0 build

> tsc && chmod 755 build/index.js


server % 


serverの下にbuild/index.jsが作成されます。このファイルがrun.sh内のnodeコマンドで実行されるように、run.shの記述を変更します。
#!/bin/sh
export OAUTH_CLIENT_ID_OAUTH2=Ai3VSXvO9k5qI2cLWg-H-g..
export OAUTH_CLIENT_SECRET_OAUTH2=7o5NFqrDlri9d6GQEDTBGw..
# workaround for OAuth2 client credentials authentication.
export OAUTH_CLIENT_ID_SCHEMENAME=${OAUTH_CLIENT_ID_OAUTH2}
export OAUTH_CLIENT_SECRET_SCHEMENAME=${OAUTH_CLIENT_SECRET_OAUTH2}
node /[build/index.jsを指すパス]/hr-emp-mcp/server/build/index.js
以上でMCPサーバーの準備ができました。

MCPホスト(今回使用したのはClaude Desktop)にMCPサーバーを追加します。以下のような設定になります。

{
"mcpServers": {
"hr-emp-mcp": {
"command": "/Users/________/Documents/hr-emp-mcp/run.sh"
}
}
}

以上で、ORDSのRESTモジュールをMCPサーバーとして呼び出すことができるようになりました。

以下の動画では、Claude DesktopからMCPサーバーを呼び出しています。


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

2025年4月22日火曜日

ローカルのOracle APEXのSQLワークショップにSQL Developer Webを組み込む

Oracle REST Data Services 25.1のリリース・ノートのDeprecation Noticeに、以下が記載されています。Oracle APEXがSQLワークショップの機能のひとつとして提供しているRESTfulサービスが非推奨になり、SQL Developer Webが推奨ツールになります。

Oracle REST Data Services 25.1
Release Notes
Version 25.1.0.100.1652
Date: April 2025
Deprecation Notice 
The RESTful Services area of the SQL Workshop for building and managing ORDS REST APIs in APEX has been deprecated. The recommended web interface for managing your ORDS REST APIs is Database Actions, also known as, SQL Developer Web.

Oracle APEXのSQLワークショップの以下のメニューに当たります。


Autonomous DatabaseではデフォルトでSQLワークショップSQL Developer Webが含まれています。そのため、スキーマがREST有効化ずみであれば、そのままSQL Developer Webを開くことができます。


ローカルのデータベースにインストールしたOracle APEXでは、SQLワークショップにSQL Developer Webを含めるには追加の設定が必要です。

デフォルトではSQLワークショプSQL Developer Webのメニューはありません。


以下よりSQLワークショップSQL Developer Webを追加する手順を紹介します。

手順はドキュメントの以下に説明されています。

Oracle APEX SQLワークショップ・ガイド Release 24.1
7 RESTfulサービスを使用したデータ交換の有効化
7.9 APEXからSQL Developer Webへの直接アクセス

ドキュメントでは「メニュー・オプションを有効にするための要件」として、「Oracle REST Data Servicesリリース23.1.0 (HTTPSモードで実行)。」とありますが、HTTPでも構成できました。恐らく、ドキュメントに最近の設定が反映されていないと思われます。

設定はAPEXの管理サービスより行います。

管理サービスにサインインし、インスタンスの設定機能構成を開きます。


機能構成SQLワークショップのセクションにあるSQL Developer Webの有効化はいに変更します。

変更の適用をクリックします。


変更が保存されると、SQLワークショップのメニューにSQL Developer Webが含まれるようになります。


開発ツールに戻ってSQLワークショップを確認します。SQL Developer Webが含まれています。


SQL Developer Webを開こうとすると、ワークスペース・スキーマの選択を求められます。

ダイアログに記載されているように、SQLワークショップからSQL Developer Webを直接開くには、APEXのスキーマがあらかじめREST対応REST有効化ともいいます)になっている必要があります。


Oracle APEXではRESTfulサービスを開き、ORDSにスキーマを登録を実行することで、スキーマをREST対応にすることができました。


Oracle APEXのRESTfulサービスが非推奨ということは、この画面も非推奨になります。

Autonomous Databaseの場合は管理者ユーザーADMINでSQL Developer Webに接続し、ユーザーの編集画面から、REST有効化、無効化を設定できます。

以下のユーザー編集画面のWebアクセスオンに切り替えることで、そのスキーマでRESTサービスの呼び出しを受付ができるようになります。REST別名については、スキーマがAPEXで使用されていて名前がWKSP_で始まる場合は、WKSP_以降の文字列を小文字で設定します。


ローカルにインストールしたOracle APEXの場合、Autonomous Databaseとは異なり、SQL Developer Webに管理者ユーザーでサインインするには追加の設定が必要です。追加の設定については、以前の記事「ローカル環境のSQL Developer Webの管理者ユーザーを作成する」で紹介しています。SQL Developer Webに管理者ユーザーでアクセスできるように構成した後はAutonomous Databaseと同様に、SQL Developer WebよりRESTを有効にできます。

以下はユーザーPDBADMINにDBAロールを割り当て、SQL Developer Webにサインインしています。ORDS 25.1よりダーク・モードがサポートされています。


この他の方法として、管理者ユーザー(SYS)でORDS_ADMIN.ENABLE_SCEMAを呼び出す、または対象スキーマでORDS.ENABLE_SCHEMAを呼び出す方法があります。プロシージャの引数などは同じなので、今回は管理者ユーザーで実行してみます。
begin
ords_admin.enable_schema(
p_enabled => true,
p_schema => 'スキーマ名',
p_url_mapping_pattern => 'ORDS別名'
);
end;
/

SQL> begin

  2  ords_admin.enable_schema(

  3  p_enabled => true,

  4  p_schema => 'WKSP_APEXDEV',

  5  p_url_mapping_pattern => 'apexdev'

  6  );

  7  end;

  8* /


PL/SQLプロシージャが正常に完了しました。


SQL> commit;


コミットが完了しました。


SQL> 


以上の設定で、ローカルのOracle APEXのSQLワークショップよりSQL Developer Webを開いて、REST開発ツールを利用できるようになります。


必須ではありませんが、APEXの管理サービスのインスタンスの管理/機能構成RESTのセクションに含まれるRESTfulサービスを有効にするいいえにすると、SQLワークショップよりRESTfulサービスが除かれます。


以下のようにSQLワークショップからRESTfulサービスが除かれます。


Oracle APEXの管理サービスの代わりに、パッケージAPEX_INSTANCE_ADMINのSET_PARAMETERを呼び出してSQL Developer Webの有効化オンにするには、パラメータALLOW_SQL_DEVELOPER_WEBを設定します。

APIリファレンスのAvailable Parameter Valuesには、なぜか含まれていなかったので、ビューAPEX_INSTANCE_PARAMETERSを検索して確認しています。

SQL> select * from apex_instance_parameters where name like '%SQL%';


NAME                          VALUE     CREATED_ON    LAST_UPDATED_ON    

_____________________________ _________ _____________ __________________ 

ALLOW_SQL_DEVELOPER_WEB       Y         25-04-21      25-04-21           

ENABLE_TRANSACTIONAL_SQL      N         25-04-21      25-04-21           

PLSQL_EDITING                 Y         25-04-21      25-04-21           

SQL_SCRIPT_MAX_OUTPUT_SIZE    200000    25-04-21      25-04-21           

DG_ALLOW_SQL_DATA_SOURCES     Y         25-04-21      25-04-21           

SQL_COMMAND_MAX_INACTIVITY    60        25-04-21      25-04-21           


6行が選択されました。 


SQL> 


RESTfulサービスSQLワークショップから除くには、パラメータRESTFUL_SERVICES_ENABLEDNにします。

SQL> select * from apex_instance_parameters where name like '%REST%';


NAME                                                           VALUE     CREATED_ON    LAST_UPDATED_ON    

______________________________________________________________ _________ _____________ __________________ 

RESTFUL_SERVICES_ENABLED                                       N         25-04-21      25-04-22           

DG_MAXIMUM_NUMBER_OF_ROWS_TO_RETRIEVE_FROM_REST_DATA_SOURCE    500000    25-04-21      25-04-21           


SQL> 


Oracle REST Data Services 25.1より追加されたダーク・モードですが、ユーザーのプレファレンスより設定します。


テーマには(Light)、(Dark)、Same as browserの3つから選べます。


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