2025年8月22日金曜日

SQLcl MCPサーバーのデータベース接続をOCI IAMが発行するトークンで認証する

SQLclが提供しているMCPサーバーがデータベースに接続する際に、OCI IAMに登録しているユーザーで認証します。ユーザー認証にはOCI IAMが発行するトークンを使用します。

接続先となるOracle Databaseは、Always FreeのAutonomous Data Warehouseを対象とします。Microsoft Entra IDとは異なり、OCI IAMでの認証はOracle Cloudで稼働しているOracle Databaseに限定されています。そういった制限がある代わりに、Microsoft Entra IDと比較すると手順と項目が少なくなっています。

以下より作業手順を記載します。Microsoft  Entra IDで行った作業と重複する部分も多いですが、他の記事を参照せずに設定を進められるように省略はしません。

本記事では、主に以下のドキュメントにそって作業を実施します。

Using Oracle Autonomous Database Serverless
Use Identity and Access Management (IAM) Authentication with Autonomous Database

作業はApple SiliconのMacbook Proで行います。


Autonomous Databaseの作成



最初に接続先となるAutonomous Databaseを作成します。Oracle Cloudのコンソールより、Always FreeのAutonomous Data Warehouseを作成します。

表示名SALESADBデータベース名SALESADBとします。ワークロード・タイプデータ・ウェアハウスを選択します。データベース構成Always Freeをオンにし、データベース・バージョンとして23aiを選択します。

その他、管理者ユーザーADMINパスワードなどを設定し、Autonomous Databaseを作成します。


作成をクリックすると、データベースのプロビジョニングが開始します。


データベースが使用可能になったことを確認し、手元のクライアントからデータベースに接続するために使用するウォレットをダウンロードします。

データベース接続をクリックします。


ドロワーが開きます。ウォレット・タイプインスタンス・ウォレットを選択します。

ウォレットのダウンロードをクリックします。


パスワードを指定し、ダウンロードを実行します。ただし、今回の用途では、ここで指定したパスワードを使用することはありません。


ウォレットとしてWallet_SALESADB.zipがダウンロードされます。

手元のホストに作業ディレクトリを作成し、ダウンロードされたWallet_SALESADB.zipを移動します。

% mkdir oci-iam

% cd oci-iam

oci-iam % mv ~/Downloads/Wallet_SALESADB.zip .

oci-iam % ls

Wallet_SALESADB.zip

oci-iam % 


以上で、これからの作業に使用するAutonomous Databaseが作成できました。


OCI IAMの設定



OCI IAMのデフォルト・ドメインに、Oracle Databaseへ接続するユーザーとグループを作成します。作成したグループで、同じテナントに所属するすべてのOracle Databaseへの接続を許可するポリシーを作成します。

OCIコンソールのアイデンティティとセキュリティに含まれるドメインを開きます。

ルート・コンパートメントにあるドメインDefaultを開きます。ドメイン・タイプFreeであることでわかるように、このドメインはOracle Cloudの無料枠に含まれます。


ドメインDefaultのユーザー管理を開きます。

グループの作成をクリックします。


作成するグループの名前sales_dbusersとします。説明には、データベースに接続できるユーザーと書きました。

以上で作成をクリックします。


グループsales_dbusersが作成されます。


ドメインDefaultユーザー管理のページに戻り、ユーザーの作成をクリックします。


接続テストに使用するユーザーを作成します。今回はユーザー名として電子メール・アドレスを使用オフにして、ユーザー名oracle.taroとしています。テスト・ユーザーについては、それぞれの都合に合わせてユーザー名その他を決めて作成してください。

グループのsales_dbusersチェックを入れ、作成するテスト・ユーザーがグループsales_dbusersに含まれるようにします。

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


テスト・ユーザーが作成されます。ユーザーのOCIDはクライアントを設定する際に使用するため、コピーして記録しておきます。


アイデンティティとセキュリティポリシーを開きます。

ポリシーの作成をクリックします。


ポリシーの名前sales_test_policyとします。説明には、allow group sales_dbusers to connect to all autonomous databasesと書きました。コンパートメントルート・コンパートメントを選択します。

ポリシー・ビルダー手動エディタを表示し、ポリシー・ステートメントとして以下を記述します。

allow group sales_dbusers to use autonomous-database-family in tenancy

以上でポリシーを作成します。


ポリシーsales_test_policyが作成されます。


クラアントの設定に使用するため、テナンシのOCIDを確認します。

ユーザーのプロファイルからテナンシを開きます。


テナンシ情報OCIDコピーし記録します。


以上で一旦OCI IAMでの設定は完了です。


MCPサーバーを実行するコンテナの作成



SQLclとoci-cliをインストールしたコンテナ・イメージを作成します。コンテナ・イメージの作成に、以下のDockerfileを使用します。


コンテナ・イメージに組み込むSQLclをダウンロードします。

curl -OL https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zip

oci-iam % curl -OL https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zip

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 87.8M  100 87.8M    0     0  9004k      0  0:00:09  0:00:09 --:--:-- 9725k

oci-iam % 


コンテナ・イメージを作成します。

podman build -f Dockerfile -t sqlcl-mcp-oci

oci-iam % podman build -f Dockerfile -t sqlcl-mcp-oci

STEP 1/11: FROM oraclelinux:9

STEP 2/11: RUN dnf update -y &&     dnf install -y sudo passwd unzip ncurses java-21-openjdk-headless &&     dnf -y install oraclelinux-developer-release-el9 &&     dnf -y install python39-oci-cli &&     dnf clean all

Oracle Linux 9 BaseOS Latest (aarch64)          8.0 MB/s |  91 MB     00:11    

