Skip to main content
Glama
google-ads-mcp

google-ads-mcp

by eneelkant

Google Ads MCP Server

Universal Model Context Protocol (MCP) server for Google Ads — one implementation, many AI clients.

Works with:

  • Cursor

  • Claude (Desktop, Code, Cowork plugin)

  • Gemini CLI

  • ChatGPT / OpenAI (remote MCP or Secure MCP Tunnel)

  • Any other MCP-compatible client

~47 tools cover accounts, campaigns, ad groups, ads, keywords, Performance Max, budgets, reporting, and utilities.

Architecture

Google Ads API
      │
      ▼
Google Ads MCP Server   ←── single source of truth
      │
      ├── Cursor
      ├── Claude
      ├── Gemini
      ├── ChatGPT
      └── Other MCP clients

Client-specific folders under clients/ only explain how to launch or connect. They do not reimplement the Google Ads API.

See docs/architecture.md.

Related MCP server: Google Ads MCP Server

Requirements

  • Python 3.12+

  • uv or Docker

  • Google Ads API developer token

  • GCP service account JSON key with Google Ads API access

Installation

The repository is public — clone without GitHub authentication.

Option 1 — uv

git clone https://github.com/eneelkant/google-ads-claude-plugin.git
cd google-ads-claude-plugin
uv sync

Run (stdio, default):

uv run google-ads-mcp

Option 2 — Docker

git clone https://github.com/eneelkant/google-ads-claude-plugin.git
cd google-ads-claude-plugin

export GOOGLE_ADS_DEVELOPER_TOKEN=your-developer-token
export GOOGLE_ADS_LOGIN_CUSTOMER_ID=your-mcc-customer-id
export GOOGLE_ADS_SERVICE_ACCOUNT_HOST_PATH=/absolute/path/to/service-account.json

docker compose up --build

Or build/run manually:

docker build -t google-ads-mcp .
docker run --rm -p 8000:8000 \
  -e GOOGLE_ADS_DEVELOPER_TOKEN \
  -e GOOGLE_ADS_LOGIN_CUSTOMER_ID \
  -e GOOGLE_ADS_SERVICE_ACCOUNT_PATH=/credentials/service-account.json \
  -v /absolute/path/to/service-account.json:/credentials/service-account.json:ro \
  google-ads-mcp

Docker defaults to streamable-http on port 8000. Credentials are mounted at runtime — never copied into the image.

Google Ads credentials

Copy the example env file:

cp .env.example .env

Variable

Required

Description

GOOGLE_ADS_DEVELOPER_TOKEN

yes

API developer token

GOOGLE_ADS_SERVICE_ACCOUNT_PATH

yes

Path to service account JSON

GOOGLE_ADS_LOGIN_CUSTOMER_ID

MCC

Login customer / MCC ID

GOOGLE_ADS_CUSTOMER_ID

no

Default customer ID

GOOGLE_ADS_IMPERSONATED_EMAIL

no

Workspace user for domain-wide delegation

Never commit .env, service account JSON, tokens, or keys.

MCP transports

Transport

Command

Use when

stdio (default)

uv run google-ads-mcp

Cursor, Claude, Gemini CLI launch the process

streamable-http

uv run google-ads-mcp --transport streamable-http

Remote clients (ChatGPT) or URL-based MCP

sse

uv run google-ads-mcp --transport sse

Legacy SSE clients

HTTP bind options:

uv run google-ads-mcp --transport streamable-http --host 0.0.0.0 --port 8000

Env overrides: MCP_TRANSPORT, MCP_HOST, MCP_PORT (or PORT).

Client setup

Client

Mode

Guide

Cursor

Local stdio (optional HTTP)

docs/clients/cursor.md

Claude

Local stdio + plugin

docs/clients/claude.md

Gemini CLI

Local stdio (optional HTTP)

docs/clients/gemini.md

ChatGPT

Remote MCP / Secure Tunnel

docs/clients/chatgpt.md

Example configs live under clients/.

LOCAL MCP vs REMOTE MCP

  • LOCAL (stdio): the client starts google-ads-mcp as a child process.

  • REMOTE (HTTP): you run the server (or Docker) and the client connects to https://host/mcp. ChatGPT requires remote MCP or a Secure MCP Tunnel — it does not spawn local stdio servers.

Capabilities

  • Accounts & MCC hierarchy

  • Search / Display / Video / Demand Gen / Performance Max campaigns

  • Ad groups, RSAs, RDAs, video & Demand Gen ads

  • Keywords, bids, search terms

  • Budgets & utilization

  • GAQL reporting and performance summaries

Full list: docs/tools.md.

Security

  • Credentials via environment / mounted secrets only

  • Destructive removals require confirm_removal=True

  • Server cannot change billing, user access, or Google account permissions

  • See SECURITY.md

Development

uv sync --all-groups
uv run pytest -q
uv run google-ads-mcp --help

Package name: google-ads-mcp
Import package: google_ads_mcp
Entry point: google-ads-mcp

Testing

uv run pytest

Tests mock the Google Ads API — no real credentials required.

Troubleshooting

Symptom

Fix

Google Ads client is not available

Check GOOGLE_ADS_* env vars and service account path

Client cannot start server

Use absolute paths; ensure uv is on PATH

ChatGPT cannot connect to stdio

Deploy streamable-http (or Secure MCP Tunnel) instead

Docker credential errors

Set GOOGLE_ADS_SERVICE_ACCOUNT_HOST_PATH to a real JSON file

Contributing

See CONTRIBUTING.md.

License

Apache-2.0 — see LICENSE.

Available Tools

47 tools
add_assets_to_groupA

Add assets to an existing asset group (batch link operation).

Args: customer_id: Google Ads customer ID. asset_group_id: Asset group ID. assets: List of asset dicts, each with: - asset_resource_name (str): Full asset resource name. - field_type (str): Asset field type -- 'HEADLINE', 'LONG_HEADLINE', 'DESCRIPTION', 'BUSINESS_NAME', 'MARKETING_IMAGE', 'SQUARE_MARKETING_IMAGE', 'LOGO', 'YOUTUBE_VIDEO', 'CALL_TO_ACTION_SELECTION'.

Example: assets=[ {"asset_resource_name": "customers/123/assets/456", "field_type": "HEADLINE"}, {"asset_resource_name": "customers/123/assets/789", "field_type": "MARKETING_IMAGE"}, ]

Inputs: assets (required), customer_id (required), asset_group_id (required).

add_audience_signalA

Add audience or search theme signals to a PMax asset group.

Audience signals help Google's AI find the right customers. They're suggestions, not hard targeting constraints.

Args: customer_id: Google Ads customer ID. asset_group_id: Asset group ID. audience_resource_name: Audience resource name (from audience manager). search_themes: List of search theme strings (keywords that describe your ideal customer).

Inputs: customer_id (required), asset_group_id (required), search_themes, audience_resource_name.

add_keywordsA

Add keywords to an ad group (batch operation).

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID to add keywords to. keywords: List of keyword dicts, each with: - text (str): The keyword text. - match_type (str): 'EXACT', 'PHRASE', or 'BROAD'. - cpc_bid (float, optional): Max CPC bid in currency.

Example: keywords=[ {"text": "buy shoes online", "match_type": "PHRASE", "cpc_bid": 1.50}, {"text": "running shoes", "match_type": "BROAD"}, {"text": "[red running shoes]", "match_type": "EXACT", "cpc_bid": 2.00}, ]

Inputs: keywords (required), ad_group_id (required), customer_id (required).

convert_microsA
Read-only

Convert between micros and currency amounts.

Google Ads uses micros for monetary values: $1.00 = 1,000,000 micros.

Args: value: The value to convert. direction: 'to_micros' (currency to micros) or 'from_micros' (micros to currency).

Inputs: value (required), direction.

create_ad_groupA

Create a new ad group in a campaign.

Args: customer_id: Google Ads customer ID. campaign_id: Campaign ID to create the ad group in. name: Ad group name. cpc_bid: Max CPC bid in currency (e.g., 2.50 for $2.50). target_cpa: Target CPA in currency (overrides campaign-level if set). ad_group_type: Ad group type -- 'SEARCH_STANDARD', 'DISPLAY_STANDARD', 'VIDEO_TRUE_VIEW_IN_STREAM', 'VIDEO_BUMPER', etc. status: Initial status -- 'ENABLED' (default) or 'PAUSED'.

Inputs: name (required), campaign_id (required), customer_id (required), status, +3 more.

create_budgetA

Create a new campaign budget.

Args: customer_id: Google Ads customer ID. name: Budget name. amount: Daily budget amount in currency (e.g., 50.00 for $50/day). delivery_method: 'STANDARD' (spread evenly) or 'ACCELERATED'. explicitly_shared: If True, budget can be shared across multiple campaigns.

Inputs: name (required), amount (required), customer_id (required), delivery_method, +1 more.

create_campaignA

