2024年12月3日火曜日

ローカルにインストールしたOracle Database 23aiをREST対応SQLでアクセスできるようにする

以下の手順でローカルのMacに構築したOracle Database 23ai、Oracle REST Data ServicesとOracle APEXの環境で、REST対応SQLを有効にしてみます。ツールの呼び出し方に若干の違いはありますが、オンプレミスの環境であればおおむね同じ手順になるかと思います。

podmanを使ってOracle Database FreeとOracle REST Data Servicesをコンテナとして実行する

使用するデータベースはOracle Database 23ai Freeで、PDBとしてFREEPDB1が作成されています。ユーザーが使用する表領域はUSERSです。データベースが稼働しているコンテナはapex-db、ORDSが稼働しているコンテナはapex-ordsとして作成しています。

はじめにデータベースにユーザーWKSP_MCPを作成します。コンテナapex-dbに接続します。

podman exec -it apex-db bash

% podman exec -it apex-db bash

bash-4.4$ 


sqlplusを起動し、データベースに接続します。

bash-4.4$ sqlplus / as sysdba


SQL*Plus: Release 23.0.0.0.0 - Production on Tue Dec 3 07:38:35 2024

Version 23.5.0.24.07


Copyright (c) 1982, 2024, Oracle.  All rights reserved.



Connected to:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.5.0.24.07


SQL> 


接続先をFREEPDB1に切り替えます。

alter session set container = freepdb1;

SQL> alter session set container = freepdb1;


Session altered.


SQL>


以下のスクリプトを実行し、ユーザーWKSP_MCPを作成します。パスワードは適当な文字列に変えます。この後に作成するAPEXワークスペースの名前をmcpとするため、ORDS_ADMIN.ENABLE_SCHEMAの引数p_url_mapping_patternmcpを与えています。
-- USER SQL
CREATE USER WKSP_MCP IDENTIFIED BY "パスワード";

-- ADD ROLES
GRANT CONNECT TO WKSP_MCP;
GRANT RESOURCE TO WKSP_MCP;

-- REST ENABLE
BEGIN
    ORDS_ADMIN.ENABLE_SCHEMA(
        p_enabled => TRUE,
        p_schema => 'WKSP_MCP',
        p_url_mapping_type => 'BASE_PATH',
        p_url_mapping_pattern => 'mcp',
        p_auto_rest_auth=> TRUE
    );
    commit;
END;
/

-- QUOTA
ALTER USER WKSP_MCP QUOTA UNLIMITED ON USERS;

SQL> -- USER SQL

CREATE USER WKSP_MCP IDENTIFIED BY "パスワード";


-- ADD ROLES

GRANT CONNECT TO WKSP_MCP;

GRANT RESOURCE TO WKSP_MCP;


-- REST ENABLE

BEGIN

    ORDS_ADMIN.ENABLE_SCHEMA(

        p_enabled => TRUE,

        p_schema => 'WKSP_MCP',

        p_url_mapping_type => 'BASE_PATH',

        p_url_mapping_pattern => 'mcp',

        p_auto_rest_auth=> TRUE

    );

    commit;

END;

/


-- QUOTA

ALTER USER WKSP_MCP QUOTA UNLIMITED ON USERS;SQL> 

User created.


SQL> SQL> SQL> 

Grant succeeded.


SQL> 

Grant succeeded.


SQL> SQL> SQL>   2    3    4    5    6    7    8    9   10   11  

PL/SQL procedure successfully completed.


SQL> SQL> SQL> 


User altered.


SQL> 


データベースへのユーザー作成は以上で完了です。

APEXの管理サービスにサインインし、ワークスペースMCPを作成します。


ワークスペース名MCPとします。

へ進みます。


既存のスキーマの再利用はいにし、スキーマ名として先ほど作成したWKSP_MCPを選択します。

へ進みます。


管理者のユーザー名管理者のパスワード電子メールを入力します。ここで設定する管理者のパスワードは、ワークスペースの初回サインイン時に変更を求められます。

へ進みます。


ワークスペースの作成を実行します。


ワークスペースMCPが作成されました。APEXの管理サービスでの作業は完了です。

完了をクリックします。


ワークスペースMCPにサインインし、サンプル・データセットをインストールします。


初期パスワードを変更します。


APEXの開発ツールにサインインしたら、SQLワークショップユーティリティサンプル・データセットを開きます。


サンプル・データセットインストールします。


