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
| Argument | Type | Notes | |
|---|---|---|---|
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.
Related
Other search tools: