Skip to main content
Glama
monsieurgoodmood

google-ads-mcp-plus

google-ads-mcp-plus

Run your Google Ads account from Claude Code. Find wasted spend, fix it, and build campaigns — in plain language, on your own machine.

License: Apache 2.0 Tests Python

pipx install git+https://github.com/monsieurgoodmood/google-ads-mcp-plus.git

claude mcp add google-ads-plus \
  --env GOOGLE_ADS_DEVELOPER_TOKEN=your_token \
  --env GOOGLE_ADS_ALLOWED_CUSTOMERS=1234567890 \
  -- google-ads-mcp-plus

Then just ask.


What it finds

Real output, first run, on a live account (figures redacted):

GOOGLE ADS AUDIT — account 123456****
Window: 30 days
Findings: 3 critical, 1 warning, 4 info

[CRITICAL] search terms
           32 search term(s) spent 874.50 EUR with no conversions.
           Review as negative keyword candidates.

[CRITICAL] FR | Search | <campaign>
           Losing 16.6% of impressions to BUDGET. Converting campaign —
           raising budget likely buys more conversions.

[WARNING]  responsive search ads
           1 RSA(s) are weak (fewer than 8 headlines / 3 descriptions).

[INFO]     change history
           12 change(s) in the last 30 days, by: <user>.

That took one command. 13 read-only checks, no configuration.


Related MCP server: Google Ads MCP Server

Then ask it to fix things

"add the wasteful search terms as negatives"

Claude returns a preview — the exact list, and a confirmation token. Nothing has changed. You read it. If it's right, you confirm, and only then is anything written.

"which campaigns are budget-limited but converting?" "create a Performance Max campaign for this landing page, 20€/day" "who changed what in this account last month?" "pause the campaign that's spending with no conversions"


Why it's safe to point an LLM at a live ad account

A model driving real spend is riskier than a human typing a command: it can misread intent, and account content (campaign names, search terms written by strangers) enters its context as text. That's a prompt-injection surface.

So the server doesn't trust the model. Five layers, all enforced in code:

Layer

Effect

Account allowlist

Any customer ID not in GOOGLE_ADS_ALLOWED_CUSTOMERS is refused. Empty list = nothing reachable.

Writes off by default

Mutations need an explicit opt-in. Setting it without an allowlist stays read-only.

Two-phase commit

Every write returns a preview + token first. The token is fingerprinted to the parameters, single-use, and expires in 10 minutes — a token issued to raise a budget to €22 cannot be replayed to set €2200.

Hard numeric limits

Budget ceiling and max change %, checked in code. nan, inf and negatives are refused rather than silently disabling the guard.

Mutation log

Every executed write appended to JSONL with before/after values.

Campaigns are always created PAUSED.

These aren't claims — the safety layer was audited adversarially (12 bypass attempts, all refused) and the failures found were fixed. Details in docs/mcp-server.md.

This does not make an LLM safe to run unattended on a large account. It makes mistakes bounded and reversible. Start read-only, on one account, with a ceiling you'd tolerate losing in a day.


Nothing is hosted. Nothing is ours.

No server, no backend, no account to create, no usage limit — there's nothing to limit. The code runs on your laptop with your credentials, and the only network calls go straight from your machine to Google's API.

No telemetry, no phone-home, no analytics. Nobody else sees your data, including the author. All ad spend, all API usage, and all consequences are yours.

That's the difference from hosted third-party MCPs, which ask you to hand your account keys to someone else's server — a real trust and data-residency decision, and often a non-starter for client work.


The 13 tools

Read — always available

Tool

What it does

server_status

Current mode, allowlist, limits. Ask for this first.

list_accounts

Accounts your credentials reach, marking which are allowlisted.

run_audit

The 13 checks, as JSON.

list_campaigns

Campaigns with budget, status, spend, conversions.

gaql_query

Any read-only GAQL SELECT. Non-SELECT refused.

validate_ad_copy / validate_pmax_assets

Character limits, offline — no account needed.

Write — opt-in, two-phase

Tool

Notes

update_campaign_budget

Bounded by ceiling and max-change %.

set_campaign_status

Pause or enable. Enabling warns that spend starts.

add_negative_keywords

Per-campaign negatives. Safest write: spend can only go down.

apply_negative_keyword_list

Shared negative list — one edit updates every linked campaign. Idempotent.