ダイアログが開くので、をクリックします。


データセットのインストールをクリックします。


サンプル・データセットのロードが完了しました。

終了をクリックします。


サンプル・データセットのインストールが完了しました。

APEXでの作業は以上になります。


続いてOracle REST Data ServicesでREST対応SQLを有効にします。

コンテナapex-ordsに接続します。

podman exec -it apex-ords bash

% podman exec -it apex-ords bash

[oracle@apex ords]$ 


ORDSの構成ディレクトリに移動します。

cd /etc/ords/config

[oracle@apex ords]$ cd /etc/ords/config

[oracle@apex config]$ 


REST対応SQLを有効にします。--configの指定がなければORDSの構成ファイルを保存するディレクトリとしてカレント・ディレクトリが選択されますが、念のため--configオプションも付けておきます。

ords --config /etc/ords/config config set restEnabledSql.active true

[oracle@apex config]$ ords --config /etc/ords/config config set restEnabledSql.active true


ORDS: Release 24.3 Production on Tue Dec 03 08:22:12 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config


The setting named: restEnabledSql.active was set to: true in configuration: default

[oracle@apex config]$ 


REST対応SQLの認証に使用できるORDSのユーザーを、ords_devとして作成しておきます。ロールとしてSQL Developerを与えます。作成時にパスワードを入力します。

ords --config /etc/ords/config config user add ords_dev "SQL Developer"

[oracle@apex config]$ ords --config /etc/ords/config config user add ords_dev "SQL Developer"


ORDS: Release 24.3 Production on Tue Dec 03 08:26:35 2024


Copyright (c) 2010, 2024, Oracle.


Configuration:

  /etc/ords/config


Enter the password for ords_dev: **********

Confirm password: **********

Created user ords_dev in file /etc/ords/config/global/credentials

[oracle@apex config]$ 


スキーマWKSP_MCPとそのパスワードを指定しても基本認証は可能です。スキーマWKSP_MCPで認証するとアクセスできる範囲はスキーマWKSP_MCPに限定されますが、SQL Developerロールを持つORDSユーザーords_devで認証すると、すべてのスキーマにアクセスできます。

以上で設定は完了です。コンテナapex-ordsを再起動します。

podman restart apex-ords

% podman restart apex-ords

apex-ords

% 


以上でREST対応SQLによる呼び出しができるようになりました。エントリポイントは以下になります。

http://localhost:8181/ords/mcp/_/sql

curlコマンドを使って動作を確認します。最初はスキーマWKSP_MCPで認証します。表EBA_COUNTRY_REGIONSを検索します。

curl -i -X POST -u wksp_mcp:[パスワード] http://localhost:8181/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select * from eba_country_regions'

検索結果がJSONで返されます。

% curl -i -X POST -u wksp_mcp:********** http://localhost:8181/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select * from eba_country_regions' 

HTTP/1.1 200 OK

Content-Type: application/json

X-Frame-Options: SAMEORIGIN

Transfer-Encoding: chunked


{"env":{"defaultTimeZone":"UTC"},"items":[{"statementId":1,"statementType":"query","statementPos":{"startLine":1,"endLine":2},"statementText":"select * from eba_country_regions","resultSet":{"metadata":[{"columnName":"ID","jsonColumnName":"id","columnTypeName":"NUMBER","columnClassName":"java.math.BigDecimal","precision":0,"scale":-127,"isNullable":0},{"columnName":"NAME","jsonColumnName":"name","columnTypeName":"VARCHAR2","columnClassName":"java.lang.String","precision":255,"scale":0,"isNullable":0}],"items":[{"id":10,"name":"America"},{"id":20,"name":"Europe"},{"id":30,"name":"Asia"},{"id":40,"name":"Oceania"},{"id":50,"name":"Africa"}],"hasMore":false,"limit":10000,"offset":0,"count":5},"response":[],"result":0}]}%                                                       % 


続いてORDSユーザーords_devで認証してみます。

同様にJSONが返されます。

% curl -i -X POST -u ords_dev:********* http://localhost:8181/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select * from eba_country_regions'

HTTP/1.1 200 OK

Content-Type: application/json

X-Frame-Options: SAMEORIGIN

Transfer-Encoding: chunked


{"env":{"defaultTimeZone":"UTC"},"items":[{"statementId":1,"statementType":"query","statementPos":{"startLine":1,"endLine":2},"statementText":"select * from eba_country_regions","resultSet":{"metadata":[{"columnName":"ID","jsonColumnName":"id","columnTypeName":"NUMBER","columnClassName":"java.math.BigDecimal","precision":0,"scale":-127,"isNullable":0},{"columnName":"NAME","jsonColumnName":"name","columnTypeName":"VARCHAR2","columnClassName":"java.lang.String","precision":255,"scale":0,"isNullable":0}],"items":[{"id":10,"name":"America"},{"id":20,"name":"Europe"},{"id":30,"name":"Asia"},{"id":40,"name":"Oceania"},{"id":50,"name":"Africa"}],"hasMore":false,"limit":10000,"offset":0,"count":5},"response":[],"result":0}]}%                                                       % 


以上でローカルのデータベースにREST対応SQLで問い合わせが発行できるようになりました。

ClaudeのMCPサーバーの構成のURLの部分を変更すると、Autonomous Databaseの代わりにローカルのデータベースを参照するようになります。

{
  "mcpServers": {
    "oracle": {
      "command": "node",
      "args": [
        "/Users/username/Documents/oracle-server/build/index.js",
	"http://localhost:8181/ords/mcp/_/sql",
	"wksp_mcp",
	"**********"
      ]
    }
  }
}

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

Oracle Databaseに接続するMCPサーバーを作成しClaudeから問い合わせる

Oracle Databaseに接続するMCPサーバーを作ってみました。接続先はREST対応SQLを有効にした、Autonomous Databaseです。その他の環境でも、Oracle REST Data Servicesを構成することで、REST対応SQLを使用できるようになります。

REST対応SQLによるアクセスはHTTP/HTTPSなので、Oracle用のドライバおよびコード中ので接続の管理などは必要ありません。

MCPサーバーが接続するAutonomous Databaseの環境を準備する手順は記事「Oracle Autonomous DatabaseでREST対応SQLを基本認証で有効にする」にて紹介しています。

Claude Desktop appから、色々と問い合わせてみました。


言葉に出来ないくらいすごい。

Oracle Database向けのMCPサーバーは、Exampleとして提供されているPostgreSQLのコードを元に作成しています。


MCPサーバーの作成は、公式の以下の手順に沿って行います。作業はmacOSで行なっています。


Node.js 18以上をインストールしておきます。

Create a new projectの作業を行います。適当なディレクトリに移動し、以下のコマンドを実行します。作成するディレクトリの名前はoracle-serverとします。

npx @modelcontextprotocol/create-server oracle-server

What is the name of your MCP server? oracleと入力します。この名前でClaudeに参照先として指示を出すことができます。
What is the description of your server? にはMy first Oracle MCP Serverと入力しました。説明なので、自由に記述できます。
Would you like to install this server for Claude.app? と聞かれますが、Yesを入力するとclaude_desktop_config.jsonにエントリが追加されます。後でURL、ユーザー名、パスワードなどを追加する必要があるし、まだ出来ていないのにエントリが追加されても困るのでnを入力します。

以上でMCPサーバーの雛形が作成されます。

% npx @modelcontextprotocol/create-server oracle-server

(node:2763) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use `node --trace-warnings ...` to show where the warning was created)

? What is the name of your MCP server? oracle

? What is the description of your server? My first Oracle MCP Server

? Would you like to install this server for Claude.app? No

MCP server created successfully!


Next steps:

  cd oracle-server

  npm install

  npm run build  # or: npm run watch

  npm link       # optional, to make available globally


% 


cd oracle-serverを実行し、作成されたディレクトリに移動します。

cd oracle-server

このディレクトリのsrc以下に、index.tsを作成します。


MCPサーバーの本体であるindex.tsを作成したら、ビルドします。

npm install
npm run build
npm link

% npm install

(node:2127) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use `node --trace-warnings ...` to show where the warning was created)


> oracle-server@0.1.0 prepare

> npm run build



> oracle-server@0.1.0 build

> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"



added 17 packages, and audited 18 packages in 1s


1 package is looking for funding

  run `npm fund` for details


found 0 vulnerabilities

% npm run build


> oracle-server@0.1.0 build

> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"


npm link

(node:2373) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use `node --trace-warnings ...` to show where the warning was created)


added 1 package, and audited 3 packages in 673ms


found 0 vulnerabilities

% 


以上でOracle Databaseに接続するMCPサーバーは作成できました。

~Library/Application\ Support/Claudeに移動し、claude_desktop_config.jsにエントリを追加します。

