BigQuery and data warehouse integration MCP server for querying client data, datasets, and tables
Server has 4 tools with basic descriptions and partial schemas. All tools are READ_ONLY BigQuery operations. Naming is clear (verb_noun pattern: execute_, get_). Descriptions exist but are generic (avg ~120 chars, below 194-char baseline). Critical gaps: no input schemas visible in source code (only parameter names/types inferred from docstrings), no output schemas documented, no error recovery guidance, SQL injection vulnerability in get_client_details (string interpolation in WHERE clause), no parameter validation or constraints. Tool definitions appear to be inferred from decorators rather than explicit schema registration.
Execute a custom BigQuery SQL query and return the results. Runs SQL queries against Google BigQuery, handling authentication and formatting results for easier processing.
Find BigQuery datasets associated with a specific Pulse client. Searches for datasets matching a client ID or name in the dataset names using the BigQuery INFORMATION_SCHEMA.SCHEMATA view.
Retrieve detailed information about Pulse clients from the data warehouse. Fetches client metadata including identifiers, enabled data sources, and repository information. You can search by either client ID or client name.
List all tables in a BigQuery dataset. Retrrieves table metadata including table names, types, creation time, and last modified time for a specified dataset.
SQL injection vulnerability: get_client_details and get_client_datasets use string interpolation (f-strings) to build WHERE clauses from user input without parameterization. Malicious input like client_id='1 OR 1=1' will execute arbitrary SQL.
No input schemas visible in source code. Tool definitions appear inferred from @mcp.tool() decorators and docstrings only. FastMCP may auto-generate schemas from type hints, but explicit JSON Schema with constraints (enums, min/max, patterns) is not visible. Cannot verify schema completeness.
No output schemas documented. Tools return dicts with 'success', 'results', 'error', 'message', 'code' fields, but LLM cannot know the structure of 'results' (list of dicts with what fields?). Downstream tool chaining is impossible without guessing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. Errors return generic messages ('Google API Error', 'Execution Error') without actionable next steps. LLM cannot determine if error is retryable, user-fixable, or fatal.
No pagination support. Tools return results without limit/offset parameters or total count. get_client_details hardcodes LIMIT 1000, risking context window exhaustion. No next_cursor or pagination guidance.