📊

Gemini CLI extensions for BigQuery を利用してGemini CLIから自然言語でBigQueryに解析依頼

に公開

こんにちは、JetBrainsのJunieが値上がりして、Gemini CLIがメインになっているサントリーこと大橋です。

昨日(2025/09/24)、Gemini CLIの機能を拡張する新しいツール「Gemini CLI extensions for BigQuery」がリリースされました。

https://cloud.google.com/bigquery/docs/release-notes#September_24_2025

面白そうなので、この記事では、Gemini CLI extensions for BigQueryの導入方法と、自然言語を使ってBigQueryのデータを解析する具体的な使用法について解説していきます。

課題: 誰もがSQLを書けるわけではない

データドリブンな意思決定が重要視される現代において、BigQueryのようなデータウェアハウスに蓄積された膨大なデータを活用することは、ビジネス成長の鍵を握ります。しかし、そのデータを引き出すためには、多くの場合SQLの知識が不可欠です。

SQLは強力な言語ですが、その習得には専門的な学習が必要であり、組織内の誰もが自在に使いこなせるわけではありません。データアナリストやエンジニアに分析を依頼する手間や時間が、迅速な意思決定のボトルネックになることもしばしばです。

「このデータが今すぐ見たいのに、SQLが書けない...」
「簡単な集計なのに、誰かに頼まないといけない...」

このような課題から、「もっと手軽に、自然言語でデータと対話したい」というニーズは常に存在していました。

ぶっちゃけくっそ忙しいときに「〇〇なデータを取得して、資料にしておいて」って依頼されるのまじ辛い!

Gemini CLI extensions for BigQueryとは

この課題を解決するのが、今回登場した「Gemini CLI extensions for BigQuery」です。

https://cloud.google.com/bigquery/docs/develop-with-gemini-cli

これは、オープンソースの会話型AIエージェントであるGemini CLIに、BigQueryとの対話能力を付与する拡張機能で、Gemini CLI Extensions の仕組みを利用して提供されます。

BigQuery向けの拡張機能は、主に2つのコンポーネントから構成されています。

BigQuery Data Analytics extension

データの探索や、テーブル・データセットに関する情報の取得、自然言語での質問応答に使用されます。Gemini CLIが自然言語を解釈してSQLクエリを生成・実行するのを助けます。

提供されるツール:

  • データセットとテーブル情報:
    • get_dataset_info: データセットに関する情報を取得します。
    • get_table_info: テーブルに関する情報を取得します。
    • list_dataset_ids: プロジェクト内のすべてのデータセットを一覧表示します。
    • list_table_ids: データセット内のすべてのテーブルを一覧表示します。
  • 検索:
    • search_catalog: 特定のトピックに関連するテーブルを検索します。
  • SQL実行:
    • execute_sql: 自然言語プロンプトに基づいてSQLクエリを実行します。
  • 時系列予測:
    • bigquery_forecast: テーブルデータから指定された期間の数値を予測します。
  • 貢献度分析:
    • analyze_contribution: ある指標に対して各要因がどの程度貢献したかを分析します。

BigQuery Conversational Analytics extension

こちらは、Googleによって事前にホストされたサーバーサイドの分析エージェントを利用して、より高度なインサイトをデータから引き出すための拡張機能です。

提供されるツール:

  • 検索:
    • search_catalog: 特定のトピックに関連するテーブルを検索します。
  • 会話型分析:
    • ask_data_insights: データ分析に基づき、注力すべきは何か、その理由は何か、といったより深いインサイトを得ます。

これらのツール群により、ユーザーはSQLを意識することなく、チャットを通じてBigQueryのデータを探索し、高度な分析まで行うことが可能になります。

導入方法

導入は非常に簡単です。いくつかの前提条件を満たした上で、コマンドを一つ実行するだけです。

1. 前提条件

  • Google Cloudプロジェクトで以下のAPIが有効になっていること。
    • BigQuery API(bigquery.googleapis.com)
    • Dataplex Universal Catalog API (Cloud Dataplex API)(dataplex.googleapis.com)
    • Gemini for Google Cloud (cloudaicompanion.googleapis.com)
    • Gemini API (generativelanguage.googleapis.com)
    • Data Analytics API with Gemini (geminidataanalytics.googleapis.com)
  • 必要なIAMロール(BigQuery User, BigQuery Metadata Viewer, Gemini for Google Cloud Userなど)が付与されていること。

