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",
	"**********"
      ]
    }
  }
}

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