BigQuery MCP Server

by takuya0206
Verified
# BigQuery MCP サーバー仕様 ## 概要 このファイルは、Model Context Protocol (MCP) を使用して Google BigQuery にアクセスするためのサーバーを実装しています。このサーバーは、LLM(大規模言語モデル)がBigQueryのデータセット構造やデータを理解し、SQL クエリを実行できるようにするためのツールとリソースを提供します。 ## 主な機能 1. **認証と接続管理**: - Application Default Credentials (ADC) または サービスアカウントキーファイルによる認証 - プロジェクトID、ロケーション設定の管理 - 起動時の認証情報検証機能 2. **ツール(Tools)**: - query: 読み取り専用のBigQuery SQLクエリを実行 - list_all_tables: プロジェクト内のすべてのデータセット一覧を取得し、さらにその配下にあるテーブル名もすべて一覧で取得する - get_table_information: 特定のテーブルのスキーマ情報ならびにサンプルデータ(最大20行)を取得 - dry_run_query: クエリの実行計画と潜在的なエラーを確認(実際には実行しない) ## 特記事項 - セキュリティ上、SELECT クエリのみ許可(読み取り専用アクセス) - 大量のデータ処理を防ぐため、クエリ処理量は500GBにデフォルト制限 - テーブルにはパーティションフィルタが必須のものがある。`query` や `get_table_information` ではパーティションの指定を考慮したクエリを発行できるようにする - テーブルのスキーマだけでなくサンプルデータ(20行)も提供 データ返却時のサイズ制限を実装し、LLMのコンテキスト制限を考慮 ## パラメータ --project-id: Google Cloudプロジェクト ID(必須) --location: BigQueryロケーション(デフォルト: asia-northeast1) --key-file: サービスアカウントキーファイルのパス(オプション) --max-results: 1回のクエリで返却される最大行数(デフォルト: 1000) --max-bytes-billed: 1回のクエリで処理される最大バイト数(デフォルト: 500000000000、500GB) ## 必要な権限 roles/bigquery.user (推奨) または以下の両方: roles/bigquery.dataViewer roles/bigquery.jobUser # BigQuery MCP サーバー仕様 ## 概要 このファイルは、Model Context Protocol (MCP) を使用して Google BigQuery にアクセスするためのサーバーを実装しています。このサーバーは、LLM(大規模言語モデル)が BigQuery のデータセット構造やデータを理解し、SQL クエリを実行できるようにするためのツールとリソースを提供します。 ## 主な機能 1. 認証と接続管理 • Application Default Credentials (ADC) またはサービスアカウントキーファイルによる認証 • プロジェクトID、ロケーションなどの設定管理 • 起動時に認証情報の検証を実施(適切な権限があるか確認) 2. ツール(Tools) 1. query • 読み取り専用 (SELECT) の BigQuery SQL クエリを実行 • クエリ結果は --max-results(デフォルト 1000 行)まで取得 • --max-bytes-billed(デフォルト 500GB)を超えるクエリは実行不可 • パーティションテーブルの場合、パーティションフィルタを推奨 2. list_all_tables • プロジェクト内のすべてのデータセット一覧を取得し、各データセット配下にあるテーブル一覧もすべて取得 • データセット数およびテーブル数が多い場合にはページネーションを考慮 3. get_table_information • 特定のテーブルのスキーマ情報を取得 • サンプルデータ(最大 20 行)を合わせて取得 • パーティションテーブルの場合、サンプル取得時にはパーティション指定を考慮 4. dry_run_query • クエリの潜在的なエラーを確認 • `query` を使用する前にエラーを確認する ## 特記事項 • セキュリティ上、SELECT クエリのみ許可(書き込みやテーブル作成は不可) • 大規模クエリによる不要なコスト発生を防ぐため、--max-bytes-billed デフォルト 500GB に制限 • パーティション化されたテーブルを扱う場合、パーティションフィルタ(例: WHERE _PARTITIONDATE = '2025-01-01')を適切に指定する必要がある • ツールの呼び出し時には認証やパラメータの妥当性検証を行い、エラーを返す ## パラメータ • --project-id: Google Cloud プロジェクトID(必須) • --location: BigQuery ロケーション(デフォルト: asia-northeast1) • --key-file: サービスアカウントキーファイルのパス(オプション) • --max-results: 1 回のクエリで返却される最大行数(デフォルト: 1000) • --max-bytes-billed: 1 回のクエリで処理される最大バイト数(デフォルト: 500000000000, 500GB) ## 必要な権限 • 推奨ロール: roles/bigquery.user または、以下を組み合わせて付与 • roles/bigquery.dataViewer (テーブルデータの読み取り) • roles/bigquery.jobUser (クエリジョブの実行) 認証には上記権限が必要となるため、サービスアカウントまたは使用者のユーザーアカウントに付与しておきます。 ## エラーハンドリング • 認証エラー: キーファイルが不正、または ADC が利用不可の場合 • 権限エラー: 必要なロールが付与されていない場合 • クエリエラー: SQL 文が不正、または --max-bytes-billed を超える場合 • パーティションフィルタなしエラー: 必須パーティションテーブルなのにフィルタが指定されていない場合(必要に応じてアプリ側でガイド) • その他: データセットやテーブルが存在しない場合など 状況に応じて、MCP のレスポンスとして適切なエラーメッセージおよびステータスコードを返却します。 ## セキュリティ • サービスアカウントキーファイル は安全に保管し、パスワードや秘密鍵をログに出力しない • SELECT のみ を許可し、データ破壊や変更のリスクを抑える • 必要最小限のロール (Least Privilege) を付与 ## 実行方法 • Bun ランタイム で実行 • TypeScript + @modelcontextprotocol/sdk + Google BigQuery クライアントライブラリ (@google-cloud/bigquery など) を使用 • StdioServerTransport を利用して標準入出力で通信 • 実行例: ``` bun run index.ts \ --project-id=my-awesome-project \ --location=asia-northeast1 \ --key-file=/path/to/service_account_key.json \ --max-results=1000 \ --max-bytes-billed=500000000000 ``` # 生成プロンプト 以下のプロンプトを使用して、この BigQuery MCP サーバーを生成できます。 Google BigQuery にアクセスするための Model Context Protocol (MCP) サーバーを TypeScript で実装してください。このサーバーは、LLM が BigQuery のデータセット構造やデータを理解し、SQL クエリを実行できるようにするためのツールとリソースを提供します。 ## 技術要件 - Bun ランタイムを使用 - TypeScript で実装 - @modelcontextprotocol/sdk を使用 - @google-cloud/bigquery を使用して BigQuery と通信 - zod を使用してパラメータのバリデーション ## 機能要件 ### 認証と接続管理 - ADC またはサービスアカウントキーファイルを使用 - --project-id(必須)、--location(必須)などを受け取り、BigQuery に接続 - 起動時に認証情報・権限をチェック ### ツール(Tools) 1. query - SELECT クエリのみ実行 - --max-results で取得行数制限 - --max-bytes-billed で処理量制限 2. list_all_tables - プロジェクト内の全データセットおよびテーブル名を取得 3. get_table_information - テーブルスキーマとサンプルデータ(最大20行)を取得 - パーティションテーブルの場合はパーティションフィルタに対応 4. dry_run_query - クエリ発行前のエラーチェック ### エラーハンドリング - 無効なクエリ、過大な処理量、権限不足、存在しないテーブル等に適切に対処 ### セキュリティ - SELECT のみ許可 - --max-bytes-billed などでコスト暴走を防止 - サービスアカウントキーファイルの安全な管理 ## 実行方法 - Bun ランタイムで実行 - StdioServerTransport を使用して標準入出力で通信