2. 環境変数の設定

Gemini CLIがBigQueryに接続するために、以下の環境変数を設定します。

export BIGQUERY_PROJECT="YOUR_PROJECT_ID"
export BIGQUERY_LOCATION="YOUR_BIGQUERY_LOCATION" #例: us
export BIGQUERY_USE_CLIENT_OAUTH=true

3. 拡張機能のインストール

目的に応じて、必要な拡張機能をインストールします。両方インストールすることも可能です。

BigQuery Data Analytics extension

gemini extensions install https://github.com/gemini-cli-extensions/bigquery-data-analytics

BigQuery Conversational Analytics extension

gemini extensions install https://github.com/gemini-cli-extensions/bigquery-conversational-analytics

これで準備は完了です。

使用例

それでは、実際に使ってみましょう。
geminiコマンドでインタラクティブモードを開始し、自然言語で質問を投げかけます。

まずはテーブルの検索をしてみます。

gemini
> ニューヨークのタクシー走行履歴 に関するテーブルはある? bigquery-public-dataデータセット

実行結果(コンソール出力)

✦ はい、承知いたしました。bigquery-public-data データセット内でニューヨークのタクシー走行履歴に関するテーブルを検索します。

  まず、new_york_taxi_trips というデータセットがありそうなので、その中に含まれるテーブルをリストアップしてみます。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✓  list_table_ids (BigQuery Data Analytics MCP Server) {"dataset":"new_york_taxi_trips","project":"bigquery-public-data"}                              │
 │                                                                                                                                                        │
 │    "taxi_zone_geom"                                                                                                                                    │
 │    "tlc_fhv_trips_2015"                                                                                                                                │
 │    "tlc_fhv_trips_2016"                                                                                                                                │
 │    "tlc_fhv_trips_2017"                                                                                                                                │
 │    "tlc_green_trips_2014"                                                                                                                              │
 │    "tlc_green_trips_2015"                                                                                                                              │
 │    "tlc_green_trips_2016"                                                                                                                              │
 │    "tlc_green_trips_2017"                                                                                                                              │
 │    "tlc_green_trips_2018"                                                                                                                              │
 │    "tlc_green_trips_2019"                                                                                                                              │
 │    "tlc_green_trips_2020"                                                                                                                              │
 │    "tlc_green_trips_2021"                                                                                                                              │
 │    "tlc_green_trips_2022"                                                                                                                              │
 │    "tlc_green_trips_2023"                                                                                                                              │
 │    "tlc_yellow_trips_2011"                                                                                                                             │
 │    "tlc_yellow_trips_2012"                                                                                                                             │
 │    "tlc_yellow_trips_2013"                                                                                                                             │
 │    "tlc_yellow_trips_2014"                                                                                                                             │
 │    "tlc_yellow_trips_2015"                                                                                                                             │
 │    "tlc_yellow_trips_2016"                                                                                                                             │
 │    "tlc_yellow_trips_2017"                                                                                                                             │
 │    "tlc_yellow_trips_2018"                                                                                                                             │
 │    "tlc_yellow_trips_2019"                                                                                                                             │
 │    "tlc_yellow_trips_2020"                                                                                                                             │
 │    "tlc_yellow_trips_2021"                                                                                                                             │
 │    "tlc_yellow_trips_2022"                                                                                                                             │
 │    "tlc_yellow_trips_2023"                                                                                                                             │
 ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ はい、bigquery-public-dataデータセットの中に、ニューヨークのタクシー走行履歴に関するテーブルが見つかりました。

  new_york_taxi_tripsというデータセットに、以下のようなテーブルが含まれています。

   * tlc_yellow_trips_2023
   * tlc_green_trips_2023
   * tlc_fhv_trips_2017
   * taxi_zone_geom

  tlc_yellow_tripsはイエローキャブ、tlc_green_tripsはグリーンキャブ、tlc_fhv_tripsはハイヤーの走行履歴データのようです。年ごとにテーブルが分かれています。

