Multi-tenant MCP server for Google Search Console with per-user OAuth credentials
Server has 7 well-named tools with complete input schemas and descriptions. Tool names follow verb_noun pattern (search_analytics, list_sites, get_top_*). All parameters have type definitions and descriptions. However, output schemas are not formally documented in the code, responses are constructed ad-hoc in return statements. Error handling is minimal; no recovery guidance or actionable error messages. Parameter descriptions are good (60-150 chars) but lack constraint details (e.g., no explicit enum for search_type values, no min/max for row_limit). Missing tool annotations (readOnlyHint, destructiveHint). All tools are read-only, which is appropriate, but this should be declared.
Get top countries for a site in a date range.
Get top devices for a site in a date range.
Get top pages for a site in a date range.
Get top queries for a site in a date range.
List all verified sites in Search Console.
Run a custom Search Console query with full control over all parameters.
Compare two date ranges side by side for any dimensions. Returns rows with period1 and period2 metrics plus calculated changes.
Output schemas not formally documented. Tools return dicts with fields like 'rows', 'row_count', 'response_aggregation_type' but no schema definition visible in code. LLMs cannot plan downstream operations without knowing return structure.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 7 tools are read-only and idempotent, but this is not declared in tool metadata. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Parameter constraints not formalized as enums or patterns. 'search_type' accepts 'web', 'image', 'video', 'news', 'discover', 'googleNews' but is defined as free-form string. 'aggregation_type' accepts 'auto', 'byPage', 'byProperty' but no enum constraint. LLMs may hallucinate invalid values.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Error handling absent. No try-catch blocks visible; no actionable error messages. If site_url is invalid or credentials fail, the raw API error is returned. Agents receive no guidance on recovery (e.g., 'Call list_sites() first to find valid site URLs').
Numeric parameter bounds not specified. 'row_limit' defaults to 1000, max 25000, but description lacks min/max constraints. 'limit' in get_top_* tools defaults to 100 with no bounds stated. LLMs may pass invalid values.