
はじめに
こんにちは。
開発本部 開発1部 デリッシュリサーチでデータエンジニアをしている吉田です。
今回は、DatabricksのUnity Catalog管理下のテーブルを、自然言語で検索できるClaude Codeスキルを構築した話を紹介します。
背景
以前の記事 では、Databricks Managed MCP Serverを通してUnity Catalog Functionを実行することでテーブルのスキーマ情報を取得する方法を紹介しました。
この仕組みは便利でしたが、テーブルのパスを把握していることが前提でした。
しかし実際の運用では「あのデータはどのテーブルだっけ?」というケースが多く、テーブルがわからない状態から対象のテーブルを探したいというニーズがありました。
そこで今回は、社内で活用が進んでいるClaude Codeのスキルとして、自然言語でテーブルを検索するスキルを作成します。
スキルの概要
スキルの動作フローは以下のようになります。
- ユーザが質問 : 「アプリの動画視聴ログはどこ?」
- Claude CodeがSkillを起動
- 質問文からLLMが文脈に応じてキーワードを抽出 : アプリ/動画/視聴/app/search など
- scriptを利用して検索SQLを作成
- Databricks DBSQL MCPを使ってsystemテーブルに対してクエリを発行
- 結果を受け取り解釈、イマイチな場合、キーワードを変えて再検索
- 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スキルを構築しました。