create_shopping_campaign

Standard Shopping: budget, campaign, ad group, product ad, and an exhaustive listing group tree. Created PAUSED.

create_performance_max_campaign

One atomic mutate. The preview runs the API's own validate_only, so real API errors surface before anything exists. Created PAUSED.

The 13 audit checks

Conversion tracking (goal-based and legacy) · campaigns spending with zero conversions · budget-lost impression share · rank-lost impression share · wasteful search terms · low Quality Score keywords · weak RSAs · disapproved ads · missing negatives · missing sitelinks · single-ad ad groups · auto-tagging disabled · recent change history.

Text, Markdown or JSON output. Exit code 1 on critical findings, so it works as a cron monitor. Full reference: docs/audit.md.


Scope — what it does and doesn't do

Read is unlimited. GAQL reaches every readable resource: campaigns, keywords, ads, assets, audiences, conversions, search terms, Quality Score, change history. If you can write the query, you can read it.

Write is deliberately narrow. Every additional path multiplies the surface for expensive mistakes in a tool that spends real money.

Area

Supported

Not yet

Campaign type

Search (CLI), Performance Max and Standard Shopping (MCP tools)

Display, Video, Demand Gen, App

Operation

Create; update budgets, pause/enable, add negatives

Editing existing ads, bulk restructuring

Bidding

Search: max clicks, manual CPC. PMax: max conversions / conversion value, optional tCPA or tROAS

Changing an existing campaign's strategy, portfolio strategies

Targeting

Geo, language, ad schedule, negatives

Audiences, remarketing, Customer Match, demographics, devices

Assets

Sitelinks, callouts, structured snippets, call, price, promotion (reused by ID)

Uploading new images

Extensions welcome — see Contributing — provided they keep the safety model intact.


Setup

Prerequisites: Python 3.10+, a Google Cloud project with the Google Ads API enabled, your own OAuth Desktop client (the default gcloud client is blocked for the adwords scope), and a developer token with Basic access (a test-only token cannot touch production accounts).

The OAuth setup has real, non-obvious traps: the API Center only exists on manager (MCC) accounts, --no-browser prints a second command rather than a link, and — the one that bites everyone — an OAuth consent screen left in Testing expires your refresh token every 7 days. All of it is documented step by step in docs/setup-oauth.md. Read that first; it will save you an afternoon.

gcloud auth application-default login \
  --client-id-file=CLIENT.json \
  --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \
  --no-browser

export GOOGLE_ADS_DEVELOPER_TOKEN=YOUR_DEVELOPER_TOKEN

Configuration

Variable

Required

Purpose

GOOGLE_ADS_DEVELOPER_TOKEN

yes

Your developer token.

GOOGLE_ADS_ALLOWED_CUSTOMERS

yes

Comma-separated IDs this server may touch.

GOOGLE_ADS_MCP_ENABLE_WRITES

no

true to allow mutations. Default: read-only.

GOOGLE_ADS_LOGIN_CUSTOMER_ID

if MCC

Manager account ID.

GOOGLE_ADS_MAX_DAILY_BUDGET

no

Ceiling for any budget set here. Default 100.

GOOGLE_ADS_MAX_BUDGET_CHANGE_PCT

no

Largest single change. Default 50.

GOOGLE_ADS_MUTATION_LOG

no

JSONL log path. Default mutations.jsonl.

Set the ceiling above your existing budgets — below them, this server can never adjust those campaigns.

Other MCP clients

Works with any MCP client (Claude Desktop, Cursor, Gemini CLI). Config examples in docs/mcp-server.md.

Command line

Three commands ship with the package, for people who prefer a terminal:

google-ads-plus-audit --customer-id 1234567890 --days 90 --format markdown --output audit.md
google-ads-plus-campaign --config config.yaml --validate-only   # then --dry-run, then --live
google-ads-mcp-plus                                             # the MCP server

⚠️ The Search-campaign CLI does not share the server's safety model: no allowlist, no ceiling, no confirmation token, no log. See docs/write-layer.md.


Before you enable anything

Never put a campaign live without conversion tracking — that's blind spend. Link GA4 to Google Ads, import your key events, make the real goal biddable, and turn on auto-tagging: docs/conversions.md.

Some categories are restricted (Local Services, etc.) and need advertiser verification before serving: docs/policies.md. This project does not help with deceptive content or policy circumvention.


