2025年8月14日木曜日

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

SQLclが提供しているMCPサーバーがデータベースに接続する際に、Microsoft Entra IDに登録しているユーザーで認証します。ユーザー認証にはOAuth2.0のアクセストークンを使用します。

本記事ではMCPサーバーの接続先となるデータベースにAlways FreeのAutonomous Databaseを使用します。Microsoft Entra IDが発行するトークンを使うユーザー認証では、データベースのクライアントとサーバー間がTransport Layer Security(TLS)で暗号化されていることが必須です。Autonomous DatabaseではTLSによる暗号化は構成済みです。

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

Using Oracle Autonomous Database Serverless
Use Microsoft Entra ID with Autonomous Database日本語

公式な日本語ドキュメントといっても機械翻訳なので、英語のドキュメントをブラウザで翻訳するのと変わらない印象です。実際の構成作業はEntra ID、データベース・サーバー、クライアントの順番で行いますが、このドキュメントの順番は異なるため、このドキュメントだけで作業を進めるのは難しいように思います。

接続先のデータベースがAutonomous Databaseではない場合は、以下のドキュメントを参照します。

Oracle Database Security Guide, Release 23

特にオンプレミスでの実装では、TLSの構成を含む以下のドキュメントも参考になるでしょう。
Authenticate Oracle Database 23ai with Microsoft Entra ID

この他に参照した資料は以下です。

Albert Balbekovさんの以下より始まる一連の記事:
Azure AD (Entra ID) Tokens: 1. Entra ID App Registrations
およびMediumの以下の記事:

実際は上記のドキュメントを読み込んで作業を進めたというよりは、ほとんどChatGPTやClaudeに聞いて作業を進めています。本当に色々と教えてくれます。

以下より、表題の件の実装について記述します。


Autonomous Databaseの作成



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

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

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


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


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

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


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

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


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


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

このウォレットを使用して、作成したAutonomous Databaseに管理者ユーザーADMINで接続します。接続にはSQLclを使用します。

sql -cloudconfig Wallet_SALESADB.zip admin@salesadb_low

% sql -cloudconfig Wallet_SALESADB.zip admin@salesadb_low



SQLcl: 水 8月 13 11:58:23 2025のリリース25.2 Production


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


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

Last Successful login time: 水 8月  13 2025 11:58:31 +09:00


接続先:

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

Version 23.9.0.25.08


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から切断されました

% 


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


Microsoft Entra IDの設定



Microsoft Entra IDの設定を行います。

Entra IDでは、接続先となるデータベースをアプリケーションとして作成します。

AzureのコンソールのMicrosoft Entra IDのページよりアプリの登録を開き、新規作成を実行します。


名前SALESADBとします。サポートされているアカウントの種類に、この組織ディレクトリのみに含まれるアカウント(規程のディレクトリのみ - シングルテナント)を選択します。

Entra IDに登録されたユーザーでユーザー認証ができる最低限の設定を行なっています。

リダイレクトURIは省略します。

以上でアプリケーションSALESADBを登録します。


アプリケーションSALESADBが作成されます。

APIの公開を開きます。

アプリケーションIDのURI追加します。追加のリンクをクリックします。


アプリケーションIDのURIとしてデフォルト値のapi://アプリケーションIDが表示されます。

本記事ではEntra ID v2アクセストークンを生成するように構成するため、アプリケーションIDのURIデフォルトのまま設定します。

保存をクリックします。


アプリケーションID URIが追加されます。

続けてScopeの追加を実施します。


スコープ名session:scope:connectとしています。スコープ名は自由に設定できます。

同意できるのはだれですか?として管理者とユーザーを選択します。

管理者の同意の表示名管理者の同意の説明ユーザーの同意の表示名ユーザーの同意の説明には、Connect to SALESADBを入力します。

状態を有効にして、スコープの追加をクリックします。


以上でアプリの公開に、アプリケーションID URLスコープが登録できました。


アプリロールを開き、アプリロールの作成をクリックします。

この作業で作成するアプリロールを、Oracle Databaseのデータベース・ユーザーにAZURE_ROLEとして割り当てることにより、Entra IDでユーザー認証ができるようになります。(この他にAZURE_USERをデータベース・ユーザーに割り当てる方法もあります)。


