MMetadata /docs
Docs/Tools/add_negative_keyword_lists_to_live_campaigns

add_negative_keyword_lists_to_live_campaigns

Attach existing Google Ads negative keyword lists to campaigns that are ALREADY LAUNCHED — a live edit that syncs through to Google.

Writes search

Creates or changes something in the account. Put it behind whatever review your agent uses.

What it does

Attach existing Google Ads negative keyword lists to campaigns that are ALREADY LAUNCHED — a live edit that syncs through to Google.

                🔴 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`.

                ⚠️ 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.

Arguments

ArgumentTypeNotes
campaignIds array required Wizard campaign ids of the LIVE (already launched) campaigns to update. Pass every campaign the user named in one call. Draft campaigns are skipped with a reason.
listNames array Names of existing negative keyword lists to attach. Matched exactly (case-insensitive) against the account library; an unmatched name is reported, never substituted.
listIds array IDs of existing negative keyword lists to attach, as returned by list_negative_keywords_list. Can be combined with listNames.
mode string 'add' (default) merges with the lists already on the campaign. 'replace' makes the campaign's negative lists exactly the ones requested, detaching the rest — only for an explicit user request.
one of: add, replace
channel string Ad channel scope. Only GOOGLE_ADS is supported — the platform's live-edit endpoint is Google-only.
one of: GOOGLE_ADS

Request

curl
curl -s -X POST https://mcp-server.metadata.io/mcp \
  -H "Authorization: $METADATA_PAT" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"add_negative_keyword_lists_to_live_campaigns","arguments":{"campaignIds":[]}}}'

Response

No recorded response. This tool writes to the account, so it is never executed to build these docs. The request above is still the exact shape to send. Nothing on this page is invented.

Other search tools:

All 160 tools · machine-readable index