Skip to Content
Tool referenceManage Google Ads keywords

Manage Google Ads keywords (adsap_google_manage_keywords)

Platform: Google Ads · Read or write: Write · Plan: All plans · Consumes a task: Yes · Preview supported: Yes

What it does

Manages Search keywords after a campaign exists. It adds up to 100 keywords or ad group negatives in one batch, adds campaign-level negative keywords, replaces one keyword’s text or match type, or removes a keyword. Ask for a preview first.

When to use it

  • Use it on a Search campaign that already exists. Each call runs one op: add, add_negative, replace or remove.
  • add needs ad_group_id and takes up to 100 keywords. Set negative to true on an item to make it an ad group negative.
  • add_negative needs campaign_id. Its keywords take only text and match_type, and they block queries across the whole campaign.
  • replace and remove need keyword_id, written <ad_group_id>:<criterion_id>. Get it from adsap_google_get_insights at keyword level.
  • It supports a preview call. To pause a keyword, use adsap_google_set_entity_status. To change only its bid, use adsap_google_update_entity.

Worked example

You ask

“Preview adding two phrase match keywords and the negative ‘free’ to ad group 31000000001 in Google Ads account 1234567890.”

The assistant calls adsap_google_manage_keywords

{ "op": "add", "ad_account_id": "1234567890", "ad_group_id": "31000000001", "keywords": [ { "text": "waterproof trail shoes", "match_type": "PHRASE" }, { "text": "trail running shoes", "match_type": "PHRASE" }, { "text": "free", "match_type": "BROAD", "negative": true } ], "dry_run": true }

Adsap returns

The field names are the ones Adsap returns. The values are examples.

{ "ok": true, "dry_run": true, "platform": "google", "entity_type": "ad_group", "entity_id": "31000000001", "name": "Trail shoes", "current_status": "ENABLED", "changes": [ { "field": "add_keyword", "current_value": null, "new_value": "\"waterproof trail shoes\" [PHRASE]", "will_change": true }, { "field": "add_keyword", "current_value": null, "new_value": "\"trail running shoes\" [PHRASE]", "will_change": true }, { "field": "add_negative_keyword", "current_value": null, "new_value": "\"free\" [BROAD] (negative)", "will_change": true } ], "total_would_change": 3, "google_validation": "passed", "warnings": [] }

How to read it

entity_type and entity_id name the ad group the keywords would join, with its name and current_status in Google’s wording. changes holds one row per keyword. field reads add_keyword for a keyword and add_negative_keyword for an ad group negative. total_would_change counts the rows. google_validation reads passed when Google accepts the whole batch. Otherwise it carries Google’s error message.

Nothing was applied here. The response also carries a human_readable_summary sentence, left out of this example. To add the keywords, the assistant repeats the call with dry_run set to false. That response lists the new keyword IDs in created_keywords.

Parameters

Descriptions are shortened from the tool schema. Your assistant sees the full text.

NameTypeRequiredDescription
opone of add, add_negative, replace, removeYes
ad_account_idstringYesBare 10-digit Google Ads customer ID (from adsap_google_list_ad_accounts). No dashes, no act_ prefix.
ad_group_idstringNoop ‘add’ only: the EXISTING ad group to add keywords/negatives to.
campaign_idstringNoop ‘add_negative’ only: the campaign to add campaign-level negatives to.
keywordsarray of objectNoops ‘add’ / ‘add_negative’: the keywords to create. For add_negative, cpc_bid/negative are not allowed (campaign keywords are negative by definition).
keywords[].textstringYesKeyword text, 80 chars max (Google limit).
keywords[].match_typeone of EXACT, PHRASE, BROADYes
keywords[].cpc_bidnumberNoOptional per-keyword max CPC in the ACCOUNT CURRENCY (e.g. 1.25). Only used when the campaign bids Manual CPC: automated strategies ignore it. Not allowed on negatives.
keywords[].negativebooleanNotrue = ad-group-level NEGATIVE (blocks matching queries in this ad group). op ‘add’ only.
keyword_idstringNoops ‘replace’ / ‘remove’: the ad-group keyword as “<ad_group_id>:<criterion_id>”.
campaign_negative_idstringNoop ‘remove’ only: a campaign-level negative as “<campaign_id>:<criterion_id>” (ids returned by op ‘add_negative’).
replace_withobjectNoop ‘replace’ only: the replacement keyword.
replace_with.textstringNoNew keyword text. Omit to keep the current text (match-type-only change).
replace_with.match_typeone of EXACT, PHRASE, BROADYes
replace_with.cpc_bidnumberNoNew max CPC in account currency. Omit to carry the current bid over.
dry_runbooleanNoPreview only: the request is validated and the resolved payload returned, nothing is created or changed.

Example prompts

  • “Add these 20 keywords as phrase match to the Trail Shoes ad group.”
  • “Add ‘free’ and ‘jobs’ as negative keywords across my whole Search campaign.”
  • “Change the keyword ‘running shoe’ from broad to exact match.”
  • “Remove the keyword ‘cheap sneakers’ from the Trail Shoes ad group.”

Notes

Google keyword text and match type cannot be edited. A replace is a remove plus a re-add, so the keyword gets a new ID and its performance history restarts.

  • adsap_google_keyword_ideas: Get keyword suggestions with search volume from Google Keyword Planner for a Google Search campaign.
  • adsap_google_manage_targeting: Manage a Google Ads campaign or ad group’s targeting AFTER creation: GEO, LANGUAGE and AUDIENCES.
  • adsap_google_search_geo_targets: Find Google Ads geo target constants by location name (city, region, country, postal area) for Search campaign location targeting.
  • adsap_google_search_terms: Search terms report for a Google Ads account: the REAL user queries that triggered Search (and Shopping) ads, with…

Guide

Read Keywords for the workflow around this tool, and the Tool reference for every tool.

The Google Ads MCP server  page shows how to connect Google Ads to Claude, ChatGPT or Perplexity.

Last updated on