Oracle Linux 9 Application Stream Packages (aar 9.4 MB/s |  38 MB     00:04    

Last metadata expiration check: 0:00:06 ago on Fri Aug 22 06:42:50 2025.

Dependencies resolved.

==========================================================================================

 Package                       Arch     Version                   Repository          Size

==========================================================================================

Upgrading:

 alternatives                  aarch64  1.24-2.0.1.el9            ol9_baseos_latest   36 k

 audit-libs                    aarch64  3.1.5-4.0.1.el9           ol9_baseos_latest  125 k

 bzip2-libs                    aarch64  1.0.8-10.el9_5            ol9_baseos_latest   40 k

 chkconfig                     aarch64  1.24-2.0.1.el9            ol9_baseos_latest  233 k

 coreutils                     aarch64  8.32-39.0.1.el9           ol9_baseos_latest  1.2 M

 coreutils-common              aarch64  8.32-39.0.1.el9           ol9_baseos_latest  2.1 M

 crypto-policies               noarch   20250128-1.git5269e22.el9 ol9_baseos_latest  178 k

 curl                          aarch64  7.76.1-31.el9_6.1         ol9_baseos_latest  300 k

 dnf                           noarch   4.14.0-25.0.1.el9         ol9_baseos_latest  532 k

 dnf-data                      noarch   4.14.0-25.0.1.el9         ol9_baseos_latest   46 k

 dnf-plugins-core              noarch   4.3.0-20.0.1.el9          ol9_baseos_latest   55 k

 elfutils-default-yama-scope   noarch   0.192-6.el9_6             ol9_baseos_latest  8.4 k

 elfutils-libelf               aarch64  0.192-6.el9_6             ol9_baseos_latest  213 k

 elfutils-libs                 aarch64  0.192-6.el9_6             ol9_baseos_latest  263 k

 expat                         aarch64  2.5.0-5.el9_6             ol9_baseos_latest  116 k

 glib2                         aarch64  2.68.4-16.el9_6.2         ol9_baseos_latest  2.7 M

 glibc                         aarch64  2.34-168.0.1.el9_6.23     ol9_baseos_latest  1.7 M

 glibc-common                  aarch64  2.34-168.0.1.el9_6.23     ol9_baseos_latest  317 k

 glibc-langpack-en             aarch64  2.34-168.0.1.el9_6.23     ol9_baseos_latest  965 k


[中略]


  inflating: /opt/oracle/sqlcl/lib/dbtools-net.jar  

  inflating: /opt/oracle/sqlcl/lib/reactive-streams.jar  

  inflating: /opt/oracle/sqlcl/lib/xdb.jar  

  inflating: /opt/oracle/sqlcl/lib/oci-java-sdk-common.jar  

  inflating: /opt/oracle/sqlcl/lib/orajsoda.jar  

  inflating: /opt/oracle/sqlcl/lib/quartz.jar  

  inflating: /opt/oracle/sqlcl/lib/javassist.jar  

--> 018c9e2e0264

STEP 11/11: CMD ["/opt/oracle/sqlcl/bin/sql","-mcp"]

COMMIT sqlcl-mcp-oci

--> da3c5885c499

Successfully tagged localhost/sqlcl-mcp-oci:latest

da3c5885c49903cf6179b0dc91b9ba98a9c5a27e596b8bfc34b5d98054cf599d

oci-iam % 


コンテナ・イメージがlocalhost/sqlcl-mcp-oci:latestとして作成されます。

作成されたコンテナ・イメージをもとに、コンテナmcp-ociを作成して実行します。

コンテナを削除しても設定が保持されるように、ボリュームmcp-oci-confを作成します。

podman volume create mcp-oci-conf

oci-iam % podman volume create mcp-oci-conf

mcp-oci-conf

oci-iam %


コンテナmcp-ociを作成します。Autonomous DatabaseのSALESADBに接続できるように、カレント・ディレクトリにダウンロード済みのWallet_SALESADB.zipを置いておきます。

ボリュームmcp-oci-conf/home/oracleにマウントすることにより、oci-cliやSQLclの構成をボリュームmcp-oci-confに保存し永続化します。また、カレント・ディレクトリを/opt/oracle/walletsにマウントすることで、Wallet_SALESADB.zipをコンテナの中から参照できるようにします。

podman run --rm --name mcp-oci -v mcp-oci-conf:/home/oracle -v $PWD:/opt/oracle/wallets sqlcl-mcp-oci:latest

SQLclのMCPサーバーが起動します。

oci-iam % podman run --rm --name mcp-oci -v mcp-oci-conf:/home/oracle -v $PWD:/opt/oracle/wallets sqlcl-mcp-oci:latest

OpenJDK 64-Bit Server VM warning: Unable to get SVE vector length on this system. Disabling SVE. Specify -XX:UseSVE=0 to shun this warning.

---------- MCP SERVER STARTUP ----------

MCP Server started successfully on Fri Aug 22 06:52:37 UTC 2025

Press Ctrl+C to stop the server

----------------------------------------



データベースとクライアントの構成は、このコンテナに接続して作業します。


Oracle Databaseの構成



実行中のコンテナmcp-ociに接続し、Oracle Databaseの構成を行います。別ターミナルからコンテナmcp-ociに接続します。

podman exec -it mcp-oci bash

oci-iam % podman exec -it mcp-oci bash

[oracle@c6de9432d2cc ~]$ 


Wallet_SALESADB.zip/home/oracle/tns_admin以下に解凍します。/home/oracle/tns_adminは環境変数TNS_ADMINに設定済みです。

cd
unzip -d tns_admin /opt/oracle/wallets/Wallet_SALESADB.zip


[oracle@c6de9432d2cc ~]$ cd

[oracle@c6de9432d2cc ~]$ unzip -d tns_admin /opt/oracle/wallets/Wallet_SALESADB.zip

Archive:  /opt/oracle/wallets/Wallet_SALESADB.zip

  inflating: tns_admin/ewallet.pem   

  inflating: tns_admin/README        

  inflating: tns_admin/cwallet.sso   

  inflating: tns_admin/tnsnames.ora  

  inflating: tns_admin/truststore.jks  

  inflating: tns_admin/ojdbc.properties  

  inflating: tns_admin/sqlnet.ora    

  inflating: tns_admin/ewallet.p12   

  inflating: tns_admin/keystore.jks  

[oracle@c6de9432d2cc ~]$ 


SQLclを起動し、Autonomous DatabaseのSALESADBに管理者ユーザーADMINで接続します。

/opt/oracle/sqlcl/bin/sql admin@salesadb_low

[oracle@c6de9432d2cc ~]$ /opt/oracle/sqlcl/bin/sql admin@salesadb_low

OpenJDK 64-Bit Server VM warning: Unable to get SVE vector length on this system. Disabling SVE. Specify -XX:UseSVE=0 to shun this warning.



SQLcl: Release 25.2 Production on Fri Aug 22 06:59:22 2025


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


Password? (**********?) **************

Last Successful login time: Fri Aug 22 2025 06:59:28 +00:00


Connected to:

Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems

Version 23.9.0.25.08


SQL> 


データベースの外部認証としてOCI_IAMを使うように構成します。
BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION( 
        type => 'OCI_IAM',
        force => TRUE );
END;
/

SQL> BEGIN

  2      DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION( 

  3          type => 'OCI_IAM',

  4          force => TRUE );

  5  END;

  6* /


PL/SQL procedure successfully completed.


SQL> 


設定を確認します。

SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';

SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';


NAME                      VALUE      

_________________________ __________ 

identity_provider_type    OCI_IAM    


SQL> 


IAMグループsales_dbusersをマップしたデータベース・ユーザーとして、MCPUSERを作成します。

create user mcpuser identified globally as 'IAM_GROUP_NAME=sales_dbusers';
alter user mcpuser quota 25m on data;
grant create session to mcpuser;
grant create table, create view, create sequence to mcpuser;

SQL> create user mcpuser identified globally as 'IAM_GROUP_NAME=sales_dbusers';


User MCPUSER created.


SQL> alter user mcpuser quota 25m on data;


User MCPUSER altered.


SQL> grant create session to mcpuser;


Grant succeeded.


SQL> grant create table, create view, create sequence to mcpuser;


Grant succeeded.


SQL> exit

Disconnected from Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems

Version 23.9.0.25.08

[oracle@c6de9432d2cc ~]$ 


以上でOracle Databaseの構成は完了です。


クライアントの構成



コンテナからOracle Databaseに接続するための構成を行います。

db-tokenの取得をリクエストします。OCIプロファイルが未構成なので、初回実行時はOCIプロファイルが構成されます。

oci iam db-token get

/home/oracle/.oci/configが存在しないので、新たに作成するかどうか聞かれます。Yで継続します。

[oracle@c6de9432d2cc ~]$ oci iam db-token get

ERROR: Could not find config file at /home/oracle/.oci/config

Do you want to create a new config file? [Y/n]: Y


browserを使ってログインすることで作業を継続するか?と聞かれます。コンテナ内からブラウザは開けないため、nで継続します。

Do you want to create your config file by logging in through a browser? [Y/n]: n

    This command provides a walkthrough of creating a valid CLI config file.


    The following links explain where to find the information required by this

    script:


    User API Signing Key, OCID and Tenancy OCID:


        https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#Other


    Region:


        https://docs.cloud.oracle.com/Content/General/Concepts/regions.htm


    General config documentation:


        https://docs.cloud.oracle.com/Content/API/Concepts/sdkconfig.htm




configファイルの位置を聞かれます。デフォルトで継続します。
  1. ユーザーのOCIDを入力します。テスト・ユーザーoracle.taroを作成したときのコピーしたOCIDを入力します。
  2. テナントのOCIDを入力します。
  3. リージョン識別子を入力します。以下の例ではca-toronto-1を入力しています。
  4. APIキーとなるRSAキー・ペアを生成するかどうか聞かれるので、Yを指定してRSAキー・ペアを生成します。
  5. RSAのキーを保存するファイル名を指定します。デフォルトのoci_api_keyのまま変更しません。テスト・ユーザーoracle.taroのAPIキーとして追加する公開キーは、ファイル/home/oracle/.oci/oci_api_key_public.pemに保存されます。
  6. 秘密キーの設定するパスフレーズを聞かれます。N/Aを入力します。
  7. パスフレーズの確認を求められます。同じくN/Aを入力します。
以上でOCIのプロファイルが保存されます。

Enter a location for your config [/home/oracle/.oci/config]: 

Enter a user OCID: ocid1.user.oc1..aaaaa*******************xoiqqyp3a

Enter a tenancy OCID: ocid1.tenancy.oc1..aa***********************kmentrva

Enter a region by index or name(e.g.

1: af-johannesburg-1, 2: ap-batam-1, 3: ap-chiyoda-1, 4: ap-chuncheon-1, 5: ap-chuncheon-2,

6: ap-dcc-canberra-1, 7: ap-dcc-gazipur-1, 8: ap-delhi-1, 9: ap-hyderabad-1, 10: ap-ibaraki-1,

11: ap-melbourne-1, 12: ap-mumbai-1, 13: ap-osaka-1, 14: ap-seoul-1, 15: ap-seoul-2,

16: ap-singapore-1, 17: ap-singapore-2, 18: ap-suwon-1, 19: ap-sydney-1, 20: ap-tokyo-1,

21: ca-montreal-1, 22: ca-toronto-1, 23: eu-amsterdam-1, 24: eu-budapest-1, 25: eu-crissier-1,

26: eu-dcc-dublin-1, 27: eu-dcc-dublin-2, 28: eu-dcc-milan-1, 29: eu-dcc-milan-2, 30: eu-dcc-rating-1,

31: eu-dcc-rating-2, 32: eu-dcc-zurich-1, 33: eu-frankfurt-1, 34: eu-frankfurt-2, 35: eu-jovanovac-1,

36: eu-madrid-1, 37: eu-madrid-2, 38: eu-marseille-1, 39: eu-milan-1, 40: eu-paris-1,

41: eu-stockholm-1, 42: eu-zurich-1, 43: il-jerusalem-1, 44: me-abudhabi-1, 45: me-abudhabi-2,

46: me-abudhabi-3, 47: me-abudhabi-4, 48: me-alain-1, 49: me-dcc-doha-1, 50: me-dcc-muscat-1,

51: me-dubai-1, 52: me-jeddah-1, 53: me-riyadh-1, 54: mx-monterrey-1, 55: mx-queretaro-1,

56: sa-bogota-1, 57: sa-santiago-1, 58: sa-saopaulo-1, 59: sa-valparaiso-1, 60: sa-vinhedo-1,

61: uk-cardiff-1, 62: uk-gov-cardiff-1, 63: uk-gov-london-1, 64: uk-london-1, 65: us-ashburn-1,

66: us-ashburn-2, 67: us-chicago-1, 68: us-gov-ashburn-1, 69: us-gov-chicago-1, 70: us-gov-phoenix-1,

71: us-langley-1, 72: us-luke-1, 73: us-newark-1, 74: us-phoenix-1, 75: us-saltlake-2,

76: us-sanjose-1, 77: us-somerset-1, 78: us-thames-1): ca-toronto-1

Do you want to generate a new API Signing RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y

Enter a directory for your keys to be created [/home/oracle/.oci]: 

Enter a name for your key [oci_api_key]: 

Public key written to: /home/oracle/.oci/oci_api_key_public.pem

Enter a passphrase for your private key ("N/A" for no passphrase): N/A

Repeat for confirmation: N/A

Private key written to: /home/oracle/.oci/oci_api_key.pem

Fingerprint: 46:ca:89:61:c9:77:bf:85:c5:c1:02:4b:80:71:82:e0

Config written to /home/oracle/.oci/config



    If you haven't already uploaded your API Signing public key through the

    console, follow the instructions on the page linked below in the section

    'How to upload the public key':


        https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#How2



Successfully created config file with your new CLI user profile

Once your public key is uploaded in the console, you can re-run your command to use your new config file and user profile

[oracle@c6de9432d2cc ~]$ 


最後のメッセージとして「Once your public key is uploaded in the console, you can re-run your command to use your new config file and user profile」とあります。

出力された公開キーをOCIコンソールにアップロードした後、oci iam db-token getコマンドを実行すると、今度はデータベースに接続する際に使用するトークンが生成されます。

公開キーを画面に表示します。

cat .oci/oci_api_key_public.pem

[oracle@c6de9432d2cc ~]$ cat .oci/oci_api_key_public.pem 

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm5k2CpUiH5QDSFy7jDqS

5ax1Cmlb6T+KEYzt/ZQD6uKHd3NmxPKWPjxai+3v030ByealuEpmComqYn6kA8Y0

7j3zVRQinm01nEZxiH5k/hegRw63VVyK+QqLC/nkrSvEPcZqPAtHP+cMibDmjrrU

0t3M1mdZ6j6JcQkO1t1jpnHgk4VyI4n1DAp5+BGM+G1CuKpAPjnRmH/kuu9pL/rR

rtRiJ7PhcjJTiZ+aU3BjI26oHFI9Aay/tcbL1EkoeyorVe7jUfqeZT3tjZaW4Kqe

+HcKcDZ/ZuAVe2XOQpXQe6OK3k9qS+83neNqElRzFcJ+XHrmArohhRVA84hY1hfR

8wIDAQAB

-----END PUBLIC KEY-----

[oracle@c6de9432d2cc ~]$ 


OCIコンソールよりテスト・ユーザー(今回の例ではoracle.taro)のAPIキーの設定を開きます。

APIキーの追加をクリックします。


ドロワーが開きます。

公開キーの貼付けを選択し、コンテナで表示した公開キーをコピペします。

追加をクリックします。


構成ファイルがプレビューされます。

これはコンテナにある~/.oci/configの内容と、key_fileを除いて一致します。~/.oci/configにはkey_fileに秘密キーのファイル名が設定されています。

画面を閉じます。


APIキーが登録されました。


コンテナに戻り、再度db-tokenを取得するコマンドを実行します。

oci iam db-token get

今度はトークンが所定のファイルに書き込まれます。有効期間は1時間なので、1時間経過後はトークンの再取得が必要です。

[oracle@c6de9432d2cc ~]$ oci iam db-token get

Private key written at /home/oracle/.oci/db-token/oci_db_key.pem

db-token written at: /home/oracle/.oci/db-token/token

db-token is valid until 2025-08-22 08:41:45

[oracle@c6de9432d2cc ~]$ 


tns_admin/tnsnames.oraに、securityに設定に(TOKEN_AUTH=OCI_TOKEN)を追加したTNS名salesadb_ociを追加します。TOKEN_LOCATIONはデフォルトの位置なので省略できます。

salesadb_oci = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ca-toronto-1.oraclecloud.com))(connect_data=(service_name=ge____________f_salesadb_low.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OCI_TOKEN)))

