MCP server for Google BigQuery that enables querying, managing datasets, and retrieving table schemas
Server has 7 tools with complete input schemas and basic descriptions. However, parameter descriptions are minimal or missing (e.g., 'projectId' lacks context on when it's required vs. optional), and output schemas are not documented. Tool names follow verb_noun convention (execute_query, get_job_status, list_datasets) but lack specificity about what distinguishes similar tools (execute_query vs. execute_query_with_results). Error handling and recovery guidance are absent. No tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications. Descriptions average ~60 chars, below the 194-char baseline for A+ tools.
Cancel a running BigQuery job
Submit a SQL query to BigQuery, optionally as dry-run
Submit a SQL query to BigQuery and return results immediately
Page through results
Poll job execution state
Retrieve schema for a table
Enumerate datasets visible to the service account
Parameter descriptions are minimal. 'projectId' and 'location' lack context on when they override defaults vs. are required. 'params' (query parameters) has no guidance on format or constraints.
Output schemas are not documented. LLMs cannot infer what fields execute_query returns (job ID? status? error details?). This breaks tool chaining, agents cannot extract jobId to pass to get_job_status without guessing.
No error handling guidance. Tools lack recovery hints (e.g., 'If query times out, try reducing maxRows or adding LIMIT clause'). Agents receive raw errors with no actionable next steps.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | <=2025-11-25 | v2 |
Tool annotations missing. cancel_job is destructive (WRITE risk) but has no destructiveHint. execute_query and get_job_status are read-only but lack readOnlyHint. Agents cannot infer safety/idempotency.
execute_query vs. execute_query_with_results naming is ambiguous. LLMs may conflate them. Consider rename to execute_query_async (returns job ID) and execute_query_sync (returns results immediately) for clarity.