Marvento Ads MCP
OfficialProvides tools for managing Google Ads campaigns, ad groups, ads, and assets, including creating budgets, campaigns, keywords, responsive search ads, sitelinks, callouts, and conversion actions, as well as GAQL search and resource metadata discovery.
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., "@Marvento Ads MCPCreate a new Search campaign for hiking gear, paused, with a $50 daily budget."
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.
Marvento Ads MCP
A fork of Google's official google-ads-mcp that adds write tools so an AI agent can build and run Google Ads campaigns, plus a one-command VPS deployment (Docker + Caddy, automatic HTTPS) so the server can be reached from any MCP client as a remote connector.
Upstream stays intact underneath: the OAuth login flow, GAQL search,
get_resource_metadata and list_accessible_customers are Google's code.
Everything below the line "Google Ads MCP Server" is the upstream README.
What this fork adds
Namespace | Tools |
|
|
|
|
|
|
|
|
Safety rails, enforced in code (ads_mcp/mutate.py):
New campaigns are always created PAUSED. Enabling is a separate call.
Anything that starts or raises spend, or removes something, needs
confirm=true. Without it the call is validated by Google and returned as a preview; nothing changes.Daily budgets are capped by
ADS_MCP_MAX_DAILY_BUDGET(server env, default 500).Every tool accepts
validate_only=truefor a dry run.Responsive search ad copy is checked against Google's limits before the API call.
Run the server read-only by setting the four write namespaces to false in tools_config.yaml.
Related MCP server: Google Ads MCP Server
Deploying
See deploy/: docker-compose.yml + Caddyfile for any Docker host,
cloud-init.yaml + create_droplet.py for a fully automated DigitalOcean droplet.
Operations, decisions and current state live in DOCUMENTATION.md
and HANDOVER.md.
Google Ads API access is granted per Google Cloud project since 2026-09-09 (developer tokens are sunset). A new project starts at Test access; production accounts need Explorer or Basic. See DOCUMENTATION.md, section "Google access levels".
Google Ads MCP Server
This repo contains the source code for running an MCP server that interacts with the Google Ads API.
Tools
The server uses the Google Ads API to provide several Tools and Resources for use with LLMs and AI agents.
Tools available
search: Retrieves information about the Google Ads account.get_resource_metadata: Retrieves metadata about a Google Ads API resource type, for example "campaign". This is useful to understand the structure of the data and what fields are available for querying.list_accessible_customers: Returns ids of customers directly accessible by the user authenticating the call.
Configuring and Namespacing Tools
The Google Ads MCP server uses the tools_config.yaml to let you selectively enable or disable individual tools or tool categories (namespaces) and customize their namespace prefixes.
A default tools_config.yaml with all tools enabled is bundled with the package, so the server works out of the box with no extra setup. To customize your installation, the server resolves the configuration in the following order:
An explicit path set via the
GOOGLE_ADS_MCP_TOOLS_CONFIGenvironment variable.A
tools_config.yamlfile in the current working directory.The default
tools_config.yamlbundled with the package.
If an explicitly requested configuration file (via the environment variable) is missing, or any resolved file is invalid, the server raises an error and fails to start.
Configuration Example:
namespaces:
# Option 1: Enable category 'customers' with default prefix -> "customers_list_accessible_customers"
customers: true
# Option 2: Enable category 'search' with a custom prefix -> "query_search"
search: "query"
# Option 3: Fine-grained control over tools in a category
metadata:
enabled: true
prefix: "metadata"
enabled_tools:
- get_resource_metadata: trueResources available
discovery-document: Retrieve the Google Ads API discovery document. Provides the discovery document for the latest version of the Google Ads API, which describes the API surface, including resources, methods, and schemas. Host LLMs should access this resource to understand the structure of the Google Ads API and discover available features.metrics: Retrieve information about the metrics available for reporting in the Google Ads API.segments: Retrieve information about the segments available for reporting in the Google Ads API.release-notes: Retrieve the release notes for the latest version of the Google Ads API.
Notes
The MCP Server will expose your data to the Agent or LLM that you connect to it.
If you have technical issues, please use the GitHub issue tracker.
To help us collect usage data, you will notice an extra header has been added to your API calls: this data is used to improve the product.
Setup instructions
Setup involves the following steps:
Configure Python.
Configure Developer Token.
Enable APIs in your project
Configure Credentials.
Configure your MCP client.
Configure Python
After a version has been published to PyPI, you can run that exact version instead of following the latest repository state:
pipx run --spec "google-ads-mcp==X.Y.Z" google-ads-mcpConfigure Developer Token (Optional)
If your setup requires a developer token, follow the instructions for Obtaining a Developer Token.
Your developer token must have at least Explorer access to query production accounts. New tokens may be automatically upgraded to Explorer access; if not, you can apply through the API Center. See the access levels documentation for details.
If you see the error "The developer token is only approved for use with test accounts", your token does not yet have access to production accounts. See the access levels documentation for how to request the access level you need.
Enable APIs in your project
Follow the instructions to enable the following APIs in your Google Cloud project:
Configure Credentials
Option 1: Using FastMCP OAuth Proxy
The server supports FastMCP's OAuth proxy feature for dynamic user authentication. This is useful when running the server as a web service.
To enable it, set the following environment variables:
GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: Your Google Cloud OAuth 2.0 Client ID.GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: Your Google Cloud OAuth 2.0 Client Secret.GOOGLE_ADS_MCP_BASE_URL: (Optional) The base URL where the server is accessible (defaults tohttp://localhost:8080).GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (Optional) Secret key used to sign FastMCP JWT tokens across multiple server instances or deployments.GOOGLE_ADS_MCP_STORAGE_TYPE: (Optional) Storage backend for OAuth state (filetree,redis,firestore, ormemory).GOOGLE_ADS_MCP_STORAGE_PATH: (Optional) Directory path forfiletreepersistent storage.GOOGLE_ADS_MCP_STORAGE_REDIS_URL: (Optional) Redis URL forredispersistent storage.GOOGLE_ADS_MCP_STORAGE_FIRESTORE_PROJECT: (Optional) Google Cloud project forfirestorepersistent storage. Defaults to the project inferred from Application Default Credentials. Setting it selects thefirestorebackend even ifGOOGLE_ADS_MCP_STORAGE_TYPEis unset.GOOGLE_ADS_MCP_STORAGE_FIRESTORE_DATABASE: (Optional) Firestore database name forfirestorepersistent storage. Defaults to(default).GOOGLE_ADS_MCP_STORAGE_ENCRYPTION_KEY: (Optional) Encryption key for stored OAuth tokens.GOOGLE_ADS_MCP_STORAGE_DISABLE_ENCRYPTION: (Optional) Set totrueto disable token encryption.
The redis and firestore backends need their storage library installed
alongside the server: pip install py-key-value-aio[redis] and
pip install google-ads-mcp[firestore] respectively.
Once this is enabled, you can authenticate to the API through your MCP client.
When these variables are set, the server automatically switches to the
streamable-http transport instead of stdio.
You will need to run the server as a separate process and configure your MCP
client to connect to the Streamable HTTP endpoint (for example,
http://localhost:8080/mcp).
Local WSL and Podman deployment
This deployment has been tested with rootless Podman in WSL and exposes a single
Streamable HTTP endpoint at http://localhost:8080/mcp. Build the image from
the repository inside WSL:
podman build --tag localhost/google-ads-mcp:latest --file Dockerfile .Keep server credentials out of MCP client configuration. The tested Quadlet
loads Google Ads and OAuth settings from a private host-side file through
EnvironmentFile= and uses a separate named volume for persistent encrypted
OAuth state:
[Container]
Image=localhost/google-ads-mcp:latest
PublishPort=127.0.0.1:8080:8080
EnvironmentFile=/absolute/host/path/google-ads-mcp.env
Volume=google-ads-mcp-oauth.volume:/var/lib/google-ads-mcp:rw
ReadOnly=true
NoNewPrivileges=true
DropCapability=allThe environment file and the OAuth-state volume serve different purposes: the
volume does not contain the .env file. Keep the environment file outside the
repository, restrict it to the service owner, and never commit it. Antigravity
and Codex then need only the MCP endpoint and their own OAuth authorization;
they do not need the server's Google Ads developer token, OAuth client secret,
or signing and storage keys. Publish port 8080 only on the loopback interface
when the server is intended for local agents.
The endpoint deliberately keeps stateful Streamable HTTP enabled. It supports
legacy MCP 2025 clients that use Mcp-Session-Id and GET SSE as well as MCP
2026 clients that use sessionless POST requests and subscriptions/listen.
Do not enable FastMCP's stateless_http option on this shared endpoint; doing
so removes the legacy GET channel.
The server runs on FastMCP 4 (fastmcp>=4.0.3) paired with mcp[cli]==2.0.0. The Docker build also applies a version-guarded
OAuth metadata workaround for Codex CLI 0.146. It stops advertising the RFC
9207 authorization-response iss parameter as mandatory while FastMCP still
includes it in redirects. The build fails if the expected FastMCP version or
patch location changes, so upgrades require explicit interoperability tests.
For Codex, configure and authenticate the server as described in the official Codex MCP documentation:
codex mcp add google_ads --url http://localhost:8080/mcp
codex mcp login google_adsFor Antigravity, configure the same URL as serverUrl in its MCP configuration.
This key is required for Streamable HTTP in Antigravity 2.8.1 and Antigravity
IDE 2.5.5; httpUrl is not accepted by those versions. After authentication,
both clients should list these namespaced tools:
customers_list_accessible_customersmetadata_get_resource_metadatasearch_search
Option 2: Configure credentials using Application Default Credentials
Configure your Application Default Credentials (ADC). Make sure the credentials are for a user with access to your Google Ads accounts or properties.
Credentials must include the Google Ads API scope:
https://www.googleapis.com/auth/adwordsCheck out Manage OAuth Clients for how to create an OAuth client.
Here are some sample gcloud commands you might find useful:
Set up ADC using user credentials and an OAuth desktop or web client after downloading the client JSON to
YOUR_CLIENT_JSON_FILE.gcloud auth application-default login \ --scopes https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \ --client-id-file=YOUR_CLIENT_JSON_FILESet up ADC using service account impersonation.
gcloud auth application-default login \ --impersonate-service-account=SERVICE_ACCOUNT_EMAIL \ --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform
When the gcloud auth application-default command completes, copy the
PATH_TO_CREDENTIALS_JSON file location printed to the console in the
following message. You will need this for a later step!
Credentials saved to file: [PATH_TO_CREDENTIALS_JSON]Option 3: Configure credentials using the Google Ads API Python client library.
Follow the instructions to setup and configure the Google Ads API Python client library
If you have already done this and have a working google-ads.yaml , you can reuse this file!
In the utils.py file, change get_googleads_client() to use the load_from_storage() method.
Configure your MCP client
Add the server to your MCP client's configuration. Below are examples for popular clients.
Antigravity / Antigravity IDE
Install Antigravity or Antigravity IDE.
Configure your server. Refer to the docs at https://antigravity.google/docs/mcp for details on setting up MCP servers.
Option 1: Using FastMCP OAuth Proxy (Streamable HTTP)
You can run the server as a separate process and configure your MCP client to connect to the Streamable HTTP endpoint (for example,
http://localhost:8080/mcp). This also allows using FastMCP's OAuth proxy feature for dynamic user authentication.Antigravity 2.8.1 and Antigravity IDE 2.5.5 require
serverUrlfor a Streamable HTTP server. Do not use the olderhttpUrlkey. Server-side credentials belong in the server process, not in this client configuration.{ "mcpServers": { "google-ads-mcp": { "serverUrl": "http://localhost:8080/mcp" } } }Option 2: the Application Default Credentials method
This remains a supported alternative, but it provides less credential isolation than the server-managed Streamable HTTP deployment above. The MCP client starts the server and its configuration contains the ADC file path and Google Ads developer token. Prefer the Quadlet deployment when several local clients share the same server or client configuration may be copied, synchronized, or inspected by other tools.
Replace
PATH_TO_CREDENTIALS_JSONwith the path you copied in the previous step.We also recommend that you add a
GOOGLE_CLOUD_PROJECTattribute to theenvobject. ReplaceYOUR_PROJECT_IDin the following example with the project ID of your Google Cloud project.{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": [ "run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp" ], "env": { "GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON", "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }Option 3: the Python client library method
{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": [ "run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp" ], "env": { "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }
Login Customer Id
If your access to the customer account is through a manager account, you can
either provide the manager account's customer ID per tool call via the optional
login_customer_id parameter, or set GOOGLE_ADS_LOGIN_CUSTOMER_ID in the
settings file as a default (the per-call login_customer_id parameter takes
precedence when specified).
See here for details.
The final file will look like this:
{
"mcpServers": {
"google-ads-mcp": {
"command": "pipx",
"args": [
"run",
"--spec",
"git+https://github.com/googleads/google-ads-mcp.git",
"google-ads-mcp"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON",
"GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID",
"GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "YOUR_MANAGER_CUSTOMER_ID"
}
}
}
}Other MCP clients (Claude Code, Cursor, VS Code, etc.)
The mcpServers block format is the same across all MCP clients. Add the configuration shown above to the appropriate settings file for your client (e.g., ~/.claude/settings.json for Claude Code, .cursor/mcp.json for Cursor, .vscode/mcp.json for VS Code with Copilot).
Deployment to Google Cloud Platform
Instead of hosting this MCP server locally, you can host it on Google Cloud Run or on any other cloud-based infrastructure. This is useful if you want to share the server across different agents or run it as a web service.
Note that this only supports authentication with an OAuth Client ID and Client Secret pair through the OAuth proxy (Option #1 above).
Prerequisites
A Google Cloud project.
The
gcloudCLI installed, authenticated, and active project set.gcloud config set project YOUR_PROJECT_ID
Step 1: Build and Push Docker Image
You can use Cloud Build to build and push the image to Artifact Registry without needing Docker installed locally.
Create a repository in Artifact Registry:
gcloud artifacts repositories create mcp-servers --repository-format=docker --location=us-central1Build and submit the image:
gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest .Replace
YOUR_PROJECT_IDwith your Google Cloud project ID.
Step 2: Deploy to Google Cloud Run
Make sure to set the required environment variables:
GOOGLE_PROJECT_ID: Your Google Cloud project ID.GOOGLE_ADS_DEVELOPER_TOKEN: (Optional) The developer token you want the MCP server to use (see above).GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: The OAuth Client ID you want the MCP server to use.GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: The OAuth Client secret you want the MCP server to use.GOOGLE_ADS_MCP_BASE_URL: The base URL where your MCP server is accessible: this will be automatically assigned by Google Cloud Run after your first deployment. You can update the environment variables after deployment.GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (Recommended for production) Persistent JWT signing key across Cloud Run instances.GOOGLE_ADS_MCP_STORAGE_TYPE: (Recommended for production) Storage backend to persist OAuth tokens across instances. Set it tofirestoreto use Firestore through Application Default Credentials, which needs no VPC connector, or toredisalong withGOOGLE_ADS_MCP_STORAGE_REDIS_URL.Using
firestorerequires three things: build the image with the extra installed (change the Dockerfile touv pip install --system .[firestore]), create a Firestore database in the project, since one is not provisioned automatically, and grant the Cloud Run service accountroles/datastore.user. Note that entries are not expired automatically: the store filters expired entries on read but never deletes them, andexpires_atis written as a string, so a Firestore TTL policy cannot collect them either. Plan on a periodic cleanup job for long-running deployments. Redis expires entries on its own.FASTMCP_HOST: Set this to0.0.0.0to allow FastMCP to accept connections from all IP addresses.GOOGLE_ADS_LOGIN_CUSTOMER_ID: Required if your access to the customer account is through a manager account. Set it to the customer ID of the manager account. See Login Customer Id above for details.
gcloud run deploy google-ads-mcp \
--image us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--set-env-vars="GOOGLE_PROJECT_ID=YOUR_PROJECT_ID,GOOGLE_ADS_DEVELOPER_TOKEN=YOUR_DEVELOPER_TOKEN,GOOGLE_ADS_MCP_OAUTH_CLIENT_ID=YOUR_CLIENT_ID,GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET=YOUR_CLIENT_SECRET,GOOGLE_ADS_MCP_BASE_URL=YOUR_BASE_URL,GOOGLE_ADS_MCP_JWT_SIGNING_KEY=YOUR_JWT_SIGNING_KEY,GOOGLE_ADS_MCP_STORAGE_TYPE=firestore,FASTMCP_HOST=0.0.0.0"Step 3: Configure MCP Client
Once deployed, update your MCP client configuration (refer to the docs at https://antigravity.google/docs/mcp) to use the Cloud Run URL.
{
"mcpServers": {
"google-ads-mcp": {
"httpUrl": "https://your-cloud-run-url.a.run.app/mcp"
}
}
}Try it out
Launch your MCP client. You should see google-ads-mcp listed in the
available servers.
Here are some sample prompts to get you started:
Ask what the server can do:
what can the ads-mcp server do?Ask about customers:
what customers do I have access to?Ask about campaigns
How many active campaigns do I have?How is my campaign performance this week?
Note about Customer ID
Your agent will need and ask for a customer id for most prompts. If you are moving between multiple customers, including the customer ID in the prompt may be simpler.
How many active campaigns do I have for customer id 1234567890Contributing
Changes to the read-only core belong upstream at googleads/google-ads-mcp (see its CONTRIBUTING.md). Changes to the write tools and the deployment kit go through this repository; AGENTS.md has the working rules.
Available Tools
23 toolsad_groups_add_ad_group_negative_keywordsAd Groups Add Ad Group Negative KeywordsA
Adds negative keywords to one ad group. For campaign-wide negatives use campaigns.add_campaign_targeting.
| Name | Required | Description | Default |
|---|---|---|---|
| match_type | No | EXACT, PHRASE or BROAD. | PHRASE |
| ad_group_id | Yes | The ad group id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. | |
| negative_keywords | Yes | Terms this ad group must never show for. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the description need not re-state that it's a mutation. However, the description adds only the scope ('one ad group') and does not disclose whether the negatives are additive or replace an existing set, or any other behavioral nuance. With annotations providing the safety profile, the description's contribution is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary action and scope, followed by a targeted pointer to an alternative. No filler or redundant information; highly efficient.
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 the output schema present, return values are covered. The description plus schema cover the essential call parameters and the primary alternative. The only notable gap is clarity on whether negatives are appended or replaced, which is a behavioral detail rather than a critical invocation requirement. Overall, the description is adequate for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter has a clear description, so the tool description does not need to elaborate on parameters. The baseline of 3 applies because the schema carries the semantic weight; the tool description adds no parameter-specific value beyond that.
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 ('Adds negative keywords to one ad group') with a clear resource scope (one ad group). It explicitly contrasts with campaign-wide negatives, naming the sibling tool, so an agent can easily distinguish it from campaigns.add_campaign_targeting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description directly says 'For campaign-wide negatives use campaigns.add_campaign_targeting,' which is an explicit when-not and alternative. It implies when to use this (ad-group-level negatives) and the scope constraint 'one ad group.' This 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.
ad_groups_add_keywordsAd Groups Add KeywordsB
Adds keywords to an ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ENABLED or PAUSED for the new keywords. | ENABLED |
| keywords | Yes | Keywords with match type. Keep an ad group to one tight theme (5-20 keywords). | |
| ad_group_id | Yes | The ad group id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. Useful to catch policy or format errors first. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false, and the description's 'adds' is consistent with a mutating but non-destructive operation. However, the description adds no behavioral context beyond that: it does not mention duplicate handling, default status behavior, validate_only dry-run capability, or consequences for existing keywords. It merely restates the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear, front-loaded sentence: 'Adds keywords to an ad group.' It contains no filler or repetition and is appropriately sized for such a straightforward operation.
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 schema and output schema carry most of the burden, so an agent can likely invoke this tool correctly. Still, the description lacks important context around duplicate handling, positive-versus-negative keyword distinction, and when to prefer sibling tools, leaving meaningful gaps for selection and 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 100%, and the schema already provides rich parameter details such as match type guidance, CPC bid semantics, and validate_only behavior. The description itself contributes no parameter-level meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Adds keywords to an ad group.' This is specific and unambiguous. However, it does not differentiate from the sibling tool ad_groups_add_ad_group_negative_keywords, so an agent may need to inspect names or schemas to determine which 'add keywords' tool is appropriate.
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?
There is no guidance about when to use this tool versus alternatives. The description does not mention that this is for positive keywords, nor does it contrast with ad_groups_add_ad_group_negative_keywords or ad_groups_set_keyword_status. Only the schema's keyword-level note about tight themes provides implicit usage context, but not explicit selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ad_groups_create_ad_groupAd Groups Create Ad GroupA
Creates a Search ad group inside a campaign.
Ad groups default to ENABLED because the campaign itself is created PAUSED; nothing serves until the campaign is enabled with confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ad group name, unique within the campaign. One theme per ad group. | |
| status | No | ENABLED or PAUSED. | ENABLED |
| campaign_id | Yes | The parent campaign id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| default_cpc_bid | No | Default max CPC in account currency. Only used by MANUAL_CPC campaigns; ignored by automated bidding. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-idempotent mutation. The description adds meaningful behavioral context: ad groups default to ENABLED while the campaign is PAUSED, and nothing serves until the campaign is enabled with confirm=true. This goes beyond what annotations provide, though it does not cover failure modes or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first front-loads the purpose, and the second explains the non-obvious default behavior. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, output schema, and annotations, the description covers the key non-obvious behavior (default ENABLED status and the PAUSED campaign gating). It does not need to restate return values or parameter details because those are already present in structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all seven parameters already documented in the input schema. The description adds no parameter-specific meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Creates'), a specific resource ('Search ad group'), and a location ('inside a campaign'). This clearly distinguishes it from sibling tools that update status, update bids, or add 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 intended use is implied by the verb 'Creates' and the campaign context, but the description does not explicitly contrast with sibling tools such as ad_groups_set_ad_group_status or ad_groups_update_ad_group_cpc_bid. The PAUSED campaign / confirm=true note provides useful workflow context, but not explicit when-to-use versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ad_groups_set_ad_group_statusAd Groups Set Ad Group StatusADestructive
Enables, pauses or removes an ad group. REMOVED needs confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ENABLED, PAUSED or REMOVED. | |
| confirm | No | Required true for REMOVED. | |
| ad_group_id | Yes | The ad group id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the operation as destructive and non-idempotent. The description adds the key operational requirement that REMOVED requires confirm=true and explicitly names the affected resource. This is meaningful context beyond what the annotations alone provide, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one compact sentence with the action list front-loaded and the critical confirm requirement stated immediately after. Every word earns its place; there is no filler or redundant elaboration.
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 6-parameter mutation with full schema coverage and an output schema, the description captures the essential operation and the safety precondition. It does not describe response shape or permissions, but those are reasonably covered by the output schema and annotations. The tool can be invoked correctly from this 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?
Schema description coverage is 100%, so the parameters are already well documented. The description repeats the status enum and the confirm requirement without adding materially new semantic detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action set ('Enables, pauses or removes') on a specific resource ('an ad group'), which maps directly to the tool name and the status enum. It is easy to distinguish from sibling tools like ads_set_ad_status, campaigns_set_campaign_status, and ad_groups_set_keyword_status.
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 the use case: changing an ad group's lifecycle status among ENABLED, PAUSED, or REMOVED. However, it gives no explicit guidance on when to choose this over the sibling status tools, nor any exclusions or prerequisites. This is adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ad_groups_set_keyword_statusAd Groups Set Keyword StatusADestructive
Pauses, enables or removes keywords (ad group criteria). REMOVED needs confirm=true.
Find criterion ids with search on ad_group_criterion (ad_group_criterion.criterion_id).
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ENABLED, PAUSED or REMOVED. | |
| confirm | No | Required true for REMOVED. | |
| ad_group_id | Yes | The ad group the criteria belong to. | |
| customer_id | Yes | Google Ads customer id. | |
| criterion_ids | Yes | One or more criterion ids. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive, non-read-only, and non-idempotent; the description does not contradict those hints. It adds the operational guardrail that REMOVED requires confirm=true, though that is also present in the schema, and it does not describe the permanence or downstream effects of removal.
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 short and purposeful; the action and the one critical prerequisite are front-loaded. There is no filler or unnecessary repetition of the schema's enum values beyond the confirm caveat.
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 mutation tool with output schema, annotations, and 100% schema coverage, the description covers the core operation, the destructive-removal caveat, and the ID-lookup workflow. The only meaningful gap is explicit routing to or away from sibling keyword tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by telling the agent exactly how to obtain criterion_ids ('Find criterion ids with search on ad_group_criterion'), which removes ambiguity about how to populate the key 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 opens with a specific verb set and an unambiguous resource: 'Pauses, enables or removes keywords (ad group criteria)'. It clearly distinguishes this status-mutation tool from sibling tools that add keywords or set ad-group/ads status. The parenthetical maps the non-obvious Google Ads term to 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 intended use is implied by the action statement, and the description supplies a useful prerequisite: find criterion ids via ad_group_criterion. However, it does not explicitly say when to choose this over alternatives such as ad_groups_add_keywords or ad_groups_set_ad_group_status, nor does it state any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ad_groups_update_ad_group_cpc_bidAd Groups Update Ad Group Cpc BidADestructive
Changes an ad group's default max CPC (MANUAL_CPC campaigns). Needs confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to apply. | |
| ad_group_id | Yes | The ad group id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| default_cpc_bid | Yes | New default max CPC in account currency. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds the MANUAL_CPC scope and the confirm=true prerequisite, reinforcing a key behavioral condition beyond the annotations. Though 'confirm' is also in the schema, the description's framing emphasizes it as essential to applying the change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core action, and ends with the key prerequisite. Every word earns its place with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotation coverage, the description captures the core behavior, scope, and prerequisite. It does not detail optional parameters like validate_only or login_customer_id, but those are documented in the schema, and the MANUAL_CPC restriction is the key additional context an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented. The description adds no new parameter semantics beyond referencing 'default max CPC', which maps to default_cpc_bid but adds no format or constraints. Baseline 3 is appropriate because the schema does all the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('changes'), resource ('ad group'), and field ('default max CPC'), scoped to MANUAL_CPC campaigns. This clearly distinguishes it from siblings like ad_groups_set_ad_group_status or ad_groups_create_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?
The description states the applicable campaign type (MANUAL_CPC) and requires confirm=true, giving clear context for when to use the tool. It does not name explicit alternatives or exclusions, but the condition is sufficient for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_create_responsive_search_adAds Create Responsive Search AdA
Creates a responsive search ad in an ad group.
Copy is checked locally against Google's limits before the API call: 3-15 headlines of max 30 chars, 2-4 descriptions of max 90 chars, display paths of max 15 chars, no duplicate lines, no all-caps, no '!' in headlines. Aim for 8-15 distinct headlines and 4 descriptions; Google rates ad strength on variety.
The ad defaults to ENABLED because the campaign is PAUSED until confirmed.
| Name | Required | Description | Default |
|---|---|---|---|
| path1 | No | Optional display path segment (max 15 chars), e.g. "services". | |
| path2 | No | Optional second display path segment (requires path1). | |
| status | No | ENABLED or PAUSED. | ENABLED |
| headlines | Yes | Plain strings, or objects {text, pin} to pin a headline to position 1-3. | |
| final_urls | Yes | Landing page URL(s), https. | |
| ad_group_id | Yes | The ad group id. | |
| customer_id | Yes | Google Ads customer id. | |
| descriptions | Yes | Plain strings, or objects {text, pin} to pin to DESCRIPTION_1/2. | |
| validate_only | No | Dry-run. Also runs Google's policy checks without saving. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals that copy is validated locally against Google's limits before the API callpa and explains the ENABLED default as intentional because the campaign is PAUSED. This adds meaningful behavioral context 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 compact and front-loaded: purpose first, then validation details, then a brief strategic recommendation. Every sentence earns its place; the line breaks make the constraints 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?
With a complete input schema, an output schema, and annotations, the description covers the remaining behavioral essentials: local validation, default status rationale, and content best practices. 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?
Input schema coverage is 100%, but the description adds value by spelling out validation criteria such as headline and description count ranges, character limits, display path constraints, and uniqueness rules. These constraints are not all present in the schema descriptions, so the description compensates usefully.
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 opening sentence uses a specific verb and resource: 'Creates a responsive search ad in an ad group.' This clearly distinguishes the tool from its siblings, especially ads_update_responsive_search_ad, by establishing creation as the operation.
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 guidance on how to call the tool well: aiming for 8-15 headlines and 4 descriptions to improve ad strength, and noting limits like no all-caps and no '!' in headlines. It does not explicitly name alternatives or exclusions, but the create-vs-update distinction is evident from the name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_set_ad_statusAds Set Ad StatusADestructive
Enables, pauses or removes an ad. REMOVED needs confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | The ad id. | |
| status | Yes | ENABLED, PAUSED or REMOVED. | |
| confirm | No | Required true for REMOVED. | |
| ad_group_id | Yes | The ad group the ad belongs to. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnly=false and destructive=true. The description adds a meaningful operational constraint by warning that REMOVED requires confirm=true, which is a behavioral gotcha beyond the annotation metadata. It does not contradict 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 two short sentences with the core action front-loaded and the important exception stated immediately after. Every word earns its place, and there is no filler or redundant elaboration.
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 annotations cover destructive/read-only semantics, the schema documents all 7 parameters including validate_only, and an output schema exists, the description provides the key operational gotcha. It is slightly thin on when to prefer this over sibling status tools, but otherwise sufficient 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 100%, so the baseline is 3. The only parameter-related detail in the description, 'REMOVED needs confirm=true,' largely restates what the schema already says for the confirm field, adding no new semantic meaning.
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: 'Enables, pauses or removes an ad.' It clearly names the exact state transitions the tool performs. However, it does not explicitly differentiate this from sibling status tools like ad_groups_set_ad_group_status, so it stops short of full sibling distinction.
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 action itself implies when to use the tool: any time an ad's status must be changed. However, there is no explicit when-to-use guidance, no exclusions, and no mention of alternatives, so the agent must infer routing from the tool name and context signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_update_responsive_search_adAds Update Responsive Search AdA
Replaces the copy of an existing responsive search ad.
Headlines and descriptions are replaced as whole sets (pass the full list you want to end up with). Editing an ad resets its performance history in the UI; for A/B tests prefer creating a second ad in the same ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | The ad id (ad_group_ad.ad.id). | |
| path1 | No | New display path 1 (pass "" to clear). | |
| path2 | No | New display path 2 (pass "" to clear). | |
| headlines | No | Full replacement list, or omit to keep current. | |
| final_urls | No | Replacement landing page(s), or omit to keep current. | |
| customer_id | Yes | Google Ads customer id. | |
| descriptions | No | Full replacement list, or omit to keep current. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal this is a mutating operation (readOnlyHint=false), but the description adds the non-obvious side effect that 'Editing an ad resets its performance history in the UI.' This is valuable behavioral context beyond what the annotations or schema provide. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted text: the first states the core action, the second explains the critical full-list behavior, and the third gives the key trade-off and alternative. It is compact, front-loaded, and 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?
For a complex update tool with 9 parameters, 100% schema coverage, an output schema, and useful annotations, this description covers the essential behavioral, usage, and side-effect information. It does not need to repeat schema details, and the combination of description plus structured fields leaves no important gap for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description enhances parameter understanding by explaining that headlines and descriptions are replaced as whole sets and that the caller must pass the full intended list. The schema says 'Full replacement list, or omit to keep current,' and the description reinforces the practical implication, which is especially important for array-valued 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: 'Replaces the copy of an existing responsive search ad.' It clearly identifies the operation as an update to an existing ad rather than a creation, and the additional sentence about A/B tests distinguishes it from ads_create_responsive_search_ad. This is unambiguous and differentiates the tool from its closest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool (to replace copy on an existing ad) and when not to: 'for A/B tests prefer creating a second ad in the same ad group.' It also gives a critical usage instruction that replacement sets must be passed whole. This is direct, actionable guidance that prevents common misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_add_calloutsAssets Add CalloutsA
Creates callout assets ("Free Quote", "24/7 Support") and attaches them to a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| callouts | Yes | 2-20 short phrases, max 25 characters each, no punctuation at the end. | |
| campaign_id | Yes | The campaign id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run. Validates the assets only; linking is skipped in dry-run. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description accurately describes a mutating create-and-attach operation, consistent with readOnlyHint=false and destructiveHint=false. However, it does not add behavioral context such as duplicate handling, partial-failure behavior, or the validate_only dry-run skipping the linking step; those details are left to the schema and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with concrete examples and no filler. It economically states both the creation and the attachment behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has full parameter coverage, an output schema, and annotations covering the safety profile, so the call itself is fully actionable. The main gap is lack of routing guidance against the similar assets_add_sitelinks tool, but that does not prevent 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 100%, including constraints for callouts (2-20 phrases, max 25 characters, no trailing punctuation) and the validate_only dry-run behavior. The description's examples illustrate the callouts parameter but add no semantic information beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Creates), resource (callout assets), and target (campaign). It is clearly distinguishable from the sibling assets_add_sitelinks tool because it names callouts specifically, not generic assets.
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 no explicit when-to-use or when-not-to-use guidance, and does not mention the similar assets_add_sitelinks tool. The intended usage is implied by the action and quoted callout examples, but an agent is not told how to choose between callout assets and other asset types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_add_sitelinksAssets Add SitelinksA
Creates sitelink assets and attaches them to a campaign. Add at least 4 for full effect.
| Name | Required | Description | Default |
|---|---|---|---|
| sitelinks | Yes | 2-20 sitelinks. Link text max 25 chars, descriptions max 35 chars each. | |
| campaign_id | Yes | The campaign id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run. Validates the assets only; linking is skipped in dry-run. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-idempotent mutation, so the description does not need to restate that. It adds useful context by noting that the sitelinks are attached to a campaign, but it does not go further into behavior like validation results or effects on existing assets.
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-loaded with the core purpose and followed by an actionable tip. Every sentence earns its place and there is no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and annotations, the description provides the key operational detail an agent needs: the action, the target, and a best-practice count. It is slightly brief but sufficient for a moderate-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are fully documented in the schema. The description adds one small recommendation about the number of sitelinks (at least 4), which is useful but does not substantially compensate or add beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb plus resource: it creates sitelink assets and attaches them to a campaign. This clearly differentiates it from sibling tools like assets_add_callouts and generic asset creation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case and adds a practical recommendation (add at least 4 sitelinks for full effect). However, it does not explicitly compare against alternatives such as assets_add_callouts or explain when to prefer this tool over another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assets_create_conversion_actionAssets Create Conversion ActionA
Creates a website conversion action (the thing bidding optimises for).
After creating it, fetch the tag with search on conversion_action selecting conversion_action.tag_snippets and install the event snippet on the site, or fire it through Google Tag Manager.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | e.g. "Contact form submit". | |
| category | No | What the action represents. Leads: SUBMIT_LEAD_FORM, REQUEST_QUOTE, BOOK_APPOINTMENT, PHONE_CALL_LEAD, CONTACT. Sales: PURCHASE. | SUBMIT_LEAD_FORM |
| customer_id | Yes | Google Ads customer id. | |
| counting_type | No | ONE_PER_CLICK for leads, MANY_PER_CLICK for purchases. | ONE_PER_CLICK |
| default_value | No | Value per conversion in account currency (helps value-based bidding). | |
| validate_only | No | Dry-run only. | |
| primary_for_goal | No | Whether campaigns bid on this action by default. | |
| login_customer_id | No | Manager account id if applicable. | |
| always_use_default_value | No | True to ignore values sent by the tag. | |
| click_through_lookback_window_days | No | 1-90. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and destructive safety, and the description adds meaningful lifecycle context: creating the action alone is insufficient; the tag must be fetched and installed. This goes beyond the schema and helps the agent anticipate follow-up behavior 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 short sentences front-load the core purpose and then provide the essential next step. 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?
With a 10-parameter schema fully described and an output schema present, the description does not need to restate return values. It completes the operational picture by telling the agent the required follow-up (tag install via GTM or site snippet).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema carries parameter meaning. The description adds no extra parameter-level detail, which aligns with the baseline 3 for fully covered schemas.
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, resource, and scope: 'Creates a website conversion action,' with a parenthetical clarifying its role ('the thing bidding optimises for'). This is immediately distinguishable from sibling asset tools like assets_add_callouts or assets_add_sitelinks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames creation as the first step of a two-step workflow by instructing the agent to fetch the tag via search and install or fire it through GTM afterward. It does not explicitly enumerate when to avoid this tool or name alternatives, so it lacks a full when/when-not specification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_add_campaign_targetingCampaigns Add Campaign TargetingA
Adds locations, languages and campaign-level negative keywords to a campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| locations | No | Geo targets to include or exclude (ids from suggest_geo_targets). | |
| campaign_id | Yes | The campaign id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| language_codes | No | ISO codes, e.g. ["en", "ar"]. Resolved to language constants. | |
| login_customer_id | No | Manager account id if applicable. | |
| negative_keywords | No | Search terms the campaign must never show for. | |
| negative_keyword_match_type | No | Match type for the negatives (PHRASE is the usual choice). | PHRASE |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is mutating (readOnlyHint=false), not idempotent, and not destructive. The description's 'Adds' is consistent with those annotations and clarifies that the operation is additive, but it adds little behavioral context beyond that—no mention of duplicate behavior, validation, or what happens to existing targeting.
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 that communicates the verb, the objects, and the scope without waste. Every word contributes meaning 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?
Given the rich input schema (100% parameter coverage) and the presence of an output schema, the one-sentence description is largely sufficient to orient an agent. It clearly identifies the operation and scope, though it could be more complete by noting when the sibling ad-group-level or removal tools should be used instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters. The description's mention of 'locations, languages and campaign-level negative keywords' mirrors the parameter names and adds no new semantic detail beyond what the schema provides.
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 ('Adds') with a clear resource: 'locations, languages and campaign-level negative keywords to a campaign.' This specifies both the object and the scope, and 'campaign-level' distinguishes it from sibling tools like ad_groups_add_ad_group_negative_keywords and campaigns_remove_campaign_criteria.
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 intended use is implied: use this tool when adding locations, languages, or campaign-level negative keywords to a campaign. However, it does not explicitly state when not to use it or point to alternatives such as ad_groups_add_ad_group_negative_keywords for ad-group-level negatives or campaigns_remove_campaign_criteria for removals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_create_campaignCampaigns Create CampaignA
Creates a Search campaign, always PAUSED. Enable it later with set_campaign_status.
Typical order: create_campaign_budget -> create_campaign -> add_campaign_targeting -> ad_groups.create_ad_group -> ad_groups.add_keywords -> ads.create_responsive_search_ad -> review -> set_campaign_status(ENABLED, confirm=true).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name, unique within the account. | |
| bidding | No | MAXIMIZE_CLICKS (good default for a new account without conversion history), MAXIMIZE_CONVERSIONS (optionally with target_cpa), MAXIMIZE_CONVERSION_VALUE (optionally with target_roas), or MANUAL_CPC. | MAXIMIZE_CLICKS |
| end_date | No | YYYY-MM-DD. Defaults to no end date. | |
| budget_id | Yes | Id of a budget created with create_campaign_budget. | |
| start_date | No | YYYY-MM-DD. Defaults to today. | |
| target_cpa | No | Optional target cost per acquisition in account currency (MAXIMIZE_CONVERSIONS only). | |
| customer_id | Yes | Google Ads customer id. | |
| target_roas | No | Optional target return on ad spend as a ratio, e.g. 4.0 = 400% (MAXIMIZE_CONVERSION_VALUE only). | |
| validate_only | No | Dry-run against the API without creating anything. | |
| login_customer_id | No | Manager account id if applicable. | |
| location_targeting | No | PRESENCE targets people in the location. PRESENCE_OR_INTEREST also targets people interested in it. PRESENCE is the safer default for local businesses. | PRESENCE |
| max_cpc_bid_ceiling | No | Optional max CPC ceiling in account currency (MAXIMIZE_CLICKS / MAXIMIZE_CONVERSIONS). | |
| include_display_network | No | Display expansion. Default off; keep off for Search. | |
| include_search_partners | No | Show on Google search partner sites. Default off. | |
| contains_eu_political_advertising | No | Declare EU political advertising (required declaration; default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (readOnly=false, idempotent=false, destructive=false), so the description carries the behavioral burden. It discloses a key non-obvious behavior: the campaign is always created PAUSED and must be enabled later. This adds meaningful context beyond the structured annotations, though it could also mention failure/side-effect behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first sentence, and the second sentence is a dense, actionable lifecycle list. Every clause earns its place; there is no filler or repetition of schema 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?
For a 15-parameter create tool with a full output schema, the description supplies the missing operational context: paused-by-default state, prerequisite budget step, and the full path to activation. Combined with the schema, an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add parameter-level meaning beyond what the schema already provides; the workflow sequence references budget_id implicitly, but the schema already states budget_id must come from create_campaign_budget.
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: 'Creates a Search campaign, always PAUSED.' It also distinguishes itself from siblings by tying enablement to set_campaign_status, and the lifecycle makes the difference from create_campaign_budget and update_campaign clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit workflow guidance: create_campaign_budget -> create_campaign -> add_campaign_targeting -> ... -> set_campaign_status(ENABLED, confirm=true). This tells an agent exactly when to call it and what comes next. It doesn't explicitly say 'use campaigns_update_campaign for existing campaigns,' but the create/update distinction is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_create_campaign_budgetCampaigns Create Campaign BudgetA
Creates a campaign budget. Do this before create_campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Budget name, unique within the account. | |
| customer_id | Yes | Google Ads customer id (digits only). | |
| daily_amount | Yes | Average daily budget in the account's currency (e.g. 150 for AED 150/day). Capped by the server setting ADS_MCP_MAX_DAILY_BUDGET. | |
| validate_only | No | Dry-run against the API without creating anything. | |
| delivery_method | No | STANDARD spreads spend across the day. Leave as STANDARD. | STANDARD |
| explicitly_shared | No | True to allow several campaigns to share this budget. | |
| login_customer_id | No | Manager account id if the customer is accessed through a manager. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation (readOnlyHint=false), non-idempotent, and non-destructive. The description adds the workflow context 'Do this before create_campaign' but no additional behavioral details such as side effects, duplicate handling, or validation behavior. This is acceptable because the annotations carry the safety profile, but the description adds only minimal extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no redundant wording. The primary action is stated first, and the prerequisite is added in a single, clear follow-up sentence. 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?
Given that the schema fully documents all parameters and an output schema exists, the description only needs to convey purpose and workflow context, which it does. The prerequisite relationship with create_campaign is a key piece of context that is present. It could be slightly more complete by naming the update alternative, but it is not a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented in the input schema, including constraints like the daily amount cap and unique budget name. The description itself adds no parameter-level information, so it meets the baseline for a fully documented schema without adding extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Creates') and resource ('campaign budget'), making the core function clear. It also signals the relationship to campaigns_create_campaign by saying 'Do this before create_campaign,' which helps distinguish it from the campaign creation sibling. However, it does not explicitly differentiate from campaigns_update_campaign_budget, relying on the name to carry that distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage condition: create the budget before creating a campaign. This is valuable sequencing guidance. It does not mention when to use an alternative like campaigns_update_campaign_budget, but the prerequisite context is sufficient to guide basic usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_remove_campaign_criteriaCampaigns Remove Campaign CriteriaADestructive
Removes campaign criteria (locations, languages, negatives) by criterion id. Needs confirm=true.
Find criterion ids with search on campaign_criterion (campaign_criterion.criterion_id).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| campaign_id | Yes | ||
| customer_id | Yes | ||
| criterion_ids | Yes | ||
| validate_only | No | ||
| login_customer_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's 'removes' is consistent. The description adds valuable behavior beyond annotations by explicitly requiring confirm=true for the operation to take effect, which is not captured in the annotations. It also provides a hint on how to locate criterion ids, offering extra practical guidance on the process.
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 with no fluff. The main action is front-loaded, and the critical requirement (confirm=true) is stated immediately. The additional hint about finding ids is useful and completes the purpose without redundancy. 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 destructive operation with an output schema present, the description does not need to explain return values. It covers the main requirements (confirm flag, how to find ids) and the core action. Missing details like validation behavior or login_customer_id are likely standard across sibling tools and not critical for correct invocation. The description is sufficiently complete for an agent to call this tool correctly in most scenarios.
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%, meaning the description does not directly explain parameters. The description indirectly references 'criterion id' (criterion_ids) and 'confirm=true' (confirm), giving some semantics for two of the six parameters, but it leaves customer_id, campaign_id, validate_only, and login_customer_id unexplained. With such low coverage, the description should compensate more thoroughly; it only partially does.
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 ('removes') and the resource ('campaign criteria'), and even lists the types of criteria (locations, languages, negatives). It distinguishes itself from sibling tools like 'campaigns_add_campaign_targeting' by explicitly indicating removal, though it does not name the alternative directly. This is clear and specific enough for an agent to know what it 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 some usage context by stating the prerequisite of finding criterion ids via a search on campaign_criterion and the requirement to set confirm=true. However, it does not explicitly instruct when to use this tool versus alternatives (e.g., when to remove versus add or update criteria), leaving the decision partly to inference. There is no mention of when not to use it or what other tools to consider.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_set_campaign_statusCampaigns Set Campaign StatusADestructive
Enables, pauses or removes a campaign.
PAUSED applies immediately (it only stops spend). ENABLED starts spend and REMOVED is permanent, so both need confirm=true; without it you get a validated preview.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ENABLED, PAUSED or REMOVED. | |
| confirm | No | Required true for ENABLED and REMOVED. | |
| campaign_id | Yes | The campaign id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the destructiveHint annotation: it explicitly states REMOVED is permanent, PAUSED only stops spend immediately, and without confirm=true the call returns a validated preview rather than applying the change. This fully discloses the tool's side effects and confirmation guard.
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 primary purpose. Every sentence adds necessary behavioral information, and the two-paragraph structure keeps the core action and critical nuances separate without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and annotations, the description covers the essential behavioral nuances an agent needs to invoke the tool safely: permanence, immediate spend effects, and confirmation requirements. No critical invocation context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the interaction between status and confirm: ENABLED and REMOVED require confirm=true, while without it the agent gets a validated preview. This goes beyond the schema's simple boolean 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: 'Enables, pauses or removes a campaign.' This clearly distinguishes the tool from sibling status tools like ad_groups_set_ad_group_status and ads_set_ad_status by naming the campaign resource directly.
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 each status is appropriate: PAUSED applies immediately and only stops spend, ENABLED starts spend, and REMOVED is permanent. It does not explicitly name alternative sibling tools, but the resource specificity plus status semantics provide clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_suggest_geo_targetsCampaigns Suggest Geo TargetsARead-only
Looks up geo target ids for place names. Use before add_campaign_targeting.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the names, e.g. en. | en |
| country_code | No | Two-letter country to search within, e.g. AE, PT, GB, US. | AE |
| location_names | Yes | Place names, e.g. ["Dubai", "Abu Dhabi", "United Arab Emirates"]. | |
| login_customer_id | No | Manager account id if applicable. |
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 covers the safety profile, and the description consistently describes a non-mutating lookup. It adds a useful sequencing hint, but it does not disclose other behavioral traits such as response size, matching behavior, or error cases. The output schema covers some of this, so a middle score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The core purpose is front-loaded, and the workflow instruction is directly appended. 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 read-only lookup tool with four documented parameters and an output schema, the description covers what an agent needs to select and invoke it correctly. The usage hint completes the picture by clarifying where it fits in the broader campaign-targeting workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters including defaults and examples. The description adds no additional parameter-level meaning beyond restating that place names map to geo target IDs, which is expected at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Looks up') and resource ('geo target ids for place names'), making the tool's function immediately clear. It also distinguishes itself from the sibling campaigns_add_campaign_targeting by framing this as the lookup step in that workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before add_campaign_targeting' explicitly tells the agent when this tool fits in the workflow. This is direct, actionable guidance that prevents misordering the lookup and the subsequent targeting step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_update_campaignCampaigns Update CampaignA
Renames a campaign, changes its dates, or points it at another budget.
Bidding strategy changes are deliberately not exposed here; create a new campaign instead so the learning history is not disturbed by accident.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name. | |
| end_date | No | New end date YYYY-MM-DD. | |
| budget_id | No | Id of another existing budget to attach. | |
| start_date | No | New start date YYYY-MM-DD (only before the campaign has started). | |
| campaign_id | Yes | The campaign id. | |
| customer_id | Yes | Google Ads customer id. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false. The description adds useful behavioral context beyond that: bidding strategy changes are intentionally excluded to avoid disturbing learning history. This explains why a seemingly obvious operation is not available.
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-loaded with the primary actions and ending with a useful design rationale. No filler or repetition of 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?
Given the rich schema, output schema, and annotations, the description is sufficient for an agent to understand scope and exclusions. It could mention that unspecified fields remain unchanged, but that is largely implied by the update semantics and not a critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters individually. The description adds a high-level semantic grouping (rename, dates, budget) but no new parameter-level details or constraints beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it renames a campaign, changes dates, or reassigns it to another budget. It distinguishes this from sibling tools like campaigns_set_campaign_status and campaigns_update_campaign_budget by naming the exact campaign-level fields.
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 names a key when-not-to-use condition: bidding strategy changes are deliberately excluded, and the alternative — creating a new campaign — is given. This is clear routing guidance for an agent deciding between this tool and campaigns_create_campaign.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_update_campaign_budgetCampaigns Update Campaign BudgetADestructive
Changes the daily amount of an existing budget. Needs confirm=true to apply.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to apply. False returns a validated preview. | |
| budget_id | Yes | The campaign budget id (campaign_budget.id in GAQL, or from campaign.campaign_budget). | |
| customer_id | Yes | Google Ads customer id. | |
| daily_amount | Yes | New average daily budget in account currency. Capped by ADS_MCP_MAX_DAILY_BUDGET. | |
| validate_only | No | Dry-run only. | |
| login_customer_id | No | Manager account id if applicable. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey destructiveHint=true and readOnlyHint=false. The description adds meaningful behavioral context beyond the annotations: the two-phase commit behavior ('Needs confirm=true to apply'), implying that without confirm the change is only previewed. This helps an agent understand that invocation without confirmation won't mutate state, which annotations alone do not capture.
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, 15 words, with the core action front-loaded and the critical behavioral gate (confirm=true) stated immediately after. Every clause earns its place; 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?
For a destructive update tool with a 6-parameter schema at 100% coverage, an output schema, and annotations carrying the safety profile, the description covers the one critical behavioral nuance an agent must know (the confirm gate). It could additionally clarify interplay between validate_only and confirm, but the schema already documents both fields, so the description is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (confirm, budget_id, customer_id, daily_amount, validate_only, login_customer_id) is already documented in the input schema. The description itself adds no parameter-level detail. Per calibration, the baseline of 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Changes the daily amount of an existing budget.' It clearly identifies the target (budget daily amount) and distinguishes itself from siblings like campaigns_create_campaign_budget (creation) and campaigns_set_campaign_status (status changes). It doesn't explicitly name sibling alternatives, so it loses the top point, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to choose this tool over alternatives like campaigns_create_campaign_budget or campaigns_update_campaign. The 'Needs confirm=true to apply' is a prerequisite, not a usage-context signal. No exclusions, no alternative routing, and no conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
customers_list_accessible_customersCustomers List Accessible CustomersARead-only
Returns ids of customers directly accessible by the user authenticating the call.
Use this tool first to discover available customer IDs if the user hasn't provided one. Most other tools require a valid customer ID as input.
Returns: List[str]: A list of customer IDs.
| 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 declare readOnlyHint=true, which aligns with the description's read-only nature. The description adds value beyond annotations by noting that it returns only directly accessible customershare, implying a permission filter, and that the output is a list of IDs (though this is also in the output schema). It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a brief purpose statement and a usage hint, followed by a return type section. It is front-loaded with the key action and avoids unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with a simple output (a list of strings), the description is fully sufficient. It explains what the tool does, when to use it, and what it returns. The output schema already documents the return type, so no additional return detail is needed.
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 there is no parameter semantics to clarify. The description correctly focuses on the output and usage context, which is appropriate for a parameterless 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 description clearly states it returns IDs of customers directly accessible by the authenticated user, with a specific verb ('Returns') and resource ('customers'). It is distinct from siblings like search_search and metadata_get_resource_metadata, as it lists customer IDs rather than performing search or fetching metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to use this tool first to discover customer IDs if the user hasn't provided one, and notes that most other tools require a valid customer ID. It does not explicitly mention when not to use it or name alternatives, but the guidance is clear enough for this context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_get_resource_metadataMetadata Get Resource MetadataARead-only
Retrieves the selectable, filterable, and sortable fields for a specific Google Ads resource, including compatible metrics and segments.
Use this tool to find out which fields you can select, filter by, or sort by when querying a specific resource (e.g., 'campaign', 'ad_group'). This tool also returns metrics and segments that can be selected with the resource. Their names start with 'metrics.' and 'segments.' respectively.
Do not guess fields, you MUST use this tool to discover them before constructing a query for the
search tool.
The responses of this tool should be cached, as they don't change frequently.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_name | Yes | The name of the Google Ads resource (e.g., 'campaign', 'ad_group'). | |
| login_customer_id | No | Optional manager customer ID to use as the login-customer-id header. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already covers the safety profile, and the description complements it by disclosing the response contents (fields, metrics, segments) and the naming convention for metrics/segments. It also adds an operational trait: 'responses ... should be cached, as they don't change frequently'. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and adds concise, actionable guidance. There is minor redundancy: the first sentence says 'including compatible metrics and segments' and the third sentence repeats that metrics and segments can be selected. Still, it is well-structured and every section 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?
For a metadata-lookup tool with an output schema and readOnlyHint annotation, the description covers everything an agent needs: what the tool returns, naming conventions, mandatory usage before querying, and caching guidance. No significant gaps remain 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 input schema already describes both parameters comprehensively (100% coverage), so the description need not repeat them. It adds a small amount of extra context with examples like 'campaign', 'ad_group', but this does not significantly exceed what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieves') and names a clear resource: the selectable, filterable, and sortable fields for a Google Ads resource, including metrics and segments. This clearly distinguishes the tool from the siblings: search_search executes queries, while this tool provides metadata for building 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?
The description explicitly states when to use the tool: before constructing a query for the `search` tool, and it warns 'Do not guess fields, you MUST use this tool to discover them'. This gives the agent an unambiguous directive and contextual placement relative to the sibling search tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_searchSearch SearchCRead-only
Fetches data from the Google Ads API using the search method
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of rows to return | |
| fields | Yes | The fields to fetch | |
| resource | Yes | The resource to return fields from | |
| orderings | No | How the data is ordered | |
| conditions | No | List of conditions to filter the data, combined using AND clauses | |
| customer_id | Yes | The id of the customer | |
| login_customer_id | No | Optional manager customer ID to use as the login-customer-id header. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=true, which already tells the agent this is a safe read operation. The description adds no additional behavioral context—nothing about pagination, limits, error handling, or response format. It fails to enrich the annotation-provided information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only one sentence and is technically concise, but it is under-specified to the point of being nearly useless. It does not front-load critical information or structure the content in a way that helps an agent understand the tool's scope. The brevity is a deficiency, not a virtue.
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?
This is a 7-parameter tool with 3 required parameters, yet the description provides no context about what the tool actually accomplishes beyond a generic 'search'. It lacks any explanation of the query syntax, the relationship between fields and resource, or expected output. Given the complexity, the description is grossly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, meaning all parameters have descriptions in the schema. The description adds no extra meaning beyond what the schema already provides, so the baseline of 3 applies. It does not compensate with any additional clarifications about parameter relationships or formatting.
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 verb ('Fetches data') and a resource ('Google Ads API') but is extremely vague about what kind of data or which resources are searchable. It does not differentiate from sibling tools like metadata_get_resource_metadata or customers_list_accessible_customers, making it unclear when this tool is the right choice.
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?
There is no guidance on when to use this tool versus the siblings. No mention of alternatives, exclusions, or prerequisites. An agent has to infer that this is a general search tool, but the description gives no contextual hints about when it should be preferred.
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.
23 tool updates
v0.0.4- First observed
ad_groups_add_ad_group_negative_keywords - First observed
ad_groups_add_keywords - First observed
ad_groups_create_ad_group - First observed
ad_groups_set_ad_group_status - First observed
ad_groups_set_keyword_status - First observed
ad_groups_update_ad_group_cpc_bid - First observed
ads_create_responsive_search_ad - First observed
ads_set_ad_status - First observed
ads_update_responsive_search_ad - First observed
assets_add_callouts - First observed
assets_add_sitelinks - First observed
assets_create_conversion_action - First observed
campaigns_add_campaign_targeting - First observed
campaigns_create_campaign - First observed
campaigns_create_campaign_budget - First observed
campaigns_remove_campaign_criteria - First observed
campaigns_set_campaign_status - First observed
campaigns_suggest_geo_targets - First observed
campaigns_update_campaign - First observed
campaigns_update_campaign_budget - First observed
customers_list_accessible_customers - First observed
metadata_get_resource_metadata - First observed
search_search
TDQS
Scored across 23 tools
Each tool targets a distinct resource and action, from campaign lifecycle to ad group keywords, ads, assets, and search. Even similar asset tools (callouts vs. sitelinks) are clearly separated by asset type, and status/update/remove actions are scoped to specific objects.
Tool names mostly follow a predictable snake_case pattern grouped by resource prefix, such as campaigns_*, ad_groups_*, ads_*, and assets_*. Minor redundancy like search_search and metadata_get_resource_metadata slightly breaks the verb_noun ideal but does not hinder usability.
With 23 tools, the server is on the heavier side and exceeds the typical 15-tool sweet spot, but the count is defensible for a Google Ads management surface spanning campaigns, ad groups, ads, assets, targeting, and metadata. It feels broad rather than bloated, though some tools could potentially be consolidated.
The tool set covers the core Search campaign lifecycle well: budgets, campaigns, targeting, ad groups, keywords, ads, and conversion actions. Minor gaps exist, such as lacking direct asset removal/update and ad group rename, but the generic search and metadata tools allow agents to query resources and work around most omissions.
Maintenance
Related MCP Connectors
Run Google Ads and Meta Ads from ChatGPT or Claude: audit wasted spend, create and manage campaigns.
Build, edit and sync Google, Microsoft, Reddit and Meta ad campaigns from your assistant.
- adsOAuthcom.adspirer
Manage Google, Meta, Amazon, TikTok, LinkedIn & ChatGPT ads. 430 tools for campaigns & analytics.
Run ads on Google, Meta, LinkedIn, TikTok and more from AI. 530+ tools across 14 platforms.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive access to Google Ads API v20, enabling AI assistants to manage campaigns, accounts, assets, and reporting through natural language. It features automatic retry logic, GAQL query support, and advanced functionality for Performance Max and Demand Gen campaigns.11MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage, report, and analyze Google Ads campaigns securely with encrypted multi-client support, real-time API integrations, and audit trail logging.44 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to create, analyze, and optimize ad campaigns across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Amazon Ads, and ChatGPT Ads through natural language using 400+ tools.96MIT
- FlicenseAqualityBmaintenanceEnables AI agents to manage Google Ads campaigns (Search and UAC) through natural language, with read tools always available and guarded write operations for budgets, campaigns, ad groups, and keywords.3-