google-ads-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@google-ads-mcp Show me my top performing campaigns by conversions this month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Ads 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 clientsClient-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 syncRun (stdio, default):
uv run google-ads-mcpOption 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 --buildOr 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-mcpDocker 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 .envVariable | Required | Description |
| yes | API developer token |
| yes | Path to service account JSON |
| MCC | Login customer / MCC ID |
| no | Default customer ID |
| no | Workspace user for domain-wide delegation |
Never commit .env, service account JSON, tokens, or keys.
MCP transports
Transport | Command | Use when |
stdio (default) |
| Cursor, Claude, Gemini CLI launch the process |
streamable-http |
| Remote clients (ChatGPT) or URL-based MCP |
sse |
| Legacy SSE clients |
HTTP bind options:
uv run google-ads-mcp --transport streamable-http --host 0.0.0.0 --port 8000Env overrides: MCP_TRANSPORT, MCP_HOST, MCP_PORT (or PORT).
Client setup
Client | Mode | Guide |
Cursor | Local stdio (optional HTTP) | |
Claude | Local stdio + plugin | |
Gemini CLI | Local stdio (optional HTTP) | |
ChatGPT | Remote MCP / Secure Tunnel |
Example configs live under clients/.
LOCAL MCP vs REMOTE MCP
LOCAL (stdio): the client starts
google-ads-mcpas 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=TrueServer 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 --helpPackage name: google-ads-mcp
Import package: google_ads_mcp
Entry point: google-ads-mcp
Testing
uv run pytestTests mock the Google Ads API — no real credentials required.
Troubleshooting
Symptom | Fix |
| Check |
Client cannot start server | Use absolute paths; ensure |
ChatGPT cannot connect to stdio | Deploy streamable-http (or Secure MCP Tunnel) instead |
Docker credential errors | Set |
Contributing
See CONTRIBUTING.md.
License
Apache-2.0 — see LICENSE.
Available Tools
47 toolsadd_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_microsARead-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_gaqlARead-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_hierarchyARead-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_infoARead-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_summaryARead-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_detailsARead-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_groupCRead-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_performanceARead-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_detailsARead-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_performanceARead-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_utilizationARead-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_campaignBRead-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_performanceARead-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_metadataARead-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_performanceBRead-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_reportARead-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_performanceARead-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_reportARead-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_accountsARead-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_groupsARead-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_adsARead-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_groupsARead-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_budgetsARead-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_campaignsARead-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_resourcesARead-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_keywordsARead-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_groupADestructiveIdempotent
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_campaignADestructiveIdempotent
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_keywordADestructiveIdempotent
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_statusADestructiveIdempotent
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_statusADestructiveIdempotent
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_statusADestructiveIdempotent
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_groupAIdempotent
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_budgetAIdempotent
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_campaignAIdempotent
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_bidAIdempotent
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
Scored across 47 tools
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.
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.
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.
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
Related MCP Connectors
Full Google Ads management: read (campaigns, performance, ROAS, keywords, search terms) and write (p
Manage Google, Meta, TikTok, Snapchat and LinkedIn ads, plus GA4, Tag Manager and Search Console, by chat from Claude or ChatGPT. Spend increases need your confirmation first.
Build, edit and sync Google, Microsoft, Reddit and Meta ad campaigns from your assistant.
Google Ads analysis and operations — read performance, manage keywords, bids, and campaigns.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables comprehensive Google Ads campaign management and analysis through natural language, including performance metrics, keyword optimization, budget management, and custom GAQL queries.10017MIT
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive access to Google Ads API v20, enabling AI assistants to manage campaigns, accounts, assets, and reporting through natural language. It features automatic retry logic, GAQL query support, and advanced functionality for Performance Max and Demand Gen campaigns.11MIT
- AlicenseNot gradedqualityDmaintenanceProvides 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.26MIT