表示名User Role for MCPとします。この名前はEntra ID側の操作で使用されます。許可されたメンバーの種類両方(ユーザー/グループ+アプリケーション)を選択します。

MCPUSER_ROLEを設定します。Oracle DatabaseがAZURE_ROLEとして認識するのは、このMCPUSER_ROLEです。

説明User Role for MCPこのアプリロールを有効にしますか?チェックを入れます。

以上で適用をクリックします。


アプリロールMCPUSER_ROLEが作成されます。


アプリケーションSALESADBにEntra IDのユーザーを割り当てます。割り当てるユーザーに、作成したアプリロールMCPUSER_ROLEを割り当てます。

ユーザーの割り当ては、エンタープライズアプリケーションに移動して実施します。


ユーザーとグループの割り当てを開きます。


ユーザーまたはグループの追加をクリックします。


ユーザーの選択されていませんをクリックし、割り当てるユーザーを選択します。


割り当てるユーザーを選択し、選択をクリックします。


割り当てをクリックします。


エンタープライズアプリケーションSALESADBに、アプリロールMCPUSER_ROLEを持つユーザーが割り当てられました。

ここで割り当てられたユーザーで、データベース接続のユーザー認証が行われます。


Entra IDのトップページに戻り、アプリの登録を開きます。

すべてのアプリケーションを表示し、その中のSALESADBを開きます。


APIのアクセス許可を開き、アクセス許可の追加をクリックします。


所属する組織で使用しているAPIを開き、SALESADBを探して選択します。


アプリケーションの許可を選択します。

選択できるアクセス許可としてアプリロールMCPUSER_ROLEが表示されます。このMCPUSER_ROLEをチェックして、アクセス許可の追加をクリックします。


以上でアプリケーションSALESADBによって、アプリロールMCPUSER_ROLEへのアクセスを許可できるようになりました。


アクセス許可の追加を再度クリックし、先ほどと同様に所属する組織で使用しているAPIを開き、SALESADBを選択します。

今度はアプリケーションに必要なアクセス許可の種類委任されたアクセス許可を選択します。アクセス許可として表示されたsession:scope:connectをチェックして、アクセス許可の追加を実行します。


以上でアクセス許可の設定ができました。


Entra IDのアクセストークンをデフォルトのv1からv2に変更します。

マニュフェストを開きます。


マニュフェストaccessTokenAcceptedVersionの設定を追加します。

Microsoft Graphアプリマニュフェストであれば"api"の下、AAD Graph アプリマニュフェストであれば、トップレベルに属性"accessTokenAcceptedVersion"があります。

この値をに変更します。もし無い場合は属性を追加します。

"accessTokenAcceptedVersion": 2,

追加後、保存します。


Entra ID v2アクセストークンでは、ユーザーの識別子となるclaimとしてupnを使用します。

トークン構成を開き、オプションの要求の追加をクリックします。


トークンの種類アクセスを選択し、要求に含まれるupnをチェックします。これはOAuth2.0のアクセストークンにclaimとしてupnを追加する、という作業です。

以上で追加をクリックします。


Microsoft Graph profileのアクセス許可を有効にしますチェックして、追加します。


必ずしも必要ではないようですが、念の為同様の操作を行い、IDトークンについてもclaimとしてupn追加します。


以上でIDトークンとアクセストークンの両方に属性としてupnが含まれるようになりました。

属性upnに設定される値を調整します。要求upnの3点メニューをクリックし、編集を実行します。


UPNの編集画面で、外部認証済みはいハッシュ記号の置換はいに設定します。

以上で保存します。


同じ作業をIDトークンとアクセストークンの両方で実施します。


以上でMicrosoft Entra IDでの作業は完了です。


Oracle Databaseの構成



Entra IDのアプリケーションSALESADB概要より、アプリケーション(クライアント)ID,ディレクトリ(テナント)IDアプリケーションIDのURLの3つの値をコピーして保存します。


Autonomous DatabaseのSALESADBに管理者ユーザーADMINで接続し、DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONを実行します。
begin
    dbms_cloud_admin.enable_external_authentication(
        type => 'AZURE_AD',
        params => json_object(
            'tenant_id' valiue 'ディレクトリ(テナント)ID',
            'application_id' value 'アプリケーション(クライアント)ID',
            'application_id_uri' value 'アプリケーションIDのURL'
        ),
        force => true
    );
