google-ads-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GOOGLE_ADS_API_VERSION | No | Default v24. Bump when Google releases a new version; versions sunset roughly yearly | v24 |
| GOOGLE_ADS_CUSTOMER_ID | No | Default client account when a tool call omits customer_id | |
| GOOGLE_ADS_REFRESH_TOKEN | Yes | Refresh token with the adwords scope | |
| GOOGLE_ADS_DEVELOPER_TOKEN | Yes | From API Center in a manager account | |
| GOOGLE_ADS_OAUTH_CLIENT_ID | Yes | OAuth 2.0 client ID | |
| GOOGLE_ADS_LOGIN_CUSTOMER_ID | No | Manager (MCC) account to authenticate through; needed when the account is accessed via a manager | |
| GOOGLE_ADS_OAUTH_CLIENT_SECRET | Yes | OAuth 2.0 client secret |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_accessible_customersA | List the Google Ads accounts reachable with the configured credentials: the accounts the OAuth user can access directly, plus the full client tree under GOOGLE_ADS_LOGIN_CUSTOMER_ID when it is a manager (MCC). Use this to find a customer_id. |
| account_overviewA | Account details (name, currency, time zone, auto-tagging, status) plus account-wide totals for the date range: impressions, clicks, cost, conversions. |
| list_campaignsA | List campaigns with status, channel type, bidding strategy, daily budget (currency units), schedule and serving status. No metrics; use campaign_performance for those. |
| list_ad_groupsA | List ad groups (id, name, status, type, default CPC bid) with their campaign. Optionally filter to one campaign. |
| list_adsA | List ads with type, status, policy approval, ad strength, final URLs and — for responsive search ads — all headlines and descriptions with pinning. Filter by campaign or ad group. |
| campaign_performanceA | Per-campaign metrics for a date range: impressions, clicks, CTR, avg CPC, cost, conversions, conversion value, cost/conv, plus search impression share. Optionally segment by date/week/month/device/network. Money is in account currency units. |
| ad_group_performanceA | Per-ad-group metrics for a date range, optionally filtered to a campaign and segmented. |
| keyword_performanceA | Per-keyword metrics for a date range with match type, status, quality score and effective CPC bid. Filter by campaign or ad group. Sorted by cost. |
| search_terms_reportA | Actual search queries that triggered your ads, with the matching keyword, status (ADDED/EXCLUDED/NONE) and metrics. The main source for finding negative keywords to add. Sorted by impressions. |
| geo_performanceA | Metrics by user location for a date range (country/region/city geo target constants). Resolve the constant names with gaql_search on geo_target_constant if needed. |
| gaql_searchA | Run any Google Ads Query Language (GAQL) query against a customer. Use for anything the specific report tools do not cover (assets, conversion actions, change history, bidding strategies, audiences, geo targets, budgets, recommendations…). Pagination is handled; rows are capped by limit. Money fields are converted from micros unless convert_micros is false. Use gaql_fields to discover selectable fields. |
| gaql_fieldsA | Look up GAQL fields, resources, segments and metrics: data type, whether selectable/filterable/sortable, enum values, and which resources they can be selected with. Use name_like with SQL wildcards (e.g. 'campaign.%' for every campaign field, 'metrics.%conversion%'). |
| set_campaign_statusA | Set a campaign to ENABLED or PAUSED. |
| set_campaign_budgetA | Change a campaign's daily budget, given in account currency units (e.g. 5.50). Looks up the campaign's budget resource first. Refuses to change a shared budget unless allow_shared is true, since that affects every campaign using it. |
| set_ad_group_statusA | Set an ad group to ENABLED or PAUSED. |
| set_ad_statusA | Set an ad (within its ad group) to ENABLED or PAUSED. |
| update_keywordA | Change a keyword's status (ENABLED/PAUSED) and/or its max CPC bid (currency units). Identify the keyword by ad_group_id and criterion_id from keyword_performance. |
| add_keywordsA | Add keywords to an ad group. Each keyword has text, match type and an optional max CPC bid (currency units). Set validate_only to check for policy/duplicate errors without saving. |
| add_negative_keywordsA | Add negative keywords at campaign level (default) or ad group level. Typical follow-up to search_terms_report. Negatives at campaign level block the term for every ad group in the campaign. |
| remove_resourceA | Remove (soft-delete) a keyword, negative keyword, ad, ad group or campaign by its resource name (e.g. customers/123/adGroupCriteria/456~789). Removal is permanent in Google Ads; removed entities stay visible in reports with status REMOVED. |
| mutateA | Advanced: send raw GoogleAdsService.mutate operations using REST field names (camelCase), e.g. [{ campaignOperation: { update: { resourceName, status }, updateMask: 'status' } }]. Supports every resource the API can create/update/remove (campaigns, ads, assets, conversion actions, extensions…). Use validate_only: true first to dry-run. Operations are atomic unless partial_failure is true. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 21 tools
Multiple tools have overlapping purposes, e.g., set_ad_group_status, set_campaign_status, set_ad_status, update_keyword, and mutate all modify statuses or bids. The generic mutate duplicates nearly all specific tools, creating significant ambiguity in choosing the right tool.
Naming conventions are inconsistent. Some tools follow verb_noun (set_ad_group_status), others use noun_verb (gaql_search), and some are generic (mutate). The mix of snake_case and camelCase in tool names (e.g., gaql_search vs. update_keyword) further reduces predictability.
With 21 tools, the count is within the 16-25 range, but many tools are redundant (e.g., multiple status setters, update_keyword vs. mutate). The surface area could be trimmed to ~10 distinct tools without losing functionality, making the set feel heavy.
The tool set covers most Google Ads entities (campaigns, ad groups, ads, keywords, search terms, geo) and provides a generic GAQL query and mutate for advanced operations. However, it lacks specific create/read operations for some entities and relies on generic tools, leaving minor gaps in direct coverage.