Protection-first BigQuery MCP server with a dry-run budget gate and structured errors
BigQuery MCP has 6 tools with consistent naming (verb_noun pattern: list_*, describe_*, query, dry_run, get_usage) and clear descriptions (avg ~60 chars). All tools are READ_ONLY, reducing risk. However, parameter descriptions are minimal or absent in visible schemas. Input schemas show basic structure but lack depth, no enums, no min/max constraints, no format specifications. Output schemas are not documented. Error handling is mentioned (errorReporting=true) but recovery guidance is not visible in tool definitions. Tool composition is sound (each does one thing), but parameter validation rules are not stated in descriptions.
Describe a table schema and metadata
Dry-run a query to estimate bytes and validate syntax without executing
Get documentation of all error codes and tool usage
List datasets in the billing project
List tables in a dataset
Execute a SELECT query with dry-run validation, budget gating, and result pagination
Parameter descriptions missing or minimal. 'filter' in list_datasets has no guidance on syntax/format. 'params' in query/dry_run lacks type info (array of what?). LLMs cannot infer parameter semantics from names alone.
No output schemas documented. Tools return results but LLMs have no visibility into response structure (fields, types, pagination). Agents cannot plan downstream calls or extract data reliably.
No input constraints (enums, min/max, patterns). 'max_rows' in query has no bounds, LLM could pass 1000000. 'filter' in list_datasets has no format guidance. Free-form strings invite hallucinated values.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
Error recovery guidance not visible in tool definitions. errorReporting=true but descriptions do not explain what errors are retryable, what requires user intervention, or how to recover from common failures (e.g., quota exceeded, invalid SQL).
Tool 'get_usage' is vague. Description says 'Get documentation of all error codes and tool usage' but does not explain when/why an LLM should call it or what it returns. Unclear if it's a discovery tool or a reference.