Skip to main content
Glama
650,527 tools. Updated 2026-10-14 06:12

"Google Campaign Manager 360" matching MCP tools:

  • Set the geographic targeting of a wizard campaign's search channel (Google Ads or Microsoft Ads) — which countries/states the campaign serves in, and which countries to exclude. Matches the platform UI's "Location" picker under the Google Ads / Microsoft Ads channel SETTINGS panel, plus the "Negative Locations" editor under that channel's Advanced Settings. WARNING: NEW SEARCH CAMPAIGNS DEFAULT TO UNITED STATES. The platform seeds the Location field with United States, so a campaign created without calling this tool serves in the US only. Whenever the user names a geography — "target Canada and the UK", "run this in EMEA", "exclude India" — set it explicitly; do not assume the default is what they want. KEYWORDS: geo, geos, geo targeting, geotargeting, geographic, geography, location, locations, location targeting, country, countries, state, states, region, territory, market, target location, exclude location, exclude geo, exclude country, negative location, negative locations, location exclusion, excluded locations, where the campaign runs, google ads, google, microsoft ads, microsoft, bing, search channel, search campaign, campaign settings WHEN TO USE: - Point a search campaign at specific countries/states instead of the US default - Exclude countries the campaign must not serve in - Clear targeting back to all locations (countries=[], states=[]) REQUIREMENTS: - The campaign MUST already have the target channel enabled (via create_campaign / add_and_edit_campaign_elements with a `google` and/or `microsoft` block). - Geo targeting here is search-channel-only. LinkedIn / Meta / Reddit carry location on the audience or target group instead — use create_target_group or the audience tools for those. PARAMETERS (each one REPLACES that side of the targeting; omit to leave untouched): - campaign_id (required): the wizard campaign ID. - channel (required): "GOOGLE_ADS" or "MICROSOFT_ADS". - countries: country NAMES to target, e.g. ["United States", "Canada"]. Pass [] to clear (= all locations). - states: US state NAMES to target, e.g. ["Texas", "California"]. Pass [] to clear. States are US-only. - excluded_countries: country NAMES the campaign must NOT serve in. Pass [] to clear all exclusions. Names are matched case-insensitively against the platform's location catalog and common shorthand resolves ("USA", "UK", "UAE"). An unrecognised name is REJECTED rather than skipped — a silently dropped geo would serve the campaign somewhere nobody chose. At least one of the three lists must be given. WARNING: EXCLUSIONS ARE COUNTRY-LEVEL ONLY. The platform stores exclusions as bare location ids with no country/state discriminator, and state ids overlap country ids, so an excluded state would be read back as an unrelated country. The UI's Negative Locations picker is countries-only for the same reason. To narrow within a country, target the states you want via `states` instead of excluding the ones you don't. EXAMPLES: Target Canada and the UK on Google Ads (replacing the US default): set_search_channel_locations({ "campaign_id": 177214, "channel": "GOOGLE_ADS", "countries": ["Canada", "United Kingdom"] }) Target three US states only: set_search_channel_locations({ "campaign_id": 177214, "channel": "GOOGLE_ADS", "countries": ["United States"], "states": ["Texas", "California", "New York"] }) Keep targeting as-is but exclude two countries on Microsoft Ads: set_search_channel_locations({ "campaign_id": 177214, "channel": "MICROSOFT_ADS", "excluded_countries": ["India", "Pakistan"] }) RESPONSE: {success, campaign_id, channel_id, channel, applied:{locations?:{countries,states}, excluded_locations?:{countries}}, errors?} `applied` echoes the resolved location NAMES, so you can confirm back to the user what the campaign now targets. INTEGRATION WITH OTHER TOOLS: - Use search_campaigns_by_names / get_campaign_by_wizard_id to find the campaign. - create_campaign and add_and_edit_campaign_elements accept the same geo inline on their `google` / `microsoft` blocks — prefer that when creating, and use this tool to change geo on a campaign that already exists.
    Connector
    Destructive
    API key
  • Lists the user's connected Google Ads account(s). Returns only the account(s) the user selected at connect time; the response carries default_account_id. all_accessible=true returns every account the credential can reach, which also expands client accounts under MCC (manager) accounts. platform is optional and defaults to Google Ads; naming another connected platform (meta | tiktok | linkedin | microsoft | ga4 | search_console | youtube | business_profile) returns the name of that platform's own account-listing tool instead.
    ConnectorOAuth
  • Create a complete Google Ads Demand Gen campaign (YouTube, Discover, Gmail, Maps and the Google Display Network) in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), a typeless ad group with channel controls, ad-group-level location/language targeting, and ONE ad. Use dry_run: true first — Google validates the whole chain without creating anything; show the plan, get confirmation, then execute. Two ad types (ad.ad_type): 'multi_asset' = image ad (1-5 headlines <=30 chars, 1-5 descriptions <=90, business name <=25, 1-5 logos, at least one landscape 1.91:1 or square 1:1 image from adsap_google_upload_asset, optional portrait 4:5 and tall-portrait 9:16, combined images <=20); 'video_responsive' = YouTube video ad (1-5 YouTube video ids, 1-5 headlines <=40, 1-5 long headlines <=90 REQUIRED, 1-5 descriptions <=90, 1-5 logos). Daily budget minimum is 5 (Google enforces a 5 USD local-currency-equivalent floor for Demand Gen). Channels: default ALL_CHANNELS; or channels.selected booleans (youtube_in_stream/youtube_in_feed/youtube_shorts/discover/gmail/display/maps — display: true is how you reach the Google Display Network). bidding_strategy 'auto' picks maximize_conversions when the account has conversion tracking, else maximize clicks; target_roas needs conversion history (Google rejects otherwise). ad_account_id is the bare 10-digit customer ID. For Search use adsap_google_create_search_campaign, for Performance Max adsap_google_create_pmax_campaign; for Meta use adsap_create_campaign.
    ConnectorAPI key
  • Create a complete standard Google Shopping campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), location targeting, a Shopping ad group, the product ad, and an 'All products' listing group. Product data, images and landing pages come from the linked Merchant Center — there are NO creative inputs. REQUIRES an ACTIVE Merchant Center link on the account (clean NO_MERCHANT_LINK error if none; merchant_id is auto-resolved when exactly one link exists). Use dry_run: true first — Google validates the whole chain without creating anything; show the plan, get confirmation, then execute. campaign_priority (0-2) only arbitrates between the account's OWN standard Shopping campaigns — a retail Performance Max campaign ALWAYS outranks standard Shopping for the same products; say so when the account also runs retail PMax. feed_label (from adsap_google_list_feed_labels) restricts the campaign to one Merchant Center feed label; omit to advertise all feeds. Language targeting does not exist for Shopping (ad language follows the product feed). bidding_strategy: 'auto' picks Maximize Clicks; 'manual_cpc' REQUIRES cpc_bid and gives full bid control (the classic reason to prefer standard Shopping over PMax); 'target_roas' needs conversion history (~15 conversions/30 days). ad_account_id is the bare 10-digit customer ID. For Performance Max (incl. retail) use adsap_google_create_pmax_campaign; for Meta catalog ads use adsap_create_campaign.
    ConnectorAPI key
  • Create a complete Google App campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), location + language targeting, an ad group, and the app ad. App campaigns promote a mobile app across Google Search, Google Play, YouTube, Discover and the Display Network — Google mixes the ad from your text (and optional media) automatically. The ad links to the app's store listing AUTOMATICALLY: there is no URL input, ever. Any PUBLIC store app id works (no app ownership or Play/Firebase link is required to create): Android app_id is the package name (e.g. com.example.app), iOS app_id is the numeric App Store id (e.g. 570060128) with app_store 'apple_app_store'. v1 optimizes INSTALLS at your target_cpi (target cost per install, plain number in the account currency); Google recommends a daily_budget of roughly 50x target_cpi — lower is allowed but slows learning (a warning says so). Text: 2-5 headlines (max 30 chars) + 1-5 descriptions (max 90). Optional media: image_asset_ids / video_asset_ids from adsap_google_upload_asset (images 1.91:1, 4:5 or 1:1 up to 5MB; videos are YouTube assets 10-60s) — text-only is fully valid. In-app-action, value, engagement and pre-registration goals are NOT supported in v1. If the account has no conversion tracking a warning is returned — relay it (Android installs normally auto-track once a Google Play link exists). Use dry_run: true first — Google validates the whole chain without creating anything; show the plan, get confirmation, then execute. ad_account_id is the bare 10-digit customer ID. For website campaigns use adsap_google_create_search_campaign / adsap_google_create_pmax_campaign; for Meta app ads use adsap_create_campaign with an app objective.
    ConnectorAPI key
  • Manage a Google Ads campaign or ad group's targeting AFTER creation: GEO, LANGUAGE and AUDIENCES. op 'add' at campaign level (default): up to 100 locations (negative: true = exclude) and/or 50 languages, OR up to 50 audiences (audiences cannot combine with geo/languages in one call — separate calls). op 'add' at ad-group level (level: 'ad_group' + ad_group_id): audiences only. AUDIENCES: pass user_list_id items (audience segments from adsap_google_list_audiences) — campaign-level TARGETING works on Search/Shopping only; campaign-level EXCLUSION (negative: true) also on Display/Performance Max; ad-group level (target or exclude) on Search/Display/Shopping. DEMAND GEN is different: pass audience_id items (Audience resources) on the AD GROUP — nothing at campaign level. Video supports no audience edits. The same user list cannot be attached at BOTH campaign and ad-group level. 'mode' ('targeting' = narrow delivery to the audiences | 'observation' = full reach, bid adjustments only) sets the audience targeting setting — combinable with the audience add or standalone; Google's default with NO mode set is TARGETING, so pass mode: 'observation' for Search/Shopping unless the user explicitly wants to narrow reach. op 'remove': remove ONE criterion by composite id "<parent_id>:<criterion_id>" (level 'campaign' → campaign criterion, 'ad_group' → ad-group criterion). Geo/language criterion ids EQUAL their constant ids (France on campaign 123 = "123:2250"); AUDIENCE criterion ids are Google-internal — capture them from the add response (created_criteria[].entity_id). Criteria are immutable: to change one, remove it and add the replacement. Always dry_run: true first. For campaign negative KEYWORDS use adsap_google_manage_keywords op 'add_negative'.
    ConnectorAPI key

