Official MCP (Model Context Protocol) server for VibeAds — talk to your Google Ads account from Claude Desktop, Cursor, or any MCP-compatible client. Built for local service businesses (plumbers, HVAC, electricians, roofers, and 33 more categories).
VibeAds MCP exhibits strong naming conventions (verb_noun pattern across all 12 tools) and comprehensive parameter descriptions. Tool descriptions are detailed and context-rich (avg ~180 chars), exceeding baseline minimums. Input schemas are fully visible with proper JSON Schema structure, enums, and type definitions. However, output schemas are not documented in the source, LLMs cannot predict response structure. Error handling guidance is absent; tools do not indicate recovery paths or error categories. No tool annotations (readOnlyHint/destructiveHint) despite clear read/write distinction. Missing idempotency guarantees for write operations (generate_strategy, apply_strategy, approve_recommendation) that agents may retry.
Turn a COMPLETED generate_strategy preview into a real draft campaign, creating the campaign plus its ad groups, keywords, targeting, ad copy and extensions. Call this after get_strategy_status reports status 'completed', passing the same jobId. This is the required step between generating a strategy and publishing it: request_publish needs a campaignId, which only exists once the strategy is applied. Costs 6 VibeAds credits plus 3 per ad group for image generation. Creates rows only — the campaign is a DRAFT, is not live, and spends no ad money. Each preview can be applied once. A second call with the same jobId does NOT succeed: it fails with an error naming the campaignId that preview already created — pass that campaignId to request_publish rather than calling generate_strategy again.
Approve and execute ONE already-diagnosed optimization recommendation inside VibeAds' safety guardrails (blast-radius caps, rate limits, auto-rollback if metrics worsen). Other pending recommendations on the session stay pending — approving one never rejects or executes the rest.
Polls the status of a publish approval created with request_publish: pending → approved → executing → executed (or rejected / expired / failed). Approval itself can only happen in the user's browser.
Preview a DRAFT campaign strategy server-side: keywords, ad copy, and 3+ ad groups tailored to a service category, budget, and locations. Costs 13 VibeAds credits. Returns a jobId — poll get_strategy_status with that jobId, then call apply_strategy with the same jobId to turn the finished preview into a real draft campaign. This step is a preview only: it creates no campaign, publishes nothing, and spends no ad money.
Output schemas not documented. LLMs cannot predict response structure for any tool, forcing them to reason about unknown fields and risking context loss on chaining calls.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Write tools (generate_strategy, apply_strategy, approve_recommendation, request_publish) lack explicit destructive markers; read tools lack readOnlyHint. Agents cannot distinguish safe from risky operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Compute a 0-100 account health score across 6 dimensions (Tracking, Keywords, Budget, Creative, Targeting, Performance) by rolling up the latest diagnostics from all campaigns. Returns a letter grade A-F and per-dimension breakdown. Optionally scope to a single campaign.
Get a detailed view of a single VibeAds campaign: budget, bidding strategy, ad groups, targeted locations, landing pages, last 7 days of performance metrics (impressions, clicks, CTR, CPC, spend, conversions, CPA), and any active diagnostics.
Return the full list of active diagnostics across all campaigns with severity (critical / high / medium / low), affected metric, current value vs benchmark, and recommended action. Can filter by severity and scope to a specific campaign.
Analyze search terms from the last N days to find wasted spend (high-cost terms with zero conversions) and winning terms (high conversion rate). Returns a ranked list of terms to negate plus positive terms worth doubling down on. Can be scoped to a single campaign.
Poll the status of a strategy generation job started with generate_strategy. Returns status and phase while running, and the drafted ad groups (with keyword and headline counts) once complete. Poll every 10-15 seconds until status is completed or failed. Once completed, show the draft to the user and call apply_strategy with the same jobId to create the real draft campaign — request_publish cannot act on a preview.
List all Google Ads campaigns managed by VibeAds for the authenticated user. Returns name, status, category, budget, and high-level metadata. Use this first to discover which campaigns exist before drilling in.
List pending optimization recommendations awaiting approval, grouped by optimization session. Each recommendation includes action, reason, risk level, blast radius, auto-eligibility, and estimated impact, plus the sessionId + recommendationId needed for approve_recommendation. Optionally scope to one campaign.
Start the publish flow for a campaign that already has ad groups — find it with list_campaigns, or create one from a finished preview with apply_strategy (a bare generate_strategy jobId does not qualify). Publishing spends real money, so this returns a human-approval URL instead of publishing directly — SHOW the approvalUrl to the user and ask them to open it in their browser, review the budget, and approve — on approval the campaign goes LIVE immediately and can start spending its daily budget. The API key cannot approve it.
No error recovery guidance. Tools do not document error categories (retryable vs user-fixable vs fatal) or recovery paths. E.g., apply_strategy can fail with 'jobId already applied' but the error message does not guide the agent to extract campaignId from the error and call request_publish instead.
Idempotency not guaranteed for write operations. generate_strategy, apply_strategy, and approve_recommendation do not document idempotency behavior. Agents retrying on transient failures risk duplicate strategy generations, campaign creations, or recommendation approvals.
Parameter 'campaign_id' accepts both UUID and 8-char prefix (get_campaign_details, get_search_term_analysis, get_diagnostics, list_recommendations) but this flexibility is not formalized as an enum or pattern constraint. LLMs may pass invalid prefixes.