8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Autonomous AI Database × MCP がもたらすAIエージェント データ基盤の可能性

8
Last updated at Posted at 2026-02-27

こんにちは。
今回は、Oracle Autonomous AI Database (ADB) で提供されている Model Context Protocol (MCP) サーバーの構築手順と、LLM にデータベースの設計意図を正しく理解させるための「MCP サーバーへのメタデータ取得ツール実装」のサンプルについてご案内します。

さらに、AI Proxy 機能と MCP サーバーを組み合わせた最新のデータ基盤アーキテクチャの可能性についても考察します。

目次

概要

Model Context Protocol (MCP) は、AI モデルが外部のデータソースと安全に通信するための標準仕様です。
Oracle Autonomous AI Database ではこの MCP サーバー機能が組み込まれており、Claude Desktop や AI エージェントから MCP サーバーを介してデータベース内のスキーマやデータを参照し、自然言語で対話することが可能です。

本記事では、MCP クライアントから ADB に接続する手順と、LLM の回答精度を向上させる目的のツール追加方法を紹介します。

構築手順:ADB MCP サーバーの連携

ADB はすでに作成されている前提で記事を書いております。
ADB のチュートリアルについては、こちらをご参考ください。

こちらの公開情報をもとに、MCP サーバー機能の有効化作業を実施します。

0. 事前準備:ADB 側での MCP サーバー有効化

まず、対象となる Oracle Autonomous AI Database リソースで MCP サーバー機能をアクティブにする必要があります。
Oracle Cloud Infrastructure (OCI) コンソールから対象の ADB リソースの「タグ」に以下のタグを追加します。

  • タグ・ネーム (Tag Key): adb$feature
  • タグの値 (Tag Value): {"name":"mcp_server","enable":true}

image.png

このタグを保存すると、バックグラウンドで処理が実行され、当該 ADB リソースに対して MCP サーバーのエンドポイントが構成されます。

1. 事前準備:標準サンプル MCP ツールの作成

ADB の MCP サーバーの大きな特徴は、データベース内で「Select AI Agent」向けに作成・登録された Tool(機能)が、そのまま MCP サーバーのツールとして外部公開される という点にあります。

Select AI Agent とは、Autonomous AI Database 内に作成出来る自律型 AI エージェントのことです。
「Agent Team」・「Agent」・「Task」・「Tool」を DB 内に作成し、指示された作業を自律的に実行するための機能です。
詳細は、下記の記事をご参考ください。

MCP サーバーを有効化した直後はツールが何もない状態です。
Oracle の公式ドキュメントでは、LLM がデータベース内を探索するための標準的な 4 つのツール(LIST_SCHEMAS, LIST_OBJECTS, GET_OBJECT_DETAILS, EXECUTE_SQL)の PL/SQL サンプルソースが記載されています。

これらは、例えばスキーマ一覧を返す list_schemas という PL/SQL 関数を定義した上で、以下のように DBMS_CLOUD_AI_AGENT.CREATE_TOOL を使って MCP にツールとして登録する構成になっています。

-- ツール登録の例(公式ドキュメントのサンプルスクリプトを実行)
BEGIN
  -- 1. スキーマ一覧取得ツール
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name => 'LIST_SCHEMAS',
    attributes => '{"instruction":"List schemas in oracle database...","function":"list_schemas", ...}'
  );
  
  -- 2. オブジェクト一覧取得ツール
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name => 'LIST_OBJECTS',
    attributes => '{"instruction":"Returns list of database objects...","function":"list_objects", ...}'
  );

  -- 3. オブジェクト詳細取得ツール
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name => 'GET_OBJECT_DETAILS',
    attributes => '{"instruction":"Returns metadata details...","function":"get_object_details", ...}'
  );

  -- 4. 参照系SQL実行ツール
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL(
    tool_name => 'EXECUTE_SQL',
    attributes => '{"instruction":"Run given read-only SQL query...","function":"execute_sql", ...}'
  );
END;
/

事前に SQL Developer などのツール エディタから公式ドキュメント記載のPL/SQLスクリプトを実行し、これら 4 つのツールを作成します。

これらの 4 つのツールを作成しておくと、MCP クライアント側で下図のように MCP サーバーのツールとして利用出来ます。
image.png

警告
公開するツールによっては、MCP サーバーを利用する LLM が DB に保存されている機密情報を取得する可能性があります。
公開情報に記載があるツールはあくまでサンプルのため、最小限のデータしか返却しないようなツールを作成するなど考慮が必要です。

2. クライアント側の設定方針

一部の MCP クライアントでは、外部ブラウザを立ち上げる対話型 OAuth 認証(npx mcp-remote を使用するフローなど)がうまく機能せず、ポート競合などのエラーが発生する場合があります。
そのため、事前に Bearer トークンを取得し、構成ファイルに直接ヘッダーを指定する方式が最も確実です。

ただ認証に関してはユーザーの要件次第なので、要件に合わせて適宜ご選択ください。
この記事に関しましては、Bearer トークンを使った方法を記載します。

3. アクセストークンの取得

まず、ADB の OAuth トークンエンドポイントから access_token を取得します。
ターミナルから以下の curl コマンドを実行します。

# パスワード認証でBearerトークンを取得するサンプルコマンド
curl --location 'https://dataaccess.adb.[ここにリージョンを指定].oraclecloudapps.com/adb/auth/v1/databases/[ここにOCIDを指定]/token' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "grant_type":"password",
    "username":"[ここにデータベースユーザー名を指定]",
    "password":"[ここにパスワードを指定]"
  }'

警告
今回は検証のためADMINユーザを利用しましたが、本番環境では最小特権の原則に基づき、専用のデータベース・ユーザを作成することを推奨します。
その際、利用するユーザには DBMS_CLOUD_AI_AGENT パッケージへの実行権限と、対象テーブルへの権限などを適切に付与してください。

レスポンスとして返却される JSON から access_token (Bearer トークン)の文字列を控えておきます。

image.png

4. クライアント設定の追加

取得したアクセストークンを用いて、各種 AI クライアント(エージェント)に接続設定を追加します。
接続設定の方法に関しましては、下記公開情報をご参考ください。

私は、Google の Antigravity を使って確認しました。
Antigravity の場合は、".gemini\antigravity\mcp_config.json" に対して下記のように追記します。

{
  "mcpServers": {
    "adb_mcp_server": {
      "serverUrl": "https://dataaccess.adb.[ここにリージョンを指定].oraclecloudapps.com/adb/mcp/v1/databases/[ここにOCIDを指定]",
      "headers": {
        "Authorization": "Bearer [ここにアクセストークンを指定]"
      }
    }
  }
}

設定を保存し、エージェントを再起動 (もしくは MCP サーバーの情報をリロード) することで接続が完了します。

実践:AIエージェントからのデータ参照

設定完了後、AI チャット上で「データベースのスキーマ一覧を教えてください」と尋ねると、LLM が自動的に LIST_SCHEMAS ツールを使用してスキーマとテーブル構造を取得します。

image.png

さらに、「顧客マスタのデータを5件教えてください」と指示するだけで、対象テーブルから SELECT 文を生成・実行し、表形式などでデータを返答します。
これにより、自然言語のみでデータベースとシームレスに対話することが可能となります。

応用:Annotations と Comments を取得するカスタムツールの追加

Oracle の公開情報に記載があるサンプルの MCP ツール(LIST_OBJECTSGET_OBJECT_DETAILS など)でも基本構造は取得できますが、LLM に高い精度で推論させるためには、テーブルや列に設定されたメタデータを提供することが非常に重要です。

そこで、DBMS_CLOUD_AI_AGENT パッケージを使用して、これらの情報を取得するための独自のツールを ADB に追加します。

コメント取得ツール (GET_TABLE_COMMENTS)

テーブルとカラムに設定されたコメントを抽出する PL/SQL 関数の作成例です。

-- テーブルとカラムのコメントを取得する関数
CREATE OR REPLACE FUNCTION GET_TABLE_COMMENTS (
    owner_name IN VARCHAR2,
    tab_name   IN VARCHAR2
) RETURN CLOB AS
    l_sql    CLOB;
    l_result CLOB;
BEGIN
    l_sql := 'SELECT JSON_ARRAY( '
             || '  JSON_OBJECT(''section'' VALUE ''TABLE_COMMENT'', ''data'' VALUE ( '
             || '    SELECT JSON_ARRAYAGG(JSON_OBJECT(*) RETURNING CLOB) '
             || '    FROM (SELECT TABLE_NAME, COMMENTS FROM ALL_TAB_COMMENTS WHERE OWNER = :schema AND TABLE_NAME = :tab AND COMMENTS IS NOT NULL) '
             || '  )), '
             || '  JSON_OBJECT(''section'' VALUE ''COLUMN_COMMENTS'', ''data'' VALUE ( '
             || '    SELECT JSON_ARRAYAGG(JSON_OBJECT(*) RETURNING CLOB) '
             || '    FROM (SELECT COLUMN_NAME, COMMENTS FROM ALL_COL_COMMENTS WHERE OWNER = :schema AND TABLE_NAME = :tab AND COMMENTS IS NOT NULL) '
             || '  )) '
             || 'RETURNING CLOB) FROM DUAL';

    EXECUTE IMMEDIATE l_sql
    INTO l_result
        USING owner_name, tab_name,  
              owner_name, tab_name;  
              
    RETURN l_result;
END;
/

-- 作成した関数 (GET_TABLE_COMMENTS) を、MCP ツールとして登録
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL (
    tool_name  => 'GET_TABLE_COMMENTS',
    attributes => '{"instruction": "Returns table and column comments. Use this to understand business meanings.",
       "function": "GET_TABLE_COMMENTS",
       "tool_inputs": [{"name":"owner_name","description" : "Schema name"},
                       {"name":"tab_name","description"   : "Table name"}
                      ]}'
  );
END;
/

アノテーション取得ツール (GET_ANNOTATIONS)

Oracle AI Database 26ai 向けの ALL_ANNOTATIONS_USAGE を対象とした抽出ツールです。

Annotations は最近追加された概念なので、もし興味があれば弊社公開 Blog をご参考ください。

-- テーブルや列に設定した Annotations を取得する関数
CREATE OR REPLACE FUNCTION GET_ANNOTATIONS (
    owner_name IN VARCHAR2,
    obj_name   IN VARCHAR2
) RETURN CLOB AS
    l_sql    CLOB;
    l_result CLOB;
BEGIN
    l_sql := 'SELECT NVL(JSON_ARRAYAGG(JSON_OBJECT(*) RETURNING CLOB), ''[]'') AS json_output '
             || 'FROM ( '
             || '  SELECT OBJECT_TYPE, OBJECT_NAME, COLUMN_NAME, ANNOTATION_NAME, ANNOTATION_VALUE '
             || '  FROM ALL_ANNOTATIONS_USAGE '
             || '  WHERE ANNOTATION_OWNER = :schema AND OBJECT_NAME = :obj '
             || ')';

    EXECUTE IMMEDIATE l_sql
    INTO l_result
        USING owner_name, obj_name;
              
    RETURN l_result;
END;
/

-- 作成した関数 (GET_ANNOTATIONS) を、MCP ツールとして登録
BEGIN
  DBMS_CLOUD_AI_AGENT.CREATE_TOOL (
    tool_name  => 'GET_ANNOTATIONS',
    attributes => '{"instruction": "Returns Oracle Database 26ai Annotations. Use to discover metadata tags.",
       "function": "GET_ANNOTATIONS",
       "tool_inputs": [{"name":"owner_name","description" : "Schema name"},
                       {"name":"obj_name","description"   : "Table name"}
                      ]}'
  );
END;
/

これらのツールを追加することで、LLM はデータベースの物理的な構造だけでなく、「このデータは業務上どのような意味を持つか」というメタデータの文脈を把握し、より高度な回答生成が期待出来ます。
image.png

実際に動かしてみる

予めテスト用のデータを ADB に保存しておき、検証してみます。

検証用のテーブルや列には、予めコメントを設定しておきます。
テスト用のデータとして、電力に関するデータを格納しております。

下記のように質問してみます。

データベースに保存されているデータを調べてほしいです。
電力の消費量が多い地域の TOP 5 を教えてください。また、広島県福山市の契約プランの割合をおしえてください。

すると、ADB MCP サーバーで公開されているツールを LLM が利用し、調査を実施する様子が確認できました。

image.png

期待どおり、Comments 一覧を取得するツール (GET_TABLE_COMMENTS) も利用しています。

image.png

最終的に、データベースに保存されている情報をもとに回答を生成しました。

image.png

最後に:MCP がもたらす「次世代データハブ」の可能性

Oracle Autonomous AI Database を単なる「データを保存する箱」だと思っているなら、それは非常にもったいないことです。
現在の ADB は、AI Proxy Database (Sidecar とも呼んでいます) という考えがあります。

image.png

Oracle の公式ドキュメントにある通り、AI Proxy とは「ADB 自身にデータをコピー・格納していなくても、AWS S3上のデータレイク、Snowflake、Databricks、Salesforce といった多様な外部データソースに対して、一元的に自然言語検索(NL2SQL)をフェデレーション実行できるハブ機能」です。

内部的には Database Link を使って外部のリレーショナル データベースを参照したり、外部表の機能を使って AWS S3 上の BLOB ファイルや Azure ストレージ アカウント上の BLOB ファイルなどを参照したりしています。
ADB へのデータの移動は発生しないので、リアルタイムなデータの参照が可能。

本来、LLM が外部の多様なデータベースを横断検索しようとすると、各データソースの構造や方言をすべて LLM に理解させる複雑な実装が必要になります。
しかし、ADB を AI Proxy(ハブ)として中央に据え、さらに本記事で紹介した MCP サーバー機能 を組み合わせるとどうなるでしょうか。

  1. データ移動ゼロ: AI エージェントは、ADB という単一の MCP エンドポイントと会話するだけで済みます。
  2. 圧倒的な推論精度: ADB 内に設定された高度なアノテーションとビジネス・コメントが MCP 経由で LLM に提示されるため、LLM は迷うことなく正確な横断 SQL を生成できます。

Oracle だからこそ実現できる「リアルタイムOLTP」の強み

近年、Snowflake(Unistore)や Databricks(Lakebase)もトランザクション処理(HTAP)の領域に踏み込んできていますが、基幹システムなどで何十年にもわたり磨き上げられてきた Oracle の OLTP(Online Transaction Processing)の実績は、依然として強みです。

AIエージェントにとって データ鮮度はそのまま「判断の速さと正確さ」 に直結します。
バッチ処理で数時間遅れの分析データを見るのではなく、「今まさに発生した顧客の決済エラー」や「秒単位で変動する在庫」といった超リアルタイムなトランザクションデータの源泉(Oracle)に AI エージェントを立たせることができるのは、Oracle だからこそ実現できるビジネス要件の強みです。

MCP サーバーの機能を実装した Autonomous AI Database を AI のデータハブとして配置することで、「企業内のあらゆるサイロ化されたデータソースを、安全かつシームレスに AI が参照出来る究極の知能ハブ」 が完成します。

このように、Oracle Autonomous AI Database のリアルタイム性と、MCP サーバー機能・AI Proxy の組み合わせは、データから即座にアクションを生み出すAIエージェントにとって計り知れない価値を提供してくれます。
ぜひ皆様のプロジェクトでもこの強力な機能を試してみてください。

Appendix

Autonomous AI Database は、各クラウド ベンダーでもご利用可能です。

こちらもあわせてご参考ください。

8
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?