google-ads-agent
Provides tools for managing Google Ads campaigns, including building search campaigns, analyzing performance across campaigns, ad groups, and ads, and performing actions such as pausing keywords, adjusting budgets, and deleting campaigns with granular permission controls.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@google-ads-agentShow me my campaign performance over the last 30 days."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
google-ads-agent
An MCP server and autonomous agent for Google Ads: build search campaigns, analyse what they're doing, and — optionally — let it make spend-reducing changes on a schedule without a human in the loop.
28 tools. 20 are read-only. One is irreversible and can only be triggered by a person. One reaches every mutable resource in the API and is governed by a permission table rather than by hand-written logic.
The distinguishing idea is that the safety boundary is a policy engine inside the server, not instructions in a prompt. Whatever drives the tools — a cron job, an LLM, you typing — hits the same enforcement point, so the driver is a swappable detail rather than a security control.
⚠️ Disclaimer — read before using
This software modifies live advertising accounts. It can cause money to be spent, cause campaigns to stop serving, and permanently delete campaigns. You use it entirely at your own risk.
Provided "as is", without warranty of any kind. See LICENSE. The authors and contributors accept no liability for any advertising spend, lost revenue, lost data, account suspension, or other damages arising from use or misuse of this software, however caused.
You are solely responsible for everything this software does in your accounts, including in autonomous mode, where it acts without human review of individual changes.
You are responsible for your own compliance with the Google Ads API Terms of Service, the obligations attached to your developer token, and any applicable advertising, privacy, and data-protection law.
Test on a Google Ads test account first. Verify the behaviour you expect before pointing it at an account that spends money.
Campaign removal cannot be undone. Google Ads has no un-remove.
Nothing here is legal, financial, or professional advertising advice.
Not affiliated with Google. This is an independent, unofficial project. It is not created, endorsed, sponsored by, or affiliated with Google LLC. "Google", "Google Ads", and related marks are trademarks of Google LLC, used here only to identify the API this software targets.
Related MCP server: Google Ads MCP Server
Table of contents
What it does
Build. Resolve locations and languages to targeting IDs, get keyword ideas, assemble a campaign spec, validate it against the live API without writing anything, then commit it as a single atomic mutation. Campaigns are always created paused.
Analyse. Performance by campaign, ad group, or ad, segmented by network, device, or date. Per-keyword metrics with quality score. The real search queries that triggered your ads. A structural audit that needs no performance data at all. Raw GAQL when none of that fits.
Act. Turn Display expansion and search partners off, add negative keywords, pause keywords and ad groups — each gated on evidence the server measures itself, with a change budget, per-entity cooldowns, a circuit breaker, and a full audit journal that supports one-command reversal.
Delete. Remove a campaign, behind three simultaneous gates, reachable only by a human.
The safety model
Actions are tiered by spend direction, which is a mechanical property rather than a judgement call:
Tier | Actions | Rule |
autonomous |
| Can only narrow delivery. Worst case: serves too little |
propose | budgets, bids, new campaigns, RSA edits | Can increase spend, so it gets written up for a human instead of executed |
forbidden | enabling/unpausing, removing, raising budgets | No autonomous path and no proposal path |
Unknown actions fail closed to forbidden.
Six properties make that boundary real rather than decorative:
The server measures the evidence; it never accepts it from the caller. An agent that supplies its own justification can fabricate it.
add_negative_keywordsqueries the search-term data itself;set_networksqueries the network split itself.Evidence thresholds. The failure mode of automated ad management is acting on noise. A keyword with 4 clicks and no conversions is not evidence of a bad keyword. Volume floors are enforced per action type.
Conversions protect an entity, but not at any price. A
max_conversions: 0rule alone lets a single token conversion shield unlimited waste, somax_cost_per_conversionoverrides that protection.Pause, never remove. Every autonomous action stores its inverse in the journal, so
revert_last_runcan undo an entire run.Change budget and cooldowns. Caps per run and per week, plus a per-entity cooldown, because frequent changes actively degrade Smart Bidding — it needs stability to relearn.
Circuit breaker. Halts on a spend spike relative to daily budget, or inside a bidding learning period. The learning-period input comes from
change_event, counting only changes made outside the API — so the agent backs off when a person has been editing, without tripping over its own changes. If that history is unavailable the check fails open, andcheck_setupreports the gap.
The trust switch
conversion_tracking_ok defaults to false, and while it is false no
autonomous action is permitted at all.
Every autonomous decision keys off conversions. An agent running against under-firing conversion tracking does not fail loudly — it quietly pauses your best-performing keywords for lacking conversions that were never recorded.
Run conversion_actions to check. It flags the failure signatures that
matter: a primary action recording nothing, lookback windows too short to catch
your sales cycle, lead goals counting many-per-click, and conversion-based
bidding running on too little volume to model anything. If it reports nothing
HIGH, set the switch deliberately.
Full API coverage and the permission table
The tools above cover campaign construction and the four spend-reducing changes.
Everything else the Google Ads API can write is reached through one tool,
mutate, which takes a resource, an operation, and a JSON object of fields.
There are 64 mutable resources in v25, and hand-writing a tool per resource
would be unmaintainable and would swamp the tool list, so the generic path
exists instead.
That path is governed by a permission table rather than by code that understands each resource. A resource, operation or field with no rule in the table is refused. Absence means denial, which is why new API surface never becomes writable by accident: Google adding a resource does not add a rule.
Four tiers, in descending order of trust:
Tier | Meaning |
| Runs unattended, once the server has measured the evidence. Refused if it names an evidence rule the server cannot measure for that resource. |
| Runs when a human approves the exact diff in-session. Unreachable in an unattended run. |
| Never executed. Written up for a person to do. |
| Refused always, however it is confirmed. |
confirm is what makes full coverage possible without making scheduled runs
dangerous. Evidence thresholds, change budgets and circuit breakers substitute
for human judgement, so a present human approving one specific diff supplies it
directly and those checks do not apply. The tier still does, and
agent/run.sh exports ADS_AGENT_UNATTENDED=1 so a scheduled run cannot
self-approve.
Rules are specific about direction and value, because the same field is not one permission. Lowering a budget and raising it are separate grants. Setting a campaign's status to PAUSED and to ENABLED are separate grants. The most specific matching rule wins, and in a call touching several fields the strictest tier present governs the whole call.
Every update reads the current values before writing, which is not optional: it supplies the direction of a numeric change and the undo recorded in the journal. An update whose before-state cannot be read is refused rather than performed blind.
Managing permissions
ads-agent-policy edits the table through validation, and writes only the rules
that differ from the shipped seed, so git diff shows exactly what you chose to
allow.
ads-agent-policy list # what is granted now
ads-agent-policy resources # all 64 mutable resources, marked
ads-agent-policy fields campaign_budget # every field, with its rules
ads-agent-policy show campaign update --field status --value ENABLED
ads-agent-policy grant campaign_budget update --field amount_micros \
--direction increase --tier confirm --note "approved 7 Sep"
ads-agent-policy simulate campaign_budget update --field amount_micros \
--value 40000000 --current 28000000
ads-agent-policy revoke campaign_budget update --field amount_micros \
--direction increase
ads-agent-policy diff # your rules versus the seedgrant refuses to set autonomous without an --evidence rule, because an
unattended write with no volume threshold acts on noise.
The table lives at ~/.ads-agent/capabilities.yaml. The shipped seed grants
nothing autonomously, puts pausing and budget decreases at confirm, and names
the dangerous operations as forbidden so the table documents them rather than
staying silent about them.
Requirements
Python 3.11+
A Google Ads manager account. Developer tokens are issued only to manager accounts — the Admin → API Center menu does not exist on a regular account.
A developer token. Test access is immediate; Basic access is an application and is required for the Keyword Planner tools. See access tiers.
An OAuth client of type Desktop app, in a Google Cloud project with the Google Ads API enabled.
For autonomous mode only: the Claude Code CLI on
PATH. The MCP server itself works with any MCP client.For the bundled scheduler only: macOS (launchd). On Linux use cron with
agent/run.sh.
Install
git clone https://github.com/<your-account>/google-ads-agent.git
cd google-ads-agent
python3 -m venv .venv
./.venv/bin/python -m pip install -e ".[dev]"
./.venv/bin/python -m pytest -q # 90 tests, no credentials neededThe test suite is fully offline: it builds an API client with anonymous credentials and sends no requests, so it passes before you have any credentials.
Configure credentials
1. Developer token
Sign in to your manager account → Admin → API Center. Copy the token. Apply for Basic access from the same page if you need the Keyword Planner tools.
2. OAuth client
Google Cloud Console → enable the Google Ads API → Credentials → Create credentials → OAuth client ID → application type Desktop app.
Desktop app matters: it permits the loopback redirect the token script uses, so you don't have to register a redirect URI. A Web application client will reject the flow.
3. Refresh token
./.venv/bin/python scripts/get_refresh_token.py \
--client-id YOUR_ID.apps.googleusercontent.com \
--client-secret YOUR_SECRET \
--developer-token YOUR_DEV_TOKEN \
--login-customer-id 1234567890 \
--write--write produces ~/google-ads.yaml at mode 600. Without it the token is
only printed. Sign in with an account that can reach the manager account.
--login-customer-id is the manager account's ID, digits only. It selects
the hierarchy you act through, not the account you write to — that is a separate
per-call argument.
If no refresh token comes back, the Google account has already granted this client. Revoke it at myaccount.google.com/permissions and retry; Google returns a refresh token only on first consent.
Set GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_CLIENT_ID,
GOOGLE_ADS_CLIENT_SECRET, GOOGLE_ADS_REFRESH_TOKEN, and optionally
GOOGLE_ADS_LOGIN_CUSTOMER_ID. A config file takes precedence if it exists.
Point GOOGLE_ADS_CONFIGURATION_FILE_PATH elsewhere to move it.
Use it interactively
Register the MCP server with your client. For Claude Code:
claude mcp add -s user google-ads -- \
"$PWD/.venv/bin/python" "$PWD/run_server.py"-s user matters: without it the server registers against the directory you ran
the command in and is invisible everywhere else.
Verify with claude mcp list. Note that "connected" only means the process
starts and speaks MCP — the API client is built lazily, so credential problems
surface on the first tool call, not at startup.
Then ask for what you want:
List my Google Ads accounts.
Search campaign for project management software, 30/day, targeting Spain and the United States, pointing at https://example.com/signup. Preview it first.
Audit campaign 1234567890 and show me last 30 days broken down by network.
Always look at the network split before drawing conclusions from a search
campaign's totals. Display expansion and search-partner spend are folded into
the campaign number, so a campaign that appears to be buying search traffic can
be spending most of its budget elsewhere. performance with segment="network"
is the tool for that.
Run it autonomously
1. Write your policy
mkdir -p ~/.ads-agent
cp policy.yaml.example ~/.ads-agent/policy.yamlEdit it. This file is the agent's mandate and the whole reason it can be trusted
to act unattended, so keep it in version control and review changes to it the
way you would review a permission grant. Anything omitted falls back to the
defaults in ads_agent/policy.py.
The shipped example is deliberately inert: conversion_tracking_ok is false,
so nothing autonomous will run until you verify your conversion tracking and
change it.
2. Run once by hand
./agent/run.shRead the report it writes to ~/.ads-agent/reports/. Do this before scheduling
anything.
3. Schedule it
./agent/install-schedule.sh # daily at 07:15
./agent/install-schedule.sh 6 30 # daily at 06:30
./agent/install-schedule.sh --uninstallPaths are derived from wherever the repo actually lives; nothing is hardcoded. Re-run it after moving the repo.
On Linux, add agent/run.sh to cron instead:
15 7 * * * /path/to/google-ads-agent/agent/run.shWhat a run produces
Path | Contents |
| One dated Markdown report per run: actions taken, proposals, blocked attempts, data-quality notes |
| Full transcript per run |
| Append-only audit trail. Also the input to change-budget and cooldown enforcement |
agent/prompt.md is the standing instruction set — edit it to change what the
agent looks at and how it reports.
create_campaign and remove_campaign are deliberately absent from
run.sh's allowed tools. Both are human-gated, so an unattended run must not be
able to reach them.
Undoing a run
revert_last_run for account 1234567890It replays the inverse operations stored in the journal: re-enabling what was paused and removing negatives the agent itself added. Campaign removals are recorded with an explicitly empty inverse, so they report as unrevertible rather than appearing to be undone.
Tool reference
Build
Tool | Writes | Purpose |
| Accessible accounts with currency, time zone, manager/test flags | |
| Location name → numeric geo target ID | |
| Lint locally, then | |
| ✓ | Commit a previewed spec atomically, always paused |
| Account inventory | |
| Full read-back: settings, targeting, ad groups, keywords, RSA assets, ad strength |
create_campaign requires a confirm_token that only a successful
preview_campaign in the same process can mint. Campaign status is hardcoded to
PAUSED with no parameter to override it, and the whole campaign goes in one
mutation with partial_failure off — there is no path to a half-built campaign
that sits invisible until it spends.
Analyse
Tool | Purpose |
| Metrics by campaign, ad group, or ad. |
| Per-keyword metrics with quality score, sorted by cost. |
| The real queries that triggered ads, with added/excluded status. |
| Structural review — targeting gaps, Display expansion left on, thin RSAs, poor ad strength, all-broad-match ad groups, keywords duplicated across ad groups, budget-to-bid mismatch. Uses no performance data, so it works on test accounts and brand-new campaigns |
| Every conversion action with status, goal role, counting type, lookback window, and how many conversions it actually recorded. Diagnoses whether a low conversion count is a weak funnel or a broken tag |
| Who changed what, when, and from which client (web UI, Editor, API, scripts), with the fields that changed. Google retains 30 days |
| Credentials, API version, and which API methods your token's access level permits. Run this first when something is refused |
| Arbitrary read-only GAQL. Only |
check_setup probes each method with a real call — the one write probe uses
validate_only and writes nothing. It is the fastest way to find out whether you
are on Test, Explorer, or Basic access.
conversion_actions judges bidding inclusion from primary_for_goal, not the
legacy include_in_conversions_metric field. Goal-based accounts ignore the
legacy flag: verified on a live account where an action with
include_in_conversions_metric=false still counted toward metrics.conversions.
Keyword Planner
All four KeywordPlanIdeaService methods. All require Basic access.
Tool | Purpose |
| Expand seed terms and/or a URL into ideas with volume, competition, and bid range |
| Volumes for a keyword list you already have. Reports on exactly what you pass; does not expand |
| Projected clicks, cost, CPC, conversions, and CPA at a given budget and bid. Run before |
| Distribute keywords across ad groups that already exist |
assign_ad_groups assigns and refines; it does not invent themes. Google's
generate_ad_group_themes takes resource names of existing ad groups, so to
split one oversized ad group you must create the themed ad groups first, then
run this to distribute keywords into them.
Act
Tool | Purpose |
| What is autonomous, propose-only, or forbidden; the evidence thresholds; remaining change budget; whether the trust switch is on |
| Turn Display expansion and/or search partners off. A request to enable one is refused |
| Campaign-level negatives, per-term evidence measured server-side |
| Pause keywords spending without converting |
| Same for whole ad groups, at higher thresholds |
| Undo a run from the journal's stored inverses |
All of these accept dry_run: true, which validates against the live API and
journals the intent without writing. Dry-run entries do not consume change
budget.
Remove
Tool | Purpose |
| Permanently remove a campaign. Irreversible |
Three gates, all required together:
A
confirm_tokenminted only by the tool's own preview, salted per process and bound to the specific account, campaign ID, and name.acknowledge_irreversible: true.The campaign must already be
PAUSED(require_pause_before_removal), which makes removal two deliberate steps separated in time rather than one destructive one.
Called with no token it previews: name, status, budget, how many ad groups, keywords, and ads go with it, and recent spend and conversions. Historical stats remain queryable after removal, so reporting data is not lost — but the campaign can never be re-enabled.
Configuration reference
Environment variables
Variable | Default | Purpose |
|
| Credentials file |
|
| Policy file |
|
| Audit journal |
|
| State directory used by |
|
| Refuse to create a campaign above this daily budget |
| unset | Comma-separated allowlist. Unset means any accessible account |
Policy file
See policy.yaml.example, which documents every key. The
main sections:
actions— the tier for each actionevidence— volume floors, conversion caps, and CPA ceilings per actionchange_budget— per-run and per-week caps, per-entity cooldowncircuit_breaker— spend-spike multiple, learning-period lengthconversion_tracking_ok/require_conversion_tracking— the trust switchrequire_pause_before_removal— gate on campaign removal
Developer token access tiers
Access level gates methods, not just which accounts you can reach. Verified behaviour on Explorer access:
Works on Explorer | Requires Basic |
All GAQL reporting ( | Every Keyword Planner tool |
| |
|
Explorer access reaches production data, so reporting working against your
real account is not evidence that Basic access was approved. The Keyword
Planner tools return authorization_error.DEVELOPER_TOKEN_NOT_APPROVED — "not
allowed for use with explorer access" — until Basic is granted. Check the level
in your manager account's API Center rather than inferring it from a successful
query.
Test accounts, which a Test-access token is limited to, must live under a separate test manager account, not your production manager account.
Limitations
Search campaigns only. No Performance Max, Display, Video, Shopping, or Demand Gen. Performance Max in particular uses asset groups rather than ad groups, so it is a separate build rather than a flag.
No enabling or unpausing, ever. Forbidden outright, not gated. Bringing a campaign live is a human action in the Google Ads UI.
No budget or bid changes. Propose-only: the agent writes up the case and the numbers, you decide.
Auction insights is not available. The Google Ads API does not expose it in any version.
Committed writes are lightly exercised. The mutation path validates cleanly against the live API, but has seen limited real-world use. Start on a test account and use
dry_run: true.The bundled scheduler is macOS-only. Use cron elsewhere.
Autonomous mode requires the Claude Code CLI. The MCP server itself is client-agnostic.
Development
./.venv/bin/python -m pytest -q90 offline tests: campaign spec linting, temp-ID wiring, the always-paused invariant, bidding-strategy oneofs, RSA assembly, GAQL query building, the read-only guard, every audit rule, and the whole policy engine — tiering, fail-closed behaviour, evidence floors, the CPA override, change budget, cooldowns, circuit breaker, and journal accounting.
Layout
ads_agent/
client.py lazy API client, readable error formatting
spec.py campaign spec, local lint, confirm tokens
build.py spec → atomic mutate operations
report.py GAQL query building, table formatting, audit rules
policy.py the policy engine
journal.py append-only audit log
server.py MCP tool definitions
agent/
prompt.md standing instructions for autonomous runs
run.sh one scheduled run
install-schedule.sh generates and installs the launchd job
scripts/
get_refresh_token.py OAuth desktop flowNotes for contributors
Never build an update mask with
google.api_core.protobuf_helpers.field_mask(). It diffs by value, so setting a boolean toFalseproduces a mask that omits the field and the API silently ignores the change. Every spend-reducing network change sets a boolean toFalse, so that helper turnsset_networksinto a no-op that reports success. Use explicit mask paths.Verify field names against the installed library, not from memory. The API drifts; for example v25 uses
campaign.start_date_timein"yyyy-MM-dd HH:mm:ss"format, not the olderstart_date.Raise
ToolError(frommcp.server.mcpserver.exceptions) for anything whose message the model needs to read. Any other exception has its text replaced with a generic "Error executing tool", which silently discards the API's validation messages.Evidence must be measured server-side. If a future change lets a tool caller pass in the statistics that justify an action, the policy engine stops being a safety mechanism.
The API version is pinned in
ads_agent/client.py(API_VERSION).
License
MIT. Set the copyright holder in LICENSE before publishing.
See the disclaimer above. This software is provided without warranty, and you are solely responsible for what it does in your advertising accounts.
Available Tools
41 toolsad_asset_performanceARead-only
Per-asset performance for responsive search ads: Google's own performance_label (PENDING/LEARNING/LOW/GOOD/BEST) for each individual headline and description. ad_strength is one label for the whole ad; this is the useful signal underneath it — which specific line is dragging the ad down, so you know what to replace with add_rsa rather than guessing from the aggregate label.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| end_date | No | ||
| date_range | No | LAST_30_DAYS | |
| start_date | No | ||
| campaign_id | No | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: it is scoped specifically to responsive search ads, returns Google's own performance_label, and exposes per-headline/per-description data rather than a single aggregate. It also explains the relationship between ad_strength and this underlying signal. This goes beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, followed by a clear explanation of why it matters relative to the aggregate ad_strength label. Both sentences earn their place, though the phrase 'Google's own' is slightly redundant and could be trimmed. Overall structure is strong and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the tool's conceptual purpose well and there is an output schema to clarify return structure. However, it gives no operational context for parameters such as campaign_id or date ranges, and does not mention the filtering behavior implied by the optional inputs. For a read-only reporting tool with defaults, this 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?
Schema description coverage is 0%, and the description provides no guidance on any of the six parameters: customer_id, campaign_id, date fields, limit, or date_range. The agent must rely solely on parameter names and defaults, which is insufficient for correctly constructing calls. The description does not compensate for the total absence of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: per-asset performance for responsive search ads, broken out by individual headline and description with Google's performance_label values. It clearly distinguishes itself from the sibling-level ad_strength metric and explains why this tool is more useful than the aggregate label. The resource and granularity are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames when this tool is useful: when you need to know which specific line is dragging the ad down before replacing it with add_rsa, instead of guessing from the aggregate ad_strength label. It does not explicitly name sibling alternatives or state when not to use it, but the contextual contrast with ad_strength provides clear practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_negative_keywordsA
Add campaign-level negative keywords. Autonomous when each term's own measured search-term data clears the policy threshold with no conversions. Terms that do not clear it are reported, not added.
| Name | Required | Description | Default |
|---|---|---|---|
| terms | Yes | ||
| run_id | No | ||
| dry_run | No | ||
| rationale | No | ||
| match_type | No | PHRASE | |
| campaign_id | Yes | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: it is selective/autonomous, only adds approved terms, and reports rather than adds non-clearing terms. It does not contradict readOnlyHint=false or destructiveHint=false, though it could say more about dry_run 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?
Two short sentences front-load the purpose and then add the key autonomy condition. Every sentence earns its place and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for the core use case and the output schema covers return values, but it leaves gaps around dry_run, match_type semantics, and how 'reported' terms are returned. These gaps matter because the schema carries no field descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it does not explain most parameters (dry_run, run_id, rationale, match_type). It only implies that terms are negative keywords and campaign_id is the campaign target, which is insufficient for a 7-parameter tool.
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 first phrase 'Add campaign-level negative keywords' names a specific verb and resource and immediately distinguishes it from the sibling add_shared_negative_keywords. The rest of the description adds the policy-threshold condition without blurring the core 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?
It communicates when autonomous operation is appropriate: terms whose own search-term data clears the policy threshold with no conversions. It does not explicitly name alternatives or exclusion cases, so it stops short of a 5, but the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_rsaA
Create the previewed responsive search ad for real, in the existing ad group. Requires the exact spec and confirm_token from a successful preview_rsa. The ad is created ENABLED — Google Ads has no paused-on-create option for ads the way this server forces for new campaigns — so it starts serving immediately into what is presumably a live ad group. Confirm with the user before calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | ||
| confirm_token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavior beyond the annotations: the ad is created ENABLED, starts serving immediately, has no paused-on-create option, and targets a presumably live ad group. This is highly valuable risk information. It does not contradict the annotations, which correctly mark the operation as non-read-only.
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 focused sentences: what it does, the prerequisite, and the critical behavioral warning. Each sentence carries necessary information with no filler. The most important distinction from sibling tools is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's side-effect profile, the description covers all essential context: prerequisite, live-serving behavior, user confirmation requirement, and the target ad group. The output schema and nested spec descriptions cover the remaining details.
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 at the top level, but the description compensates by clarifying that spec and confirm_token must come from a successful preview_rsa. This gives the confirm_token purpose and constrains the spec parameter. The nested schema already documents fields like final_url and ad_group_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create the previewed responsive search ad for real, in the existing ad group.' It clearly distinguishes this from the sibling preview_rsa by emphasizing the actual creation step versus previewing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: only after a successful preview_rsa, with the exact spec and confirm_token. It also instructs to confirm with the user before calling. It does not explicitly name alternatives, but the prerequisite effectively disambiguates it from preview_rsa.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_proposalA
Execute a previously recorded proposal from the generic mutate tool — the exact call a human is now explicitly approving, rather than the agent re-deciding on its own to act on a propose-only finding. Refused when this run is unattended (ADS_AGENT_UNATTENDED=1): applying a proposal is precisely the human step the propose tier exists to require, and a scheduled run must not be able to supply that itself. Re-reads current field values before writing, the same as mutate().
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| proposal_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=false and destructiveHint=false, but the description adds substantial behavioral disclosure: the tool is refused in unattended runs, it re-reads current field values before writing (same as mutate), and it executes the precise call a human approved rather than an agent reinterpretation. It also names the exact environment variable governing the refusal. This goes well beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct value: purpose, refusal condition, and read-before-write behavior. It is front-loaded with the core action and contains zero filler or repetition of schema/annotation content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers purpose, usage boundaries, a critical refusal path, and a concurrency-relevant behavior. The main gap is dry_run semantics and what happens on failure (e.g., already-applied or invalid proposal). For a two-parameter tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter meaning. It gives proposal_id meaningful context (a proposal previously recorded by mutate — the exact call being approved), but says nothing about dry_run, whose behavior and purpose are entirely unexplained. Partial compensation for a required parameter, but a complete gap for the optional one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Execute a previously recorded proposal from the generic mutate tool." It distinguishes itself from the generic mutate tool, list_proposals, and dismiss_proposal by framing apply_proposal as the exact human-approved action rather than an agent re-decision. The first sentence alone fully differentiates this tool from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use context: apply a proposal only when a human is explicitly approving it, not when the agent is autonomously deciding to act on a propose-only finding. It also gives a concrete when-not condition with an environment variable check (ADS_AGENT_UNATTENDED=1). It does not name sibling alternatives like dismiss_proposal for the rejection case, which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_ad_groupsARead-only
Map a list of keywords across ad groups that ALREADY EXIST, using Google's own themeing. It assigns and refines rather than inventing themes from scratch: pass a campaign whose ad groups are already created, and it returns which ad group each keyword belongs in, with a suggested match type. To split one big ad group, create the themed ad groups first, then run this to distribute the keywords.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| campaign_id | No | ||
| customer_id | Yes | ||
| ad_group_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, and the description stays consistent by emphasizing that the tool 'assigns and refines' and 'returns' a mapping rather than mutating ad groups. It adds useful behavioral context about using Google's own themeing, the dependency on already-created ad groups, and the distribution workflow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the core action, the key constraint, and a practical workflow without filler. The most important distinguishing detail — existing ad groups and Google's themeing — is front-loaded, and 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?
Given that an output schema exists and annotations cover the read-only nature, the description adequately explains what the tool returns, the prerequisites, and the intended use case. The only minor gap is lack of detail about how campaign_id and ad_group_ids relate or conflict when both are supplied, which is low-risk for a read-only mapping tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It explains keywords as a list to map, implies campaign_id via 'pass a campaign', and references existing ad groups corresponding to ad_group_ids, but it never mentions the required customer_id parameter or clarifies the optional/null behavior of ad_group_ids. This is partial compensation, not full.
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 a specific action — mapping keywords across existing ad groups via Google's themeing — and distinguishes it from creating themes from scratch. It also specifies the output: which ad group each keyword belongs in plus a suggested match type, so the tool's purpose is unambiguous and distinct from siblings like suggest_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 gives clear preconditions and workflow: ad groups must already exist, pass a campaign with pre-created ad groups, and to split a big ad group first create themed ad groups then run this. It implies when to use this tool versus alternatives, though it does not name an alternative tool explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_campaignARead-only
Structural review of a campaign: targeting gaps, Display expansion left on, thin RSAs, poor ad strength, all-broad-match ad groups, keywords duplicated across ad groups, budget-to-bid mismatch. Uses no performance data, so it works on test accounts and brand-new campaigns.
| Name | Required | Description | Default |
|---|---|---|---|
| today | No | ||
| campaign_id | Yes | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description aligns with that by framing the operation as a review. It additionally discloses a non-obvious behavioral trait: no performance data is consulted, which is why the tool is safe for accounts without history. openWorldHint is not contradicted.
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 the purpose, followed by a compact checklist of review areas and a critical constraint. Every clause earns its place and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the review scope, the key data-absence constraint, and the environments where it works, while an output schema exists to document returns. The only notable gap is the undocumented optional 'today' parameter, which is minor given its default and optionality.
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 provides no parameter-level guidance beyond the operation itself. customer_id and campaign_id are self-explanatory, but the optional 'today' parameter and any format requirements are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Structural review of a campaign' — and enumerates concrete findings such as targeting gaps, Display expansion left on, thin RSAs, and budget-to-bid mismatch. It also differentiates itself from performance-focused siblings by explicitly stating it uses no performance 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?
It clearly states when the tool is appropriate: because it uses no performance data, it works on test accounts and brand-new campaigns. It does not explicitly name sibling alternatives or include a when-not-to-use clause, but the context is clear enough for an agent to choose it over performance-dependent tools like keyword_performance or geo_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_historyARead-only
Who changed what, when, and from which client (web UI, Editor, API, scripts), with the fields that changed. Answers 'why did performance shift' and 'was this setting deliberate'. Google retains at most 30 days of change history.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No | ||
| campaign_id | No | ||
| customer_id | Yes | ||
| exclude_api | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds meaningful behavioral context by noting that Google retains at most 30 days of change history, which sets expectations about data availability and the limit of the days parameter.
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 tight sentences that pack in the core data model, use cases, and a retention caveat without fluff. Every clause 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?
While the description captures the purpose and the 30-day retention constraint, it fails to guide invocation: it omits parameter semantics, required fields, defaults, and filtering behavior. The presence of an output schema helps, but the input side remains under-specified for a tool with 5 parameters.
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 name or explain parameters such as customer_id, days, limit, campaign_id, or exclude_api. It only hints at the 30-day window and client types, giving limited indirect meaning but not enough to compensate for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly explains what the tool does: it returns who changed what, when, from which client, and which fields changed. It also differentiates the tool by framing it as answering 'why did performance shift' and 'was this setting deliberate', which distinguishes it from performance and audit-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical usage context by tying the tool to diagnosing performance shifts and determining whether a setting was deliberately changed. It does not explicitly name alternatives or state when not to use it, but the use cases are clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_setupARead-only
Check what this installation can actually do: credentials, API version, and which API methods the developer token's access level permits. Run this first when something is refused, or right after setup. Read-only — the one write probe uses validate_only and writes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by explicitly explaining that the one write probe uses validate_only and writes nothing, which removes any concern about mutation. It also aligns with openWorldHint by indicating the results depend on the actual installation, credentials, API version, and access level. No annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: purpose first, usage trigger second, safety reassurance third. Every sentence adds value and there is no repetition of annotations or schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return-value details are not required. The description covers purpose, usage timing, and behavioral safety well. The only meaningful gap is the undocumented optional customer_id parameter, which is a minor omission for an otherwise well-specified diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, customer_id, has no schema description (0% coverage) and is never mentioned in the tool description. An agent is left guessing whether or how customer_id scopes the setup check; the title 'Customer Id' and default '' provide only minimal hints. With low schema coverage, the description needed to compensate but did not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') and a clear resource ('what this installation can actually do'), enumerating credentials, API version, and permitted API methods. It distinguishes this diagnostic tool from the sibling tools by focusing on the developer token's access level and setup validation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Run this first when something is refused, or right after setup.' This tells an agent when to use the tool with little ambiguity, though it doesn't name specific alternative tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversion_actionsARead-only
Inspect conversion tracking: every conversion action with its status, category, counting type, whether it feeds bidding, and how many conversions it actually recorded. Use this to decide whether a low conversion count means a weak funnel or broken tracking — the whole autonomy gate depends on that answer.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | LAST_30_DAYS | |
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so no safety contradiction exists. The description reinforces this with 'Inspect' and adds useful scoping detail like 'every conversion action', but it does not disclose deeper behavioral risks or constraints such as account-wide effects or latency. It adds moderate context beyond the annotation, but not rich behavioral disclosure.
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 the core purpose and a concise list of returned fields, followed by a decision-oriented usage rationale. No filler or redundant restating of the schema.
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 doesn't need to detail return structure. It covers the main decision context, the data fields, and the read-only nature. It falls slightly short only in explaining how date_range affects the conversion counts, but the schema provides the parameter default and the task context is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate for the two parameters, especially date_range, which directly affects the conversion counts the tool reports. The description never mentions customer_id or date_range, leaving the agent to infer their meaning solely from the parameter names and default. This is a clear 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 opens with a specific verb-resource pair, 'Inspect conversion tracking', and enumerates exactly what is returned: status, category, counting type, bidding participation, and conversion counts. This clearly differentiates it from sibling performance or keyword tools, which focus on different entities and metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: to diagnose whether low conversion counts stem from a weak funnel or broken tracking, framing it as central to the autonomy gate. It does not mention alternatives or when not to use it, but the decision context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignA
Create the campaign for real, as a single atomic mutate. Requires the exact spec and confirm_token from a successful preview_campaign. The campaign is always created PAUSED — it cannot spend until a human enables it in the Google Ads UI. Confirm with the user before calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | ||
| confirm_token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds critical behavioral details: the operation is atomic, the campaign is always created PAUSED, it cannot spend until a human enables it in the Google Ads UI, and confirmation is required first. This gives the agent a strong sense of the real-world side effects and safety posture of the call.
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 short sentences with no filler. It front-loads the core purpose, then gives the prerequisite, the paused behavior, and the user-confirmation requirement. Every sentence adds necessary operational 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?
For a high-stakes mutate call, the description covers the essential workflow: preview first, confirm with the user, then create atomically. It also discloses the most important consequence—the campaign starts paused and cannot spend until a human enables it—and because an output schema exists, return details are not needed in the description.
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 top-level schema provides no description for the two parameters, so the description must compensate. It does by explaining that spec must be the exact spec from a successful preview_campaign and that confirm_token comes from that same preview, which is essential semantics the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create the campaign for real', and clarifies it is 'a single atomic mutate'. It also distinguishes the tool from preview_campaign by requiring a successful preview's spec and confirm_token, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly specifies the precondition: the tool requires 'the exact spec and confirm_token from a successful preview_campaign', and instructs the agent to confirm with the user before calling. It does not explicitly name alternatives like create_campaign_draft or when not to use them, but the prerequisite and user-confirmation guidance provide a solid usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaign_draftA
Create a draft copy of an existing campaign: an inert shadow campaign you can safely edit — via get_campaign, mutate, add_rsa, and the rest, pointed at the draft's own campaign ID — without touching what is actually live. Nothing about the base campaign changes until you call promote_campaign_draft.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_name | No | ||
| campaign_id | Yes | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description reveals the key behavioral contract: the draft is inert, edit-safe, and 'Nothing about the base campaign changes until you call promote_campaign_draft'. It also explains how the draft can be manipulated via other tools using its own campaign ID, adding meaningful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no filler. The action is front-loaded, and the follow-up explains the important safety model and related tools. Every clause 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?
The description is strong on workflow and safety, and an output schema exists so return-value details are covered. The main gap is the complete absence of parameter semantics in both the schema and description, which prevents a higher score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not compensate. It never mentions customer_id, campaign_id, or draft_name explicitly. The phrase 'existing campaign' loosely implies campaign_id, but draft_name and customer_id semantics are left entirely to inference from 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 action and resource: 'Create a draft copy of an existing campaign'. It also distinguishes itself from create_campaign and promote_campaign_draft by framing the result as an 'inert shadow campaign', leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use this to get a safely editable copy of a live campaign before mutating it, and only call promote_campaign_draft when you actually want changes to go live. It implies the alternative of editing the live campaign directly and explains why the draft route is preferable, though it does not explicitly enumerate when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dismiss_proposalA
Dismiss an open proposal without executing it, so it stops showing up in list_proposals. Proposing the identical change again later reopens it — dismissing is a decision about this instance, not a permanent ban on the change.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| proposal_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=false and destructive=false, and the description adds the important instance-level behavior: dismissing is not a permanent ban and proposing the identical change later reopens it. This goes beyond the schema and annotations, though it does not detail reason handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler; the core action and effect are front-loaded, and the nuance about reopenability is delivered in a single compact follow-up sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has an output schema, and annotations cover safety traits, so the description covers the key behavioral context of dismissing. It is slightly incomplete on what the reason parameter is for, but given the optional default and simple shape this remains minor.
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 never mentions proposal_id or reason, so it adds no meaning beyond the raw parameter names. The names are somewhat self-explanatory, but the description does not compensate for the absent schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Dismiss an open proposal without executing it,' and immediately distinguishes the operation from execution and from listing by stating the effect on list_proposals. This clearly differentiates it from siblings like apply_proposal.
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 conveys that this tool is for dismissing an open proposal rather than executing it, and that the proposal will no longer appear in list_proposals. It does not explicitly name a sibling such as apply_proposal as the alternative, but the intended use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_capabilityARead-only
Explain what would happen if the generic mutate tool were asked to change one field: which rule matches, at what tier, and what else was considered. Use this before mutate to find out whether a change is permitted. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | * | |
| value | No | ||
| resource | Yes | ||
| direction | No | any | |
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description reinforces this with 'Read-only.' It adds behavioral context beyond the annotations by describing what the explanation covers: the matching rule, the tier, and other considerations. No contradiction exists, though details about edge cases such as wildcard fields or invalid inputs are absent.
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 tight sentences: the first explains behavior and output, the second gives direct usage guidance. There is no filler or redundant restating of the tool name, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose and relationship to mutate, and an output schema exists to handle return-value details. However, with five parameters, zero schema-level descriptions, and meaningful defaults like field='*' and direction='any', the absence of parameter guidance leaves notable gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters, but it only minimally implies that 'field' is the field to change. It does not explain the required resource and operation parameters, nor the meaning of value, direction, or the '*' default. An agent would likely need external knowledge of the mutate tool's vocabulary to call this correctly.
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 a specific action ('Explain what would happen if the generic mutate tool were asked to change one field') and the expected output content ('which rule matches, at what tier, and what else was considered'). It also differentiates the tool from the sibling mutate tool by framing itself as a pre-check mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage directive: 'Use this before mutate to find out whether a change is permitted.' This clearly identifies when to use the tool in relation to mutate, though it does not explicitly state when not to use it or mention an alternative like list_capabilities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forecast_campaignARead-only
Forecast a campaign before building it: projected clicks, impressions, cost, average CPC, conversions and CPA for a keyword set at a given daily budget and max CPC. Run this before preview_campaign to find out whether the budget and bid actually buy enough traffic to learn anything.
| Name | Required | Description | Default |
|---|---|---|---|
| bidding | No | manual_cpc | |
| max_cpc | No | ||
| keywords | Yes | ||
| match_type | No | PHRASE | |
| start_date | No | ||
| customer_id | Yes | ||
| daily_budget | Yes | ||
| language_ids | No | ||
| forecast_days | No | ||
| geo_target_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description consistently reflects a non-mutating forecasting operation. It adds useful behavioral context beyond annotations by specifying the projected metrics and the validation purpose around budget and bid.
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 efficient sentences with no wasted words. The first sentence front-loads the action and outputs, and the second adds sequencing and purpose. 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?
With an output schema present and annotations covering side effects, the description adequately explains the core purpose, expected metrics, and its role relative to preview_campaign. The main gap is optional parameter semantics, but required parameters are identifiable from the schema and names.
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 references keywords, daily_budget, and max_cpc, leaving customer_id, geo_target_ids, language_ids, match_type, bidding, start_date, and forecast_days semantically unexplained. With 10 parameters and no schema descriptions, this is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Forecast') and resource ('a campaign'), enumerates concrete outputs (clicks, impressions, cost, CPC, conversions, CPA) and key inputs (keyword set, daily budget, max CPC). It also distinguishes itself from the sibling preview_campaign by explaining it is the step to run beforehand.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Run this before preview_campaign' and provides the rationale ('to find out whether the budget and bid actually buy enough traffic to learn anything'). It names an alternative and the sequencing condition, though it does not discuss other alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geo_performanceARead-only
Performance by the geographic location a user actually was in or searching from — distinct from geo_target_ids, which is what you targeted. Answers 'is this converting where I think it is', which targeting alone cannot: a campaign can be fully within its targeted country and still be spending almost entirely in one weak region.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | country | |
| limit | No | ||
| end_date | No | ||
| date_range | No | LAST_30_DAYS | |
| start_date | No | ||
| campaign_id | No | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=true, the read-only nature is already covered by annotations. The description adds value by explaining the semantic distinction between actual and targeted location and why that matters for interpretation, without contradicting 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 with no filler, front-loaded with the core definition and followed by a meaningful illustrative contrast. Every phrase earns its place and the description is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The core concept and differentiator are fully explained, and the presence of an output schema covers return value structure. However, the complete lack of parameter guidance leaves a practical gap for invocation, especially given 7 parameters and no enum constraints.
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 provides no information about parameters such as level, date_range, limit, or campaign_id. It offers only high-level conceptual context, leaving the agent to infer valid values and formats from parameter names and defaults 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 defines what the tool reports: performance by the geographic location a user actually was in or searched from, contrasting it with targeted geography. It answers the specific question 'is this converting where I think it is', making the purpose unambiguous and distinguishing it from targeting-related concepts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when actual user location matters rather than targeted location. It explicitly says targeting alone cannot answer the question, providing a strong selection signal, though it does not name a specific sibling tool as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignARead-only
Read back a campaign in full — settings, targeting, ad groups, keywords, and responsive search ad assets with their ad strength. Use this after create_campaign to verify what actually landed.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, and the description aligns by saying 'Read back a campaign in full.' Beyond annotations, it discloses exactly what will be returned and implies verification of persisted state, adding 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?
Two tight sentences; the first front-loads the operation and scope, the second gives the intended usage. Every clause earns its place, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only retrieval by two self-explanatory IDs, plus an output schema and read-only annotations, the description covers the operation, its timing after create_campaign, and its content scope. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain customer_id or campaign_id beyond the tool's general reference to 'campaign.' The property names are self-explanatory, but the description adds no parameter-level semantics or constraints to compensate for the schema 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?
Description opens with a specific verb and resource, 'Read back a campaign in full,' and enumerates distinct content areas: settings, targeting, ad groups, keywords, and responsive search ad assets. This clearly distinguishes it from siblings like list_campaigns or preview_campaign without needing the schema.
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 frames the primary use case: 'Use this after create_campaign to verify what actually landed.' It does not name alternatives or exclusions, but the context is clear enough for a sibling-rich toolset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_performanceARead-only
Per-keyword performance with quality score, its three components, and effective bid. Sorted by cost, so the biggest spenders come first. Use this to find keywords spending without converting — and AdRel/LPExp/ExpCTR to find out why a low quality score is low, since the single QS number alone does not say which of the three to fix.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| end_date | No | ||
| date_range | No | LAST_30_DAYS | |
| start_date | No | ||
| campaign_id | No | ||
| customer_id | Yes | ||
| min_impressions | No | ||
| zero_conversions_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds meaningful behavior beyond that: results are sorted by cost with biggest spenders first, and the QS components are included because the single quality-score number alone is ambiguous. This is genuinely useful 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?
Three sentences, each earning its place: output contents, sort order, and diagnostic use case. The most decision-relevant information is front-loaded, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists and annotations cover the read-only safety profile, so return-value and permission details are not required. However, with 8 parameters and zero schema descriptions, the tool description leaves parameter semantics to default titles, which is adequate for simple fields but incomplete for date and filtering behavior.
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 carries the burden of explaining the 8 parameters, but it names none of them. Parameter titles like zero_conversions_only and min_impressions are somewhat self-explanatory, but the description does not compensate for the missing schemas or clarify how parameters interact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (per-keyword performance) and a diagnostic purpose (find keywords spending without converting), listing quality score, its three components, and effective bid. The scope is clear and distinct from broad siblings like performance, though it does not explicitly name an alternative 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?
Gives an explicit use case: 'Use this to find keywords spending without converting' and explains how to act on the output by inspecting AdRel/LPExp/ExpCTR to diagnose low quality score. It does not mention when to prefer related siblings such as search_terms or performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_volumesARead-only
Average monthly search volume, competition, and bid range for a list of keywords you already have. Unlike suggest_keywords this does not expand or invent anything — it reports on exactly the terms you pass, which is what you want for auditing an existing keyword list.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| customer_id | Yes | ||
| language_id | No | 1000 | |
| geo_target_ids | Yes | ||
| include_search_partners | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, reducing the burden on the description. The description adds a valuable behavioral guarantee: it reports exactly on the terms passed and does not expand or invent anything. This clarifies an important boundary beyond the read-only annotation, though it does not cover edge-case behavior such as handling of unmatched keywords.
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 with no wasted words. The first sentence front-loads what the tool returns, and the second sentence names the sibling and the intended use case. Every clause 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?
The description is clear about the tool's core behavior and return type, and an output schema exists to document return values. However, with 0% schema description coverage, key input parameters like geo_target_ids and include_search_partners are left under-explained, which could cause incorrect calls despite the presence of sibling tools like suggest_geo_targets. The gap is moderate.
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 five parameters and zero descriptions, so the description must compensate. It only clarifies the keywords parameter with 'a list of keywords you already have'; geo_target_ids, customer_id, language_id, and include_search_partners receive no semantic explanation beyond their names and defaults. This is insufficient for a low-coverage 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 states a specific verb and resource: it reports average monthly search volume, competition, and bid range for a list of keywords the user already has. It also distinguishes itself from suggest_keywords, making its scope immediately clear to an agent scanning sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names suggest_keywords as the alternative and explains the difference: this tool does not expand or invent terms, while suggest_keywords presumably does. It also gives a concrete use case—auditing an existing keyword list—so an agent knows when to choose this tool.
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 the Google Ads accounts these credentials can reach, with currency, time zone, and whether each is a test account. Call this first to get the customer_id for other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so no destructive behavior needs flagging. The description adds useful behavioral context beyond the annotations: it explains the reachable-account scope, the data returned, and its role as a prerequisite step for other tools.
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 with no redundant information. The first sentence states what the tool returns, and the second provides a direct, actionable usage instruction. Every word 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?
For a simple, zero-parameter, read-only list tool with an output schema, the description is complete. It explains the purpose, the output fields, the credential-bound scope, and the primary usage pattern (call first). Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4 and the description has no parameter burden. It does not need to explain parameter meanings because there are none; the description even implies no input is required by saying to call it first to obtain the customer_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List the Google Ads accounts'), the scope ('these credentials can reach'), and the meaningful output attributes (currency, time zone, test account flag). It also sets this tool apart as the entry point for obtaining customer_id, distinguishing it from other list tools like list_campaigns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage directive: 'Call this first to get the customer_id for other tools.' This provides clear context for when to use it, though it does not explicitly name alternatives or state when not to use it. For a zero-parameter discovery tool, this is still strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaign_draftsARead-only
List campaign drafts: status, which campaign each is a draft of, and the draft's own campaign ID — the target for get_campaign / mutate / add_rsa while editing it.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true and openWorldHint=true, lowering the burden. The description adds value beyond them by disclosing the draft-to-parent-campaign mapping and the status field, plus the actionable nature of the returned ID. 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?
A single dense sentence with zero filler, front-loaded with verb + resource, and every clause earns its place — return fields, parent mapping, and downstream tool routing.
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-only list tool with an output schema and safety annotations, the description covers what is returned and how to use the results. The only notable gap is the semantics of the optional campaign_id parameter, which neither schema nor description documents.
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, but it never explains what the optional campaign_id does (filter by parent campaign? by draft ID?). customer_id is self-evident, but the ambiguous campaign_id with default '' is a real gap for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('campaign drafts') and enumerates the exact fields returned: status, the parent campaign each draft belongs to, and the draft's own campaign ID. The word 'drafts' cleanly separates it from siblings like list_campaigns and get_campaign even without naming 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?
Gives clear workflow context: the returned draft ID is the target for get_campaign / mutate / add_rsa while editing. This implies the tool is the discovery step before editing, but it doesn't give explicit exclusions (e.g., 'for live campaigns, use list_campaigns').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsBRead-only
List campaigns in an account with status, budget, and bidding strategy.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| include_removed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that returned campaigns include status, budget, and bidding strategy, but it does not mention include_removed behavior, pagination, or ordering. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every word contributes meaning: the operation, the resource, the scope, and the returned 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?
For a read-only list operation with an output schema, the description is minimally workable: an agent can understand it lists account campaigns and that customer_id is required. However, it leaves include_removed semantics and tool-selection guidance unexplained, which are real gaps for a correct call.
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 customer_id format or the semantics of include_removed beyond what the parameter name and default imply. The phrase 'in an account' loosely associates customer_id with an account, but that is minimal compensation for the missing parameter 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 names a specific verb and resource ('List campaigns'), the scope ('in an account'), and the included fields ('status, budget, and bidding strategy'). This distinguishes it from siblings like list_accounts and get_campaign by virtue of the plural resource, though it does not explicitly name any alternative 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?
The description implies usage when a campaign list is needed and supplies the account scope, but it provides no explicit guidance about when not to use it or which sibling alternative to prefer, such as get_campaign for a single campaign or audit_campaign for deeper analysis. The usage context is clear but entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capabilitiesARead-only
Show the capability table: every resource, operation and field the generic mutate tool is allowed to touch, and at which tier. Anything absent from this table is refused, so this is also the list of what is NOT possible. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | ||
| resource | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares safety, and the description reinforces it with 'Read-only.' Beyond annotations, it adds meaningful behavioral context: absent capabilities are refused, so the tool also enumerates what is NOT possible. This goes beyond the structured metadata and helps an agent understand the tool's authority boundary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, placing the primary action and scope in the first sentence. The second sentence adds a valuable consequence (refusal of absent capabilities). The final 'Read-only' is somewhat redundant with the annotation, but it is brief and not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with an output schema, the description covers the core behavior, scope, and refusal semantics. The main gap is the lack of parameter semantics, but since both parameters are optional and the output schema exists, the overall context is still adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'tier' or 'resource' parameters, which appear to act as filters for the capability table. The phrase 'at which tier' hints at the notion of tiers but does not connect it to the input parameters. The description fails to compensate for the undocumented 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 uses a specific verb ('Show') with a concrete resource ('the capability table') and defines its scope: every resource, operation, and field the mutate tool may touch, plus the tier. It clearly distinguishes itself from mutation tools like 'mutate' and from capability-explanation tools by framing itself as the authoritative allow-list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case evident: consult this tool to learn what is possible and what is refused. 'Anything absent from this table is refused' gives strong contextual guidance for when to call it. It does not explicitly name alternatives or state when not to use it, but the purpose is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_proposalsARead-only
List open proposals recorded by the generic mutate tool's propose-only findings — the exact diffs a human can execute with apply_proposal instead of manually re-deriving the mutate() call from a run's report.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the description has a lighter burden. It adds meaningful context about the source and nature of proposals. 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?
One dense sentence with no filler. The core behavior is front-loaded, and the explanatory clause adds necessary context about the relationship to mutate and apply_proposal without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and sibling relationships, and an output schema exists to describe return values. However, the optional customer_id parameter is entirely unexplained, which is a significant gap for correct invocation, and the concept of 'open' is only implicitly defined by sibling 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?
The single customer_id parameter has no schema description and is not mentioned in the tool description. With schema description coverage at 0%, the agent receives zero information about what this parameter does, whether it is needed, or how it affects results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list open proposals. Explains what these proposals are (diffs from the mutate tool's propose-only findings) and how they relate to apply_proposal and mutate, making it clearly distinguishable from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly implies when to use this tool: to retrieve executable proposals instead of re-deriving mutate calls manually. It references apply_proposal as the follow-up action, giving workflow context, though it does not explicitly state exclusions or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mutateA
Change any mutable Google Ads resource. This is the general write path: it reaches every resource the API exposes, and is governed entirely by the capability table rather than by hand-written logic.
Call it once with no confirm_token to see the exact diff, the tier that governs it, and a token. Call it again with that token to execute. Anything with no rule in the table is refused, as are forbidden rules however they are confirmed. Every update reads the current values first, so the journal can undo it.
Prefer the specific tools where they exist — pause_keywords and the rest measure evidence this path cannot.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| resource | Yes | ||
| operation | Yes | ||
| customer_id | Yes | ||
| fields_json | No | {} | |
| confirm_token | No | ||
| resource_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (write-only, open-world, non-destructive), the description reveals critical behaviors: the dry-run diff with token confirmation, capability-table governance, refusal of unruled/forbidden operations, and that 'every update reads the current values first, so the journal can undo it.' This substantially exceeds what annotations alone communicate and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: purpose first, then workflow/behavior, then a clear routing preference. Every sentence contributes – there is no filler, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a general write path with 7 parameters, an output schema, and annotations, the description covers the essential operational context: capability-table governance, two-step confirmation, safety via undo journal, and the existence of more specific siblings. It provides enough for an agent to invoke correctly, and where specifics are lacking, it points to the governing mechanism (capability table).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the burden. It effectively explains confirm_token ('Call it once with no confirm_token to see the exact diff... and a token') and dry_run implicitly through the two-step flow. It also gives meaning to resource and operation through the 'change any mutable resource' framing. However, fields_json and resource_name are not semantically described, leaving some parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Change any mutable Google Ads resource' – a specific verb and resource scope – and immediately positions it as 'the general write path' that 'reaches every resource the API exposes.' It explicitly contrasts itself with specific sibling tools like pause_keywords, making its role unmistakable. This is a clear, differentiated statement of 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 gives explicit guidance: 'Prefer the specific tools where they exist – pause_keywords and the rest measure evidence this path cannot.' It also explains the exact two-step invocation pattern ('Call it once with no confirm_token... Call it again with that token'). This tells an agent both when to use this tool and when to choose an alternative, with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_ad_groupsA
Pause whole ad groups that are spending without converting. Pauses, never removes. Thresholds are higher than for keywords, since an ad group is a much bigger unit to switch off.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | ||
| dry_run | No | ||
| rationale | No | ||
| campaign_id | Yes | ||
| customer_id | Yes | ||
| ad_group_names | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already establishing readOnlyHint=false and destructiveHint=false, the description adds value beyond them through 'Pauses, never removes,' a firm reversibility/non-removal commitment, plus the threshold logic governing the decision. It does not contradict any annotation; pausing is consistent with a mutating yet non-destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver the action, the safety boundary, and the threshold rationale with zero filler. The core purpose is front-loaded and every clause 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?
An output schema covers return values and the core behavior and decision logic are well explained. However, for a mutating tool the most useful guardrail, dry_run, is never mentioned, and the connection between run_id and the revert_last_run sibling is left implicit — adequate overall, but with clear gaps around parameter behavior.
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 for undocumented parameters, but it only partially does. 'Whole ad groups' clarifies that ad_group_names expects full group names and 'spending without converting' hints at the rationale field, yet run_id, dry_run, customer_id, and campaign_id are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair — 'Pause whole ad groups that are spending without converting' — and adds the behavioral boundary 'Pauses, never removes.' The threshold remark referencing keywords differentiates it from the sibling pause_keywords tool without needing to open either schema.
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 states the triggering condition ('spending without converting') and explains why thresholds are calibrated differently ('an ad group is a much bigger unit to switch off'), giving clear context for when to invoke it. The keyword-level counterpart is strongly implied by the threshold comparison, but the alternative is not explicitly named and no when-not-to-use exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_keywordsA
Pause keywords that are spending without converting. Pauses, never removes, so it is reversible. Evidence is measured here; keywords that do not clear the policy threshold are kept and reported.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | ||
| dry_run | No | ||
| rationale | No | ||
| campaign_id | Yes | ||
| customer_id | Yes | ||
| keyword_texts | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations state readOnlyHint=false and destructiveHint=false, and the description adds meaningful behavioral context beyond that: the action is reversible because it pauses rather than removes, and keywords that fail the evidence threshold are kept and reported. This helps an agent understand side effects and outcomes without contradicting 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 brief and front-loaded with the core action and condition. Each sentence adds useful information, though the phrase 'Evidence is measured here' is slightly vague and could be more direct without adding length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core behavior and reversibility, and an output schema exists to explain return values. However, it leaves important operational details unaddressed, such as the purpose of dry_run, how evidence thresholds are computed, and how the tool differs from pause_ad_groups or add_negative_keywords. Given the parameter count and schema coverage, this is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the six parameters. Parameters like dry_run and rationale are particularly important to understand but are left undocumented. The description provides some context for keyword_texts through the word 'keywords', but it fails to compensate for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb (pause), the resource (keywords), and the specific selection criterion (spending without converting). It also distinguishes itself from removal or permanent actions by explicitly stating it never removes keywords, making its purpose distinct from sibling tools that delete or mutate.
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 the tool: keywords that are spending but not converting, with evidence measured against a policy threshold. It does not explicitly name alternatives or say when not to use it, but the reversible pausing behavior implies a preferred use case over removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
performanceARead-only
Performance metrics at campaign, ad group, or ad level over a date range. Campaign level includes impression share and where it is being lost (budget vs rank); ad level includes ad strength. Needs Basic access and a live campaign — test accounts serve no ads and return no metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | campaign | |
| limit | No | ||
| segment | No | none | |
| end_date | No | ||
| date_range | No | LAST_30_DAYS | |
| start_date | No | ||
| campaign_id | No | ||
| customer_id | Yes | ||
| include_zero_impressions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavioral context beyond annotations: the test-account failure mode ('test accounts serve no ads and return no metrics') and level-specific metric composition (impression share / budget-vs-rank at campaign, ad strength at ad). 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?
Three sentences, each earning its place: the first states the core purpose and levels, the second adds differentiating metric details, the third states access requirements and the failure mode. The most important scoping information is front-loaded in the first sentence, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need no explanation. However, with 9 parameters at 0% schema coverage and closely related siblings (keyword_performance, ad_asset_performance, geo_performance), the description covers access prerequisites and level differences but never addresses how to construct a valid call for the remaining parameters (segment, limit, include_zero_impressions, campaign_id) or how to combine start_date with date_range.
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 carries the burden. It partially compensates by clarifying the 'level' parameter's valid values ('campaign, ad group, or ad level') and the date-range concept, but provides no guidance on limit, segment, customer_id, campaign_id, or include_zero_impressions. For a 9-parameter tool with zero schema descriptions, this is meaningful but incomplete compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear resource ('Performance metrics') and scope ('at campaign, ad group, or ad level over a date range'), implying the retrieve/get verb. The mention of impression share at campaign level and ad strength at ad level provides specificity that helps distinguish it from sibling tools like keyword_performance or ad_asset_performance, though it doesn't name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete when-to-use context: 'Needs Basic access and a live campaign — test accounts serve no ads and return no metrics.' This tells an agent the preconditions for a successful call and a clear failure mode. It doesn't explicitly name alternatives by sibling tool name, but the level scoping implicitly routes keyword/asset/geo level queries elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policy_statusARead-only
Show the active policy: which actions are autonomous, propose-only, or forbidden; the evidence thresholds each autonomous action must clear; and how much of the change budget is left. Call this before attempting any change so you know what will be permitted.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | No | ||
| customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to restate that this is a safe, read-only query. The description adds useful context about what the policy covers and that it should be checked before mutations, but it does not disclose any behavioral traits beyond what annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core purpose and output content, and the second gives an action-oriented usage instruction. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose, output categories, and when to call the tool, while an output schema is present to handle return-value details. The only notable gap is the lack of explanation about the optional parameters, which prevents a perfect completeness score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention campaign_id or customer_id at all. While the parameter names are somewhat self-explanatory and both are optional with defaults, the description fails to explain whether these parameters scope the policy to a specific campaign/customer or how they affect the returned policy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Show') and resource ('the active policy'), then enumerates exactly what the tool reports: allowed action modes, evidence thresholds, and remaining change budget. This clearly distinguishes it from sibling tools that operate on campaigns, keywords, or proposals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: 'Call this before attempting any change so you know what will be permitted.' It does not name alternatives or exclusions, but the tool is unique among siblings as a policy-status read, so the when-to-use guidance is sufficient for a strong score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_campaignARead-only
Dry-run a campaign spec: lint it locally, then submit it to the Google Ads API with validate_only so nothing is written. Returns the rendered plan, any errors, and — if valid — a confirm_token to pass to create_campaign. Always call this before create_campaign; show the plan to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the validate_only mechanism, confirms nothing is written, and enumerates the return payload (rendered plan, errors, confirm_token). This adds meaningful context beyond the readOnlyHint and openWorldHint annotations. It doesn't cover token expiry or authentication details, but those are less critical for safe invocation.
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 no filler. The critical dry-run and side-effect-free facts are front-loaded, the return values are listed, and the user-facing instruction is included. Every phrase 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?
For a one-parameter tool with an output schema and readOnlyHint annotation, the description covers what the tool does, what it returns, and the required relationship to create_campaign. The only shortcoming is the lack of explicit parameter-level guidance, but the rich input schema compensates for that. Overall it gives an agent enough to invoke it correctly and understand the expected flow.
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 `spec` parameter has no description in the schema (0% coverage at the top level), and the tool description doesn't explain its structure. However, the nested CampaignSpec schema is extensively self-documented with descriptions for fields like customer_id, daily_budget, and final_url. The description adds the high-level 'campaign spec' framing but no field-level guidance, so the schema carries most of the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Dry-run'), a specific resource ('campaign spec'), and the key outcome ('validate_only so nothing is written'). It also distinguishes itself from create_campaign by returning a confirm_token to pass to that tool. No ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit, mandatory usage rule: 'Always call this before create_campaign; show the plan to the user.' This tells the agent exactly when to invoke this tool and names the relevant sibling as the follow-up. It also implies when not to use it (when ready to write a campaign).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_rsaARead-only
Dry-run a new responsive search ad for an EXISTING ad group: lint it locally, then submit it to the API with validate_only so nothing is written. Returns the plan and, if valid, a confirm_token for add_rsa. Google Ads ads are immutable once created — there is no in-place edit — so this is how you act on an audit_campaign finding like 'RSA has 3 headlines' or 'ad strength is POOR': add a stronger RSA, then pause the old one yourself once the new one is confirmed live.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces and expands on this by explaining linting locally, submitting with validate_only so nothing is written, and returning a confirm_token. There is no contradiction; the behavior is transparent and well-matched to the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, and every clause earns its place: dry-run, no-write guarantee, return contract, and workflow guidance. It is dense but not padded.
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 read-only annotations and the presence of an output schema, the description covers what the tool does, why it exists, when to use it, what it returns, and what the agent should do next. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single spec parameter has low reported schema description coverage, and the description does not enumerate the required fields such as customer_id, ad_group_id, final_url, headlines, and descriptions. It does add useful context by emphasizing the ad group must already exist and that the call is a dry-run, but it leaves most parameter meaning to the nested 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 states a specific verb and resource: dry-run a responsive search ad for an EXISTING ad group. It also distinguishes this from add_rsa by mentioning validate_only and no write, and from preview_campaign by scoping to an existing ad group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: after an audit_campaign finding, before add_rsa, and as the correct path because Google Ads ads are immutable. It also gives the follow-up action of pausing the old ad separately, which leaves no ambiguity about the intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_campaign_draftA
Promote a campaign draft's edits back into the live base campaign — the one action in the draft workflow that touches live traffic: the base campaign starts running whatever was built in the draft. Call with no confirm_token to preview (shows which campaign it would overwrite); call again with the token to execute. Promotion is asynchronous — this kicks it off and returns immediately without waiting for it to finish. Check list_campaign_drafts afterward: status moves PROPOSED -> PROMOTING -> PROMOTED (or PROMOTE_FAILED).
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| confirm_token | No | ||
| draft_resource_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the sparse annotations: promotion is asynchronous and returns immediately without waiting, it overwrites live campaign behavior, and it documents the full status progression PROPOSED -> PROMOTING -> PROMOTED (or PROMOTE_FAILED). It also discloses the two-phase preview/commit safety mechanism. This is consistent with annotations (readOnlyHint=false, destructiveHint=false); no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with the critical live-traffic warning front-loaded in the first sentence. Each subsequent sentence earns its place: the two-phase call in sentence two, asynchronous behavior in sentence three, and verification steps in sentence four. There is zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex tool (async execution, two-phase confirmation, state transitions), everything an agent needs is present: what happens, what gets overwritten, how to preview safely, how to confirm, and where to verify the outcome with exact status transitions. Since an output schema exists, not documenting return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description carries the full burden, and it delivers the key semantic for confirm_token: absent means preview, present means execute — meaningfully expanding the schema's bare 'default: ""'. draft_resource_name's role is inferable from the overall description context, but customer_id is never mentioned and is only interpretable by convention shared across sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Promote a campaign draft's edits back into the live base campaign.' It also differentiates this from its draft-workflow siblings by explicitly flagging it as the one action in that workflow that touches live traffic, so an agent can distinguish it from create_campaign_draft, list_campaign_drafts, and remove_campaign_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 gives explicit call-sequence guidance: call without confirm_token to preview (showing which campaign it would overwrite), then call again with the token to execute. It also directs the agent to list_campaign_drafts afterward to observe the outcome. However, it never explicitly names alternative tools or states when not to use this one — the exclusion of siblings is implicit ('the one action in the draft workflow that touches live traffic').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_campaignADestructive
Permanently remove a campaign. IRREVERSIBLE — Google Ads has no un-remove, and a removed campaign can never be re-enabled (its historical stats do stay queryable). Call with no confirm_token to see exactly what will be destroyed and get a token; call again with that token to execute. The campaign must already be PAUSED. Prefer leaving a campaign paused unless there is a real reason to remove it.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| customer_id | Yes | ||
| confirm_token | No | ||
| acknowledge_irreversible | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true and readOnlyHint=false; the description goes far beyond that with rich behavioral context: Google Ads has no un-remove, a removed campaign can never be re-enabled, historical stats remain queryable, and execution requires a two-phase confirm_token flow. This meaningfully supplements the structured annotations rather than repeating them, and it is fully consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, zero filler. Each sentence earns its place: purpose, irreversibility with a stats caveat, the two-step token flow, the PAUSED prerequisite, and the precautionary prefer-paused advice. The most critical warning (IRREVERSIBLE) is front-loaded right after the purpose statement, so an agent sees the risk before anything else.
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 destructive, two-phase mutation tool, the description covers nearly everything an agent needs: irreversibility, consequences for stats, the token workflow, the prerequisite state, and caution guidance. Since an output schema exists, documenting return values isn't required. The only notable omission is the role of acknowledge_irreversible and what happens if it is left false, which leaves a small but real gap in the call contract.
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 carries the burden. It substantially clarifies the most complex parameter (confirm_token) by explaining the preview-then-execute flow: calling without it returns what will be destroyed plus a token, and calling again with the token executes. customer_id and campaign_id are self-explanatory from their titles, but acknowledge_irreversible's role is never mentioned — a small gap given it is one of only four 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 opens with a specific verb and resource — "Permanently remove a campaign" — and sharply distinguishes the action from neighboring concepts: it contrasts with the campaign-draft tools (remove_campaign_draft) by targeting campaigns, and with pause-style tools by emphasizing permanence. The irreversibility warning and the "prefer leaving a campaign paused" guidance make the tool's boundary unmistakable, so an agent can select it correctly without inspecting siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear when-to-use condition ("The campaign must already be PAUSED") and a strong when-not-to-use directive ("Prefer leaving a campaign paused unless there is a real reason to remove it"). It also explains the two-step invocation sequence. The only gap is that no alternative tool is explicitly named — the pause recommendation is stated as a state, not routed to a specific sibling — but the guidance is otherwise comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_campaign_draftB
Discard a campaign draft without promoting it. The base (live) campaign is untouched either way — this only deletes the shadow copy.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| draft_resource_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says the tool 'deletes the shadow copy,' which contradicts the annotation destructiveHint=false. Deleting a draft is a destructive operation on that draft resource, so the description and annotation are in direct conflict.
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 with no filler. The main action is front-loaded, and the following sentence adds important scoping and side-effect information efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description conveys the core behavior well and an output schema exists, so return values are covered. However, the parameter semantics are undocumented and the contradiction with destructiveHint leaves the safety profile ambiguous for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description provides no guidance on customer_id or draft_resource_name beyond their self-explanatory names. It does not explain the expected format, where the draft resource name comes from, or relationships between 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 states a specific action, 'Discard a campaign draft,' and clarifies it deletes only the shadow copy while leaving the live campaign untouched. This clearly differentiates it from promote_campaign_draft and remove_campaign siblings.
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 makes the use case clear: use this when you want to discard a draft rather than promote it. It contrasts with the promotion path and reassures that the live campaign is unaffected, though it does not explicitly name alternative tools or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revert_last_runA
Undo a run's changes using the inverse operations stored in the journal. Defaults to the most recent run. This is the escape hatch when the agent gets something wrong; it re-enables what was paused and removes negatives the agent itself added.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | ||
| dry_run | No | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description need not restate those. It adds valuable behavioral context that the tool re-enables paused items and removes negatives the agent added, which goes beyond the schema and helps an agent predict side effects. No contradiction with annotations is present.
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 tight sentences with no filler. The core action is front-loaded in the first sentence, and the second provides essential context ('escape hatch') and concrete effects. Every clause 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 output schema exists, return-value details are not needed. However, the description does not fully compensate for the 0% schema coverage on parameters: customer_id and dry_run are left to inference. The core behavior and when-to-use guidance are solid, but the invocation details are incomplete for a tool with three parameters.
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 carries the burden of explaining parameters. It only addresses run_id implicitly through 'Defaults to the most recent run,' but leaves customer_id and dry_run completely unexplained. An agent cannot know what customer_id scopes or what dry_run does from the description 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 states a specific verb ('Undo') and resource ('a run's changes'), and explains the mechanism ('using the inverse operations stored in the journal'). It also clarifies the default behavior ('Defaults to the most recent run') and frames the tool as an escape hatch, which clearly differentiates it from the many campaign/keyword management siblings.
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 when to use this tool: 'when the agent gets something wrong.' It also implies a conditional for run selection via 'Defaults to the most recent run,' suggesting the run_id parameter controls targeting another run. It does not name alternative tools, but no sibling appears to serve the same undo function, so the lack of explicit exclusions is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_gaqlARead-only
Run an arbitrary read-only GAQL query and return the raw rows. Escape hatch for anything the other tools do not cover. Only SELECT is accepted; GAQL has no mutation capability so this cannot write.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description reinforces this by stating 'read-only,' 'cannot write,' and 'Only SELECT is accepted,' adding GAQL-specific nuance beyond the annotations. It also discloses that the tool returns raw rows, which is 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?
Two short sentences with no filler. The core action, output, and constraining rule are all front-loaded, and every sentence adds unique 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?
For an arbitrary query escape hatch, the description covers the essential behavior, the read-only guarantee, and the SELECT-only restriction. An output schema exists, so the return shape does not need description. The only notable gap is parameter documentation, but the tool's simplicity and escape-hatch framing keep it 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?
Schema description coverage is 0%, so the description carries the burden for parameter meaning. It implicitly defines the 'query' parameter as a GAQL query, but it does not explain 'customer_id' or 'limit' at all. The description provides minimal help for the two required parameters and one optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Run an arbitrary read-only GAQL query') and clearly states the output ('return the raw rows'). It also distinguishes the tool from siblings by calling it an 'escape hatch for anything the other tools do not cover,' making its role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames this tool as a fallback for anything other tools do not cover, which is clear usage context. It also gives a hard constraint ('Only SELECT is accepted'). It stops short of naming specific alternative tools or saying when NOT to use it, so it is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_termsARead-only
The real search queries that triggered your ads, with metrics and whether each is already added as a keyword or excluded as a negative. This is the primary source for negative keyword decisions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| end_date | No | ||
| date_range | No | LAST_30_DAYS | |
| start_date | No | ||
| campaign_id | No | ||
| customer_id | Yes | ||
| only_unadded | No | ||
| min_impressions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value by revealing that results are real user search queries, include metrics, and indicate whether each term is already a keyword or a negative. This goes beyond the annotations and helps the agent understand the nature of the data returned.
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, tightly worded sentence. It front-loads the core definition ('real search queries that triggered your ads') and ends with the practical purpose. There is no filler or repetition, making it easy to scan and quickly understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description effectively conveys the tool's role and the nature of its data, but it does not address parameter semantics or how to choose between filters like date_range, only_unadded, or min_impressions. Since an output schema exists, return values are covered, but the agent still lacks guidance on parameter selection and how to translate the results into negative keyword decisions.
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 any of the 8 parameters. Parameter names like only_unadded and min_impressions are somewhat intuitive, but the description never clarifies their behavior, filtering logic, or how they relate to the returned data. The tool description leaves parameter understanding entirely to the schema titles and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines the resource as 'real search queries that triggered your ads,' which distinguishes it from keyword-performance or suggestion tools. It also states the data content (metrics, keyword/negative status) and the primary use case (negative keyword decisions), making it easy for an agent to know exactly what this tool provides.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a strong usage context by labeling this as 'the primary source for negative keyword decisions.' However, it does not explicitly name alternative tools or state when not to use it, so the guidance is clear but lacks explicit exclusions or comparisons to siblings like keyword_performance or suggest_keywords.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_networksA
Turn Display expansion and/or search partners OFF for a search campaign. Can only switch networks off, never on — a request to enable one is refused. Autonomous when the network's own measured spend clears the policy threshold with no conversions.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | No | ||
| dry_run | No | ||
| rationale | No | ||
| campaign_id | Yes | ||
| customer_id | Yes | ||
| search_partners | No | ||
| display_expansion | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (not read-only, open world), the description discloses two critical behavioral traits: the tool refuses any request to enable a network, and it can act autonomously when spend clears the policy threshold with no conversions. These are non-obvious behaviors that an agent must know before calling the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main action is front-loaded, followed by the one-way constraint and the autonomous trigger. Every clause adds distinct value, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, and the description explains the core behavior and constraints. The only minor gap is the lack of explanation for generic parameters (run_id, dry_run, rationale), but their names and defaults make them interpretable. Overall, an agent can safely invoke the tool with the information provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the burden of explaining parameters. It directly ties 'Display expansion' and 'search partners' to the boolean flags search_partners and display_expansion, and clarifies that true is not allowed (enable is refused). This is essential semantic meaning absent from the schema. Generic params like run_id, dry_run, and rationale are not described, but their names and defaults are 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?
The description opens with a specific verb and resource: 'Turn Display expansion and/or search partners OFF for a search campaign.' It precisely identifies the action and target, distinguishing it from sibling tools like pause_keywords or remove_campaign. The one-way constraint further clarifies what the tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the when-not-to-use condition: 'Can only switch networks off, never on — a request to enable one is refused.' This is a clear usage boundary, though it does not name an alternative tool for enabling networks. The context is clear but lacks explicit routing to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_geo_targetsARead-only
Resolve location names to the numeric geo target IDs that campaign specs need. Pass names like ['Spain', 'Madrid', 'United States']. Returns each match with its ID, canonical name, and target type.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | en | |
| country_code | No | ||
| location_names | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=true, the annotations already establish safety and openness. The description adds that the tool returns matches with ID, canonical name, and target type, but it does not disclose behavior for no matches, ambiguous names, or how locale/country_code affect resolution.
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 that front-load the core purpose, immediately show a usage example, and summarize the return fields. No words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a read-only lookup tool and mentions the key return fields, and an output schema exists to fill in detailed structure. However, the optional locale and country_code parameters are left unexplained, leaving some ambiguity for an agent deciding whether to set them.
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 does explain location_names with a concrete example and clarifies the output. However, it does not describe the locale or country_code parameters, which remain opaque given the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Resolve') with a clear resource ('location names to numeric geo target IDs') and explains why the output is needed ('that campaign specs need'). This clearly differentiates it from siblings like suggest_keywords and geo_performance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this tool when you need to convert human-readable location names into numeric geo target IDs for campaign specifications. It does not explicitly name alternatives or state when not to use it, but the use case is distinct enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_keywordsARead-only
Generate keyword ideas from seed terms and/or a URL, with average monthly search volume, competition, and top-of-page bid range. Requires the geo and language IDs you intend to target so the volumes are relevant.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| seed_url | No | ||
| customer_id | Yes | ||
| language_id | No | 1000 | |
| seed_keywords | No | ||
| geo_target_ids | Yes | ||
| include_search_partners | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds useful behavioral context beyond that: the tool returns specific metrics and requires geo/language targeting for volume relevance, helping the agent understand output expectations and input sensitivity.
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 no filler. The main action and output are front-loaded, and the second sentence adds a necessary input prerequisite. 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?
With an output schema present and readOnly/openWorld annotations, the description covers the core inputs, output metrics, and a key prerequisite. Minor gaps like the effect of limit and include_search_partners are optional and have defaults, so the description is sufficiently complete for correct invocation in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does map 'seed terms and/or a URL' to seed_keywords and seed_url, and 'geo and language IDs' to geo_target_ids and language_id. However, it leaves limit, include_search_partners, and customer_id semantically unexplained, and slightly overstates language_id as required when it actually has a default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Generate keyword ideas from seed terms and/or a URL,' and specifies the returned metrics (search volume, competition, bid range). This clearly differentiates the tool from siblings like keyword_performance and keyword_volumes, which focus on existing keywords rather than generating new ideas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when keyword ideas are needed from seed terms or a URL. It also provides a prerequisite (geo and language IDs for relevant volumes), but it does not explicitly state when not to use it or name alternatives such as keyword_volumes for known keywords.
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.
41 tool updates
v0.1.0- First observed
ad_asset_performance - First observed
add_negative_keywords - First observed
add_rsa - First observed
add_shared_negative_keywords - First observed
apply_proposal - First observed
assign_ad_groups - First observed
audit_campaign - First observed
change_history - First observed
check_setup - First observed
conversion_actions - First observed
create_campaign - First observed
create_campaign_draft - First observed
dismiss_proposal - First observed
explain_capability - First observed
forecast_campaign - First observed
geo_performance - First observed
get_campaign - First observed
keyword_performance - First observed
keyword_volumes - First observed
list_accounts - First observed
list_campaign_drafts - First observed
list_campaigns - First observed
list_capabilities - First observed
list_proposals - First observed
list_shared_negative_lists - First observed
mutate - First observed
pause_ad_groups - First observed
pause_keywords - First observed
performance - First observed
policy_status - First observed
preview_campaign - First observed
preview_rsa - First observed
promote_campaign_draft - First observed
remove_campaign - First observed
remove_campaign_draft - First observed
revert_last_run - First observed
run_gaql - First observed
search_terms - First observed
set_networks - First observed
suggest_geo_targets - First observed
suggest_keywords
TDQS
Scored across 41 tools
Most tools target a distinct resource or action, and the descriptions clearly separate pairs like pause_keywords vs pause_ad_groups and add_negative_keywords vs add_shared_negative_keywords. However, the four performance-variant tools, the preview_campaign/forecast_campaign pair, and the governance tools (policy_status, list_capabilities, explain_capability) require careful reading to pick correctly, and the generic mutate/run_gaql escape hatches broadly overlap with the specific tools.
Almost all tool names are snake_case with an imperative verb first, following a list_/create_/preview_/pause_/remove_/promote_ pattern. The main deviations are the noun-style report tools like keyword_performance, ad_asset_performance, geo_performance, search_terms, and conversion_actions, which are consistent in style but not verb_noun. Overall the naming is predictable and readable.
At 41 tools, this is well over the 25-tool threshold and makes for a heavy selection surface that will consume significant agent context. The broad Google Ads scope justifies much of the breadth, but clusters like the four performance reports, the capability/proposal machinery, and the generic mutate path could be consolidated. It is capable but oversized.
The toolset covers the campaign lifecycle, keyword/ad group/ad operations, negative keywords, drafts, audits, forecasting, performance analysis, and governance, with mutate and run_gaql as escape hatches so there are no dead ends. A few common operations such as pausing/toggling campaigns or creating ad groups are not first-class tools and must go through mutate, and shared-list creation is left to raw API calls. These are workable gaps rather than blocking ones.
Maintenance
Related MCP Connectors
Google Ads MCP server — manage campaigns, keywords, and metrics.
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
1Hosted MCP server for Google Ads and LinkedIn Ads analysis.
AI agents that manage paid ads on Meta, LinkedIn, and Google Ads from any MCP client.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for AI agents to manage ad campaigns across Google, Meta, LinkedIn, Microsoft, Reddit, TikTok, and more2151 npm17MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that lets any LLM manage Google Ads campaigns from the terminal. Supports read and write operations.-
- AlicenseBqualityBmaintenanceOpen-source MCP server for Google Ads (Meta Ads coming soon) that lets AI assistants manage ad campaigns, reporting, keywords, and targeting in plain English from any MCP client, with safety-first creation of paused campaigns.54187 npm3MIT
- AlicenseAqualityAmaintenanceAn MCP server that provides read and write access to Google Ads, allowing natural language management of campaigns, budgets, ad groups, bids, and keywords, with dry-run validation for safety.18MIT