2025年8月22日金曜日

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

更新:2026年2月13日 - コンテナによる分離の代わりにSQLclの-homeオプションを使用

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

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

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

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

Autonomous AI DatabaseとしてSALESADBを作成するところまでは、以下のEntra IDでの手順と同じです。

SQLclのMCPサーバーのデータベース接続をMicrosoft Entra IDのOAuth2で認証する

環境変数TNS_ADMINに設定するディレクトリは~/Documents/mcp-salesadb-ociとし、Wallet_SALESADB.zipをそのディレクトリに解凍します。

作業はAppleシリコンのMacbook Proで行います。SQLclを使用し、前提条件を一通り確認します。

mkdir -p ~/Documents/mcp-salesadb-oci
export TNS_ADMIN=~/Documents/mcp-salesadb-oci
unzip -d $TNS_ADMIN Wallet_SALESADB.zip
sql admin@salesadb_low
exit

~ % mkdir -p ~/Documents/mcp-salesadb-oci        

~ % export TNS_ADMIN=~/Documents/mcp-salesadb-oci      

~ % unzip -d $TNS_ADMIN ~/Downloads/Wallet_SALESADB.zip

Archive:  /Users/________/Downloads/Wallet_SALESADB.zip

  inflating: /Users/________/Documents/mcp-salesadb-oci/ewallet.pem  

  inflating: /Users/________/Documents/mcp-salesadb-oci/README  

  inflating: /Users/________/Documents/mcp-salesadb-oci/cwallet.sso  

  inflating: /Users/________/Documents/mcp-salesadb-oci/tnsnames.ora  

  inflating: /Users/________/Documents/mcp-salesadb-oci/truststore.jks  

  inflating: /Users/________/Documents/mcp-salesadb-oci/ojdbc.properties  

  inflating: /Users/________/Documents/mcp-salesadb-oci/sqlnet.ora  

  inflating: /Users/________/Documents/mcp-salesadb-oci/ewallet.p12  

  inflating: /Users/________/Documents/mcp-salesadb-oci/keystore.jks  

~ % sql admin@salesadb_low


SQLcl: 金 2月 13 10:42:02 2026のリリース25.4 Production


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


パスワード (**********?) ****************

Last Successful login time: 金 2月  13 2026 10:42:08 +09:00


接続先:

Oracle AI Database 26ai Enterprise Edition Release 23.26.1.1.0 - for Oracle Cloud and Engineered Systems

Version 23.26.1.1.0


SQL> exit

Oracle AI Database 26ai Enterprise Edition Release 23.26.1.1.0 - for Oracle Cloud and Engineered Systems

Version 23.26.1.1.0から切断されました

~ % 




OCI IAMの設定



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

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

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


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

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


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

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


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


ユーザー・タブを開き、グループへユーザーを割り当てます。Oracle Databaseに接続するユーザーはブラウザよりサインインします。そのため、Oracle Cloudのコンソールにサインインしているユーザーを、グループsales_dbusersに含めると確認が容易です。


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

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


ポリシーの名前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が作成されます。


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



Oracle Databaseの構成



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

export TNS_ADMIN=~/Documents/mcp-salesadb-oci
sql admin@salesadb_low

~ % export TNS_ADMIN=~/Documents/mcp-salesadb-oci

~ % sql admin@salesadb_low


SQLcl: 金 2月 13 11:10:00 2026のリリース25.4 Production


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


パスワード (**********?) ****************

Last Successful login time: 金 2月  13 2026 11:10:07 +09:00


接続先:

Oracle AI Database 26ai Enterprise Edition Release 23.26.1.1.0 - for Oracle Cloud and Engineered Systems

Version 23.26.1.1.0


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プロシージャが正常に完了しました。


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は作成されました。


SQL> alter user mcpuser quota 25m on data;


User MCPUSERが変更されました。


SQL> grant create session to mcpuser;


Grantが正常に実行されました。


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


Grantが正常に実行されました。


SQL> exit

Oracle AI Database 26ai Enterprise Edition Release 23.26.1.1.0 - for Oracle Cloud and Engineered Systems

Version 23.26.1.1.0から切断されました

~ % 


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


クライアントの構成



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

作業はmacOSで行なっているため、Homebrewを使ってoci-cliをインストールします。

brew install oci-cli

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

~ % brew install oci-cli

✔︎ JSON API formula.jws.json                                        Downloaded   32.0MB/ 32.0MB

✔︎ JSON API cask.jws.json                                           Downloaded   15.3MB/ 15.3MB

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

To reinstall 3.74.0, run:

  brew reinstall oci-cli

~ % 


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

oci iam db-token get

~/.oci/configが存在しない場合、新たに作成するかどうか聞かれます。デフォルトのYで継続します。

