Model Context Protocol (MCP) server for AI agents to manage ad campaigns across Google, Meta, LinkedIn, Microsoft, Reddit, TikTok, and more. Create campaigns, adjust budgets, generate creatives, and pull performance data through natural conversation.
The server defines 6 tools with explicit schemas and descriptions. Tool naming follows verb_noun conventions (list_, create_, pause_, update_). Descriptions are detailed and context-rich, particularly for the creative campaign tools which include platform-specific guidance (e.g., 'Provide 11-15 headlines, 15 recommended' for search campaigns). However, there are notable gaps: (1) output schemas are entirely undocumented, no response structure is defined for any tool, forcing LLMs to guess what fields will be returned; (2) parameter relationships are under-specified (e.g., which geo_targets format is accepted?); (3) no error handling guidance is visible in descriptions; (4) no documentation of idempotency or retry semantics for destructive operations. The tools are well-named and descriptions are above-average length (avg 250+ chars), but lack of output documentation and error guidance are significant quality gaps for production use.
Create a Google Ads Display campaign with responsive display ads. Supports image uploads from URLs.
Create a Google Ads Performance Max campaign. Requires images, headlines, descriptions, and a business name.
Create a Google Ads Search campaign with an ad group, responsive search ad, and keywords — all in one atomic request. IMPORTANT — creative floor: supply 11-15 headlines (15 recommended, max 30 chars each) and 4 descriptions (max 90 chars each), echoing your target keywords across at least 5 headlines. The API accepts as few as 3 headlines / 2 descriptions, but ads built near that minimum score 'Poor' on Google Ad Strength, get throttled in the auction, and may be rejected by the platform — treat 11 headlines / 4 descriptions as the real minimum. Fewer than 3 headlines or fewer than 2 descriptions will cause the campaign to be rejected before any API call is made.
List campaigns for ONE ad platform. `platform` is required -- this tool does not aggregate across platforms. Returns campaign name, status, budget, and performance metrics.
CRITICAL: Output schemas are entirely undocumented. No tool defines what fields its response will contain, their types, or structure. LLMs cannot plan downstream tool calls or extract data reliably.
HIGH: Destructive operations (create_*, pause_, update_) lack error handling guidance in descriptions. No direction given to LLMs on what to do if validation fails, resource not found, permission denied, or quota exceeded.
HIGH: Parameter format specifications are incomplete. geo_targets format is mentioned in text ('2840' for US) but not enforced in schema. Image URLs, campaign IDs, and budget amounts lack format/constraint documentation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Pause a campaign by ID. Works across all connected platforms.
Update the daily budget for a campaign.
MEDIUM: Creative guidance inconsistencies. create_search_campaign prescribes 11-15 headlines as practical minimum (with detailed rationale). create_display_campaign and create_pmax_campaign mention minimums in text but do not enforce them in schema (no minItems: 11 for headlines in pmax).
MEDIUM: Idempotency and retry semantics undocumented. No tool description indicates whether re-running with identical inputs is safe (create operations may be idempotent with campaign name as key; pause/update operations likely are). Agents need this to handle retries safely.
MEDIUM: Pagination and result limits not documented. list_campaigns accepts a limit parameter but no guidance on default, maximum, or total count in response. Large campaign lists could overflow context.
LOW: Natural identifiers. Tools require platform-specific campaign_id format but do not document how users obtain these IDs. Should list_campaigns return IDs in a format that pause_campaign and update_campaign_budget accept directly?