Google Ads - AdLoop
AdLoop is an AI command center that provides read and write access to Google Ads, GA4, Google Tag Manager, and tracking infrastructure, enabling AI assistants to manage and optimize digital advertising and analytics with built-in safety features.
Health Check & Diagnostics: Verify OAuth, GA4, and Ads connectivity, pinning API versions and surfacing actionable errors.
GA4 Analytics: List accounts/properties, run custom reports (sessions, users, conversions, page performance), get real-time data, and list configured tracking events.
Google Ads Read: List accessible accounts and pull performance data for campaigns, ads, keywords, search terms, negative keywords, recommendations, Performance Max assets, audiences, and demographics. Run arbitrary GAQL queries.
Cross-Platform Analysis: Join Ads clicks with GA4 sessions/conversions per campaign (
analyze_campaign_conversions), correlate landing pages with page-level metrics (landing_page_analysis), and diagnose attribution discrepancies (attribution_check).Tracking Validation & Code Generation: Compare codebase events against GA4 firing (
validate_tracking) and generate ready-to-paste GA4 gtag snippets (generate_tracking_code).Google Tag Manager Auditing: Audit GTM containers — list tags/triggers/variables, inspect live configs, compare workspaces, and perform three-way joins (codebase ↔ GTM tags ↔ GA4 fires) via
audit_event_coverage.Keyword Planning & Budget Forecasting: Discover keyword ideas with search volume and competition, and forecast clicks, impressions, and cost for budget planning.
Google Ads Write (Safety-First): Draft and update campaigns, ad groups, responsive search ads, keywords, negative keywords, shared lists, callouts, structured snippets, image assets, and sitelinks. Every mutation follows a mandatory preview → confirm workflow; new entities are paused by default; Broad Match + Manual CPC is blocked.
Entity Management: Pause, enable, or remove campaigns, ad groups, ads, and keywords — with irreversible actions requiring double confirmation.
Search Console & Merchant Center: Run organic search analytics reports and retrieve Merchant Center feed health data.
Safety & Audit Logging: Configurable budget caps, dry-run defaults, a full audit log at
~/.adloop/audit.log, and structured error handling with actionable hints.Orchestration & Slash Commands: Built-in rules guide AI workflows (performance review, conversion diagnosis, campaign creation) with Claude Code slash commands like
/analyze-performanceand/create-ad.
Provides read and write access to Google Ads, including campaign management, keyword planning, ad performance analysis, and negative keyword management, with safety guardrails to prevent accidental spend.
Provides read access to Google Analytics 4 (GA4) data, including custom reports, real-time data, event tracking, and cross-reference analysis with Google Ads for attribution and conversion diagnostics.
AdLoop
The AI command center for Google Ads, Reddit Ads, GA4, and tracking code.
An MCP server that gives your AI assistant read + write access to Google Ads, Reddit Ads and GA4 — with safety guardrails that prevent accidental spend.
☁️ Skip the setup — use AdLoop Cloud (free plan, no card) · or self-host: pip install adloop
AdLoop Cloud is the hosted version of this project, with a free plan that needs no credit card. Connect Google in two clicks and use the full toolset from claude.ai, ChatGPT, Claude Code, Cursor, or Gemini. No Google Cloud project, no developer token, no OAuth verification wait. EU-hosted, GDPR-first, DPA included.
📚 Documentation: docs.getadloop.com — setup guides per AI client, toolsets, the safety model, and troubleshooting for both editions.
Cloud or Self-Hosted?
Both versions run the same tools with the same safety model. The difference is who handles the plumbing:
☁️ AdLoop Cloud | 🛠️ Self-hosted (this repo) | |
Setup | Connect Google in two clicks | ~5 min: own Google Cloud project + |
Google Cloud project | Not needed | Required (free) |
Ads developer token | Not needed | Required (from your MCC) |
Works with | claude.ai, ChatGPT, Claude Code, Cursor, Gemini | Claude Code, Cursor, Claude Desktop, any local MCP client |
Where your data flows | EU servers (Germany), GDPR-first, DPA included | 100% your machine — nothing leaves it |
Updates | Automatic |
|
Price | Free plan, no card; paid plans for more accounts and volume | Free forever (MIT) |
Not sure? Start with Cloud — it's the fastest way to see what AdLoop can do, and it's the only way to use AdLoop from claude.ai or ChatGPT. Self-host when you want everything on your own machine or need to modify the code. And if you're here to hack on AdLoop itself: welcome, keep scrolling.
Related MCP server: Google MCP Server
What It Solves
AdLoop exists because managing Google Ads alongside your code is a mess. These are the specific problems it handles:
"My conversions dropped and I don't know why." AdLoop cross-references Ads clicks, GA4 sessions, and conversion events in one query. It detects whether the gap is from GDPR consent rejection, broken tracking, or an actual landing page problem — before you waste hours checking each dashboard separately.
"I'm wasting ad spend on irrelevant searches." Pull your search terms report, identify the junk, and add negative keywords — all from a single conversation in your IDE. No context-switching to the Ads UI.
"Is my tracking even working?" Compare the event names in your actual codebase against what GA4 is receiving. Find the mismatches: events you fire that GA4 never sees, events GA4 records that you didn't know about.
"I need to create ads but the Google Ads UI is hostile." Draft responsive search ads, create campaigns, add keywords — all through natural language. Every change shows a preview first. Nothing goes live without your explicit confirmation. New ads and campaigns start paused.
"My landing page gets paid traffic but nobody converts." AdLoop joins your ad final URLs with GA4 page-level data. See which pages get clicks but no conversions, which have high bounce rates, and which ones are orphaned from any ad campaign.
"Are conversions even being tagged on every page?" AdLoop reads your live Google Tag Manager container, joins it against the events in your codebase and the events firing in GA4, and tells you exactly which conversions are being captured, which tags are paused, which page-scope filters are too narrow, and which codebase events have no tag at all — the kind of three-way audit GTM Preview can't give you in a single view.
"I don't know if my EU consent setup is causing data gaps." In Europe, 30-70% of users reject analytics cookies. AdLoop accounts for this automatically — it won't diagnose a normal GDPR consent gap as broken tracking.
Built From Real Usage
Every tool exists because of an actual problem hit while running real Google Ads campaigns. The cross-reference tools exist because we kept manually asking the AI to "get Ads data, then get GA4 data, then compare them" — so we automated the join. The Broad Match + Manual CPC safety rule exists because the AI once created that exact combination and wasted budget. The GDPR consent awareness exists because the AI kept diagnosing normal EU cookie rejection as broken tracking.
The best features come from real workflows. If you're using AdLoop and find yourself wishing it could do something it can't, open an issue describing your situation — not just "add feature X" but "I was trying to do Y and couldn't because Z." The context matters more than the request.
All Tools
Quick start:
pip install adlooporgit clone https://github.com/kLOsk/adloop.git && cd adloop && uv sync && uv run adloop init— or zero setup on AdLoop Cloud
Diagnostics
Tool | What It Does |
| Test OAuth, GA4, and Ads connectivity in one call — actionable error messages if anything is broken. Also reports the pinned Google Ads API version and warns if a newer version is available. |
GA4 Read Tools
Tool | What It Does |
| List GA4 accounts and properties |
| Custom reports — sessions, users, conversions, page performance |
| Live data — verify tracking fires after deploys |
| All configured events and their volume |
Google Ads Read Tools
Tool | What It Does |
| Discover accessible Ads accounts |
| Campaign metrics — impressions, clicks, cost, conversions, CPA |
| Ad copy analysis — headlines, descriptions, CTR |
| Keywords — quality scores, competitive metrics |
| What users actually searched before clicking |
| List direct campaign-level negative keywords |
| List all shared negative keyword lists (SharedSets) — names, IDs, status, keyword count |
| List the keywords inside a specific shared negative keyword list |
| List which campaigns a shared negative keyword list is attached to |
| Google's auto-generated recommendations with type, estimated impact, and campaign context |
| Performance Max campaign metrics with network breakdown + asset group ad strength |
| Per-asset details for PMax — field type, serving status, content |
| Top-performing asset combinations — which headline+description+image combos Google selects most |
| Audience segment performance — remarketing, in-market, affinity, demographics |
| List demographic criteria (age/gender/parental status/income) on an ad group or campaign |
| Arbitrary GAQL queries for anything else |
Compact mode —
get_campaign_performance,get_keyword_performance,get_search_terms, andget_ad_performanceacceptcompact=true: account totals, breakdowns, top-10 rows, and pre-computed offender lists (zero-conversion spenders, low-QS keywords, negative-keyword candidates, thin RSAs) instead of every row. ~90% smaller responses — built for account audits so raw tables don't flood your AI's context.
Cross-Reference Tools (GA4 + Ads Combined)
These tools call both APIs internally and return unified results with auto-generated insights. They're the core of what makes AdLoop different from having separate GA4 and Ads tools.
Tool | What It Does |
| Maps Ads clicks → GA4 sessions → conversions per campaign. Detects GDPR consent gaps, computes real CPA, compares paid vs organic channels. |
| Joins ad final URLs with GA4 page data. Shows conversion rate, bounce rate, and engagement per landing page. Flags pages with paid traffic but zero conversions. |
| Compares Ads-reported conversions vs GA4 events. Diagnoses whether discrepancies are from GDPR consent, attribution windows, or broken tracking. |
Tracking Tools
Tool | What It Does |
| Compare event names found in your codebase against what GA4 actually records. Returns matched, missing, and unexpected events with diagnostics. |
| Generate ready-to-paste GA4 gtag JavaScript for any event, with recommended parameters for well-known events (sign_up, purchase, etc.) and optional trigger wrappers. |
Google Tag Manager Tools
These tools read the live GTM container and join it with the codebase + GA4 to find tracking gaps that pure GA4 inspection can't catch — page-scoped triggers, paused tags, dynamic event names, brittle CSS selectors, and codebase events with no tag wired up at all.
Tool | What It Does |
| The flagship. Three-way join: codebase events ↔ GTM tags ↔ GA4 actual fires. For each event name in |
| Discover accessible GTM accounts |
| List containers under an account — returns numeric |
| Every tag in the live container with parsed event names and resolved firing/blocking trigger names |
| Full raw config for a single tag — every parameter, firing/blocking triggers with filter conditions, priority, pause status, sampling |
| Every trigger with filter conditions parsed to readable text (e.g. |
| Full trigger config + reverse lookup of every tag that uses it. Includes parsed |
| Custom variables (data layer, constants, JS) plus enabled built-in variables |
| List drafts (workspaces) under a container — workspace IDs are needed by |
| Drafted-but-not-published changes — common cause of "I edited a tag but nothing happened". Returns |
| Publish history with version IDs and entity counts. Use to correlate a metric drop with a recent publish. |
| Full metadata + tag/trigger names for a single historical container version |
Setup for GTM tools — Enable the Tag Manager API v2 in your GCP project, then add your AdLoop credentials' email (the OAuth user, or the service account email if using a service account) as a Read user on the GTM container under Admin → User Management. Service accounts pick up access on the next call. OAuth users upgrading from an earlier AdLoop version must re-authorize once: the GTM scope is new, so delete
~/.adloop/token.jsonand run any tool to re-consent — until then GTM tools return a permissions error.
Search Console Tools
Tool | What It Does |
| List Search Console properties the connected account can access |
| Organic search analytics — clicks, impressions, CTR, position by query/page/country/device/date |
Web Performance Tools
Tool | What It Does |
| PageSpeed Insights for landing pages — Lighthouse score, Core Web Vitals, real-user CrUX data, top fixes. No OAuth needed (optional API key). |
Merchant Center Tools
Tool | What It Does |
| Discover accessible Merchant Center accounts |
| Feed health — approved/pending/disapproved counts per reporting context, top product issues with docs, account-level issues. Disapprovals silently starve Shopping/PMax. |
Setup for Merchant Center tools — Enable the Merchant API in your GCP project (the Content API for Shopping is deprecated). The Merchant API has no read-only scope; AdLoop uses it strictly read-only. Upgrading OAuth users re-authorize once.
Setup for GSC tools — Enable the Search Console API in your GCP project. Upgrading OAuth users must re-authorize once for the new scope (delete
~/.adloop/token.json, run any tool). The killer combo: cross-reference organic queries withget_keyword_performanceto find paid/organic cannibalization and untapped keyword opportunities.
Reddit Ads Tools
A second ad platform, same safety model. Reddit is a separate connection: its own developer app, its own OAuth, no developer token and no approval process. Every tool takes ad_account_id (defaults to reddit.ad_account_id).
Tool | What It Does |
| Discover businesses and ad accounts (currency, time zone, approval state) |
| Billing instruments and posting profiles — prerequisites for creating campaigns and ads |
| Structure with configured vs effective status, budgets, bids, pixel, targeting, rejection reasons |
| Spend, clicks, CTR, CPC, conversions, CPA, ROAS per account/campaign/ad group/ad, optional breakdown (date, country, community, keyword, placement, …), compact mode with insights |
| Raw reports endpoint for any metric (REACH, video, per-event conversions) |
| Pixels and when each event last fired — flags ad groups optimizing for events the pixel never sent |
| Communities, interests, geolocations, languages, keyword suggestions, and Reddit's related-community suggestions (by seed communities or website) |
| Who changed what and when: field, before/after, member |
| Audience size, delivery estimate and suggested bid range for a planned ad group (Reddit's counterpart of |
| Status changes through the preview gate (remove = ARCHIVE, irreversible, double-confirmed) |
| Budget, bid, schedule, targeting (validated with Reddit at draft time), landing URL and comment changes with old → new previews, budget cap and bid-increase guards |
| Create campaign → ad group (pixel + targeting required) → post + ad. Everything is created PAUSED. |
Setup for Reddit Ads tools — In Reddit Ads Manager open Business Manager → Developer Application → Create app (business admins only; no approval wait). Register the redirect URL exactly as
http://localhost:8765/callback, then runadloop initand complete the Reddit Ads step: it opens Reddit's consent page (scopesadsread+adsedit, permanent grant), stores the refresh token at~/.adloop/reddit_token.json, and lets you pick the default ad account. Reddit rate-limits per user (reporting: 60 requests/min) and requires a descriptive User-Agent, which AdLoop builds from your app id and Reddit username. Reddit has no validate-only mode, soconfirm_and_apply(dry_run=true)re-reads the target and re-checks the safety caps instead.
Planning Tools
Tool | What It Does |
| Discover new keyword ideas from seed keywords and/or a URL — with optional per-month search history + seasonality insights ( |
| Forecast clicks, cost, and conversions for a set of keywords using Google Ads Keyword Planner. Supports geo/language targeting. Essential for budget planning before launching campaigns. |
Google Ads Write Tools
All write operations follow a draft → preview → confirm workflow. Nothing executes without explicit approval.
Tool | What It Does |
| Create a full campaign structure — budget + campaign (PAUSED) + ad group + optional keywords. Supports Search partners, display expansion, and |
| Modify existing campaign settings — bidding, budget, geo/language targeting, Search partners, display expansion, and TARGET_SPEND (Maximize Clicks) |
| Create a paused SEARCH_STANDARD ad group inside an existing campaign, with optional MANUAL_CPC |
| Update an ad group name and/or MANUAL_CPC |
| Create RSA preview (3-15 headlines ≤30 chars, 2-4 descriptions ≤90 chars). Warns if headline/description count is below best practice. |
| Create campaign callout assets from 1-25 character text snippets. |
| Create campaign structured snippet assets using official header values and 3-10 snippet values. |
| Create campaign image assets from local PNG, JPEG, or GIF files. |
| Propose keyword additions with match types. Proactively checks bidding strategy — blocks BROAD match on Manual CPC campaigns. |
| Propose negative keywords directly on a campaign |
| Propose negative geo exclusions on a campaign — exclude cities/regions while keeping broader positive targets |
| Mark a GA4 event as a key event (conversion) — the fix for "fires but isn't tracked as a conversion" |
| Propose demographic criteria (age, gender, parental status, income) — exclusions by default |
| Draft a shared negative keyword list (SharedSet) and attach it to a campaign — reusable across multiple campaigns |
| Pause a campaign, ad group, ad, or keyword |
| Re-enable a paused entity |
| Permanently remove an entity (irreversible — prefers pause). Supports keywords, negative keywords, ads, ad groups, campaigns. |
| Execute a previously previewed change |
Orchestration Rules
AdLoop ships with orchestration rules that teach the AI how to combine these tools — marketing workflows, GAQL syntax, safety protocols, GDPR awareness, and best practices. Without rules, the AI has tools but doesn't know the playbook.
Cursor:
.cursor/rules/adloop.mdc(canonical source)Claude Code:
.claude/rules/adloop.md(synced from Cursor rules viascripts/sync-rules.py)
The rules include:
Orchestration patterns for common workflows (performance review, conversion diagnosis, campaign creation, negative keyword hygiene, keyword discovery, tracking validation, budget planning, landing page analysis)
GAQL quick reference with syntax, common queries, and gotchas
Safety rules including Broad Match + Manual CPC prevention and pre-write validation
Ad copy character limit guidance (30-char headlines are shorter than you think)
GDPR consent awareness to prevent false tracking diagnoses in EU markets
Slash Commands (Claude Code)
AdLoop includes pre-built slash commands in .claude/commands/ for common workflows:
Command | What It Does |
| Full performance review across Google Ads + GA4 |
| Create a responsive search ad with safety checks |
| Diagnose tracking and conversion issues |
| Full optimization checklist for a campaign |
| Create a new search campaign with budget estimation |
| Estimate budget for keywords via Keyword Planner |
Safety Model
AdLoop manages real ad spend, so safety is not optional.
Two-step writes. Every mutation returns a preview first. A separate
confirm_and_applycall is required to execute.Dry-run by default. Even
confirm_and_applydefaults todry_run=true. Real changes require explicitdry_run=false.Two-phase apply (optional). With
safety.two_phase_apply: true,confirm_and_applyrefusesdry_run=falseuntil the plan has completed one dry-run pass — preview-then-apply becomes server-enforced instead of a convention.Budget caps. Configurable maximum daily budget — the server rejects anything above the cap.
Audit log. Every operation (including dry runs) is logged to
~/.adloop/audit.log.New campaigns and ads are PAUSED. Nothing goes live without manual enablement.
Destructive ops require double confirmation. Removing entities or large budget increases trigger extra warnings.
Broad Match + Manual CPC blocked. The #1 cause of wasted ad spend is automatically prevented —
draft_keywordsrefuses to add BROAD match keywords to campaigns without Smart Bidding.Pre-write validation. Before any write, the AI checks bidding strategy, conversion tracking status, and quality scores. If the campaign is fundamentally broken, AdLoop warns you instead of making things worse.
Structured error handling. All tools return actionable error messages with hints instead of raw exceptions. Auth errors include specific re-authorization steps.
API version pinning. The Google Ads API version is pinned to prevent silent breaking changes from library updates.
health_checkwarns when a newer version is available.Ask mode compatibility. Read tools declare
readOnlyHintso they work in Cursor's Ask mode without switching to Agent mode.
Setup
AdLoop uses your own (free) Google Cloud project for OAuth. The
adloop initwizard walks you through it — a one-time setup of about 5 minutes, with no shared user caps and no waiting on anyone's verification review. AdLoop does not ship built-in OAuth credentials.Prefer zero setup? AdLoop Cloud is the hosted version: connect Google in two clicks — no Cloud project, no developer token, EU-hosted.
(Upgrading from ≤0.9 with built-in credentials? Those sign-ins were retired in 0.10 — run
adloop initonce to switch to your own project.)
Seeing deleted_client: The OAuth client was deleted. or invalid_client? The shared Google Cloud project behind AdLoop ≤0.9's bundled credentials has been shut down, so its stored sign-ins no longer refresh. Two ways forward: AdLoop Cloud (connect Google in two clicks, nothing to configure) or stay self-hosted with pip install -U adloop && adloop init to set up your own free Google Cloud project. Details in the pinned issue (#49).
Install
From PyPI:
pip install adloop
adloop initFrom source:
git clone https://github.com/kLOsk/adloop.git
cd adloop
uv sync
uv run adloop initWhat adloop init does
The wizard walks you through:
Google Cloud setup — creates a project, enables the three APIs, generates an OAuth client (see Custom Google Cloud Project Setup below for the exact steps the wizard refers you to)
Developer token — from your Google Ads MCC (API Center)
MCC Account ID — your Manager Account ID (top bar in the MCC UI)
OAuth sign-in — opens a browser to sign in with Google (or prints a URL for headless servers)
Auto-discovers your accounts — finds your GA4 properties and Ads accounts automatically
Optional services — pin a GTM container, a Search Console property (both auto-discovered too), and a PageSpeed API key; skip any of them with Enter
Safety defaults — budget cap and dry-run preference
Toolsets — optionally expose only part of the tool catalog to your AI client (see Toolsets)
Editor config snippets — prints MCP configuration for both Cursor and Claude Code, including your toolset selection
Requirements
Python 3.11+
A Google Ads account with an MCC (Manager Account)
A Google Ads Developer Token (see below)
Google Ads Developer Token
A developer token is always required. Your OAuth client handles Google sign-in; the developer token is a separate key that grants API access to your Google Ads data.
Create an MCC (free) at ads.google.com/home/tools/manager-accounts if you don't have one. Link your regular Google Ads account to it.
In the MCC, go to Tools & Settings → API Center
Your developer token is shown there. Copy it — the wizard will ask for it.
Access levels — your token's access level determines what it can do:
Level | How to Get | What It Allows |
Test Account | Default for new tokens | Can only access test accounts — not production accounts. If you see |
Explorer | Automatic after first API call with a production account | 2,880 operations/day on production accounts. Enough to get started. |
Basic | 15,000 operations/day. Apply if you need more. |
Getting
DEVELOPER_TOKEN_NOT_APPROVED? Your token is at "Test Account" level. Go to API Center in your MCC and check your access level. If it shows "Test Account", you need to apply for Basic access or wait for Explorer access to be granted after your first production API call.
Headless Servers
Running on a server without a browser (VMs, Docker, SSH)? The wizard automatically detects this and falls back to a manual flow: it prints an authorization URL you can open on any device, then you paste the redirect URL back into the terminal.
Custom Google Cloud Project Setup
The wizard refers to these steps — do them in your browser before running adloop init (or while it waits at the OAuth prompt).
Step 1 — Google Cloud Project
Go to console.cloud.google.com and create a new project
Enable these three APIs (search for each in the API Library):
Google Analytics Data API — for GA4 reports and events
Google Analytics Admin API — for listing GA4 properties
Google Ads API — for all ads operations
Step 2 — OAuth Credentials
In your Google Cloud project, go to APIs & Services → Credentials
Click Create Credentials → OAuth client ID
Select Desktop app as the application type, give it any name
Download the JSON file and save it as
~/.adloop/credentials.json
Service accounts are also supported — just place the service account key JSON at the same
credentials_path. AdLoop detects the file type automatically.
Step 3 — Connect to Your Editor
Cursor — Add to your project's .cursor/mcp.json:
{
"mcpServers": {
"adloop": {
"command": "/absolute/path/to/adloop/.venv/bin/python",
"args": ["-m", "adloop"]
}
}
}Then copy .cursor/rules/adloop.mdc from this repo into your project's .cursor/rules/ directory.
Claude Code — Run:
claude mcp add --transport stdio adloop -- /absolute/path/to/adloop/.venv/bin/python -m adloopOr add to your project's .mcp.json:
{
"mcpServers": {
"adloop": {
"command": "/absolute/path/to/adloop/.venv/bin/python",
"args": ["-m", "adloop"]
}
}
}Then install the orchestration rules + slash commands globally so every Claude Code session inherits them:
adloop install-rulesThis writes a managed block to ~/.claude/CLAUDE.md and copies the slash commands (prefixed adloop-*) into ~/.claude/commands/. The block is delimited by sentinel comments so it's safe to run multiple times — re-running just refreshes the content. Two install modes:
inline (default) — full rules embedded in
~/.claude/CLAUDE.md. Reliable but adds ~10K tokens to every Claude Code session.lazy (
adloop install-rules --lazy) — small directive inCLAUDE.mdpointing at~/.claude/rules/adloop.md. Cheaper baseline cost; the LLM reads the rules file only when AdLoop tools are in scope.
To refresh after upgrading AdLoop: adloop update-rules. To remove cleanly: adloop uninstall-rules — only the managed block and adloop-* commands are touched, never your own content.
If you'd rather manage things by hand instead, copy .claude/rules/adloop.md and .claude/commands/ from this repo into your project's .claude/ directory.
Claude Desktop / claude.ai has no programmatic rules location. Run adloop install-rules and it will print the rules content for you to paste into Project settings → Custom instructions on claude.ai.
Use It
Ask your AI assistant things like:
"How are my Google Ads campaigns performing this month?"
"Which search terms are wasting budget? Add them as negative keywords."
"My sign-up conversions dropped — check GA4 and Ads to find out why."
"Draft a new responsive search ad for my main campaign."
"Which landing pages get paid traffic but don't convert?"
"Is my tracking set up correctly? Compare my codebase events against GA4."
"Audit my Google Tag Manager container — which conversions are being captured and where are the gaps?"
"What keywords should I target for [product]? Find ideas and estimate the budget."
"How much budget would I need for these keywords in Germany?"
"Create a new search campaign for [product feature] with a €20/day budget."
Configuration Reference
All configuration lives in ~/.adloop/config.yaml. See config.yaml.example for a documented template.
Section | Key | Default | Description |
|
| (empty) | Google Cloud project ID (only needed with custom credentials) |
|
| (empty) | Path to OAuth client JSON or service account key. Empty = |
|
|
| Where to store the OAuth token (auto-created) |
|
| — | Your GA4 property ID (auto-discovered by |
|
| — | Your Google Ads API developer token |
|
| — | Default Google Ads customer ID (auto-discovered by |
|
| — | Your MCC account ID |
|
| (empty) | Your Reddit developer app (Business Manager → Developer Application) |
|
| (empty) | Default Reddit ad account for every Reddit tool (picked by |
|
| (empty) | Your Reddit username, used only in the User-Agent Reddit requires |
|
|
| Where the Reddit refresh token is stored |
|
|
| Maximum allowed daily budget per campaign |
|
|
| Force all writes to dry-run mode |
|
|
| Refuse real applies until the plan had a dry-run pass |
|
|
| Operations to block entirely |
Toolsets — trim the context footprint
Most MCP clients (claude.ai, ChatGPT, Cursor, …) load every tool schema into the model's context at the start of every conversation. AdLoop's full catalog costs roughly 18k tokens per session that way — paid before you type a word. If you only use part of AdLoop, expose a subset with the ADLOOP_TOOLSETS environment variable in your MCP client's env block (the adloop init wizard offers this and writes it into the snippets for you):
"env": { "ADLOOP_TOOLSETS": "ads,ga4" }Toolset | Covers |
| Google Ads reads, writes, and planning (Keyword Planner) |
| Google Analytics reports, realtime, key events |
| Cross-channel attribution + tracking code generation |
| Google Tag Manager audits and reads |
| Search Console reads |
| PageSpeed / Core Web Vitals |
| Merchant Center feed health |
| Reddit Ads reads, writes, and planning |
health_check and confirm_and_apply are always included, whatever you select. Unset = the full catalog; unknown names fail at startup with the valid list. The effect is real: ads,ga4 drops the session cost to ~13k tokens, and a ga4-only client pays ~2k — nearly 90% less. Toolsets are per client, not per install: one AdLoop config can serve a trimmed Cursor and a full-catalog Claude Code side by side.
On AdLoop Cloud, the same feature is per API key: pick toolsets when creating a key in the dashboard, and that key's tools/list is trimmed server-side for whichever AI client uses it.
Project Structure
src/adloop/
├── __init__.py # Entry point — routes 'adloop init' to wizard, otherwise starts MCP server
├── server.py # FastMCP server — every tool registration with safety annotations and toolset tags
├── config.py # Config loader (~/.adloop/config.yaml)
├── auth.py # OAuth 2.0 flow (user-supplied credentials, headless fallback) + service accounts; GA4 / Ads / GTM scopes
├── cli.py # Interactive 'adloop init' setup wizard
├── crossref.py # Cross-reference tools (GA4 + Ads + GTM combined analysis)
├── tracking.py # Tracking validation + code generation tools
├── ga4/
│ ├── client.py # GA4 Data + Admin API clients
│ ├── reports.py # Account summaries, reports, realtime
│ └── tracking.py # Event discovery
├── ads/
│ ├── client.py # Google Ads API client (version-pinned) + retry/backoff for rate limits
│ ├── gaql.py # GAQL query execution with human-readable error parsing
│ ├── read.py # Campaign, ad, keyword, search term, negative keyword, shared sets, recommendations, audience reads
│ ├── pmax.py # Performance Max tools — campaign/asset group performance, asset labels, top combinations
│ ├── write.py # Draft campaign, RSA, keywords; pause, enable, remove, confirm
│ └── forecast.py # Budget estimation + keyword discovery via Keyword Planner API
├── gtm/
│ ├── client.py # Google Tag Manager API v2 client
│ └── read.py # Live container fetching, tag/trigger/variable parsing, workspace diff, version history
├── reddit/
│ ├── auth.py # Reddit OAuth2 (own app, permanent refresh token, loopback flow for adloop init)
│ ├── client.py # Reddit Ads API v3 REST client — bearer refresh, per-user rate limits, pagination
│ ├── read.py # Accounts, campaigns, ad groups, ads, performance reports, pixels, targeting lookups
│ └── write.py # Draft/preflight/apply for status, budget, bid, targeting, and PAUSED creation
└── safety/
├── guards.py # Budget caps, bid limits, blocked operations, Broad Match safety
├── preview.py # Change plans and previews
└── audit.py # Mutation audit loggingRoadmap
What's been shipped and what's next:
GA4 read tools✓Google Ads read + write tools with safety layer✓Cross-reference intelligence (campaign→conversion mapping, landing page analysis, attribution comparison)✓Tracking utilities (validate events against GA4, generate gtag code)✓Budget estimation + keyword discovery via Keyword Planner✓Shared negative keyword lists (SharedSet API)✓Retry/backoff for API rate limits✓Setup wizard (adloop init)✓Claude Code support✓ —CLAUDE.md,.mcp.json,.claude/rules/,.claude/commands/, CLI wizard snippetsClaude Desktop one-click install —
adloop install claude-desktop(and/or a.dxtextension bundle) that writes the AdLoop MCP entry intoclaude_desktop_config.jsonautomatically, so Claude Desktop + Cowork users don't have to hand-edit JSONPyPI package✓ —pip install adloopAdLoop Cloud✓ — the hosted version: no Google Cloud project, no developer token, connect Google in two clicks (EU-hosted, GDPR-first)Headless server support✓ — manual URL copy-paste flow for servers without a browserBehavioral eval suites✓ — 28 prompt-and-expectation tests covering read, write, tracking, and planning workflowsGoogle Tag Manager integration✓ — read tools for tags, triggers, variables, workspaces, and version history, plus theaudit_event_coveragethree-way join across codebase events, GTM tags, and GA4 actual firesCommunity launch — HN, Indie Hackers, r/cursor, Twitter
Video walkthrough
Contributing
See CONTRIBUTING.md for guidelines. The short version: open an issue describing your situation first, then submit a PR if you want to build it.
License
MIT — see LICENSE.
Privacy
The open-source version runs entirely on your machine. No data is collected, stored, or transmitted to any server. See PRIVACY.md for the full privacy policy. AdLoop Cloud has its own privacy policy and DPA.
If AdLoop helps you run Google Ads, GA4, and tracking code from one place — give it a star or try the hosted version.
Made by @kLOsk | AdLoop Cloud | Privacy Policy
Available Tools
71 toolsadd_negative_keywordsDraft negative keywordsAInspect
Draft negative keyword additions — returns a PREVIEW.
Negative keywords prevent your ads from showing for irrelevant searches. match_type: "EXACT", "PHRASE", or "BROAD" Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| match_type | No | EXACT | |
| campaign_id | Yes | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by explicitly stating that the operation returns a PREVIEW and that execution requires a separate confirm_and_apply call. This discloses the non-destructive, two-phase behavior, providing transparency about the tool's side effects.
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 succinct and well-structured. It delivers the key action, the preview nature, and the next step in a compact, scannable format without any redundant information.
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 drafting tool, the description covers the necessary workflow: draft, preview, and confirm. It does not detail the output schema or error cases, but the availability of an output schema and the clear link to confirm_and_apply make it sufficiently complete for an agent to use 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 schema has no parameter descriptions, and the description only explains match_type values ('EXACT', 'PHRASE', or 'BROAD'). The meanings of keywords and campaign_id are implied by context but not explicitly defined, so the description only partially compensates for the missing schema coverage.
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: drafting negative keyword additions and returning a preview. It also explains the purpose (preventing ads from showing for irrelevant searches) and identifies the resource (negative keywords), making the tool's intent unmistakable.
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 gives a clear follow-up instruction ('Call confirm_and_apply with the returned plan_id to execute') and implies this is a drafting step. However, it does not explicitly compare to sibling tools like propose_negative_keyword_list or add_negative_locations, leaving some ambiguity about when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_negative_locationsDraft negative locationsAInspect
Draft negative geo location additions — returns a PREVIEW.
Use this to exclude cities/regions from a campaign while keeping broader positive targets such as State of Sao Paulo. geo_target_ids are numeric Google geo target constant IDs. Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| customer_id | No | ||
| geo_target_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states the tool returns a preview and does not apply changes immediately, which aligns with the destructiveHint=false annotation. It mentions the returned plan_id and the need to call confirm_and_apply to execute, making the two-step behavior fully transparent. No contradictions exist between the description and annotations.
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 brief and to the point, using only three sentences to convey the purpose, usage, and execution flow. It avoids unnecessary detail and is well-structured, making it easy for an agent to parse and act on quickly.
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 description covers the core workflow, including the preview nature, the return of a plan_id, and the need for confirm_and_apply. It does not detail the output schema or error handling, but given the simple parameter set and the mention of a plan_id, it is sufficiently complete for the intended use. Minor gaps like assumed knowledge of campaign_id and customer_id prevent a perfect score.
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 description explains the semantics of geo_target_ids (numeric Google geo target constant IDs) but does not elaborate on campaign_id or customer_id. Since the schema provides no descriptions (0% coverage), the description only partially compensates. The purpose of customer_id and campaign_id is assumed rather than explicitly clarified, which could lead to misuse.
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 drafts negative geo location additions and returns a preview, distinguishing it from direct modifications. It explicitly mentions the use case of excluding cities/regions while keeping broader targets, and references the separate confirm_and_apply tool for execution. This is a specific verb ('Draft') and resource ('negative locations'), making its purpose unambiguous even among sibling tools.
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 guidance on when to use the tool: to exclude cities/regions from a campaign while retaining broader positive targets. It also specifies the required parameter format (numeric Google geo target constant IDs) and directs the user to call confirm_and_apply with the returned plan_id for execution. This leaves no ambiguity about the workflow or when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_to_negative_keyword_listDraft additions to a negative keyword listAInspect
Append keywords to an EXISTING shared negative keyword list — returns a PREVIEW.
Use this when a suitable list already exists and only needs more keywords (instead of propose_negative_keyword_list, which creates a new list). Always call get_negative_keyword_lists first to find the right shared_set_id and get_negative_keyword_list_keywords to avoid duplicating existing terms.
shared_set_id: numeric ID from get_negative_keyword_lists (shared_set.id). keywords: list of keyword strings to append (duplicates in the input list are collapsed). match_type: "EXACT", "PHRASE", or "BROAD"
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| match_type | No | EXACT | |
| customer_id | No | ||
| shared_set_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description says tool returns a preview and requires confirm_and_apply to execute, implying it does not directly modify state. However, annotations declare readOnlyHint: false, which contradicts this by suggesting it does modify. This inconsistency undermines transparency.
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?
Well-organized with separate lines for purpose, usage, parameters, and next step. No redundant info; concise and scannable.
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?
Covers purpose, usage, prerequisites, parameter details, and the workflow with confirm_and_apply. Also mentions related get_tools. Complete for effective use.
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?
Explains shared_set_id, keywords, and match_type with values, but omits explanation for customer_id. However, most parameters are well described, adding context beyond 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?
Clearly states the verb 'Append', object 'keywords to an EXISTING shared negative keyword list', and distinguishes from creating a new list. Includes explicit use case.
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 states when to use this tool versus propose_negative_keyword_list, and instructs to first call get_negative_keyword_lists and get_negative_keyword_list_keywords to avoid duplication. Also mentions follow-up action confirm_and_apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_campaign_conversionsCampaign conversions against AnalyticsARead-onlyInspect
Campaign clicks → GA4 conversions mapping — the real cost-per-conversion.
Combines Google Ads campaign metrics with GA4 session/conversion data to reveal click-to-session ratios (GDPR indicator), compare Ads-reported vs GA4-reported conversions, and compute cost-per-GA4-conversion.
Also returns non-paid channel conversion rates for comparison context. Date format: "YYYY-MM-DD". Empty = last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| property_id | No | ||
| campaign_name | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only and non-destructive behavior, and the description aligns perfectly by focusing on analysis and reporting without mentioning any side effects or data modifications. No contradiction exists.
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 concise and well-structured, using a clear title and two short paragraphs. Every sentence adds value—no fluff or 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 description covers the core functionality, outputs, and even mentions the GDPR indicator and non-paid channel context. While it does not elaborate on the output schema, the description is sufficient for an agent to understand the tool's purpose and decide when to invoke it.
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 description provides some parameter semantics by specifying the date format and default behavior for date_range_start/end, but it does not explain customer_id, property_id, or campaign_name. Since schema coverage is 0%, more explanation would be expected, but the provided details are helpful.
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: 'Campaign clicks → GA4 conversions mapping — the real cost-per-conversion.' It specifies the data sources (Google Ads and GA4) and the outputs (click-to-session ratios, conversion comparison, cost-per-GA4-conversion). This distinct purpose differentiates it from sibling tools like get_campaign_performance or run_ga4_report.
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 outlines the intended use case, such as revealing GDPR indicators and comparing Ads vs GA4 conversions, but it does not explicitly name alternative tools or state when to use this over others. However, the specificity of the function makes the usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_page_speedPageSpeed analysisARead-onlyInspect
Run PageSpeed Insights for a landing page — Lighthouse + real-user data.
Returns the performance score (0-100), lab Core Web Vitals (LCP, CLS, TBT, FCP), CrUX field data from real Chrome users where available (p75 LCP/INP/CLS + FAST/AVERAGE/SLOW ratings), and the top improvement opportunities with estimated savings.
Use on ad final_urls: slow landing pages depress Quality Score and waste paid clicks. strategy: "mobile" (default — most paid traffic) or "desktop". Takes 10-30s; that is normal for a Lighthouse run.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| strategy | No | mobile |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the runtime (10-30s) and that it combines Lighthouse and real-user data, going beyond the readOnly annotation. It implies no side effects, consistent with the annotations, and provides useful operational 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 concise and well-structured: what it does, what it returns, when to use, and runtime. It packs essential information without fluff or 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 description covers purpose, output summary, usage context, and runtime, making it complete for an agent to decide and call. It provides a clear summary of the output schema without needing to enumerate every field.
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 description clarifies the strategy parameter with its default ('mobile') and explains the rationale ('most paid traffic'), adding meaning beyond the bare schema. The url parameter is self-explanatory and needs no further elaboration.
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 runs PageSpeed Insights for a landing page, returning performance scores, lab/field data, and opportunities. It explicitly ties usage to ad final URLs, making the purpose distinct and actionable.
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?
It explicitly says to use on ad final URLs because slow landing pages depress Quality Score and waste paid clicks, giving clear when-to-use guidance. The mention of strategy default and runtime further supports proper usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attribution_checkAttribution checkARead-onlyInspect
Compare Ads-reported conversions vs GA4 — find tracking discrepancies.
Checks whether conversions reported by Google Ads match what GA4 records, diagnoses GDPR consent gaps, attribution model differences, and missing conversion event configuration.
conversion_events: optional list of GA4 event names to specifically check (e.g. ["sign_up", "purchase"]). If omitted, compares aggregate totals only. Date format: "YYYY-MM-DD". Empty = last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| property_id | No | ||
| date_range_end | No | ||
| date_range_start | No | ||
| conversion_events | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation (no destructive actions implied) and adds useful behavioral context beyond the annotation by explaining what the tool diagnoses (consent gaps, attribution differences, missing configuration). It does not describe side effects, which is appropriate given the read-only nature, and there is no contradiction.
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 structure is reasonably organized with a summary line and a detail line, but it contains redundancy: 'Compare Ads-reported conversions vs GA4 — find tracking discrepancies' essentially restates 'Checks whether conversions reported by Google Ads match what GA4 records'. This repetition could be trimmed without losing information, though the parameter notes are clear and well-placed.
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 that an output schema is present, it is not necessary to describe return values. The description covers the core behavior, parameter defaults, and date handling, which is sufficient for an agent to invoke the tool correctly. Minor gaps remain around the exact identifiers (customer_id/property_id) and any assumptions about required permissions, but these do not materially impede use.
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 has zero parameter descriptions, but the description compensates for the non-obvious parameters: it explains conversion_events (optional list of GA4 events, null defaults to aggregate comparison) and the date range format with the 30-day fallback. However, customer_id and property_id are left undefined—their meaning (likely Google Ads customer ID and GA4 property ID) is only inferred from the tool name and context, so the compensation is incomplete.
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 specific function: comparing Ads-reported conversions against GA4 data and finding tracking discrepancies. It goes beyond generic verbs like 'check' to name concrete diagnostic outputs (GDPR consent gaps, attribution model differences, missing conversion event configuration), which distinguishes it from the many reporting tools in the sibling list.
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 some practical usage details, such as optional conversion_events filtering, date format expectations, and the default 30-day window when dates are empty. However, it does not explicitly state when to prefer this tool over closely related siblings like audit_event_coverage, validate_tracking, or analyze_campaign_conversions, nor does it mention what scenarios are out of scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_event_coverageTracking coverage auditARead-onlyInspect
Three-way audit: codebase events ↔ GTM tags ↔ GA4 actual fires.
First, search the user's codebase for gtag('event', ...) and
dataLayer.push({event: ...}) calls and extract every distinct event name.
Pass that list as expected_events. The tool fetches the LIVE GTM
container, joins it against GA4 event counts for the date range, and
returns a per-event matrix with one of these statuses:
ok — tag active and event firing
ok_auto_collected — GA4 Enhanced Measurement event, no tag needed
no_tag_no_fire — codebase event, no GTM tag, never fires
tag_paused — GTM tag exists but is paused
tag_active_but_not_firing — tag is active but no GA4 hits
gtm_only_firing — GA4 event from a tag, not in codebase
gtm_paused_but_firing — only paused tag(s), not in codebase, yet
GA4 still fires (event comes from elsewhere)
gtm_only_not_firing — tag exists, not in codebase, no fires
ga4_only — fires in GA4, no tag, no codebase ref
ga4_fires_no_tag — codebase event firing without a GTM tag
auto_event_only — Enhanced Measurement event with no codebase ref
Also surfaces dynamic-event tags ({{Event}} variables) and Custom HTML tags that the audit cannot interpret automatically.
GTM IDs come from Tag Manager UI → Admin → Container Settings. Date format: "YYYY-MM-DD". Empty = last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| property_id | No | ||
| date_range_end | No | ||
| gtm_account_id | No | ||
| expected_events | Yes | ||
| date_range_start | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description is consistent with these. It adds substantial behavioral detail: the tool fetches the LIVE GTM container, joins GA4 counts, and returns a per-event matrix with enumerated statuses. It also transparently surfaces limitations by stating that dynamic-event tags and Custom HTML tags cannot be interpreted automatically. This goes well beyond the annotations and gives the agent a clear picture of what the tool will and won't do.
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 long but every sentence earns its place: the purpose is front-loaded, input preparation is clear, and the exhaustive status list is necessary to convey the output matrix. It is structured with line breaks and a bullet-like list, making it scannable. While it could be trimmed slightly (e.g., some statuses are self-explanatory), the detail is justified given 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?
The tool is complex with multiple inputs, an output schema, and a detailed status taxonomy. The description covers the audit process, input preparation, output semantics (via statuses), and known limitations. It also mentions the date-range default. Given that an output schema exists, it does not need to describe return structures, and it omits nothing critical for an agent to invoke the tool correctly. The coverage is comprehensive for its 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?
With schema description coverage at 0%, the description carries the burden of explaining parameters. It thoroughly explains expected_events ('Pass that list as expected_events'), date range ('Date format: YYYY-MM-DD. Empty = last 30 days'), and GTM IDs ('GTM IDs come from Tag Manager UI → Admin → Container Settings'). The GA4 property_id is not explicitly named, but the description's mention of GA4 event counts implies its necessity. It adds meaning to most parameters but leaves property_id to inference, so it's strong but not perfect.
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 opens with a clear, specific verb-resource statement: 'Three-way audit: codebase events ↔ GTM tags ↔ GA4 actual fires.' It names the exact components and distinguishes itself from generic tracking tools by describing the cross-referencing behavior. The detailed status list further clarifies the tool's scope, making it unambiguous among siblings like validate_tracking.
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?
It provides clear context on how to prepare inputs: how to extract expected_events from the codebase, where to find GTM IDs, and the date format. However, it does not explicitly state when to use this tool versus alternatives like validate_tracking or get_tracking_events, nor does it give exclusion conditions. It offers strong contextual guidance but no explicit when-not or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_and_applyApply a previewed changeADestructiveInspect
Execute a previously previewed change.
IMPORTANT: Defaults to dry_run=True. You MUST explicitly pass dry_run=false to make real changes to the Google Ads account.
Config override: if 'safety.require_dry_run: true' is set in the user's config file (default ~/.adloop/config.yaml), dry_run=false is IGNORED and this tool will keep returning DRY_RUN_SUCCESS. When that happens the response includes 'dry_run_forced_by', 'config_path', and 'remediation' fields — surface those to the user verbatim and STOP retrying. Calling this tool again with dry_run=false will not change anything until the user edits the config file, sets 'require_dry_run: false', and restarts the AdLoop MCP server.
Two-phase apply: if 'safety.two_phase_apply: true' is set (always on for AdLoop Cloud tenants), dry_run=false is REFUSED with status DRY_RUN_REQUIRED until this plan_id has completed one dry_run=true pass. Run the dry run, show it to the user, then apply for real.
The plan_id comes from a prior draft_* or pause/enable tool call.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| plan_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations (readOnlyHint=false, destructiveHint=true) by detailing the dry_run default, the config override that can force dry_run, the two-phase apply refusal behavior, and the exact response fields to surface. This full transparency helps the agent understand potential non-committal behavior.
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 somewhat verbose with repeated warnings, but each paragraph conveys necessary safety-critical information (default behavior, config override, two-phase apply). The structure is logical and every sentence earns its place, though a slightly more compact phrasing could improve readability.
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 description is complete for a destructive tool: it covers the dry_run default, config overrides, two-phase apply behavior, response fields to surface, and the source of plan_id. Given the complexity and risk, nothing essential 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?
Even though the schema has 0% description coverage, the description fully explains both parameters: plan_id is described as coming from prior draft_* or pause/enable calls, and dry_run is explained in detail—its default value, how to override it, and the consequences. This completely compensates for the lack of schema-level descriptions.
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 purpose: 'Execute a previously previewed change.' It uses a specific verb and object, and distinguishes itself from sibling tools like draft_*, update_*, and pause/enable by focusing on applying an already-prepared plan.
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 explains when to use the tool: after a prior draft_* or pause/enable call (since 'The plan_id comes from a prior draft_* or pause/enable tool call'). It also provides critical usage guidance about the dry_run parameter, including the need to pass dry_run=false to make real changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_keywordsKeyword ideasARead-onlyInspect
Discover new keyword ideas using Google Ads Keyword Planner.
Mirrors the "Discover new keywords" UI in Keyword Planner:
Start with keywords: pass seed_keywords (e.g. ["running shoes"])
Start with a website: pass url (e.g. "https://example.com/products")
Set include_monthly_volumes=true for per-month search history (last 24 months, top-20 ideas) plus a seasonality insight — use when the user asks about demand trends, seasonality, or "when should I ramp budget".
Both together: keywords + url for more targeted ideas
Returns keyword ideas sorted by avg monthly search volume, with competition level (LOW/MEDIUM/HIGH) and top-of-page bid range.
geo_target_id: geo target constant (2276=Germany, 2840=USA, 2826=UK) language_id: language constant (1000=English, 1001=German, 1002=French) page_size: max keyword ideas to return (default 50, max 1000)
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| page_size | No | ||
| customer_id | No | ||
| language_id | No | 1000 | |
| geo_target_id | No | 2276 | |
| seed_keywords | No | ||
| include_monthly_volumes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates the operation is read-only, and the description adds transparency by summarizing the output (keyword ideas sorted by avg monthly search volume, competition, bid range). It does not introduce any contradiction with the annotation.
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 well-structured with bullets for input modes and a separate paragraph for include_monthly_volumes, followed by output details and parameter hints. It is somewhat repetitive but remains concise and easy to scan.
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?
It provides enough context for an agent to understand the tool's purpose, when to use the optional flag, and what to expect in response. It lacks an explicit statement about the output schema, but that is not required given that the output format is described in prose.
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 description explains the purpose of seed_keywords, url, include_monthly_volumes, geo_target_id, language_id, and page_size with examples. It does not describe customer_id, which is a gap given that the schema itself has no parameter descriptions (coverage 0%).
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 verb 'Discover' clearly indicates the action, and 'new keyword ideas using Google Ads Keyword Planner' specifies the resource and purpose. It is distinct from sibling tools like get_keyword_performance or get_search_terms, which focus on existing data rather than generation of new ideas.
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?
It provides explicit guidance on when to use include_monthly_volumes ('when the user asks about demand trends, seasonality, or 'when should I ramp budget'') and explains the two input modes (keywords or URL). However, it does not directly contrast with sibling tools for when this tool is the better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_ad_groupDraft an ad groupAInspect
Draft a new ad group within an existing campaign — returns a PREVIEW, does NOT create.
Creates an ad group (ENABLED, type SEARCH_STANDARD) in the specified campaign. Optionally includes keywords in the same atomic operation.
campaign_id: The campaign to add the ad group to (get from get_campaign_performance). ad_group_name: Name for the new ad group. keywords: Optional list of {"text": "keyword", "match_type": "EXACT|PHRASE|BROAD"}. cpc_bid_micros: Optional ad group CPC bid in micros (only for MANUAL_CPC campaigns).
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | No | ||
| campaign_id | Yes | ||
| customer_id | No | ||
| ad_group_name | Yes | ||
| cpc_bid_micros | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'returns a PREVIEW, does NOT create' and mentions atomic keyword inclusion, making the tool's non-destructive behavior clear despite annotations indicating otherwise.
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 concise but slightly redundant (first sentence and second sentence overlap). It is well-structured with clear parameter descriptions and a next-step note.
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?
It provides enough context for a draft operation, including the follow-up action. It does not mention error cases, but for a preview tool it is sufficiently 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?
The description explains the purpose of most parameters: campaign_id, ad_group_name, keywords, and cpc_bid_micros. Only customer_id is left unexplained, but it has a default and is less critical.
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 purpose: 'Draft a new ad group within an existing campaign' and emphasizes it returns a preview, not a creation. This is specific and distinguishes it from creation tools.
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?
It gives usage context by explaining the draft nature and directs the agent to call confirm_and_apply with the returned plan_id. However, it does not explicitly compare with alternatives like update_ad_group, but the preview aspect implies when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_calloutsDraft calloutsCInspect
Draft campaign callout assets — returns a PREVIEW.
| Name | Required | Description | Default |
|---|---|---|---|
| callouts | Yes | ||
| campaign_id | Yes | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions 'returns a PREVIEW,' which implies the operation is not immediately destructive, but it does not clarify whether a draft is persisted or has side effects. The annotations indicate readOnlyHint false and destructiveHint false, but the description alone leaves the behavior ambiguous regarding whether any state is modified.
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 exceptionally concise, consisting of a single sentence that communicates the core action and a notable output characteristic. It avoids unnecessary elaboration while still conveying key information.
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 description lacks important contextual details. It does not explain that this tool is part of a draft-then-apply workflow (given the existence of confirm_and_apply), nor does it specify the expected output structure or how errors are handled. The context of similar tools (e.g., draft_campaign, draft_sitelinks) is not leveraged to clarify the tool's role.
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 parameters campaign_id, callouts, and customer_id are listed with types and requiredness, but no descriptions of their meaning or expected format are provided. For instance, it is unclear what format the callouts array strings should take (e.g., plain text, character limits, or any validation rules).
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 action (draft) and the resource (campaign callout assets), and explicitly notes that it returns a preview. The verb 'draft' and the preview mention make the tool's primary purpose understandable, though the exact meaning of 'draft' in this context is not fully elaborated.
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 no guidance on when to use this tool versus other drafting tools (e.g., draft_sitelinks, draft_campaign) or when to prefer a different approach. It does not mention any prerequisites, nor does it explain the workflow relationship with confirm_and_apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_campaignDraft a campaignAInspect
Draft a full campaign structure — returns a PREVIEW, does NOT create anything.
Creates: CampaignBudget + Campaign (PAUSED) + AdGroup + optional Keywords
geo targeting + language targeting. Ads are NOT included — use draft_responsive_search_ad after the campaign exists.
bidding_strategy: MAXIMIZE_CONVERSIONS | TARGET_CPA | TARGET_ROAS | MAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | MANUAL_CPC target_cpa: required if bidding_strategy is TARGET_CPA (in account currency) target_roas: required if bidding_strategy is TARGET_ROAS keywords: list of {"text": "keyword", "match_type": "EXACT|PHRASE|BROAD"} search_partners_enabled: include ads on Search partners display_network_enabled: enable Search campaign display expansion display_expansion_enabled: alias for display_network_enabled max_cpc: manual CPC bid for the initial ad group when bidding_strategy is MANUAL_CPC, or the Maximize Clicks CPC cap when bidding_strategy is TARGET_SPEND geo_target_ids: REQUIRED list of geo target constant IDs Common: "2276" Germany, "2040" Austria, "2756" Switzerland, "2840" USA, "2826" UK, "2250" France. Full list: Google Ads API geo target constants. language_ids: REQUIRED list of language constant IDs Common: "1001" German, "1000" English, "1002" French, "1004" Spanish, "1014" Portuguese. Full list: Google Ads API language constants.
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| max_cpc | No | ||
| keywords | No | ||
| target_cpa | No | ||
| customer_id | No | ||
| target_roas | No | ||
| channel_type | No | SEARCH | |
| daily_budget | Yes | ||
| language_ids | Yes | ||
| ad_group_name | No | ||
| campaign_name | Yes | ||
| geo_target_ids | Yes | ||
| bidding_strategy | Yes | ||
| display_network_enabled | No | ||
| search_partners_enabled | No | ||
| display_expansion_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'returns a PREVIEW, does NOT create anything' and instructs to call confirm_and_apply to execute, which contradicts the annotation readOnlyHint=false. This annotation implies the tool may modify data, creating a direct conflict with the description's claim of no actual creation.
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 logically structured with bullet points and covers all key aspects, but it is somewhat verbose with repeated parameter explanations. It could be tightened slightly without losing clarity.
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 description provides all necessary context: what the tool does, what it does not do, parameter details including required fields and examples, and the next step (confirm_and_apply). It is sufficiently comprehensive for an agent to use 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 description adds significant meaning to the parameters, explaining bidding_strategy options, target_cpa/roas requirements, max_cpc behavior, and providing common geo and language ID examples. This goes well beyond the schema's bare types and defaults.
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 it drafts a full campaign structure and returns a preview, explicitly listing what is created in the preview and what is excluded (ads). It distinguishes itself from other drafting tools like draft_responsive_search_ad.
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 explains when to use the tool (to draft a campaign) and when to use a follow-up tool (draft_responsive_search_ad after the campaign exists). It also directs the user to confirm_and_apply to execute the preview, providing a clear workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_create_conversion_actionDraft a conversion actionAInspect
Draft a new Google Ads ConversionAction — returns a PREVIEW.
type_: AD_CALL, WEBSITE_CALL, WEBPAGE, WEBPAGE_CODELESS, GOOGLE_ANALYTICS_4_CUSTOM, etc. category: PHONE_CALL_LEAD, SUBMIT_LEAD_FORM, PURCHASE, ... (default DEFAULT).
A positive default_value with always_use_default_value=False is a legal "fallback" config — the preview warns but does NOT flip the flag. include_in_conversions_metric is IMMUTABLE on create (change it later via draft_update_conversion_action). Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type_ | Yes | ||
| category | No | DEFAULT | |
| customer_id | No | ||
| counting_type | No | ONE_PER_CLICK | |
| currency_code | No | USD | |
| default_value | No | ||
| primary_for_goal | No | ||
| attribution_model | No | ||
| always_use_default_value | No | ||
| view_through_window_days | No | ||
| click_through_window_days | No | ||
| phone_call_duration_seconds | No | ||
| include_in_conversions_metric | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently explains that the action returns a preview and does not apply until confirmed, aligning with the annotations (readOnlyHint=false, destructiveHint=false). It also details the fallback behavior for default_value and the immutability flag, disclosing the tool's operational nuances without contradicting annotations.
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 concise and well-structured, using line breaks to separate distinct concepts. It avoids unnecessary verbosity, though the repeated 'legal fallback' phrase adds slight redundancy. Overall, it is efficient and readable.
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 description covers the tool's purpose, return behavior (preview with plan_id), and next steps (confirm_and_apply), which is sufficient for a draft operation. It does not explain every parameter, but that gap is partially addressed in parameter semantics. Given the availability of an output schema (not shown), the description adequately contextualizes the workflow.
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 description provides meaningful explanations for several key parameters (type_, category, default_value, always_use_default_value, include_in_conversions_metric) but leaves others (counting_type, currency_code, primary_for_goal, attribution_model, windows, phone duration) undefined. Since schema coverage is 0%, the description partially compensates but not fully, warranting a moderate score.
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 'Draft a new Google Ads ConversionAction — returns a PREVIEW,' identifying the specific action and its preview nature. It distinguishes from sibling tools like draft_update_conversion_action and draft_remove_conversion_action, 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 explicitly instructs to 'Call confirm_and_apply with the returned plan_id to execute,' providing a clear next step. It also notes that include_in_conversions_metric is immutable on create and suggests using draft_update_conversion_action for changes, guiding appropriate usage among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_demographic_targetingDraft demographic targetingAInspect
Draft demographic targeting (age/gender/parental status/income) — returns a PREVIEW.
By default, Google Ads serves to all demographic segments. This tool adds criteria that EXCLUDE a segment (negative=True, default) or NARROW targeting to it (negative=False — uncommon).
Provide exactly one of ad_group_id or campaign_id. At least one of
the four demographic lists must contain a value.
Accepted values:
age_ranges: '18-24', '25-34', '35-44', '45-54', '55-64', '65+'. Google's buckets are FIXED — 'Exclude 23-35' has no exact mapping; ask the user which buckets to use.
genders: 'female', 'male', 'undetermined'
parental_statuses: 'parent', 'not_a_parent', 'undetermined'
income_ranges: PERCENTILES (not currency). 'top-10', '11-20', '21-30', '31-40', '41-50', 'lower-50', 'undetermined'. Available in select countries only (US, AU, JP, etc.).
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| genders | No | ||
| negative | No | ||
| age_ranges | No | ||
| ad_group_id | No | ||
| campaign_id | No | ||
| customer_id | No | ||
| income_ranges | No | ||
| parental_statuses | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is transparent about the tool's non-committal nature: it 'returns a PREVIEW' and requires a separate confirm_and_apply call to execute. This aligns with the annotations (readOnlyHint=false, destructiveHint=false) and clarifies that no immediate changes are applied.
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 well-organized with clear sections and bullet lists, making the constraints and accepted values easy to scan. It avoids fluff and each sentence serves a purpose, such as explaining the default negative behavior and the requirement to call confirm_and_apply.
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 complexity (multiple optional lists, negative flag, and confirmation step), the description provides sufficient context: it states the preview nature, the required selection constraints, the exact accepted enum-like values, and the follow-up action. This is enough for an agent to use the tool correctly without additional documentation.
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 description thoroughly explains the meaning and accepted values for most parameters, including negative boolean, age_ranges, genders, parental_statuses, and income_ranges with country limitations. However, customer_id is present in the schema but not mentioned in the description, leaving its role or necessity unaddressed.
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 action ('Draft demographic targeting') and the specific resource it operates on (age/gender/parental status/income segments). It also distinguishes its preview-only behavior and explicitly points to confirm_and_apply for execution, which differentiates it from related tools.
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 explains when to use the tool (to exclude or narrow demographic targeting) and provides key constraints: exactly one of ad_group_id or campaign_id, and at least one demographic list. It also lists all accepted values and instructs to call confirm_and_apply with the returned plan_id, giving clear next-step guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_image_assetsDraft image assetsBInspect
Draft campaign image assets from local PNG, JPEG, or GIF files.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| customer_id | No | ||
| image_paths | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, which already convey that this is a non-read-only, non-destructive operation. The description adds that it drafts from local files, but does not disclose deeper side effects like whether existing drafts are replaced or if any confirmation is required. With annotations present, this is adequate but not thorough.
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, focused sentence that directly states the purpose and the accepted input file types. It is concise and well-structured with no redundant 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?
The description is minimal and leaves out critical context. It does not mention what happens after drafting (e.g., whether assets are automatically applied or need approval), any output format, or the significance of the customer_id. Given that this is a creation-like operation with potential side effects, the lack of such details makes it incomplete.
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 0%. The description does not explain any of the three parameters (campaign_id, customer_id, image_paths). The tool description offers no clues about what these parameters mean or how they should be supplied, leaving the agent completely in the dark.
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 verb 'Draft' and the resource 'campaign image assets', and further specifies the accepted file types (PNG, JPEG, GIF). This is unambiguous and distinguishes it from other drafting tools for campaigns, ad groups, etc.
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 no explicit guidance on when to use this tool versus alternatives. It only states what it does; there is no mention of when not to use it or how it compares to other drafting tools (e.g., draft_campaign).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_key_eventDraft an Analytics key eventAInspect
Draft marking a GA4 event as a key event (conversion) — returns a PREVIEW.
The fix for "the event fires but isn't tracked as a conversion": attribution_check / validate_tracking diagnose it, this closes the loop. counting_method: ONCE_PER_EVENT (purchases) or ONCE_PER_SESSION (sign-ups). Call confirm_and_apply with the returned plan_id to execute. Applies to future data only.
| Name | Required | Description | Default |
|---|---|---|---|
| event_name | Yes | ||
| property_id | No | ||
| counting_method | No | ONCE_PER_EVENT |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explicitly states it returns a PREVIEW and requires confirm_and_apply to execute, so it does not directly modify state. Also notes 'Applies to future data only', which sets expectations. This aligns with annotations (readOnlyHint false, destructiveHint false) and adds useful detail.
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 reasonably concise but has some redundancy (e.g., the repeated 'the fix for' phrasing and quotes). It is structured in short lines, but could be tightened without losing information.
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?
Provides enough context for drafting: mentions preview, plan_id for confirmation, and future-data scope. The output schema is not described but its existence is indicated, so a user can infer that confirm_and_apply will require the returned plan_id. Slight gap on property_id semantics.
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?
While event_name is obvious and counting_method is explained with examples, property_id is not described in the text. Since the schema has no descriptions (coverage 0%), the description should compensate but fails to explain what property_id represents or when to override its default.
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 drafts a GA4 key event and returns a preview, distinguishing it from execution tools like confirm_and_apply. It also specifies the diagnostic context (fixing untracked conversions) which clarifies its role.
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?
Provides when-to-use guidance by referencing attribution_check and validate_tracking as diagnostics that precede this action. It also mentions counting_method examples but does not explicitly list when not to use it or alternative tools beyond the implicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_keywordsDraft keywordsAInspect
Draft keyword additions — returns a PREVIEW, does NOT add keywords.
keywords: list of {"text": "keyword phrase", "match_type": "EXACT|PHRASE|BROAD"} Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| ad_group_id | Yes | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states that the tool does not add keywords and returns a preview, disclosing its non-final nature. This goes beyond the annotations (readOnlyHint=false) to explain the draft workflow.
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 concise, using two short sentences to convey the tool's purpose and workflow. It is well-structured 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 description provides enough context by referencing the 'confirm_and_apply' tool and the workflow of drafting before applying. It effectively differentiates from sibling tools like 'add_negative_keywords' or 'draft_ad_group'. The existence of output schema reduces the need to describe return values.
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 description explains the structure of the 'keywords' parameter, specifying the required fields (text and match_type) and allowed match_type values. However, it does not describe 'ad_group_id' or 'customer_id', leaving those parameters undefined. With only one of three parameters described, the coverage is low and not fully compensated.
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 drafts keyword additions and returns a preview, distinguishing it from tools that actually add keywords. It names the specific resource (keywords) and the action (draft).
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 directs the user to call confirm_and_apply with the returned plan_id to execute, providing clear next steps. It also warns that no keywords are added immediately, guiding appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_remove_conversion_actionDraft removing a conversion actionAInspect
Draft a REMOVAL of a ConversionAction — returns a PREVIEW.
Removal stops counting and drops the action from goal lists; historical data is preserved but the action is irreversible. SMART_CAMPAIGN_* and GOOGLE_HOSTED types reject removal with MUTATE_NOT_ALLOWED. Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| conversion_action_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explains the conceptual effect of removal (stops counting, drops from goal lists, preserves history, irreversible). Since annotations only show readOnlyHint=false and destructiveHint=false, this context is additive and not contradictory for a draft operation.
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?
Compact, well-structured description with a clear purpose, follow-up instruction, and constraint note. 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?
Provides the essential workflow (draft -> confirm_and_apply) and key restrictions, and an output schema is present. Minor gap is lack of explicit parameter guidance for the two input fields.
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?
Input schema has 0% parameter descriptions and the description does not explain customer_id or conversion_action_id format/value. The target is inferable from the tool name, but the description does not compensate for the missing schema detail.
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 it drafts a removal of a ConversionAction and returns a preview. Distinguishes from sibling draft_create and draft_update actions.
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 instructs to call confirm_and_apply with the returned plan_id to execute, and notes SMART_CAMPAIGN_* and GOOGLE_HOSTED types will reject removal, giving the agent actionable selection and post-draft steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_responsive_search_adDraft a responsive search adAInspect
Draft a Responsive Search Ad — returns a PREVIEW, does NOT create the ad.
Provide 3-15 headlines (max 30 chars each) and 2-4 descriptions (max 90 chars each). The preview shows exactly what will be created. Call confirm_and_apply to execute.
Each headline/description entry may be either:
a plain string (unpinned), or
a dict
{"text": "...", "pinned_field": "HEADLINE_1"}(pinned).
Valid pin values: headlines: HEADLINE_1, HEADLINE_2, HEADLINE_3 descriptions: DESCRIPTION_1, DESCRIPTION_2
Google caps: at most 2 headlines per pin slot, at most 1 description per pin slot. Mixed plain-string and dict entries are allowed within a single call (e.g. brand pinned to HEADLINE_1, the rest unpinned).
| Name | Required | Description | Default |
|---|---|---|---|
| path1 | No | ||
| path2 | No | ||
| final_url | Yes | ||
| headlines | Yes | ||
| ad_group_id | Yes | ||
| customer_id | No | ||
| descriptions | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given the annotations (readOnlyHint: false, destructiveHint: false) which are ambiguous, the description adds critical transparency by stating it returns a preview and does NOT create the ad, and that confirm_and_apply is needed to execute. This clearly communicates the tool's non-destructive, non-read-only nature.
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 concise overall, but there is minor redundancy: the opening line 'returns a PREVIEW, does NOT create the ad' is reiterated later with 'Call confirm_and_apply to execute.' The structure uses clear bullet points for the headline/description format, making it scannable, but a small trim would improve efficiency.
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 drafting tool, the description covers the essential context: what it does, its relationship to confirm_and_apply, and the critical input constraints. It does not describe the preview's content or error scenarios, but given the tool's straightforward nature and the presence of sibling tools, this is reasonably 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?
The schema has zero description coverage for parameters, so the description must compensate. It thoroughly explains headlines and descriptions (including constraints and pinned object format), but leaves ad_group_id, final_url, path1, path2, and customer_id without any explanation. While some may be self-explanatory, the description only partially covers the parameter semantics.
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 purpose: to draft a responsive search ad and return a preview without creating it. It explicitly distinguishes itself from the confirm_and_apply tool, leaving no ambiguity about its role.
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 concrete usage guidance: it mentions the need to call confirm_and_apply for execution, specifies the required number and character limits for headlines and descriptions, and explains the pinned format. It also clarifies that this tool does not create the ad, acting as an explicit when-not-to-use indicator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_sitelinksDraft sitelinksAInspect
Draft sitelink extensions for a campaign — returns a PREVIEW.
Sitelinks appear as additional links below your ad, increasing click area and directing users to specific pages.
campaign_id: the campaign to attach sitelinks to sitelinks: list of dicts, each with: - link_text (str, required, max 25 chars) — the clickable text shown - final_url (str, required) — destination URL for this sitelink - description1 (str, optional, max 35 chars) — first description line - description2 (str, optional, max 35 chars) — second description line
Google recommends at least 4 sitelinks per campaign. Fewer than 2 may not show.
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| sitelinks | Yes | ||
| campaign_id | Yes | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly conveys that the tool creates a draft and returns a preview, and that actual execution requires a separate confirm_and_apply call. This explains the side-effect (non-destructive, non-read-only) beyond the minimal annotations, which only indicate readOnlyHint=false and destructiveHint=false.
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 well-structured with a clear lead line, parameter breakdown, recommendation, and execution note. It is reasonably concise, though the parameter list is somewhat repetitive with the schema. Every element adds value, and no extraneous content is present.
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 drafting tool, the description covers the purpose, input parameters, a usage constraint, and the next step (confirm_and_apply). It does not detail the output schema or error scenarios, but given the presence of an output schema and the straightforward drafting nature, it is sufficiently complete for an agent to call it 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 description explains the two required parameters (campaign_id and sitelinks) and the subfields of each sitelink item (link_text, final_url, description1, description2). However, it omits the optional customer_id parameter, and the schema has zero description coverage, so a small gap remains. Overall, the key parameters are well explained.
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: drafting sitelink extensions for a campaign and returning a preview. It also distinguishes itself from related drafting tools by the resource type (sitelinks) and the explicit workflow of confirming with confirm_and_apply.
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?
Provides some usage guidance (Google recommends at least 4 sitelinks, fewer than 2 may not show, and the need to call confirm_and_apply to execute), but does not explicitly state when to use this tool versus alternatives like draft_callouts or draft_structured_snippets. The purpose is clear from the name, but explicit when/when-not guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_structured_snippetsDraft structured snippetsAInspect
Draft campaign structured snippet assets — returns a PREVIEW.
| Name | Required | Description | Default |
|---|---|---|---|
| snippets | Yes | ||
| campaign_id | Yes | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes that it 'returns a PREVIEW', which clarifies the non-final nature of the operation. However, it does not specify whether any underlying draft data is persisted, and annotations are minimal.
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, concise sentence that efficiently conveys the tool's purpose.
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 lack of parameter explanations and only a vague mention of a preview return, the description is insufficient for an agent to correctly construct the required input or understand the full output.
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 has no property descriptions, and the description does not explain the structure of the 'snippets' array or the other parameters. This leaves significant ambiguity for the agent.
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 verb 'Draft' and the specific object 'campaign structured snippet assets', and distinguishes it from other draft tools for different asset types like callouts and sitelinks.
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 by naming the asset type, but does not explicitly contrast with sibling tools or provide conditions for when to use it over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_update_conversion_actionDraft conversion action changesAInspect
Draft a partial UPDATE of an existing ConversionAction — returns PREVIEW.
Only the parameters you pass non-empty/non-default are sent to the API. Use to rename, demote a Primary to Secondary, change value, adjust the call-duration threshold, or change attribution. Find the ID via: SELECT conversion_action.id, conversion_action.name FROM conversion_action. Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| customer_id | No | ||
| counting_type | No | ||
| currency_code | No | ||
| default_value | No | ||
| primary_for_goal | No | ||
| attribution_model | No | ||
| conversion_action_id | Yes | ||
| always_use_default_value | No | ||
| view_through_window_days | No | ||
| click_through_window_days | No | ||
| phone_call_duration_seconds | No | ||
| include_in_conversions_metric | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description clarifies that this tool only returns a preview and does not execute changes until confirm_and_apply is called. Also explains partial-update semantics, which is important for user expectations.
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?
Description is compact and front-loaded with the core purpose, then gives practical usage instructions. No redundant information or filler.
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?
Covers the full workflow: how to identify the target entity, what parameters are sent, what the response contains (plan_id), and how to commit the change. Adequate for an agent to use this tool correctly among many related siblings.
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 0%, and the description only vaguely references call-duration threshold and attribution. Many domain-specific parameters (counting_type, attribution_model, always_use_default_value, include_in_conversions_metric, window days) are not explained, leaving ambiguity about allowable values and meanings.
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 it drafts a partial UPDATE of an existing ConversionAction and returns a PREVIEW, which distinguishes it from create/remove actions. Lists specific use cases like rename, demote, change value, adjust call-duration threshold, and change attribution.
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?
Provides explicit when-to-use scenarios and explains that only non-empty/non-default parameters are sent. Includes concrete next steps: find the ID via the SELECT query and call confirm_and_apply with the returned plan_id to execute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_entityDraft enabling an entityAInspect
Draft enabling a paused campaign, ad group, ad, or keyword — returns a PREVIEW.
entity_type: "campaign", "ad_group", "ad", or "keyword" entity_id format by type:
campaign: campaign ID (e.g. "12345678")
ad_group: ad group ID (e.g. "12345678")
ad: "adGroupId
adId" (e.g. "12345678987654")keyword: "adGroupId
criterionId" (e.g. "12345678987654")
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| customer_id | No | ||
| entity_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is transparent about side effects: it only drafts and returns a preview, not applying the change until confirm_and_apply is called. This is critical behavioral information that goes beyond the annotations and prevents the agent from assuming the entity is enabled immediately.
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 concise and well-organized, using bullet points and examples effectively. Every sentence adds value, and there is no redundant or irrelevant wording.
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 description covers the main action, required parameters, and the follow-up step to apply the draft. It does not mention customer_id, but the output schema is present and the return behavior (preview with plan_id) is implied clearly.
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?
entity_type and entity_id are well documented, including acceptable values and ID formats for each entity type. customer_id is present in the schema but not explained in the description, which is a minor gap since it is optional with a default.
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 purpose: drafting the enabling of a paused campaign, ad group, ad, or keyword. It also distinguishes this from related tools like pause_entity and remove_entity by emphasizing the 'draft' and 'preview' nature.
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 guidance that this returns a preview and that confirm_and_apply must be called to execute. It does not explicitly contrast with pause_entity or remove_entity, but the draft/preview wording makes the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_budgetBudget forecastARead-onlyInspect
Forecast clicks, cost, and conversions for a set of keywords.
Uses Google Ads Keyword Planner to estimate campaign performance without creating anything. Essential for budget planning before launching campaigns. Per-keyword max_cpc values are collapsed to a campaign-level manual CPC cap (the highest one) — the Ads API forecast takes no per-keyword bids.
keywords: list of {"text": "keyword", "match_type": "EXACT|PHRASE|BROAD", "max_cpc": 1.50} max_cpc is optional (defaults to 1.00 in account currency) geo_target_id: geo target constant (2276=Germany, 2840=USA, 2826=UK, 2250=France) language_id: language constant (1000=English, 1001=German, 1002=French, 1003=Spanish) daily_budget: if provided, insights will show what % of traffic the budget captures forecast_days: forecast horizon in days (default 30)
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| customer_id | No | ||
| language_id | No | 1000 | |
| daily_budget | No | ||
| forecast_days | No | ||
| geo_target_id | No | 2276 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states 'without creating anything', aligning with the readOnlyHint and destructiveHint annotations. It additionally discloses a non-obvious behavior: per-keyword max_cpc values are collapsed to a campaign-level cap, which is valuable transparency beyond the annotations.
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 leads with the purpose, then a caveat, then parameter details, which is logical and mostly concise. Some redundancy exists (max_cpc appears both in the keyword object and as a standalone note), but it does not significantly harm readability.
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 an output schema exists, the description adequately explains what the tool does and the key inputs. It lacks an explicit mention of the output shape or any error/rate-limit behavior, and customer_id is unexplained, but these are minor gaps.
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?
Prose descriptions cover keywords, max_cpc, geo_target_id, language_id, daily_budget, and forecast_days with defaults and example values, compensating for the schema's lack of descriptions. However, customer_id is not explained at all, leaving one parameter semantically undocumented.
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 states a specific action ('Forecast') and precise objects ('clicks, cost, and conversions for a set of keywords'), clearly distinguishing this from reporting or discovery tools. Mentioning Google Ads Keyword Planner adds concrete context 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?
It explicitly identifies the use case ('Essential for budget planning before launching campaigns') and notes the operation creates nothing, indicating when it is safe to use. It does not explicitly contrast with alternative tools, but the context is sufficient for most agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_tracking_codeGenerate tracking codeARead-onlyInspect
Generate a GA4 event tracking JavaScript snippet.
Produces ready-to-paste gtag code for the specified event. Includes recommended parameters for well-known GA4 events (sign_up, purchase, etc.). Optionally checks GA4 to warn if the event already fires.
trigger: "form_submit", "button_click", or "page_load" — wraps the gtag call in an appropriate event listener. Empty = bare gtag call.
| Name | Required | Description | Default |
|---|---|---|---|
| trigger | No | ||
| event_name | Yes | ||
| property_id | No | ||
| event_params | No | ||
| check_existing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description aligns by describing generation of code and an optional read-only check against GA4. It adds context about the 'ready-to-paste' output and the check, but no side effects are mentioned, which is consistent with the annotations.
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 concise, consisting of two sentences that front-load the main action and then elaborate on the output and optional check. No redundant information or unnecessary detail is present.
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 description covers the core purpose and mentions the optional check, but it lacks details about the output format (e.g., the structure of the gtag code), the exact behavior when 'check_existing' is false, or how 'event_params' is used. Given the tool's complexity (5 parameters, nested object in schema), the description is not fully 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?
The description explicitly explains the 'trigger' parameter and implicitly references 'event_name' and 'check_existing', but it does not clarify the purpose of 'property_id' or 'event_params'. Given the schema has 5 parameters, this leaves a significant gap in understanding the full input requirements.
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: generating a GA4 event tracking JavaScript snippet. The verb 'generate' is specific, and the resource (GA4 event tracking code) distinguishes it from sibling tools like 'get_tracking_events' or 'validate_tracking'.
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 the tool (e.g., to produce tracking code, with optional checks for existing events) but does not explicitly contrast it with alternatives. Siblings like 'validate_tracking' exist, but no clear 'use this instead of X' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_summariesList Analytics propertiesARead-onlyInspect
List all GA4 accounts and properties accessible by the authenticated user.
Use this as the first step to discover which GA4 properties are available. Returns account names, property names, and property IDs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior. The description adds that it lists only accessible accounts/properties and specifies return contents, providing useful context beyond annotations without contradicting them.
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 succinct, with two clear sentences conveying purpose and usage. No redundant or vague wording.
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 parameterless listing operation, the description fully explains what it does and what it returns. It is complete without an output schema, as the return fields are explicitly mentioned.
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 zero parameters, so schema coverage is 100% (trivially). The description adds no parameter information because none exist. 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 lists all GA4 accounts and properties accessible by the authenticated user, and explicitly mentions the returned fields (account names, property names, property IDs). It distinguishes itself from sibling account-listing tools by specifying GA4 scope.
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?
It explicitly instructs to use this as the first step to discover available GA4 properties, which is a clear usage guideline that differentiates it from other discovery or query tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_performanceAd performanceARead-onlyInspect
Get ad-level performance data including headlines, descriptions, and metrics.
Returns: ad type, headlines, descriptions, final URL, impressions, clicks, CTR, conversions, cost for each ad.
Set compact=true for audits/overviews: returns totals, the top-10 ads with headline/description COUNTS instead of full asset lists, plus incomplete-RSA and single-ad ad-group findings (~90% smaller).
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| customer_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with readOnlyHint=true and describes only data retrieval with no side effects. It also discloses output-shaping behavior for compact mode, adding useful transparency beyond the annotations.
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 concise and front-loaded with the tool's purpose, followed by a short returns list and a compact-mode note. There is no redundant or misleading content.
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?
Core return fields and compact-mode behavior are covered well, and the annotations clarify read-only safety. It could provide more context around date-range and customer_id semantics, as well as explicit differentiation from sibling reporting tools, but it is generally sufficient.
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?
Only the compact parameter is explained in detail; customer_id, date_range_start, and date_range_end are left without format or constraint guidance. Parameter names provide basic meaning, but the schema description coverage is 0% and the description does not fill all gaps.
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 that the tool retrieves ad-level performance data and enumerates the returned metrics. It is easy to distinguish from campaign, keyword, and asset reporting tools by title and content.
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 some usage guidance by suggesting compact=true for audits/overviews, but it does not explicitly explain when to prefer this tool over sibling tools such as get_campaign_performance or get_keyword_performance. The intended use case must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_performancePerformance Max asset performanceARead-onlyInspect
Get per-asset details for Performance Max campaigns.
Returns each asset's field_type (HEADLINE, DESCRIPTION, MARKETING_IMAGE, YOUTUBE_VIDEO, etc.), primary_status (ELIGIBLE, NOT_ELIGIBLE, PAUSED, PENDING), and content (text or image URL).
Note: per-asset performance labels (BEST/GOOD/LOW) are not available for PMax assets in the Google Ads API. Use get_detailed_asset_performance to see which asset combinations Google selects most — the closest proxy for individual asset quality.
campaign_id: optional filter to a single PMax campaign. Includes by_status and by_field_type summaries.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate readOnlyHint=true and destructiveHint=false, which align with the description's 'Returns' wording. The description adds a functional limitation (no performance labels) not covered by annotations, increasing transparency beyond the structured metadata.
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 concise and well-structured: a clear opening statement, a list of returned fields, a note on limitations with an alternative, and a parameter explanation. No redundancy or irrelevant detail.
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 description provides sufficient context for a read-only tool: it names the resource, the fields returned, and a relevant limitation. However, the missing explanation for customer_id and no mention of the output structure (though an output schema exists) leaves minor gaps, but overall it is adequate.
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 0%, and the tool description only explains campaign_id ('optional filter to a single PMax campaign'). The customer_id parameter is left entirely undocumented, leaving users to infer its meaning without additional guidance.
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 retrieves per-asset details for Performance Max campaigns, specifying the exact fields returned (field_type, primary_status, content). This is specific and unambiguous, distinguishing it from other asset-performance tools.
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 notes that per-asset performance labels are not available and directs the user to an alternative tool (get_detailed_asset_performance) when that capability is needed. It also explains the optional campaign_id filter, providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audience_performanceAudience performanceARead-onlyInspect
Get audience segment performance metrics.
Returns performance by audience type — remarketing lists (USER_LIST), in-market segments (USER_INTEREST), affinity, demographics (AGE_RANGE, GENDER), etc. Shows display_name, impressions, clicks, cost, conversions, CTR, and CPC for each audience.
Works for campaigns with explicit audience targeting (Search, Display). PMax audience targeting is automatic and may not appear in this report. campaign_id: optional filter to a single campaign. Date format: "YYYY-MM-DD". Empty = last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds context about what data is returned and the limitation regarding PMax, which complements the annotations without contradicting them. No side effects or destructive actions are implied.
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 compact and well-organized: purpose statement, output details, usage note, and parameter notes. Each sentence adds value without redundancy, and the structure makes it easy to scan for key facts.
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 that an output schema exists (though not shown) and the description enumerates the output fields and audience types, the description provides enough context for an agent to understand what the tool returns and when to use it. It also covers the date range defaults and the campaign filter, making it sufficiently complete for a straightforward read-only reporting tool.
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 0%, so the description must compensate. It does clarify that campaign_id is an optional filter and states the date format (YYYY-MM-DD) and default behavior (empty = last 30 days). However, customer_id is left undocumented, and there is no explanation of how the parameters interplay (e.g., whether both campaign and customer can be specified together). This partial compensation earns a middle score.
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 retrieves audience segment performance metrics, enumerates the metric fields (impressions, clicks, cost, conversions, CTR, CPC) and audience types (remarketing, in-market, affinity, demographics). It also distinguishes itself from PMax-related reporting, helping an agent choose this tool for explicit audience targeting scenarios.
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 gives an explicit when-not scenario: PMax audience targeting is automatic and may not appear in this report, which implies the tool is intended for Search/Display campaigns with explicit targeting. However, it does not explicitly name an alternative tool (e.g., get_pmax_performance) for PMax cases, so the guidance is slightly less explicit than ideal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_performanceCampaign performanceARead-onlyInspect
Get campaign-level performance metrics for a date range.
Returns: campaign name, status, type, impressions, clicks, cost, conversions, CPA, ROAS, CTR for each campaign. Date format: "YYYY-MM-DD". Empty = last 30 days.
Set compact=true for audits/overviews on large accounts: returns account totals, status/type breakdowns, the top-10 spenders, and zero-conversion offenders instead of every row (~90% smaller).
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| customer_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false. The description uses 'Get' and describes returns without any destructive or side-effect language, showing full consistency. It adds context about the compact mode, which is a behavioral variant, but not a side effect.
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 concise, about 60 words, with a clear structure: purpose, returned fields, then usage notes on dates and compact mode. No fluff or repetition.
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?
Lists all key returned fields, provides date defaults, and explains the compact alternative. With an output schema present but not shown, the description covers the essential context for an agent to 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?
The schema has 4 parameters with 0% description coverage. The tool description covers date_range_start and date_range_end (format and default), and compact (behavior). However, customer_id is not mentioned at all. Given that 3 of 4 parameters are explained, it compensates well but not fully.
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 retrieves campaign-level performance metrics, lists the specific metrics returned, and implicitly distinguishes it from sibling tools like get_ad_performance or get_keyword_performance by focusing solely on 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?
Explicitly explains date format (YYYY-MM-DD, empty = last 30 days) and provides guidance on when to use compact=true for large accounts, including what it returns. This gives clear operational instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_demographic_targetingDemographic targetingARead-onlyInspect
List demographic targeting criteria (age, gender, parental status, income).
Provide exactly one of ad_group_id or campaign_id. Returns each
criterion's value, whether it's negative (excluded) or positive
(narrowing), status, and a remove_id (composite resource ID) that
can be passed directly to remove_entity with
entity_type='ad_group_criterion' or 'campaign_criterion'.
By default, Google Ads serves ads to ALL demographic segments — a criterion only appears here once you've actively excluded or narrowed.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | No | ||
| campaign_id | No | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and destructiveHint=false, which aligns perfectly with the description's 'List' action. The description adds context about default behavior and the non-modifying nature of the tool, enhancing transparency without contradiction.
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 tightly written with no redundant phrases. It efficiently covers the tool's purpose, parameter constraint, and output details, while the final sentence about default behavior adds value without bloat.
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?
It describes the output fields (value, negative/positive, status, remove_id) and explains how to use remove_id, which is sufficient for a read-only list operation. Minor gaps remain regarding customer_id usage and potential error cases, but the description is largely complete for the intended use case.
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 description clarifies the relationship between ad_group_id and campaign_id (exactly one must be provided) but does not explain the purpose or requirement of customer_id. Since schema coverage is 0%, the description only partially compensates for the lack of parameter documentation.
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 tool lists demographic targeting criteria (age, gender, parental status, income), which is a specific verb and resource. It is distinguishable from sibling tools that focus on other entity types.
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 instructs to provide exactly one of ad_group_id or campaign_id, which is a critical usage rule. Also explains how the returned remove_id can be used with remove_entity, providing clear guidance for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_detailed_asset_performancePerformance Max asset combinationsARead-onlyInspect
Get top-performing asset combinations for Performance Max campaigns.
Shows which headline + description + image combinations Google selects most often. Each combination lists the assets used and their field types. This data helps identify which creative elements work well together.
campaign_id: optional filter to a single PMax campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior, which covers safety. The description adds that it lists assets and their field types, but does not mention any potential side effects, data freshness, or limitations. Since the annotations carry the primary safety signal, the description provides minimal extra transparency beyond clarifying its reporting nature.
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 somewhat redundant, repeating the campaign_id filter and restating the purpose, but it remains relatively compact and focused. It avoids unnecessary jargon and clearly conveys the tool's function without excessive length.
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?
An output schema is provided, so the return format is defined. The description explains the purpose and gives a hint about the optional filter. It does not mention prerequisites or edge cases, but given the tool's straightforward read-only nature, it is reasonably complete for an agent to understand and call 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?
Only campaign_id is mentioned in the description as an optional filter, with no explanation for customer_id. The schema itself has no descriptions (coverage 0%). This leaves the meaning and purpose of customer_id ambiguous, though the description does clarify campaign_id's role.
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 it 'Get[s] top-performing asset combinations for Performance Max campaigns' and elaborates that it shows which headline, description, and image combinations Google selects most often. This distinguishes it from sibling tools like get_asset_performance or get_pmax_performance by focusing specifically on combinations.
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 does not provide any guidance on when to use this tool versus alternatives such as get_asset_performance or get_pmax_performance. It lacks information on use cases, scenarios, or why one might prefer this over other reporting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_tagTag Manager tag detailsARead-onlyInspect
Get the full RAW configuration for a single GTM tag.
Includes every parameter, firing/blocking triggers (with their filter conditions resolved to text), priority, pause status, sampling, and monitoring metadata. Use to inspect a tag flagged by audit_event_coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes | ||
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, establishing the safety profile. The description adds context about the returned data (parameters, triggers, priority, etc.) without contradicting the read-only nature. No side effects are mentioned, but the tool is clearly a get operation.
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 concise sentences, front-loading the primary purpose and then elaborating on the included details. No unnecessary words or redundant information, and it is well-structured with a clear flow from what it does to when to use it.
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?
Provides enough context to understand the tool's function and usage scenario, including the mention of audit_event_coverage. The return content is described sufficiently for an agent to know what to expect. However, parameter meanings are not covered, leaving a minor gap, but the existence of an output schema reduces the need for detailed return descriptions.
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 description does not explain the meaning or purpose of tag_id, gtm_account_id, or gtm_container_id. With zero schema descriptions for these parameters, the agent must infer that tag_id likely identifies the tag, but this is not explicit. This is a significant gap for correct invocation.
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 it retrieves the full RAW configuration for a single GTM tag, specifying both the resource and the scope. Differentiates from list_gtm_tags by focusing on a single tag's detailed configuration, and from get_gtm_trigger by covering the tag-level data including triggers.
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?
Provides a specific use case ('Use to inspect a tag flagged by audit_event_coverage'), giving practical guidance on when to apply the tool. Does not explicitly mention alternatives like list_gtm_tags for listing, but the purpose is clear enough that an agent can infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_triggerTag Manager trigger detailsARead-onlyInspect
Get the full RAW configuration for a single GTM trigger.
Includes filters, auto-event filters, custom-event filters, validation settings, and a list of every tag that uses this trigger. Use to diagnose why a tag with a specific trigger ID does or doesn't fire.
| Name | Required | Description | Default |
|---|---|---|---|
| trigger_id | Yes | ||
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint true, so the description doesn't need to repeat that it's read-only. However, the description adds valuable content about what the response includes (filters, validation settings, tags), which goes beyond the annotation. It does not mention any side effects, which is consistent with the read-only annotation. No contradiction.
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, direct, and free of unnecessary detail. It front-loads the primary action ('Get the full RAW configuration') and then adds relevant specifics about the content and purpose. Every word contributes to understanding the tool's function.
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 description provides enough context for an agent to decide when to use this tool: it specifies the input (trigger ID) and the output (full config, including filters and associated tags) and the use case (diagnosis). It doesn't describe the output schema, but the tool has an output schema defined, so that is not a gap. The description adequately covers the tool's role in the larger workflow.
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 has three parameters (trigger_id required, gtm_account_id and gtm_container_id with defaults), but the description does not explain any of them. The tool name suggests trigger_id is the main identifier, but the purpose of the account and container IDs is not clarified. Since the schema coverage is 0%, the description must compensate but fails to do so, leaving the agent to infer their roles from context.
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 retrieves the full RAW configuration for a single GTM trigger, listing specific content (filters, validation settings, tag list). It distinguishes itself from list_gtm_triggers by focusing on one trigger's detailed config, making it 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?
It explicitly says to use it to diagnose why a tag fires or not, providing a concrete use case. It does not explicitly say when to use list_gtm_triggers instead, but the sibling tool list_gtm_triggers is present, and the description's emphasis on 'single' and 'full configuration' implies the alternative. Slightly more guidance on when not to use would make it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_versionTag Manager version detailsARead-onlyInspect
Get full metadata + entity counts for a single GTM container version.
Returns name, description, fingerprint, and lists of tag/trigger/ variable names at that point in time. Use after list_gtm_versions when correlating a metric drop with a specific publish.
| Name | Required | Description | Default |
|---|---|---|---|
| gtm_account_id | No | ||
| gtm_container_id | No | ||
| container_version_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and destructiveHint, and the description adds context by specifying the returned data (name, description, fingerprint, entity lists). No contradiction with annotations.
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?
Two concise sentences, no fluff, with the primary purpose stated upfront and the use case appended. Efficient 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?
Covers purpose, use case, and returned data. Does not explicitly describe prerequisite steps beyond 'after list_gtm_versions', but is sufficient for an agent to decide when to call it. No mention of error conditions, but that is not critical for a simple get.
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 has zero descriptions for parameters, and the tool description does not explain the roles of gtm_account_id, gtm_container_id, or container_version_id. It only implies the version ID comes from list_gtm_versions, leaving the other two parameters ambiguous.
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 action ('Get'), the resource ('full metadata + entity counts for a single GTM container version'), and distinguishes it from siblings by specifying the use case ('Use after list_gtm_versions').
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?
Provides explicit guidance on when to use the tool ('Use after list_gtm_versions when correlating a metric drop with a specific publish'), which differentiates it from listing or other get operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_workspace_diffTag Manager workspace changesARead-onlyInspect
Show drafted-but-not-published changes in a GTM workspace.
Returns the list of entities (tags, triggers, variables) added, modified, or deleted relative to the live published version, plus any merge conflicts. Common cause of "I edited a tag but nothing happened" — the workspace was never published. is_clean=true means no pending changes and no conflicts.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | Yes | ||
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description expands on the read-only behavior by detailing the returned data: 'Returns the list of entities (tags, triggers, variables) added, modified, or deleted relative to the live published version, plus any merge conflicts.' It also explains the is_clean flag semantics. This is consistent with the annotations (readOnlyHint=true, destructiveHint=false) and adds useful output 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 concise and front-loaded. The first sentence states the purpose, the second details the output, the third provides a usage scenario, and the fourth explains the is_clean field. Every sentence adds value with no fluff or 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?
While the purpose and output are covered, the description is not fully complete because it omits parameter explanations and does not provide a full output schema. A user may not know how to correctly invoke the tool, especially with the optional parameters, and what exact structure the returned entities have. The description relies on prior knowledge of GTM workspaces.
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 description coverage is 0% for parameters, and the description does not compensate. workspace_id, gtm_account_id, and gtm_container_id are not explained at all. Even though the names are somewhat self-explanatory, the role of optional parameters like gtm_account_id and gtm_container_id, and their relationship to workspace_id, is ambiguous. This is a significant gap.
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 purpose: 'Show drafted-but-not-published changes in a GTM workspace.' This specifies both the action (show) and the resource (GTM workspace changes). It also differentiates from sibling tools like list_gtm_workspaces by focusing on the diff between the draft and published versions.
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 a concrete use case: 'Common cause of "I edited a tag but nothing happened" — the workspace was never published.' This helps users understand when to use the tool. While it doesn't explicitly name alternative tools, it implies the scenario where checking uncommitted changes is needed, which is sufficient context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keyword_performanceKeyword performanceARead-onlyInspect
Get keyword metrics including quality scores and competitive data.
Returns: keyword text, match type, quality score, impressions, clicks, CTR, CPC, conversions for each keyword.
Set compact=true for audits/overviews: returns totals, match-type distribution, the top-10 spenders, low-quality-score keywords, and zero-conversion spenders instead of every row (~90% smaller).
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| customer_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the read-only and non-destructive annotations and adds context by explaining that compact=true changes the return format to a summary. This goes beyond the annotations and clarifies expected behavior without contradiction.
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 concise and well-structured, with the purpose front-loaded, followed by return fields and the compact mode explanation. It avoids unnecessary fluff and communicates the essential information efficiently.
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 description provides a solid overview of functionality and return data, and the output schema likely covers detailed fields. However, it lacks context on parameter defaults and date handling, which would be helpful for full usability. Still, it is adequate for a read-only reporting tool.
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 description only explains the compact parameter, which is valuable, but provides no explanation for customer_id, date_range_start, or date_range_end. Given the schema has no descriptions (0% coverage), the description fails to add sufficient meaning for these parameters, leaving their format and semantics unclear.
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 identifies the tool's purpose as retrieving keyword metrics, specifically mentioning quality scores and competitive data. This distinguishes it from sibling tools like campaign or ad performance, making the resource and scope explicit.
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 a specific usage scenario (audits/overviews) with the compact=true option, giving concrete guidance on when to use the summary mode. However, it does not explicitly contrast with alternative tools like get_campaign_performance or get_search_terms, so some inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merchant_feed_healthMerchant Center feed healthARead-onlyInspect
Merchant Center feed health — disapproved products + account issues.
Disapproved feed items silently starve Shopping and Performance Max campaigns; this surfaces approved/pending/disapproved counts per reporting context (Shopping ads, free listings, ...), the top product issues by affected products (with documentation links), and account-level issues — CRITICAL ones stop offers serving entirely.
account_id: numeric Merchant Center ID from list_merchant_accounts. Product-status data lags reality by ~30 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, non-destructive), the description discloses additional behavioral traits: data lags reality by ~30 minutes, and CRITICAL account-level issues can stop offers from serving entirely. This gives agents a clearer expectation of freshness and impact, going beyond the basic annotation hints.
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 dense but well-organized: a headline summary, an explanatory paragraph on why this matters (with concrete impact), and a clear parameter note. No fluff or redundant phrasing; every sentence contributes value.
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 description covers what the tool returns (counts, issues, docs, account problems), the source of the required parameter, and a known data freshness caveat. It does not explicitly outline the output schema, but that is provided separately. It also lacks explicit 'when to use vs. alternatives' guidance, which would make it fully complete. Overall, it gives sufficient context for an agent to 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?
The only parameter, account_id, is fully explained: it is a numeric Merchant Center ID and explicitly sourced from list_merchant_accounts. This is precise, actionable, and leaves no ambiguity about what the agent should pass.
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 purpose: surfacing disapproved products and account-level issues in Merchant Center feed health. It lists the specific outputs (approved/pending/disapproved counts per context, top product issues with docs, account issues). However, it does not explicitly name any sibling tool to distinguish itself, relying instead on its unique domain (Merchant Center feed) to set it apart.
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 situational context—disapproved feed items silently starve Shopping and Performance Max campaigns—which implicitly suggests when this tool is valuable. It also mentions a data lag (~30 minutes) that could affect timing. But it does not explicitly state 'use this when X' or compare with alternatives like health_check or run_realtime_report, leaving usage guidance somewhat implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keyword_list_campaignsCampaigns using a negative keyword listARead-onlyInspect
List which campaigns a shared negative keyword list is attached to.
shared_set_id: numeric ID from get_negative_keyword_lists. Omit to see all list-to-campaign attachments across the account.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| shared_set_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, and the description uses 'List' which is consistent. No additional behavioral details such as rate limits or permissions are provided, but the annotations cover the essential safety aspects.
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 concise and well-structured, front-loading the purpose and then explaining the optional parameter. Every sentence adds value without fluff or repetition.
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 description provides enough context for a simple read-only tool, especially since an output schema exists (so return values need not be described). The only minor gap is the lack of explanation for customer_id, but this is a common parameter across sibling tools and likely self-explanatory.
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 no parameter descriptions (0% coverage), so the description must compensate. It explains shared_set_id and its omission behavior, but does not explain customer_id, which is also a parameter. This leaves one parameter semantically ambiguous.
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 purpose: to list which campaigns a negative keyword list is attached to. It uses the specific verb 'List' and identifies the resource (campaigns) and the scope (negative keyword list), making it distinct from related tools.
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 guidance on omitting the shared_set_id to see all attachments, but it does not explicitly mention when to use this tool versus alternatives like get_negative_keywords or get_negative_keyword_lists. No when-not or alternative context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keyword_list_keywordsKeywords in a negative keyword listARead-onlyInspect
List the keywords inside a shared negative keyword list.
shared_set_id: numeric ID from get_negative_keyword_lists (shared_set.id).
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| shared_set_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate readOnlyHint=true and destructiveHint=false, and the description ('List the keywords') is consistent with a read-only operation. However, the description does not add any extra behavioral context beyond this, such as error conditions or side effects, so it does not go beyond the annotations.
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, comprising one sentence for the main purpose and a brief parameter clarification. It is well-structured and efficiently conveys the essential information without any fluff or 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 description provides the core purpose and the key parameter, but it omits any mention of customer_id, which could be relevant for context. It also does not indicate prerequisites or typical usage scenarios, though the output schema is provided separately. Given the simplicity of the tool, the description is mostly complete but has clear gaps.
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 has two parameters (customer_id and shared_set_id), but the description only explains shared_set_id, providing its source and type. customer_id is entirely omitted. Since schema coverage is 0% and the description only covers half of the parameters, it fails to compensate adequately for the lack of schema descriptions.
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 action (list) and the resource (keywords inside a shared negative keyword list), making its purpose unambiguous. It also distinguishes itself from sibling tools like get_negative_keyword_lists (which lists the lists) and get_negative_keyword_list_campaigns (which lists associated 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 when to use the tool (when you need to list keywords inside a specific negative keyword list) but does not explicitly contrast it with alternatives or provide conditions for selection. The guidance is implicit rather than explicit, so it does not fully meet the 'explicit when/when-not' criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keyword_listsList shared negative keyword listsARead-onlyInspect
List all shared negative keyword lists (SharedSets) in the account.
Returns each list's ID, name, status, and keyword count. Always call this before propose_negative_keyword_list to avoid creating duplicates — a suitable list may already exist and just need attaching to a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description reinforces that it only lists existing lists without side effects. Adds return value details (ID, name, status, keyword count) but does not mention error conditions or limits; however, these are less critical for a read-only operation.
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?
Two concise sentences, front-loaded with the main action and outcome. No fluff, clear structure with the second sentence providing a pragmatic call-to-action.
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 read tool, it covers the core purpose, return fields, and a critical usage rule. It omits explanation of the customer_id parameter and does not formally define the output schema, but those are minor gaps given the breadth of context provided.
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 has no description for customer_id (coverage 0%), and the tool description does not explain that parameter. The meaning is likely inferable from context (Google Ads account ID), but the description adds no explicit guidance, leaving some ambiguity for an agent.
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?
States a specific verb 'List' and resource 'shared negative keyword lists (SharedSets) in the account', and lists the returned fields (ID, name, status, keyword count). Clearly distinguishes from sibling tools by name and scope.
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 instructs to always call this before propose_negative_keyword_list to avoid duplicates, providing clear use-case guidance. Does not explicitly differentiate from other list-related tools like get_negative_keywords, but the primary usage rule is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keywordsList negative keywordsARead-onlyInspect
List existing negative keywords for a campaign or all campaigns.
Use this before adding negative keywords to check for duplicates. If campaign_id is empty, returns negatives across all campaigns.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false. The description ('List existing') is consistent with these annotations and adds no contradictory behavior. It aligns fully with the declared non-mutating nature.
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 concise, consisting of three short sentences with no redundant information. It is well-structured, front-loading the core purpose and then adding usage guidance and edge-case 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?
The description provides essential context for the tool's purpose and key behavior, but it does not mention the return format or any additional details like pagination or filtering. For a simple read-only list, this is likely sufficient, though it leaves some room for ambiguity.
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 description explains the semantics of campaign_id ('If campaign_id is empty, returns negatives across all campaigns') but does not mention customer_id at all. Since the schema has no parameter descriptions, this partial explanation is helpful but incomplete, leaving the role of customer_id ambiguous.
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: listing existing negative keywords for a specific campaign or all campaigns. It uses a specific verb ('List') and resource, and the mention of 'check for duplicates' provides context that differentiates it from other tools like add_negative_keywords.
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?
It explicitly says 'Use this before adding negative keywords to check for duplicates,' giving a clear when-to-use instruction. It also explains the behavior when campaign_id is empty, which is a practical usage detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pmax_performancePerformance Max performanceARead-onlyInspect
Get Performance Max campaign and asset group performance.
Returns two result sets:
campaigns: PMax campaign metrics broken down by ad_network_type (SEARCH, CONTENT, YOUTUBE_SEARCH, YOUTUBE_WATCH, MIXED). Note: MIXED is a catch-all that Google uses for most PMax traffic — full channel splits are not available via the API.
asset_groups: per-asset-group metrics including ad_strength (EXCELLENT, GOOD, AVERAGE, POOR).
Includes insights flagging weak ad strength, zero-conversion asset groups, and network type distribution. Date format: "YYYY-MM-DD". Empty = last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safe/read-only nature. The description adds result-set expectations but no additional behavioral disclosure beyond what annotations provide.
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?
Bulleted result sets make the structure readable, and the content is not excessive. Minor redundancy exists around ad strength and network-type insights, but it does not materially hurt clarity.
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 description covers PMax-specific context, channel split limitations, ad strength values, and date defaults. It omits customer_id semantics, but the output schema is present so return values need not be fully restated.
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 date format and empty-default behavior are mentioned for date_range_start/end, but customer_id is not explained. With 0% schema coverage, the description should compensate more fully for parameter meanings.
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 it retrieves Performance Max campaign and asset group performance, and enumerates the two result sets. This is specific enough to distinguish it from generic campaign/ad performance tools.
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 Performance Max scope and MIXED channel caveat give useful context, but the description never explicitly says when to choose this over sibling tools like get_campaign_performance or get_asset_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendationsGoogle Ads recommendationsARead-onlyInspect
Retrieve Google's auto-generated recommendations with estimated impact.
Returns each recommendation's type, associated campaign/ad group, current (base) and projected (potential) metrics, and the estimated improvement.
recommendation_types: optional filter — e.g. ["KEYWORD", "TARGET_CPA_OPT_IN", "MAXIMIZE_CONVERSIONS_OPT_IN", "RESPONSIVE_SEARCH_AD"]. Empty = all types. campaign_id: optional — scope to a single campaign.
Includes insights that flag budget-increase recommendations (often self-serving) and highlight high-impact suggestions worth investigating.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | No | ||
| recommendation_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description explains the output structure (type, campaign/ad group, current and projected metrics, estimated improvement) and notes the insight about flagging budget-increase recommendations. This adds behavioral context about what the tool returns and how it interprets recommendations.
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 succinct and well-structured: a brief intro, return details, parameter notes, and insight context. It avoids unnecessary verbosity and does not repeat schema information.
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 description covers the tool's purpose, output contents, parameter purpose (mostly), and a behavioral nuance (flagging self-serving recommendations). It is complete for a read-only tool, although it does not mention pagination or error handling, which are not critical given the context.
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 has no descriptions (0% coverage). The description explains two of the three parameters: recommendation_types (optional filter with examples) and campaign_id (scope to a single campaign), but does not mention customer_id. It partially compensates for the missing schema descriptions but is incomplete for one parameter.
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 retrieves Google Ads recommendations with estimated impact, and specifies the resource (auto-generated recommendations). The verb 'retrieve' and resource are explicit, distinguishing it from other get_* tools by the unique resource and output type.
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 some context on when to use the tool (e.g., to review recommendations and identify high-impact or self-serving budget-increase ones), but it does not explicitly mention alternatives or conditions for not using it. The guidance is implied rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_termsSearch terms reportARead-onlyInspect
Get search terms report — what users actually typed before clicking your ads.
Critical for finding negative keyword opportunities and understanding user intent. Returns: search term, campaign, ad group, impressions, clicks, conversions.
Set compact=true for audits/overviews: returns totals, the top-10 terms by clicks, ready-made negative-keyword waste candidates (5+ clicks, zero conversions), and top converters (~90% smaller).
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | ||
| customer_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the tool as read-only and non-destructive, which the description does not contradict. The description adds behavioral context about the data source (what users typed) and the nature of the report, going slightly beyond the annotations without needing to restate safety attributes.
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 concise and well-structured: it opens with a clear definition, adds a meaningful use-case rationale, lists return fields in a compact line, and then explains the compact mode with specific examples. No unnecessary filler or redundancy is present, and the formatting aids quick comprehension.
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 large sibling list of reporting and management tools, this description provides enough context to distinguish itself—'search terms' is a specific concept and the focus on negative keywords clarifies its niche. However, it does not mention any prerequisites, required inputs, or limitations, which could leave an agent uncertain if all fields are always populated or if date ranges are mandatory.
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 lists four parameters but provides no descriptions for them (0% coverage). The description only explains the behavior of the 'compact' parameter (set to true for audits), leaving customer_id and date range parameters completely undocumented. This is a significant gap that forces the agent to infer their meaning from context.
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 that the tool fetches a search terms report, explaining exactly what it returns (search term, campaign, ad group, impressions, clicks, conversions). It also explicitly ties the tool to negative keyword discovery and user intent analysis, making its purpose unambiguous and distinct from sibling reporting tools.
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 strong usage context by stating the tool is 'critical for finding negative keyword opportunities' and explains when to use the compact mode (for audits/overviews). However, it does not explicitly name alternative tools or specify when not to use it, so it falls slightly short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tracking_eventsList Analytics eventsARead-onlyInspect
List all GA4 events and their volume for the given date range.
Returns every distinct event name with its total event count. Use this to understand what tracking is configured and active.
| Name | Required | Description | Default |
|---|---|---|---|
| property_id | No | ||
| date_range_end | No | today | |
| date_range_start | No | 28daysAgo |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds that it returns distinct events with counts, which is useful but not extensive. It does not disclose potential limitations like pagination or rate limits, but given the annotations, the added value is moderate.
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 succinct and front-loaded. The first sentence states the core action and scope, and the second adds return details and purpose. 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?
The tool has an output schema, so return format is covered. The description gives a clear purpose but lacks parameter explanation and differentiation from similar tools like audit_event_coverage. For a simple list tool, it is acceptable but leaves gaps in parameter semantics and sibling distinction.
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 0%, so the description must explain parameters. It only hints at date range ('given date range') but does not detail property_id, date_range_start, or date_range_end formats, defaults, or purposes. This is insufficient for an agent to correctly populate all parameters.
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 verb 'List', the resource 'GA4 events', and specifies the output: 'every distinct event name with its total event count'. It also conveys the use case ('understand what tracking is configured and active'), which differentiates it from sibling tools like audit_event_coverage or list_gtm_tags.
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 a clear context for when to use this tool ('Use this to understand what tracking is configured and active'). However, it does not explicitly mention alternatives or when not to use it, so it lacks exclusions. Still, the usage guidance is direct and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkConnection health checkARead-onlyInspect
Test AdLoop connectivity — checks OAuth token, GA4 API, and Google Ads API.
Run this first if other tools are failing. Returns status for each service and actionable guidance if something is broken.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds that it checks specific services and provides guidance, all consistent with a non-mutating diagnostic operation. No contradiction exists.
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—only two sentences—yet it covers the purpose, usage, and output. Every word adds value without 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?
For a health-check tool with no parameters, the description is complete. It tells what it checks, when to use it, and what output to expect. No additional context is needed for correct invocation.
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 tool has no parameters and the schema is an empty object. As there is nothing to explain about parameters, the description's lack of parameter details is appropriate, earning the baseline score for zero-param tools.
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 purpose: testing AdLoop connectivity by checking OAuth token, GA4 API, and Google Ads API. It also distinguishes itself from siblings by being a general health check, and the guidance 'Run this first if other tools are failing' reinforces its diagnostic role.
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 instructs to run this tool first when other tools fail, providing clear when-to-use guidance. It also mentions the output (status for each service and actionable guidance), setting expectations for the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
landing_page_analysisLanding page analysisARead-onlyInspect
Analyze which landing pages convert and which don't.
Combines ad final URLs with GA4 page-level data to show paid traffic sessions, conversion rates, bounce rates, and engagement per landing page. Identifies pages that get ad clicks but zero conversions and orphaned URLs. Date format: "YYYY-MM-DD". Empty = last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | ||
| property_id | No | ||
| date_range_end | No | ||
| date_range_start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the tool as read-only (readOnlyHint=true) and non-destructive (destructiveHint=false), which covers the primary behavioral aspect. The description adds context about data sources and analysis, but does not mention any additional behavioral constraints (e.g., rate limits, authentication, or side effects like caching). Since the annotation covers the safety profile, the score is moderate—the description adds some value but not significant behavioral detail.
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 concise and well-structured, with two clear sentences outlining the core analysis and a brief note on date format. It avoids unnecessary jargon or fluff, keeping the essential information front-loaded. The structure is clean and easy to parse, making it highly effective for quick comprehension.
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?
While the description provides a solid overview of the tool's function and output, it does not fully explain the meaning of all parameters (customer_id, property_id) or the expected output structure. However, since an output schema exists, the return values are implicitly documented. The missing parameter details leave the context incomplete, making it average for a tool with this 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 schema provides no descriptions for the four parameters, and the description only clarifies date formatting for date_range_start/end. The customer_id and property_id parameters are left completely unexplained, leaving the agent to guess their meaning or purpose. Given the schema coverage is 0%, the description must compensate, but it only partially does so for dates. This results in low parameter semantics.
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 purpose: to analyze landing page conversion performance by combining ad final URLs with GA4 data. It also highlights specific outputs (sessions, conversion rates, bounce rates) and distinct features (detecting zero-conversion pages and orphaned URLs), which effectively differentiates it from sibling tools like run_ga4_report or get_campaign_performance.
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 explains what the tool does but does not provide explicit guidance on when to use it relative to alternatives. For example, it doesn't state that this should be used when a cross-channel landing page analysis is needed versus a standard GA4 report. The absence of any comparative or conditional guidance leaves the agent to infer usage context from the description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList Google Ads accountsARead-onlyInspect
List accessible Google Ads accounts.
Returns account names, IDs, and status. The default cap of 200 covers the vast majority of agency MCCs in one call. If the user explicitly asked to see ALL of their accounts and the response comes back with 'truncated: true', call this tool again with a much higher limit (e.g. list_accounts(limit=1000)) — do not stop at the truncated list. For workflows that target a specific account you don't need to enumerate at all: pass customer_id directly to get_campaign_performance, run_gaql, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions the default cap and the 'truncated' behavior, adding useful context beyond the read-only annotation. It does not contradict the annotations and provides enough transparency for a read-only list operation.
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 succinct, with no redundant phrasing. It front-loads the main purpose and includes only essential guidance about limit and alternative usage. Every sentence serves a purpose.
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?
Covers the key aspects: what is returned (names, IDs, status), the default cap, and handling of truncation. While it does not enumerate output schema details, the tool's purpose is fully explained for an agent to decide and call it 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?
Only one parameter, 'limit', is present. The schema provides type and default, but the description explains its purpose (controlling the number of accounts returned) and how to adjust it in response to truncation. This compensates for the lack of schema description.
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 lists accessible Google Ads accounts, distinguishing it from sibling tools like list_merchant_accounts and list_gsc_sites. The verb 'list' is specific and the resource is 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?
Explicitly provides guidance on when to increase the limit (if results are truncated when user asks for all accounts) and when not to use this tool (when targeting a specific account, pass customer_id directly to other tools). This directly informs tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gsc_sitesList Search Console propertiesARead-onlyInspect
List all Google Search Console properties the authenticated user can access.
Use this first to discover which site URLs are available before running search analytics reports. Returns the site URL and permission level for each property.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive; description adds that it returns site URL and permission level, giving output context without contradicting annotations.
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?
Two concise sentences stating purpose, usage guidance, and output summary; no fluff or 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?
For a zero-param read-only tool, the description fully covers: action, scope, when to use, and output content, making it self-contained for an agent.
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?
No parameters exist, so the schema fully covers inputs; description provides no additional parameter semantics, aligning with the baseline for zero-param tools.
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 a specific action (List) on a specific resource (Google Search Console properties) accessible to the authenticated user, distinguishing it from GTM or other account tools in the sibling list.
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 instructs to use this first before running search analytics reports to discover site URLs, providing a clear when-to-use directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_accountsList Tag Manager accountsARead-onlyInspect
List all GTM accounts the AdLoop service account / OAuth user can read.
Use this for first-time discovery before calling audit_event_coverage — you need the account_id from here. If this returns an empty list, the service account hasn't been added to any GTM container with at least Read permission.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context about read permissions and the implication of an empty list, going beyond the readOnlyHint annotation. It is consistent with the non-destructive nature and discloses auth requirements.
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 concise (two sentences) and well-structured, conveying the purpose, usage, and interpretation without unnecessary verbosity.
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 absence of parameters and output schema, the description provides all necessary context: what the tool does, when to use it, and what the result (including empty list) signifies. It also mentions permission requirements, making it complete for 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?
The tool has no parameters, so the description adds no parameter-specific meaning. The schema coverage is effectively 100% (empty), meeting the baseline for high coverage where additional param info is not necessary.
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 lists all GTM accounts readable by the service account/OAuth user, using the verb 'list' and specifying the resource 'GTM accounts'. It also distinguishes from siblings like list_accounts and list_merchant_accounts by focusing on GTM-specific accounts.
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 instructs to use this for first-time discovery before audit_event_coverage and explains that an empty list indicates insufficient permissions, providing clear guidance on when and how to interpret results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_containersList Tag Manager containersARead-onlyInspect
List all containers under a GTM account.
Returns container_id (the numeric ID needed by audit_event_coverage), public_id (the GTM-XXXXXXX string shown in the UI), name, and usage context (web / iOS / Android / amp / server).
| Name | Required | Description | Default |
|---|---|---|---|
| gtm_account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and destructiveHint annotations already indicate the tool is read-only and non-destructive. The description adds no additional behavioral details such as side effects, permissions, rate limits, or edge cases, so it does not go beyond the annotations.
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 concise and well-structured, consisting of two clear sentences. It avoids unnecessary wording and efficiently communicates the tool's purpose and output.
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 description lists the specific fields returned (container_id, public_id, name, usage context), which is sufficient given no output schema is provided. It lacks details on pagination or error handling, but for a simple list operation this is not a significant gap.
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 defines one parameter, gtm_account_id, with a default of empty string. The description mentions 'under a GTM account' but does not further explain the parameter's format, source, or requiredness. Since schema coverage is 100% and the description adds minimal context, 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 clearly states the action ('List all containers') and the resource ('under a GTM account'), and it distinguishes this tool from siblings by focusing on containers rather than accounts, tags, triggers, or other entities. It also lists the returned fields, which further clarifies its 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 provides clear context by stating that it returns the container_id needed by audit_event_coverage and the public_id shown in the UI, implying when to use it. However, it does not explicitly contrast it with other listing tools (e.g., list_gtm_accounts, list_gtm_tags), so it lacks explicit exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_tagsList Tag Manager tagsARead-onlyInspect
List every tag in the LIVE GTM container.
Each tag includes type, status, parsed parameters, the GA4 event name (for GA4 event tags), and resolved firing/blocking trigger names. Use after audit_event_coverage to inspect specific tags.
| Name | Required | Description | Default |
|---|---|---|---|
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details what the output will include (type, status, parsed parameters, GA4 event name, resolved trigger names), which gives the agent a clear expectation of the result. It also naturally implies a read-only operation, consistent with the readOnlyHint annotation. No side effects or unexpected behaviors are mentioned, but the provided output details are sufficient to set expectations.
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 concise and well-structured: the first sentence states the action and scope, the second lists output contents, and the third gives a usage hint. It uses clear, direct language without unnecessary details, making it easy to parse and understand.
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 minimal schema (no parameter descriptions) and lack of an output schema, the description provides some missing context by listing output contents and a usage hint. However, it does not explain the parameters, which is a significant gap for an agent to invoke the tool correctly. The tool is simple enough that the description partially compensates, but it is not fully 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?
The input schema provides only param names and default values (empty strings) with no descriptions. The tool description does not explain the purpose or expected values of gtm_account_id or gtm_container_id. Without additional context, an agent might not know what to pass. The description completely fails to add meaning to the parameters, leaving them ambiguous.
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 action ('List every tag') and the scope ('in the LIVE GTM container'). It also lists what each tag includes, making the purpose unambiguous. The mention of 'LIVE' differentiates it from potential other container states, and the tool is distinct from other GTM list tools like list_gtm_triggers or list_gtm_variables.
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 a usage hint: 'Use after audit_event_coverage to inspect specific tags.' This gives a sequence of operations but does not explicitly state when to use this tool versus alternatives, nor does it mention conditions that would make it inappropriate. It is helpful but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_triggersList Tag Manager triggersARead-onlyInspect
List every trigger in the LIVE GTM container.
Each trigger has its filter conditions parsed to readable text (e.g. "{{Page Path}} matches RegExp ^/service-promotions/"). Use to diagnose why a tag fires or doesn't fire on specific pages.
| Name | Required | Description | Default |
|---|---|---|---|
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate readOnlyHint=true and destructiveHint=false. The description is consistent with these annotations and does not introduce any contradictory behavior. It adds little beyond the annotations but is transparent about being a listing operation.
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 concise and well-structured, providing a single purpose statement along with an illustrative example. It avoids unnecessary fluff and directly conveys the tool's functionality.
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 description provides sufficient context for a simple listing tool. Since an output schema exists, detailing return values is not required. However, it does not mention that all parameters are optional, which might be inferred from the schema but could be stated. Overall, it covers the core aspects adequately.
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 has no descriptions for gtm_account_id and gtm_container_id, and the tool description does not explain what these parameters represent or their expected format. While the names are somewhat self-explanatory, the lack of explicit guidance leaves ambiguity for the agent.
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 lists all triggers in the live GTM container, provides an example of filter parsing, and indicates its use for diagnosing tag firing. It distinguishes itself from other GTM tools like list_gtm_tags or get_gtm_trigger.
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 gives a clear use case (diagnose why a tag fires or doesn't fire) and implies when to use this tool (when needing to see all triggers). It does not explicitly contrast with alternative tools like get_gtm_trigger, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_variablesList Tag Manager variablesARead-onlyInspect
List GTM variables — both custom and enabled built-in.
Custom variables come from the live container. Built-in variables (Page URL, Click Element, Form ID, etc.) come from the workspace's enabled-built-ins list. Variables matter because triggers reference them — if a trigger uses {{Form ID}} but Form ID isn't enabled, the trigger never matches.
| Name | Required | Description | Default |
|---|---|---|---|
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only behavior. The description adds transparency about data sources (live container vs workspace enabled-built-ins) and the consequence of missing built-in variables, which complements the annotation without contradiction.
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 compact and well-structured, efficiently conveying the distinction between custom and built-in variables and their relevance without unnecessary verbosity. The paragraph separation aids readability.
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 presence of an output schema, the description does not need to detail return format. It adequately covers the core purpose and provides contextual nuance about variable sourcing and trigger dependencies, making it sufficiently complete for an agent to use 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 0% and the description does not explain the parameters (gtm_account_id, gtm_container_id). Although names are self-explanatory, the description fails to compensate for the lack of schema-level documentation, leaving their role and default behavior ambiguous.
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 it lists GTM variables, distinguishing custom (from live container) and built-in (from workspace enabled-built-ins), and explains the practical significance (trigger references). This is specific and differentiates from sibling tools that handle other GTM resources.
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 meaningful context about when variables matter and how they are sourced, implicitly indicating this tool is for checking variable availability. It does not explicitly compare with alternatives, but the purpose is clear enough for an agent to select it for variable-related queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_versionsTag Manager version historyARead-onlyInspect
List published GTM version history (newest first).
Version headers include version_id, name, and entity counts. Use to correlate a metric drop with a recent publish: fetch versions, find one with timestamps near the drop date, then call get_gtm_version for full content + author info.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | ||
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the readOnlyHint annotation already indicates safety, the description adds behavioral details: it lists only published versions (not drafts) and mentions the ordering (newest first). These are meaningful behavioral constraints not present in the annotations.
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 compact, with no redundant wording. Two sentences efficiently cover purpose, ordering, and a usage workflow. It is well-structured and easy to parse.
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 description mentions that version headers include version_id, name, and entity counts, giving a preview of the output shape. It lacks details on pagination (e.g., how to use page_size) or error handling, but the described workflow is sufficient for most use cases. Given the presence of an output schema (not shown), the description is adequate.
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 provides no descriptions for page_size, gtm_account_id, or gtm_container_id, and the description does not clarify them. Although the parameter names are somewhat self-explanatory, the lack of any detail (e.g., whether gtm_account_id is required, how page_size affects results) leaves ambiguity for an agent.
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 action (list), the resource (GTM version history), and the ordering (newest first). It also distinguishes this tool from get_gtm_version and other list_* tools by focusing on published versions.
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?
It provides a concrete use case (correlating metric drops with recent publishes) and a step-by-step workflow: fetch versions, find timestamps, then call get_gtm_version for details. This makes it obvious 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.
list_gtm_workspacesList Tag Manager workspacesARead-onlyInspect
List workspaces (drafts) under a GTM container.
Workspace IDs are needed for get_gtm_workspace_diff. Most containers
have a single Default Workspace; multiple workspaces appear when the
team uses parallel drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| gtm_account_id | No | ||
| gtm_container_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only and non-destructive nature is already indicated by annotations. The description adds context about the number of workspaces but does not disclose additional side effects or limitations. Since annotations cover the main safety aspects, the description meets the baseline.
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 concise, two sentences, and starts with the primary purpose. It adds relevant contextual information without extraneous details.
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 description mentions that workspace IDs are part of the output, which is useful. It also explains the typical single-workspace scenario. While it doesn't describe the full output schema or error handling, for a simple list tool this is acceptable given the existence of an output schema (though not shown). It could be improved by explicitly stating the return format, but it's fairly 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?
The schema provides only parameter names and types with no descriptions. The description does not elaborate on the parameters, such as how to obtain account/container IDs or any constraints. This leaves the agent to infer from the tool name and context.
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 action (List) and the resource (workspaces under a GTM container). It also explains the typical use case with the Default Workspace, which helps distinguish from other list tools.
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?
It explicitly mentions that workspace IDs are needed for get_gtm_workspace_diff, providing a concrete usage scenario. The note about parallel drafts also guides expectations. However, it doesn't explicitly contrast with other list tools, but that's not critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merchant_accountsList Merchant Center accountsARead-onlyInspect
List Google Merchant Center accounts the connected user can access.
Call first to discover merchant IDs for get_merchant_feed_health. Distinguishes standalone accounts from aggregator (MCA) accounts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description aligns with these by describing a read-only listing operation. The description adds useful behavioral context by indicating it returns account types (standalone vs. MCA), which helps set expectations. It does not mention rate limits or auth requirements, but the annotations cover the safety profile adequately.
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 concise, consisting of two sentences that convey the essential purpose and usage without unnecessary detail. It is well-structured, front-loading the core function and then providing the key use case and a relevant distinction.
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 (no parameters, read-only listing), the description is largely complete. It covers what the tool does, why it might be used (to discover merchant IDs), and a relevant detail (standalone vs. MCA). The output schema is not described, but for a list operation this is a minor omission, not critical for correct invocation.
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 tool has zero parameters, so schema coverage is 100%. According to the rubric, with high coverage, the baseline score is 3. The description adds no parameter-specific information (since there are none), so no additional credit is warranted.
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 purpose: listing Google Merchant Center accounts accessible to the connected user, and explicitly notes the distinction between standalone and MCA accounts. It also provides the primary use case (discovering merchant IDs for get_merchant_feed_health), 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 gives specific guidance on when to use this tool: 'Call first to discover merchant IDs for get_merchant_feed_health.' It also mentions the standalone vs. MCA distinction, which helps in selecting the appropriate account. However, it does not explicitly state when not to use it or alternative tools, though the guidance is sufficient for this simple list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_entityDraft pausing an entityAInspect
Draft pausing a campaign, ad group, ad, or keyword — returns a PREVIEW.
entity_type: "campaign", "ad_group", "ad", or "keyword" entity_id format by type:
campaign: campaign ID (e.g. "12345678")
ad_group: ad group ID (e.g. "12345678")
ad: "adGroupId
adId" (e.g. "12345678987654")keyword: "adGroupId
criterionId" (e.g. "12345678987654")
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| customer_id | No | ||
| entity_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently discloses the two-phase behavior: it only drafts and returns a preview, and actual execution requires a separate confirm_and_apply call. This goes beyond the annotations by clarifying that the operation is not immediately applied.
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 concise and well-structured, using bullet points for entity types and ID formats. Every sentence serves a purpose and there is no redundant or vague wording.
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 description covers the core workflow, input format, and follow-up action, making the tool usable in context. It omits customer_id semantics, but the presence of an output schema and the clear draft/confirm flow keep it reasonably 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?
The description thoroughly explains entity_type and entity_id, including the exact format for each entity type. However, customer_id is not described at all, and since the input schema has no parameter descriptions, this gap is meaningful.
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 that the tool drafts a pause action for campaigns, ad groups, ads, or keywords and returns a preview. It explicitly distinguishes the pause intent from related sibling tools like enable_entity and remove_entity.
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 indicating this is a draft operation that returns a preview and instructs the caller to use confirm_and_apply with the returned plan_id to execute. It does not explicitly contrast with alternatives, but the intended workflow is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_negative_keyword_listDraft a shared negative keyword listAInspect
Draft a shared negative keyword list and attach it to a campaign — returns a PREVIEW.
Creates a reusable negative keyword list that can later be applied to multiple campaigns, unlike add_negative_keywords which adds directly to one campaign. match_type: "EXACT", "PHRASE", or "BROAD" Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| list_name | Yes | ||
| match_type | No | EXACT | |
| campaign_id | Yes | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only and non-destructive, but the description discloses the two-step nature: returns a preview and requires confirm_and_apply to actually attach. This adds important behavioral context beyond the annotations, though it doesn't specify side effects if the plan is never applied.
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 succinct, using three short sentences to convey purpose, usage distinction, and required follow-up action. No unnecessary information or verbose language.
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?
It provides sufficient context for core usage: the preview/confirm flow, distinction from a sibling tool, and match_type options. It does not describe the structure of the preview output or potential error cases, but for a drafting tool, the essential context is covered.
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 has 0% description coverage for parameters. The description clarifies that match_type accepts EXACT, PHRASE, or BROAD, which is valuable. However, it does not explain the meaning or format of keywords, list_name, campaign_id, or customer_id, leaving some parameters under-specified.
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 primary function: drafting a shared negative keyword list and attaching it to a campaign, returning a preview. It also differentiates from sibling add_negative_keywords by explaining the reuse across multiple campaigns versus single-campaign addition.
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?
It explicitly contrasts with add_negative_keywords and instructs to call confirm_and_apply with the returned plan_id to execute, giving clear when-to-use and follow-up guidance. This leaves no ambiguity about the intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_entityDraft removing an entityADestructiveInspect
Draft REMOVING an entity — returns a PREVIEW. This is IRREVERSIBLE.
entity_type: "campaign", "ad_group", "ad", "keyword", "negative_keyword",
"shared_criterion", "campaign_asset", "asset", or "customer_asset"
entity_id: The resource ID.
For keywords: "adGroupIdcriterionId"
For negative_keywords: "campaignIdcriterionId"
(use the resource_id field from get_negative_keywords)
For shared_criterion: "sharedSetIdcriterionId"
(use the resource_id field from get_negative_keyword_list_keywords)
For campaign_asset: "campaignIdassetIdfieldType"
For asset: simple asset ID
For customer_asset: "assetIdfieldType"
WARNING: Removed entities cannot be re-enabled. Use pause_entity instead if you just want to temporarily disable something.
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| customer_id | No | ||
| entity_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description emphasizes irreversibility ('IRREVERSIBLE', 'cannot be re-enabled') and explains the preview/confirm workflow. This adds meaningful behavioral context that the annotations alone do not fully convey.
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 somewhat long due to the detailed entity_id format breakdown, but this information is necessary and organized clearly. The main purpose is front-loaded, and the structure with bullet points aids readability, though it could be tightened slightly.
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 an output schema and only three parameters; the description covers the required parameters, the destructive nature, and the confirmation step. The omission of customer_id is a minor gap, but overall the description is sufficient for an agent to 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?
The description thoroughly explains entity_type and entity_id, including specific formats for each entity type. However, customer_id is not mentioned at all, though it is optional with a default value. The coverage is strong but not complete.
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 drafts a removal of an entity and returns a preview, with a specific list of supported entity types. It distinguishes itself from pause_entity, making its 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 explicitly says to use pause_entity for temporary disabling, providing a clear alternative. It also instructs to call confirm_and_apply with the returned plan_id to execute, giving precise usage steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ga4_reportAnalytics reportARead-onlyInspect
Run a custom GA4 report with specified dimensions, metrics, and date range.
Common dimensions: date, pagePath, sessionSource, sessionMedium, country, deviceCategory, eventName Common metrics: sessions, totalUsers, newUsers, screenPageViews, conversions, eventCount, bounceRate
Date formats: "today", "yesterday", "7daysAgo", "28daysAgo", "90daysAgo", or "YYYY-MM-DD". If property_id is empty, uses the default from config.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| metrics | No | ||
| dimensions | No | ||
| property_id | No | ||
| date_range_end | No | today | |
| date_range_start | No | 7daysAgo |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, so the safety profile is covered. The description adds behavioral context beyond the annotations: the property_id fallback to config, accepted date-format strings, and common dimensions/metrics. No contradiction with annotations.
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?
Four short lines, front-loaded purpose, and every sentence adds practical value. The common-values lists are compact and scannable, and no filler or restatement of the schema is present.
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 output schema exists, return-value documentation is not the description's job. It covers date syntax, common fields, and config fallback. It is slightly incomplete in not clarifying what null metrics/dimensions default to or when the realtime sibling is the right choice, but these are minor for an optional-parameter read-only report tool.
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?
With 0% schema description coverage, the description carries the parameter-documentation burden. It compensates well by listing common dimension and metric values and specifying accepted date formats, and it explains the property_id default. The only gap is limit, whose default value is visible in 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 opens with a specific verb and resource: 'Run a custom GA4 report with specified dimensions, metrics, and date range.' This is clear and identifies the GA4 reporting domain, though it does not explicitly differentiate from the sibling run_realtime_report.
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 gives useful context (common dimensions/metrics, date formats, property default) but never says when to prefer this tool over alternatives like run_realtime_report or run_gsc_report. Usage is implied by 'custom GA4 report' rather than stated with exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gaqlCustom Google Ads queryARead-onlyInspect
Execute an arbitrary GAQL (Google Ads Query Language) query.
Use this for advanced queries not covered by the other tools. See the GAQL reference in the AdLoop cursor rules for syntax help.
format: "table" (default, readable), "json" (structured), "csv" (exportable)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| format | No | table | |
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the arbitrary-query nature and format options but does not disclose operational behavior such as rate limits, failure modes, or permission requirements. This is adequate given the annotations but not rich.
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 compact and front-loaded: the action, usage context, and format options are stated in a few sentences with no wasted words. The pointer to the GAQL reference is a useful addition.
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 an arbitrary query tool with an output schema and safety annotations, the description covers the key decision points: what it does, when to use it, output formats, and syntax help. The main missing piece is customer_id semantics, but the output schema covers return values.
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 0%, so the description must compensate. It usefully explains the format parameter values ('table', 'json', 'csv') and points to a GAQL reference for query syntax, but it does not describe the customer_id parameter or its expected format. This leaves a gap for one of three parameters.
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 states a specific verb and resource: 'Execute an arbitrary GAQL query.' It also positions the tool as for 'advanced queries not covered by the other tools,' which differentiates it from siblings at a category level, though it does not name specific sibling tools.
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?
It explicitly says 'Use this for advanced queries not covered by the other tools,' giving a clear usage condition and an exclusion. It could be stronger by naming alternative tools, but the guidance is unambiguous enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gsc_reportSearch Console reportARead-onlyInspect
Run a Google Search Console search analytics report.
Returns clicks, impressions, CTR, and average position broken down by the requested dimensions. Useful for diagnosing organic traffic drops, finding keyword opportunities, and cross-referencing with GA4 and Ads data.
site_url: the GSC property URL (e.g. "https://example.com/" or "sc-domain:example.com"). Defaults to gsc.site_url in config.yaml. dimensions: one or more of ["query", "page", "country", "device", "date"]. Defaults to ["query"]. date_range_start / date_range_end: ISO dates (YYYY-MM-DD) or relative values like "7daysAgo", "30daysAgo", "today". search_type: "web" (default), "image", "video", "news", "discover", or "googleNews". dimension_filter_groups: optional GSC DimensionFilterGroup list to filter by query, page, country, or device. Example: [{"filters": [{"dimension": "query", "operator": "contains", "expression": "analytics"}]}] limit: maximum rows to return (default 100, max 25000).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| site_url | No | ||
| dimensions | No | ||
| search_type | No | web | |
| date_range_end | No | today | |
| date_range_start | No | 7daysAgo | |
| dimension_filter_groups | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false. The description adds no contradicting information and implicitly confirms a read-only operation by describing a report generation. It does not elaborate on side effects beyond what the annotations imply, but it does not need to given the annotation coverage. The description adds some detail on filtering and limits, which indirectly informs behavior, but the core transparency is already provided by the annotations.
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 well-organized with a clear opening sentence, a bullet-like list of parameters, and appropriate use of examples. It is concise yet thorough, avoiding unnecessary fluff while delivering all essential information. The structure makes it easy to parse programmatically and for human agents.
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 description provides all necessary context: what the tool does, what it returns, parameter details with defaults, and example usage. It even includes a note on the limit maximum. Even without an explicit output schema, the description implies the response structure (clicks, impressions, CTR, position) which is sufficient for most use cases. The description is self-contained and leaves no critical gaps for an agent to call 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?
The description covers all seven parameters: site_url, dimensions, date_range_start/end, search_type, dimension_filter_groups, and limit. Each parameter is explained with defaults, allowed values (e.g., search_type enum, relative date strings), and an example for dimension_filter_groups. This fully compensates for the lack of schema-level descriptions and gives an agent complete understanding of how to construct a request.
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 verb 'Run' and the resource 'Google Search Console search analytics report', and explicitly lists the returned metrics (clicks, impressions, CTR, average position). It also provides use-case context ('diagnosing organic traffic drops, finding keyword opportunities') making the tool's purpose unambiguous even without referencing sibling tools.
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 includes explicit use-case guidance ('Useful for diagnosing organic traffic drops, finding keyword opportunities, and cross-referencing with GA4 and Ads data') which signals when to employ this tool. It does not explicitly state when not to use it or compare it directly to siblings, but the context is sufficient for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_realtime_reportAnalytics realtime reportARead-onlyInspect
Run a GA4 realtime report showing current active users and events.
Useful for checking if tracking is firing correctly after code changes. Common dimensions: unifiedScreenName, eventName, country, deviceCategory Common metrics: activeUsers, eventCount
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | ||
| dimensions | No | ||
| property_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the description is consistent with those. The description does not add any extra behavioral context (e.g., authentication, rate limits), but it also does not contradict the annotations. With the bar lowered due to annotations, a neutral score is appropriate.
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: two short sentences plus a list of common values. It leads with the core purpose and then provides the use case and examples, with no unnecessary words or redundancy. The structure is clean and front-loaded, making it easy to scan.
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 description covers the main purpose, a use case, and example parameter values, which is sufficient for a simple reporting tool. The output schema is present, so the description does not need to explain return structure. The only notable gap is the lack of explicit guidance on the `property_id` parameter, but this is a minor omission given the overall context.
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 provides no descriptions for any of the three parameters, so the description must compensate. It lists common dimensions and metrics, which gives useful examples for the `dimensions` and `metrics` parameters, but it does not explicitly map those examples to the parameters or explain the `property_id` parameter at all. The compensating information is partial, hence a mid-range score.
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: 'Run a GA4 realtime report showing current active users and events.' It uses a specific verb ('Run') and identifies the resource ('GA4 realtime report'). The mention of 'realtime' and 'current active users' distinguishes it from siblings like run_ga4_report, which presumably handles historical data.
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 a concrete use case: 'Useful for checking if tracking is firing correctly after code changes.' This gives clear guidance on when to use the tool. It does not explicitly contrast with alternatives like run_ga4_report or validate_tracking, but the realtime focus and the specific use case make the intended scenario clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_groupDraft ad group changesCInspect
Draft an ad group update for name and/or manual CPC bid.
| Name | Required | Description | Default |
|---|---|---|---|
| max_cpc | No | ||
| ad_group_id | Yes | ||
| customer_id | No | ||
| ad_group_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description uses the word 'Draft' suggesting a non-destructive, staging operation, but it does not disclose key behavioral aspects such as whether changes are applied immediately, whether a separate confirmation step is required, or what side effects occur. The annotations (readOnlyHint=false, destructiveHint=false) are ambiguous, and the description does not clarify the actual impact of calling this tool. Given the tool name includes 'update', the lack of explicit 'does not apply immediately' is a significant gap.
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, clear sentence with no unnecessary words. It directly states the tool's purpose. The structure is efficient and easily parsed.
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 output schema is not provided, and the description gives no information about what the tool returns (e.g., a draft object, a confirmation message, or an error). Given that this is a drafting tool, an agent would need to know the return format to proceed correctly. The absence of any output details leaves a significant gap in understanding the full workflow.
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 lists four parameters (max_cpc, ad_group_id, customer_id, ad_group_name) with types and defaults but provides no descriptions. The description mentions 'name' and 'manual CPC bid', but it does not explicitly map these to 'ad_group_name' and 'max_cpc'. There is no explanation of what 'customer_id' is for, nor any guidance on required versus optional parameters beyond the schema's required field. This is insufficient for an agent to correctly populate the parameters.
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 'Draft an ad group update for name and/or manual CPC bid', which is a specific verb and object. It distinguishes from sibling tools like 'draft_ad_group' (likely creating a new ad group) and 'update_campaign' (updating a campaign). The only minor ambiguity is the tool name 'update_ad_group' which could imply a direct update, but the description's use of 'Draft' clarifies the intended 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?
No guidance is provided about when to use this tool versus alternatives. It does not mention that this is for drafting changes to an existing ad group before applying, nor does it reference the broader draft-apply workflow (e.g., 'confirm_and_apply' sibling). Without explicit usage context, an agent may confuse it with a direct update or with creating a new ad group draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignDraft campaign changesAInspect
Draft an update to an existing campaign — returns a PREVIEW, does NOT apply.
Only include the parameters you want to change. Omit the rest.
campaign_id: the numeric ID of the campaign to update (required) bidding_strategy: MAXIMIZE_CONVERSIONS | TARGET_CPA | TARGET_ROAS | MAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | MANUAL_CPC target_cpa: required if bidding_strategy is TARGET_CPA (in account currency) target_roas: required if bidding_strategy is TARGET_ROAS daily_budget: new daily budget in account currency geo_target_ids: REPLACES all geo targets. Common IDs: "2276" Germany, "2040" Austria, "2756" Switzerland, "2840" USA, "2826" UK language_ids: REPLACES all language targets. Common IDs: "1001" German, "1000" English, "1002" French, "1004" Spanish search_partners_enabled: include ads on Search partners display_network_enabled: enable Search campaign display expansion display_expansion_enabled: alias for display_network_enabled max_cpc: Maximize Clicks CPC cap when bidding_strategy is TARGET_SPEND, or when the existing campaign already uses TARGET_SPEND
Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| max_cpc | No | ||
| target_cpa | No | ||
| campaign_id | Yes | ||
| customer_id | No | ||
| target_roas | No | ||
| daily_budget | No | ||
| language_ids | No | ||
| geo_target_ids | No | ||
| bidding_strategy | No | ||
| display_network_enabled | No | ||
| search_partners_enabled | No | ||
| display_expansion_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false and destructiveHint=false are consistent with the description's statement that it returns a preview and does not apply changes. The description adds important behavioral context by specifying the preview nature and the requirement to call confirm_and_apply.
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 well-organized, listing each parameter with its meaning in a compact bullet-like format. It avoids redundancy and each sentence serves a purpose, including the final instruction to confirm.
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 complexity (conditional requirements, aliases, cross-reference to confirm_and_apply), the description covers all necessary context. It does not need to describe output schema since the preview behavior and execution path are clearly stated.
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 provides no descriptions (0% coverage), but the tool description compensates fully. It explains conditional requirements (e.g., target_cpa required for TARGET_CPA), aliases (display_expansion_enabled for display_network_enabled), and special cases (max_cpc only for TARGET_SPEND or when existing campaign uses it).
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 verb 'draft' clearly indicates a preview action, and the resource is 'campaign'. It explicitly says 'returns a PREVIEW, does NOT apply', and the sibling tools include draft_campaign (for new campaigns) and confirm_and_apply (to execute), making the distinction 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 explicitly states 'Only include the parameters you want to change. Omit the rest.' and 'Call confirm_and_apply with the returned plan_id to execute.' This provides clear guidance on 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.
update_responsive_search_adUpdate a responsive search adAInspect
Update mutable fields on an existing RSA in place — returns a PREVIEW.
Edits an existing RSA without creating a new ad; the ad keeps its ID.
Google Ads API v23 (AdService.MutateAds) permits in-place mutation of
final_urls, path1, path2, headlines, and descriptions.
IMPORTANT: replacing headlines or descriptions is NOT a free in-place
edit. Even though the ad ID is preserved, swapping the creative text
RESETS the ad's asset-combination learning and performance history and
sends the ad BACK THROUGH Google policy review — Google treats the
creative as new for optimization. URL-only and path-only edits do not
incur this. When headlines/descriptions change, the returned preview
includes a warnings entry — surface it to the user before applying.
Headlines/descriptions are LIST-REPLACE — when provided, the supplied
list fully swaps in for the existing one, and Google's RSA constraints
apply (3-15 headlines, 2-4 descriptions, 30/90 char limits, pin-slot
rules). Each entry may be a plain string (unpinned) or
{"text": "...", "pinned_field": "HEADLINE_1"}.
Argument semantics:
- headlines / descriptions: None or [] -> no change;
non-empty list -> replaces the existing list in full
- final_url: empty -> no change; non-empty -> replaces final URL
- path1 / path2: empty -> no change; non-empty -> sets value
- clear_path1 / clear_path2: True -> set to empty string
At least one mutation must be requested. Call confirm_and_apply with the returned plan_id to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| path1 | No | ||
| path2 | No | ||
| final_url | No | ||
| headlines | No | ||
| clear_path1 | No | ||
| clear_path2 | No | ||
| customer_id | No | ||
| descriptions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Fully discloses that the tool returns a preview rather than directly applying changes, that creative replacements reset learning and trigger policy review, and that headlines/descriptions are list-replaced. These important side effects go well beyond the basic annotations.
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 detailed but well-organized with clear sections, warnings, and parameter semantics. Every sentence contributes necessary information, and the formatting makes important caveats easy to notice.
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?
Covers the tool's workflow (preview then confirm_and_apply), mutation constraints, Google's RSA limits, and the important distinction between URL/path edits and creative edits. It is sufficiently complete for an agent to use the tool correctly without additional context.
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?
Thoroughly explains each parameter's semantics, including the empty-value/None no-op behavior, list-replacement behavior for headlines and descriptions, and the clear_path flags. Also documents the supported string and object formats for headline entries, which is essential for correct use.
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 tool updates an existing responsive search ad in place and returns a preview, distinguishing it from creation-oriented siblings like draft_responsive_search_ad. The scope is specific and immediately understandable.
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?
Provides strong usage guidance including the need to call confirm_and_apply, the distinction between URL-only vs creative changes, and the requirement for at least one mutation. It does not explicitly contrast with draft_responsive_search_ad, but the 'existing RSA' language makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_trackingValidate trackingARead-onlyInspect
Compare tracking events found in the codebase against actual GA4 data.
First, search the user's codebase for gtag('event', ...) or dataLayer.push calls and extract event names. Then pass those names here to check which ones actually fire in GA4.
Returns: matched events, events missing from GA4, unexpected GA4 events, and auto-collected events (page_view, session_start, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| property_id | No | ||
| date_range_end | No | today | |
| expected_events | Yes | ||
| date_range_start | No | 28daysAgo |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is transparent about the tool's read-only nature, consistent with the readOnlyHint annotation. It details the process (searching for gtag calls, passing event names) and explicitly lists the output components (matched, missing, unexpected, auto-collected events), so the agent knows exactly what to expect without hidden side effects.
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 concise and well-structured: a one-sentence summary, a two-step workflow, and a bullet-like list of return types. No redundant information or filler; every sentence adds value. It is front-loaded with the core purpose, making it easy to scan.
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 read-only validation tool, the description covers the purpose, workflow, and output types. However, it lacks explanations for the date range parameters and the property_id, which are part of the input schema. While the output schema exists, the description does not fully contextualize all inputs, leaving some ambiguity for the agent on how to fill them 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 schema has 0% coverage for parameter descriptions, and the description only mentions 'expected_events' indirectly ('pass those names here'). The other three parameters (property_id, date_range_start, date_range_end) are not explained, leaving the agent to infer their meaning. Since the description does not compensate for the lack of schema details, this score is low.
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 purpose: comparing tracking events from the codebase against actual GA4 data. It specifies the exact workflow (search codebase for gtag/dataLayer calls, extract event names, then validate) and the type of output (matched, missing, unexpected, auto-collected events), making the function's intent 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: first extract event names from the codebase, then pass them to this tool. It also implies the prerequisite (having GA4 data access) and sets expectations by listing the return categories. This is a clear 'when and how to use' instruction that goes beyond a simple verb.
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.
4 tool updates
v0.13.3- Added
draft_create_conversion_action - Added
draft_remove_conversion_action - Added
draft_update_conversion_action - Added
update_responsive_search_ad
30 tool updates
v0.13.2- Added
add_negative_locations - Added
add_to_negative_keyword_list - Added
analyze_page_speed - Added
attach_shared_set_to_campaigns - Added
audit_event_coverage - Added
confirm_and_apply - Added
discover_keywords - Added
draft_callouts - Added
draft_campaign - Added
draft_image_assets - Added
draft_key_event - Added
estimate_budget - Added
generate_tracking_code - Added
get_account_summaries - Added
get_audience_performance - Added
get_campaign_performance - Added
get_gtm_version - Added
get_gtm_workspace_diff - Added
get_keyword_performance - Added
get_negative_keyword_list_campaigns - Added
get_pmax_performance - Added
get_recommendations - Added
get_search_terms - Added
get_tracking_events - Added
list_gtm_accounts - Added
list_gtm_workspaces - Added
propose_negative_keyword_list - Added
run_gaql - Added
run_realtime_report - Added
validate_tracking
30 tool updates
v0.13.0- Removed
add_negative_locations - Removed
add_to_negative_keyword_list - Removed
analyze_page_speed - Removed
attach_shared_set_to_campaigns - Removed
audit_event_coverage - Removed
confirm_and_apply - Removed
discover_keywords - Removed
draft_callouts - Removed
draft_campaign - Removed
draft_image_assets - Removed
draft_key_event - Removed
estimate_budget - Removed
generate_tracking_code - Removed
get_account_summaries - Removed
get_audience_performance - Removed
get_campaign_performance - Removed
get_gtm_version - Removed
get_gtm_workspace_diff - Removed
get_keyword_performance - Removed
get_negative_keyword_list_campaigns - Removed
get_pmax_performance - Removed
get_recommendations - Removed
get_search_terms - Removed
get_tracking_events - Removed
list_gtm_accounts - Removed
list_gtm_workspaces - Removed
propose_negative_keyword_list - Removed
run_gaql - Removed
run_realtime_report - Removed
validate_tracking
26 tool updates
v0.12.0- Added
add_negative_locations - Added
analyze_page_speed - Added
audit_event_coverage - Changed
discover_keywords1 field changed- added
Input schema / properties / include_monthly_volumesAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
draft_demographic_targeting - Added
draft_key_event - Changed
get_ad_performance1 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "type": "boolean" +}
- Changed
get_campaign_performance1 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
get_demographic_targeting - Added
get_gtm_tag - Added
get_gtm_trigger - Added
get_gtm_version - Added
get_gtm_workspace_diff - Changed
get_keyword_performance1 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
get_merchant_feed_health - Changed
get_search_terms1 field changed- added
Input schema / properties / compactAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
list_gsc_sites - Added
list_gtm_accounts - Added
list_gtm_containers - Added
list_gtm_tags - Added
list_gtm_triggers - Added
list_gtm_variables - Added
list_gtm_versions - Added
list_gtm_workspaces - Added
list_merchant_accounts - Added
run_gsc_report
46 tool updates
v0.9.0- First observed
add_negative_keywords - First observed
add_to_negative_keyword_list - First observed
analyze_campaign_conversions - First observed
attach_shared_set_to_campaigns - First observed
attribution_check - First observed
confirm_and_apply - First observed
detach_shared_set_from_campaigns - First observed
discover_keywords - First observed
draft_ad_group - First observed
draft_callouts - First observed
draft_campaign - First observed
draft_image_assets - First observed
draft_keywords - First observed
draft_responsive_search_ad - First observed
draft_sitelinks - First observed
draft_structured_snippets - First observed
enable_entity - First observed
estimate_budget - First observed
generate_tracking_code - First observed
get_account_summaries - First observed
get_ad_performance - First observed
get_asset_performance - First observed
get_audience_performance - First observed
get_campaign_performance - First observed
get_detailed_asset_performance - First observed
get_keyword_performance - First observed
get_negative_keyword_list_campaigns - First observed
get_negative_keyword_list_keywords - First observed
get_negative_keyword_lists - First observed
get_negative_keywords - First observed
get_pmax_performance - First observed
get_recommendations - First observed
get_search_terms - First observed
get_tracking_events - First observed
health_check - First observed
landing_page_analysis - First observed
list_accounts - First observed
pause_entity - First observed
propose_negative_keyword_list - First observed
remove_entity - First observed
run_ga4_report - First observed
run_gaql - First observed
run_realtime_report - First observed
update_ad_group - First observed
update_campaign - First observed
validate_tracking
TDQS
Scored across 71 tools
Tools are broadly distinct across the Google Ads, GA4, GTM, GSC, and Merchant Center domains, and the unusually detailed descriptions cross-reference related tools. A few pairs risk misselection — list_accounts vs get_account_summaries, validate_tracking vs audit_event_coverage — but the descriptions clarify platform and scope differences well.
The set largely follows meaningful verb_noun families: get_*, list_*, run_*, draft_*, update_*, add_*. However, the preview-commit workflow is inconsistently marked — some mutations use draft_* (draft_campaign, draft_keywords) while functionally identical preview mutations use update_*, add_*, pause_entity, enable_entity, or remove_entity — and discovery tools mix get_ and list_ prefixes for the same kind of operation.
At 71 tools, this is a very large surface for an agent to navigate, even accounting for the breadth of six Google products. Clusters like the 10 negative-keyword tools, the 12 GTM tools, and the four asset-drafting tools inflate the count beyond what feels scoped for a single server.
Coverage spans the full campaign lifecycle — plan (estimate_budget, discover_keywords), draft/apply, measure, and optimize — plus cross-platform diagnostics via GA4, GTM, GSC, Merchant Center, and PageSpeed. Minor gaps exist: no dedicated ad-group or conversion-action listing tool (requiring run_gaql workarounds) and no GTM write operations, but core workflows have no dead ends.
Maintenance
Related MCP Connectors
Google Ads, Meta Ads & GA4 MCP server - 250+ tools for campaigns, creatives, audiences & reports.
Google Ads MCP server — manage campaigns, keywords, and metrics.
AI agents that manage paid ads on Meta, LinkedIn, and Google Ads from any MCP client.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
AlicenseNot gradedqualityFmaintenanceMCP server for managing Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads via AI. 210+ tools including account audits, wasted spend detection, and PMax insights.2MIT- AlicenseNot gradedqualityDmaintenanceA unified MCP server that gives AI assistants direct access to Google Analytics 4, Google Search Console, Google Ads and Google Merchant Center data using OAuth2 user credentials.MIT

Markifact MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceA universal marketing MCP server that lets AI clients manage 20+ ad and marketing platforms (Google Ads, Meta, TikTok, etc.) with 500+ operations, including write actions with user approval.48MIT- AlicenseNot gradedqualityBmaintenanceA hosted MCP server that enables managing Google Ads, Microsoft Advertising, TikTok Ads, LinkedIn Ads, and other Google services from ChatGPT, Claude, or any MCP client using natural language, with no code or API keys required.MIT