見つかりましたね。

次にこれらのBigQueryの一般公開データセットであるニューヨークのタクシー走行履歴(bigquery-public-data.new_york_taxi_trips)を使って、簡単な分析を依頼してみます。

> bigquery-public-data.new_york_taxi_trips の trips テーブルを利用して、時間帯(pickup_hour)別の平均乗客数(passenger_count)を教えて。

実行結果(コンソール出力)

承知いたしました。bigquery-public-data.new_york_taxi_trips データセットのテーブルを使って、時間帯別の平均乗客数を計算します。

  まず、どのタクシー(イエロー、グリーン、ハイヤー)のどの年のデータを使用しますか?特に指定がない場合は、tlc_yellow_trips_2022(2022年のイエローキャブ)のデー
  タを使用しますが、よろしいでしょうか?

  もしよろしければ、こちらのテーブルのスキーマを確認し、クエリを作成します。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✓  get_table_info (BigQuery Data Analytics MCP Server) {"table":"tlc_yellow_trips_2022","project":"bigquery-public-data","dataset":"new_york_taxi_trips"}  │
 │                                                                                                                                                            │
(中略)

✦ お待たせいたしました。tlc_yellow_trips_2022テーブルから、時間帯別の平均乗客数を算出しました。


  ┌──────────────────────┬─────────────────────────────────┐
  │ 時間帯 (pickup_hour) │ 平均乗客数 (average_passengers) │
  ├──────────────────────┼─────────────────────────────────┤
  │ 0                    │ 1.46                            │
  │ 1                    │ 1.47                            │
  │ 2                    │ 1.47                            │
  │ 3                    │ 1.46                            │
  │ 4                    │ 1.43                            │
  │ 5                    │ 1.35                            │
  │ 6                    │ 1.31                            │
  │ 7                    │ 1.33                            │
  │ 8                    │ 1.35                            │
  │ 9                    │ 1.36                            │
  │ 10                   │ 1.39                            │
  │ 11                   │ 1.41                            │
  │ 12                   │ 1.42                            │
  │ 13                   │ 1.43                            │
  │ 14                   │ 1.44                            │
  │ 15                   │ 1.45                            │
  │ 16                   │ 1.45                            │
  │ 17                   │ 1.44                            │
  │ 18                   │ 1.43                            │
  │ 19                   │ 1.44                            │
  │ 20                   │ 1.45                            │
  │ 21                   │ 1.47                            │
  │ 22                   │ 1.48                            │
  │ 23                   │ 1.47                            │
  └──────────────────────┴─────────────────────────────────┘


  結果を見ると、深夜から早朝にかけて平均乗客数が多く、朝6時頃に最も少なくなる傾向があるようです。その後、日中から夜にかけて再び増加しています。


このように、SQLを一切書くことなく、日本語の質問だけでデータ分析ができました。
このツール呼び出しでは、GeminiがSQLを作成し、execute_sql ツールを利用してBigQueryにクエリを実行しているようですね。
では今度は BigQuery側で自然言語を理解してSQL実行、結果返却を行ってくれる ask_data_insights を使ってみましょう。

> 同じ解析を ask_data_insights を利用して行ってみて

実行結果(コンソール出力)

