An MCP (Model Context Protocol) server + standalone agent SDK for the Google Ads API. Works as an MCP server with Claude Desktop, Claude Code, Cursor, and any MCP client. Works as a standalone agent via the Anthropic API.
Google Ads MCP demonstrates strong tool design with consistent naming conventions (verb-noun patterns: get_, list_, update_, execute_), comprehensive parameter descriptions, and well-structured input schemas. All 14 tools have explicit descriptions (average ~180 chars, within the 34-392 baseline). Input schemas are visible and typed for all tools. Key strengths: idempotent read operations with clear purposes, dry-run pattern for write operations (confirm=True gates execution), and hierarchical resource models (customer_id, campaign_id, ad_group_id). Weaknesses: output schemas are not explicitly documented in source; error handling guidance is minimal; tool descriptions focus on business value but lack LLM-specific decision guidance (when to choose get_campaign_performance vs execute_gaql); write operations lack confirmation messages showing what would change.
Execute any Google Ads Query Language (GAQL) query.
Return competitive auction insights — impression share, overlap rate, position above rate, and outranking share for competing domains. This is the primary competitive intelligence tool. Shows where your ads appear relative to competitors in the same auctions.
Return campaign performance metrics for the last N days. Returns cost in both micros and currency units for convenience. Results sorted by spend descending.
Return account change history — who changed what, when, and what it changed from/to. Invaluable for audits, debugging performance drops, and tracking unauthorized changes.
Return campaign performance segmented by device — MOBILE, DESKTOP, TABLET. Use this to identify bid adjustment opportunities and diagnose mobile vs. desktop conversion rate gaps.
Output schemas not documented in source code. Tools return data but return type structure is not explicitly declared. LLMs cannot see what fields to expect (e.g., does get_campaign_performance return cost_micros and cost_dollars both, or just one?). This violates pattern:tool requirement for documented output types.
Error handling lacks recovery guidance. No visible error messages that tell LLMs what to do next (pattern:recovery-guide). For example, execute_gaql will fail on invalid GAQL syntax, but no guidance is provided. LLM receives raw Google Ads API error rather than actionable recovery steps.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 32 | - | v1 |
Return the GAQL (Google Ads Query Language) reference guide. Call this before writing complex queries to ensure correct field names, operators, and resource relationships. Avoids the most common GAQL errors (wrong keyword field names, unsupported CONTAINS operator, cost field paths).
Return performance segmented by geographic location. Use to identify top-performing cities/regions, find areas to exclude, and discover geo expansion opportunities.
Return the recommended workflow for using Google Ads MCP tools. Provides a step-by-step guide: account discovery → currency check → data retrieval → custom queries. Good first call when starting a new analysis session.
Return customer IDs directly accessible by the authenticated user. These IDs can be used as the `customer_id` parameter in all other tools. For MCC (manager) accounts, use list_accounts() to also see child accounts.
List all accessible Google Ads accounts including MCC sub-accounts. Returns a structured dict with account metadata (id, name, is_manager, level, parent_id). For manager (MCC) accounts, sub-accounts are fetched and included up to two levels deep.
Pause or enable an ad group. Default is DRY RUN — shows preview. Pass confirm=True to execute.
Update a campaign's daily budget. Default is DRY RUN — shows preview. Pass confirm=True to execute.
Pause or enable a campaign. Default is DRY RUN — shows preview. Pass confirm=True to execute.
Update the CPC bid for a specific keyword. Default is DRY RUN — shows preview. Pass confirm=True to execute.
Tool descriptions lack LLM decision guidance. Descriptions state WHAT tools do but not WHEN to use them vs alternatives. For example, get_campaign_performance and execute_gaql both return performance data, but no guidance explains which to choose. Should be: 'Use this for standard metrics. Use execute_gaql for custom field combinations.'
Write operations (update_campaign_budget, update_campaign_status, update_ad_group_status, update_keyword_bid) use dry-run pattern but do not document what the dry-run response contains. LLM cannot preview exactly what will change before setting confirm=True. Missing confirmation messages violates pattern:confirmation-request.
Parameter dependencies not documented. For example, login_customer_id is optional across all tools but its relationship to customer_id is not explained. When should it be used? Does it override customer_id or supplement it? LLMs will guess, causing silent errors.
Pagination not supported on list operations. list_accessible_customers and list_accounts return unspecified result sizes. If an MCC has hundreds of accounts, results could blow context window. No limit, offset, or cursor parameters visible.
Tool annotations absent. No readOnlyHint, destructiveHint, or idempotentHint declared on tool definitions. LLMs cannot programmatically identify which tools are safe to retry (idempotent reads) vs dangerous (writes). This is a current-spec requirement (2026-07-28).