第1引数は(index.tsからビルドされた)index.jsの位置を指定します。第2引数はREST対応SQLを呼び出すエンドポイントURL、第3引数は接続するスキーマ名、第4引数はスキーマのパスワードです。
{
  "mcpServers": {
    "oracle": {
      "command": "node",
      "args": [
        "/Users/username/Documents/oracle-server/build/index.js",
	"https://********-apexdev.adb.us-ashburn-1.oraclecloudapps.com/ords/mcp/_/sql",
	"スキーマ名",
	"パスワード"
      ]
    }
  }
}
以上の設定を行い、Claude Desktop appを起動します。

後は思いついたことをClaudeに聞きます。


OracleのMCPサーバーのログは~/Library/Logs/Claude以下にmcp-server-oracle.logとして出力されます。

今回の記事は以上です。

自分で書いたMCPサーバーのindex.tsのレビューをClaude 3.5 Sonnetにお願いしたら、丸ごと書き直されましたが、自分で書いたコードを掲載しています。

Autonomous Databaseでの「アカウントがロックされています。」エラーについて

Autonomous DatabaseのAPEXワークスペースにサインインしようとしたときに、「アカウントがロックされています。」というエラーが表示されました。そのときの対処についての覚書です。


結果としては、APEXの管理サービスよりユーザーの編集を開いて、ロックを解除しました。


オンプレミスのAPEXのインストールでは、管理者および開発者もAPEX自体に登録されたユーザーなので、この対応になります。

Autonomous Databaseの場合、管理者および開発者ユーザーと同名のデータベース・ユーザーが作成され、そのユーザーのユーザー名とパスワードでデータベースで認証することで、APEXの開発ツールにサインインします(APEXのアプリケーションについては、APEXに保存されているパスワードにより認証されます)。そのため、データベース・ユーザーがロックされてると、同様に「アカウントがロックされています。」のエラーが発生します。

以下の問い合わせを発行し、ユーザーの状態を確認します。
select username, account_status, lock_date from dba_users where username = upper('ユーザー名')

この場合は、データベース・ユーザーのアカウントをアンロックすることで、事象は解消します。
alter user ユーザー名 account unlock;

APEXワークスペースに紐づくデフォルト・パーシング・スキーマもデータベース・ユーザーなので、アカウントはロックできます。Oracle APEXのアプリケーションは、アプリケーションに割り当てられたパーシング・スキーマの権限でSQLやPL/SQLを実行しますが、そのデータベース・ユーザーでデータベースに接続はしません。そのため、パーシング・スキーマのアカウントがロックされていても、アプリケーションは動作します。

データベース・アクション(SQL Developer Web)や、SQLclのようなツールでパーシング・スキーマのデータベース・ユーザーで接続する場合は、そのアカウントがロックされていると接続できません。

APEXの開発ツールにサインインする際に「アカウントがロックされています。」というエラーが発生した場合は、APEXユーザーのステータスとデータベースのユーザーのステータスの両方を確認する必要があります。

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

2024年12月2日月曜日

Oracle Autonomous DatabaseでREST対応SQLを基本認証で有効にする

Oracle Autonomous DatabaseにREST対応SQLを使って、SELECT文の実行ができるように構成します。REST対応SQLのRESTサービスによって実行されたSELECT文の結果は、JSONドキュメントとして返されます。SELECT文を実行する都度REST APIの呼び出しが行われ、一般的なドライバのように接続を管理する必要はありません。

今回の記事では、REST対応SQLでアクセスするスキーマを作成します。スキーマはあらかじめデータベース・アクション(SQL Developer Web)で作成し、そのスキーマを既存のスキーマとして選択して、APEXのワークスペースを作成することにします。APEXのワークスペースの作成時に新規スキーマとして作成したスキーマの場合、データベース・アクションからサインインできない場合があります。おそらく設定が足りていないのだと思いますが、データベース・アクションからスキーマを作成すると、データベース・アクションからサインインできないということは発生しません。

Autonomous Databaseの管理者ユーザーADMINにて、データベース・アクションにサインインします。


サインインしたら、管理データベース・ユーザーを呼び出します。


ユーザーの作成をクリックし、新規にデータベース・ユーザーを作成します。


ユーザー名はAPEXの命名書式に合わせてWKSP_MCPとします。必ずしも、接頭辞としてWKSP_つける必要はありません。そして、パスワードを設定します。このユーザー名とパスワードがREST対応SQLの呼び出し時の基本認証に与えるユーザー名とパスワードになります