Tests

90 tests, fully offline — no API, no credentials:

pip install -e ".[dev]" && pytest -q

Documentation

Guide

Contents

setup-oauth.md

Credentials, end to end, with the real traps

mcp-server.md

Tools, safety model, client config

audit.md

The 13 checks, thresholds, adding your own

write-layer.md

Search campaign CLI, every flag

conversions.md

GA4 linking, auto-tagging

policies.md

Restricted categories, exemptions, EU political ads

read-mcp.md

Google's official read-only MCP

CLAUDE.md

Operating guide the agent reads before acting


Disclaimer

This is NOT an officially supported Google product. It is a community project. It complements Google's official read-only googleads/google-ads-mcp and uses the Google Ads API Python client library — both Google's work, Apache-2.0. This project is independent and not affiliated with or endorsed by Google.

Use at your own risk. You are responsible for every campaign, every euro spent, and for complying with Google Ads policies and applicable law.

License & attribution

Apache-2.0 — use, modify, distribute, and sell products built on this, including commercially and closed-source. The one obligation: keep the copyright headers and include the NOTICE file when redistributing.

Copyright 2026 ByteBerry Analytics LLC — @monsieurgoodmood. A ⭐ is appreciated, never required.

Contributing

Issues and PRs welcome. Most useful: more campaign types (Shopping, Display), bidding-strategy tools, additional audit checks, doc translations.

Two ground rules: never commit credentials, and keep the safety model intact — no PR that makes writing easier at the cost of the guardrails.

Available Tools

13 tools
add_negative_keywordsA

Add campaign-level negative keywords. Two-phase: preview, then confirm.

This is the safest write operation: negatives only ever reduce spend.

Args: customer_id: Account holding the campaign. campaign_id: Campaign to add negatives to. keywords: Terms to exclude. match_type: EXACT, PHRASE, or BROAD. Default EXACT. confirm_token: Token from the preview call. Omit for a preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsYes
match_typeNoEXACT
campaign_idYes
customer_idYes
confirm_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses the two-phase preview/confirm mechanism, the role of confirm_token, and the safety guarantee that negatives only reduce spend. It does not cover permissions or side effects on existing negatives, but the core behavioral traits are clearly explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: a one-line purpose, a safety note, and an enumerated Args section. Every sentence is informative with no redundancy, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The two-phase workflow and parameter semantics are well covered, and an output schema exists so return values are not required in the description. A minor gap is that it doesn't explicitly state the preview response returns a confirm_token, though this is implied by 'Token from the preview call. Omit for a preview.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All five parameters are documented in the Args block with meaningful descriptions (e.g., 'Terms to exclude', 'Token from the preview call. Omit for a preview.'), adding substantial value over the bare schema types/defaults. With 0% schema description coverage, this fully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence 'Add campaign-level negative keywords' uses a specific verb and resource, clearly stating the tool's function and scope. It does not explicitly distinguish from sibling apply_negative_keyword_list, but 'campaign-level' narrows the context, so it's clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool by naming the target resource and describing the two-phase flow, but it does not mention alternatives, exclusions, or when not to use it. The safety note 'safest write operation' provides context but not explicit usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_negative_keyword_listA

Create or extend a SHARED negative keyword list. Two-phase.

Prefer this over add_negative_keywords whenever the same exclusions apply to several campaigns: one shared list means one edit updates them all, instead of duplicating negatives campaign by campaign.

Idempotent — an existing list of the same name is reused, and only missing keywords and links are added. Running it twice does nothing.