end;
/

% sql -cloudconfig Wallet_SALESADB.zip admin@salesadb_low



SQLcl: 水 8月 13 15:07:21 2025のリリース25.2 Production


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


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

Last Successful login time: 水 8月  13 2025 15:07:27 +09:00


接続先:

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

Version 23.9.0.25.08


SQL> begin

  2      dbms_cloud_admin.enable_external_authentication(

  3          type => 'AZURE_AD',

  4          params => json_object(

  5              'tenant_id' value '3940511e-****-****-****-01b080952758',

  6              'application_id' value '18f462e6-****-****-****-81bc4c70bf64',

  7              'application_id_uri' value 'api://18f462e6-****-****-****-81bc4c70bf64'

  8          ),

  9          force => true

 10      );

 11  end;

 12* /


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    AZURE_AD    


SQL> 


Entra IDで作成したアプリロールMCPUSER_ROLEをマップしたデータベース・ユーザーとしてMCPUSERを作成します。

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

SQL> create user mcpuser identified globally as 'AZURE_ROLE=MCPUSER_ROLE';


User MCPUSERは作成されました。


SQL> alter user mcpuser quota 25m on data ;


User MCPUSERが変更されました。


QL> grant create table, create view, create sequence, create synonym to mcpuser;


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


SQL> grant create session to mcpuser;


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


SQL> 


外部から接続できるように、データベース・ユーザーMCPUSERREST有効にします。
begin
    ords_admin.enable_schema(
        p_enabled => true,
        p_schema  => 'MCPUSER',
        p_url_mapping_type => 'BASE_PATH',
        p_url_mapping_pattern => 'mcpuser',
        p_auto_rest_auth => false
    );
end;
/

SQL> begin

  2      ords_admin.enable_schema(

  3          p_enabled => true,

  4          p_schema  => 'MCPUSER',

  5          p_url_mapping_type => 'BASE_PATH',

  6          p_url_mapping_pattern => 'mcpuser',

  7          p_auto_rest_auth => false

  8      );

  9  end;

 10* /


PL/SQLプロシージャが正常に完了しました。


SQL>


Entra IDのアクセストークンを受け付けるユーザーMCPUSERは、トークンを検証するために以下のURLにアクセスする必要があります。

https://login.windows.net/common/discovery/keys

そのため、データベース・ユーザーMCPUSERにネットワークACLを追加します。
begin
    dbms_network_acl_admin.append_host_ace(
        host => '*',
        ace => xs$ace_type(
            privilege_list => xs$name_list('connect'),
            principal_name => 'MCPUSER',
            principal_type => xs_acl.ptype_db
        )
    );
end;
/

SQL> begin

  2      dbms_network_acl_admin.append_host_ace(

  3          host => '*',

  4          ace => xs$ace_type(

  5              privilege_list => xs$name_list('connect'),

  6              principal_name => 'MCPUSER',

  7              principal_type => xs_acl.ptype_db

  8          )

  9      );

 10  end;

 11* /


PL/SQLプロシージャが正常に完了しました。


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から切断されました

% 


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


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



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


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

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

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

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

% 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   9.7M      0  0:00:08  0:00:08 --:--:-- 9765k

% podman build -f Dockerfile -t sqlcl-mcp-az

STEP 1/11: FROM oraclelinux:9

STEP 2/11: RUN dnf update -y &&     dnf install -y sudo passwd unzip ncurses java-21-openjdk-headless &&     rpm --import https://packages.microsoft.com/keys/microsoft.asc &&     dnf install -y https://packages.microsoft.com/config/rhel/9.0/packages-microsoft-prod.rpm &&     dnf install -y azure-cli &&     dnf clean all

Oracle Linux 9 BaseOS Latest (aarch64)          9.4 MB/s |  91 MB     00:09    

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

Last metadata expiration check: 0:00:06 ago on Thu Aug 14 08:30:56 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


[中略]


  inflating: /opt/oracle/sqlcl/lib/antlr-runtime.jar  

  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  

--> 3a923251c0a0

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

COMMIT sqlcl-mcp-az

--> 00832d5028d3

