こんにちは。SREの平です。今回は自然言語で ClickHouse を操作できる MCP を触ってみました。
これは、LLM(今回は Claude)と ClickHouse をつなぐインターフェースであり、SQLを知らないユーザーでも自然言語でデータベースを操作できるのが特徴です。 本記事では、ローカル環境での導入と実行、初期の挙動、LLMとのやりとり、デモデータを使った応用を見てみたいと思います。
■ 公式github
https://github.com/ClickHouse/mcp-clickhouse
■ 検証環境
| 項目 | 内容 |
|---|---|
| OS | Windows 11 |
| クライアント | Claude for Desktop |
| サーバー | WSL(ubuntu)上に mcp-clickhouse をインストール、起動 |
| ClickHouse | 自宅(バージョン 23.3)/ 公式デモサーバー |
| DB内容 | 自宅:ゲームデータ(会社名・ゲーム名・価格) / 公式:Hacker News等 |
■ 環境の準備
- ClickHouse
まずはClickHouseです。今回は自宅にクラスターがあるのでそれを利用しました。 なおDBの用意がない方用に、公式がデモ用Clickhouseサーバーを用意してくれていますのでそちらをありがたく利用しましょう。
| 対象 | 自宅クラスター | 公式デモ |
|---|---|---|
| HOST | clickhouse.local.xxx.xxx | sql-clickhouse.clickhouse.com |
| USER | taira | demo |
| PASS | taira1234 | 無し |
| PORT | 8123 | - |
これらを後ほど Claude for Desktop に設定しますが、一旦先に行きましょう。
- MCP
MCPのインストールです。変わる可能性があるので公式をご覧いただきたいのですが、現状uvとpipを使う方法があるようで、今回はpipを使いました。
pip install --upgrade mcp-clickhouse
- Claude for Desktop
次に Claude for Desktop を用意し、MCPの設定ファイルを編集します。パスは公式にも記載がありますが Claude for Desktop から ファイル > 設定 > 開発者 > 構成を編集 > 「claude_desktop_config.json」 でも開けます。
そしてClickhouseのサーバー情報等を以下のように記述します。
- 自宅クラスターの場合(もちろん各数値は各自の環境に合わせて書き換えてください)
{
"mcpServers": {
"mcp-clickhouse": {
"command": "wsl",
"args": [
"bash",
"-c",
"CLICKHOUSE_HOST=clickhouse.local.xxx.xxx CLICKHOUSE_USER=taira CLICKHOUSE_PASSWORD=taira1234 CLICKHOUSE_PORT=8123 CLICKHOUSE_SECURE=false CLICKHOUSE_VERIFY=false CLICKHOUSE_MCP_SERVER_TRANSPORT=stdio CLICKHOUSE_MCP_BIND_HOST=localhost CLICKHOUSE_MCP_BIND_PORT=8000 python3 -m mcp_clickhouse.main"
]
}
}
}
- 公式デモサイトの場合
{
"mcpServers": {
"mcp-clickhouse": {
"command": "wsl",
"args": [
"bash",
"-c",
"CLICKHOUSE_HOST=sql-clickhouse.clickhouse.com CLICKHOUSE_USER=demo CLICKHOUSE_PASSWORD= CLICKHOUSE_MCP_SERVER_TRANSPORT=stdio CLICKHOUSE_MCP_BIND_HOST=localhost CLICKHOUSE_MCP_BIND_PORT=8000 python3 -m mcp_clickhouse.main"
]
}
}
}
これで環境は整いました。
■ 起動直後のMCPの挙動
Claudeと接続すると、MCPは以下のように自律的にClickHouseに問い合わせを開始しました。ま、tools/listから順に実行という流れですね。
| タイミング | アクション | 意図 |
|---|---|---|
| 接続直後 | tools/list | 使用可能なツール一覧取得 |
| 接続直後 | list_databases | DB一覧取得 |
| DB取得後 | list_tables | テーブル一覧取得 |
| テーブル取得後 | run_select_query など | 内容に応じたクエリ実行 |
そして「game_db が面白そうですね。中身を見ますか?」と提案され、"yes" と返すと自動的にクエリを投げてくれます。 その他、以下のような自然言語プロンプトに対し、1発で正しいSQLが生成されました。
- 「メーカー別のゲーム本数は?」
- 「全ゲームの合計金額は?」
さらに「グラフで見せて」と指示すると、棒グラフや円グラフも自動生成されました。素晴らしい。

■ バージョン依存のエラーも自動回避
以下のような若干古い ClickHouse 側のバージョン差によるエラーも自動で検知・対処されました。エラーが起きにくいですが、なるべくClickHouseは新しくしておいた方が手戻りは少ないでしょう。
Error calling tool 'list_tables': HTTPDriver for http://clickhouse.local.xxx.xxx:8123 received ClickHouse error code 47 Code: 47. DB::Exception: Missing columns: 'total_bytes_uncompressed' while processing query:
■ 安全なクエリ
実際にMCPが発行しているクエリを確認すると以下のような特徴があり、サーバーの負荷を減らし、データを保護しつつ、網羅的にデータを引っ張るような努力が垣間見れました。素晴らしいですね。ただこれらに依存せず、なるべく読み込み権限のみのユーザーや、閲覧できるデータベースを制限するなど、できるところはやっておきたいですね。
- SELECT * FROM viewIfPermitted ... などで権限が無いならNullを返し、エラーにしにくくしている。
- 関数名、フォーマット名、エンジン名、設定名などを一括取得して、LLMが「正しい用語」を使って応答できるよう準備している。
- 多くの列を一度に取得しつつも、全体の量には上限をかけてサーバーを安全に運用する配慮も見えた。
■ より大規模な検証
大規模データでの動作確認のため、ClickHouse公式のデモサーバーに接続してみましょう。大量のデータがありますが、そのうち Hacker Newsデータを使ってみます。なお、ここが今回の目玉です。
- 「Hacker Newsから、最近の攻撃手法ランキングを出して」
- 「アクセス数の推移をグラフで」
といったプロンプトで、数十秒で以下のレポートが作成されました。感動です。

■ セキュリティ観点
自然言語で任意のSQLが投げられるため、ユーザーやテナントごとに分離が必要な場合は Row Policy などを検討してみてはいかがでしょうか。
■ 最後に
ClickHouse MCPは、自然言語 × データベースの可能性を大きく広げるプロジェクトです。
- 導入は簡単、WSL環境でもすぐに試せる
- Claudeとの組み合わせで、高精度なSQL生成と可視化が可能
- 実運用にはセキュリティの設計が不可欠
今後は、以下のような発展が期待されます
- 独自ツールの追加(例:登録・更新用のwrite系クエリ)
- 他LLM(ChatGPTなど)への対応
- より柔軟なデータ可視化機能との連携
ぜひ試してみてください、もっとデータをClickHouseに入れたくなるはずです。