Skip to main content
Glama
AdLoop: Google Ads, Reddit Ads & GA4

AdLoop: Google Ads, Reddit Ads & GA4

Draft campaign changes

update_campaign

Draft changes to an existing campaign and return a preview without applying them. Only supplied settings change; confirm the plan to apply the update.

Instructions

Draft an update to an existing campaign — returns a PREVIEW, does NOT apply.

Only the parameters passed are changed; omitted ones stay as they are, and at least one change is required. Replacing geo targets keeps the campaign's negative geo exclusions (the preview lists them). A budget change shows the current amount; when the budget is shared with other campaigns, the preview names them and needs a double confirmation, because the new amount covers all of them. A bidding change on a campaign in a portfolio bid strategy takes it out of the portfolio, also with a double confirmation.

Returns a preview with a plan_id plus any warnings; nothing changes until confirm_and_apply applies it.

Google Ads API: https://developers.google.com/google-ads/api/docs/start

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "campaign_id": "<campaign_id>"
    },
    "name": "update_campaign"
  }
}

Input Schema

NameRequiredDescriptionDefault
max_cpcNoMaximize Clicks CPC cap in the account's currency when bidding_strategy is TARGET_SPEND, or when the existing campaign already uses TARGET_SPEND. Increases are limited by the config's max_bid_increase_pct. 0 leaves it unchanged.
target_cpaNoTarget CPA in the account's currency; required if bidding_strategy is TARGET_CPA. 0 leaves it unchanged.
campaign_idYesThe numeric ID of the campaign to update (required).
customer_idNoGoogle Ads customer ID (digits, e.g. "1234567890"). Empty uses the configured default account.
target_roasNoTarget ROAS as a ratio (e.g. 4.0 = 400%); required if bidding_strategy is TARGET_ROAS. 0 leaves it unchanged.
daily_budgetNoNew daily budget in the account's currency (not micros), at most the config's max_daily_budget. 0 leaves it unchanged. On a shared budget it is the amount for every campaign sharing it.
language_idsNoREPLACES all language targets; must not be empty when given. Common IDs: "1001" German, "1000" English, "1002" French, "1003" Spanish, "1004" Italian.
geo_target_idsNoREPLACES all positive geo targets; must not be empty when given. Common IDs: "2276" Germany, "2040" Austria, "2756" Switzerland, "2840" USA, "2826" UK.
location_optionNoPRESENCE | PRESENCE_OR_INTEREST | SEARCH_INTEREST. Who the geo targets reach; the preview shows the current value (current_location_option) and warns when the new one is anything but PRESENCE. Empty leaves it unchanged.
bidding_strategyNoMAXIMIZE_CONVERSIONS | TARGET_CPA | TARGET_ROAS | MAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | MANUAL_CPC. Empty leaves the strategy unchanged.
final_url_suffixNoParameters appended to the landing page URL. Omitted leaves it unchanged; "" removes it.
keyword_match_typeNoCampaign-level broad match. BROAD turns it on and CONVERTS every existing phrase and exact keyword in the campaign to broad match (the originals show as Removed; turning it off does not restore them), and since September 2026 Google upgrades such campaigns to AI Max. Refused unless the campaign uses Smart Bidding (MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, TARGET_CPA, TARGET_ROAS), checked again at apply; needs a double confirmation. UNSPECIFIED turns it off: no further conversions, but converted keywords stay broad. Moving a campaign with broad match on to a non-Smart bidding_strategy is refused unless the same call passes UNSPECIFIED. The preview shows the current value. Empty leaves it unchanged.
tracking_url_templateNoCampaign tracking template; must contain {lpurl} or a variant. Omitted leaves it unchanged; "" removes it.
url_custom_parametersNoList of {"key", "value"}; REPLACES the campaign's custom parameters. Keys alphanumeric, max 8 characters. Omitted leaves them unchanged; [] removes them. The preview shows each current value (current_tracking_url_template etc.), names any removal, and gives example_click: one of the campaign's final URLs with the campaign's options applied. It is approximate: a template on the ad group, ad or keyword overrides the campaign's.
display_network_enabledNoEnable Search campaign display expansion. Omitted leaves the setting unchanged.
search_partners_enabledNoInclude ads on Search partners. Omitted leaves the setting unchanged.
negative_location_optionNoPRESENCE | PRESENCE_OR_INTEREST. Who the location exclusions exclude; the preview shows the current value. PRESENCE excludes fewer people (only those physically there), so it widens reach and the preview warns. Empty leaves it unchanged.
display_expansion_enabledNoAlias for display_network_enabled; both must match when both are given.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.38.1
    • addedInput schema / properties / keyword_match_type
      Added value: +{
      +  "default": "",
      +  "description": "Campaign-level broad match. BROAD turns it on and\nCONVERTS every existing phrase and exact keyword in the campaign to\nbroad match (the originals show as Removed; turning it off does not\nrestore them), and since September 2026 Google upgrades such\ncampaigns to AI Max. Refused unless the campaign uses Smart Bidding\n(MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, TARGET_CPA,\nTARGET_ROAS), checked again at apply; needs a double confirmation.\nUNSPECIFIED turns it off: no further conversions, but converted\nkeywords stay broad. Moving a campaign with broad match on to a\nnon-Smart bidding_strategy is refused unless the same call passes\nUNSPECIFIED. The preview shows the current value. Empty leaves it\nunchanged.",
      +  "type": "string"
      +}
  2. Changed5 schema fields changedv0.37.0
    • addedInput schema / properties / final_url_suffix
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Parameters appended to the landing page URL. Omitted\nleaves it unchanged; \"\" removes it."
      +}
    • addedInput schema / properties / location_option
      Added value: +{
      +  "default": "",
      +  "description": "PRESENCE | PRESENCE_OR_INTEREST | SEARCH_INTEREST.\nWho the geo targets reach; the preview shows the current value\n(current_location_option) and warns when the new one is anything\nbut PRESENCE. Empty leaves it unchanged.",
      +  "type": "string"
      +}
    • addedInput schema / properties / negative_location_option
      Added value: +{
      +  "default": "",
      +  "description": "PRESENCE | PRESENCE_OR_INTEREST. Who the\nlocation exclusions exclude; the preview shows the current value.\nPRESENCE excludes fewer people (only those physically there), so\nit widens reach and the preview warns. Empty leaves it unchanged.",
      +  "type": "string"
      +}
    • addedInput schema / properties / tracking_url_template
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Campaign tracking template; must contain {lpurl}\nor a variant. Omitted leaves it unchanged; \"\" removes it."
      +}
    • addedInput schema / properties / url_custom_parameters
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "List of {\"key\", \"value\"}; REPLACES the\ncampaign's custom parameters. Keys alphanumeric, max 8 characters.\nOmitted leaves them unchanged; [] removes them. The preview shows\neach current value (current_tracking_url_template etc.), names any\nremoval, and gives example_click: one of the campaign's final URLs\nwith the campaign's options applied. It is approximate: a template\non the ad group, ad or keyword overrides the campaign's."
      +}
  3. Changed1 schema field changedv0.35.1
    • changedInput schema / properties / daily_budget / description
      Previous value: -"New daily budget in the account's currency (not micros),\nat most the config's max_daily_budget. 0 leaves it unchanged."New value: +"New daily budget in the account's currency (not micros),\nat most the config's max_daily_budget. 0 leaves it unchanged. On a\nshared budget it is the amount for every campaign sharing it."
  4. Changed12 schema fields changedv0.27.1
    • addedInput schema / properties / bidding_strategy / description
      Added value: +"MAXIMIZE_CONVERSIONS | TARGET_CPA | TARGET_ROAS |\nMAXIMIZE_CONVERSION_VALUE | TARGET_SPEND | MANUAL_CPC. Empty leaves\nthe strategy unchanged."
    • addedInput schema / properties / campaign_id / description
      Added value: +"The numeric ID of the campaign to update (required)."
    • addedInput schema / properties / customer_id / description
      Added value: +"Google Ads customer ID (digits, e.g. \"1234567890\"). Empty\nuses the configured default account."
    • addedInput schema / properties / daily_budget / description
      Added value: +"New daily budget in the account's currency (not micros),\nat most the config's max_daily_budget. 0 leaves it unchanged."
    • addedInput schema / properties / display_expansion_enabled / description
      Added value: +"Alias for display_network_enabled; both must\nmatch when both are given."
    • addedInput schema / properties / display_network_enabled / description
      Added value: +"Enable Search campaign display expansion.\nOmitted leaves the setting unchanged."
    • addedInput schema / properties / geo_target_ids / description
      Added value: +"REPLACES all positive geo targets; must not be empty\nwhen given. Common IDs: \"2276\" Germany, \"2040\" Austria, \"2756\"\nSwitzerland, \"2840\" USA, \"2826\" UK."
    • addedInput schema / properties / language_ids / description
      Added value: +"REPLACES all language targets; must not be empty when\ngiven. Common IDs: \"1001\" German, \"1000\" English, \"1002\" French,\n\"1003\" Spanish, \"1004\" Italian."
    • addedInput schema / properties / max_cpc / description
      Added value: +"Maximize Clicks CPC cap in the account's currency when\nbidding_strategy is TARGET_SPEND, or when the existing campaign\nalready uses TARGET_SPEND. Increases are limited by the config's\nmax_bid_increase_pct. 0 leaves it unchanged."
    • addedInput schema / properties / search_partners_enabled / description
      Added value: +"Include ads on Search partners. Omitted leaves\nthe setting unchanged."
    • addedInput schema / properties / target_cpa / description
      Added value: +"Target CPA in the account's currency; required if\nbidding_strategy is TARGET_CPA. 0 leaves it unchanged."
    • addedInput schema / properties / target_roas / description
      Added value: +"Target ROAS as a ratio (e.g. 4.0 = 400%); required if\nbidding_strategy is TARGET_ROAS. 0 leaves it unchanged."
  5. First observedv0.9.0

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=false, openWorldHint=true) it discloses concrete side effects: geo replacement preserves negative geo exclusions, a shared budget preview names every affected campaign and requires double confirmation, a bidding change pulls the campaign out of a portfolio bid strategy with double confirmation. These are exactly the pre-call risks an agent could not infer from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key fact — preview, not apply — is front-loaded in the first clause, and each following sentence carries a distinct side effect rather than filler. It runs long and would read faster as a short bullet list of gotchas, but no sentence is expendable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter mutation-drafting tool with an output schema, this covers what the schema cannot: preview semantics, confirmation gates, the confirm_and_apply handoff, and irreversible outcomes. Nothing an agent needs before calling is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3, but the description adds cross-parameter meaning the schema does not: shared budgets apply to all sharers, and a keyword_match_type BROAD change is only permitted under Smart Bidding. It adds less on individual field formats, which the schema already covers well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Draft an update to an existing campaign — returns a PREVIEW, does NOT apply" gives a specific verb, resource, and the critical outcome, immediately separating it from draft_campaign (create) and confirm_and_apply (apply). The agent knows what it produces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the partial-update rule ("only the parameters passed are changed; omitted ones stay as they are") and the constraint that at least one change is required, and it routes the agent to confirm_and_apply for the actual mutation. It stops short of contrasting with sibling update tools (update_ad_group, update_reddit_campaign) or saying when not to draft an update.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools