権限設定ミスしても安全なBigQueryの分析特化型MCPサーバーを作ってみた
Model Context Protocol(MCP)の説明は割愛します。
なぜ作成したか?
ClineやCursorに「商品〇〇のシェアを伸ばすには?」と伝えるだけで、分析設計からクエリ実行、レポート作成までを行ってくれる自律型AIデータアナリストを構築するためです。DWH連携に分析だけに特化したBigQuery用MCPサーバーが必要でした。
コミュニティが作成したBigQueryのMCPサーバーはあり、様々な機能(テーブルの一覧取得、テーブルのスキーマ取得、クエリ実行、dryRun)を備えたものですが、分析だけに特化したものではありません。
業務でアプリログやID-POSデータのような規模が大きいデータを分析する際に、BigQueryのスキャン量が非常に大きくなることがあります。
BigQueryの従量課金制を利用していると、Tokyo(asia-northeast1)で7.5ドル/TiBの費用がかかります。ホント値上がりして辛い...
もちろんBigQueryにはプロジェクト単位で1日あたりのクエリスキャン量(Quota)の上限を設定することが出来ますし、プロジェクトやデータセット単位で読み取り権限のみにするという対応が正しいのですが、設定することを忘れることがしばしばあります。
その結果、誤ってINSERT
やCREATE OR REPLACE TABLE
を実行してしまい、大切なデータを変更してしまうリスクもあります。
- クエリのドライラン: 実行前にクエリを検証し、構文エラーがないかを判定する
- データ処理量の上限設定: 1TB以上のデータ処理を拒否し、予期しない高額な請求を防止する
- SELECT文のみ許可: データ取得のみを許可し、データの変更や削除を完全に防止する
これらの機能を満たすMCPサーバーを構築することで、CursorやCline, Claude Desktopとつないで自然言語で作成したBigQueryのクエリを安全に実行させられるようになります。
MCPサーバーのツール
run_query_with_validation - 検証付きでBigQueryクエリを実行して結果を返す
run_query_with_validation("SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus='hamlet' LIMIT 10")
- DML文(データ変更クエリ)を検出して拒否する
- 1TB以上のデータ処理を拒否する
- 検証に通過したクエリを実行し結果をJSON形式で返す
- (こちらにもdryRunが含まれる)
パラメータ
query: string; // 実行するSQLクエリ
projectId?: string; // プロジェクトID(省略可)
maxResults?: number; // 結果の最大数(省略可、デフォルト: 100)
結果
success: boolean; // クエリの実行結果
bytesProcessed?: string; // 処理されたバイト数
formattedSize?: string; // 処理されたサイズ(人間可読形式)
rowCount?: number; // 結果の行数
results?: any[]; // クエリ結果
error?: string; // エラーメッセージ(エラーの場合)
dry_run_query - BigQueryクエリのドライラン実行
※ こっちのツールはなくても良いかも
dry_run_query("SELECT * FROM `bigquery-public-data.samples.shakespeare` LIMIT 10")
- クエリの検証と処理サイズの見積もりを行う
- 1TBの制限に対してクエリサイズをチェックする
使い方
開発環境のセットアップ
前提条件
- Node.js (v16以上)
- Google Cloud認証設定(Google Cloud CLIまたはサービスアカウント)
リポジトリのクローンと依存関係のインストール
git clone https://github.com/gotalab/bigquery-analysis-mcp-server.git
cd bigquery-analysis-mcp-server
npm install
ビルド
npm run build
開発モード(自動再ビルド)
npm run watch
Claude Desktop/Cline/Cursor/Windsurfで使用する
Claude Desktop/Cline/Cursor/Windsurfで使用するには、サーバー設定を追加します。
ここではClaude Desktopの設定ファイルを示します(他もほぼ一緒):
%APPDATA%/Claude/claude_desktop_config.json
設定ファイルの内容(macOS)
{
"mcpServers": {
"bigquery": {
"command": "node",
"args": ["/path/to/bigquery-analysis-mcp-server/build/index.js"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "/Users/{username}/.config/gcloud/application_default_credentials.json" // gcloud CLI利用時
}
}
}
}
認証設定
このサーバーはGoogle Cloud認証情報を使用します。以下のいずれかの方法で認証を設定してください:
gcloud CLIでログイン
gcloud auth application-default login
サービスアカウントキーを使用
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account-key.json"
使用例
検証付きクエリ実行
run_query_with_validation("SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus='hamlet' LIMIT 10")
まとめ
クエリの検証や実行の1TB制限により、予期せぬ高額な請求やデータの変更を防止しながら、BigQueryの強力な分析機能を活用できるので、ニーズが合えばぜひ使ってみてください。
Discussion