Create a new campaign with a budget.

Creates both the campaign budget and campaign in a single atomic operation. Campaign is created as PAUSED by default for safety.

Args: customer_id: Google Ads customer ID. name: Campaign name. budget_amount: Daily budget in currency (e.g., 50.00 for $50/day). channel_type: Campaign type -- 'SEARCH', 'DISPLAY', 'VIDEO', 'DEMAND_GEN', 'SHOPPING'. bidding_strategy: Bidding strategy -- 'MAXIMIZE_CONVERSIONS', 'MAXIMIZE_CONVERSION_VALUE', 'MAXIMIZE_CLICKS', 'TARGET_SPEND', 'MANUAL_CPC', 'TARGET_CPA', 'TARGET_ROAS'. target_cpa: Target CPA in currency (required if bidding_strategy is TARGET_CPA). target_roas: Target ROAS as a decimal (e.g., 3.0 for 300% ROAS). network_settings: Optional dict with keys: target_google_search, target_search_network, target_content_network (all bool). start_date: Campaign start date (YYYY-MM-DD). Defaults to today. end_date: Optional campaign end date (YYYY-MM-DD). status: Initial status -- 'PAUSED' (default, recommended) or 'ENABLED'.

Inputs: name (required), customer_id (required), budget_amount (required), status, +7 more.

create_demand_gen_adA

Create a Demand Gen ad (serves on YouTube, Gmail, Discover).

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID (must be in a Demand Gen campaign). headlines: 1-5 headlines (max 40 chars each). descriptions: 1-5 descriptions (max 90 chars each). marketing_images: Landscape image asset resource names. logo_images: Logo asset resource names. final_urls: Landing page URLs. business_name: Business name. call_to_action_text: Optional CTA text. status: Ad status -- 'ENABLED' (default) or 'PAUSED'.

Inputs: headlines (required), final_urls (required), ad_group_id (required), customer_id (required), +6 more.

create_performance_max_campaignA

Create a complete Performance Max campaign with budget, campaign, and asset group.

Creates everything in a single atomic batch operation using temporary IDs. Campaign is created as PAUSED by default for safety.

PMax minimum requirements:

  • 3+ headlines (max 30 chars each)

  • 1+ long headlines (max 90 chars)

  • 2+ descriptions (max 90 chars each)

  • 1 business name

  • Final URLs

  • Image assets should be pre-uploaded (use asset resource names)

Args: customer_id: Google Ads customer ID. campaign_name: Campaign name. budget_amount: Daily budget in currency. asset_group_name: Name for the asset group. final_urls: Landing page URLs. headlines: 3-15 headlines (max 30 chars each). long_headlines: 1-5 long headlines (max 90 chars each). descriptions: 2-5 descriptions (max 90 chars each). business_name: Business name for the asset group. marketing_image_assets: Landscape image asset resource names (1200x628). square_image_assets: Square image asset resource names (1200x1200). logo_assets: Logo image asset resource names. youtube_video_assets: YouTube video asset resource names. bidding_strategy: 'MAXIMIZE_CONVERSIONS' or 'MAXIMIZE_CONVERSION_VALUE'. target_cpa: Target CPA (for maximize_conversions with target). target_roas: Target ROAS (for maximize_conversion_value with target). status: Initial status -- 'PAUSED' (default) or 'ENABLED'.

Inputs: headlines (required), final_urls (required), customer_id (required), descriptions (required), +13 more.

create_responsive_display_adA

Create a Responsive Display Ad for Display campaigns.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID (must be in a Display campaign). headlines: 1-5 short headlines (max 30 chars each). long_headline: Long headline (max 90 chars). descriptions: 1-5 descriptions (max 90 chars each). marketing_images: List of landscape image asset resource names (1200x628). square_marketing_images: List of square image asset resource names (1200x1200). logo_images: List of logo asset resource names. business_name: Business name (max 25 chars). final_urls: Landing page URLs. call_to_action_text: Optional CTA text. status: Ad status -- 'ENABLED' (default) or 'PAUSED'.

Inputs: headlines (required), final_urls (required), ad_group_id (required), customer_id (required), +8 more.

create_responsive_search_adA

Create a Responsive Search Ad (RSA) for Search campaigns.

Google will automatically test combinations of headlines and descriptions.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID (must be in a Search campaign). headlines: 3-15 headline strings (max 30 chars each). descriptions: 2-4 description strings (max 90 chars each). final_urls: List of landing page URLs (at least one required). path1: Optional display URL path 1 (max 15 chars). path2: Optional display URL path 2 (max 15 chars, requires path1). status: Ad status -- 'ENABLED' (default) or 'PAUSED'.