Args: customer_id: Account holding the campaigns. list_name: Name of the shared list, e.g. "Brand exclusions". keywords: Terms to exclude. campaign_ids: Campaigns the list applies to. match_type: EXACT, PHRASE, or BROAD. PHRASE is the usual choice. confirm_token: Token from the preview call. Omit for a preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsYes
list_nameYes
match_typeNoPHRASE
customer_idYes
campaign_idsYes
confirm_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden, and it excels. It discloses idempotence ('Running it twice does nothing'), the reuse behavior of existing lists, the notion of a preview phase, and that only missing keywords/links are added. These are non-obvious traits an agent needs to know 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear summary first, then usage guidance, idempotence note, and an Args block. Each sentence adds value—no filler. The length is justified by the tool's complexity (two-phase, multiple parameters) and it is front-loaded with the most critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters and two-phase behavior, the description covers all essential aspects: purpose, when to use vs alternatives, idempotence, preview/confirm flow, and parameter semantics. The output schema exists, so return values need no explanation. There are no obvious gaps for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (context signals), so the description is the sole source of parameter meaning. It provides an 'Args' section explaining every parameter, including match_type guidance ('PHRASE is the usual choice') and confirm_token semantics ('Omit for a preview'). This fully compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create or extend a SHARED negative keyword list', which is a specific verb-resource pair and clarifies the scope (shared list). It explicitly distinguishes from the sibling tool add_negative_keywords by stating when to prefer this tool, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: 'Prefer this over add_negative_keywords whenever the same exclusions apply to several campaigns' and explains why (one edit updates all). It also covers the two-phase preview/confirm workflow, giving the agent clear context for when to invoke this tool and how to approach it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_performance_max_campaignA

Create a Performance Max campaign, PAUSED. Two-phase: preview, confirm.

Without a token, this validates the whole request against the API (validate_only) and returns a preview plus a confirmation token — nothing is created. Call again with the token to create it for real.

Everything goes in one atomic mutate: budget, campaign, geo/language criteria, negatives, asset group, text assets, and reused image and extension assets. If anything fails, nothing is created.

Image and extension assets are REUSED by ID — this tool never uploads images. Find existing asset IDs with gaql_query on the asset resource.

Args: customer_id: Account to create in. Must be allowlisted. campaign_name: Name of the new campaign. daily_budget: Daily budget in account currency. final_url: Landing page for the asset group. business_name: Advertiser name, max 25 characters. headlines: At least 3, each max 30 characters. long_headlines: At least 1, each max 90 characters. descriptions: At least 2, each max 90 characters. geo_target_ids: Geo target constant IDs. language_ids: Language constant IDs (1002 = French, 1000 = English). negative_keywords: Phrase-match exclusions, e.g. brand terms. marketing_image_asset_ids: Existing 1.91:1 image asset IDs. square_marketing_image_asset_ids: Existing 1:1 image asset IDs. logo_asset_ids: Existing logo asset IDs. sitelink_asset_ids: Existing sitelink asset IDs to link. callout_asset_ids: Existing callout asset IDs (max 20). bidding: maximize_conversions or maximize_conversion_value. target_cpa: Optional target CPA, account currency. target_roas: Optional target ROAS, e.g. 3.5. confirm_token: Token from the preview call. Omit for a preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
biddingNomaximize_conversions
final_urlYes
headlinesYes
target_cpaNo
customer_idYes
target_roasNo
daily_budgetYes
descriptionsYes
language_idsNo
business_nameYes
campaign_nameYes
confirm_tokenNo
geo_target_idsNo
logo_asset_idsNo
long_headlinesYes
callout_asset_idsNo
negative_keywordsNo
sitelink_asset_idsNo
marketing_image_asset_idsNo
square_marketing_image_asset_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description takes on the full transparency burden. It discloses crucial behaviors: the campaign is created PAUSED, the two-phase validation prevents accidental creation, the entire operation is atomic ('If anything fails, nothing is created'), and it never uploads images ('this tool never uploads images'). It also mentions the allowlist requirement for customer_id, adding 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured effectively: it leads with the core purpose, then explains the two-phase flow, atomicity, and asset reuse, followed by a comprehensive but concise Args list. Every sentence adds necessary information, and the length is proportionate to the tool's complexity (20 parameters). It avoids redundancy and is front-loaded with the most critical facts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with 20 parameters and two-phase behavior, the description covers all essential aspects: purpose, usage phases, atomic behavior, asset reuse, parameter semantics, and related tool guidance. An output schema exists to describe return values, and the description does not need to repeat that. The description is sufficient for an agent to invoke this tool correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explicitly defining all 20 parameters in the Args block. It gives constraints (e.g., 'at least 3' headlines, 'max 25 characters' for business_name), examples (language_ids: '1002 = French, 1000 = English'), and clarifies optional fields (target_cpa, target_roas). This turns a bare parameter list into actionable guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'Create a Performance Max campaign, PAUSED.' It also introduces the two-phase preview/confirm flow, which distinguishes it from simpler create tools. The resource (Performance Max campaign) and key attributes (paused, atomic, asset reuse) are clearly stated, setting it apart from siblings like create_shopping_campaign.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the preview vs. confirm path ('Without a token... validates... Call again with the token to create it for real'). It also directs users to gaql_query for finding existing asset IDs, acknowledging an alternative tool. While it doesn't explicitly contrast with all campaign-creation siblings, the context is clear enough for an agent to select this tool appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_shopping_campaignA

Create a Standard Shopping campaign, PAUSED. Two-phase.

Builds budget, campaign, ad group, an empty product ad, and an exhaustive listing group tree: one biddable node per included value, plus a mandatory excluded catch-all for everything else.

Without a token you get a preview validated by the API; call again with the token to create it.

Args: customer_id: Account to create in. Must be allowlisted. campaign_name: Name of the new campaign. daily_budget: Daily budget in account currency. merchant_id: Merchant Center account holding the product feed. feed_label: Feed label, exactly as it appears in Merchant Center. This replaced sales_country. include_values: Values to bid on, e.g. the exact product_type strings from Merchant Center. Everything else is excluded. dimension: product_type_level1/2/3, brand, condition, or item_id. ad_group_name: Defaults to the campaign name. campaign_priority: 0 low, 1 medium, 2 high. Decides which campaign bids when several cover the same product. geo_target_ids: Geo target constant IDs. language_ids: Language constant IDs (1002 French, 1000 English). confirm_token: Token from the preview call. Omit for a preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
dimensionNoproduct_type_level1
feed_labelYes
customer_idYes
merchant_idYes
daily_budgetYes
language_idsNo
ad_group_nameNo
campaign_nameYes
confirm_tokenNo
geo_target_idsNo
include_valuesYes
campaign_priorityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the campaign is created paused, builds a specific structure (budget, campaign, ad group, empty product ad, exhaustive listing group tree), and the two-phase preview/confirm behavior. It also includes operational details like the mandatory excluded catch-all and the allowlisted customer_id requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a concise summary followed by a clear Args list. Every sentence provides meaningful information, from the PAUSED state to the exhaustive listing group tree, with no wasted words. It is appropriately detailed for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (12 params, two-phase flow, detailed construction logic), the description is complete. It covers what the tool does, how to use it, all parameter details, and the preview/confirm behavior, while the output schema presumably explains the return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description provides thorough explanations for all 12 parameters, adding meaning beyond the schema. Examples include clarifying feed_label replaces sales_country, dimension allowed values, campaign_priority semantics, and language/geo ID formats. This fully compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Create a Standard Shopping campaign, PAUSED' with a specific verb and resource, clearly distinguishing it from the sibling create_performance_max_campaign. It further details the two-phase creation, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the two-phase usage: omit confirm_token for a preview, then call again with the token to create. It also notes the prerequisite that customer_id must be allowlisted. However, it does not explicitly mention when to use this over alternatives like PMax, though the name and context imply it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gaql_queryA

Run a read-only GAQL query against an account.

Use this for anything the packaged tools do not cover. Only SELECT queries are accepted — this cannot modify data.

Args: customer_id: Account to query. query: A GAQL SELECT statement. limit: Maximum rows to return (default 100, hard cap 1000).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
customer_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden for behavioral disclosure. It clearly discloses read-only behavior, restriction to SELECT queries, and inability to modify data. It also mentions the limit's default and hard cap, providing important execution context. Minor absence of pagination/error details, but core behavioral traits are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized: a concise purpose statement, a usage directive, and a clear args list. Every sentence earns its place, with no redundant filler or repetition of schema fields without added value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's flexibility and the presence of an output schema, the description covers essential context: what it does, when to use it, and its security constraints. It omits details like query language specifics or potential error cases, but for a generic query tool, this is adequate and complete for most agents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully documents all three parameters: customer_id as account, query as a GAQL SELECT statement, and limit with default/hard cap. This adds meaning that the bare schema lacks, fully compensating for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Run a read-only GAQL query against an account', specifying the verb, resource, and scope. It distinguishes itself from sibling tools by positioning as a catch-all for anything not covered by packaged tools, making its purpose unique and clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides usage context: 'Use this for anything the packaged tools do not cover.' It also states constraints (only SELECT accepted) without listing all siblings as alternatives, which is sufficient because the sibling list is visible and this tool explicitly covers the gaps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_accountsA

List Google Ads accounts these credentials can reach.

