every Tech Blog

株式会社エブリーのTech Blogです。

Claude CodeスキルでUnity Catalogのテーブル探索を自動化する

はじめに

こんにちは。
開発本部 開発1部 デリッシュリサーチでデータエンジニアをしている吉田です。

今回は、DatabricksのUnity Catalog管理下のテーブルを、自然言語で検索できるClaude Codeスキルを構築した話を紹介します。

背景

以前の記事 では、Databricks Managed MCP Serverを通してUnity Catalog Functionを実行することでテーブルのスキーマ情報を取得する方法を紹介しました。

この仕組みは便利でしたが、テーブルのパスを把握していることが前提でした。
しかし実際の運用では「あのデータはどのテーブルだっけ?」というケースが多く、テーブルがわからない状態から対象のテーブルを探したいというニーズがありました。

そこで今回は、社内で活用が進んでいるClaude Codeのスキルとして、自然言語でテーブルを検索するスキルを作成します。

スキルの概要

スキルの動作フローは以下のようになります。

  1. ユーザが質問 : 「アプリの動画視聴ログはどこ?」
  2. Claude CodeがSkillを起動
    1. 質問文からLLMが文脈に応じてキーワードを抽出 : アプリ/動画/視聴/app/search など
    2. scriptを利用して検索SQLを作成
    3. Databricks DBSQL MCPを使ってsystemテーブルに対してクエリを発行
    4. 結果を受け取り解釈、イマイチな場合、キーワードを変えて再検索
  3. Claude Codeが回答 : 「最有力候補は以下です。その他候補は ~ です」

アプローチとしてテーブル情報をVector Searchすることも考えましたが、今回は簡単な手法を選択しました。

Databricks Managed MCPの活用

今回のスキルでは、Databricksが提供するManaged MCP ServerのDBSQLを利用しています。

https://docs.databricks.com/gcp/ja/generative-ai/mcp/managed-mcp

以前の記事ではUnity Catalog FunctionsのMCP Serverを使い、事前に定義した関数を呼び出すアプローチでした。
今回は任意のクエリを実行できるDBSQLのMCP Serverを使い、SQLを直接実行するアプローチを取っています。

DBSQL MCPでは以下のツールを提供しています。

  • execute_sql
    • 任意クエリの実行ツール
  • execute_sql_read_only
    • Select,Showなど読み取りクエリの実行ツール
  • poll_sql_result
    • 長時間実行されるクエリの結果を取得するツール

execute_sqlツールは、Delete,Dropなどの危険なクエリを発行できるため、必要に応じて利用制限を行うのが良いです。

// settings.json
{
  "permissions": {
    "deny": [
      "mcp__<mcp_name>__execute_sql"
    ]
  }
}

DBSQL MCPは標準で提供されており、すぐに利用する事ができます。

systemテーブルによるメタデータ検索

Databricksのsystem.information_schemaにはカタログ配下のオブジェクトに関するメタデータが保存されています。

https://docs.databricks.com/aws/ja/sql/language-manual/sql-ref-information-schema

主にsystem.information_schema.tablesを利用してテーブル名やコメント名に対してLIKE検索を行うことでテーブルを探しています。

SELECT
  table_catalog,
  table_schema,
  table_name
FROM
  system.information_schema.tables
WHERE
  LOWER(table_name) LIKE '%<keyword1>%'
  OR LOWER(comment) LIKE '%<keyword1>%'

Claude Codeスキルとして実装

スキルの構成

Claude CodeのスキルはSKILL.mdというファイルで定義します。 今回のスキルのディレクトリ構成は以下のとおりです。

~/.claude/skills/<skill-name>/
├── SKILL.md                         # スキル定義
└── scripts/
    ├── _common.py                   # 共通ユーティリティ
    ├── gen_search_table_query.py    # テーブル検索(基本)
    ├── gen_get_columns_query.py     # カラム情報取得
    └── gen_get_sample_data_query.py # サンプルデータ取得

SKILL.mdのfrontmatterで、スキルが使用できるツールを制限しています。

---
name: <skill-name>
description: Databricks Unity Catalogのテーブル検索スキル。
context: fork
allowed-tools:
  - Bash
  - mcp__databricks-sql-mcp__execute_sql_read_only
  - mcp__databricks-sql-mcp__poll_sql_result
---
  • context: fork
    • スキルを独立したサブプロセスで実行し、メインの会話コンテキストを汚さない
  • allowed-tools
    • Bashに加え、読み取り専用のMCPツールのみを許可

SKILL.mdの本文にはワークフロー(検索の手順)や出力ルール(最有力候補1件+その他最大4件に絞り込む等)を記述しており、Claude Codeはこの指示に従ってSQLを生成・実行します。

sqlglotによるSQL生成

SQLはsqlglotライブラリを利用したpythonスクリプトで生成しています。

https://sqlglot.com/sqlglot.html

プロンプトでSQLの生成をAgentに任せる方法と比べて、確実に目的のクエリを作成することができます。

SKILL.md中に以下のようなコマンドを指示することでSQLを作成しています。

uv run --no-project --with sqlglot scripts/<スクリプト名>.py <パラメータ>

sqlglotでのクエリ生成は以下のようにして行っています。
gen_search_table_query.py,_common.pyから抜粋

# gen_search_table_query.py
from sqlglot import exp, select
from _common import like_or

def build_query(keywords: list[str]) -> exp.Expression:
    return (
        select("table_catalog", "table_schema", "table_name", "comment")
        .from_("system.information_schema.tables")
        .where(like_or([("table_name", None), ("comment", None)], keywords))
    )
# _common.py
def like_or(
    columns: list[tuple[str, str | None]], keywords: list[str]
) -> exp.Expression:
    """Build OR chain: LOWER(col) LIKE '%kw%' for each (column, keyword) pair."""
    conditions = [
        exp.Like(
            this=exp.Lower(
                this=exp.Column(
                    this=exp.to_identifier(col),
                    table=exp.to_identifier(tbl) if tbl else None,
                )
            ),
            expression=exp.Literal.string(f"%{kw}%"),
        )
        for kw in keywords
        for col, tbl in columns
    ]
    return reduce(lambda a, b: exp.Or(this=a, expression=b), conditions)

検索精度とデータカタログの重要性

今回のスキルの検索精度は、テーブルやスキーマに付与されたコメントの充実度に強く依存します。
テーブル名とコメントをLIKEで検索するため、コメントが空のテーブルはテーブル名のみでしかマッチしません。
十分な結果が得られなかった場合はサンプルデータの取得や別キーワードでの再検索など探索的にテーブルを探しますが、判断材料としてコメントは非常に重要です。

データカタログの育成こそが、データ活用全体の効率化につながると考えています。

まとめ

Databricks Managed MCP ServerのDBSQLとsystemテーブルを組み合わせることで、Unity Catalogのテーブルを自然言語で探索できるClaude Codeスキルを構築しました。