Read-only BigQuery tools for plain-language data questions, with a cost gate on every query
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A read-only Model Context Protocol server over
Google BigQuery. It lets an AI client (Claude Code, Claude Desktop, β¦) answer
plain-language data questions by discovering schema and running SELECT queries.
The AI does the natural-language β SQL translation; this server just safely executes against BigQuery under your own Google credentials.
data-platform-mcp| Tool | Purpose | Cost |
|---|---|---|
list_datasets | List datasets in the project | free |
list_tables | List tables/views in a dataset | free |
get_table_schema | Columns (nested paths expanded), partitioning, size, row count | free |
check_table_freshness | When each table was last written β catches stale sources | free |
list_environments | Which BigQuery environments are configured, and the default | free |
list_scheduled_queries | Which scheduled query writes a table, and whether it is disabled or failing | free |
get_scheduled_query | One query's SQL, destination and recent runs | free |
run_query | Run a validated, read-only SELECT and return rows | scans data |
Only run_query costs anything, so the discovery tools are the ones to spend
first. Two of them exist to prevent specific, repeated mistakes:
get_table_schema reports partitioning from table metadata, never from
column names. A table with a partition_date column may not be partitioned
β in which case no WHERE clause reduces the scan and every query reads the
whole table. The response flags this explicitly when the table is large.check_table_freshness finds tables that stopped being written to without
being dropped. Those return stale data rather than an error, which is the
failure mode nobody notices.list_scheduled_queries says why. A stale table is usually a scheduled
query that was disabled or is failing, and that lives in a different API
(BigQuery Data Transfer) needing roles/bigquerydatatransfer.viewer. Without
that role the two tools return an error naming it and everything else works
normally. Most scheduled queries declare no destination because they write
with DDL, so the target is read out of the SQL and reported as
writes_to_from_sql β a heuristic, labelled as one.One server answers questions about several targets β a warehouse and its
staging copy, or two regions of the same project. Every tool takes an optional
environment; omitting it uses the default.
See config.toml.example for every setting, or set
BQ_MCP_ENVIRONMENTS to the same structure as JSON. A single BQ_PROJECT
still works unchanged β it becomes one environment named default.
An environment can be named by its own name, an alias, the built-in shorthands
(prod, stg, dev, live) or its project id. An unknown name is an
error naming the valid options, never a silent fall back to the default: a typo
that answered a production question from staging would be invisible in the
reply. Every result echoes back the environment it came from.
Regions are why this matters most here. BigQuery cannot query across locations,
and its error for trying names neither location, so it reads as a missing
table. One environment per location; doctor reports which datasets are where.
The SELECT-only guard and the readOnlyHint annotations are promises about
this code. Pointing the server at a service account that holds only
roles/bigquery.jobUser and a dataset-scoped roles/bigquery.dataViewer makes
it a fact about the credentials β enforced by IAM whatever the code does, and
whatever your own roles allow:
Creates the account, grants those two roles, and gives you
roles/iam.serviceAccountTokenCreator on it so the server can impersonate it.
Add --dry-run to see the commands first; it is safe to re-run.
With --datasets, the dataset allowlist stops being an if statement in this
process and becomes a grant Google enforces.
Terminal.app is not Xcode. It ships with every Mac. What does not ship is
the Xcode Command Line Tools, and an analyst's laptop usually has neither
those nor Homebrew. Nothing here needs them β but it is easy to trip over by
accident, because git, make, clang and the stock /usr/bin/python3 are
stubs for that bundle: running any of them pops a system dialog offering to
install about a gigabyte of developer tooling.
None of the commands below invoke one. They use only utilities macOS already
has β curl, tar, sh, uname β because both installs are self-contained:
| Install | Why it needs nothing else |
|---|---|
uv | A standalone binary. Its installer never mentions Python, and it downloads its own to run the server. |
| Google Cloud CLI | The macOS tarball bundles its own Python (.install/bundled-python3-unix-darwin-*). |
The whole terminal requirement is the three blocks below, once.
Typically /Users/<you>/.local/bin/uvx.
Pick the build for your chip β uname -m prints arm64 for Apple Silicon,
x86_64 for Intel:
Avoid brew install --cask google-cloud-sdk: Homebrew itself requires the
Command Line Tools, which is the thing this section exists to avoid.
This writes a credentials file that the Google libraries read directly.
gcloud does not need to be on your PATH afterwards β it is needed once,
here. That is why a GUI-launched Claude Desktop can query BigQuery even though
it cannot see your shell.
Your account needs BigQuery Job User on the project the query runs in, and BigQuery Data Viewer on each dataset it reads β often a different project.
Then register with your client: Claude Desktop or Claude Code.
If even that is too much, an admin can do the credential half centrally and
the analyst installs nothing but uv β skipping step 2 and step 3 entirely.
(Nothing about this is macOS-specific; it works the same on any OS.)
The analyst saves that file and points the config at it:
The trade-off is real and worth stating. A key file is a long-lived
credential sitting on a laptop, where gcloud auth application-default login
issues short-lived tokens tied to a person. It is defensible here because the
account created by setup --datasets can only read the datasets you name, and
because a key can be revoked centrally the moment a laptop is lost β but it is
strictly weaker, and it is a per-analyst secret, so do not put it in a shared
config file or a repository.
The same two installs, with no equivalent of the Command Line Tools problem:
Then check it worked and register with your client.
Not verified end to end. The download URLs and install locations below were checked; the flow itself has not been run on a Windows machine. CI tests Linux only. Treat this as a careful derivation, not a tested recipe β and please open an issue if a step is wrong.
In PowerShell:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/bigquery-data-platform)<a href="https://allmcps.com/mcp/bigquery-data-platform"><img src="https://allmcps.com/api/badge/bigquery-data-platform?style=directory" alt="BigQuery Data Platform on AllMCPs" /></a>