Skip to main content
Glama

meta_ads_ad_sets_update

Modify existing Meta ad sets by changing only specified settings like budget, targeting, bid strategy, status, or schedule; unspecified targeting fields remain intact. Returns updated ad set.

Instructions

Updates one or more settings on an existing ad set. Partial update — only provided fields are changed. Returns the updated ad set. Mutating; not automatically reversible — record before-state if you need to roll back. For status-only transitions prefer meta_ads_ad_sets_pause / meta_ads_ad_sets_enable. Changing targeting is a safe read-modify-write by default: the supplied top-level keys are merged onto the current spec, so keys you omit are preserved. Set replace_targeting to true to replace the whole spec instead (e.g. to clear a facet).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoNew ad set name.
reasonNoWhy this change is being made: one or two sentences naming the evidence and the expected effect. Stored in the journal and on the action_log entry this call produces, for the operator and the next session.
statusNoNew ad set status. Prefer the dedicated pause/enable tools for simple ACTIVE ↔ PAUSED.
end_timeNoNew schedule end. Accepts an ISO 8601 datetime string (e.g. '2026-08-01T00:00:00+0900') or a UTC UNIX timestamp integer. Pass 0 to clear the end date so the ad set runs continuously (Meta API convention; only valid with a daily budget — a lifetime budget requires an end date).
ad_set_idYesAd set ID to update.
targetingNoTargeting spec changes. Merged onto the current spec by default (top-level keys you omit are kept). Supply only the facets you want to change, e.g. {"age_min": 25}. Set replace_targeting=true to replace the whole spec instead.
account_idNoMeta Ads account ID in the format 'act_XXXXXXXXXX' (e.g. 'act_1234567890'). Optional — falls back to META_ADS_ACCOUNT_ID from the configured credentials. The leading 'act_' prefix is required.
bid_amountNoBid cap in account currency minor units. Set when switching to a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP).
bid_strategyNoBid strategy for automatic auction bidding. LOWEST_COST_WITHOUT_CAP is fully automatic (do NOT set bid_amount). LOWEST_COST_WITH_BID_CAP and COST_CAP both require a bid_amount on the ad set (the cap). LOWEST_COST_WITH_MIN_ROAS requires bid_constraints.roas_average_floor on the ad set. When set on the campaign, budgets typically live at the campaign (CBO) level; when set on the ad set, at the ad-set level.
daily_budgetNoNew daily budget in account currency minor units. Only valid when the campaign is not using CBO. Mutually exclusive with lifetime_budget.
bid_constraintsNoBid constraints object. Currently carries roas_average_floor for the LOWEST_COST_WITH_MIN_ROAS strategy.
lifetime_budgetNoNew lifetime budget in account currency minor units (cents for USD, yen for JPY). Mutually exclusive with daily_budget. Requires the ad set to have an end_time — supply one in the same call if it is not already set.
promoted_objectNoConversion target for conversion optimization, e.g. {"pixel_id": "123", "custom_event_type": "LEAD"}. Required for conversion optimization (e.g. OUTCOME_LEADS + optimization_goal OFFSITE_CONVERSIONS optimizing to a pixel event).
replace_targetingNoWhen true, `targeting` replaces the entire spec instead of merging onto the current one. Use only to deliberately clear targeting facets. Default false (safe merge).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.20.0
    • addedInput schema / properties / reason
      Added value: +{
      +  "description": "Why this change is being made: one or two sentences naming the evidence and the expected effect. Stored in the journal and on the action_log entry this call produces, for the operator and the next session.",
      +  "maxLength": 500,
      +  "type": "string"
      +}
  2. Changed5 schema fields changedv0.10.37
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / bid_amount
      Added value: +{
      +  "description": "Bid cap in account currency minor units. Set when switching to a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP).",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / bid_constraints
      Added value: +{
      +  "description": "Bid constraints object. Currently carries roas_average_floor for the LOWEST_COST_WITH_MIN_ROAS strategy.",
      +  "properties": {
      +    "roas_average_floor": {
      +      "description": "Minimum average ROAS floor, scaled x10000 (e.g. a 1.2x ROAS target is 12000). Required when bid_strategy is LOWEST_COST_WITH_MIN_ROAS.",
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / bid_strategy
      Added value: +{
      +  "description": "Bid strategy for automatic auction bidding. LOWEST_COST_WITHOUT_CAP is fully automatic (do NOT set bid_amount). LOWEST_COST_WITH_BID_CAP and COST_CAP both require a bid_amount on the ad set (the cap). LOWEST_COST_WITH_MIN_ROAS requires bid_constraints.roas_average_floor on the ad set. When set on the campaign, budgets typically live at the campaign (CBO) level; when set on the ad set, at the ad-set level.",
      +  "enum": [
      +    "LOWEST_COST_WITHOUT_CAP",
      +    "LOWEST_COST_WITH_BID_CAP",
      +    "COST_CAP",
      +    "LOWEST_COST_WITH_MIN_ROAS"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / promoted_object
      Added value: +{
      +  "description": "Conversion target for conversion optimization, e.g. {\"pixel_id\": \"123\", \"custom_event_type\": \"LEAD\"}. Required for conversion optimization (e.g. OUTCOME_LEADS + optimization_goal OFFSITE_CONVERSIONS optimizing to a pixel event).",
      +  "properties": {
      +    "application_id": {
      +      "description": "App ID (for app-install / app-event optimization).",
      +      "type": "string"
      +    },
      +    "custom_conversion_id": {
      +      "description": "Custom Conversion ID to optimize toward.",
      +      "type": "string"
      +    },
      +    "custom_event_type": {
      +      "description": "Standard conversion event to optimize for. Common values: LEAD, PURCHASE, COMPLETE_REGISTRATION, ADD_TO_CART, INITIATED_CHECKOUT, CONTENT_VIEW. Graph accepts many values — passed through unchanged.",
      +      "type": "string"
      +    },
      +    "object_store_url": {
      +      "description": "App store URL (paired with application_id).",
      +      "type": "string"
      +    },
      +    "page_id": {
      +      "description": "Facebook Page ID (for page-based optimization goals).",
      +      "type": "string"
      +    },
      +    "pixel_id": {
      +      "description": "Meta Pixel ID to optimize conversions toward.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed3 schema fields changedv0.10.19
    • changedInput schema / properties / daily_budget / description
      Previous value: -"New daily budget in account currency minor units. Only valid when the campaign is not using CBO."New value: +"New daily budget in account currency minor units. Only valid when the campaign is not using CBO. Mutually exclusive with lifetime_budget."
    • addedInput schema / properties / end_time
      Added value: +{
      +  "description": "New schedule end. Accepts an ISO 8601 datetime string (e.g. '2026-08-01T00:00:00+0900') or a UTC UNIX timestamp integer. Pass 0 to clear the end date so the ad set runs continuously (Meta API convention; only valid with a daily budget — a lifetime budget requires an end date).",
      +  "type": [
      +    "string",
      +    "integer"
      +  ]
      +}
    • addedInput schema / properties / lifetime_budget
      Added value: +{
      +  "description": "New lifetime budget in account currency minor units (cents for USD, yen for JPY). Mutually exclusive with daily_budget. Requires the ad set to have an end_time — supply one in the same call if it is not already set.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
  4. Changed2 schema fields changedv0.10.7
    • addedInput schema / properties / replace_targeting
      Added value: +{
      +  "description": "When true, `targeting` replaces the entire spec instead of merging onto the current one. Use only to deliberately clear targeting facets. Default false (safe merge).",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / targeting / description
      Previous value: -"Full targeting spec replacement. Any keys not supplied here are cleared — fetch current spec via meta_ads_ad_sets_get and merge before writing back."New value: +"Targeting spec changes. Merged onto the current spec by default (top-level keys you omit are kept). Supply only the facets you want to change, e.g. {\"age_min\": 25}. Set replace_targeting=true to replace the whole spec instead."
  5. Addedv0.9.12
  6. Removedv0.9.6
  7. Addedv0.9.2
  8. Removedv0.9.1
  9. Addedv1.0.5

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full transparency burden and succeeds: it discloses that the operation is mutating, not automatically reversible, advises recording before-state, states that the tool returns the updated ad set, and explains the read-modify-write merge behavior for targeting with the default replace_targeting=false. This is exactly the behavioral context an agent needs.

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

Conciseness5/5

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

Four dense sentences, each earning its place: core action, partial-update scope, return value, mutability warning with rollback advice, alternative-tool routing, and targeting merge behavior. Front-loaded with the primary purpose and free of filler.

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 a 14-parameter mutation tool with no annotations and no output schema, the description covers all essential operational context: action, partial semantics, return value, mutability/rollback, when to prefer sibling tools, and the most complex parameter (targeting) behavior. No critical gap remains for the agent to call it correctly.

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 100%, so the baseline is 3. The description adds genuine cross-cutting meaning beyond individual field schemas: 'Partial update — only provided fields are changed' applies to every parameter, and the targeting merge-vs-replace explanation clarifies the trickiest field even though the schema also covers it. It does not restate each field's schema, but adds meaningful global semantics.

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?

The description opens with a specific verb and resource — 'Updates one or more settings on an existing ad set' — and immediately clarifies the partial-update scope. It also differentiates from siblings by noting that status-only transitions should go to the pause/enable tools, so an agent can tell exactly what this tool is for.

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

Usage Guidelines5/5

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

Explicitly instructs when NOT to use this tool: 'For status-only transitions prefer meta_ads_ad_sets_pause / meta_ads_ad_sets_enable.' It also explains when replace_targeting should be used ('to deliberately clear targeting facets') vs. the safe merge default, providing concrete decision guidance.

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