Skip to content
Agentmart
Submit a tool

Google Ads

Google Ads MCP with MCC support: 35 tools for campaigns, keywords, reporting, GAQL.

Connector by mharnett · GitHub account verified by the MCP Registry

IndexedMITLocal (stdio)★ 1
Write a review

Install

Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.

npx agentmarket install connector/mharnett-google-ads

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Google Ads MCP with MCC support: 35 tools for campaigns, keywords, reporting, GAQL.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 26, 2026.

Tools
20 read · 42 write · 6 delete · 9 not yet classified
Secrets
3 (API keys, tokens or passwords)
Install scripts
None found
Runs as
Node.js package

Tools by what they do 77

Read from the source code; the running server may list different tools.

Read 20 · Look things up without changing anything.

  • google_ads_ad_performance
  • google_ads_ad_performance_by_conversion
  • google_ads_get_ad_strength
  • google_ads_get_campaign_diagnostics
  • google_ads_get_campaign_tracking
  • google_ads_get_client_context
  • google_ads_get_experiment
  • google_ads_keyword_performance
  • google_ads_keyword_performance_by_conversion
  • google_ads_keyword_volume
  • google_ads_list_ad_groups
  • google_ads_list_campaigns
Show 8 more tools
  • google_ads_list_conversion_actions
  • google_ads_list_experiments
  • google_ads_list_pending_changes
  • google_ads_search_term_insight_terms
  • google_ads_search_term_insights
  • google_ads_search_term_report
  • google_ads_search_term_report_by_conversion
  • google_ads_validate_ad

Write 42 · Create, change, send or run things.

  • google_ads_add_adgroup_negatives
  • google_ads_add_campaign_negatives
  • google_ads_add_shared_negatives
  • google_ads_apply_label
  • google_ads_attach_user_list_audience
  • google_ads_create_ad_group
  • google_ads_create_and_attach_audience_bundle
  • google_ads_create_callout
  • google_ads_create_campaign
  • google_ads_create_demand_gen_multi_asset_ad
  • google_ads_create_experiment
  • google_ads_create_image_asset
Show 30 more tools
  • google_ads_create_keywords
  • google_ads_create_lead_form_asset
  • google_ads_create_page_feed
  • google_ads_create_responsive_search_ad
  • google_ads_create_shared_set
  • google_ads_create_sitelink
  • google_ads_create_structured_snippet
  • google_ads_detach_portfolio_bid_strategy
  • google_ads_enable_items
  • google_ads_enable_keywords
  • google_ads_link_shared_set
  • google_ads_rename_ad_group
  • google_ads_rename_campaign
  • google_ads_replace_sitelink_url
  • google_ads_schedule_experiment
  • google_ads_set_ad_group_location_targeting
  • google_ads_set_campaign_location_targeting
  • google_ads_update_ad_asset_automation
  • google_ads_update_ad_final_urls
  • google_ads_update_asset_urls
  • google_ads_update_campaign_ad_rotation
  • google_ads_update_campaign_ad_urls
  • google_ads_update_campaign_bidding
  • google_ads_update_campaign_budget
  • google_ads_update_campaign_geo_target_type
  • google_ads_update_campaign_selective_optimization
  • google_ads_update_campaign_tracking
  • google_ads_update_demand_gen_multi_asset_ad
  • google_ads_update_responsive_search_ad_text
  • google_ads_update_video_ad_videos

Delete 6 · Delete, drop, revoke or wipe things.

  • google_ads_remove_adgroup_negatives
  • google_ads_remove_campaign_negatives
  • google_ads_remove_experiment
  • google_ads_remove_items
  • google_ads_remove_shared_negatives
  • google_ads_unlink_shared_set

Not yet classified 9 · We could not tell from the name and description.

  • google_ads_end_experiment
  • google_ads_gaql_query
  • google_ads_link_asset_to_ad_group
  • google_ads_link_asset_to_campaign
  • google_ads_link_asset_to_customer
  • google_ads_pause_asset_links
  • google_ads_pause_items
  • google_ads_pause_keywords
  • google_ads_promote_experiment

Secrets and settings it asks for

Secrets: values you paste in that let it act as you.

  • GOOGLE_ADS_CLIENT_SECRET
  • GOOGLE_ADS_DEVELOPER_TOKEN
  • GOOGLE_ADS_REFRESH_TOKEN