Returns every accessible customer ID, marking which are allowlisted for this server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It discloses that the tool returns 'every accessible customer ID' and marks allowlisted ones, providing meaningful behavioral detail about the output. Since it's a read-only list operation, no side effects are expected, and the description adequately covers the behavior without needing to mention auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—two sentences that get straight to the point. The first sentence states the action, and the second describes the output. Every word earns its place with no fluff, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, zero-parameter tool with an output schema, the description is complete. It explains what the tool lists and the specific detail about allowlisted accounts, which is the key differentiator. The output schema likely handles return format details, so the description doesn't need to elaborate further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to elaborate. The description covers all necessary context about what the tool returns, which is sufficient given the absence of parameters. The empty schema means 100% coverage, but the description adds value by explaining the output's meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'Google Ads accounts these credentials can reach,' immediately conveying what the tool does. It also distinguishes itself from sibling tools like list_campaigns by specifying 'accounts' and the 'accessible' scope, making it unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by explaining it returns all accessible customer IDs and highlights allowlisted accounts. While it doesn't explicitly mention when to use it over alternatives or exclusions, the purpose is obvious from the description, and no specific alternative is needed for a zero-parameter listing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_campaignsA

List campaigns with their budget, status, spend and conversions.

Args: customer_id: Account to inspect. days: Metrics lookback window, ending yesterday. status: ENABLED, PAUSED, REMOVED, or ALL.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
statusNoENABLED
customer_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It does add useful context: days is a lookback window ending yesterday, and status values are enumerated (ENABLED, PAUSED, REMOVED, ALL). However, it does not mention pagination, permissions, or whether results are filtered by default beyond the status parameter, leaving some ambiguity for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: one sentence for the purpose followed by a brief structured Args block. Every sentence adds value, no fluff, and the format is easy to parse. It is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description does not need to explain return values. The parameter explanations are sufficient for invocation. However, it lacks any discussion of limitations (e.g., maximum days, pagination) or a hint that customer_id might come from list_accounts, leaving minor gaps for a tool of this simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description's Args section is the sole source of parameter meaning. It explains customer_id as 'Account to inspect', days as a lookback window ending yesterday, and status as a filter with explicit values. This fully compensates for the lack of schema descriptions and adds semantics beyond mere parameter titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('List campaigns') with the specific fields returned (budget, status, spend, conversions). It is unambiguous about the resource and operation, but it does not explicitly contrast with sibling tools like gaql_query, which could also be used to retrieve campaign data. Thus it meets the 'clear but no sibling differentiation' criterion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention that gaql_query is for custom queries or that this is the default listing tool. The description simply lists parameters without contextualizing when this should be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_auditA

Audit an account and report what is costing money or hiding data.

Runs 12 read-only checks: conversion tracking, campaigns spending with no conversions, budget- and rank-lost impression share, wasteful search terms, low Quality Score keywords, weak RSAs, disapproved ads, missing negatives and sitelinks. Never modifies anything.

Args: customer_id: Account to audit (digits, dashes are stripped). days: Lookback window; the window ends yesterday. Default 30. min_spend: Ignore entities below this spend, in account currency.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
min_spendNo
customer_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description discloses the key safety trait: 'Never modifies anything' and lists the checks, which are all read-only. It also notes that the lookback window ends yesterday, adding behavioral nuance. It lacks details like rate limits or auth, but the essential safety profile is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, a list of checks, and an Args section. Every sentence adds value, and the length is appropriate for a tool with this complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, safety, and parameters, while the output schema exists to handle return values. It is complete for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates fully with an Args section that explains each parameter: customer_id (digits, dashes stripped), days (lookback window ending yesterday, default 30), and min_spend (ignore entities below spend in account currency). This goes well beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Audit' with a clear resource ('an account') and outcome ('report what is costing money or hiding data'). It distinguishes itself from sibling tools like list_accounts or gaql_query by focusing on comprehensive read-only checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it runs a comprehensive set of 12 read-only checks and explicitly states it never modifies anything, making it suitable for auditing without side effects. However, it does not explicitly mention when not to use it or compare it to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

server_statusA

Report this server's mode, allowlisted accounts, and safety limits.

