Production-grade read/write MCP server for Google Ads API v25 with confirmation, audit, durable replay, and MCC customer isolation.
Server demonstrates solid naming conventions (verb-first, clear intent) and comprehensive parameter schemas with types and descriptions. Tool descriptions are present and actionable, averaging ~120 chars. However, output schemas are not formally documented in the code, and error handling lacks recovery guidance. The pending-action safety pattern is well-designed but not reflected in tool annotations. 11 tools evaluated; most follow composition principles (single responsibility), but some parameter relationships (e.g., target_cpa vs target_roas in create_app_campaign) could be more explicit.
Discard a pending action without racing an in-flight confirmation.
Execute one pending action exactly once within this server process.
Propose creating an app campaign (app installs or app engagement). Created PAUSED.
Propose creating a complete set of experiment arms atomically. Each arm needs name, control, and traffic_split. The control arm must have exactly one campaign_resource_name. Exactly one arm must be control and total traffic_split must equal 100. Partial failure is intentionally off.
Show every audit attempt recorded for one action id.
Read mutable customer-level auto-tagging and call-reporting settings.
Output schemas not formally documented. Tools return dicts (e.g., {'pending_actions': ...}, {'entries': ...}) but no JSON Schema definitions are visible in code. LLMs cannot reliably parse or chain results without explicit output type documentation.
Conditional parameter requirements not explicitly documented. create_app_campaign requires target_cpa OR target_roas depending on bidding_strategy_goal_type, but this dependency is not stated in parameter descriptions. LLMs may omit required fields.
Error handling lacks recovery guidance. No visible error responses or actionable error messages in tool implementations. When a tool fails (e.g., invalid customer_id, permission denied), LLMs receive no guidance on retry strategy or alternative actions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
Show recent confirmed/auto-approved mutation attempts and payloads.
List experiment arms, campaign membership, split, and draft campaigns.
List all proposed-but-not-yet-confirmed changes, across every tool.
Remove an experiment arm.
Propose updating mutable experiment-arm fields.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint attributes visible. This is critical for a server with mixed read/write/destructive tools, LLMs cannot infer safety properties without explicit annotations.
Pagination not implemented for list tools. list_pending_actions and list_experiment_arms return unbounded results. No limit, offset, or cursor parameters visible. Large result sets risk context window exhaustion.