Successfully tagged localhost/sqlcl-mcp-az:latest

00832d5028d3ee88a07c8ff16429b86c4602ccbb9d73f011cee0e5ca9567ed35

% 


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

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

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

podman volume create mcp-az-conf

% podman volume create mcp-az-conf

mcp-az-conf

% 


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

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

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

プラットフォームがARMの場合、以下のような警告が表示されることがあります。

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.

警告を回避するには-e JAVA_TOOL_OPTIONS="-XX:UseSVE=0"の指定を追加します。

podman run --rm --name mcp-az -e JAVA_TOOL_OPTIONS="-XX:UseSVE=0" -v mcp-az-conf:/home/oracle -v $PWD:/opt/oracle/wallets sqlcl-mcp-az:latest

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

% podman run --rm --name mcp-az -v mcp-az-conf:/home/oracle -v $PWD:/opt/oracle/wallets sqlcl-mcp-az: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 Thu Aug 14 08:37:47 UTC 2025

Press Ctrl+C to stop the server

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



実行中のコンテナmcp-azに接続し、Entra IDを使って認証するための構成を行います。

podman exec -it mcp-az bash

% podman exec -it mcp-az bash

[oracle@5e225a402c67 ~]$ 


tnsnames.oraの編集が必要なため、Wallet_SALESADB.zipを展開します。
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@5e225a402c67 ~]$ cd

[oracle@5e225a402c67 ~]$ 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@5e225a402c67 ~]$ 


/home/oracle/tns_admin/tnsnames.oraを開き、それぞれのTNS名に含まれる(ssl_server_dn_match=yes)の後に以下の指定を追加します。

(TOKEN_AUTH=OAUTH)(TOKEN_LOCATION=/home/oracle/token.txt)

更新後のtnsnames.oraは以下のようになります。
salesadb_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ca-toronto-1.oraclecloud.com))(connect_data=(service_name=ge15xxxxxxxx7f_salesadb_high.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OAUTH)(TOKEN_LOCATION=/home/oracle/token.txt)))

salesadb_low = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ca-toronto-1.oraclecloud.com))(connect_data=(service_name=ge15xxxxxxxx7f_salesadb_low.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OAUTH)(TOKEN_LOCATION=/home/oracle/token.txt)))

salesadb_medium = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ca-toronto-1.oraclecloud.com))(connect_data=(service_name=ge15xxxxxxxx7f_salesadb_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OAUTH)(TOKEN_LOCATION=/home/oracle/token.txt)))

これからデータベースに接続します。

最初にEntra IDにログインします。az loginコマンドを実行します。

az login --tenant "テナントID" --scope "api://アプリケーションIDのURI/session:scope:connect"

[oracle@5e225a402c67 ~]$ az login --tenant "3940511e-****-****-****-01b080952758" --scope "api://bf8221de-****-****-****-220e08ef7cf7/session:scope:connect"

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code NTUMDPZ8P to authenticate.



サインインするためにブラウザでhttps://microsoft.com/deviceloginを開いて、与えられたコードを入力します。

次へ進みます。


サインインするアカウントを入力します。すでにサインインした履歴がある場合は、アカウントの選択を求められます。

次へ進みます。


MFAの構成などにより、ユーザー認証の手続きは異なります。以下はMicrosoft Authenticatorを使用した認証です。


Authenticatorアプリの確認を求められます。


許可されたアプリの許可を求められます。次へをクリックします。


同様の確認を求められるので、(内容を理解したうえで)承諾します。


続行をクリックし、サインインを完了します。


以上でサインインが完了します。


az loginを実行している画面でAzureのサブスクリプションの選択を求められます。サブスクリプションが1つだけだったので、Enterを入力しました。

Select a subscription and tenant (Type a number or Enter for no changes):

[oracle@5e225a402c67 ~]$ az login --tenant "3940511e-****-****-****-01b080952758" --scope "api://bf8221de-****-****-****-220e08ef7cf7/session:scope:connect"

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code NTUMDPZ8P to authenticate.


Retrieving subscriptions for the selection...


[Tenant and subscription selection]


No     Subscription name     Subscription ID                       Tenant

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

[1] *  Azure subscription 1  7adac3cb-****-****-****-2db0b2827b71  3940511e-****-****-****-01b080952758


