Minimal MCP server exposing Google Search Console sites.list and searchAnalytics.query (read-only, OAuth as your own account)
Two tools with clear, actionable descriptions and well-structured Zod schemas. Tool names follow verb_noun convention (list_sites, query_search_analytics). Descriptions are 150 - 250 chars, within the 10 - 1024 baseline. All parameters have type definitions and descriptions. However, output schemas are not documented, responses are JSON-stringified without field-level documentation. Error handling returns isError flag but lacks recovery guidance (e.g., 'Try list_sites first' for invalid siteUrl). No tool annotations (readOnlyHint, idempotentHint) despite both being read-only. Missing parameter validation examples (e.g., date format enforcement, siteUrl format hints).
List all Search Console properties (sites) your account can access. Call this first to discover the exact siteUrl values to pass to query_search_analytics.
Query Google search performance data (clicks, impressions, CTR, average position) for one site over a date range, optionally grouped by dimensions like query, page, country, device, or date. Returns rows sorted by clicks (descending), or by date (ascending) when grouped by date.
Output schemas not documented. Responses are JSON-stringified without field-level documentation. LLMs cannot plan downstream operations or extract specific fields reliably.
Error messages lack recovery guidance. 'Error querying {siteUrl}: {err.message}' does not tell the LLM what to do next. Should include hints like 'Call list_sites() to verify the siteUrl format.'
No tool annotations despite both tools being read-only. Missing readOnlyHint and idempotentHint annotations that would signal to agents these are safe to retry.
Date format validation not enforced. Parameter descriptions mention 'YYYY-MM-DD format (Pacific time)' but no regex pattern or validation. LLMs may pass invalid dates; errors will be cryptic.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
siteUrl parameter lacks format guidance. Description says 'exactly as returned by list_sites' but does not explain the two valid formats (https://example.com/ vs sc-domain:example.com). LLMs may guess wrong.