表領域DATA(Autonomous Databaseの場合、ユーザー向けの表領域がDATAです)の割当て制限UNLIMITEDにしています。

REST対応SQLを有効にするため、Webアクセスオン承認が必要オンにします。REST別名はWKSP_を除いてmcpにします。これはREST対応SQLのエンドポイントのURLに含まれます。また、後で作成するAPEXワークスペース名mcpにします。

作成するユーザーにはデフォルトでロールCONNECTをRESOURCEがグラントされます。

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

コードの表示オンにすると、実際に実行されるコマンドを確認できます。作業を自動化したい場合などに有効です。


ユーザーWKSP_MCPが作成されれば、データベース・アクションでの作業は完了です。


この時点で、REST対応SQLによるSELECT文の実行ができます。

curlを使ってselect sysdate from dualを実行してみます。

curl -i -X POST -u wksp_mcp:[パスワード] https://[ID]-[インスタンス名].adb.[リージョン].oraclecloudapps.com/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select sysdate from dual'

% curl -i -X POST -u wksp_mcp:********** https://***********-apexdev.adb.us-ashburn-1.oraclecloudapps.com/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select sysdate from dual'

HTTP/1.1 200 OK

Date: Mon, 02 Dec 2024 09:15:53 GMT

Content-Type: application/json

Transfer-Encoding: chunked

Connection: keep-alive

Strict-Transport-Security: max-age=31536000;includeSubDomains

X-Content-Type-Options: nosniff

X-Frame-Options: SAMEORIGIN


{"env":{"defaultTimeZone":"UTC"},"items":[{"statementId":1,"statementType":"query","statementPos":{"startLine":1,"endLine":2},"statementText":"select sysdate from dual","resultSet":{"metadata":[{"columnName":"SYSDATE","jsonColumnName":"sysdate","columnTypeName":"DATE","columnClassName":"java.sql.Timestamp","precision":7,"scale":0,"isNullable":1}],"items":[{"sysdate":"2024-12-02T09:15:53Z"}],"hasMore":false,"limit":10000,"offset":0,"count":1},"response":[],"result":0}]}%                                                                % 


続いて、APEXのワークスペースを作成します。

Oracle APEXの画面に接続し、管理サービスを呼び出します。


ユーザーADMIN(Autonomous Databaseの管理ユーザー)のパスワードを入力し、APEXの管理サービスにサインインします。


管理サービスよりワークスペースの作成をクリックします。


新規のスキーマを選択します。


データベース・ユーザーとして、先ほど作成したWKSP_MCPを選択します。ワークスペース名REST別名と同じMCPをにします。ワークスペース・ユーザー名ワークスペース・パスワードとして、ワークスペースにサインインするユーザーを指定します。このユーザーはワークスペースの管理者ユーザーになります。Autonomous Databaseの場合は、(パスワード管理をAPEXではなくデータベースで行うようにするため)データベース・ユーザーとして作成されます。今回はワークスペース・ユーザー名MCPDEVとしています。

指定したワークスペース・ユーザーがすでにデータベース・ユーザーとして存在する場合は、パスワードは設定済みのものが優先されます。

以上でワークスペースの作成を実行します。


 APEXのワークスペースとしてMCPが作成されます。

リンクMCPにアクセスし、ワークスペースMCPにサインインします。


サインインには、ワークスペース作成時に指定したワークスペース・ユーザー名ワークスペース・パスワードを指定します。


検証に使用するデータをスキーマWKSP_MCPにインストールします。APEXのサンプル・データセットより国のデータをインストールします。

APEXの開発ツールにサインインしたら、SQLワークショップユーティリティサンプル・データセットを開きます。


サンプル・データセットのインストールをクリックします。


をクリックします。


データセットのインストールを実行します。

EBA_COUNTRY_REGIONS、EBA_COUNTRY_SUB_REGIONSといった表がスキーマWKSP_MCPにインストールされます。


表にインストールが完了しました。終了をクリックします。


これらの表を対象としたREST対応SQL、つまりREST APIによるSELECT文の実行と、実行結果としてのJSONドキュメントの取り出しが可能になりました。

確認のため、以下のSELECT文をREST対応SQLとして実行してみます。

select * from eba_country_regions

curlコマンドは以下になります。

curl -i -X POST -u wksp_mcp:[パスワード] https://[ID]-[インスタンス}.adb.[リージョン].oraclecloudapps.com/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select * from eba_country_regions'

% curl -i -X POST -u wksp_mcp:********** https://**************-apexdev.adb.us-ashburn-1.oraclecloudapps.com/ords/mcp/_/sql -H "Content-Type: application/sql" --data-binary 'select * from eba_country_regions'

HTTP/1.1 200 OK

Date: Mon, 02 Dec 2024 09:30:19 GMT

Content-Type: application/json

Transfer-Encoding: chunked

Connection: keep-alive

Strict-Transport-Security: max-age=31536000;includeSubDomains

X-Content-Type-Options: nosniff

X-Frame-Options: SAMEORIGIN


{"env":{"defaultTimeZone":"UTC"},"items":[{"statementId":1,"statementType":"query","statementPos":{"startLine":1,"endLine":2},"statementText":"select * from eba_country_regions","resultSet":{"metadata":[{"columnName":"ID","jsonColumnName":"id","columnTypeName":"NUMBER","columnClassName":"java.math.BigDecimal","precision":0,"scale":-127,"isNullable":0},{"columnName":"NAME","jsonColumnName":"name","columnTypeName":"VARCHAR2","columnClassName":"java.lang.String","precision":255,"scale":0,"isNullable":0}],"items":[{"id":10,"name":"America"},{"id":20,"name":"Europe"},{"id":30,"name":"Asia"},{"id":40,"name":"Oceania"},{"id":50,"name":"Africa"}],"hasMore":false,"limit":10000,"offset":0,"count":5},"response":[],"result":0}]}%

% 


整形した結果を以下になります。
{
  "env": {
    "defaultTimeZone": "UTC"
  },
  "items": [
    {
      "statementId": 1,
      "statementType": "query",
      "statementPos": {
        "startLine": 1,
        "endLine": 2
      },
      "statementText": "select * from eba_country_regions",
      "resultSet": {
        "metadata": [
          {
            "columnName": "ID",
            "jsonColumnName": "id",
            "columnTypeName": "NUMBER",
            "columnClassName": "java.math.BigDecimal",
            "precision": 0,
            "scale": -127,
            "isNullable": 0
          },
          {
            "columnName": "NAME",
            "jsonColumnName": "name",
            "columnTypeName": "VARCHAR2",
            "columnClassName": "java.lang.String",
            "precision": 255,
            "scale": 0,
            "isNullable": 0
          }
        ],
        "items": [
          {
            "id": 10,
            "name": "America"
          },
          {
            "id": 20,
            "name": "Europe"
          },
          {
            "id": 30,
            "name": "Asia"
          },
          {
            "id": 40,
            "name": "Oceania"
          },
          {
            "id": 50,
            "name": "Africa"
          }
        ],
        "hasMore": false,
        "limit": 10000,
        "offset": 0,
        "count": 5
      },
      "response": [],
      "result": 0
    }
  ]
}
Claude 3.5 SonnetにREST対応SQLをFetch APIで呼び出し、JSONを取得するコードを書いてもらいました。Content-Typeとbodyの指定は変更しましたが、それ以外はそのまま使えました。
const fetchDataWithBasicAuth = async (url, data, username, password) => {
  // Basic認証の資格情報をBase64エンコード
  const credentials = btoa(`${username}:${password}`);

  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Authorization': `Basic ${credentials}`,
        'Content-Type': 'application/sql',
        'Accept': 'application/json'
      },
      body: data
    });

    // レスポンスが正常でない場合はエラーをスロー
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    // JSONレスポンスをパース
    const jsonData = await response.json();
    return jsonData;

  } catch (error) {
    console.error('リクエストエラー:', error);
    throw error;
  }
};

// 使用例
const url = 'https://************-apexdev.adb.us-ashburn-1.oraclecloudapps.com/ords/mcp/_/sql';
const postData = 'select sysdate from dual';

// 関数の呼び出し
fetchDataWithBasicAuth(url, postData, 'wksp_mcp', '**********')
  .then(data => {
    console.log('取得したデータ:', data);
  })
  .catch(error => {
    console.error('エラー発生:', error);
  });

ブラウザで確認しました。ブラウザでの実行ではCORSのエラーが発生するため、ADBにアクセスして実行しています。


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

後はこの呼び出しをTypeScript版のMCPサーバーに組み込むことができれば、Oracle Databaseに問い合わせるMCPサーバーができるはず。