The default is marked with an *; the default tenant is '3940511e-****-****-****-01b080952758' and subscription is 'Azure subscription 1' (7adac3cb-****-****-****-2db0b2827b71).


Select a subscription and tenant (Type a number or Enter for no changes): 


Tenant: 3940511e-****-****-****-01b080952758

Subscription: Azure subscription 1 (7adac3cb-****-****-****-2db0b2827b71)


[Announcements]

With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236


If you encounter any problem, please open an issue at https://aka.ms/azclibug


[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.


[oracle@5e225a402c67 ~]$ 


以上で、Entra IDにサインインしてIDトークンが取得できました。

アクセストークンを取得します。az account get-access-tokenを実行します。取得したトークンはtnsnames.oraにTOKEN_LOCATIONとして指定している/home/oracle/token.txtにファイルととして出力します。

az account get-access-token --scope "api://アプリケーションID URL/session:scope:connect" --query accessToken -o tsv > /home/oracle/token.txt

[oracle@5e225a402c67 ~]$ az account get-access-token --scope "api://bf8221de-****-****-****-220e08ef7cf7/session:scope:connect" --query accessToken -o tsv > /home/oracle/token.txt

[oracle@5e225a402c67 ~]$ 


/home/oracle/token.txtにはアクセストークンが出力されています。https://jwt.ioに貼り付けて、内容を確認できます。


アクセストークンが取得できたので、データベースに接続します。

SQLclを起動し、Autonomous Database SALESADBに接続します。また、接続をMCPサーバーで参照できるように、salesadbと名前をつけて保存します。

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


ユーザー名、パスワードの指定なしでデータベースに接続されます。

[oracle@5e225a402c67 ~]$ /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 Thu Aug 14 08:58:47 2025


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


SQL> connect -save salesadb -savepwd /@salesadb_low

Name: salesadb

Connect String: salesadb_low

User: 

Password: not saved

Connected.

SQL> 


接続されたユーザーを確認します。以下のSELECT文を実行します。
select
    sys_context('userenv','session_user') as session_user,
    sys_context('userenv','current_user') as current_user,
    sys_context('userenv','authenticated_identity') as azure_user
from dual;

SQL> select

  2      sys_context('userenv','session_user') as session_user,

  3      sys_context('userenv','current_user') as current_user,

  4      sys_context('userenv','authenticated_identity') as azure_user

  5* from dual;


SESSION_USER    CURRENT_USER    AZURE_USER                                                    

_______________ _______________ _____________________________________________________________ 

MCPUSER         MCPUSER         yuji.n****_outlook.com_EXT_@*******soutlook.onmicrosoft.com    


SQL> 


データベース・ユーザーMCPUSERとして接続されています。Entra IDで認証されたユーザーは、システム・コンテキストのUSERENVAUTHENTICATED_IDENTITYとして設定されています。

仮想プライベート・データベースやReal Application Securityといった、接続ユーザーによるアクセス制御は、AUTHENTICATED_IDENTITYを元に設定することになります。

以上でMCPサーバーの準備は完了です。

起動中のMCPサーバーを停止します。

podman stop mcp-az

% podman stop mcp-az

mcp-az

% 


このMCPサーバーをClaude Desktopに追加する記述です。
{
  "mcpServers": {
    "sqlcl": {
      "command": "podman",
      "args": [
        "run",
        "-i",
        "--rm",
        "-v",
        "mcp-az-conf:/home/oracle",
        "localhost/sqlcl-mcp-az:latest"
      ]
    }
  }
}
このMCPサーバーを設定して、Claude DesktopからAutonomous Databaseに問い合わせてみました。


改善点は多々ありますが、SQLclのMCPサーバーからデータベースに接続するにあたって、Microsoft Entra IDに登録されている個人として認証することができました。

今回の記事はMCPサーバーをコンテナで動かしていることもあり、トークン認証にOAUTH(TNS名にTOKEN_AUTH=OAUTHを設定)を使用しています。MCPホストであるClaude Desktopなどを実行しているホストでMCPサーバーを実行する場合は、トークン認証にAZURE_INTERACTIVE(TNS名にTOKEN_AUTH= AZURE_INTERACTIVEを設定)を使用できるかもしれません。

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