2025年8月14日木曜日

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

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

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

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

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

Using Oracle Autonomous AI Database Serverless
Use Microsoft Entra ID with Autonomous AI Database

実際の構成作業はEntra ID、データベース・サーバー、クライアントの順番で行いますが、このドキュメントの順番は異なるため、このドキュメントだけで作業を進めるのは難しいように思います。

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

Oracle Database Security Guide, Release 26

特にオンプレミスでの実装では、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 AI Databaseの作成



Oracle Cloudのコンソールより、Always FreeのAutonomous AI Databaseを作成します。

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

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


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


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

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


SQLclのMCPサーバーの構成については、以下の記事で紹介しています。

Claude DesktopにSQLclのMCPサーバーを組み込む

この記事の手順にそって、TNS_ADMINとして設定するディレクトリを~/Documents/mcp-salesadb-entraidとして作成し、その下にウォレットを解凍します。

環境変数TNS_ADMINを設定し、作成したAutonomous AI Database - SALESADBに管理者ユーザーADMINで接続します。接続にはSQLclを使用します。

export TNS_ADMIN=~/Documents/mcp-salesadb-entraid
sql -home $TNS_ADMIN admin@salesadb_low

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

~ % sql -home $TNS_ADMIN admin@salesadb_low          


SQLcl: 火 2月 10 14:46:06 2026のリリース25.4 Production


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


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

Last Successful login time: 火 2月  10 2026 14:46:18 +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から切断されました

~ %


以上で、これからの作業に使用する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"の下に属性requestedAccessTokenVersionがあります。この値をに変更します。

"requestedAccessTokenVersion": 2,

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' value 'ディレクトリ(テナント)ID',
            'application_id' value 'アプリケーション(クライアント)ID',
            'application_id_uri' value 'アプリケーションIDのURL'
        ),
        force => true
    );
end;
/

~ % sql -home $TNS_ADMIN admin@salesadb_low


SQLcl: 火 2月 10 15:04:59 2026のリリース25.4 Production


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


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

Last Successful login time: 火 2月  10 2026 15:05:10 +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> begin

  2      dbms_cloud_admin.enable_external_authentication(

  3          type => 'AZURE_AD',

  4          params => json_object(

  5              'tenant_id' value '3940****-****-****-****-********2758',

  6              'application_id' value '70ec****-****-****-****-********2b4a',

  7              'application_id_uri' value 'api://70ec****-****-****-****-********2b4a'

  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> 


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 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の構成は完了です。


接続情報の更新



接続文字列が記載されている$TNS_ADMIN/tnsnames.oraを開き、トークンで認証するTNS名salesadb_tokenを追加します。salesadb_lowに以下の設定を加えます。

(TOKEN_AUTH=OAUTH)(TOKEN_LOCATION=/Users/[ユーザー名]/Documents/mcp-salesadb-entraid/token.txt)
salesadb_token = (
    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=OAUTH)
        (TOKEN_LOCATION=/Users/___________/Documents/mcp-salesadb-entraid/token.txt))
)
Entra IDにログインします。OAuth2の認証トークンを生成し、ファイル/Users/[ユーザー名]/Documents/mcp-salesadb-entraid/token.txtに書き込みます。

az loginコマンドを実行します。

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

~ % az login --tenant "3940****-****-****-****-********2758" --scope "api://70ec****-****-****-****-********2b4a/session:scope:connect"                                                 

A web browser has been opened at https://login.microsoftonline.com/3940****-****-****-****-********2758/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.



ブラウザが開き、Entra IDへのサインインを求められます。

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

次へ進みます。


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


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


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


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


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


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


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

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

~ % az login --tenant "3940****-****-****-****-********2758" --scope "api://70ec****-****-****-****-********2b4a/session:scope:connect"

A web browser has been opened at https://login.microsoftonline.com/3940****-****-****-****-********2758/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.


Retrieving subscriptions for the selection...


[Tenant and subscription selection]


No     Subscription name     Subscription ID                       Tenant

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

[1] *  Azure subscription 1  7ada****-****-****-****-********7b71  3940****-****-****-****-********2758


The default is marked with an *; the default tenant is '3940****-****-****-****-********2758' and subscription is 'Azure subscription 1' (7ada****-****-****-****-********7b71).


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


Tenant: 3940****-****-****-****-********2758

Subscription: Azure subscription 1 (7ada****-****-****-****-********7b71)


[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.


~ % 


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

アクセストークンを取得します。az account get-access-tokenを実行します。取得したトークンは、tnsnames.oraにTOKEN_LOCATIONとして指定している/Uses/[ユーザー名
]/Documents/mcp-salesadb-entraid/token.txtに出力します。

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

~ % az account get-access-token --scope "api://70ec****-****-****-****-********2b4a/session:scope:connect" --query accessToken -o tsv > ~/Documents/mcp-salesadb-entraid/token.txt

~ %


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


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

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

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


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

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

~ % sql -home $TNS_ADMIN /nolog

SQLcl: 木 2月 12 11:10:08 2026のリリース25.4 Production


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


SQL> connect -save salesadb -savepwd /@salesadb_token

名前: salesadb

接続文字列: salesadb_token

ユーザー: 

パスワード: 未保存

接続しました.

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サーバーをClaude Desktopに追加する記述です。
{
  "mcpServers": {
    "sqlcl": {
      "command": "/Users/[ユーザー名]/sqlcl/bin/sql",
      "args": [
        "-home",
        "/Users/[ユーザー名]/Documents/mcp-salesadb-entraid",
        "-R",
        "0",
        "-mcp"
      ],
      "env": {
        "TNS_ADMIN": "/Users/[ユーザー名]/Documents/mcp-salesadb-entraid"
      }
    }
  },
  "preferences": {
    "coworkScheduledTasksEnabled": false,
    "sidebarMode": "chat"
  }
}
このMCPサーバーを設定して、Claude DesktopからAutonomous AI Databaseに問い合わせてみました。


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

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