~ % oci iam db-token get

ERROR: Could not find config file at /Users/___________/.oci/config

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


browserを使ってログインすることで作業を継続するか?と聞かれます。デフォルトのYを選択し、ブラウザからサインインします。

リージョンを選択するとブラウザが開きます。

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

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-kulai-2, 12: ap-melbourne-1, 13: ap-mumbai-1, 14: ap-osaka-1, 15: ap-seoul-1,

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

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

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

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

36: eu-jovanovac-1, 37: eu-madrid-1, 38: eu-madrid-2, 39: eu-madrid-3, 40: eu-marseille-1,

41: eu-milan-1, 42: eu-paris-1, 43: eu-stockholm-1, 44: eu-turin-1, 45: eu-zurich-1,

46: il-jerusalem-1, 47: me-abudhabi-1, 48: me-abudhabi-2, 49: me-abudhabi-3, 50: me-abudhabi-4,

51: me-alain-1, 52: me-dcc-doha-1, 53: me-dcc-muscat-1, 54: me-dubai-1, 55: me-ibri-1,

56: me-jeddah-1, 57: me-riyadh-1, 58: mx-monterrey-1, 59: mx-queretaro-1, 60: sa-bogota-1,

61: sa-riodejaneiro-1, 62: sa-santiago-1, 63: sa-saopaulo-1, 64: sa-valparaiso-1, 65: sa-vinhedo-1,

66: uk-cardiff-1, 67: uk-gov-cardiff-1, 68: uk-gov-london-1, 69: uk-london-1, 70: us-ashburn-1,

71: us-ashburn-2, 72: us-chicago-1, 73: us-gov-ashburn-1, 74: us-gov-chicago-1, 75: us-gov-phoenix-1,

76: us-langley-1, 77: us-luke-1, 78: us-newark-1, 79: us-phoenix-1, 80: us-saltlake-2,

81: us-sanjose-1, 82: us-somerset-1, 83: us-thames-1): us-ashburn-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.us-ashburn-1.oraclecloud.com/v1/oauth2/authorize?action=login&client_id=iaas_console&response_type=token+id_token&nonce=5879cd05-d36b-4a99-99c4-a28e5c539faf&scope=openid&public_key=ey*******************************************************************************************************************************************AiSWdub3JlZCJ9&redirect_uri=http%3A%2F%2Flocalhost%3A8181


ブラウザからOracle Cloudへのサインインが完了すると、~/.oci/configが作成されます。また、データベースへの接続に使用するトークンも生成されます。

    Completed browser authentication process!

Uploaded new API key with fingerprint: c8:be:62:52:d2:74:89:6c:0f:39:82:aa:f2:68:60:c4

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

Repeat for confirmation: N/A

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


    Try out your newly registered credentials with the following example command:


    oci iam region list --config-file /Users/_________/.oci/config --profile DEFAULT


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

~ % 


$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.us-ashburn-1.oraclecloud.com))
    (connect_data=(service_name=**************_salesadb_low.adb.oraclecloud.com))
    (security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OCI_TOKEN))
)
トークンを使ってデータベースSALESADBに接続します。MCPサーバーで利用できるようにsalesadb_ociとして接続を保存します。

export TNS_ADMIN=~/Documents/mcp-salesadb-oci
sql -home $TNS_ADMIN /nolog
connect -save salesadb_oci -savepwd /@salesadb_oci

~ % export TNS_ADMIN=~/Documents/mcp-salesadb-oci

~ % sql -home $TNS_ADMIN /nolog


SQLcl: 金 2月 13 12:17:48 2026のリリース25.4 Production


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


SQL> connect -save salesadb_oci -savepwd /@salesadb_oci

名前: salesadb_oci

接続文字列: salesadb_oci

ユーザー: 

パスワード: 未保存

接続しました.

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 Cloudにサインインしたユーザーを確認できます。

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


SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')    

__________________________________________________ 

yuji***********************.jp                    


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> 


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


Claude Desktopでの確認



Claude Desktopのclaude_desktop_config.jsonへの記述は、以下になります。
{
  "mcpServers": {
    "sqlcl": {
      "command": "/Users/[ユーザー名]/sqlcl/bin/sql",
      "args": [
        "-home",
        "/Users/[ユーザー名]/Documents/mcp-salesadb-oci",
        "-R",
        "0",
        "-mcp"
      ],
      "env": {
        "TNS_ADMIN": "/Users/[ユーザー名]/Documents/mcp-salesadb-oci"
      }
    }
  },
  "preferences": {
    "coworkScheduledTasksEnabled": false,
    "sidebarMode": "chat"
  }
}

Claude Desktopから上記のMCPサーバーを呼び出して、データベースsalesadb_ociに接続します。


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

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


追記: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 % 


追記終わり