Skip to main content
Glama
MarventoCapital

Marvento Ads MCP

Official

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

campaigns

create_campaign_budget, update_campaign_budget, create_campaign, update_campaign, set_campaign_status, suggest_geo_targets, add_campaign_targeting, remove_campaign_criteria

ad_groups

create_ad_group, set_ad_group_status, update_ad_group_cpc_bid, add_keywords, add_ad_group_negative_keywords, set_keyword_status

ads

create_responsive_search_ad, update_responsive_search_ad, set_ad_status

assets

add_sitelinks, add_callouts, create_conversion_action

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=true for 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:

  1. An explicit path set via the GOOGLE_ADS_MCP_TOOLS_CONFIG environment variable.

  2. A tools_config.yaml file in the current working directory.

  3. The default tools_config.yaml bundled 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: true

Resources 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

  1. The MCP Server will expose your data to the Agent or LLM that you connect to it.

  2. If you have technical issues, please use the GitHub issue tracker.

  3. 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:

  1. Configure Python.

  2. Configure Developer Token.

  3. Enable APIs in your project

  4. Configure Credentials.

  5. Configure your MCP client.

Configure Python

Install pipx.

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-mcp

Configure 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 to http://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, or memory).

  • GOOGLE_ADS_MCP_STORAGE_PATH: (Optional) Directory path for filetree persistent storage.

  • GOOGLE_ADS_MCP_STORAGE_REDIS_URL: (Optional) Redis URL for redis persistent storage.

  • GOOGLE_ADS_MCP_STORAGE_FIRESTORE_PROJECT: (Optional) Google Cloud project for firestore persistent storage. Defaults to the project inferred from Application Default Credentials. Setting it selects the firestore backend even if GOOGLE_ADS_MCP_STORAGE_TYPE is unset.

  • GOOGLE_ADS_MCP_STORAGE_FIRESTORE_DATABASE: (Optional) Firestore database name for firestore persistent 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 to true to 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=all

The 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_ads

For 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_customers

  • metadata_get_resource_metadata

  • search_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/adwords

Check 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_FILE
  • Set 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

  1. Install Antigravity or Antigravity IDE.

  2. 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 serverUrl for a Streamable HTTP server. Do not use the older httpUrl key. 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_JSON with the path you copied in the previous step.

    We also recommend that you add a GOOGLE_CLOUD_PROJECT attribute to the env object. Replace YOUR_PROJECT_ID in 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

  1. A Google Cloud project.

  2. The gcloud CLI 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.

  1. Create a repository in Artifact Registry:

    gcloud artifacts repositories create mcp-servers --repository-format=docker --location=us-central1
  2. Build 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_ID with 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 to firestore to use Firestore through Application Default Credentials, which needs no VPC connector, or to redis along with GOOGLE_ADS_MCP_STORAGE_REDIS_URL.

    Using firestore requires three things: build the image with the extra installed (change the Dockerfile to uv pip install --system .[firestore]), create a Firestore database in the project, since one is not provisioned automatically, and grant the Cloud Run service account roles/datastore.user. Note that entries are not expired automatically: the store filters expired entries on read but never deletes them, and expires_at is 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 to 0.0.0.0 to 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 1234567890

Contributing

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 tools
ad_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
match_typeNoEXACT, PHRASE or BROAD.PHRASE
ad_group_idYesThe ad group id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.
negative_keywordsYesTerms this ad group must never show for.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoENABLED or PAUSED for the new keywords.ENABLED
keywordsYesKeywords with match type. Keep an ad group to one tight theme (5-20 keywords).
ad_group_idYesThe ad group id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only. Useful to catch policy or format errors first.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAd group name, unique within the campaign. One theme per ad group.
statusNoENABLED or PAUSED.ENABLED
campaign_idYesThe parent campaign id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
default_cpc_bidNoDefault max CPC in account currency. Only used by MANUAL_CPC campaigns; ignored by automated bidding.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StatusA
Destructive