Call this first if you are unsure what the server is permitted to do.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. 'Report' indicates a read-only operation, and 'Call this first' suggests it is a safe, non-destructive starting point. It doesn't explicitly state side effects or permission requirements, but for a status/report tool this is adequately covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, then a practical usage hint. No wasted words; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (0 parameters), has an output schema for return values, and the description covers what it reports and when to use it. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema shows no properties. The description doesn't need to document parameter syntax. A baseline of 4 applies for tools with no parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Report' and names three concrete resources: mode, allowlisted accounts, and safety limits. This clearly distinguishes it from sibling tools like list_accounts or run_audit, which focus on different aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool ('Call this first if you are unsure what the server is permitted to do'), providing a clear condition. It doesn't explicitly name alternatives or exclusions, but the 'first' instruction implies precedence over other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_campaign_statusA

Pause or enable a campaign. Two-phase: preview, then confirm.

Args: customer_id: Account holding the campaign. campaign_id: Campaign to change. status: PAUSED or ENABLED. confirm_token: Token from the preview call. Omit for a preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
campaign_idYes
customer_idYes
confirm_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently reveals the two-phase nature of the operation and clarifies the status field values. It does not disclose error behavior, permissions, or side effects beyond the state change, but the core preview-confirm behavior is well explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the primary purpose, and follows with a clean argument list. Every sentence earns its place; there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and an output schema, the description covers the essential workflow and parameters. It lacks explicit mention of prerequisites, error handling, or confirmation semantics beyond 'token from preview,' but overall it provides enough context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates by explaining each parameter: customer_id, campaign_id, status (with valid values), and confirm_token (with its purpose and omission rule). This adds substantial meaning beyond the bare schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb and resource: 'Pause or enable a campaign.' It is distinct from sibling tools like list_campaigns or update_campaign_budget, leaving no ambiguity about what action this tool performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on the two-phase workflow ('preview, then confirm') and explicitly instructs to omit confirm_token for a preview. It does not explicitly name alternatives or exclusions, but the workflow guidance is sufficient for correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_campaign_budgetA

Change a campaign's daily budget. Two-phase: preview, then confirm.

Call without confirm_token to see the current value, the proposed value, and the percentage change. If it is within limits you receive a token; call again with that token to apply it.

Args: customer_id: Account holding the campaign. campaign_id: Campaign whose budget changes. new_daily_budget: New daily amount in account currency. confirm_token: Token from the preview call. Omit for a preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYes
customer_idYes
confirm_tokenNo
new_daily_budgetYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It transparently explains the preview/confirm flow, including what the preview returns (current value, proposed value, percentage change) and the condition for token issuance ('If it is within limits'). However, it does not disclose error scenarios or what happens if limits are exceeded, but the output schema may cover return details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and appropriately sized. It opens with a one-sentence purpose, then explains the two-phase process, then lists arguments with concise explanations. No fluff; every sentence contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's two-phase complexity, the description is complete. It explains the workflow, the token mechanics, and all parameters. The presence of an output schema mitigates the need to describe return structures in detail. The description fully equips an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It does so comprehensively: customer_id as 'Account holding the campaign', campaign_id as 'Campaign whose budget changes', new_daily_budget as 'New daily amount in account currency', and confirm_token with clear omit-for-preview guidance. This adds significant meaning beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Change a campaign's daily budget.' It uses a specific verb (change) and resource (campaign's daily budget), and the two-phase preview/confirm detail distinguishes it from sibling tools like set_campaign_status or list_campaigns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage instructions: call without confirm_token to preview, then call again with token to apply. It clearly explains the two-step process, but does not mention exclusions or alternatives (e.g., when not to use this tool). This is clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_ad_copyA

Check ad copy against Google's character limits — offline, no account.

Use this while drafting, before creating anything. Headlines must be <=30 characters, descriptions <=90, paths <=15. Counts CJK and full-width characters as two, matching the Google UI.