Other settings (environment variables or headers).

  • GOOGLE_ADS_CLIENT_ID

Network hosts it talks to 8

  • accounts.google.com · found in code
  • console.cloud.google.com · found in code
  • developers.google.com · found in code
  • forcepoint.com · found in code
  • github.com · found in code
  • googleapis.com · found in code
  • myaccount.google.com · found in code
  • oauth2.googleapis.com · found in code

Files it touches

  • /dev/null
  • Your home directory (~)
  • Any path the agent passes to its tools

Tools (77)

Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].

  • google_ads_ad_performance

    Get ad performance report with metrics, ad copy (headlines/descriptions), final URLs, and ad strength rating. Includes paused and removed ads that had activity in the date range (status column labels them) — historical metrics are never filtered by current status.

  • google_ads_ad_performance_by_conversion

    Get ad performance broken down by conversion action. Shows which ads drive which conversion types. Includes paused and removed ads that had activity in the date range (status column labels them) — historical metrics are never filtered by current status.

  • google_ads_add_adgroup_negatives

    Add negative keywords at the ad-group level. Use when only one ad group in a campaign should exclude the term — other ad groups in the same campaign can still match it. For campaign-wide exclusion use google_ads_add_campaign_negatives instead.

  • google_ads_add_campaign_negatives

    Add negative keywords at the campaign level. Use for campaign-specific negatives that shouldn't be in a shared list.

  • google_ads_add_shared_negatives

    Add negative keywords to a shared negative keyword list. Keywords will immediately block matching queries across all campaigns the list is applied to.

  • google_ads_apply_label

    Attach a label to existing campaigns, ad groups, or ads without changing their status. Label is created if it doesn't exist. Useful for tagging items for audit trails or bulk ops.

  • google_ads_attach_user_list_audience

    Attach a Customer Match / user-list audience to one or more ad groups. Defaults to OBSERVATION mode (reporting-only, does not restrict delivery) — pass mode='TARGETING' to restrict delivery to list members. Use for measuring on-list reach/CPM/conversions of existing campaigns without changing targeting. Get user_list_id from a GAQL query on user_list. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview.

  • google_ads_create_ad_group

    Create a new ad group (will be PAUSED until approved). Returns ad group ID. type defaults to SEARCH_STANDARD for back-compat; use DEMAND_GEN_MULTI_ASSET_AD_GROUP for Demand Gen campaigns.

  • google_ads_create_and_attach_audience_bundle

    Create an Audience resource that bundles one or more user_lists (Customer Match lists, lookalikes, etc.) and attach it to ad groups. OR pass `existing_audience_id` to skip creation and attach an existing Audience to additional ad groups (useful for replicating one bundle across many campaigns/theaters). Required for Demand Gen ad groups whose use_audience_grouped flag is set (where direct user_list criterion attachment is rejected with CANNOT_ADD_AUDIENCE_SEGMENT_CRITERION_WHEN_AUDIENCE_GROUPED_IS_SET). Also handles Lookalike audiences which can never be attached as direct user_list criteria. …

  • google_ads_create_callout

    Create a new CALLOUT Asset (short promotional snippet, max 25 chars, e.g. "Free Shipping"). Callouts are shared and must be linked separately -- use google_ads_link_asset_to_campaign (campaign-level) or google_ads_link_asset_to_customer (account-level) after creation. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview.

  • google_ads_create_campaign

    Create a new campaign (will be PAUSED until approved). Defaults: channel_type=SEARCH, bidding_strategy=MANUAL_CPC (SEARCH) or MAXIMIZE_CONVERSIONS (DEMAND_GEN), language_id=1000 (English). For DEMAND_GEN provide geo_target_ids (Google Ads geo target constant IDs, e.g. '21134' for Alaska). TARGET_CPA requires target_cpa (dollars). MAXIMIZE_CLICKS may take target_cpc_cap (dollars). start_date/end_date are YYYY-MM-DD.

  • google_ads_create_demand_gen_multi_asset_ad

    Create a Demand Gen Multi-Asset ad under a DEMAND_GEN_MULTI_ASSET_AD_GROUP (will be PAUSED until approved). Supports both image-based and video-only ads. Validates character limits and count caps before the API call: headlines (max 5, ≤40 chars each), long_headlines (max 5, ≤90 chars), descriptions (max 5, ≤90 chars). For image ads: marketing_image_asset_ids (1.91:1 landscape, ≥1); for video ads: video_asset_ids (YouTube video asset IDs) — omit images entirely for a video-only ad, or combine both. Square/portrait/logo assets are optional. call_to_action is a string enum value such as 'LEARN_MO…

  • google_ads_create_experiment

    Create a SEARCH_CUSTOM experiment (A/B test) on an existing campaign. Google automatically creates a treatment campaign as a copy of the base. Returns experiment_id and treatment_campaign_id so you can modify the treatment arm (e.g. change final URLs, add RSAs) before scheduling. Use google_ads_schedule_experiment to go live.

  • google_ads_create_image_asset

    Upload an image asset for use in Demand Gen (or other image-capable) ads. Provide exactly one of file_path (absolute path to PNG/JPG/GIF on disk) or base64_data (raw base64, no data URL prefix). Validates mime type, max 5MB, min dimensions 600x314 (Demand Gen minimum). Auto-labels the created asset. Returns {asset_id, resource_name, name, bytes, mime_type}.

  • google_ads_create_keywords

    Create keywords for an ad group (will be PAUSED until approved). Keywords are auto-labeled for easy discovery via google_ads_list_pending_changes.

