2025年8月26日火曜日

SQLcl MCPサーバーのデータベース接続をOCI IAMへのブラウザ認証で接続する

本記事ではOCI IAMをIdPとしてブラウザでユーザー認証を行った上で、SQLclのMCPサーバーからデータベースに接続します。

Entra IDではTNS名にTOKEN_AUTH=AZURE_INTERACTIVEを含めることにより、データベース接続時にブラウザが開きます。OCI IAM向けにおそらく同様の動作をするであろうTOKEN_AUTH=OCI_INTERACTIVEという設定がありますが、動作は確認できませんでした。そのため、TNS名にはTOKEN_AUTH=OCI_TOKENを含めます。

記事「SQLcl MCPサーバーのデータベース接続をOCI IAMが発行するトークンで認証する」に沿って、Autonomous DatabaseとしてSALESADBが作成され、OCI IAMにグループsales_dbusersが作成済みとします。データベースSALESADBにはグループsales_dbusersIAM_GROUP_NAMEとしたデータベース・ユーザーMCPUSERが作成済みとします。

作業にはApple Mackbook Pro、Sequoia 15.6.1を使用します。

最初にHomebrewでoci-cliをインストールします。

brew install oci-cli

私の環境ではoci-cli 3.64.1がインストール済みでした。

oci-iam % brew install oci-cli  

Warning: oci-cli 3.64.1 is already installed and up-to-date.

To reinstall 3.64.1, run:

  brew reinstall oci-cli

oci-iam % 


OCIコンソールのドメインより、個人で認証するユーザーをグループsales_dbusersに割り当てます。グループsales_dbusersに割り当てられたユーザーは、グローバル認証のデータベース・ユーザーMCPUSERとして、SALESADBに接続できます。


手元のコンピュータに戻り、OCIにサインインします。リージョンはca-toronto-1としていますが、この部分は使用する環境によって変わります。

oci session authenticate --region ca-toronto-1

メッセージに「Please switch to newly opened browser window to log in!」とあるように、ブラウザの画面が開きます。

oci-iam % oci session authenticate --region ca-toronto-1

    Please switch to newly opened browser window to log in!

    You can also open the following URL in a web browser window to continue:

https://login.ca-toronto-1.oraclecloud.com/v1/oauth2/authorize?action=login&client_id=iaas_console&response_type=token+id_token&nonce=954c351f-1f7d-4d8e-b26c-70bdca30b65a&scope=openid&public_key=eyJrdHkiOiAiUlNBIiwgIm4iOiAid05ac3M0b19MY3pLZDA1M2h0UmJZUWpRZzRpYnZaQUh4dFhKWkdkYmJpeEJGNTBocTA1a2FYcXkwVnE1Vk5HR0lXZnUyd1NJdXdJQnMzU2x4VWt3Y25VNE1UbU5KeHFZdHZDUW9XczNhTTVKZjQ1Xzlfb1dPWVF1aDRCUlFGZWNaRFhRTi05QUlmc1JGdndoUzR4R2pBQUtTQWtDS2tIcXZaa2d0eUJEeU1VUjFJUWNERDNiWVVkVmdPTjJUUTlmSFhvV0VOM2pjTGY4NWQ4TkJqT3RLc3N4VG9xR0JDVjVISzR3WkpOd0NVd0ZCbVFsdzNPc1poM25jZ0piNVNSWWZpYWNsWlRic3R3azkzdGhWRXFoQ1JQajFZSnZMU0QwX2pVdVZNUzRwcWxSZkN6aGlHVE94NDQ2Ums2VGhoUlE3dWlxLW9HUlJEcjBwcUVlMzN4X2pRIiwgImUiOiAiQVFBQiIsICJraWQiOiAiSWdub3JlZCJ9&redirect_uri=http%3A%2F%2Flocalhost%3A8181



ブラウザの画面よりサインインするユーザーを選択します。OCIコンソールでの作業を行っているはずなので、おそらくアクティブ・セッションはあるでしょう。


設定によって異なるかもしれませんが、私の場合はOracle Authenticatorでサインインを許可するように通知されました。


Oracle Authenticatorでサインインを許可すると、ブラウザに以下が表示されます。


サインインに成功すると、ターミナルではプロファイル名の入力を求められます。デフォルトのプロファイルと区別するために、プロファイル名をDBSESSIONとしています。

以上で、OCIへのサインインは完了です。

oci-iam % oci session authenticate --region ca-toronto-1 

    Please switch to newly opened browser window to log in!

    You can also open the following URL in a web browser window to continue:

https://login.ca-toronto-1.oraclecloud.com/v1/oauth2/authorize?action=login&client_id=iaas_console&response_type=token+id_token&nonce=c7d7f214-f519-4696-9503-6100f47b613e&scope=openid&public_key=eyJrdHkiOiAiUlNBIiwgIm4iOiAidWMwTC0wSDVmY2pzYjl0eG5tOXg5dG5qQ2cwLUU3UjZzRW5GbXo3MG9uTHZNS3ZnRGxQREl3cWloZm83ZmwtSDQ3OEYwZ2MxN2N3dkcwTHMtamdubEZITHBmclVqNDU2ZTBmVUlBNmFwcHRabDJaUUdJck9IZ3M4Vm1xMGlIanZYNjgxRXpWYjJiT28yampNS21OZ01TSDVNdFJMaWpQclp4Y3NoNXFXM2JkMll6djFfR0pycFNXMVJjM2YtWXpxQTViNDVuaUFSc0ZzY1k5ZTdTbWpkc052d25nMnpwcGFBNllZRXk3QjNKTGl5LU1OQVU0Y2Uwcm1WN2s4OFdaUVY4THVBXzNTdHM5OGVUdlNzQU5qWHlnNGQ2Zm9fbFpTRWdZMWpBeF82VGdkc1J4b3ZyYWRGYVlPU0VtVjRMeWc4R2lwMjBoYXVUVDZiMTVuNmZ0WGh3IiwgImUiOiAiQVFBQiIsICJraWQiOiAiSWdub3JlZCJ9&redirect_uri=http%3A%2F%2Flocalhost%3A8181

    Completed browser authentication process!

Enter the name of the profile you would like to create: DBSESSION

Config written to: /Users/_____________/.oci/config


    Try out your newly created session credentials with the following example command:


    oci iam region list --config-file /Users/___________/.oci/config --profile DBSESSION --auth security_token


oci-iam % 


データベースへの接続に使用するトークンを取得します。

oci iam db-token get --profile DBSESSION --auth security_token

~/.oci/db-token/tokenとして、データベース接続に使用するトークンが保存されます。トークンの有効期限は1時間です。有効期限が切れたら、トークンを再取得する必要があります。

oci-iam % oci iam db-token get --profile DBSESSION --auth security_token

Private key written at /Users/___________/.oci/db-token/oci_db_key.pem

db-token written at: /Users/__________/.oci/db-token/token

db-token is valid until 2025-08-26 11:55:07

oci-iam % 


tnsnames.oraを更新するため、Wallet_SALESADB.zipを解凍します。

unzip -d tns_admin Wallet_SALESADB.zip

oci-iam % unzip -d tns_admin Wallet_SALESADB.zip

Archive:  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  

oci-iam % 


tns_admin/tnsnames.oraを編集します。(TOKEN_AUTH=OCI_TOKEN)の指定を含めたTNS名salesadb_ociを追加します。

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=ge15__________f_salesadb_low.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OCI_TOKEN)))

変更したtnsnames.oraを参照するように、環境変数TNS_ADMINを設定します。その後、SQLclでsalesadb_ociへ接続します。

export TNS_ADMIN=$PWD/tns_admin
sql /@salesadb_oci

oci-iam % export TNS_ADMIN=$PWD/tns_admin

oci-iam % sql /@salesadb_oci             



SQLcl: 火 8月 26 11:10:45 2025のリリース25.2 Production


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


接続先:

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

Version 23.9.0.25.08


SQL> 


グローバル認証に関する情報を確認します。

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

AUTHENTICATION_METHODがTOKEN_GLOBAL、AUTHENTICATED_IDENTITYはメールアドレスになっていることが確認できます。

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


SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD')    SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')    

_________________________________________________ __________________________________________________ 

TOKEN_GLOBAL                                      y********@********.com                          


SQL> 


接続したデータベース・ユーザーを確認します。

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

セッション・ユーザー、カレント・ユーザーともにMCPUSERであることが確認できます。

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> 


以上で、ブラウザで認証したユーザーによりデータベースに接続できることが確認できました。

MCPサーバーからこの接続を参照できるように、salesadb-ociとして保存します。

conn -save salesadb-oci -savepwd /@salesadb_oci

SQL> conn -save salesadb-oci -savepwd /@salesadb_oci

名前: salesadb-oci

接続文字列: salesadb_oci

ユーザー: 

パスワード: 未保存

接続しました.

SQL> exit

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

Version 23.9.0.25.08から切断されました

oci-iam % 


connmgr listを実行し、接続salesadb-ociが保存されていることを確認します。

oci-iam % sql /nolog



SQLcl: 火 8月 26 11:23:07 2025のリリース25.2 Production


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