ParametersJSON Schema
NameRequiredDescriptionDefault
path1No
path2No
headlinesYes
descriptionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well by disclosing the tool's offline nature, specific character limits (headlines <=30, descriptions <=90, paths <=15), and the CJK/full-width counting behavior 'matching the Google UI.' It does not detail return values or edge-case handling, but this is somewhat mitigated by the presence of an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded. Three sentences each earn their place: the purpose, the usage timing, and the specific rules. No fluff or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple validation tool with an output schema, the description covers purpose, timing, and detailed rules. It does not explain that headlines/descriptions are arrays or how invalid input is handled, but those are likely evident from the schema and output schema. Overall, it is sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 by explaining the constraints for the key parameters: headlines and descriptions with their character limits, and paths with a limit. It does not explicitly name path1/path2, but 'paths' clearly maps to both. The explanation adds meaningful context beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action: 'Check ad copy against Google's character limits' with a specific resource (ad copy) and domain (Google). It distinguishes itself from siblings like validate_pmax_assets by focusing on character limits and by highlighting 'offline, no account' as a key differentiating context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Use this while drafting, before creating anything.' It implies this is a pre-flight check before account-level actions, but does not explicitly mention alternatives or exclusions, so it lacks the full when-not/alternatives detail needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_pmax_assetsA

Check Performance Max TEXT assets against Google's limits — offline.

No account, no credentials needed. Use this while drafting copy, before creating anything: at least 3 headlines (30 chars), 1 long headline (90 chars), 2 descriptions (90 chars), and a business name (25 chars).

This checks text only. Creating a campaign additionally requires at least one marketing image (1.91:1), one square marketing image (1:1), and one logo — those are validated by create_performance_max_campaign, not here.

ParametersJSON Schema
NameRequiredDescriptionDefault
final_urlNohttps://example.com
headlinesYes
descriptionsYes
business_nameYes
long_headlinesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the full burden. It transparently states the operation is offline, requires no credentials, and is text-only, implying a non-mutating read-only check. It does not describe return behavior, but an output schema exists to cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs, front-loaded with the core purpose, and every sentence adds functional information about scope, usage timing, or parameter constraints. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity and the presence of an output schema, the description covers everything necessary: purpose, usage context, parameter constraints, scope boundaries, and sibling differentiation. It leaves nothing critical unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates powerfully by specifying required counts and character limits for headlines, long_headlines, descriptions, and business_name. It omits any explanation of final_url, but that parameter is optional and self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Check Performance Max TEXT assets against Google's limits — offline.' It clearly differentiates from siblings by explicitly stating that image validation is handled by create_performance_max_campaign, not here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing guidance ('Use this while drafting copy, before creating anything') and clarifies what it does not cover, naming the alternative tool for image validation. This provides clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updatesv0.1.0
    • First observedadd_negative_keywords
    • First observedapply_negative_keyword_list
    • First observedcreate_performance_max_campaign
    • First observedcreate_shopping_campaign
    • First observedgaql_query
    • First observedlist_accounts
    • First observedlist_campaigns
    • First observedrun_audit
    • First observedserver_status
    • First observedset_campaign_status
    • First observedupdate_campaign_budget
    • First observedvalidate_ad_copy
    • First observedvalidate_pmax_assets

TDQS

A4.3/5.0
Disambiguation4/5

Most tools are clearly distinct, but validate_pmax_assets and validate_ad_copy both check ad copy limits, and add_negative_keywords vs apply_negative_keyword_list have overlapping purposes (campaign-level vs shared list). These pairs could cause misselection, though descriptions clarify the differences.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern (list_accounts, update_campaign_budget, create_performance_max_campaign, etc.). Even server_status fits as a status check. No mixed conventions or vague verbs.

Tool Count5/5

13 tools is well-scoped for a Google Ads management server. Each tool serves a distinct function, and the count is neither too thin nor bloated. It covers auditing, querying, campaign management, and offline validation without unnecessary redundancy.

Completeness4/5

The toolset covers core lifecycle operations: list, create, update (budget/status), and add negatives, plus a raw GAQL escape hatch. Missing delete operations (e.g., remove campaign, remove negative keyword) are the only notable gap, but the audit and query tools compensate for exploratory needs.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables reading and mutating Google Ads campaigns via MCP tools, and includes structured marketer workflows for search term mining, budget optimization, and weekly reviews.
    83
    5
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that extends the official Google Ads MCP with safe, confirmed campaign administration across manager accounts, featuring immutable mutation plans, multi-step approvals, and post-write verification.
    8
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for managing Google Ads campaigns through the official Google Ads API, covering accounts, campaigns, budgets, keywords, search terms, and keyword ideas. It provides tools for both reading and mutating live ads data, such as pausing campaigns, updating budgets, and adding keywords.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/monsieurgoodmood/google-ads-mcp-plus'

If you have feedback or need assistance with the MCP directory API, please join our Discord server