Bq Readonly Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Bq Readonly Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
🔍 Read-only BigQuery MCP server with auto-LIMIT, dry-run cost guard, and ADC auth. Safe for LLMs to query your BigQuery — no DML, no surprises, no runaway bills.
LLMs connected to BigQuery can accidentally scan terabytes if the MCP layer lets them run arbitrary SQL. bq-readonly-mcp prevents that by design: every query goes through a strict SELECT/WITH-only validator, gets an automatic LIMIT injected before it runs, and is priced via a dry-run before any bytes are billed. If the estimated cost exceeds the cap (default 1 GB), the query is refused outright — before a single byte hits your bill.
The server runs as a local stdio process under your OS account, uses Application Default Credentials, and exposes zero write operations. There is no INSERT, no UPDATE, no DELETE, no DDL — anywhere in the codebase. The only thing it can do is read, and it does that safely.
| Tool | What it does | Use when… |
|---|---|---|
list_datasets | List datasets in the project, with optional name filter | Starting exploration, finding what exists |
list_tables | List tables in a dataset, with optional name filter | Drilling into a specific dataset |
get_table_metadata | Table type, partitioning, clustering, row count, size | Checking if a table is large before querying |
describe_columns | Column schema for a table (no data scan) | Understanding the shape of a table cheaply |
get_table | Full bundle: metadata + columns + 3 sample rows | Onboarding to an unfamiliar table |
run_query | SELECT-only with auto-LIMIT, dry-run cost guard, and bytes-billed cap | Running ad-hoc SQL |
estimate_query_cost | Standalone dry-run — returns estimated bytes and USD cost | Checking query cost before running it |
Recommended — run directly via `uvx` (no install needed):
uvx bq-readonly-mcp --project your-project-id --location USFrom PyPI (persistent install):
uv tool install bq-readonly-mcp
bq-readonly-mcp --project your-project-id --location USFrom source:
git clone https://github.com/mariadb-RupeshBiswas/bq-readonly-mcp.git
cd bq-readonly-mcp
uv run bq-readonly-mcp --project your-project-id --location USFor a full walkthrough (five steps from zero), see [docs/QUICKSTART.md](docs/QUICKSTART.md).
The server uses Application Default Credentials (ADC). Run this once:
gcloud auth application-default loginFor non-interactive environments (CI, containers, service accounts), pass a key file:
bq-readonly-mcp --project your-project-id --key-file /path/to/service-account.jsonOr set GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json.
Full walkthroughs for each client — config file paths, JSON snippets, restart steps — are in [docs/EDITOR_SETUP.md](docs/EDITOR_SETUP.md).
Covered clients: Claude Code, Claude Desktop, Cursor, Windsurf, GitHub Copilot (VS Code), Cline, Continue.dev, Zed, Gemini CLI.
Claude Code — quick example:
claude mcp add --transport stdio bq-readonly -- \
uvx bq-readonly-mcp --project your-project-id --location USOr add to ~/.claude.json (global) or .mcp.json (project-level):
{
"mcpServers": {
"bq-readonly": {
"command": "uvx",
"args": [
"bq-readonly-mcp",
"--project", "your-project-id",
"--location", "US"
]
}
}
}Ready-to-paste configs for all supported clients are in mcp-config-examples/.
All flags can also be set via environment variables. CLI flags take precedence over env vars; env vars take precedence over defaults.
| CLI flag | Env var | Default | Description |
|---|---|---|---|
--project | GCP_PROJECT_ID | _(required)_ | GCP project to query |
--location | BIGQUERY_LOCATION | US | BigQuery processing location |
--datasets | BIGQUERY_ALLOWED_DATASETS | _(none — all allowed)_ | Space-separated dataset allowlist; comma-separated in env var |
--default-limit | BIGQUERY_DEFAULT_LIMIT | 50 | Rows injected by auto-LIMIT |
--max-limit | BIGQUERY_MAX_LIMIT | 10000 | Hard cap on per-query LIMIT |
--max-bytes-billed | BIGQUERY_MAX_BYTES_BILLED | 1073741824 (1 GB) | Per-query bytes-billed cap |
--sample-rows | BIGQUERY_SAMPLE_ROWS | 3 | Rows returned by get_table preview |
--key-file | GOOGLE_APPLICATION_CREDENTIALS | _(uses ADC)_ | Path to service-account JSON |
SELECT or WITH, or that contains DML/DDL keywords (INSERT, UPDATE, DELETE, DROP, CREATE, MERGE, …).LIMIT N is injected if absent. The caller can raise it up to --max-limit (default 10,000).run_query call first runs a dry-run to estimate cost. Queries exceeding --max-bytes-billed are refused before any bytes are billed.--datasets flag restricts access to named datasets. A startup warning is logged when unset.maximumBytesBilled is also set on the real job as a server-side backstop.Full details and threat model → SECURITY.md
These are intentional omissions. v0.1 focuses on safe, read-only schema exploration and SQL queries.
| Feature | bq-readonly-mcp | pvoo/bigquery-mcp ecosystem |
|---|---|---|
| Read-only enforced | ✅ validator + zero write tools | Varies by fork |
| Dry-run cost guard | ✅ refuses over-budget queries | Not standard |
| Auto-LIMIT injection | ✅ default 50, cap 10,000 | Not standard |
| Dataset allowlist | ✅ optional --datasets | Not standard |
| ADC auth | ✅ | ✅ |
| Vector / embedding search | No (v0.1) | Some forks |
| PyPI package | ✅ bq-readonly-mcp | Varies |
# Install with dev deps
uv sync --extra dev
# Run unit tests (fast, no BigQuery required)
uv run pytest tests/unit/ -q
# Run integration tests (requires ADC + BigQuery access)
uv run pytest -m integration -q
# Lint
uv run ruff check src tests
# Type check
uv run mypy srcMIT — see LICENSE
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.