Enables, pauses or removes an ad group. REMOVED needs confirm=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesENABLED, PAUSED or REMOVED.
confirmNoRequired true for REMOVED.
ad_group_idYesThe ad group id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StatusA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesENABLED, PAUSED or REMOVED.
confirmNoRequired true for REMOVED.
ad_group_idYesThe ad group the criteria belong to.
customer_idYesGoogle Ads customer id.
criterion_idsYesOne or more criterion ids.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb 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.

Usage Guidelines3/5

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 BidA
Destructive

Changes an ad group's default max CPC (MANUAL_CPC campaigns). Needs confirm=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to apply.
ad_group_idYesThe ad group id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
default_cpc_bidYesNew default max CPC in account currency.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
path1NoOptional display path segment (max 15 chars), e.g. "services".
path2NoOptional second display path segment (requires path1).
statusNoENABLED or PAUSED.ENABLED
headlinesYesPlain strings, or objects {text, pin} to pin a headline to position 1-3.
final_urlsYesLanding page URL(s), https.
ad_group_idYesThe ad group id.
customer_idYesGoogle Ads customer id.
descriptionsYesPlain strings, or objects {text, pin} to pin to DESCRIPTION_1/2.
validate_onlyNoDry-run. Also runs Google's policy checks without saving.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StatusA
Destructive

Enables, pauses or removes an ad. REMOVED needs confirm=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYesThe ad id.
statusYesENABLED, PAUSED or REMOVED.
confirmNoRequired true for REMOVED.
ad_group_idYesThe ad group the ad belongs to.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYesThe ad id (ad_group_ad.ad.id).
path1NoNew display path 1 (pass "" to clear).
path2NoNew display path 2 (pass "" to clear).
headlinesNoFull replacement list, or omit to keep current.
final_urlsNoReplacement landing page(s), or omit to keep current.
customer_idYesGoogle Ads customer id.
descriptionsNoFull replacement list, or omit to keep current.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
calloutsYes2-20 short phrases, max 25 characters each, no punctuation at the end.
campaign_idYesThe campaign id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run. Validates the assets only; linking is skipped in dry-run.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYese.g. "Contact form submit".
categoryNoWhat the action represents. Leads: SUBMIT_LEAD_FORM, REQUEST_QUOTE, BOOK_APPOINTMENT, PHONE_CALL_LEAD, CONTACT. Sales: PURCHASE.SUBMIT_LEAD_FORM
customer_idYesGoogle Ads customer id.
counting_typeNoONE_PER_CLICK for leads, MANY_PER_CLICK for purchases.ONE_PER_CLICK
default_valueNoValue per conversion in account currency (helps value-based bidding).
validate_onlyNoDry-run only.
primary_for_goalNoWhether campaigns bid on this action by default.
login_customer_idNoManager account id if applicable.
always_use_default_valueNoTrue to ignore values sent by the tag.
click_through_lookback_window_daysNo1-90.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationsNoGeo targets to include or exclude (ids from suggest_geo_targets).
campaign_idYesThe campaign id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
language_codesNoISO codes, e.g. ["en", "ar"]. Resolved to language constants.
login_customer_idNoManager account id if applicable.
negative_keywordsNoSearch terms the campaign must never show for.
negative_keyword_match_typeNoMatch type for the negatives (PHRASE is the usual choice).PHRASE

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCampaign name, unique within the account.
biddingNoMAXIMIZE_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_dateNoYYYY-MM-DD. Defaults to no end date.
budget_idYesId of a budget created with create_campaign_budget.
start_dateNoYYYY-MM-DD. Defaults to today.
target_cpaNoOptional target cost per acquisition in account currency (MAXIMIZE_CONVERSIONS only).
customer_idYesGoogle Ads customer id.
target_roasNoOptional target return on ad spend as a ratio, e.g. 4.0 = 400% (MAXIMIZE_CONVERSION_VALUE only).
validate_onlyNoDry-run against the API without creating anything.
login_customer_idNoManager account id if applicable.
location_targetingNoPRESENCE 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_ceilingNoOptional max CPC ceiling in account currency (MAXIMIZE_CLICKS / MAXIMIZE_CONVERSIONS).
include_display_networkNoDisplay expansion. Default off; keep off for Search.
include_search_partnersNoShow on Google search partner sites. Default off.
contains_eu_political_advertisingNoDeclare EU political advertising (required declaration; default false).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesBudget name, unique within the account.
customer_idYesGoogle Ads customer id (digits only).
daily_amountYesAverage 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_onlyNoDry-run against the API without creating anything.
delivery_methodNoSTANDARD spreads spend across the day. Leave as STANDARD.STANDARD
explicitly_sharedNoTrue to allow several campaigns to share this budget.
login_customer_idNoManager account id if the customer is accessed through a manager.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 CriteriaA
Destructive