Inputs: headlines (required), final_urls (required), ad_group_id (required), customer_id (required), +4 more.

create_video_adA

Create a Video ad for Video campaigns (YouTube).

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID (must be in a Video campaign). youtube_video_id: YouTube video ID (e.g., 'dQw4w9WgXcQ'). final_urls: Landing page URLs. headline: Optional headline for the ad. description: Optional description. call_to_action_text: CTA button text (e.g., 'Learn More', 'Shop Now'). ad_format: Video ad format -- 'IN_STREAM' (skippable), 'BUMPER' (6-sec non-skip), 'IN_FEED' (discovery/in-feed). companion_banner_asset: Optional companion banner image asset resource name. status: Ad status -- 'ENABLED' (default) or 'PAUSED'.

Inputs: final_urls (required), ad_group_id (required), customer_id (required), youtube_video_id (required), +6 more.

execute_gaqlA
Read-only

Execute an arbitrary GAQL (Google Ads Query Language) query.

This is the most flexible tool -- use it for any read query not covered by other tools. GAQL reference: https://developers.google.com/google-ads/api/docs/query/overview

Args: customer_id: Google Ads customer ID. query: Full GAQL query string (SELECT ... FROM ... WHERE ...).

Inputs: query (required), customer_id (required).

get_account_hierarchyA
Read-only

Get the MCC account hierarchy tree.

Lists all child accounts under the given MCC account.

Args: customer_id: MCC customer ID. Uses default if not provided.

Inputs: customer_id.

get_account_infoA
Read-only

Get details for a Google Ads account (name, currency, timezone, etc.).

Args: customer_id: Google Ads customer ID (e.g., '123-456-7890' or '1234567890').

Inputs: customer_id (required).

get_account_performance_summaryA
Read-only

Get account-level daily performance summary.

Args: customer_id: Google Ads customer ID. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD').

Inputs: customer_id (required), date_range.

get_ad_detailsA
Read-only

Get full details of an ad (headlines, descriptions, URLs, assets).

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID containing the ad. ad_id: Ad ID.

Inputs: ad_id (required), ad_group_id (required), customer_id (required).

get_ad_groupC
Read-only

Get details for a single ad group.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID.

Inputs: ad_group_id (required), customer_id (required).

get_ad_group_performanceA
Read-only

Get ad group performance metrics.

Args: customer_id: Google Ads customer ID. campaign_id: Optional -- filter to ad groups in this campaign. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD'). limit: Max rows (default 50).

Inputs: customer_id (required), limit, date_range, campaign_id.

get_asset_group_detailsA
Read-only

Get full details of an asset group including linked assets and signals.

Args: customer_id: Google Ads customer ID. asset_group_id: Asset group ID.

Inputs: customer_id (required), asset_group_id (required).

get_asset_performanceA
Read-only

Get asset-level performance labels (BEST, GOOD, LOW, etc.) for PMax.

Args: customer_id: Google Ads customer ID. campaign_id: Optional -- filter to a specific campaign. asset_group_id: Optional -- filter to a specific asset group.

Inputs: customer_id (required), campaign_id, asset_group_id.

get_budget_utilizationA
Read-only

Get budget vs actual spend for campaigns.

Shows how much of each campaign's budget has been utilized.

Args: customer_id: Google Ads customer ID. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD'). campaign_id: Optional -- filter to a single campaign.

Inputs: customer_id (required), date_range, campaign_id.

get_campaignB
Read-only

Get details for a single campaign.

Args: customer_id: Google Ads customer ID. campaign_id: The campaign ID.

Inputs: campaign_id (required), customer_id (required).

get_campaign_performanceA
Read-only

Get campaign performance metrics over a date range.

Args: customer_id: Google Ads customer ID. date_range: Date range -- use predefined (LAST_7_DAYS, LAST_30_DAYS, THIS_MONTH, LAST_MONTH, etc.) or custom 'YYYY-MM-DD,YYYY-MM-DD'. campaign_id: Optional -- filter to a single campaign. status_filter: Optional -- filter by status (ENABLED, PAUSED, REMOVED). limit: Max rows to return (default 50).

Inputs: customer_id (required), limit, date_range, campaign_id, +1 more.

get_field_metadataA
Read-only

Get selectable, filterable, and sortable fields for a GAQL resource.

Args: resource_type: Resource name (e.g., 'campaign', 'ad_group', 'ad_group_ad'). customer_id: Customer ID (uses default if not provided).