Matching MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    This read-only MCP Server allows you to connect to Google Campaign Manager 360 data from Claude Desktop through CData JDBC Drivers. Free (beta) read/write servers available at https://www.cdata.com/solutions/mcp
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for the Google Tag Manager API v2, enabling natural-language management of containers, workspaces, tags, triggers, variables, and publishing. It handles OAuth authentication and built-in rate limiting for the strict GTM API quota.
    25
    73 npm
    1
    MIT

Matching MCP Connectors

  • Attach existing Google Ads negative keyword lists to campaigns that are ALREADY LAUNCHED — a live edit that syncs through to Google. CRITICAL: LIVE EDIT vs DRAFT EDIT — THE DISTINCTION THAT PICKS THIS TOOL: A campaign is a DRAFT until it is launched; every status after that (Launched, Launching, Editing, Finished, Error, Failed) is LIVE. Editing a live campaign is a different code path on the platform, not just a different status — the change has to be published to the running Google campaign, not only written to the wizard. • LIVE campaign (already launched) → THIS tool. It calls the platform's bulk live-edit endpoint, which publishes an update per running ad group so Google actually starts excluding the keywords. • DRAFT campaign (never launched) → the campaign-builder tools (`create_campaign` / `create_native_structure_campaign` / `add_and_edit_campaign_elements` / `add_and_edit_native_campaign_elements`, via their `negative_keyword_lists` field). Those write wizard state that gets pushed at launch. Pass a draft campaign here and it is SKIPPED with a reason rather than written — the draft path has different, destructive semantics, so this tool refuses to take it. If you are unsure which a campaign is, just call this tool: the per-campaign report tells you the status and which path applies. WORKS ON BOTH CAMPAIGN STRUCTURES. Negative keyword lists attach at the CHANNEL level, not to an ad group / container, so Precision Optimization (1×1×1) and Channel-First / Native (N×N×N) campaigns are handled identically. You do NOT need to know the structure, and you must NOT reach for `add_and_edit_native_campaign_elements` to do this on a live campaign — that tool rebuilds containers, which the platform forbids once experiments are launched. BULK BY DESIGN: pass every campaign the user named in ONE call. The platform endpoint takes a campaign list, and this tool groups them so campaigns needing the same final set share a single request. ADDS, DOES NOT REPLACE (default): the platform applies exactly the set of lists it is handed, so `mode="add"` first reads what each campaign already has and submits the union — attaching one list never silently detaches the others. Use `mode="replace"` ONLY when the user explicitly wants the campaign's negative lists to become exactly the ones named; the response's `detached` field reports what that removed. FINDING LISTS: pass `listNames` (what the user says) and/or `listIds` (from `list_negative_keywords_list`). Names must match an existing list EXACTLY (case-insensitive) — a name that matches nothing is reported in `warnings` and skipped, never swapped for a similar list. To attach a list that does not exist yet, create it first with `create_negative_keywords_list`. COMMON USE CASES: 1. Add one list to a running campaign: add_negative_keyword_lists_to_live_campaigns(campaignIds=[159490], listNames=["Competitor Brands"]) 2. Same lists across several live campaigns, one call: add_negative_keyword_lists_to_live_campaigns(campaignIds=[159490, 159502], listNames=["Job Seekers", "Free Content"]) 3. Make a campaign's negatives exactly one list (removes any others): add_negative_keyword_lists_to_live_campaigns(campaignIds=[159490], listIds=[43256533], mode="replace") RESPONSE FORMAT: Per campaign: status, `edit_path` ("live" / "draft"), `attached_before`, `newly_attached`, `already_attached`, `detached`, `attached_after`, and an `action` of submitted / no_change / skipped / failed. Top level carries `submitted_campaign_ids`, `warnings`, `errors`, and `delivery_note`. WARNING: ASYNC — REPORT IT HONESTLY: the platform accepts this in the background and answers with no body. `action: "submitted"` means ACCEPTED, not applied. It also drops campaigns server-side WITHOUT an error when they are locked by another pending change or when a launched campaign is not currently active/paused (e.g. completed). Tell the user the change was submitted and that it lands on Google shortly — do not claim it is live, and if they need certainty, re-check the campaign a little later. CHANNEL SCOPE: GOOGLE_ADS only — the platform endpoint is hardcoded to the Google Ads channel. It does NOT work for Microsoft Ads (Bing) even though Microsoft has the same negative-list concept; if the user asks for Microsoft, say this is not supported yet rather than calling with channel=GOOGLE_ADS.
    ConnectorAPI key
  • Get Google Ads performance insights for an account, at campaign, ad-group, or keyword level (cache-first with auto-refresh from Google). Returns an account summary with previous-period comparison, a sortable per-entity table, and an optional daily timeseries. Metrics on both the summary and every row: cost, impressions, clicks, conversions, conversions_value + derived roas/ctr/cpc/cpm/cost_per_conversion/cvr; all_conversions, all_conversions_value, cost_per_all_conversion, view_through_conversions, cross_device_conversions (all_* counts EVERY conversion action, `conversions` counts only the ones included in bidding); engagements, engagement_rate, interactions, interaction_rate; video_views (TrueView/YouTube), video_view_rate, avg_cpv, video_p25/p50/p75/p100_rate; youtube_comments, youtube_likes, youtube_shares (v25 social engagement on Shorts ads on YouTube — 0 outside YouTube/Shorts delivery); and the competitive set search_impression_share, search_lost_is_budget, search_lost_is_rank, top_impression_pct, abs_top_impression_pct. The competitive metrics are Search-network only and read 0 for Display/PMax/Video delivery. search_lost_is_budget is CAMPAIGN LEVEL ONLY (the Google API does not report it for ad groups or keywords) so the key is ABSENT at the other levels rather than 0; at campaign level impression share plus the two lost shares add up to 100%. quality_score (1-10, null when Google reports none) appears only at keyword level. When Google capped most days in range, meta.share_metrics_note is set and rows carry search_share_is_approximate: report those three share figures as estimates. ad_account_id is the bare 10-digit customer ID from adsap_google_list_ad_accounts. Keyword-level row ids are "<ad_group_id>:<criterion_id>" — pass them as-is to adsap_google_set_entity_status / adsap_google_update_entity (entity_type keyword). Only entities with impressions in range appear (PMax has no ad groups/keywords by design). Note: Google reports plain Clicks/CTR/CPC (no Meta-style link-click split). For Meta insights use adsap_get_insights.
    ConnectorAPI key
  • Create a complete Google Ads Performance Max campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), location/language targeting, and one asset group with text assets plus images previously created via adsap_google_upload_asset. Use dry_run: true first — Google validates the whole chain without creating anything; show the plan, get confirmation, then execute. Asset-group minimums (enforced): 3-15 headlines (<=30 chars), 1-5 long headlines (<=90), 2-5 descriptions (<=90, at least one <=60), business name (<=25), 1-5 logo images (1:1, min 128x128), 1-20 landscape images (1.91:1, min 600x314), 1-20 square images (1:1, min 300x300). Video is optional — without one, Google may auto-generate video from your assets. bidding_strategy 'auto' resolves to maximize_conversions with a conversion-tracking preflight warning when the account has no conversion actions. retail: true attaches the account's ACTIVE Merchant Center link (fails cleanly if none). ad_account_id is the bare 10-digit customer ID. For Search campaigns use adsap_google_create_search_campaign; for Meta use adsap_create_campaign.
    ConnectorAPI key
  • Create a classic standalone Google Display campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), location + language targeting, a Display ad group, and a responsive display ad. IMPORTANT CONTEXT to relay when relevant: Google is migrating standalone Display INTO Demand Gen (every response carries a heads-up; this campaign type will eventually be auto-migrated) — for new builds consider adsap_google_create_demand_gen_campaign with channels.selected.display: true instead; this tool exists for classic account-structure parity and full Display bid control. The ad REQUIRES BOTH image classes: at least one landscape image (1.91:1, min 600x314) AND at least one square image (1:1, min 300x300) — combined max 15 — plus 1-5 headlines (max 30 chars), EXACTLY ONE long_headline (max 90), 1-5 descriptions (max 90), business_name (max 25) and final_url. Optional: square logos (1:1, min 128x128) and landscape logos (4:1, min 512x128) combined max 5, up to 5 YouTube video assets, call_to_action_text (max 30). All image/video inputs are ASSET ids from adsap_google_upload_asset. Bidding: 'auto' picks Maximize Clicks (works without conversion tracking); 'manual_cpc' requires cpc_bid; 'maximize_conversions' (no target attached — Display rejects that combination); 'target_cpa' (standalone, needs target_cpa, no conversion-history requirement); 'target_roas' HAS a conversion-history eligibility gate (Google rejects it on accounts without enough conversions — relay that plainly if it fails). Use dry_run: true first — Google validates the whole chain without creating anything; show the plan, get confirmation, then execute. ad_account_id is the bare 10-digit customer ID.
    ConnectorAPI key
  • Add an ad group to an EXISTING Google Ads campaign (Search, Display or Demand Gen) in ONE atomic request: the ad group, optional keywords (Search only) and optionally one ad. This is the only tool that adds structure to an already-created campaign — the create-campaign tools always build a fresh campaign. Declare `channel` to match the campaign's type (SEARCH -> 'search', DISPLAY -> 'display', DEMAND_GEN -> 'demand_gen' — from adsap_google_list_campaigns); the workflow verifies the campaign exists and rejects mismatches (PMax uses asset groups and is NOT supported; App/Shopping ad groups are also unsupported). SAFETY: if the parent campaign is ACTIVE the new ad group is created PAUSED by default so it never starts spending unreviewed — pass ad_group.status 'ENABLED' to override; if the campaign is PAUSED the ad group is created ENABLED (the campaign gates serving). Per channel: SEARCH — ad_group.keywords [{text, match_type EXACT|PHRASE|BROAD}] (optional but the group gets no traffic without them) and an optional responsive search ad (3-15 headlines max 30 chars w/ optional pinned_field, 2-4 descriptions max 90, final_url, path1/path2). DISPLAY — optional optimized_targeting flag and an optional responsive display ad (same shape as adsap_google_create_display_campaign's ad: >=1 landscape AND >=1 square image asset id, 1-5 headlines, exactly 1 long_headline, 1-5 descriptions, business_name, final_url). DEMAND_GEN — geo is REQUIRED at the AD GROUP level (ad_group.geo.location_ids; unlike Search/Display where geo is campaign-level and cannot be set here), plus optional language_ids, channel controls (ad_group.channels.strategy or .selected) and an optional 'multi_asset' image ad or 'video_responsive' YouTube ad (same shapes as adsap_google_create_demand_gen_campaign). An ad group created WITHOUT an ad will not serve until an ad is added. EXISTING-GROUP MODE: pass ad_group_id INSTEAD of ad_group to add ONE responsive search ad to an ad group that already exists (Search only; `ad` becomes required; ad.status defaults to PAUSED — pass ENABLED to create it serving; the workflow verifies the group exists, is not removed, and belongs to campaign_id). Use dry_run: true first — Google validates the whole chain without creating anything. ad_account_id is the bare 10-digit customer ID.
    ConnectorAPI key
  • Manage Google Ads Search keywords AFTER creation. op 'add': add up to 100 keywords (and/or ad-group negatives via negative: true) to an EXISTING ad group — atomic batch, per-keyword optional cpc_bid. op 'add_negative': add campaign-LEVEL negative keywords (block queries across every ad group in the campaign). op 'replace': change one keyword's text and/or match type ATOMICALLY (Google keyword text/match type are immutable, so this is remove + re-add in one request — the keyword gets a NEW id and its performance history restarts; status and bid carry over). op 'remove': remove one ad-group keyword/negative (keyword_id) or one campaign negative (campaign_negative_id). Ids are composite "<parent_id>:<criterion_id>" — ad-group keyword ids come from adsap_google_get_insights level keyword; created ids are returned by the add ops. Always dry_run: true first. For pause/enable use adsap_google_set_entity_status; for per-keyword bid changes alone use adsap_google_update_entity with updates.cpc_bid.
    ConnectorAPI key
  • Attaches Google Business Profile LOCATION assets (store address, map pin, "Get directions", call-from-map) to the account's ads. In Google Ads, location assets are created AUTOMATICALLY once the Business Profile is LINKED to the Google Ads account, then serve account-wide. This tool: (1) detects whether a linked location asset set (LOCATION_SYNC / Business-Profile location group) exists in the account; (2) if it exists AND a campaign_id is given, pins that asset set to the campaign (otherwise Google already serves it account-wide — nothing to do); (3) if none exists, returns the exact steps to link the Business Profile. confirm=false → dry-run. AD GROUP LEVEL: pass ad_group_id to pin the location asset set to ONE ad group (AdGroupAssetSet) instead of the whole campaign, e.g. a branch ad group that should show only that branch's address. asset_set_id picks a specific location asset set (a location group such as "Bağcılar", from the location_asset_sets list this tool returns); without it the Business Profile sync set is used. NOTE: creating the Business-Profile↔Ads link itself needs Business Profile API access (pending Google approval); until then the customer links it once in the Google Ads UI (~2 minutes).
    ConnectorOAuth
  • Replaces the BUSINESS LOGO shown in a campaign's ads (the small square logo next to the business name) — e.g. after a rebrand, when the old company's logo is still on every ad. A campaign accepts only ONE advertiser business logo, so linking a new one with manage_extension_assets fails with a resource limit while the old one is still attached, and unlinking first leaves the ads without a logo in between. This tool does the swap in one atomic request: it links the new logo as BUSINESS_LOGO and unlinks the old advertiser logo together. The new logo must already be in the account's asset library as a SQUARE (1:1) image of at least 128x128 px — upload it first with upload_image_asset (aspect='1:1') and pass the returned asset id here. Call it with `asset_id` empty to READ which logo the campaign shows today without changing anything. Logos Google created AUTOMATICALLY from the website are listed separately and are not touched; they do not block the swap. confirm=false returns a dry run naming the old and the new logo; confirm=true applies it and reads the result back from Google. The link is per campaign, so call it once for each campaign that should show the new logo.
    Connector
    Destructive
    OAuth
  • Stage campaign changes for review. Does NOT execute anything. Each operation: {"platform": "google_ads"|"meta_ads", "level": "campaign"|"ad_set"|"ad" (default campaign; ad_set = Google ad group), "object_id": "<id of that object>", "set": {"daily_budget": <number, MAJOR account-currency units>, "status": "ACTIVE"|"PAUSED"}, "account_id": optional, for multi-account companies}. daily_budget: Meta campaign or ad set, Google campaign only (Google ad group spend is governed by the campaign budget). Ads take status only. Returns proposal_id + a current→new diff preview. Show the preview to the user; call apply_change(proposal_id) only after they confirm. Proposals expire in 1h.
    ConnectorAPI key
  • Set which Google Ads account is the user's MCC (My Client Center / manager). This becomes the `login-customer-id` HTTP header for every subsequent Google Ads API call against a sub-account under the manager. Required for agency users with multiple client accounts under one MCC; single-account users normally don't need to call this. Validates that the customerId is in the user's accessible-accounts list AND that Google Ads reports it as a manager account (`isManager=true`). Pass a sub-account ID and the call rejects. After setting, the displayed names of sibling sub-accounts in list_ad_accounts will resolve correctly instead of falling back to 'Account 1234567890'.
    Connector
    Destructive
    OAuth
  • Manage a campaign by pausing or restarting it. KEYWORDS: pause, stop, restart, resume, unpause, campaign, control, manage, halt WHEN TO USE: - User asks to "pause campaign X" - User wants to "stop campaign Y" - User requests to "restart campaign Z" - User wants to "resume campaign A" - User asks to "unpause campaign B" ACTIONS: - pause: Temporarily pause an active campaign to stop ad serving and budget spend - restart: Resume a paused campaign to continue ad serving and budget spend REQUIRED PARAMETERS: - campaign_id: The unique identifier of the campaign to manage (integer, required) - action: The action to perform - "pause" or "restart" (string, required) CAMPAIGN ID SOURCES: Campaign IDs can be obtained from: - search_campaigns_by_names tool - create_campaign tool response - Campaign management interface URLs IMPORTANT VALIDATION REQUIREMENTS: - **CRITICAL**: You can ONLY pause campaigns that are currently "Active" - **CRITICAL**: You can ONLY restart campaigns that are currently "Paused" - Before attempting to pause or restart, use search_campaigns_by_names to verify the current campaign status
    Connector
    Destructive
    API key
  • List the LinkedIn conversion actions (Insight Tag conversions) available on the connected LinkedIn ad account, with id, name, type and whether each is enabled. Use it to pick the ids for update_linkedin_channel_settings.conversion_action_ids (which conversions a campaign optimizes toward and reports on), and to answer "which LinkedIn conversions do we track?" or "is the /pricing page conversion set up?". KEYWORDS: linkedin, conversions, conversion actions, conversion tracking, insight tag, website visit conversion, lead gen form conversion, url conversion, page visit, pixel Requires a connected LinkedIn channel (check get_integrations_status). Conversion actions are created in LinkedIn Campaign Manager, not here: when the one the user needs (for example a URL rule for /pricing) is missing, say so and point them at Campaign Manager instead of inventing an id. RESPONSE: {success, count, conversions:[{id, name, type, enabled, last_received_at}]} `enabled: false` conversions cannot be attached to a campaign (launch validation rejects them). `last_received_at` is when LinkedIn last recorded a hit; null means the conversion has never fired.
    ConnectorAPI key
  • Edit an existing Google Ads campaign, ad group, ad, or keyword: change status (PAUSED/ACTIVE), rename (campaign/ad group), set a campaign's daily budget (in account currency, e.g. 12.50), change a campaign's BIDDING scheme/targets (updates.bidding — swap scheme or edit tCPA/tROAS/ceiling; portfolio strategies rejected), edit ASSET AUTOMATION opt-ins (updates.asset_automation — campaign level on PMax/Search, ad level on Demand Gen ads), or set a keyword's max CPC (updates.cpc_bid — Manual CPC campaigns only, ignored under automated bidding). Keyword TEXT is immutable — use adsap_google_manage_keywords op 'replace' to change it; keyword entity_id is "<ad_group_id>:<criterion_id>" from adsap_google_get_insights level keyword. Put ONLY the fields you want to change in `updates`. Use dry_run: true to preview the diff (current vs new, validated by Google without applying). ad_account_id is the bare 10-digit Google Ads customer ID. For Meta entities use adsap_update_entity instead.
    ConnectorAPI key
  • Create a complete Google Ads Search campaign in ONE atomic request: budget, campaign (ALWAYS created PAUSED — activate later with adsap_google_set_entity_status), location/language targeting, ad group, keywords, and a responsive search ad. Use dry_run: true first — Google validates the whole operation chain without creating anything; show the plan, get confirmation, then execute. Location ids come from adsap_google_search_geo_targets. bidding_strategy 'auto' (default) resolves via a conversion-tracking preflight — maximize_conversions when the account has conversion actions, otherwise target_spend (Maximize Clicks) with an explanatory warning — and can always be overridden explicitly. ad_account_id is the bare 10-digit customer ID. For Meta campaigns use adsap_create_campaign instead.
    ConnectorAPI key
  • Manage Google Ads extensions (sitelinks, callouts, structured snippets, call, promotion, price) at CAMPAIGN level (default) or ACCOUNT level (level: 'account' — the link serves with ALL eligible campaigns; all six types accepted, probe-confirmed). Ops: 'create_and_link' creates new extension assets and links them to a campaign in one atomic call (max 20); 'link' attaches EXISTING assets to a campaign; 'unlink' detaches them from that campaign — this is how you stop an extension serving there, because Google Ads assets cannot be deleted; 'update_asset' edits an existing asset — WARNING: assets are account-scoped, so an update changes the extension EVERYWHERE it is linked, not just one campaign. Image extensions: bytes go through adsap_google_upload_asset first, then op 'link' with field_type AD_IMAGE — BUT Google allowlist-gates AD_IMAGE links via API (most accounts get UNSUPPORTED_FIELD_TYPE; not something ADSAP can fix), and image assets are never content-mutable. Promotion/price also link to PMax campaigns; AD_IMAGE does not. Use adsap_google_list_extensions first to see what exists (asset ids, field types). Use dry_run: true first for create — Google validates everything without changing anything. All-or-nothing: on error nothing is applied. ad_account_id is the bare 10-digit Google Ads customer ID. Meta has no extensions analog.
    ConnectorAPI key