MCP servers for BigQuery and Google Sheets integration in a GCP security monitoring pipeline. Includes independent MCP servers for BigQuery SQL execution and Google Sheets read/write operations, plus a conversational agent that connects to these servers.
Server exposes 6 tools with basic schemas and descriptions. All tools have input schemas with type definitions and descriptions present. However, descriptions are generic and lack LLM-optimized guidance on WHEN to use each tool vs alternatives. Parameter descriptions are minimal (e.g., 'Sheet tab name' lacks format/constraint details). No output schemas documented. Error handling returns raw exception text rather than actionable recovery guidance. Tools lack annotations (readOnlyHint/destructiveHint) despite clear risk profiles. Naming is verb-forward (execute_, list_, get_, read_, write_, flag_) but descriptions don't disambiguate overlapping tools (read_sheet vs write_metric both operate on Sheets). No pagination support despite list_tables potentially returning many results.
Run a read-only SELECT query against BigQuery. Use fully qualified table names: `project.dataset.table`. Destructive SQL (DROP, DELETE, INSERT, UPDATE...) is blocked.
Append a suspicious user alert to the 'alerts' tab in Google Sheets.
Return the column names and types for a given BigQuery table.
List all tables available in the my-gcp-project.security_monitoring BigQuery dataset.
Read all rows from a Google Sheets tab.
Append a metric row to the 'metrics' tab in Google Sheets. Use this to report pipeline results (DAU, failed login rate, etc.).
No output schemas documented. LLMs cannot predict response structure or plan downstream tool calls. execute_sql returns text; list_tables returns newline-delimited strings; get_table_schema returns 'name: type' pairs. Each format is different and undocumented.
Error handling returns raw exception text (e.g., 'ERROR: {e}') instead of actionable recovery guidance. LLM cannot determine if error is retryable, user-fixable, or fatal. No suggestions for next steps.
Missing tool annotations. execute_sql and list_tables are read-only; write_metric and flag_suspicious_user are destructive/write operations. No readOnlyHint or destructiveHint declared, forcing LLM to infer from description text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Parameter descriptions lack format/constraint details. 'tab' in read_sheet says 'Sheet tab name (e.g. metrics, alerts)', examples are not constraints. Should specify: enum of valid tab names, or regex pattern, or max length. LLM may hallucinate invalid tab names.
No pagination support. list_tables could return hundreds of tables; no limit, offset, or cursor parameters. Large result sets waste tokens and risk context window exhaustion.