Inputs: resource_type (required), customer_id.

get_keyword_performanceB
Read-only

Get keyword performance metrics for an ad group.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD'). limit: Max rows (default 100).

Inputs: ad_group_id (required), customer_id (required), limit, date_range.

get_keyword_performance_reportA
Read-only

Get keyword-level performance metrics.

Args: customer_id: Google Ads customer ID. campaign_id: Optional campaign filter. ad_group_id: Optional ad group filter. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD'). limit: Max rows (default 100).

Inputs: customer_id (required), limit, date_range, ad_group_id, +1 more.

get_pmax_placement_performanceA
Read-only

Get PMax placement performance breakdown (Search, YouTube, Display, Discover, Gmail).

Args: customer_id: Google Ads customer ID. campaign_id: PMax campaign ID. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD').

Inputs: campaign_id (required), customer_id (required), date_range.

get_search_terms_reportA
Read-only

Get search terms that triggered your ads.

Args: customer_id: Google Ads customer ID. campaign_id: Optional campaign filter. ad_group_id: Optional ad group filter. date_range: Date range (predefined or 'YYYY-MM-DD,YYYY-MM-DD'). limit: Max rows (default 100).

Inputs: customer_id (required), limit, date_range, ad_group_id, +1 more.

list_accessible_accountsA
Read-only

List all Google Ads accounts accessible via current credentials.

Returns accounts accessible through the authenticated MCC or direct account.

Inputs: no named parameters.

list_ad_groupsA
Read-only

List ad groups in a campaign.

Args: customer_id: Google Ads customer ID. campaign_id: Campaign ID to list ad groups for. status_filter: Optional -- 'ENABLED', 'PAUSED', or 'REMOVED'. limit: Max ad groups to return (default 100).

Inputs: campaign_id (required), customer_id (required), limit, status_filter.

list_adsA
Read-only

List ads in an ad group with approval status.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID. status_filter: Optional -- 'ENABLED', 'PAUSED', or 'REMOVED'. limit: Max ads to return (default 50).

Inputs: ad_group_id (required), customer_id (required), limit, status_filter.

list_asset_groupsA
Read-only

List asset groups in a Performance Max campaign.

Args: customer_id: Google Ads customer ID. campaign_id: PMax campaign ID.

Inputs: campaign_id (required), customer_id (required).

list_budgetsA
Read-only

List campaign budgets in the account.

Args: customer_id: Google Ads customer ID. limit: Max budgets to return (default 100).

Inputs: customer_id (required), limit.

list_campaignsA
Read-only

List campaigns in a Google Ads account.

Args: customer_id: Google Ads customer ID. status_filter: Optional filter -- 'ENABLED', 'PAUSED', or 'REMOVED'. limit: Max campaigns to return (default 100).

Inputs: customer_id (required), limit, status_filter.

list_gaql_resourcesA
Read-only

List available GAQL FROM-clause resources for use with execute_gaql.

Returns commonly used resource names that can be queried via GAQL.

Inputs: no named parameters.

list_keywordsA
Read-only

List keywords in an ad group.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID. status_filter: Optional -- 'ENABLED', 'PAUSED', or 'REMOVED'. limit: Max keywords to return (default 200).

Inputs: ad_group_id (required), customer_id (required), limit, status_filter.

remove_asset_from_groupA
DestructiveIdempotent

Remove an asset from an asset group.

Args: customer_id: Google Ads customer ID. asset_group_id: Asset group ID. asset_resource_name: Full resource name of the asset to unlink. field_type: The field type of the asset link (e.g., 'HEADLINE', 'MARKETING_IMAGE'). confirm_removal: Must be True to proceed.

Inputs: field_type (required), customer_id (required), asset_group_id (required), asset_resource_name (required), +1 more.

remove_campaignA
DestructiveIdempotent

Soft-delete (remove) a campaign.

This is a destructive operation. The campaign will be set to REMOVED status.

Args: customer_id: Google Ads customer ID. campaign_id: Campaign ID to remove. confirm_removal: Must be True to proceed. Safety check for destructive operation.

Inputs: campaign_id (required), customer_id (required), confirm_removal.

remove_keywordA
DestructiveIdempotent

Remove a keyword from an ad group.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID containing the keyword. criterion_id: Keyword criterion ID to remove. confirm_removal: Must be True to proceed. Safety check.

Inputs: ad_group_id (required), customer_id (required), criterion_id (required), confirm_removal.

set_ad_group_statusA
DestructiveIdempotent

Set an ad group's status (enable, pause, or remove).

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID. status: New status -- 'ENABLED', 'PAUSED', or 'REMOVED'.

Inputs: status (required), ad_group_id (required), customer_id (required).

set_ad_statusA
DestructiveIdempotent

Set an ad's status (enable, pause, or remove).

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID containing the ad. ad_id: Ad ID. status: New status -- 'ENABLED', 'PAUSED', or 'REMOVED'.

Inputs: ad_id (required), status (required), ad_group_id (required), customer_id (required).

set_campaign_statusA
DestructiveIdempotent

Set a campaign's status (enable, pause, or remove).

Args: customer_id: Google Ads customer ID. campaign_id: Campaign ID. status: New status -- 'ENABLED', 'PAUSED', or 'REMOVED'.

Inputs: status (required), campaign_id (required), customer_id (required).

update_ad_groupA
Idempotent

Update an existing ad group.

Only provided fields will be updated.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID to update. name: New ad group name. cpc_bid: New max CPC bid in currency. target_cpa: New target CPA in currency. status: New status -- 'ENABLED', 'PAUSED', or 'REMOVED'.

Inputs: ad_group_id (required), customer_id (required), name, status, +2 more.

update_budgetA
Idempotent

Update an existing campaign budget.

Args: customer_id: Google Ads customer ID. budget_id: Budget ID to update. amount: New daily budget amount in currency. name: New budget name. delivery_method: New delivery method -- 'STANDARD' or 'ACCELERATED'.

Inputs: budget_id (required), customer_id (required), name, amount, +1 more.

update_campaignA
Idempotent

Update an existing campaign's properties.

Only provided fields will be updated.

Args: customer_id: Google Ads customer ID. campaign_id: Campaign ID to update. name: New campaign name. status: New status -- 'ENABLED', 'PAUSED'. target_cpa: New target CPA (for maximize_conversions with target). target_roas: New target ROAS (for maximize_conversion_value with target). start_date: New start date (YYYY-MM-DD). end_date: New end date (YYYY-MM-DD).

Inputs: campaign_id (required), customer_id (required), name, status, +4 more.

update_keyword_bidA
Idempotent

Update the CPC bid for a keyword.

Args: customer_id: Google Ads customer ID. ad_group_id: Ad group ID containing the keyword. criterion_id: Keyword criterion ID to update. cpc_bid: New max CPC bid in currency (e.g., 2.50 for $2.50).

Inputs: cpc_bid (required), ad_group_id (required), customer_id (required), criterion_id (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 47 tools

    Disambiguation3/5

    Most tools are clearly separated by resource and action, but several overlap: update_ad_group/set_ad_group_status and update_campaign/set_campaign_status/remove_campaign can all change status, and get_keyword_performance vs get_keyword_performance_report are nearly indistinguishable by name and purpose. The specialized ad-creation tools are distinct enough, but the status/removal and reporting overlaps will cause misselection.

    Naming Consistency4/5

    The set mostly follows a consistent verb_noun pattern (list_campaigns, create_ad_group, set_ad_group_status, remove_keyword). However, there are minor inconsistencies: add_keywords is plural while remove_keyword is singular, reporting tools mix performance/report/summary naming, and acronym usage varies between performance_max and pmax.

    Tool Count2/5

    47 tools is heavy for an agent to navigate, and several tools are redundant: status can be changed via update_* tools, set_*_status tools, and remove_campaign, and keyword performance has two near-duplicate tools. Even though Google Ads is a broad domain, this surface could be meaningfully consolidated.

    Completeness3/5

    There is good core coverage for campaigns, ad groups, budgets, keywords, PMax asset groups, and read-only reporting. However, there is no asset upload/creation tool even though creating display, video, and PMax ads requires pre-existing asset resource names, and there is no way to update ad content after creation. GAQL helps fill read gaps but not write/upload gaps.

    Maintenance

    ActivitySlowing
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Enables comprehensive Google Ads campaign management and analysis through natural language, including performance metrics, keyword optimization, budget management, and custom GAQL queries.
      100
      17
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables comprehensive management of Google Ads campaigns through natural language, including campaign creation, ad group management, keyword operations, Performance Max campaigns, conversion tracking, and performance insights with support for multiple accounts.
      3
      -
    • 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
      Provides full Google Ads API v21 access with 40+ tools for creating, optimizing, and managing campaigns, ad groups, keywords, extensions, and bidding strategies through natural language commands.
      26
      MIT