Removes campaign criteria (locations, languages, negatives) by criterion id. Needs confirm=true.

Find criterion ids with search on campaign_criterion (campaign_criterion.criterion_id).

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
campaign_idYes
customer_idYes
criterion_idsYes
validate_onlyNo
login_customer_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 StatusA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesENABLED, PAUSED or REMOVED.
confirmNoRequired true for ENABLED and REMOVED.
campaign_idYesThe campaign id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines4/5

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 TargetsA
Read-only

Looks up geo target ids for place names. Use before add_campaign_targeting.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNoLanguage of the names, e.g. en.en
country_codeNoTwo-letter country to search within, e.g. AE, PT, GB, US.AE
location_namesYesPlace names, e.g. ["Dubai", "Abu Dhabi", "United Arab Emirates"].
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name.
end_dateNoNew end date YYYY-MM-DD.
budget_idNoId of another existing budget to attach.
start_dateNoNew start date YYYY-MM-DD (only before the campaign has started).
campaign_idYesThe campaign id.
customer_idYesGoogle Ads customer id.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 BudgetA
Destructive

Changes the daily amount of an existing budget. Needs confirm=true to apply.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to apply. False returns a validated preview.
budget_idYesThe campaign budget id (campaign_budget.id in GAQL, or from campaign.campaign_budget).
customer_idYesGoogle Ads customer id.
daily_amountYesNew average daily budget in account currency. Capped by ADS_MCP_MAX_DAILY_BUDGET.
validate_onlyNoDry-run only.
login_customer_idNoManager account id if applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 CustomersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MetadataA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
resource_nameYesThe name of the Google Ads resource (e.g., 'campaign', 'ad_group').
login_customer_idNoOptional manager customer ID to use as the login-customer-id header.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 23 tool updatesv0.0.4
    • First observedad_groups_add_ad_group_negative_keywords
    • First observedad_groups_add_keywords
    • First observedad_groups_create_ad_group
    • First observedad_groups_set_ad_group_status
    • First observedad_groups_set_keyword_status
    • First observedad_groups_update_ad_group_cpc_bid
    • First observedads_create_responsive_search_ad
    • First observedads_set_ad_status
    • First observedads_update_responsive_search_ad
    • First observedassets_add_callouts
    • First observedassets_add_sitelinks
    • First observedassets_create_conversion_action
    • First observedcampaigns_add_campaign_targeting
    • First observedcampaigns_create_campaign
    • First observedcampaigns_create_campaign_budget
    • First observedcampaigns_remove_campaign_criteria
    • First observedcampaigns_set_campaign_status
    • First observedcampaigns_suggest_geo_targets
    • First observedcampaigns_update_campaign
    • First observedcampaigns_update_campaign_budget
    • First observedcustomers_list_accessible_customers
    • First observedmetadata_get_resource_metadata
    • First observedsearch_search

TDQS

B3.4/5.0

Scored across 23 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    11
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    96
    MIT
  • F
    license
    A
    quality
    B
    maintenance
    Enables 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
    -