SQL> connmgr list

.

├── adb-free-23ai-freepdb1-wksp_apexdev

├── local-23ai-freepdb1-sys

├── local-23ai-freepdb1-wskp_apexdev

├── mydb

├── salesadb-az

└── salesadb-oci

SQL> exit

oci-iam % 


環境変数TNS_ADMINが必ず設定されるように、以下のスクリプトをsql-mcp.shとして作成します。TNS_ADMINおよびSQLclのバイナリの指定はフルパスで指定します。
#!/bin/sh

WD=/Users/xxxxxxxxxx/Documents/oci-iam
export TNS_ADMIN=$WD/tns_admin
~/sqlcl/bin/sql -mcp
WDに設定するディレクトリは、それぞれの環境に合わせて変更します。作成したスクリプトに、実行権限を付与します。

chmod 755 sql-mcp.sh

oci-iam % chmod 755 sql-mcp.sh 

oci-iam % 


Claude DesktopにMCPサーバーとして登録します。実行するcommandとして、先ほど作成したsql-mcp.shをフルパスで記述します。
{
  "mcpServers": {
    "sqlcl": {
      "command": "/Users/xxxxxxxxx/Documents/oci-iam/sql-mcp.sh"
    }
  }
}
Claude DesktopでMCPサーバーsqlclを有効にして、salesadb-ociに接続します。

MCPサーバーからデータベースに接続できました。データベースへの接続は、OCI IAMに登録された個人として認証されています。


手順として今ひとつな部分はありますが、LLMからデータベースにアクセスする際に利用者個人として認証できました。

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



追記:TOKEN_AUTH=OCI_INTERACTIVEの設定について


TOKEN_AUTH=OCI_TOKENの代わりにTOKEN_AUTH=OCI_INTERACTIVEを設定します。
tnsnames.oraに以下のエントリsalesadb_intを追加します。

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

追加したTNS名salesadb_intを指定してデータベースに接続を試みると、エラーが発生します。エラーはNo implementation of oracle.jdbc.spi.AccessTokenProviderというエラーです。

oci-iam % sql /@salesadb_int



SQLcl: 火 8月 26 11:40:53 2025のリリース25.2 Production


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


接続に失敗しました

  USER          = 

  URL           = jdbc:oracle:thin:@salesadb_int

  エラー・メッセージ = ORA-18726: OracleResourceProviderからの値の取得に失敗しました: No implementation of oracle.jdbc.spi.AccessTokenProvider with name: "ojdbc-provider-oci-token" can be located. Implementations of oracle.jdbc.spi.AccessTokenProvider that can be located have the following names : []

https://docs.oracle.com/error-help/db/ora-18726/


oci-iam % 


このエラーについては、sdkとしてjdbc-ociをインストールすることで対応できます。

sdk install jdbc-oci

oci-iam % sql /nolog



SQLcl: 火 8月 26 11:43:02 2025のリリース25.2 Production


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


SQL> sdk list

+------------+-----------+---------+----------------------------------------------------------------------+

| SDK        | INSTALLED | VERSION | ドキュメント                                                               |

+------------+-----------+---------+----------------------------------------------------------------------+

| jdbc-oci   | いいえ       | 1.0.6   | https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/ |

| jdbc-azure | いいえ       | 1.0.6   | https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/ |

+------------+-----------+---------+----------------------------------------------------------------------+

SQL> sdk install jdbc-oci

ojdbc-provider-oci SDKおよびその依存性をダウンロードしています

jdbc-oci SDKは正常にインストールされました。SQLclを再起動して変更を反映してください

SQL> sdk list

+------------+-----------+---------+----------------------------------------------------------------------+

| SDK        | INSTALLED | VERSION | ドキュメント                                                               |

+------------+-----------+---------+----------------------------------------------------------------------+

| jdbc-oci   | はい        | 1.0.6   | https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/ |

| jdbc-azure | いいえ       | 1.0.6   | https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/ |

+------------+-----------+---------+----------------------------------------------------------------------+

SQL> exit

oci-iam % 


再度、salesadb_intを指定してデータベースに接続を試みます。エラー番号は同じですが、今度は理由の説明されていないため、先に進めない感じです。

oci-iam % sql /@salesadb_int



SQLcl: 火 8月 26 11:45:00 2025のリリース25.2 Production


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


接続に失敗しました

  USER          = 

  URL           = jdbc:oracle:thin:@salesadb_int

  エラー・メッセージ = ORA-18726: OracleResourceProviderからの値の取得に失敗しました

https://docs.oracle.com/error-help/db/ora-18726/


oci-iam % 


追記終わり