0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「いま重い SQL を 3 件教えて」を OCI Database Tools MCP Server に聞いてみた

0
Posted at

1. はじめに

シリーズの位置づけ

いま重い SQL を 3 件教えて」── Oracle のパフォーマンス分析の入り口にあたる問いです。

このフレーズを Oracle 公式が提供する NL2SQL / MCP 系の各サービス に投げて答えてもらう、という遊びをしばらく続けてきました。

経路 過去記事
SELECT AI Oracle ADB に「重い SQL 教えて」と聞く 2 つの方法 ─ SELECT AI と MCP サーバを同一ユースケースで比較してみた
ADB 26ai 組み込み MCP Oracle Autonomous AI Database の MCPサーバを Claude Desktop につないで「いま重いSQL」を聞けるようにしてみた
SQLcl MCP Server Claude Code が DBA になる ― oracle/skills × SQLcl MCP で Oracle 26ai を自律診断してみた
OCI Database Tools MCP Server(セットアップ編 OCI Database Tools MCP Server を Claude Desktop につないでみた

本記事は最後の OCI Database Tools MCP Server の続編(実用編)です。前回はセットアップして組込み schema_information ツールが動いたところまで。今回は「任意の SELECT を実行できるツールを追加して、本当に『いま重い SQL を 3 件教えて』に答えさせる」のがゴールです。

結論先出し

  • 「いま重い SQL を 3 件教えて」に Claude Desktop 経由で OCI Database Tools MCP Server が回答できた
  • 前回予告した Custom SQL Tool より、もう 1 つの選択肢 「カスタマイズ可能なレポート・ツール(Reporting Tool)」 のほうが LLM 時代向けに作り込まれた設計だった
  • Reporting Tool には Custom SQL Tool には無い LLM 向けのメタ情報(説明・目的・命令・列)と 接続非依存な SQL レポート資産設計があった
  • Oracle 公式チュートリアルは Custom SQL Tool しか扱っておらず、Reporting Tool は公式 Docs 側でのみ解説されている隠れキャラ
  • 役割分離は強力: report_sql(裏 SQL を見るツール)は MCP_User に対して 「403 で拒否」ではなく「ツール一覧に公開しない」 という最小露出設計が実装されていることを実測で確認

検証ゴール

# 検証項目 達成判定
1 SQL レポート(独立サービス)と Reporting Tool 型ツールセットを作成し、Claude Desktop から呼び出せるか ツール一覧に report_list / report_execute が増え、呼出成功
2 「いま重い SQL を 3 件教えて」に Claude が自律的に正しいツール選択・パラメータ組み立てで応答できるか ツール名を一切指定しない自然言語プロンプトで TOP 3 SQL が返る

2. 前回のおさらい: 3 ツールタイプの整理

OCI Database Tools MCP Server には 3 種類のツールセットタイプがあります。

タイプ 公式説明 想定用途 公式チュートリアルでの扱い
①組込み SQL ツール アドホック SQL / PL/SQL スクリプトの実行 LLM が自由に SQL を組み立てる(schema_information 等) 言及のみ
②カスタム SQL ツール ユーザー定義のパラメータ化された SQL/PL/SQL を実行 「1 SQL = 1 ツール」で公開、PL/SQL や DML も可 詳細に解説チュートリアル
③カスタマイズ可能なレポート・ツール 事前作成済のパラメータ駆動型 SQL レポートを検索・実行 承認済み読み取り SQL を LLM に動的公開 未収録公式 Docs 側でのみ

前回記事では「組込み SQL ツール」の schema_information まで確認済み。本記事の本題は 3 つ目のタイプです。

実機ではこんな選択画面になっています:

image.png


3. 検証環境

項目 内容
OCI リージョン ap-tokyo-1
ADB Oracle AI Database 26ai Enterprise Edition 23.26.2.1.0
DB ユーザー DBA_COPILOT(前回記事から流用)
MCP Server dbtools-mcp-server(前回記事の Phase 2 で作成)
Application Role MCP_User(自分のユーザに付与済み)
OS Windows 11 Pro
Node.js v18+(npx mcp-remote 経由)

4. SQL レポート(独立サービス)の作成

ここから本題です。

4.1. SQL レポートは「MCP の外」にある独立サービス

OCI コンソールで Reporting Tool 型のツールセットを作ろうとすると、フォームには 「コンパートメント内の SQL レポート」 というドロップダウンが現れます。

ところが何も選択肢がない(「使用可能なデータがありません」と表示される)。「SQL レポート」自体を別画面で先に作る必要があるのです。

image.png

ナビゲーション: OCI コンソール > 開発者サービス > データベース・ツール > SQL レポート

ここで気付く 3 つの構造的特徴:

特徴 観察事実 概要
① 接続選択欄がない 「Database Tools 接続」を選ぶ UI が無い SQL レポートは接続非依存。1 つの定義を複数 DB で使い回せる
目的・命令の入力欄がある Custom SQL Tool には無かったフィールド LLM 向けに「いつ使うべきか」を明示できる
列メタデータを個別に定義できる 名前・タイプ・説明を 1 列ずつ入れる LLM が結果スキーマを意味的に理解できる

これらは Custom SQL Tool には無く、Reporting Tool にしかない設計要素です。

4.2. 入力した値

完成形のスクリーンショット:

image.png

Oracle 公式が画面上で「AI 向け」と明言している
スクショ冒頭の英語キャプションに注目: 「Create a Database SQL Report with a clearly defined purpose and instructions intended for consumption by AI applications, ...」。
SQL レポートが AI アプリ消費を前提として設計されていることを、Oracle が画面 UI レベルで明示しています。

入力値のうち 再現時にコピペが必要なもの だけを以下に置きます。説明・目的・命令の本文と SQL ソースは上のスクショ通りです。

SQL ソース(コピペ用)

SELECT sql_id,
       ROUND(elapsed_time/1000000, 2) AS elapsed_sec,
       executions,
       buffer_gets,
       disk_reads,
       SUBSTR(sql_text, 1, 200) AS sql_text_excerpt
FROM   V$SQL
ORDER BY elapsed_time DESC
FETCH FIRST :N ROWS ONLY

変数(バインド)

名前 タイプ 説明
N NUMBER 返す上位 SQL の件数(1〜50 を推奨。指定がなければ 3)

列メタデータ(6 列)

LLM が結果スキーマを意味的に理解できるように、列ごとに名前・型・説明を個別に登録します。

名前 タイプ 説明
SQL_ID VARCHAR2 SQL を一意に識別する 13 文字のハッシュ ID
ELAPSED_SEC NUMBER この SQL の累計経過時間(秒)。値が大きいほど DB 負荷が高い
EXECUTIONS NUMBER この SQL の実行回数。1 回あたりの負荷を見るには ELAPSED_SEC / EXECUTIONS で割る
BUFFER_GETS NUMBER バッファキャッシュからの読込回数。論理 I/O 量の指標
DISK_READS NUMBER ディスクからの物理読込回数。物理 I/O 量の指標。多いと I/O ボトルネック候補
SQL_TEXT_EXCERPT VARCHAR2 SQL 本文の先頭 200 文字。長文 SQL は途中で切れる

「列の説明」を丁寧に書いておくと、後で LLM が結果を要約するときに 「disk_reads が多いから I/O 系のボトルネック」 のように 列の意味を踏まえた考察を返してくれるようです(§6 参照)。

公式 Docs も同じ思想を明言しています:

Tool name および Tool description は、大規模言語モデル(LLM)がツールの目的と機能を理解するのに役立ちます。明確で詳細な説明を提供することで、結果の品質を向上させることができます。
—— MCPツールセットの作成


5. MCP ツールセット(Reporting Tool 型)の作成

SQL レポートが出来たら、それを MCP に公開するための薄いブリッジ層を作ります。

5.1. 入力した値

入力値
名前 perf-report-toolset
タイプ 「カスタマイズ可能なレポート・ツール」
デフォルト実行タイプ 同期
コンパートメント内の SQL レポート ルート
SQL レポート top-sql-by-elapsed ← §4 で作成済み
許可ロール MCP_User

完成画面:

image.png

5.2. 自動で付いてくる 3 メタツール

タイプを「カスタマイズ可能なレポート・ツール」に切り替えた瞬間、フォーム下部の「ツール」セクションに自動で 3 つのメタツールが現れます。これらが MCP クライアント(Claude Desktop)に公開されます:

メタツール 役割 デフォルト許可ロール
report_list 利用可能なレポート一覧を取得 MCP_User / MCP_Operator / MCP_Administrator
report_execute レポートを実行 MCP_User / MCP_Operator / MCP_Administrator
report_sql レポートの裏の SQL を取得 MCP_Operator / MCP_Administrator のみ

役割分離が「最小露出の原則」レベルで実装されている

report_sql(裏の SQL を見るツール)は、ツールセット作成画面のデフォルトで MCP_User が許可ロールから除外されていました。

さらに、MCP_User しか持たない自分のユーザ向けに report_sql を Claude Desktop から直接呼ぼうとしたところ、Claude は report_sql というツール自体が MCP プロトコル経由で取得できるツール一覧に含まれていない ことを確認しました(§6.3 で詳述)。

つまり OCI Database Tools MCP Server は、未許可のツールに対して「403 Forbidden で実行を拒否」ではなく「そもそも MCP tools/list レスポンスから除外」する実装になっています。これは 最小権限の原則 を一歩踏み込んだ 最小露出の原則(principle of least exposure) で、攻撃面を LLM のコンテキストから物理的に消し去る設計です。

5.3. 公式 Docs の表記揺れ(メタツール名)

公式 Docs(MCPツールセットの作成)にはメタツール名がこう書かれています:

公式 Docs の名前 実機 UI の名前
dbtools_list_reports report_list
dbtools_execute_report report_execute
dbtools_get_report_sql report_sql
dbtools_get_tool_request request_status に対応?)

実機 UI と Docs で表記が違うところは GA 直後らしさを感じます。Claude Desktop に MCP ツールとして見えるのは実機 UI 側の名前です。


6. Claude Desktop からの動作検証

ここが本番です。MCP Server に新しいツールを追加したら、Claude Desktop を完全再起動して反映を待ちます。

設定 > Connectors > oci-dbtools-mcp を開いて、ツール一覧に report_list / report_execute が増えていることを確認:

![Claude Desktop のコネクタ画面(oci-dbtools-mcp で 5 ツールが見える状態)](./images/スクリーンショット 2026-05-23 112015.png)

後述しますが、上のスクショには GET_TOP_SQL_TOOL(Custom SQL Tool 版)も並んでいます。これは私の作業ミスで残っていたもので、§6.3 で「両ツールが並存していたら Claude はどちらを選ぶか?」という追加検証の起点になりました。

6.1. T1: report_list を単独で叩いてみる

まずは小手調べに、レポート一覧を取得してみます。

プロンプト

oci-dbtools-mcp の report_list ツールを使って、利用可能なレポート一覧を取得して。

結果

スクリーンショット 2026-05-23 112150.png

返ってきた内容(要点抜粋):

項目 内容
レポート名 top-sql-by-elapsed
説明 V$SQL から経過時間(elapsed_time)上位 N 件の SQL を返す
用途 「重い SQL / 遅い SQL / 負荷の高いクエリ」の素早い特定
返却カラム(6 件) SQL_ID / ELAPSED_SEC / EXECUTIONS / BUFFER_GETS / DISK_READS / SQL_TEXT_EXCERPT
パラメータ N (NUMBER) — 返す件数、指定なしの場合は規定値 3

この応答から確認できたこと

  • ✅ §4.2 で書いた 「命令」フィールドの文章が「用途」として LLM の認識に入っている
  • ✅ 「指定がなければ 3」と書いたデフォルト値を Claude が拾った
  • ✅ 列ごとの説明(大きいほど DB 負荷が高い 等)が整形された応答に活きている
  • ✅ 最後に 「実行しますか?」 と確認を取った → メタツール 2 段(list → execute)の自律的な組み立て準備

6.2. T2: 自然言語クエリ(クライマックス)

新しい会話を開いて、ツール名もサーバ名も一切指定しない自然言語で投げます。

プロンプト

いま重い SQL を 3 件教えて

結果

スクリーンショット 2026-05-23 112403.png

Claude が選んだ経路:

  1. oci-dbtools-mcpreport_execute を選択
  2. report_id = <top-sql-by-elapsed の OCID>, n = 3 を組み立てて呼び出し
  3. 表形式で 3 件返却 + 自然言語で考察

返ってきた TOP 3(実機データ抜粋):

# SQL_ID elapsed_sec executions buffer_gets disk_reads SQL 本文(要約)
1 e7eatzxbfgyrn5 53 1 1,732,224 16,576 DBMS_AUTOTASK_PRV.VT_run_autotask
2 92aebsfqhfgs7 39 1 1,300,946 28,540 Continuous Query Gathering
3 1bw9swhnigi8 28 1 36,604 1,025 DBMS_AUTO_INDEX

そして Claude は、ただ表を出すだけでなく、列の意味を踏まえた考察を添えてきました(要約):

「これらは Oracle のシステム内部タスクが大半。ユーザーアプリケーションの SQL ではなく、DB の自律メンテナンス(自動タスク・統計収集・自動インデックス管理)が上位を占めている」

この応答が示すこと

  • ツール選択: 自然言語からノーヒントで report_execute を選択
  • パラメータ抽出: 「3 件」→ n=3 を正しく組み立て
  • 意味的考察: §4.2 で書いた列の説明(disk_reads = 物理 I/O 量の指標 等)と SQL_TEXT_EXCERPT から、システムタスク vs ユーザー SQL を自律的に区別

この時の検証は Reporting Tool 単独で見えている前提でした
当初の作業ミスで Custom SQL Tool 版(GET_TOP_SQL_TOOL)も作成されていました。Claude のツール選択が「Reporting Tool を自律的に選んだ」ように見えたのは、他の選択肢が見えていなかったからでした。両者並存環境での挙動は §6.3 で。

6.3. T3+: 両ツール並存環境で Claude はどちらを選ぶか

前段: report_sql の不在を Claude に確認

§5.2 で予告したとおり、report_sql ツールは MCP_User からは見えないはずです。実際に Claude Desktop で直接指名してみました:

oci-dbtools-mcp の report_sql ツールを使って、top-sql-by-elapsed レポートの裏の SQL を取得して。

image.png

Claude (Sonnet 4.6) は内部でツール検索を実施した上で「mcp__oci-dbtools-mcp__report_sql は現在の MCP サーバーには 存在しないツールでした」と回答。利用可能なのは:

  • report_list / report_execute / GET_TOP_SQL_TOOL / request_status / schema_information

の 5 つのみと判明しました。役割分離は「最小露出の原則」レベルで実装されていることが実機で確認できた瞬間です。

GET_TOP_SQL_TOOL も並んでいた

同時に発覚したのが、上の応答に GET_TOP_SQL_TOOL(Custom SQL Tool 版)が混ざっていたことです。当初フォームを「カスタム SQL ツール」で開いて入力していたものを登録してしまってた模様です。

結果的に 「同じユースケースに対して 複数のアプローチが並存したとき、LLM はどちらを選ぶか」 を実施で観察できる機会となりました。

検証: 両ツールが並んだ状態で Claude はどう選ぶ?

新規セッション(Sonnet 4.6)で、ツール名もサーバ名も一切指定しない、§6.2 と完全に同じプロンプトを投げます:

いま重い SQL を 3 件教えて

Claude (Sonnet 4.6) のツール呼び出し順

ツール サーバ 結果
GET_TOP_SQL_TOOL oci-dbtools-mcp(Custom SQL Tool) ❌ Request timed out
MY_RUN_SQL_TOOL adb-dba-copilot ✅ 成功

スクリーンショット 2026-05-23 122734.png

事前仮説(「Reporting Tool は 4 階層メタ情報がリッチだから LLM はそちらを優先するはず」)はハズレ。Sonnet 4.6 は Reporting Tool(report_execute)を選びませんでした。まあ、途中で取れれば止めるのは当然の動きではありますが。

最終応答の所見(adb-dba-copilot 経由で返ってきた TOP 3)

最終的に adb-dba-copilot 経由で得た TOP 3 SQL について、Claude は内部タスクを識別する所見を添えてきました:

image.png

→ ここでも §4.2 で SQL レポート側に書いた「列の説明」と同等の意味理解が効いていることが分かります(ただし今回は adb-dba-copilot 経由の生 SQL 実行なので、Reporting Tool のメタ情報が直接効いたわけではなく、列名から Claude が一般知識で推論したと考えられます)。

Claude 自身による選択ロジックの説明

追加で「他にも同じ質問に答えられそうなツールはありましたか?なぜそちらではなくこのツールを選んだのか教えて」と聞いたら、Claude (Sonnet 4.6) は自分の選択を表+文章で説明しました:

image.png

応答の要約:

  • 5 つのツールが選択肢にあった(GET_TOP_SQL_TOOL / MY_RUN_SQL_TOOL / MY_RUN_SQL_TOOL2 / EXECUTE_SQL / schema_information)
  • GET_TOP_SQL_TOOL は description が「Returned top N SQL ... by elapsed time from V$SQL」で、質問と直接マッチしていたので最初に試した
  • タイムアウト時は汎用 SELECT ツール(adb-dba-copilot 側)にフォールバック
  • report_execute への言及はなかった

→ つまり Claude のツール選択は「メタ情報の豊富さ」ではなく 「ツール名と description の意味的マッチ」 が支配的でした。GET_TOP_SQL_TOOL は名前自体が "TOP SQL" と質問に直結している一方、report_execute は抽象的で、何のレポートかは別途 report_list で発見する必要がある。Reporting Tool の二段構造(list → execute)は、LLM の最初の検討フェーズでは不利だった、ということです。

副次的な発見: 答えは結局 adb-dba-copilot から返った(マルチ MCP の罠)

最終回答は OCI Database Tools MCP Server の機能ではなく、前回記事の adb-dba-copilot(ADB 26ai 組み込み MCP)の汎用 SELECT ツール から返ってきました。GET_TOP_SQL_TOOL がタイムアウトしたので、LLM がサーバを跨いで代替手段を探した結果です。

これは LLM × MCP 運用設計に大事な意味があると考えてます:

  • 複数 MCP サーバを並べて使う環境では、LLM はそれらを意識せず横断的に探索する
  • 「OCI DB Tools MCP の動作を測りたい」のに、別サーバが代行してしまうことがある
  • 計測検証では MCP サーバを 1 つだけにして 切り分ける、という運用上の知恵が必要

7. 考察: Custom SQL Tool と Reporting Tool の設計差

§4 と §5 で見てきた Reporting Tool の特徴を Custom SQL Tool と並べ、Oracle が両者をなぜ別タイプとして用意したのか、その設計思想の差を整理します。

7.1. 構造の違い

以下の比較表は、OCI コンソールの両ツールセット作成画面と、SQL レポート作成画面、および MCPツールセットの作成 で確認した内容です。

観点 カスタム SQL ツール カスタマイズ可能なレポート・ツール
SQL の置き場所 ツールセット内に直書き 別サービス(SQL レポート) に資産化
1 ツール = ? 1 SQL = 1 MCP ツール(名前付き) 3 メタツール(list/execute/sql)でレポート群を動的探索
接続との関係 ツールセット作成時に SQL を書く(接続はツールセット側) SQL レポートは接続非依存、複数 DB で再利用可
LLM 向けメタ情報 tool description 1 段階 説明 / 目的 / 命令 / 列 の 4 段階
ガバナンス MCP 管理者がコントロール SQL レポート管理者と MCP 管理者を分離可能
役割分離 ツール単位の許可ロール メタツール単位で許可ロール(report_sql は Operator+ がデフォルト)
想定操作 データベース操作全般(PL/SQL/DML も可) データ分析(読み取り中心、承認済みクエリのみ)
LLM の自由度 このツールに紐づいた SQL を呼ぶだけ レポート集合の中から動的に選んで呼ぶ

7.2. なぜ「Reporting Tool は LLM 向けにできている」と言えるか

公式 Docs (MCPツールセットの作成) に次のように記載があります:

LLM は、ツールの説明を使用して、各レポート・ツールの動作を理解し、それらを使用するタイミングを決定します。」

「Tool name および Tool description は、大規模言語モデル(LLM)がツールの目的と機能を理解するのに役立ちます。明確で詳細な説明を提供することで、結果の品質を向上させることができます。」

さらに SQL レポート作成画面の冒頭にも 「intended for consumption by AI applications」 と明記されています(§4.2 のスクショ参照)。

つまり Reporting Tool は最初から 「LLM が動的に判断して使う」前提で設計されている、ということです。具体的に効く仕掛けは以下の 4 点で、いずれも実機 UI で確認できます:

  1. 「命令」フィールド — LLM に対する「いつ使うか」の指示を、SQL レポート定義側に書いておける(§4.2)
  2. 列ごとの説明 — 結果スキーマの意味的解釈を LLM に渡せる(§4.2、応答品質に効くのは §6.2 で確認)
  3. report_list メタツール — LLM が「利用可能なレポートを発見する」ステップを踏める(§6.1)
  4. SQL レポート資産の独立性 — 接続非依存で定義され(§4.1)、SQL を書く DBA と MCP に公開する管理者を分離可能

Custom SQL Tool は「LLM に決まった SQL を実行させる」設計、Reporting Tool は「LLM がレポート集合を読んで自分で選ぶ」設計。両者は思想がワンレイヤー違うように見えます(厳密には Custom SQL Tool も複数定義すれば LLM が選べますが、report_list のような明示的な発見ステップは無いという点で差があります)。

ただし、これだけ手厚い LLM 向け設計をしても、LLM が必ず Reporting Tool を選ぶとは限らないことが §6.3 で判明しました。

7.3. 「公式チュートリアル未収録」の意味するところ

公式チュートリアル は Custom SQL Tool(従業員検索クエリ)で「最小動作」を見せる構成になっており、Reporting Tool は登場しません。Reporting Tool は 公式 Docs のリファレンス側 でのみ解説されています。

7.4. 予想外の発見: メタ情報の豊富さ < ツール名の意味的明確さ

§6.3 で観察した結果は、§7.2 で組み立てた論理(「Reporting Tool は LLM 向けに作り込まれているから LLM が選ぶはず」)を部分的に裏切るものでした。

何が起きたか(再掲)

  • Custom SQL Tool (GET_TOP_SQL_TOOL) と Reporting Tool (report_execute) を両方公開した状態で、同じ質問を Sonnet 4.6 に投げた
  • Claude は GET_TOP_SQL_TOOL を最初に試した(タイムアウトで失敗)
  • その次も別のツールで、report_execute は選ばれなかった

仮説の更新

ここから読み取れる LLM のツール選択ロジックは、以下のように仮説立てできます:

階層 何が効くか
第 1 階層: ツール名の意味的マッチ 質問のキーワード("TOP SQL", "重い SQL")とツール名のキーワード(GET_TOP_SQL_TOOL)の直接マッチ
第 2 階層: tool description 名前で同点だった場合の補助。「Returned top N SQL by elapsed time」のような直接的記述が効く
第 3 階層: メタ情報の豊富さ 「目的」「命令」「列の説明」── 選ばれた後の応答品質に効くが、選択そのものには効きにくい
第 4 階層: 多段ツール構造 report_listreport_execute のような発見プロセスは、最初の検討フェーズでは想起されにくい

Reporting Tool の本来の価値はどこにあるか

ここからは私なりの解釈です:

  1. MCP_User しか持たない統制環境: Custom SQL Tool そのものを公開せず、レポート集合経由でしか SQL を実行させたくない場合
  2. 複数レポートを動的に運用する場面: report_list で発見させる前提で、5〜10 個のレポートをまとめて公開する場合
  3. SQL 資産を複数 DB で再利用したい場合: SQL レポートが接続非依存なので、1 定義を複数の MCP サーバから参照できる
  4. 応答品質を最大化したい場面: 「命令」「列の説明」が応答時の自然言語要約に直接効く(§6.1 / §6.2 で実測)

逆に 「特定の質問に直接答える単発ツール」を作るなら、Custom SQL Tool のほうが LLM に選ばれやすい。これは前回記事の §6.2 で「Custom SQL Tool の追加が必要」と書いたときの直感は、結果として LLM のツール選択ロジックに沿っていた、ということでもあります。

マルチ MCP 環境の注意点

さらに副次的な発見として、GET_TOP_SQL_TOOL がタイムアウトした際、LLM は 別の MCP サーバ(adb-dba-copilot)の汎用 SQL ツールに自動でフォールバック しました。これは Claude Desktop に複数の MCP サーバを並列接続している場合の自然な挙動です。

  • 計測検証時は MCP サーバを 1 つに絞る(他サーバが代行してしまうと真の挙動が見えない)
  • 本番運用時は冗長化として利用できる(1 サーバが落ちても LLM が代替手段を見つける)

8. 次回?: シリーズ横ぐし比較

冒頭で書いたとおり、同じ問い 「いま重い SQL を 3 件教えて」 を、以下の 4 経路で検証してきました:

# 経路 役割の置き場
1 SELECT AI DB 内の LLM が NL → SQL を自動生成
2 ADB 26ai 組み込み MCP DB 自身が MCP サーバ化、外部 LLM が SQL を書く
3 SQLcl MCP Server ローカル CLI が MCP サーバ、外部 LLM が SQL を書く
4 OCI Database Tools MCP Server(本記事) OCI マネージドの MCP サーバ、DBA が定義したレポートを LLM が呼ぶ

次回は これら 4 アプローチを「セットアップ工数 / カスタム性 / 認証粒度 / LLM への自由度 / 向くユーザー層」の観点で横ぐし比較してみたいと思います。同じ問い・同じ DB に向けて 4 通りの実装をぶつけた結果を、1 枚の比較表に集約するイメージです。


9. まとめ

9.1. 検証ゴールの達成状況

# 検証項目 結果
1 SQL レポート + Reporting Tool 型ツールセットを作って Claude から呼べた ✅ 達成
2 「いま重い SQL を 3 件教えて」に Claude が自律的に正しく応答できた ✅ 達成(条件付き — §9.2 参照)

9.2. 確認できたポイント

ポイント 内容
★ Reporting Tool は隠れキャラ 公式チュートリアル未収録、公式 Docs リファレンスでのみ解説。GA 直後でまだ日本語情報がほぼない
4 階層メタ情報 説明 / 目的 / 命令 / 列の説明 ── 画面冒頭に Oracle 自身が "intended for consumption by AI applications" と明記
SQL レポートは接続非依存 1 定義を複数 DB / 複数 MCP サーバで再利用可
最小露出の原則 report_sql は MCP_User に対しツール一覧から物理的に消去(403 拒否ではなく非公開)
Reporting Tool 単独環境 Claude は 4 階層メタ情報を活かした高品質応答(§6.2)
Custom SQL Tool と並存環境 Claude は名前マッチで Custom を先に試した(メタ情報の豊富さは無視された)(§6.3)
マルチ MCP 環境 LLM はサーバを跨いで代替手段を自律探索する

9.3. 設計指針(ちょっと仮設含み・・)

  • 「特定の質問に直接答える単発ツール」を作るなら Custom SQL Tool(LLM に選ばれやすい)
  • 「複数の承認済みクエリ集合を統制下で LLM に公開する」なら Reporting Tool(接続非依存・役割分離・メタ情報リッチ)
  • 計測検証では MCP サーバを 1 つだけにして切り分ける(マルチ MCP は代行されて挙動が読めない)

GA 直後でまだ情報が薄く、公式チュートリアルにも載ってない Reporting Tool。動かしてみたら 「これ、最初から LLM を相手にする前提で作ってあるな」 と思うような設計でした。

ただし「LLM 向けに作り込めば LLM が選ぶ」というほど単純な世界ではなく、ツール名の意味的明確さという古典的な要素が支配的だった、というのがまた難しいところです。Reporting Tool の本来の出番は、統制環境での SQL 公開複数レポートを並列運用するシナリオにありそうです。
また、自身の環境で様々なツールを登録してしまっているため、きちんとクリーンな環境で本当は実施した方が良いことが改めてわかりました。ただ、それらは公式にお任せしてとりあえず何ができるのか、やりたいことをしたい場合にどうすればよいのか、を自身が把握するために検証は続けようと思います。


参考

公式 Docs

シリーズ過去記事


0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?