Show 62 more tools
  • google_ads_create_lead_form_asset

    Create a LeadFormAsset (Google Demand Gen / Discovery / Search lead form). Validates required fields, enum membership, and Google's character limits before hitting the API. NEVER use unless the user explicitly asked for a lead form: requires explicit_lead_form_request=true. After creation, use google_ads_link_asset_to_campaign with field_type=LEAD_FORM (also requires explicit_lead_form_request=true) to attach it to a campaign. v1 supports standard fields only (FULL_NAME, EMAIL, WORK_EMAIL, PHONE_NUMBER, COMPANY_NAME, JOB_TITLE, etc.); custom questions, qualifying questions, and CRM delivery_me…

  • google_ads_create_page_feed

    Create an AI Max / DSA page feed (AssetSet of type PAGE_FEED) and attach it to a campaign. Each URL becomes a PageFeedAsset tagged with the given label. Use this to constrain AI Max final-URL expansion to a specific list of landing pages. Returns the AssetSet resource name and the number of URLs added.

  • google_ads_create_responsive_search_ad

    Create a responsive search ad (will be PAUSED until approved). Validates before creating. Headlines/descriptions can be plain strings or objects with pinned_position (1-3 for headlines, 1-2 for descriptions). path1 and path2 are required (display URL paths). A `claude-YYYY-MM-DD` label is auto-applied; pass additional `labels` to attach more. By default requires ≥15 headlines and ≥4 descriptions (house floor, stricter than the API's own 3/2 minimums); pass allow_partial_assets: true to override.

  • google_ads_create_shared_set

    Create a new shared negative keyword list at account level. Returns the new shared set ID.

  • google_ads_create_sitelink

    Create a new sitelink Asset (link_text + final_urls, optional two description lines). Sitelinks are shared across campaigns/ad groups -- use google_ads_replace_sitelink_url if the goal is to fix a broken URL on an existing sitelink (sitelink final_urls are immutable; the correct pattern is create new + re-link). DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview.

  • google_ads_create_structured_snippet

    Create a new STRUCTURED_SNIPPET Asset (a header + 3-10 short values, e.g. header "Types" with values ["DLP", "DSPM"]). The header must be one of Google's fixed structured-snippet headers (Amenities, Brands, Courses, Degree programs, Destinations, Featured hotels, Insurance coverage, Models, Neighborhoods, Service catalog, Shows, Styles, Types) -- Google rejects any other header. Each value is max 25 chars. Structured snippets are shared and must be linked separately -- use google_ads_link_asset_to_campaign (campaign-level) or google_ads_link_asset_to_customer (account-level) after creation. DR…

  • google_ads_detach_portfolio_bid_strategy

    Detach a campaign from its portfolio (cross-campaign) bid strategy, dropping it to campaign-level Maximize Conversions with no target. This is the ONLY sanctioned way to break a portfolio bid-strategy attachment — google_ads_update_campaign_bidding and google_ads_update_campaign_budget (create_new_budget) both refuse to do this silently and point here instead. IRREVERSIBLE: re-attaching or re-applying tCPA/tROAS targets afterward is a separate manual step. Requires confirm: true.

  • google_ads_enable_items

    Enable paused campaigns, ad groups, or ads. REQUIRES USER APPROVAL. Use after reviewing in Google Ads UI. Auto-applies today's `Claude-MM-DD-YY` label; pass `labels` to attach additional custom labels so different enable operations stay distinguishable.

  • google_ads_enable_keywords

    Enable paused keywords by their criterion resource names. REQUIRES USER APPROVAL. Use after reviewing in Google Ads UI. Auto-applies today's `Claude-MM-DD-YY` label; pass `labels` to attach additional custom labels so different enable operations stay distinguishable.

  • google_ads_end_experiment

    Halt a running experiment. Traffic returns entirely to the base (control) campaign. Moves status to HALTED.

  • google_ads_gaql_query

    Execute a raw GAQL (Google Ads Query Language) query. Use this for custom reports or accessing any Google Ads API resource not covered by other tools. See https://developers.google.com/google-ads/api/docs/query/overview for GAQL syntax.

  • google_ads_get_ad_strength

    Get the ad strength rating (POOR, AVERAGE, GOOD, EXCELLENT) for RSAs in a campaign or ad group, along with headline/description counts. Ad strength below GOOD suppresses delivery. Use this to identify ads that need more creative assets.

  • google_ads_get_campaign_diagnostics

    Diagnose why a campaign is not spending or serving. Returns primary_status, primary_status_reasons, serving_status, budget, bidding strategy, and last-7-days metrics in a single call. Use this as the first step when a campaign has unexpectedly low spend or impressions. Includes paused and removed campaigns that had activity in the date range (status column labels them) — historical metrics are never filtered by current status.

  • google_ads_get_campaign_tracking

    Get campaign tracking parameters including tracking URL template, final URL suffix, and custom URL parameters

  • google_ads_get_client_context

    Get the current client context and health status based on working directory. Call this first to confirm which Google Ads account you're working with.

  • google_ads_get_experiment

    Get full details for an experiment including its arms and treatment campaign ID.

  • google_ads_keyword_performance

    Get keyword performance report with metrics including impressions, clicks, cost, conversions, quality score components (quality score, expected CTR, ad relevance, landing page experience), and impression share metrics. Includes paused and removed keywords that had activity in the date range (status column labels them) — historical metrics are never filtered by current status.

  • google_ads_keyword_performance_by_conversion

    Get keyword performance broken down by conversion action. Shows which keywords drive which conversion types (e.g., form fills, MQLs, etc.). Includes paused and removed keywords that had activity in the date range (status column labels them) — historical metrics are never filtered by current status.

  • google_ads_keyword_volume

    Get historical search volume estimates for a list of keywords using the Google Ads Keyword Planner. Returns avg monthly searches, competition level, and CPC bid range for each keyword.

  • google_ads_link_asset_to_ad_group

    Link an existing asset to one or more ad groups by field type (ad-group level). Supports SITELINK, CALLOUT, STRUCTURED_SNIPPET, and LEAD_FORM (LEAD_FORM requires explicit_lead_form_request=true). Reads each ad group first and reports its name, campaign, current and resulting enabled link count of that field type. WARNS when a SITELINK link would leave an ad group with fewer than 4 enabled ad-group sitelinks: once an ad group has any ad-group sitelink, its campaign-level sitelinks stop serving there, so linking the first one can cut it to 1. The tool does not copy the campaign set; link those y…

  • google_ads_link_asset_to_campaign

    Link an existing asset to one or more campaigns by field type. Supports SITELINK, CALLOUT, STRUCTURED_SNIPPET, and LEAD_FORM. Create the asset first (e.g. with google_ads_create_sitelink or google_ads_create_lead_form_asset), then use this to attach it to campaigns. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview.

  • google_ads_link_asset_to_customer

    Link an existing asset to the customer account itself (account-level, applies across every campaign unless overridden at a lower level). Supports SITELINK, CALLOUT, and STRUCTURED_SNIPPET. Create the asset first (e.g. with google_ads_create_sitelink, google_ads_create_callout, or google_ads_create_structured_snippet), then use this to attach it at the account level. To remove an account-level link, use google_ads_pause_asset_links against the resulting customer_asset resource name. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview.

  • google_ads_link_shared_set

    Link a shared negative keyword list to one or more campaigns. Once linked, all negatives in the list will apply to those campaigns.

  • google_ads_list_ad_groups

    List ad groups, optionally filtered by campaign

  • google_ads_list_campaigns

    List all campaigns for the current client account

  • google_ads_list_conversion_actions

    List all available conversion actions (e.g., form fills, MQLs, etc.) to understand what conversion tracking is set up.

  • google_ads_list_experiments

    List all experiments in the account, optionally filtered by base campaign ID.

  • google_ads_list_pending_changes

    List all pending changes (paused items with claude- label) awaiting review

  • google_ads_pause_asset_links

    Pause asset links (customer_asset, campaign_asset, or ad_group_asset). Use this to stop a sitelink from serving without deleting the underlying asset. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to get a preview. Resource name form: customers/{cid}/customerAssets/{assetId}~SITELINK, customers/{cid}/campaignAssets/{campId}~{assetId}~SITELINK, or customers/{cid}/adGroupAssets/{agId}~{assetId}~SITELINK. Ad-group links created by google_ads_link_asset_to_ad_group return their adGroupAssets resource names for exactly this.

  • google_ads_pause_items

    Pause enabled campaigns, ad groups, or ads. REQUIRES USER APPROVAL. This will stop items from serving. Auto-applies today's `Claude-MM-DD-YY` label; pass `labels` to attach additional custom labels so different pause operations stay distinguishable (e.g. `fix-landing-page-redirect`).

  • google_ads_pause_keywords

    Pause active keywords by their criterion resource names.

  • google_ads_promote_experiment

    Graduate the treatment arm to become the permanent campaign (replaces base). Use when the treatment wins. Moves status to PROMOTED.

  • google_ads_remove_adgroup_negatives

    Remove ad-group-level negative keywords by their resource names. Get resource names from a GAQL query on ad_group_criterion.

  • google_ads_remove_campaign_negatives

    Remove campaign-level negative keywords by their resource names. Get resource names from a GAQL query on campaign_criterion.

  • google_ads_remove_experiment

    Permanently remove an experiment that is in SETUP status. Use to clean up orphaned or misconfigured experiments before recreating them. Only works on SETUP experiments (not yet scheduled/running).

  • google_ads_remove_items

    Remove campaigns, ad groups, or ads permanently. IRREVERSIBLE at the API level (reports on removed resources still work). DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to get a preview; pass `confirm: true` to actually remove. Labels are applied BEFORE removal so the audit trail survives. Removals run in child-up order (ads → ad_groups → campaigns) so parent removes don't fail on enabled children. Auto-applies today's `Claude-MM-DD-YY` label.

  • google_ads_remove_shared_negatives

    Remove negative keywords from a shared negative keyword list by their resource names. Get resource names from a GAQL query on shared_criterion.

  • google_ads_rename_ad_group

    Rename an ad group. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview the change.

  • google_ads_rename_campaign

    Rename a campaign. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview the change. Note: renaming a campaign does NOT update its url_custom_parameters (utmcampaign value carries the literal old name). Pair with google_ads_update_campaign_tracking to sync.

  • google_ads_replace_sitelink_url

    Fix a broken/outdated sitelink URL. Google Ads treats sitelink Asset.final_urls as immutable, so this creates a new sitelink asset with the corrected URL (preserving link_text + descriptions from the old one unless overridden), re-links every campaign / ad-group / customer-level attachment to the new asset, then removes the old links. The old Asset itself is NOT deleted. DRY-RUN BY DEFAULT.

  • google_ads_schedule_experiment

    Start a SETUP experiment so it begins serving traffic. Moves status from SETUP → ENABLED.

  • google_ads_search_term_insight_terms

    Drill into a specific search term category to see the individual search terms within it. Requires an insight_id from google_ads_search_term_insights.

  • google_ads_search_term_insights

    Get search term category insights for a campaign. Shows the search categories your ads appeared against (like the Insights panel in the Google Ads UI). Must query one campaign at a time. Optionally compares two date ranges to show trends.

  • google_ads_search_term_report

    Get search term report showing actual search queries that triggered ads, with the keyword they matched to.

  • google_ads_search_term_report_by_conversion

    Get search term report broken down by conversion action. Shows which search queries drive which conversion types.

  • google_ads_set_ad_group_location_targeting

    Add location (geo) targeting criteria at the ad group level. Required for Demand Gen campaigns — Demand Gen sets location at ad group level, not campaign level. Pass numeric geo target IDs (e.g. '2840' for USA). Existing criteria are NOT removed.

  • google_ads_set_campaign_location_targeting

    Add location (geo) targeting criteria to an existing campaign. Mirrors the geo_target_ids parameter available at campaign creation. Pass the numeric geo target IDs (e.g. '2840' for USA, '2124' for Canada). Existing location criteria are NOT removed — call GAQL to check first if needed.

  • google_ads_unlink_shared_set

    Unlink a shared negative keyword list from one or more campaigns. The list's negatives will no longer apply to those campaigns.

  • google_ads_update_ad_asset_automation

    Set asset_automation_settings (auto-generated video, image enhancements, etc.) on one or more AdGroupAds. Use this to opt Demand Gen multi-asset ads OUT of Google's auto-generation features so creative output stays under advertiser control. Likely Demand Gen UI mappings (verify in UI on first use): 'Auto-generate video' → GENERATE_VIDEOS_FROM_OTHER_ASSETS; 'Adaptive layouts' → GENERATE_DESIGN_VERSIONS_FOR_IMAGES. Auto-applies today's Claude-MM-DD-YY label.

  • google_ads_update_ad_final_urls

    Update final_urls on specific RSAs by ID, IN PLACE via AdService: same ad ID, status and ad-level history kept; Google re-reviews the edited ad. Leaves other ads in the ad group untouched. Refuses non-RSA ads (video final_urls are API-immutable). If an ad is also linked in other ad groups, those links change too -- see other_links in the dry run. Dry-run by default — pass confirm=true to apply.

  • google_ads_update_asset_urls

    Update the final_urls on one or more assets (e.g. sitelinks, callouts). DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to get a preview. Updating an asset's URL affects EVERY campaign/ad group/customer link that uses that asset ID -- use GAQL against customer_asset/campaign_asset/ad_group_asset to check attachments first.

  • google_ads_update_campaign_ad_rotation

    Set a campaign's ad rotation (ad_serving_optimization_status) — the setting behind the UI's Settings > Ad rotation. Affects EVERY ad group in the campaign, not just one. ROTATE ("Rotate evenly") self-reverts to OPTIMIZE ("Optimize: Prefer best performing ads") after ~90 days — Google-managed, no follow-up needed. ROTATE_INDEFINITELY does NOT auto-revert and needs a manual revert or reminder. No default mode is applied — you must pass one explicitly, so ROTATE_INDEFINITELY can never be set by omission. DRY-RUN BY DEFAULT: omit `confirm` or pass `confirm: false` to preview.

  • google_ads_update_campaign_ad_urls

    Bulk-replace the final URL on every enabled ad in a campaign. Used to point an experiment treatment campaign at a new landing page. Returns a dry-run preview unless execute=true.

  • google_ads_update_campaign_bidding

    Update a campaign's bidding strategy and/or target CPA / target ROAS. If `strategy` is omitted the current strategy is preserved and only the target values are updated (useful for adding a tCPA to an existing Max Conversions campaign). Dollar amounts are in dollars (converted to micros internally). target_roas is a decimal (e.g., 3.0 = 300%). BLOCKS by default if the change implies a >20% target delta from the campaign's current value, or removes an existing target / switches off a target-based strategy entirely (a 'loosening' change with no percentage to measure) — pass confirm_large_change: …

  • google_ads_update_campaign_budget

    Update the daily budget for a campaign. Can update the existing budget amount or create a new solo budget and reassign the campaign to it (useful for breaking shared budgets).

  • google_ads_update_campaign_geo_target_type

    Set one or more campaigns' positive geo target type (geo_target_type_setting.positive_geo_target_type) — the setting behind the UI's Locations > Location options > "Presence" vs "Presence or interest". PRESENCE targets people physically in or regularly in the location; PRESENCE_OR_INTEREST also serves people searching about the location from elsewhere. Only these two modes are accepted here. Applies the same mode to every campaign_id passed in the same call. If `label` is passed, it is applied to every one of those campaigns as part of the same call. DRY-RUN BY DEFAULT: omit `confirm` or pass …

  • google_ads_update_campaign_selective_optimization

    Set a campaign's Selective Optimization conversion actions — the subset of conversion actions a Maximize Conversions / Maximize Conversion Value campaign optimizes bidding toward. FULL-ARRAY REPLACE, not additive: the conversion_action_ids list you pass entirely replaces whatever conversion actions are currently set, it does not merge with them. Pass every conversion action ID you want active, not just the ones to add.

  • google_ads_update_campaign_tracking

    Update campaign tracking parameters: final URL suffix, tracking URL template, and/or custom URL parameters. Use google_ads_get_campaign_tracking first to see current values.

  • google_ads_update_demand_gen_multi_asset_ad

    Attempt to update copy on a Demand Gen ad. WARNING: on Demand Gen MULTI-ASSET ads the entire creative — headlines, descriptions, AND images — is IMMUTABLE after creation; the Google Ads API rejects any such update with IMMUTABLE_FIELD (verified live 2026-07-12). To change ANY creative on a multi-asset ad you must RECREATE it (create a new ad + pause the old one), not update it. This tool is retained for DG ad formats that may permit copy edits; against a multi-asset ad it will error. Provide the ad's resource name (customers/XXX/adGroupAds/YYY~ZZZ) or numeric ad ID.

  • google_ads_update_responsive_search_ad_text

    Update an RSA's headline/description text IN PLACE via AdService — same ad ID, no new ad created, no pause/clone. Use this instead of google_ads_create_responsive_search_ad + google_ads_pause_items for a text-only edit. WARNING: an Ad resource can be linked into more than one ad group (e.g. a base campaign and an experiment-page campaign sharing unedited ads); this tool edits the shared Ad resource, so one call changes EVERY linked ad_group_ad — check `affected_ad_group_ad_links` / `shared_across_multiple_ad_groups` in the dry-run before confirming. Pass only headlines and/or descriptions you …

  • google_ads_update_video_ad_videos

    Add or replace the YouTube videos on an existing video responsive ad (VIDEO campaigns, e.g. YouTube reach). The VIDEO channel is campaign-level API-locked, but AD-level video_responsive_ad.videos updates ARE allowed and edit the ad in place (same ad ID) — verified live 2026-07-18. Accepts YouTube URLs (watch/shorts/youtu.be/embed) or 11-char video IDs; finds-or-creates the YouTube video assets; preflights each new video via oEmbed (private videos are rejected by Google Ads — must be Public or Unlisted). Default mode 'append' keeps existing videos and adds new ones. Auto-labels the ad claude-MM…

  • google_ads_validate_ad

    Validate an RSA without creating it. Use this to check for errors before creating. Enforces: 3-15 headlines (≤30 chars), 2-4 descriptions (≤90 chars), ≥1 final URL, both path1 AND path2 present (≤15 chars each), ≥1 label. Also enforces a house floor of ≥15 headlines and ≥4 descriptions by default (mirroring google_ads_create_responsive_search_ad's pre-check) -- pass allow_partial_assets: true to preview a below-floor ad without that rejection.

Compare and alternatives

    Featured in

    Signals

    Stars
    1
    Forks
    1
    Open issues
    1
    Last commit
    Oct 23, 2026 (5 days ago)
    Last release
    Sep 9, 2026 (1 month ago)

    From GitHub (fetched Oct 24, 2026).

    Details

    Registry name
    io.github.mharnett/google-ads
    Version
    1.0.1
    Auth
    API key
    Packages
    npm mcp-google-ads
    License
    MIT
    First seen
    Oct 24, 2026
    Last checked
    Oct 24, 2026

    More from mharnett

    Cite this page

    Google Ads MCP server. Agent Mart. https://agentmart.dev/connectors/mharnett-google-ads (last updated 2026-10-24)