add_keywords_to_negative_lists
Add keywords to one or more existing Google Ads negative keyword lists.
Writes search
Creates or changes something in the account. Put it behind whatever review your agent uses.
What it does
Add keywords to one or more existing Google Ads negative keyword lists.
PURPOSE:
Append keywords (typically search terms surfaced by list_search_terms) to one or
more existing negative keyword lists, so future ads are blocked from matching them.
Use this for the day-to-day "review search terms, exclude the wasteful ones" loop.
WHEN TO USE:
- Block search terms that consumed budget without producing clicks or conversions
- Extend an existing "Keywords we don't wanna spend money on" list with new offenders
- Apply the same keywords to multiple negative lists in a single call
THIS IS NOT FOR CREATING A NEW LIST:
To create a brand-new negative keyword list, use create_negative_keywords_list.
This tool only appends to lists that already exist.
LOOKING UP LIST IDS:
Call list_negative_keywords_list first to find the id(s) of the list(s) you want
to extend. The 'id' field returned there is what you pass here as negativeListIds.
MATCH TYPE:
Two ways to set the match type, pick whichever fits:
(a) Single match type for the whole batch: pass keywords as plain strings
and set the top-level match_type. Defaults to PHRASE (the same default
the UI uses when adding from the search-terms page).
(b) Mixed match types in a single call (preferred when recommending negatives
after reviewing search terms, since it keeps the whole batch in one call):
pass keywords as objects {text, match_type}. The per-item match_type wins
over the top-level default. Items without a match_type fall back to the
top-level default.
Only PHRASE, BROAD, and EXACT are valid for negative keywords.
COMMON USE CASES:
1. Add a single wasteful search term to one list (all-PHRASE):
add_keywords_to_negative_lists(
negativeListIds=[43256533],
keywords=["free download"],
)
2. Add several terms to multiple lists, all exact-match:
add_keywords_to_negative_lists(
negativeListIds=[43256533, 43258891],
keywords=["competitor a", "competitor b"],
match_type="EXACT",
)
3. Mixed match types in ONE call (recommended after a search-terms review):
add_keywords_to_negative_lists(
negativeListIds=[43256533],
keywords=[
{"text": "free download", "match_type": "PHRASE"},
{"text": "competitor a", "match_type": "EXACT"},
{"text": "how to", "match_type": "BROAD"},
],
)
4. Mostly PHRASE with one EXACT override (mix strings + objects):
add_keywords_to_negative_lists(
negativeListIds=[43256533],
keywords=[
"free download",
"tutorial",
{"text": "competitor a", "match_type": "EXACT"},
],
match_type="PHRASE",
)
PARAMETERS:
- negativeListIds (array of integers, required): IDs of the existing negative
keyword lists to extend, as returned by list_negative_keywords_list.
- keywords (array, required): each item is either a plain string (keyword text,
uses the top-level match_type) or an object {text, match_type} where
match_type overrides the top-level default. Min 1.
- match_type (string, optional): EXACT, PHRASE, or BROAD. Default PHRASE.
Used as the default for plain-string items and for object items that omit
match_type.
RESPONSE FORMAT:
Returns the platform response describing the updated list(s).
CHANNEL SCOPE:
BOTH search channels are supported: pass channel=MICROSOFT_ADS for Microsoft
Ads (Bing) and channel=GOOGLE_ADS for Google. The two channels hold SEPARATE
lists, so never substitute one channel for the other to get "close enough"
results.Arguments
| Argument | Type | Notes | |
|---|---|---|---|
negativeListIds |
array | required | IDs of the existing negative keyword lists to extend (from list_negative_keywords_list). |
keywords |
array | required | Keywords to add to every list in negativeListIds. Each item is either a plain string or {text, match_type}. |
match_type |
string | Default match type, used when an item is a plain string or an object that omits match_type. Default PHRASE. one of: EXACT, PHRASE, BROAD |
|
channel |
string | Ad channel scope. Both search channels are supported. These are PER-CHANNEL resources: GOOGLE_ADS and MICROSOFT_ADS hold separate sets, and one is invisible to the other. Defaults to GOOGLE_ADS when the user does not say which. one of: GOOGLE_ADS, MICROSOFT_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_keywords_to_negative_lists","arguments":{"negativeListIds":[],"keywords":[]}}}'
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: