
普段から DuckDB を使う機会があって,少し前から気になっていた MotherDuck's DuckDB MCP Server (mcp-server-motherduck) を試してみることにした🦆 mcp-server-motherduck は MotherDuck に統合する機能だけでなく,シンプルにローカル環境の DuckDB を使ってクエリを実行する機能もあって,今回はそっちを試す〜 \( 'ω')/
MCP クライアントは Claude Desktop / Cline など自由に選ぶことができて,今回は「GitHub Copilot エージェントモード」を使う.
サンプルデータ
DuckDB in Action に出てきたサンプルデータの中から ATP ランキングデータ (ch05/atp/atp_rankings.parquet) を使う🎾
設定⚙️
ローカル環境の DuckDB を使う場合はインメモリ設定で OK👌
{ "mcpServers": { "mcp-server-motherduck": { "command": "uvx", "args": [ "mcp-server-motherduck", "--db-path", ":memory:" ] } } }
mcp-server-motherduck を試す
プロンプト1
同じプロンプトでも MCP ツールが呼び出されないことがあって,意図的に mcp-server-motherduck を使うように指示してある👌
// mcp-server-motherduck を使う ch05/atp/atp_rankings.parquet のスキーマ構造を教えて!
mcp-server-motherduck でスキーマ構造を確認できた❗️


内部的には以下のクエリが実行されていた.
DESCRIBE SELECT * FROM '/Users/kakakakakku/ghq/github.com/duckdb-in-action/examples/ch05/atp/atp_rankings.parquet'
プロンプト2
ランキング上位5選手を教えて!
mcp-server-motherduck でランキング上位の選手を取得できた❗️アルカラス🎾

内部的には以下のクエリが実行されていた.
SELECT name_first, name_last, rank, points, ranking_date FROM '/Users/kakakakakku/ghq/github.com/duckdb-in-action/examples/ch05/atp/atp_rankings.parquet' WHERE rank <= 5 ORDER BY ranking_date DESC, rank ASC LIMIT 5
プロンプト3
選手の利き手と成績に相関関係はある?
mcp-server-motherduck で利き手別のデータを取得しつつ,以下の4つの観点から分析できた❗️これは活用の幅がありそうだな〜と思った.
- 利き手の分布
- 平均ランキング
- 最高・最低ランキング
- 平均獲得ポイント
キャプチャ以外の分析結果も多く出力されていて,最終的に「まとめ」として以下の考察も生成できた.
データ上では、左利き選手の方が右利き選手よりも平均的に成績が良い傾向が見られます。この「左利きアドバンテージ」は、対戦相手が左利きのプレースタイルに慣れていないことから生じる可能性が考えられます。しかし、最高ランクの選手を見ると、利き手だけが決定的な要素ではなく、テクニック、身体能力、メンタル面など、複数の要素が組み合わさって成功につながっていると考えるべきでしょう。

内部的には以下のクエリが実行されていた.
WITH latest_ranking AS (SELECT * FROM '/Users/kakakakakku/ghq/github.com/duckdb-in-action/examples/ch05/atp/atp_rankings.parquet' WHERE ranking_date = (SELECT MAX(ranking_date) FROM '/Users/kakakakakku/ghq/github.com/duckdb-in-action/examples/ch05/atp/atp_rankings.parquet')) SELECT hand AS 利き手, COUNT(*) AS 選手数, ROUND(AVG(rank), 2) AS 平均ランク, MIN(rank) AS 最高ランク, MAX(rank) AS 最低ランク, ROUND(AVG(points), 2) AS 平均ポイント FROM latest_ranking WHERE hand IS NOT NULL GROUP BY hand ORDER BY COUNT(*) DESC
プロンプト4
ランキング上位100選手の身長を棒グラフでまとめて!
最後は分析結果をグラフとして出力するプロンプトにしたところ,mcp-server-motherduck でクエリを確認しつつ,GitHub Copilot エージェントモードによって atp_height_analysis.py が実装された😀そして venv で仮想環境を作って,よくある distutils のエラーに遭遇して...という感じでエージェントに委ねていたら(バイブコーディング)最終的に棒グラフが出力された📊

最終的に実装された atp_height_analysis.py では以下のようなクエリが実行されていて,あとは duckdb / pandas / matplotlib などを組み合わせて棒グラフを出力するようなコードになっていた.
# データの読み込み query = """ WITH latest_ranking AS ( SELECT * FROM '/Users/kakakakakku/ghq/github.com/duckdb-in-action/examples/ch05/atp/atp_rankings.parquet' WHERE ranking_date = (SELECT MAX(ranking_date) FROM '/Users/kakakakakku/ghq/github.com/duckdb-in-action/examples/ch05/atp/atp_rankings.parquet') AND rank <= 100 ) SELECT player_id, rank, name_first || ' ' || name_last AS player_name, height FROM latest_ranking WHERE height IS NOT NULL ORDER BY rank """
まとめ
MotherDuck's DuckDB MCP Server (mcp-server-motherduck) を試してみた🦆
直接クエリを書かずに DuckDB で Parquet ファイルや CSV ファイルを分析できて便利だった\( 'ω')/