A Google Ads MCP server with read AND write access: GAQL reporting plus campaign, budget, ad group, bid, and keyword management — with a validate-only dry run on every write.
Server has 9 tools with consistent naming (verb_noun pattern: list_*, search, ads_whoami) and descriptions present for all. However, descriptions are often generic or lack actionable context. Parameter schemas are defined but sparse, many lack type constraints, enums, or validation guidance. Output schemas are not documented. Error handling exists but is minimal. No tool annotations (readOnlyHint, destructiveHint). The 'search' tool accepts free-form GAQL, which is powerful but risky without input validation or query examples in descriptions. Overall: functional but below production baseline.
Show how this server is configured (login customer id, developer-token presence — masked) and list the Google Ads accounts it can access. Use this first to verify credentials and access.
Report per-campaign performance (impressions, clicks, cost, conversions) between two dates (YYYY-MM-DD), highest spend first.
List the resource names of the Google Ads customers this login can access. Each looks like 'customers/1234567890'; the digits are the customer id.
List ad groups (optionally filtered to one campaign) with id, name, status, type, and CPC bid.
List ads (optionally filtered to one ad group) with id, type, and status.
List campaign budgets with id, name, amount (micros), and delivery method.
No output schemas documented. Tools return dicts but LLMs cannot predict field names, types, or structure. Breaks downstream tool chaining and forces agents to guess at response shape.
search() accepts free-form GAQL query string with no validation, constraints, or injection guards. LLMs can pass malformed queries or attempt SQL-like injection. Needs input validation and example queries in description.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 9 tools are read-only but this is not declared in the tool definition. Agents cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
List campaigns with id, name, status, channel type, and budget id.
List keyword criteria (optionally filtered to one ad group) with text, match type, status, and the criterion id.
Run a GAQL (Google Ads Query Language) query and return the rows. This is the general-purpose read tool — anything reportable in Google Ads can be fetched here. Example query: "SELECT campaign.id, campaign.name, campaign.status, metrics.impressions, metrics.clicks, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_30_DAYS ORDER BY metrics.cost_micros DESC".
Parameter descriptions are minimal. 'customer_id' appears in 8 tools but is never described as 'digits only' or 'format: 1234567890'. 'query' in search() lacks guidance on GAQL syntax or common mistakes.
No pagination support. list_* tools return all results without limit or offset. Large accounts could return thousands of items, exhausting context window. Needs limit/offset params and total count in response.