@vibeads/mcp
Read, diagnose, and (with human approval) act on your VibeAds-managed Google Ads campaigns — from campaign inspection and health scoring to drafting strategies and publishing.
Discover & inspect campaigns —
list_campaigns(filter by status) andget_campaign_detailsfor budget, bidding, ad groups, targeting, landing pages, 7-day metrics and active diagnostics.Score account health —
get_account_health_scorereturns a 0–100 score plus letter grade across 6 dimensions (Tracking, Keywords, Budget, Creative, Targeting, Performance), account-wide or per campaign.Find wasted spend —
get_search_term_analysisranks zero-conversion terms to negate and high-converting winners, with configurable cost threshold and lookback (max 90 days).Review diagnostics —
get_diagnosticslists active issues with severity, current value vs benchmark, and the recommended action.Draft a new campaign —
generate_strategybuilds keywords, ad copy and 3+ ad groups server-side (13 credits);get_strategy_statuspolls until complete. Preview only — you apply it in the VibeAds UI, and it cannot be published viarequest_publish.Approve optimizations —
list_recommendationsshows pending changes with risk level, blast radius and estimated impact;approve_recommendationexecutes exactly one inside VibeAds' guardrails (rate limits, auto-rollback).Publish a live campaign —
request_publishreturns a human-approval URL you open in your browser; the API key cannot approve it.Track publish progress —
check_approvalreports pending → approved → executing → executed, then the campaign is live and spending.Safety stance — nothing spends money without your browser confirmation, and the schema exposes 11 tools (fewer than the 29 the README advertises).
Provides read-only access to Google Ads campaign data for local service businesses, offering account health scoring, search term waste analysis, and diagnostic insights without requiring GAQL knowledge.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@vibeads/mcpwhat's my account health score?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@vibeads/mcp
Talk to your Google Ads account from ChatGPT, Claude, Claude Code, Cursor or any MCP client.
Built for local service businesses: 35 categories, 32 of them with tuned keywords, CPC benchmarks and funnel templates.
The official Model Context Protocol server for VibeAds. Ask your assistant questions like "which search terms are wasting my budget?" or "what's my account health score?" and get answers pulled from your live campaign data.
Unlike generic Google Ads MCP servers, this one is pre-tuned for local service businesses and rolls up 35+ diagnostic rules into a single 0-100 account health score across 6 dimensions. On Pro/Max plans it can also draft campaign strategies, apply guarded optimizations, edit keywords, bids and budgets, add ad groups, and publish, with you confirming anything that spends money.
There are two ways to connect, and both reach the same 29 tools:
Sign in (OAuth). Add the hosted server,
https://getvibeads.com/api/mcp, in ChatGPT, Claude, Meta AI or Claude Code and sign in to VibeAds when it asks. No key and nothing to install.API key. For Cursor, Cline, Windsurf and any client that can't sign in: create a
vba_mcp_key and use this npm package, or send the key to the hosted server in a header.
Features
🎯 Local-service-first: 27 home-service verticals plus 8 professional/lead-gen ones; 32 of them have their own keyword seeds, CPC benchmarks, audience segments and funnel template
📊 Account Health Score 0-100: weighted across 6 dimensions (Tracking, Keywords, Budget, Creative, Targeting, Performance)
🔍 Search term waste detection: finds every dollar burning on zero-conversion terms
💡 Diagnostic rollup: 35+ rules from VibeAds' optimization engine, ranked by severity
✍️ Write tools (Pro/Max): draft strategies, apply optimizations, edit keywords, bids and budgets, and publish through the VibeAds gateway
🔐 Sign in or use a key: OAuth sign-in for assistants that support it, a revocable API key for everything else. Your Google login never reaches the assistant
🔒 Safe by design: read tools can't modify anything; write tools run inside VibeAds' safety guardrails, and nothing spends money without you confirming it
⚡ No GAQL required: ask questions in natural language, get markdown answers
Related MCP server: Google Ads MCP Server
Supported categories
Local & home services (27): plumber · HVAC · electrician · roofer · cleaner · landscaper · pest control · painter · handyman · locksmith · garage door · appliance repair · tree service · fencing · windows & doors · carpet & flooring · waterproofing · pressure washing · air duct & dryer vent cleaning · commercial cleaning & janitorial · pool services · junk removal · movers · auto repair · Christmas lighting · dentist · lawyer
Professional & lead-gen (8): real estate · insurance · financial services · education · healthcare · consulting · SaaS · B2B services
Consulting, SaaS and B2B services use generic defaults, and so does any other category you pass, instead of a tuned knowledge base.
Connect
Sign in (OAuth) | API key | |
For | ChatGPT, Claude (claude.ai and Claude Desktop), Meta AI, Claude Code | Cursor, Cline, Windsurf and any other MCP client (Claude Code too, if you prefer a key) |
How | Add | Create a |
Publishing a campaign or starting a paused one | ChatGPT, Claude and Meta AI: a Search campaign within the daily limit you allow assistants, after you confirm its budget in the chat; anything else gets an approval link. Claude Code: always an approval link | Always an approval link you open in VibeAds |
Raising a daily budget | ChatGPT, Claude and Meta AI: up to 20% in the chat; more gets an approval link. Claude Code: always an approval link | Always an approval link |
Stopping it | Settings, Connected apps: Disconnect | Settings, MCP Server Keys: Revoke |
Rate limit | 60 calls an hour, shared by the apps you signed in to | 60 calls an hour per key |
An approval link only works in your own signed-in VibeAds session, so neither a key nor a connected app can approve it.
Option A: sign in (no key, nothing to install)
ChatGPT, Claude and Meta AI
Add the server address as a custom connector (Claude, Meta AI) or a custom MCP server (ChatGPT), and sign in to VibeAds when the assistant asks:
https://getvibeads.com/api/mcpStep-by-step instructions for each one: Connect ChatGPT, Claude or Meta AI. VibeAds emails you when an app is connected to your account.
Claude Code
Add the server with a fixed callback port, then open /mcp in Claude Code, choose VibeAds and sign in in your browser:
claude mcp add --transport http --callback-port 31790 vibeads https://getvibeads.com/api/mcpAny free port works; 31790 is an example. Keep it fixed: VibeAds checks the return address exactly, so a later sign-in on a different port is refused (run claude mcp remove vibeads and add it again). VibeAds' sign-in page calls Claude Code "An app on this computer": allow it only if you just started connecting from Claude Code.
Signed-in apps are listed in Settings, Connected apps, where you can disconnect them and set the daily budget assistants may publish up to.
Option B: API key
Step 1: get your API key
Sign in to your VibeAds account and generate an API key:
Keys start with vba_mcp_, are shown once, and are scoped to your account only. Make one per client or machine, so you can revoke one without touching the others.
Step 2: configure your MCP client
This package runs on your computer and forwards every call to VibeAds with your key. It always uses an API key; to sign in instead, use Option A.
Claude Desktop
Open your config file:
OS | Path |
macOS |
|
Windows |
|
Linux |
|
Add this to the mcpServers block:
{
"mcpServers": {
"vibeads": {
"command": "npx",
"args": ["-y", "@vibeads/mcp"],
"env": {
"VIBEADS_API_KEY": "vba_mcp_YOUR_KEY_HERE"
}
}
}
}Restart Claude Desktop. You should see the VibeAds tools appear in the 🔨 tool menu. (Claude Desktop can also sign in instead, through a custom connector: see Option A.)
Cursor
Open Settings → MCP
Click Add Server
Configure:
Name:
vibeadsCommand:
npx -y @vibeads/mcpEnvironment variables:
VIBEADS_API_KEY=vba_mcp_YOUR_KEY_HERE
Claude Code
claude mcp add vibeads -e VIBEADS_API_KEY=vba_mcp_YOUR_KEY_HERE -- npx -y @vibeads/mcpCline and other MCP clients
Use the same config as Claude Desktop above. Most MCP clients follow the same schema.
npx -y @vibeads/mcp --init prints ready-to-paste configs for each client.
Or: the hosted server with your key
Nothing to install: give the client the hosted address and send the key in an x-vibeads-api-key header. In Claude Code:
claude mcp add --transport http vibeads https://getvibeads.com/api/mcp --header "x-vibeads-api-key: vba_mcp_YOUR_KEY_HERE"The key also works as Authorization: Bearer vba_mcp_.... A client that can't send headers can put it in the address (https://getvibeads.com/api/mcp?key=vba_mcp_...); that address then works like a password, so prefer a header or signing in. Guides for Cursor, OpenAI Codex, Gemini CLI and VS Code with GitHub Copilot.
Environment variables (this package)
Setup is one env var: every tool (read and write) runs through the server-side VibeAds gateway with your API key.
Variable | Required? | Purpose |
| ✅ Required | Your |
| Optional | Override the VibeAds backend URL. Defaults to the production endpoint. |
Usage
Once connected, you can ask your assistant questions like:
📋 Campaign discovery
"Show me all my VibeAds campaigns"
"Which campaigns are paused?"
"Give me the 5 most recently created campaigns"
🔬 Deep dives
"Tell me everything about my plumber campaign in Austin"
"How did my HVAC campaign perform last week?"
"What's the CPA for campaign abc12345?"
📈 Reports for any period
"Compare September with August for my Austin plumbing campaign"
"Spend by device across my whole account last month"
"Which keywords spent the most in the last 90 days?"
🔎 Keyword research
"How many people search for drain cleaning in Austin, TX?"
"Find keyword ideas from my services page for Round Rock and Pflugerville"
🧾 Audit a whole Google Ads account
Works right after you connect Google Ads, before anything is imported:
"Where is my Google Ads budget being wasted?"
"Audit my Google Ads account"
📊 Account health
"What's my VibeAds account health score?"
"Which dimension is pulling my score down?"
"Give me the health score just for campaign xyz"
💸 Search term analysis
"What search terms are wasting my budget?"
"Show me the top 10 winning keywords from the last 30 days"
"How much am I wasting on terms with zero conversions?"
🩺 Diagnostics + recommendations
"What should I fix first?"
"Show me all critical diagnostics"
"What's wrong with my roofing campaign?"
Available tools
Read tools
Tool | Purpose |
| Your campaigns in VibeAds (published, imported and drafts) with status, budget and category. Campaigns only in your Google Ads account are listed by |
| Deep dive on one campaign: metrics, ad groups, targeting, landing pages, diagnostics |
| 0-100 score + letter grade across 6 dimensions, optionally per-campaign |
| Wasted spend + winners from each campaign's latest synced search terms, which cover the 7 days before that sync (configurable cost threshold) |
| Latest agent-optimize diagnostics with severity + recommended fix (up to 50) |
| Before importing: the campaigns in your Google Ads account, read from Google Ads, each marked with whether it is in VibeAds (VibeAds manages only the campaigns in it). Called |
| One campaign's or a whole account's figures for a period you choose (a preset or two dates, up to 90 days), read live from Google Ads, optionally by day, device, hour, ad group, keyword or location. Money in the account's currency. VibeAds builds every query; the assistant only picks the period and the breakdown |
| An audit of one connected Google Ads account, read live from Google Ads: up to 25 Search campaigns over the last 30 days, whether or not they are in VibeAds, with a 0-100 health score and grade for the account and each campaign, the issues grouped by check with what fixes each in Google Ads, and each campaign's costliest search terms with clicks and no conversions. One audit per account is kept for 24 hours |
| One published campaign's ad groups, keywords and negative keywords, read live from Google Ads: match type, status, max CPC and 30 days of clicks, cost and conversions |
| Keyword ideas from Google's Keyword Planner for seed keywords, a web page or both, in the places you name: average monthly searches, competition and top-of-page bid range. Pro/Max, 2 credits (a repeat within 90 days is free) |
| Every connected Google Ads account, switched on or not, with the manager account (MCC) each client account sits under |
| Google's own recommendations for an account (its Recommendations page), with Google's estimate and whether each can be applied from the chat |
The read tools are read-only: they cannot create, modify, pause, or delete anything in your Google Ads account. They run server-side through the VibeAds gateway, the same whether you signed in or use a key. Read tools work on any plan, free tier included, except research_keywords, which needs Pro or Max.
Write tools (Pro/Max)
Write tools run on the server-side VibeAds gateway, with a sign-in or an API key and nothing else (no Supabase or Google keys). Every call is rate-limited, approved optimizations are measured afterwards (smaller changes roll back automatically if metrics worsen), and nothing that spends money happens without you confirming it: an API key, or Claude Code signed in, gets an approval link you open in VibeAds; ChatGPT, Claude and Meta AI publish only within the daily limit you allow assistants, after you confirm the budget in the chat.
Tool | Purpose |
| Draft a full campaign strategy (keywords, ad copy, 3+ ad groups) server-side, with a Brand ad group for searches of your business's name, and on Max an ad group for each competitor you name. Costs 13 credits. Draft only: nothing is published, no money is spent |
| Poll a strategy job: status, phase, and drafted ad groups once complete |
| Turn a completed preview into a real draft campaign (ad groups, keywords, targeting, ad copy, extensions). Costs 6 credits + 3 per ad group for image generation. Draft only: not live, no ad money spent |
| Pending optimization recommendations, each with the tool and exact arguments that carry it out (its session and recommendation IDs included), or a link to approve it in VibeAds when no tool makes that change |
| Show a new ad group (keywords, three ads, landing page plan) before it is added. Creates a preview only |
| Add a previewed ad group. On a published campaign it starts serving at once, within the campaign's budget |
| Publish a campaign that has ad groups. Publishing spends real money, so with an API key or Claude Code it returns a human-approval URL; ChatGPT, Claude and Meta AI publish a Search campaign within the daily limit you allow assistants once you confirm its budget in the chat, and get an approval URL otherwise. With more than one Google Ads account it asks which one, and publishes to that one only |
| Bring up to 3 campaigns from your Google Ads account into VibeAds, so its optimizer and reports cover them. Nothing changes in Google Ads. 1 credit each |
| Pause a live campaign in Google Ads |
| Start a paused campaign again, under the same rules as publishing: with an API key or Claude Code it returns a human-approval URL |
| Add up to 20 negative keywords to a campaign or one ad group, at once. One that would block the campaign's own keywords is left out |
| Add up to 20 keywords to one ad group, at once, at the ad group's default max CPC |
| Pause keywords, or turn paused ones back on |
| Set an ad group's, a keyword's or a list of keywords' max CPC on a Manual CPC campaign. Up to double and $50 a click at once; more returns an approval URL |
| Set a campaign's daily budget. A decrease runs at once. An increase returns an approval URL with an API key or Claude Code; signed in to ChatGPT, Claude or Meta AI, up to 20% runs at once |
| Remove one of Google's recommendations from its list. No campaign changes |
| Poll a publish or change approval: pending → approved → executing → executed (or rejected / expired / failed) |
Every keyword, bid, budget and restart change is listed on the campaign's Optimize tab in VibeAds, where it can be undone. VibeAds never rolls these back by itself. An assistant can make 20 changes to a campaign a day.
From idea to live campaign:
generate_strategydrafts the strategy server-side and returns ajobId. Nothing exists in Google Ads yet.get_strategy_statuspolls that job until it reportscompleted.apply_strategyturns the finished preview into a real draft campaign and returns acampaignId. Still not live, still spending nothing.request_publishtakes thatcampaignId. With an API key or Claude Code it returns an approval link.You open the link in your browser, signed in to VibeAds, review the campaign and its budget, and click Approve (or Reject).
check_approvalreports the approval and then the publish job; the campaign is live once that job completes.
Steps 1–3 create rows only in VibeAds and spend VibeAds credits (13 for step 1; 6 + 3 per ad group for step 3). With an API key, step 5 is the only point where ad money is committed, and it can only happen in your browser: the key alone can never publish, so a leaked key still cannot spend.
ChatGPT, Claude and Meta AI, connected by signing in, skip the link for a Search campaign whose daily budget is within the limit you allow assistants ($100 a day unless you change it or turn it off, in VibeAds Settings under Connected apps): in step 4 the assistant tells you the daily budget, and publishes only after you confirm it in the chat. VibeAds emails you when the campaign is live. A bigger campaign gets the approval link.
Security
Read tools are read-only. They cannot mutate your campaigns, your Google Ads account, or your VibeAds settings.
Write tools are guarded. Every write action runs server-side through the VibeAds gateway, rate-limited to 60 calls an hour. Approved optimizations are measured afterwards, and smaller changes roll back automatically if metrics worsen. Every keyword, bid, budget and restart change an assistant makes is listed on the campaign's Optimize tab in VibeAds, where you can undo it.
Spending needs you. An approval link only works in your own signed-in VibeAds session, so neither a key nor a connected app can approve one. An API key, or Claude Code signed in, can never publish, restart a campaign or raise a budget by itself.
Your Google login stays with VibeAds. Google Ads connects to VibeAds once, through Google's own sign-in. A key or a signed-in app only ever reaches VibeAds; your Google tokens never reach the assistant or your computer.
Signing in (OAuth)
OAuth 2.1 authorization code with PKCE. VibeAds' sign-in page shows which app is asking and what it may do, and you press Allow access.
Outside these tools, VibeAds refuses a signed-in app anything that changes your account, and never lets it see your Google Ads login.
VibeAds emails you when an app is connected to your account.
Disconnect any app in Settings, Connected apps; it is signed out at once.
API keys
Keys are hashed with SHA-256 before storage. The full key is only shown once at creation.
Revocable any time from Settings, MCP Server Keys.
Usage is logged per key: last-used date and request count.
Each key is scoped to a single VibeAds user and cannot see other users' data.
For maximum security, revoke and replace an API key whenever a device changes hands or an engagement ends.
Requirements
Active VibeAds account: sign-in and keys work on every plan, the free plan included
Pro or Max plan: needed for the write tools (read tools work on any plan)
Google Ads connected to VibeAds: for live numbers, importing and publishing. Connect it in VibeAds Settings, or from the link the assistant gives you when it needs it
At least one published or imported campaign: diagnostics need synced data from Google Ads
Node.js ≥ 20: only for this npm package (
npxruns it); signing in or using the hosted server needs nothing installed
How it compares
VibeAds MCP | GoMarble MCP | Google Ads MCP (official) | |
Setup time | 2 min | 15 min | 30 min |
How you connect | Sign in to VibeAds (OAuth) or an API key; Google Ads connects once inside VibeAds | Google OAuth | Google OAuth |
GAQL knowledge required | ❌ | ✅ | ✅ |
Local service tuning | ✅ | ❌ | ❌ |
Account health score | ✅ 6 dimensions | ❌ | ❌ |
Pre-built diagnostics | ✅ 35+ rules | ❌ | ❌ |
Multi-account | ✅ | ✅ | ✅ |
Guarded write actions | ✅ you confirm anything that spends | ❌ | ❌ |
When to use VibeAds MCP: You run a local service business (or manage ads for one) and want pre-tuned insights without learning GAQL.
When to use GoMarble / Google Ads MCP: You need to run custom GAQL queries or work with non-service-business campaigns (e-commerce, B2B SaaS, etc.).
The three can coexist: install whichever ones fit your workflow.
Troubleshooting
"API key is invalid" or "Authentication failed"
Make sure your key starts with
vba_mcp_Generate a new key at https://getvibeads.com/app/settings/mcp
Check that the key hasn't been revoked
"Missing VibeAds API key" (hosted server with a key)
The header name must be exactly x-vibeads-api-key, and the key must start with vba_mcp_. Or remove the header and sign in instead.
The assistant asks you to sign in again, or says it isn't connected
The app was disconnected in Settings, Connected apps, or its sign-in ended. Connect it again from the assistant (ChatGPT: Settings, Plugins, VibeAds; Claude: Customize, Connectors; Claude Code: /mcp) and sign in.
Claude Code: the sign-in is refused
Claude Code was added without a fixed callback port, or with a different one. Run claude mcp remove vibeads, add it again with --callback-port (see Option A), and sign in from /mcp.
"No optimizer diagnoses yet"
Diagnostics are generated every 12 hours by the VibeAds agent, once Google Ads performance has synced. If you just published a campaign, allow up to a day for the first run.
"No search term data found"
Search term sync runs every 6 hours. For new campaigns, allow 24-48 hours for meaningful data to accumulate.
MCP client can't find the server (npm package)
Make sure you have Node.js 20+ installed: node --version. Claude Desktop and Cursor both shell out to npx, so Node must be in your PATH.
Contributing
This is an open-source MIT package. Issues and PRs welcome at: https://github.com/vibeads/mcp/issues
License
MIT © VibeAds
Available Tools
11 toolsapprove_recommendationAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The optimization session containing the recommendation (from list_recommendations). | |
| recommendationId | Yes | The single recommendation to approve and execute (from list_recommendations). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses key behaviors: executing exactly one recommendation, safety guardrails (blast-radius caps, rate limits, auto-rollback), and non-interference with other pending recommendations. This is strong for a mutation tool, though it does not mention return values or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, directly stating the action and then the safety constraints. No filler or repetition; every clause adds meaningful information. It is well-structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required string params, no output schema, no nested objects), the description covers purpose, scope, safety features, and effect on other recommendations. It could mention the return value, but overall it is sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters described as 'from list_recommendations', making the parameters self-explanatory. The description adds minimal semantic value beyond 'ONE' and 'already-diagnosed', which slightly reinforces the schema but does not compensate for any gaps. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Approve and execute' and specifies the resource as 'ONE already-diagnosed optimization recommendation', clearly distinguishing it from sibling tools like list_recommendations or check_approval. It conveys the exact action and scope without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear usage context: it is for approving and executing an already-diagnosed recommendation, with safety guardrails. It also clarifies that other pending recommendations remain untouched, which hints at when this tool is appropriate. It does not explicitly name alternatives, but the context strongly implies its niche.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_approvalAInspect
Check the status of a publish approval created with request_publish. Status is one of: pending, approved, rejected, expired, executing, executed, failed. While pending, remind the user to open the approval link in their browser — approval cannot happen through the API. Once executed, the campaign is live in Google Ads and serving ads immediately (it is not paused) — tell the user it is now spending, and that they can pause it from the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| approvalId | Yes | The approvalId returned by request_publish. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It excels by explaining the action implications: approval cannot be completed via API, the campaign is live and spending immediately upon execution, and the user can pause from the dashboard. It also lists all statuses, giving a complete picture of possible outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two sentences that front-load the purpose in the first sentence and provide actionable guidance in the second. It avoids repetition, fluff, and overly technical jargon, earning its words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter, no output schema, and no annotations, the description is remarkably complete. It explains the tool's purpose, enumerates all possible statuses, and gives user-facing instructions for the two critical states (pending and executed). The only omission is the exact return format, but the description effectively conveys that the status is the key output, making it sufficient for an AI agent to invoke and interpret correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the single parameter approvalId as 'The approvalId returned by request_publish,' providing 100% schema coverage. The description reiterates this connection but adds no additional semantic detail beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Check the status of a publish approval created with request_publish.' It uses a specific verb ('check') and resource ('publish approval'), differentiates from siblings by referencing the companion tool request_publish, and enumerates the exact status values, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (after request_publish) and what to do with the result (remind user to open the approval link while pending, notify them the campaign is live and spending once executed). It also states a limitation ('approval cannot happen through the API'), giving a when-not perspective. However, it does not explicitly name alternative tools or explicitly say 'use this when X, not Y,' which prevents a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_strategyAInspect
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. IMPORTANT: this is a preview only. It does NOT create a publishable campaign, so request_publish cannot act on it; the user applies the draft at https://getvibeads.com/app/new-campaign to turn it into a real campaign. Nothing is published and no ad money is spent.
| Name | Required | Description | Default |
|---|---|---|---|
| budget | No | Monthly ad budget in USD. Defaults to 1500. | |
| category | Yes | Service category, e.g. "plumber", "hvac", "electrician", "roofer". Custom categories are accepted. | |
| locations | No | Target locations for the campaign. Omit to let the server infer from the account's business profile. | |
| businessName | No | Business name to use in ad copy and branding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It mentions the 13-credit cost, the asynchronous nature (server-side, returns jobId), that nothing is published, no ad money is spent, and that the draft must be applied manually. This is thorough and transparent for a preview tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose and returns, then covers cost, jobId polling, and the crucial limitation about publishability. Every sentence serves a distinct informative function, and the warning is important to prevent misuse. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description explains the return value ('Returns a jobId') and the necessary next step ('poll get_strategy_status'). It also covers cost, side effects (none), and how to eventually create a real campaign. Given the tool's async nature and credit cost, the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already provide high coverage (100%) of all four parameters, so the baseline is 3. The tool description does not add much beyond what's in the schema; it reiterates category, budget, and locations but doesn't provide additional parameter semantics such as types, constraints, or relationships beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Preview a DRAFT campaign strategy server-side' with specifics (keywords, ad copy, 3+ ad groups) and explicitly distinguishes it from publish-related siblings by noting it does NOT create a publishable campaign. The verb 'Preview' plus resource 'campaign strategy' and output 'jobId' make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it names the follow-up tool 'get_strategy_status' to poll with the returned jobId, and explicitly states that 'request_publish cannot act on it', telling the user to apply the draft via a URL instead. This clearly delineates when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_health_scoreAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | Optional: scope the health score to a single campaign. If omitted, returns account-level score across all campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the computation method ('rolling up the latest diagnostics'), the output format (letter grade and breakdown), and the optional scoping. It doesn't mention permissions or side effects, but given the read-only nature of computing a health score, the disclosure is adequate and adds meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, and avoids extraneous details. Each sentence adds value: the first explains what the score is and how it's computed, the second describes the return values and optional scoping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description appropriately explains the return values (letter grade and per-dimension breakdown). It covers the essential behavior and edge cases (account-level vs campaign-level scope). It doesn't explain edge cases like no campaigns or grade thresholds, but these are not critical for using the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the campaign_id parameter fully documented in the schema itself. The description only repeats 'Optionally scope to a single campaign', adding no new semantic meaning beyond what the schema already provides. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Compute a 0-100 account health score across 6 dimensions' and details the output ('Returns a letter grade A-F and per-dimension breakdown'). This distinguishes it from sibling tools like get_diagnostics, which likely provides raw diagnostics rather than an aggregated health score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by explaining that it rolls up diagnostics from all campaigns and optionally scopes to a single campaign. It implies when to use this tool (when an overall health score is needed) versus pulling raw diagnostics, but does not explicitly mention alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_detailsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The VibeAds campaign UUID. Can be the full UUID or the short 8-character prefix shown in list_campaigns (e.g. "a1b2c3d4"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explicitly states that performance metrics cover the last 7 days and that active diagnostics are included. This reveals the time window and scope of results. It does not mention response format or error handling, but for a read-only get operation, it is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, efficiently enumerating all included elements in a compact, readable format. It is front-loaded with the core purpose and avoids unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description provides a thorough list of what will be returned, including specific metrics and diagnostics. It is complete for its complexity, giving the agent a full picture of the tool's output without needing an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single parameter (campaign_id), including details about full UUID vs. short prefix. The tool description itself adds no additional parameter information. Per the rubric, baseline 3 applies when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving a detailed view of a single VibeAds campaign. It lists the specific data returned (budget, bidding strategy, ad groups, locations, landing pages, performance metrics, diagnostics), making it unmistakably distinct from siblings like list_campaigns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: you'd use this when you need comprehensive details for one campaign. However, it does not explicitly mention alternatives or when not to use it, such as 'for a list of campaigns, use list_campaigns' or 'for diagnostics only, use get_diagnostics'. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diagnosticsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of diagnostics to return (default 20, max 50). | |
| severity | No | Filter by severity level. | all |
| campaign_id | No | Optional: scope to a specific campaign. Otherwise returns diagnostics across all campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return fields (severity, affected metric, current value vs benchmark, recommended action) and filtering options, but it claims a 'full list' while the schema indicates a default limit of 20, which is a minor inaccuracy that could mislead an agent. It also doesn't mention response shape or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the main purpose and includes relevant return details. Every word earns its place, though 'full' overstates the limit behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description provides useful return fields and filter options, but it lacks explicit response shape and pagination behavior. The 'full list' misstatement and absence of limit handling details leave gaps given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions, including defaults for limit and severity and the optional campaign_id. The description adds no substantive parameter semantics beyond the schema; it merely restates severity filtering and campaign scoping, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Return' and identifies the resource as 'diagnostics' with scope 'across all campaigns', clearly distinguishing it from siblings like get_account_health_score and get_campaign_details. It also lists the return fields, which solidifies the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states that the tool returns all active diagnostics and can be filtered by severity and campaign, giving a strong sense of when to use it. However, it does not explicitly mention when not to use it or name alternatives, so the agent must infer from the diagnostics focus that other sibling tools are for different purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_term_analysisAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| min_cost | No | Minimum USD cost threshold for a term to be considered 'wasted'. Defaults to $10. | |
| campaign_id | No | Optional: scope to a specific campaign. Otherwise analyzes all campaigns. | |
| lookback_days | No | How many days of search term data to analyze (max 90). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It clearly states that the tool returns a ranked list of terms to negate and positive terms, and that it can be scoped to a campaign. The 'Analyze' verb implies a read-only operation, and no side effects are mentioned. It does not detail permissions or rate limits, but for an analysis tool, the output and scoping are well described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and purpose, then summarizing the output and scoping. No word is wasted, and it avoids repetition of schema details. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity tool with a complete schema and no output schema, the description sufficiently explains what the tool does and returns. It covers the key use cases (wasted spend and winning terms) and the optional campaign scoping. It does not elaborate on ranking algorithm or thresholds, but that is not necessary for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the three parameters, so the baseline is 3. The description adds value by connecting the parameters to their purpose: 'high-cost terms with zero conversions' clarifies min_cost, 'last N days' aligns with lookback_days, and 'scoped to a single campaign' directly explains campaign_id. This extra context enriches the schema-only definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Analyze') with a clear resource ('search terms') and explicitly states the twofold purpose: finding wasted spend (high-cost terms with zero conversions) and winning terms (high conversion rate). It distinguishes itself from sibling tools like list_campaigns and get_campaign_details by focusing on search term analysis rather than campaign listing or details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: to analyze search terms for optimization opportunities. It mentions optional scoping to a single campaign, which is a usage nuance. However, it does not explicitly name any alternative tools or state when not to use it, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_strategy_statusAInspect
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. The finished draft is a preview: show it to the user and point them to https://getvibeads.com/app/new-campaign to apply it as a real campaign — request_publish cannot publish a preview.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | The jobId returned by generate_strategy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses the two phases (running vs complete), what is returned in each phase, and the crucial fact that the draft is only a preview and not publishable via request_publish. This is rich behavioral context beyond a simple 'get status' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with purpose, then usage timing, then an important caveat. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter polling tool without an output schema, the description adequately covers what the tool does, when to use it, what it returns, and a critical limitation. No important context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes jobId as 'The jobId returned by generate_strategy' with 100% coverage. The description adds no new parameter-specific information; it only reinforces the same provenance. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool polls the status of a strategy generation job started with generate_strategy, and specifies what it returns (status and phase while running, drafted ad groups once complete). It distinguishes itself from siblings like generate_strategy (which starts the job) and request_publish (which cannot publish previews).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: poll every 10-15 seconds until status is completed or failed. It also tells the agent what to do with the result (show the preview and point to the app URL) and explicitly warns that request_publish cannot publish a preview, effectively naming an alternative to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of campaigns to return (max 100). | |
| status | No | Filter campaigns by status. Defaults to all. | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses the scope (managed by VibeAds, for the authenticated user) and the return fields (name, status, category, budget, high-level metadata). However, it does not explicitly state that this is a read-only operation with no side effects, nor does it mention pagination or that the 'all' default is constrained by the limit parameter. This is adequate but leaves some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences. The first sentence states the action and resource. The second provides return fields and usage guidance. Every word contributes value, and the critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two well-documented parameters and no output schema, the description covers the essentials: what it lists, for whom, and what data is returned. The only notable gap is the lack of explicit mention that the result may be paginated/limited, which could mislead an agent expecting truly 'all' campaigns. Otherwise, it is complete enough given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both limit and status have descriptive text and defaults. The description adds no extra parameter-level detail, such as how limit interacts with 'List all' or how status filtering works. Since the schema already documents the parameters, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and clearly identifies the resource ('Google Ads campaigns managed by VibeAds for the authenticated user'). It also differentiates from siblings by positioning itself as the discovery tool ('Use this first to discover which campaigns exist before drilling in'), which contrasts with get_campaign_details for deeper inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use it ('Use this first') and that it precedes drilling into details. It does not name alternatives or state when not to use it, but the sibling tool names make the sequencing clear. This is strong contextual guidance, though not a full when/when-not breakdown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recommendationsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | No | Optional: scope to a single campaign. Otherwise returns pending recommendations across all campaigns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the tool lists pending items, groups them by optimization session, includes detailed fields (action, reason, risk level, etc.), and supports optional campaign scoping. The term 'List' implies a read-only operation, which is the key behavioral trait. It doesn't mention pagination or empty-result behavior, but essential behavior is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the main purpose and grouping; the second details return contents and optional scoping. It is front-loaded, concise, and every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter and no output schema. The description compensates well by listing return fields, grouping behavior, optional scope, and the connection to approve_recommendation. Minor omissions like pagination and sorting are not critical for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single optional campaignId parameter, and its description already explains scope. The tool description repeats 'Optionally scope to one campaign' but adds no new semantic meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and clearly defines the resource: pending optimization recommendations awaiting approval. It also distinguishes itself from sibling tools like approve_recommendation by noting it returns the sessionId and recommendationId needed for that action, making its role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need pending recommendations awaiting approval, and it explicitly mentions the IDs needed for approve_recommendation, signaling a clear workflow. It also notes optional campaign scoping, though it doesn't explicitly list alternatives or exclude other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_publishAInspect
Start the publish flow for an EXISTING campaign (one that already has ad groups — find it with list_campaigns; a generate_strategy preview 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 a publish. After the user approves, poll check_approval with the returned approvalId.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | The VibeAds campaign ID to publish to Google Ads (from list_campaigns or a completed strategy job). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description fully carries the burden: it discloses that publishing spends real money, that a human-approval URL is returned, that the API key cannot approve, and that the campaign goes live immediately after approval.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though detailed, every sentence adds essential information about the approval flow. It is well-structured and front-loaded with the core action, then explains the human-approval process and follow-up polling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, but the description explains the return values (approvalUrl, approvalId) and the full flow with check_approval. It is complete for a complex publish action with human approval.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, and the description adds meaningful context beyond the schema: the campaignId must be an existing campaign with ad groups, and it references list_campaigns as the source. This is more than a baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Start the publish flow' and the resource 'EXISTING campaign', and distinguishes from generate_strategy previews. It also explains the outcome (returns approval URL, campaign goes live on approval).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: for existing campaigns found via list_campaigns, and explicitly excludes generate_strategy previews. It also directs the follow-up action to poll check_approval with the approvalId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.2.5- First observed
approve_recommendation - First observed
check_approval - First observed
generate_strategy - First observed
get_account_health_score - First observed
get_campaign_details - First observed
get_diagnostics - First observed
get_search_term_analysis - First observed
get_strategy_status - First observed
list_campaigns - First observed
list_recommendations - First observed
request_publish
TDQS
Scored across 11 tools
Each tool targets a distinct action and resource: listing vs details, analysis types (health, search terms, diagnostics), strategy generation and polling, recommendations list/approve, publish and approval check. No two tools appear to overlap in purpose.
All tools follow a consistent verb_noun pattern in snake_case (list_, get_, generate_, approve_, request_, check_), with clear object nouns. Minor compound names don't break the pattern.
11 tools is well-scoped for a Google Ads management server, covering discovery, analysis, strategy, recommendations, and publishing without bloat. Each tool addresses a distinct stage in the workflow.
The set covers the full lifecycle of analyzing, optimizing, and publishing campaigns. Gaps like creating/pausing campaigns are intentionally delegated to the web UI, so agents can still navigate the core workflow, but direct CRUD beyond reading/publishing is missing.
Maintenance
Related MCP Connectors
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
- MCP AdsOAuthcom.mcp-ads
Run Google Ads, Meta Ads, GA4 and Search Console from chat: read, audit and launch campaigns.
Run Google Ads and Meta Ads from ChatGPT or Claude: audit wasted spend, create and manage campaigns.
Google Ads MCP server — manage campaigns, keywords, and metrics.
Related MCP Servers
- AlicenseDqualityFmaintenanceEnables LLMs to interact with Google Ads accounts via tools like list_accounts and search_stream, using a standardized Model Context Protocol integration.211Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to interact with the Google Ads API through the Model Context Protocol, allowing natural language queries for campaign management and metrics.Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables querying and managing Google Ads campaigns, keywords, assets, and more via natural language, with support for multiple MCP clients.68 npm1MIT
- FlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server that exposes the Google Ads API to LLM clients, enabling account inspection, GAQL queries, performance reporting, and campaign management.-