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, GA4, and tracking code.
An MCP server that gives your AI assistant read + write access to Google Ads and GA4 — with safety guardrails that prevent accidental spend.
☁️ Skip the setup — use AdLoop Cloud (free beta) · or self-host: pip install adloop
AdLoop Cloud is the hosted version of this project — live now, free during beta (limited seats). 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 during beta | 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.
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 |
|
|
| 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 |
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 — 67 tool registrations with safety annotations
├── 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
└── 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, live in beta: 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
37 toolsadd_negative_keywordsA
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?
Annotations indicate non-destructive and non-readonly. The description adds that it returns a PREVIEW and requires confirmation, providing behavioral context beyond annotations. However, it does not disclose details like expiration of drafts or resource consumption.
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?
Three short sentences plus a match_type line, each providing essential information. The purpose is front-loaded with 'returns a PREVIEW', and no unnecessary words. Perfectly concise.
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 (4 params, 2 required) and presence of output schema, the description explains the workflow and purpose well. It ties to sibling tools ('confirm_and_apply'). Minor gaps: no details on plan_id format or error handling, but sufficient for a drafting 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 coverage is 0%, so the description must compensate. It explains match_type values ('EXACT', 'PHRASE', 'BROAD') and the purpose of negative keywords, but does not describe the format of keywords or the customer_id parameter. The baseline for 0% coverage is 4, but the lack of detail on required parameters (campaign_id, keywords) reduces the 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 it drafts negative keyword additions and returns a preview, with a specific verb ('Draft'). It distinguishes from sibling tools like 'add_to_negative_keyword_list' (direct addition) and 'propose_negative_keyword_list' (proposal), and references the follow-up tool '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?
The description explicitly instructs to call 'confirm_and_apply' with the returned plan_id to execute, establishing a clear two-step workflow. It implies using this tool for preview before application, but does not explicitly state when not to use it or list alternatives like direct addition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_campaign_conversionsARead-only
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 already declare readOnlyHint=true and destructiveHint=false, indicating a safe read operation. The description adds behavioral insights like revealing click-to-session ratios as a GDPR indicator and computing cost-per-GA4-conversion. It does not contradict annotations and provides useful context beyond the annotations, such as date format and default 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 relatively concise, with five sentences covering the core conversion mapping, key outputs, and date format. It is front-loaded with the main purpose and avoids unnecessary details. Every sentence adds value, though the structure could be slightly improved by grouping related concepts (e.g., output 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?
Given the tool's complexity (5 parameters, output schema exists), the description covers the main purpose and several key outputs (click-to-session ratios, cost-per-GA4-conversion, non-paid conversion rates). It does not need to explain return values due to output schema. However, it could be more complete by mentioning default behaviors for parameters other than dates and required permissions.
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 only explains date_format for the two date parameters (e.g., 'YYYY-MM-DD', empty = last 30 days). It does not describe customer_id, property_id, or campaign_name, leaving ambiguity about their purpose. This is insufficient for a 5-parameter tool with no parameter descriptions elsewhere.
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 maps Google Ads campaign clicks to GA4 conversions and computes cost-per-GA4-conversion, click-to-session ratios, and non-paid conversion rates. It distinguishes itself from sibling tools like get_campaign_performance (which only retrieves campaign metrics) and attribution_check (which may focus on attribution models) by specifying cross-platform integration and unique outputs.
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 on when to use the tool (for analyzing click-to-conversion mapping, GDPR indicators, and comparing Ads vs. GA4 conversions). It mentions non-paid channel rates for context but does not explicitly state when not to use it or suggest alternatives. This is adequate but lacks formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attribution_checkARead-only
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?
Annotations already indicate read-only and non-destructive. The description adds value by detailing the analysis scope (consent gaps, attribution models) and behavior of the conversion_events parameter. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then specific diagnoses, then parameter details. It is concise (5-6 lines) with no fluff, though could group related points.
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?
With an output schema present, return values need not be explained. The description covers main behavioral aspects and key parameter semantics, but omits context for customer_id and property_id. Reasonably complete for an analysis 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 coverage is 0%, so the description must compensate. It explains conversion_events (optional list vs aggregate) and date format/empty default, but does not explain customer_id or property_id. Adds partial value.
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 compares Ads-reported conversions to GA4 to find tracking discrepancies, with specific diagnoses (GDPR consent gaps, attribution model differences, missing events). This distinguishes it from sibling analysis tools like validate_tracking or analyze_campaign_conversions.
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 for when to use (comparing Ads vs GA4, diagnosing specific issues) but does not explicitly mention when not to use or contrast with alternatives like get_tracking_events or analyze_campaign_conversions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_ad_groupA
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?
Annotations indicate non-read-only and non-destructive behavior. The description adds that it returns a preview and does not create, which aligns with the annotations. It also notes the ad group is ENABLED and SEARCH_STANDARD, providing useful behavioral context beyond the structured fields.
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 (a few sentences) with bullet points for parameters. It front-loads the key information about the preview nature and the workflow. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, parameters, and the necessary next step (confirm_and_apply). With an output schema available, the lack of detail on the return value is acceptable. Overall, it provides sufficient context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by explaining each parameter's purpose and format: campaign_id source, ad_group_name, keywords structure (list of objects with text and match_type), and cpc_bid_micros condition. The customer_id parameter is not explained, but it has a default value.
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 an ad group and returns a preview, not a creation. It distinguishes itself from sibling tools like confirm_and_apply by specifying the draft-then-execute workflow. The ad group type and status are explicitly mentioned.
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 indicates the draft is a preliminary step before calling confirm_and_apply, providing clear context on when to use this tool and what to do next. However, it does not explicitly list alternative tools or scenarios where this should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_demographic_targetingA
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?
Annotations indicate not read-only and not destructive. The description adds that the tool drafts and returns a preview, requiring confirmation via another tool. It also explains the effect of the negative flag and the fixed nature of Google's age buckets.
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 clear sections and front-loaded purpose. It is somewhat lengthy but every sentence adds necessary value. Minor redundancy could be trimmed.
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 existence of an output schema (implied), the description adequately covers the tool's behavior, parameters, constraints, and follow-up step (confirm_and_apply). No gaps are evident for an AI agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining each parameter: negative flag, ad_group_id vs campaign_id, and accepted values for age_ranges, genders, parental_statuses, income_ranges. It also notes constraints like at least one demographic list must be non-empty.
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 demographic targeting criteria and returns a preview. It distinguishes from siblings like get_demographic_targeting (which retrieves existing) and confirm_and_apply (which executes the 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 explains when to use the tool (to exclude or narrow demographic segments) and provides constraints like providing exactly one of ad_group_id or campaign_id. It also directs to confirm_and_apply for execution. However, it does not explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_keywordsA
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?
Annotations (readOnlyHint: false, destructiveHint: false) are basic. Description adds crucial behavior: returns a PREVIEW, does NOT add keywords, requires confirm_and_apply. Discloses the two-step process and non-destructive 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?
Two sentences, front-loaded with purpose. Every sentence adds value: first states what it does, second details keyword format and follow-up action. 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?
Covers the main behavior, return value (plan_id), and required follow-up tool. Could have explained optional customer_id parameter, but overall complete given the tool's simplicity and presence of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%. Description only explains the 'keywords' parameter format with examples, but does not clarify 'ad_group_id' or 'customer_id'. Partially compensates for 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?
Clearly states action ('draft') and resource ('keyword additions'), explicitly says it returns a preview and does NOT add keywords. Distinguishes from sibling tools like 'add_negative_keywords' by indicating it's a preparatory step.
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 instruction to call confirm_and_apply to execute, and specifies that it does not add keywords. However, it doesn't elaborate on when to use this tool versus other sibling tools beyond the follow-up step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_responsive_search_adA
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?
Description states non-destructive (does NOT create ad), but annotations readOnlyHint=false suggests possible side effects (e.g., saving draft). Not fully transparent about whether draft is stored or purely computed. Adds context but does not resolve the ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: purpose first, then input details, then examples. Each sentence adds value. Slightly verbose but efficient overall.
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, input format, constraints, and next step. Output schema exists, so return value not needed. Lacks edge cases (e.g., what if headlines count invalid) but sufficient for a drafting 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 coverage 0% so description carries burden. Explains headlines/descriptions structure (plain string vs dict with pinning), valid pin values, and Google caps. Provides significant meaning beyond schema. Does not explain ad_group_id, final_url, or customer_id, but those are relatively self-explanatory.
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 'draft' and resource 'Responsive Search Ad', with explicit distinction from creation: 'returns a PREVIEW, does NOT create the ad'. Distinguishes from sibling '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 clear when-to-use (drafting preview) and explicit next step ('Call confirm_and_apply to execute'). Gives constraints (headlines 3-15, descriptions 2-4, character limits, pinning rules). Lacks explicit when-not-to-use or alternatives, but guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_sitelinksA
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?
Annotations set readOnlyHint=false and destructiveHint=false. The description adds that the tool 'returns a PREVIEW' and requires a follow-up call to execute. This clarifies the non-destructive, non-read-only nature and provides behavioral context beyond annotations. No contradiction found.
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 starts with a clear one-line purpose, then uses a bullet-like list for the sitelinks structure. No redundant sentences. Every sentence adds 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?
Covers the main purpose, parameter details (except customer_id), usage context, recommendations, and next steps. Has an output schema, so return value explanation is not needed per rules. Lacks explanation of customer_id but otherwise complete for a drafting tool with preview.
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 bears full burden. It explains the sitelinks parameter in detail with sub-fields (link_text, final_url, description1, description2) and constraints (max chars). However, it does not explain the customer_id parameter (only default shown) or note that it's optional.
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 sitelink extensions for a campaign and returns a preview. It uses specific verbs and resources (draft sitelinks, returns preview). However, it does not explicitly differentiate from sibling 'draft' tools like draft_callouts or draft_keywords, which share a similar draft-and-preview pattern.
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 clear context: 'Call confirm_and_apply with the returned plan_id to execute.' Also includes a Google recommendation on minimum sitelinks (at least 4, fewer than 2 may not show). Does not explicitly state when not to use this tool or list alternatives, but the guidance is adequate for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_structured_snippetsB
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?
Annotations indicate it is not read-only (readOnlyHint: false) and not destructive (destructiveHint: false). The description adds that it returns a PREVIEW, implying no final creation or side effects, which is significant behavioral context beyond 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 a single sentence containing essential information: action ('draft'), resource ('structured snippet assets'), and key outcome ('returns a PREVIEW'). It is concise and front-loaded, though adding minimal parameter context would not sacrifice brevity.
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 3 parameters (2 required) with no schema descriptions, the description is incomplete. It does not explain the format of the 'snippets' array or the role of 'customer_id'. The existence of an output schema partially mitigates missing return info, but input semantics remain unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% with no descriptions for any parameter. The description only names the tool's purpose and does not explain the structure or constraints for 'snippets' or the optional 'customer_id', leaving the agent to infer from parameter names alone.
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 structured snippet assets for a campaign and returns a preview. It distinguishes itself from sibling draft tools (e.g., draft_callouts, draft_sitelinks) by specifying 'structured snippet assets', making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like draft_callouts or draft_sitelinks. No context for prerequisites or when to choose this over other drafting tools is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_entityA
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?
Annotations indicate readOnlyHint=false (mutation) and destructiveHint=false (not destructive). The description adds transparency by explaining that it is a draft/preview that returns a plan_id, requiring a subsequent call to confirm_and_apply to execute. This clarifies that the action is not immediate.
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 and front-loaded with the main purpose. It uses a structured format for entity types and ID formats. A bit more compactness could be achieved, but it is clear without unnecessary text.
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 existence of an output schema (not shown), the description does not need to explain return values. It covers the core functionality, including entity types and ID formats. However, it could mention error conditions (e.g., if entity is not paused) for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully compensates. It explains entity_type with allowed values, entity_id with format per type (with examples), and customer_id as optional. This is essential for correct parameter usage.
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 is for drafting an enable action on paused entities (campaigns, ad groups, ads, keywords) and returns a preview. It distinguishes itself from siblings like pause_entity and remove_entity by specifying the action and workflow.
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 workflow: call to get a preview, then use confirm_and_apply to execute. It also explains entity types and ID formats. However, it does not explicitly state when not to use it (e.g., if the entity is already enabled or if immediate action is needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_performanceBRead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is known to be safe. The description adds behavioral context by explaining the compact mode: it returns totals, top-10 ads with counts, and findings, and notes the size reduction (~90% smaller). This goes beyond 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 (three sentences) and front-loaded: first sentence states purpose, second lists return fields, third details compact mode. No redundant information, though the list of return fields could be integrated into the first sentence minimally.
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, the description covers return values adequately. It also details compact mode behavior. However, it lacks documentation for three parameters and does not differentiate well from sibling tools (e.g., get_asset_performance) in the context of comprehensive performance analysis.
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 must compensate. It only explains the 'compact' parameter and its effect. The remaining three parameters (customer_id, date_range_end, date_range_start) are not described at all, leaving the agent without guidance on their usage or format.
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 'Get ad-level performance data' which is a specific verb+resource. It lists the fields returned, distinguishing it from other performance tools like get_campaign_performance or get_keyword_performance. However, it doesn't explicitly differentiate from sibling tools like get_asset_performance, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on when to use compact=true ('for audits/overviews') and the benefits. However, it does not specify when to avoid the tool or mention alternatives among siblings, such as get_ad_performance vs get_detailed_asset_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_performanceARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds value by specifying return fields (field_type, primary_status, content), noting the inclusion of summaries, and disclosing that per-asset performance labels are unavailable for PMax assets. 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?
Description is concise with three well-structured paragraphs. Purpose and return fields are front-loaded. No unnecessary words or repetition. Efficient use of space.
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 (two optional params, output schema exists, read-only), the description is mostly complete. It covers purpose, return fields, limitations, and alternative tool. The only gap is the lack of explanation for the customer_id parameter, which is typical in Google Ads tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions in schema). Description only explains campaign_id as an optional filter to a single PMax campaign, but does not mention customer_id at all. Partial compensation for missing 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?
Description clearly states it gets per-asset details for PMax campaigns (specific verb+resource+scope). It explicitly differentiates from sibling get_detailed_asset_performance by noting the limitation on performance labels and pointing to the sibling for proxy quality 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?
Description specifies when to use (to retrieve asset details for PMax campaigns) and explicitly advises against using it for performance labels (BEST/GOOD/LOW), suggesting an alternative tool (get_detailed_asset_performance) for proxy quality assessment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_demographic_targetingARead-only
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 declare readOnlyHint=true and destructiveHint=false. Description adds details on returned fields (value, negative/positive, status, remove_id) and how remove_id can be used with remove_entity. No contradictions.
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 sentences, front-loaded with purpose, then constraints, then details. Every sentence adds value with no fluff.
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?
Output schema exists, and description explains return values and important behavioral note about default 'all segments'. Covers typical usage scenarios 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?
Schema description coverage is 0%, so description carries full burden. It explains the mutual exclusivity constraint for ad_group_id and campaign_id, which is not in schema. Customer_id is not explained but is standard. Adds meaning 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?
The description clearly states it lists demographic targeting criteria (age, gender, parental status, income) and explains the condition of using exactly one ID. It is specific and distinguishes from siblings like draft_demographic_targeting.
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 requires exactly one of ad_group_id or campaign_id, and provides key context that criteria only appear when actively excluded or narrowed. Lacks explicit when-not-to-use but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_detailed_asset_performanceARead-only
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 readOnlyHint=true. Description adds that the tool returns asset combinations with field types, providing behavioral context beyond annotations. No contradictions.
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 concise (about 5 sentences) with front-loaded purpose, then output details, use case, and parameter explanation. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with two optional params and output schema, description is nearly complete. Lacks explanation of customer_id, but overall covers purpose, output, and one filter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must explain parameters. It explains campaign_id as an optional filter but does not mention customer_id, leaving it undocumented. Thus, only partial semantic addition.
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?
Description clearly states the tool gets top-performing asset combinations for Performance Max campaigns, specifying headline + description + image combinations. This distinguishes it from siblings like 'get_asset_performance' (individual asset stats) and 'get_pmax_performance' (overall 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?
Description implies usage for creative optimization by showing which combinations Google selects most often. It provides context on what the data helps identify, but lacks explicit guidance on when not to use or alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_tagARead-only
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 note readOnlyHint=true and destructiveHint=false. The description adds significant behavioral detail: 'Includes every parameter, firing/blocking triggers (with their filter conditions resolved to text), priority, pause status, sampling, and monitoring metadata.' This goes well beyond the annotations and accurately describes the output scope.
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. The first sentence captures the core purpose, and the second lists key output components and a use case. Every word adds value, with no repetition or fluff. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a low schema coverage (0%) but an existing output schema (implied). The description explains the tool's purpose and output contents comprehensively for a read-only operation. However, it does not cover the optional parameters or their context, leaving a small gap in completeness.
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 three parameters (tag_id required, optional gtm_account_id and gtm_container_id) but zero schema description coverage. The description does not explain what these parameters represent or how to use them. It only mentions the tool's overall purpose, adding no semantic value to 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 'Get the full RAW configuration for a single GTM tag,' specifying the verb (get), resource (full RAW configuration), and target (single GTM tag). It distinguishes itself from sibling tools like list_gtm_tags (listing tags) and get_gtm_trigger (for triggers) by emphasizing 'full RAW configuration' including triggers, priority, 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 a specific use case: 'Use to inspect a tag flagged by audit_event_coverage.' It implies deep inspection, though it does not explicitly state when not to use it or mention alternatives like list_gtm_tags for a summary. The guidance is clear but lacks exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_triggerARead-only
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?
Annotations already declare readOnlyHint=true, so the safety profile is clear. The description adds valuable context by detailing what the raw configuration includes (filters, validation settings, list of tags using the trigger), which goes beyond the annotations and helps the agent understand the 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 two sentences long, front-loaded with the main action, and each sentence adds meaningful information. There is no redundancy or waste.
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 returns a full configuration, has an output schema, and has 3 parameters with 0% schema coverage, the description is partially complete. It explains the output content and use case but lacks parameter context and doesn't mention that the output schema exists. It is adequate but 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?
With 0% schema description coverage and 3 parameters, the description needs to compensate but only vaguely mentions 'a single GTM trigger' and 'specific trigger ID'. It does not explain the optional gtm_account_id and gtm_container_id parameters, their purpose, or default behavior. 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 gets the full RAW configuration for a single GTM trigger. It uses a specific verb ('Get') and resource ('full RAW configuration'), and it distinguishes itself from siblings like list_gtm_triggers (which lists all triggers) by focusing on a single trigger and including diagnostic 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 a clear use case: 'Use to diagnose why a tag with a specific trigger ID does or doesn't fire.' This gives context on when to use the tool, but it does not explicitly mention alternatives or when not to use it, so it's slightly less than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_merchant_feed_healthARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral detail: 'Product-status data lags reality by ~30 minutes' and mentions that critical account issues 'stop offers serving entirely,' providing context beyond 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 (under 80 words) and well-structured: a clear first sentence naming the tool, followed by a detailed second sentence explaining outputs, and a final sentence specifying the parameter. 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?
Given the tool has an output schema (not shown), the description sufficiently explains return values (counts per context, top product issues with links, account-level issues) and adds a critical timing caveat. It also references the source tool for the parameter, providing complete context for agent usage.
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 only specifies 'account_id' as a string with no description (0% coverage). The description adds: 'account_id: numeric Merchant Center ID from list_merchant_accounts,' clarifying the type, format, and source of the ID, which significantly enhances parameter understanding.
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: 'Merchant Center feed health — disapproved products + account issues.' It specifies what it surfaces (approved/pending/disapproved counts per context, top product issues with links, account-level issues) and distinguishes it from sibling tools by its unique focus on feed health.
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 context on when to use the tool, e.g., to diagnose feed issues that 'silently starve Shopping and Performance Max campaigns.' It implies usage for feed health diagnostics but does not explicitly exclude alternatives or provide when-not-to-use guidance.
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_keywordsARead-only
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?
Annotations already declare readOnlyHint=true, so the description adds no additional behavioral context beyond stating it lists keywords. It does not disclose any side effects, authentication needs, or rate limits, which are already covered by 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: first states purpose, second explains the key parameter. No unnecessary words, well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations covering read-only behavior, the description provides essential context. However, it omits details on pagination, filtering, or order of results, which would be helpful for a list tool but are not critical.
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 partially compensates by explaining shared_set_id as 'numeric ID from get_negative_keyword_lists (shared_set.id).' However, customer_id is left unexplained, leaving a 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 'List the keywords inside a shared negative keyword list,' which is a specific verb and resource. It distinguishes from sibling tools like 'get_negative_keyword_lists' (which lists lists) and 'add_to_negative_keyword_list' (which adds 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?
The description implies a prerequisite (shared_set_id from get_negative_keyword_lists) but does not explicitly state when to use this tool versus alternatives or provide exclusions. For a simple retrieval tool, this is minimally adequate but lacks clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keyword_listsARead-only
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 already declare readOnlyHint=true and destructiveHint=false, indicating no side effects. The description adds detail on returned fields but does not cover pagination, authorization, or other behavioral traits. It adds moderate value 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 three sentences, each serving a clear purpose: stating the action, listing return values, and providing usage guidance. It is concise and front-loaded with the most important 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 read tool with annotations and an output schema (not shown), the description covers the main action and return values. However, the lack of parameter documentation and limited sibling differentiation (only one sibling mentioned) leaves minor gaps. Overall, quite 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 0% description coverage for the sole parameter (customer_id), and the description does not mention the parameter at all. The agent has no guidance on its purpose or format, which 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 lists shared negative keyword lists (SharedSets) and specifies the returned fields (ID, name, status, keyword count). It distinguishes itself from the sibling tool propose_negative_keyword_list by advising to call this first to avoid duplicates.
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 always call this tool before propose_negative_keyword_list to avoid creating duplicate lists, providing a clear usage context. It does not cover when to avoid or alternative tools, but the given guidance is strong for a key workflow step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_negative_keywordsARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds the campaign_id behavior (empty returns all campaigns). However, it does not disclose other traits like pagination or rate limits.
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 three sentences, each adding value: purpose, usage context, and parameter behavior. No unnecessary words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main functionality and usage, but omits explanation of the customer_id parameter. With an output schema present, return values are not needed, but parameter documentation is 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?
The description only explains the campaign_id parameter's behavior (empty returns all campaigns). The customer_id parameter is completely undocumented, and schema coverage is 0%, so the description does not compensate sufficiently.
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 existing negative keywords for a campaign or all campaigns, with a specific verb (list) and resource (negative keywords). It also provides usage context ('before adding') and distinguishes from sibling 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?
The description explicitly advises using this tool before adding negative keywords to check for duplicates, and explains behavior when campaign_id is empty. It lacks explicit exclusions but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds that it returns status and actionable guidance, which is helpful.
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 sentences, front-loaded with 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?
For a zero-parameter diagnostic tool with output schema, the description fully covers its operation and 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?
No parameters. The description adds value by explaining what it checks and the type of output (status per service, actionable 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 it tests AdLoop connectivity for OAuth, GA4 API, and Google Ads API. It stands out from siblings as a diagnostic tool.
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 advises to run this first when other tools are failing, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
landing_page_analysisBRead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds context about combining ad final URLs with GA4 data and identifying specific issues (orphaned URLs), which goes beyond annotations. However, does not discuss data freshness, rate limits, or other behavioral traits. Adequate but not exceptional.
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 sentences, front-loaded with core purpose. Efficiently conveys key details with minimal waste. Could be slightly more structured but overall concise.
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?
With output schema present, return values are covered. Description explains data sources and identification of key issues (zero conversions, orphaned URLs). For a read-only analysis tool, this is fairly complete, though more explicit prerequisites (e.g., required IDs) would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no descriptions in input schema). Description explains date format and default behavior but does not clarify customer_id or property_id fields. Only partial compensation for missing 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?
Description clearly states the verb 'analyze' and specific resource 'landing pages', with concrete outcomes like identifying converting vs non-converting pages, zero conversions, and orphaned URLs. Distinct from sibling tools like analyze_campaign_conversions or get_ad_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?
No explicit guidance on when to use this tool vs alternatives like analyze_campaign_conversions or get_ad_performance. The description implies use for landing page analysis with paid traffic, but lacks when-not-to-use or alternative suggestions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsARead-only
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?
Annotations already declare read-only and non-destructive. The description adds behavioral details about the default cap of 200 and truncation handling, which goes beyond 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, with each sentence adding value. It is front-loaded with the primary function and structured logically from purpose to behavioral details to usage guidance.
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 (one optional parameter, output schema exists), the description covers return values (names, IDs, status) and truncation behavior. No gaps for effective agent 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 single parameter 'limit' has no schema description (0% coverage). The description compensates by explaining the default cap and how to adjust the limit when results are truncated, adding meaningful 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 lists accessible Google Ads accounts and returns names, IDs, and status. It explicitly differentiates from sibling tools like get_campaign_performance by advising not to enumerate for specific account targets.
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 (listing accounts) and when not to (targeting a specific account, instead use other tools). Also instructs on handling truncation with a higher limit, offering a concrete example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gsc_sitesARead-only
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 mark it as read-only and non-destructive. The description adds that it returns site URL and permission level, providing behavioral context beyond 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 two concise sentences: first states purpose, second adds usage and output summary. No wasted words, well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, full annotations, and an output schema, the description covers purpose, usage context, and output details. Nothing missing for this simple 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?
There are no parameters, so the baseline is 4. The description doesn't need to add parameter info, and it correctly implies the tool requires no input.
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 'List all Google Search Console properties the authenticated user can access' with a specific verb and resource. It also distinguishes its role as a discovery step before running reports, differentiating it from siblings like run_gsc_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 explicitly advises to use this first to discover site URLs before running search analytics reports, giving clear when-to-use guidance. It doesn't list alternatives or exclusions, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_containersARead-only
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?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds value by explicitly listing the return fields (container_id, public_id, name, usage context) and their relevance, going beyond the annotations. However, it does not mention pagination or limits, if any exist.
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 very concise with two sentences, no wasted words, and front-loads the core action. The second sentence efficiently lists key return fields.
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 simple one-parameter tool with a read-only annotation and an output schema, the description is mostly complete. It lists return fields and hints at usage (for audit_event_coverage). Missing a brief explanation of the parameter, but overall 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%, so the description must explain the parameter, but it does not mention gtm_account_id at all. It fails to explain what the parameter is, how to obtain it, or its relation to sibling tools like list_gtm_accounts.
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 'List all containers under a GTM account', specifying the exact resource and action. It distinguishes itself from sibling tools by listing return fields and explicitly mentioning that container_id is needed by audit_event_coverage, which differentiates it 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?
The description implicitly suggests use via mentioning container_id for audit_event_coverage, but explicitly does not state when to use this tool versus alternatives like list_gtm_accounts or list_gtm_tags. No usage exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_tagsARead-only
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?
Annotations already indicate readOnlyHint=true and destructiveHint=false, ensuring safe read operations. The description adds value by specifying that the tool lists tags from the LIVE container (not draft/workspace) and enumerates the included fields (type, status, parsed parameters, etc.), which provides useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long. The first sentence states the primary purpose, and the second adds detail on what each tag includes and a usage hint. Every word earns its place; no redundancy or fluff.
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 (listing tags) and the presence of an output schema (which covers return values), the description sufficiently explains the tool's function and context. It addresses the scope (LIVE container) and provides relevant detail without needing further elaboration.
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 two optional parameters (gtm_account_id, gtm_container_id) with defaults, but schema description coverage is 0%. The description does not explain these parameters, their defaults, or how to find the IDs. Despite the names being somewhat self-explanatory, the lack of guidance leaves ambiguity, especially since the parameters are optional.
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 'List every tag in the LIVE GTM container' with a specific verb and resource. It details the information included per tag, distinguishing it from sibling tools like get_gtm_tag (single tag) and list_gtm_triggers (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?
The description provides a usage hint: 'Use after audit_event_coverage to inspect specific tags.' This gives context but does not explicitly mention alternative tools or when not to use it. The guidance 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_triggersARead-only
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?
Annotations already indicate read-only and non-destructive behavior. The description adds that it reads the LIVE container and parses filter conditions to readable text, offering context beyond 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 only two sentences, front-loaded with the core purpose, and every sentence adds value without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the output schema handles return values and annotations cover safety, the description omits parameter requirements, making it incomplete for a tool with two inputs and 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description fails to mention the required parameters (gtm_account_id, gtm_container_id) or their usage, leaving a significant gap for parameter understanding.
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 every trigger in the LIVE GTM container, distinguishing it from sibling tools like get_gtm_trigger (single trigger) and 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?
The description explicitly says to use it to diagnose tag firing issues on specific pages, providing a clear use case, though it does not explicitly exclude other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_variablesARead-only
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 declare readOnlyHint=true and destructiveHint=false, so the tool is safe and non-destructive. The description adds behavioral context by detailing data sources (live container vs workspace) and explaining why variables matter for triggers. It does not contradict 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 four sentences long, each serving a purpose: stating the action, explaining sources, and providing motivation. There is no fluff, and it is front-loaded with the main 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 presence of an output schema, the description does not need to cover return values. However, it lacks parameter explanation and usage examples. The explanation of variable sources is good, but the overall completeness is adequate but not excellent.
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 two parameters (gtm_account_id, gtm_container_id) with 0% schema description coverage. The description does not mention these parameters or explain their purpose/format. Without this, the agent must infer from context, which adds ambiguity.
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 between custom and enabled built-in variables. It explains the sources (live container for custom, workspace's enabled-built-ins list for built-in). This definitively sets it apart from sibling tools like list_gtm_tags or list_gtm_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?
The description implies when to use the tool (to list variables for trigger reference) but does not explicitly state when not to use it or provide alternatives. Siblings exist such as get_gtm_trigger or list_gtm_tags, but no guidance is given on selecting between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gtm_versionsARead-only
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?
Annotations already indicate read-only and non-destructive behavior. The description adds that it lists only published versions, returns headers with specific fields (version_id, name, entity counts), and implies timestamp information exists for correlation. 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?
The description is two sentences, with the purpose stated directly in the first sentence and usage guidance in the second. No verbose or redundant language, excellent front-loading.
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 3 optional parameters and an output schema. Description explains return structure (headers) and suggests a workflow, but does not clarify how parameters affect results (e.g., filtering by account/container, pagination with page_size). Missing parameter explanations reduce completeness.
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 parameters (page_size, gtm_account_id, gtm_container_id). Default values are present in schema but no guidance on their role or filtering behavior. The description fails to add necessary meaning beyond parameter names.
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 published GTM version history, sorted newest first. It distinguishes from siblings like get_gtm_version which retrieves full version 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 a concrete use case: correlating a metric drop with a recent publish by fetching versions and then calling get_gtm_version for details. This explicitly guides 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_merchant_accountsARead-only
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 already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds value by explaining that the tool discovers merchant IDs and distinguishes account types, which is useful behavioral context 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?
Two sentences: the first states the core purpose, the second provides a usage hint and a distinguishing feature. No wasted words; every sentence earns its place.
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, output schema exists), the description is complete. It informs the agent that the output contains merchant IDs and account types, which is sufficient for invoking 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 input schema has no parameters (0), and schema description coverage is 100%. Baseline is 4, and the description does not need to add parameter information. It appropriately focuses on usage and output.
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') and resource ('Google Merchant Center accounts the connected user can access'), and adds specificity by mentioning it distinguishes standalone from MCA accounts. This differentiates it from sibling tools like list_accounts or list_gsc_sites.
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 advises to 'Call first to discover merchant IDs for get_merchant_feed_health,' providing clear context for when to use the tool. While it does not mention when not to use it, the straightforward nature of a list tool with no parameters makes this acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_entityA
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?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description reveals that the tool returns a PREVIEW, not a final action, and requires a separate call to confirm_and_apply to execute. It also specifies the entity_id format per type, which is crucial for correct usage. This adds significant behavioral 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?
The description is concise, well-structured, and front-loaded. It starts with the core action, then explains parameters with examples, and ends with the execution step. Every sentence is valuable and efficiently communicates the needed 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?
Given the tool's complexity (3 parameters, clear entity relationships, output schema exists), the description covers the essential aspects: what it does, how to specify entities, and the follow-up required. It could mention error cases or constraints, but for the scope, it is adequately 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?
With 0% schema description coverage, the description compensates by explaining entity_type and entity_id thoroughly, including format examples for each type. The customer_id parameter is not explained, but it is optional with a default. The description adds meaningful guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it drafts pausing a specific entity (campaign, ad group, ad, or keyword) and returns a preview. It uses specific verbs and resources, distinguishing from sibling tools like enable_entity or remove_entity. The format for entity_id per type is given, 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 explains the two-step process: draft then call confirm_and_apply. It implicitly tells when to use this tool (to pause entities) and provides the follow-up action. However, it does not explicitly state when not to use it or list alternatives beyond the sibling list, which is provided contextually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_entityADestructive
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?
Annotations already indicate destructiveHint=true. Description adds that it is a draft action (preview), not directly executed, and requires confirmation. It also details entity_id formats for different types, providing additional behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: action, entity types/ids, warning, next steps. Could be slightly more concise but is effective.
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 existence of output schema, description adequately states return type (preview with plan_id) and mentions required next step. Also covers warnings and id formats. No 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?
Schema coverage is 0%. Description compensates well by listing all valid entity_type values and providing detailed entity_id formats for each type. However, it does not explain the optional customer_id 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?
Description clearly states it drafts removal of an entity and returns a preview. It explicitly lists supported entity types and distinguishes from pause_entity by noting irreversibility.
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 advises using pause_entity for temporary disabling instead of this irreversible removal. Also instructs to call confirm_and_apply with the returned plan_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ga4_reportARead-only
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 indicate read-only and non-destructive behavior. The description adds that the report is custom and explains default property_id usage, providing useful behavioral context beyond 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 with two sentences and bullet-like lists for dimensions, metrics, and date formats. It is front-loaded with the main action. Could be slightly more organized but is not verbose.
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 optional parameters and output schema present, the description provides sufficient context to use the tool. It lists common inputs but lacks details on output structure, though the output schema covers that.
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 offers common dimensions/metrics and date formats but does not explain each parameter's role (e.g., limit, or that all parameters are optional). The added value is moderate.
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 runs a custom GA4 report with specified dimensions, metrics, and date range. It lists common dimensions and metrics, establishing it as specific to GA4 reporting, which distinguishes it from siblings like run_realtime_report or run_gaql.
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 date formats and default property_id behavior, implying usage context. However, it does not explicitly state when not to use this tool or compare with siblings like run_realtime_report for real-time needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gsc_reportARead-only
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?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds no further behavioral context such as rate limits or quota; it primarily explains parameters. 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?
Description is well-structured with the main purpose first, followed by parameter details in a readable format. Slightly verbose but no unnecessary repetition; could be tightened into a list but overall effective.
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 (7 parameters, optional output schema), the description is complete. It covers all parameters, mentions return metrics, and fits within the sibling tool context. No obvious 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?
Schema has 0% coverage, so description fully compensates by explaining all 7 parameters: site_url with example, dimensions with allowed values, date formats, search_type options, dimension_filter_groups with example JSON, and limit with default/max. Very thorough.
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?
Description clearly states it runs a Google Search Console search analytics report, listing specific metrics. It distinguishes itself from sibling reporting tools like run_ga4_report and run_gaql by explicitly mentioning GSC and cross-referencing capabilities.
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 specific use cases: diagnosing organic traffic drops, finding keyword opportunities, and cross-referencing with GA4 and Ads data. Does not explicitly state when not to use, but the use cases guide appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_groupC
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 'draft' to imply that changes are not immediately applied, adding behavioral context beyond annotations (readOnlyHint=false, destructiveHint=false). However, it does not explicitly state that confirmation is required, nor does it detail side effects like whether existing values are overwritten or merged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundancy. It is front-loaded with the verb and resource. However, it could be slightly more informative without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that drafts an update with multiple optional parameters and requires confirmation via a sibling tool, the description lacks critical context about the draft lifecycle, the meaning of default values, and the output (likely a draft handle). It is insufficiently complete for effective agent 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?
With 0% schema description coverage, the description must explain all parameters, but it only addresses ad_group_name and max_cpc via 'name and/or manual CPC bid'. It omits ad_group_id (required but not explained) and customer_id (default empty, purpose unclear). This leaves significant 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 verb 'draft' and the resource 'ad group update', and specifies the aspects that can be updated (name and/or manual CPC bid). It is distinguishable from sibling tools like 'draft_ad_group' (which creates a new ad group) and 'update_campaign' (which updates campaigns), though it does not explicitly differentiate them.
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 on when to use this tool vs alternatives such as 'draft_ad_group' or 'update_campaign'. The description does not mention that this is a non-finalizing draft requiring confirmation via 'confirm_and_apply', nor does it explain prerequisites or contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignA
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?
Discloses that the tool only produces a preview and does not apply changes, aligning with annotations (readOnlyHint=false, destructiveHint=false). Also explains that certain parameters (like geo_target_ids) replace all existing targets, providing deep behavioral insight.
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 front-loaded with the crucial preview behavior, then systematically covers each parameter. While slightly lengthy due to parameter explanations, every sentence adds value and no extraneous content exists.
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, the description explains the return value (plan_id) and how to use it with confirm_and_apply. It also covers parameter interdependencies and replacement semantics, making the tool's behavior fully understandable.
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 fully compensates by explaining every parameter: campaign_id required, bidding_strategy enum options, conditional target_cpa and target_roas, daily_budget, geo_target_ids with common IDs, language_ids with common IDs, booleans for network settings, and max_cpc conditional. It even clarifies that display_expansion_enabled is an alias.
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 an update to a campaign and returns a preview without applying it, with a specific verb and resource. It distinguishes the tool from the sibling 'confirm_and_apply' that executes the update.
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 (only include changed parameters) and directs the user to call 'confirm_and_apply' with the returned plan_id to execute. It also explains conditional parameter requirements (e.g., target_cpa needed if bidding_strategy is TARGET_CPA).
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. Dates show when Glama detected each change.
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
Most tools have distinct purposes, but the high number of negative keyword and shared set tools (add_negative_keywords, add_to_negative_keyword_list, propose_negative_keyword_list, etc.) may cause confusion. Descriptions help clarify, but the overlap reduces clarity slightly.
Naming is largely consistent with verb_noun pattern (e.g., get_campaign_performance, draft_campaign). Minor inconsistencies like 'health_check' and 'confirm_and_apply' deviate from the pattern, and the use of similar verbs like analyze/audit/validate is slightly confusing.
67 tools is excessive for a single server. While the domain is broad, many tools could be consolidated (e.g., multiple negative keyword tools). The high count makes it difficult for an agent to efficiently navigate and select the right tool.
The tool set covers the full lifecycle of Google Ads management plus deep integrations with GA4, GTM, GSC, Merchant Center, and PageSpeed. No critical gaps are evident; it handles creation, modification, analysis, and auditing comprehensively.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kLOsk/adloop'
If you have feedback or need assistance with the MCP directory API, please join our Discord server