google-ads-mcp-plus
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GOOGLE_ADS_DEVELOPER_TOKEN | Yes | Your Google Ads developer token. |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| server_statusA | Report this server's mode, allowlisted accounts, and safety limits. Call this first if you are unsure what the server is permitted to do. |
| list_accountsA | List Google Ads accounts these credentials can reach. Returns every accessible customer ID, marking which are allowlisted for this server. |
| run_auditA | Audit an account and report what is costing money or hiding data. Runs 12 read-only checks: conversion tracking, campaigns spending with no conversions, budget- and rank-lost impression share, wasteful search terms, low Quality Score keywords, weak RSAs, disapproved ads, missing negatives and sitelinks. Never modifies anything. Args: customer_id: Account to audit (digits, dashes are stripped). days: Lookback window; the window ends yesterday. Default 30. min_spend: Ignore entities below this spend, in account currency. |
| gaql_queryA | Run a read-only GAQL query against an account. Use this for anything the packaged tools do not cover. Only SELECT queries are accepted — this cannot modify data. Args: customer_id: Account to query. query: A GAQL SELECT statement. limit: Maximum rows to return (default 100, hard cap 1000). |
| list_campaignsA | List campaigns with their budget, status, spend and conversions. Args: customer_id: Account to inspect. days: Metrics lookback window, ending yesterday. status: ENABLED, PAUSED, REMOVED, or ALL. |
| update_campaign_budgetA | Change a campaign's daily budget. Two-phase: preview, then confirm. Call without confirm_token to see the current value, the proposed value, and the percentage change. If it is within limits you receive a token; call again with that token to apply it. Args: customer_id: Account holding the campaign. campaign_id: Campaign whose budget changes. new_daily_budget: New daily amount in account currency. confirm_token: Token from the preview call. Omit for a preview. |
| set_campaign_statusA | Pause or enable a campaign. Two-phase: preview, then confirm. Args: customer_id: Account holding the campaign. campaign_id: Campaign to change. status: PAUSED or ENABLED. confirm_token: Token from the preview call. Omit for a preview. |
| add_negative_keywordsA | Add campaign-level negative keywords. Two-phase: preview, then confirm. This is the safest write operation: negatives only ever reduce spend. Args: customer_id: Account holding the campaign. campaign_id: Campaign to add negatives to. keywords: Terms to exclude. match_type: EXACT, PHRASE, or BROAD. Default EXACT. confirm_token: Token from the preview call. Omit for a preview. |
| create_performance_max_campaignA | Create a Performance Max campaign, PAUSED. Two-phase: preview, confirm. Without a token, this validates the whole request against the API (validate_only) and returns a preview plus a confirmation token — nothing is created. Call again with the token to create it for real. Everything goes in one atomic mutate: budget, campaign, geo/language criteria, negatives, asset group, text assets, and reused image and extension assets. If anything fails, nothing is created. Image and extension assets are REUSED by ID — this tool never uploads
images. Find existing asset IDs with gaql_query on the Args: customer_id: Account to create in. Must be allowlisted. campaign_name: Name of the new campaign. daily_budget: Daily budget in account currency. final_url: Landing page for the asset group. business_name: Advertiser name, max 25 characters. headlines: At least 3, each max 30 characters. long_headlines: At least 1, each max 90 characters. descriptions: At least 2, each max 90 characters. geo_target_ids: Geo target constant IDs. language_ids: Language constant IDs (1002 = French, 1000 = English). negative_keywords: Phrase-match exclusions, e.g. brand terms. marketing_image_asset_ids: Existing 1.91:1 image asset IDs. square_marketing_image_asset_ids: Existing 1:1 image asset IDs. logo_asset_ids: Existing logo asset IDs. sitelink_asset_ids: Existing sitelink asset IDs to link. callout_asset_ids: Existing callout asset IDs (max 20). bidding: maximize_conversions or maximize_conversion_value. target_cpa: Optional target CPA, account currency. target_roas: Optional target ROAS, e.g. 3.5. confirm_token: Token from the preview call. Omit for a preview. |
| validate_pmax_assetsA | Check Performance Max TEXT assets against Google's limits — offline. No account, no credentials needed. Use this while drafting copy, before creating anything: at least 3 headlines (30 chars), 1 long headline (90 chars), 2 descriptions (90 chars), and a business name (25 chars). This checks text only. Creating a campaign additionally requires at least one marketing image (1.91:1), one square marketing image (1:1), and one logo — those are validated by create_performance_max_campaign, not here. |
| create_shopping_campaignA | Create a Standard Shopping campaign, PAUSED. Two-phase. Builds budget, campaign, ad group, an empty product ad, and an exhaustive listing group tree: one biddable node per included value, plus a mandatory excluded catch-all for everything else. Without a token you get a preview validated by the API; call again with the token to create it. Args: customer_id: Account to create in. Must be allowlisted. campaign_name: Name of the new campaign. daily_budget: Daily budget in account currency. merchant_id: Merchant Center account holding the product feed. feed_label: Feed label, exactly as it appears in Merchant Center. This replaced sales_country. include_values: Values to bid on, e.g. the exact product_type strings from Merchant Center. Everything else is excluded. dimension: product_type_level1/2/3, brand, condition, or item_id. ad_group_name: Defaults to the campaign name. campaign_priority: 0 low, 1 medium, 2 high. Decides which campaign bids when several cover the same product. geo_target_ids: Geo target constant IDs. language_ids: Language constant IDs (1002 French, 1000 English). confirm_token: Token from the preview call. Omit for a preview. |
| apply_negative_keyword_listA | Create or extend a SHARED negative keyword list. Two-phase. Prefer this over add_negative_keywords whenever the same exclusions apply to several campaigns: one shared list means one edit updates them all, instead of duplicating negatives campaign by campaign. Idempotent — an existing list of the same name is reused, and only missing keywords and links are added. Running it twice does nothing. Args: customer_id: Account holding the campaigns. list_name: Name of the shared list, e.g. "Brand exclusions". keywords: Terms to exclude. campaign_ids: Campaigns the list applies to. match_type: EXACT, PHRASE, or BROAD. PHRASE is the usual choice. confirm_token: Token from the preview call. Omit for a preview. |
| validate_ad_copyA | Check ad copy against Google's character limits — offline, no account. Use this while drafting, before creating anything. Headlines must be <=30 characters, descriptions <=90, paths <=15. Counts CJK and full-width characters as two, matching the Google UI. |
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 13 tools
Most tools are clearly distinct, but validate_pmax_assets and validate_ad_copy both check ad copy limits, and add_negative_keywords vs apply_negative_keyword_list have overlapping purposes (campaign-level vs shared list). These pairs could cause misselection, though descriptions clarify the differences.
All tools follow a consistent verb_noun snake_case pattern (list_accounts, update_campaign_budget, create_performance_max_campaign, etc.). Even server_status fits as a status check. No mixed conventions or vague verbs.
13 tools is well-scoped for a Google Ads management server. Each tool serves a distinct function, and the count is neither too thin nor bloated. It covers auditing, querying, campaign management, and offline validation without unnecessary redundancy.
The toolset covers core lifecycle operations: list, create, update (budget/status), and add negatives, plus a raw GAQL escape hatch. Missing delete operations (e.g., remove campaign, remove negative keyword) are the only notable gap, but the audit and query tools compensate for exploratory needs.