✦ はい、承知いたしました。ask_data_insightsツールを利用して、同様の解析を行います。

  bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2022テーブルを対象に、「時間帯別の平均乗客数を、乗客数が0のデータを除外して計算する」という内容でリ
  クエストします。
 ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✓  ask_data_insights (BigQuery Conversational Analytics MCP Server) {"user_query_with_context":"時間帯別の平均乗客数を計算してください。乗車時間(pickup_datetim… │
(中略)
 ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ ask_data_insightsツールを使い、同様の解析を行いました。

  以下が、ask_data_insightsが生成したSQLクエリと、その実行結果です。

  生成されたSQLクエリ

   1 SELECT
   2   EXTRACT(HOUR FROM t0.pickup_datetime) AS pickup_hour,
   3   AVG(t0.passenger_count) AS average_passenger_count
   4 FROM `bigquery-public-data`.`new_york_taxi_trips`.`tlc_yellow_trips_2022` AS t0
   5 WHERE t0.passenger_count > 0
   6 GROUP BY pickup_hour
   7 ORDER BY pickup_hour;

  解析結果

  ┌──────────────────────┬─────────────────────────────────┐
  │ 時間帯 (pickup_hour) │ 平均乗客数 (average_passengers) │
  ├──────────────────────┼─────────────────────────────────┤
  │ 0                    │ 1.46                            │
  │ 1                    │ 1.47                            │
  │ 2                    │ 1.47                            │
  │ 3                    │ 1.46                            │
  │ 4                    │ 1.43                            │
  │ 5                    │ 1.35                            │
  │ 6                    │ 1.31                            │
  │ 7                    │ 1.33                            │
  │ 8                    │ 1.35                            │
  │ 9                    │ 1.36                            │
  │ 10                   │ 1.39                            │
  │ 11                   │ 1.41                            │
  │ 12                   │ 1.42                            │
  │ 13                   │ 1.43                            │
  │ 14                   │ 1.44                            │
  │ 15                   │ 1.45                            │
  │ 16                   │ 1.45                            │
  │ 17                   │ 1.44                            │
  │ 18                   │ 1.43                            │
  │ 19                   │ 1.44                            │
  │ 20                   │ 1.45                            │
  │ 21                   │ 1.47                            │
  │ 22                   │ 1.48                            │
  │ 23                   │ 1.47                            │
  └──────────────────────┴─────────────────────────────────┘

  ask_data_insightsは、結果の要約も提供してくれました。

  > このデータから、深夜から早朝にかけて(0時から4時頃)は平均乗客数がやや低く、日中から夕方にかけて(10時から16時頃)は比較的安定していることがわかります。また
  、夜間(21時から23時頃)は再び平均乗客数が増加する傾向にあります。

  ご覧の通り、execute_sqlで直接クエリを実行した結果と一致していますね。ask_data_insightsは、自然言語で質問するだけで、SQLの生成から結果の解釈まで自動で行ってく
  れる便利なツールです。

  他に何か分析したいことはありますか?

Gemini CLIがSQLを作成せず、BigQueryへ直接自然言語を利用して問い合わせて、結果を得ています。
ツールが多すぎるとGeminiがどのツールを使うべきか迷ったり、非効率なクエリを実行してしまう可能性を考えると、
SQLやテーブル構造を理解する必要がないユーザーは BigQuery Conversational Analytics extension だけインストールすれば十分かもしれません。

価格

Gemini CLI extensions for BigQueryの利用料金は、使用するツールによって異なります。

  • 追加費用なし:
    • get_dataset_info, get_table_info, list_dataset_ids, list_table_ids などのメタデータ取得ツール
    • search_catalog
  • BigQueryの標準料金が適用:
    • execute_sql, bigquery_forecast, analyze_contribution など、内部でクエリを実行するツール。これらのツールが消費するコンピューティングリソースに対して課金されます。
  • ask_data_insights:
    • このツール自体の利用は現在ベータ期間中のため無料ですが、ツールが内部で実行するBigQueryクエリについては、BigQueryの標準料金に従って課金されます。

基本的には、Gemini CLIの利用自体に直接の料金はかからず、バックエンドで動作するBigQueryのリソース使用量に応じてコストが発生すると理解しておくと良いでしょう。

まとめ

今回は、リリースされたばかりの「Gemini CLI extensions for BigQuery」について解説しました。

この拡張機能は、SQLという専門的なスキルセットを必要とせず、自然言語での対話を通じて誰もがデータにアクセスし、インサイトを引き出すことを可能にします。これにより、データ活用の民主化が大きく前進し、組織全体のデータリテラシー向上にも繋がるでしょう。

データアナリストはより高度な分析に集中でき、ビジネスユーザーは必要なデータを自ら迅速に手に入れることができる。そんな未来を感じさせる、非常に強力なツールだと感じました。

なお Gemini CLIでは公式Extensionが公開されています。(一気に公開された?)

https://github.com/gemini-cli-extensions

code-review extensionや security extension などかなり気になる拡張も存在するため、紹介していきたいと思います。

Discussion