トークンを使ってデータベースSALESADBに接続します。MCPサーバーで利用できるようにsalesadb_ociとして接続を保存します。

/opt/oracle/sqlcl/bin/sql /nolog
connect -save salesadb_oci -savepwd /@salesadb_oci

[oracle@c6de9432d2cc ~]$ /opt/oracle/sqlcl/bin/sql /nolog

OpenJDK 64-Bit Server VM warning: Unable to get SVE vector length on this system. Disabling SVE. Specify -XX:UseSVE=0 to shun this warning.



SQLcl: Release 25.2 Production on Fri Aug 22 08:00:59 2025


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


SQL> connect -save salesadb_oci -savepwd /@salesadb_oci

Name: salesadb_oci

Connect String: salesadb_oci

User: 

Password: not saved

Connected.

SQL> 


データベースSALESADBに接続できました。

システム・コンテキストUSERENVAUTHENTICATION_METHODの値を確認します。

select sys_context('userenv','authentication_method');

値はTOKEN_GLOBALになっています。

SQL> select sys_context('userenv','authentication_method');


SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD')    

_________________________________________________ 

TOKEN_GLOBAL                                      


SQL> 


AUTHENTICATED_IDENTITYの値を確認します。

select sys_context('userenv','authenticated_identity');

値はテスト・ユーザーのoracle.taroになっています。

SQL> select sys_context('userenv','authenticated_identity');


SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')    

__________________________________________________ 

oracle.taro                                        


SQL> 


SESSION_USERとCURRENT_USERはMCPUSERになっています。

select sys_context('userenv','session_user'), sys_context('userenv','current_user');

SQL> select sys_context('userenv','session_user'), sys_context('userenv','current_user');


SYS_CONTEXT('USERENV','SESSION_USER')    SYS_CONTEXT('USERENV','CURRENT_USER')    

________________________________________ ________________________________________ 

MCPUSER                                  MCPUSER                                  


SQL> 


以上でクライアントの構成は完了です。

podman execをexitで抜けて、起動中のコンテナmcp-ociを停止します。コンテナmcp-ociは停止すると削除されますが、設定がボリュームmcp-oci-confに保存されています。

podman stop mcp-oci

oci-iam % podman stop mcp-oci

mcp-oci

oci-iam % 




Claude Desktopでの確認



Claude Desktopのclaude_desktop_config.jsonへの記述は、以下になります。
{
  "mcpServers": {
    "sqlcl": {
      "command": "podman",
      "args": [
        "run",
        "-i",
        "--rm",
        "-v",
        "mcp-oci-conf:/home/oracle",
        "sqlcl-mcp-oci:latest"
      ]
    }
  }
}

Claude Desktopから上記のMCPサーバーを呼び出して、データベースに問い合わせを行いました。


概ね期待どおり動作しています。

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