Skip to main content
Glama

Metadata MCP Connector

Add & Edit Campaign Elements — Native / Channel-First (N×N×N)

add_and_edit_native_campaign_elements
Destructive

Add or edit channel containers and campaign-level settings of a Channel First campaign. Returns the updated configuration and per-operation results or errors. Search-channel containers can combine keyword groups, audiences, ads, and offers subject to platform validation. CRITICAL: PARTIAL EDITS ONLY. Only campaignId is required. Supply other fields only for the user's requested changes, never by copying the whole campaign read result. A budget-group-only move uses campaign_data={"campaignId": 12345, "budgetGroup": "Destination"}. Omit name, startDate, endDate and channel blocks unless the user also requested those edits. Campaign-level startDate/endDate writes apply to every channel, including switched-off channels, so replaying a campaign's aggregate dates can overwrite distinct channel dates. On a draft, sending one date keeps the other as saved; when the saved one cannot stay (a start date already passed, an end before the new start, channels saved with different dates) nothing changes and errors says which date to ask the user for. For a budget-only move, read the campaign before and after and verify each channel's startDate/endDate and enabled state are unchanged, alongside the new budget group. The handler returns budget_move_verification for a completed move without date or channel edits. verified=true confirms every channel's identity, dates and switch state and the destination group. verified=false also populates errors: stop further moves and report the changed fields or incomplete readback, even when success=true because the budget group already changed. No schedule rollback is attempted. Do not report dates preserved without that readback; report any mismatch explicitly.

Input Schema

NameRequiredDescriptionDefault
campaign_dataYesNative (N×N×N) campaign edit payload: campaignId + optional campaign-level fields + per-channel `containers[]` (append) and optional `target_groups[]`.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / campaign_data / properties / endDate / description
      Previous value: -"Optional new end date (YYYY-MM-DD). Omit unless the user requested a schedule change; supplied dates overwrite that date on every channel, including switched-off channels."New value: +"Optional new end date (YYYY-MM-DD). Omit unless the user requested a schedule change; supplied dates overwrite that date on every channel, including switched-off channels. A draft keeps its saved start date when only endDate is sent."
    • changedInput schema / properties / campaign_data / properties / startDate / description
      Previous value: -"Optional new start date (YYYY-MM-DD). Omit unless the user requested a schedule change; supplied dates overwrite that date on every channel, including switched-off channels."New value: +"Optional new start date (YYYY-MM-DD). Omit unless the user requested a schedule change; supplied dates overwrite that date on every channel, including switched-off channels. A draft keeps its saved end date when only startDate is sent; a launched campaign's start date cannot change."
  2. Changed2 schema fields changed
    • changedInput schema / properties / campaign_data / properties / endDate / description
      Previous value: -"Campaign end date (YYYY-MM-DD) — REPLACES the existing end date."New value: +"Optional new end date (YYYY-MM-DD). Omit unless the user requested a schedule change; supplied dates overwrite that date on every channel, including switched-off channels."
    • changedInput schema / properties / campaign_data / properties / startDate / description
      Previous value: -"Campaign start date (YYYY-MM-DD) — REPLACES the existing start date."New value: +"Optional new start date (YYYY-MM-DD). Omit unless the user requested a schedule change; supplied dates overwrite that date on every channel, including switched-off channels."
  3. Changed18 schema fields changed
    • changedInput schema / properties / campaign_data / properties / facebook / properties / modify_containers / description
      Previous value: -"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once."New value: +"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Put a Targeting Group on a container with `set_target_group`; with `remove_audience` on the same entry it replaces the audience. Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once. An audience, target group or exclusion that no container uses any more is deleted from the channel (keyword groups stay), and a container left holding ads with nothing to target them is named in the result's `warnings[]`. Not in the same call as `target_groups`."
    • addedInput schema / properties / campaign_data / properties / facebook / properties / modify_containers / items / properties / set_target_group
      Added value: +{
      +  "description": "Name of an existing Targeting Group to put on THIS container, replacing any target group it has; the container keeps its name and ads. Together with `remove_audience` it REPLACES the container's audience with this target group, in one step. Matched by name, ignoring case and surrounding spaces; a name that matches no target group, or several, is refused.",
      +  "type": "string"
      +}
    • changedInput schema / properties / campaign_data / properties / facebook / properties / target_groups / description
      Previous value: -"Targeting Group names to attach to the channel without a full container (bare target-group add)."New value: +"Targeting Group names to attach to the channel without a full container (bare target-group add). Each name must match one target group, ignoring case and surrounding spaces; one that matches none or several is reported and skipped. Each goes on the first container with no audience and no target group (renamed after it), else on a new container with no ads. Not in the same call as `modify_containers`; to put a target group on a specific container, use `set_target_group` there instead."
    • changedInput schema / properties / campaign_data / properties / google / properties / modify_containers / description
      Previous value: -"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once."New value: +"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Put a Targeting Group on a container with `set_target_group`; with `remove_audience` on the same entry it replaces the audience. Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once. An audience, target group or exclusion that no container uses any more is deleted from the channel (keyword groups stay), and a container left holding ads with nothing to target them is named in the result's `warnings[]`. Not in the same call as `target_groups`."
    • addedInput schema / properties / campaign_data / properties / google / properties / modify_containers / items / properties / set_target_group
      Added value: +{
      +  "description": "Name of an existing Targeting Group to put on THIS container, replacing any target group it has; the container keeps its name and ads. Together with `remove_audience` it REPLACES the container's audience with this target group, in one step. Matched by name, ignoring case and surrounding spaces; a name that matches no target group, or several, is refused.",
      +  "type": "string"
      +}
    • changedInput schema / properties / campaign_data / properties / google / properties / target_groups / description
      Previous value: -"Targeting Group names to attach to the channel without a full container (bare target-group add)."New value: +"Targeting Group names to attach to the channel without a full container (bare target-group add). Each name must match one target group, ignoring case and surrounding spaces; one that matches none or several is reported and skipped. Each goes on the first container with no audience and no target group (renamed after it), else on a new container with no ads. Not in the same call as `modify_containers`; to put a target group on a specific container, use `set_target_group` there instead."
    • changedInput schema / properties / campaign_data / properties / instagram / properties / modify_containers / description
      Previous value: -"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once."New value: +"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Put a Targeting Group on a container with `set_target_group`; with `remove_audience` on the same entry it replaces the audience. Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once. An audience, target group or exclusion that no container uses any more is deleted from the channel (keyword groups stay), and a container left holding ads with nothing to target them is named in the result's `warnings[]`. Not in the same call as `target_groups`."
    • addedInput schema / properties / campaign_data / properties / instagram / properties / modify_containers / items / properties / set_target_group
      Added value: +{
      +  "description": "Name of an existing Targeting Group to put on THIS container, replacing any target group it has; the container keeps its name and ads. Together with `remove_audience` it REPLACES the container's audience with this target group, in one step. Matched by name, ignoring case and surrounding spaces; a name that matches no target group, or several, is refused.",
      +  "type": "string"
      +}
    • changedInput schema / properties / campaign_data / properties / instagram / properties / target_groups / description
      Previous value: -"Targeting Group names to attach to the channel without a full container (bare target-group add)."New value: +"Targeting Group names to attach to the channel without a full container (bare target-group add). Each name must match one target group, ignoring case and surrounding spaces; one that matches none or several is reported and skipped. Each goes on the first container with no audience and no target group (renamed after it), else on a new container with no ads. Not in the same call as `modify_containers`; to put a target group on a specific container, use `set_target_group` there instead."
    • changedInput schema / properties / campaign_data / properties / linkedin / properties / modify_containers / description
      Previous value: -"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once."New value: +"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Put a Targeting Group on a container with `set_target_group`; with `remove_audience` on the same entry it replaces the audience. Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once. An audience, target group or exclusion that no container uses any more is deleted from the channel (keyword groups stay), and a container left holding ads with nothing to target them is named in the result's `warnings[]`. Not in the same call as `target_groups`."
    • addedInput schema / properties / campaign_data / properties / linkedin / properties / modify_containers / items / properties / set_target_group
      Added value: +{
      +  "description": "Name of an existing Targeting Group to put on THIS container, replacing any target group it has; the container keeps its name and ads. Together with `remove_audience` it REPLACES the container's audience with this target group, in one step. Matched by name, ignoring case and surrounding spaces; a name that matches no target group, or several, is refused.",
      +  "type": "string"
      +}
    • changedInput schema / properties / campaign_data / properties / linkedin / properties / target_groups / description
      Previous value: -"Targeting Group names to attach to the channel without a full container (bare target-group add)."New value: +"Targeting Group names to attach to the channel without a full container (bare target-group add). Each name must match one target group, ignoring case and surrounding spaces; one that matches none or several is reported and skipped. Each goes on the first container with no audience and no target group (renamed after it), else on a new container with no ads. Not in the same call as `modify_containers`; to put a target group on a specific container, use `set_target_group` there instead."
    • changedInput schema / properties / campaign_data / properties / microsoft / properties / modify_containers / description
      Previous value: -"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once."New value: +"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Put a Targeting Group on a container with `set_target_group`; with `remove_audience` on the same entry it replaces the audience. Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once. An audience, target group or exclusion that no container uses any more is deleted from the channel (keyword groups stay), and a container left holding ads with nothing to target them is named in the result's `warnings[]`. Not in the same call as `target_groups`."
    • addedInput schema / properties / campaign_data / properties / microsoft / properties / modify_containers / items / properties / set_target_group
      Added value: +{
      +  "description": "Name of an existing Targeting Group to put on THIS container, replacing any target group it has; the container keeps its name and ads. Together with `remove_audience` it REPLACES the container's audience with this target group, in one step. Matched by name, ignoring case and surrounding spaces; a name that matches no target group, or several, is refused.",
      +  "type": "string"
      +}
    • changedInput schema / properties / campaign_data / properties / microsoft / properties / target_groups / description
      Previous value: -"Targeting Group names to attach to the channel without a full container (bare target-group add)."New value: +"Targeting Group names to attach to the channel without a full container (bare target-group add). Each name must match one target group, ignoring case and surrounding spaces; one that matches none or several is reported and skipped. Each goes on the first container with no audience and no target group (renamed after it), else on a new container with no ads. Not in the same call as `modify_containers`; to put a target group on a specific container, use `set_target_group` there instead."
    • changedInput schema / properties / campaign_data / properties / reddit / properties / modify_containers / description
      Previous value: -"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once."New value: +"Edit EXISTING containers in place: delete specific Ad—Offer rows (`remove_ads`), clear an offer from one ad while keeping it on others (`clear_offers_on_ads`), remove this container's audience / targeting group / keywords / exclusion (`remove_audience` / `remove_target_group` / `remove_keywords` / `remove_exclude_audience` — clears it on THIS container only, leaving any container that reuses it untouched), or delete a whole container (`delete_container`). Put a Targeting Group on a container with `set_target_group`; with `remove_audience` on the same entry it replaces the audience. Target each by its `container` name. Use this for surgical per-container changes; use the channel-wide remove_* tools only to act on ALL containers at once. An audience, target group or exclusion that no container uses any more is deleted from the channel (keyword groups stay), and a container left holding ads with nothing to target them is named in the result's `warnings[]`. Not in the same call as `target_groups`."
    • addedInput schema / properties / campaign_data / properties / reddit / properties / modify_containers / items / properties / set_target_group
      Added value: +{
      +  "description": "Name of an existing Targeting Group to put on THIS container, replacing any target group it has; the container keeps its name and ads. Together with `remove_audience` it REPLACES the container's audience with this target group, in one step. Matched by name, ignoring case and surrounding spaces; a name that matches no target group, or several, is refused.",
      +  "type": "string"
      +}
    • changedInput schema / properties / campaign_data / properties / reddit / properties / target_groups / description
      Previous value: -"Targeting Group names to attach to the channel without a full container (bare target-group add)."New value: +"Targeting Group names to attach to the channel without a full container (bare target-group add). Each name must match one target group, ignoring case and surrounding spaces; one that matches none or several is reported and skipped. Each goes on the first container with no audience and no target group (renamed after it), else on a new container with no ads. Not in the same call as `modify_containers`; to put a target group on a specific container, use `set_target_group` there instead."
  4. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already flag destructive=true and openWorld=true, but the description goes far beyond them: it warns that campaign-level startDate/endDate writes hit every channel including switched-off ones, explains draft date-coexistence rules and the no-change-plus-errors fallback, and documents the budget_move_verification contract including that verified=false must halt further moves even when success=true. It also states plainly that no schedule rollback is attempted.

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?

Purpose is front-loaded in one sentence, then a CRITICAL block, then the budget-move workflow — a sensible order for a mutation tool. It is long and the verification paragraph repeats itself slightly ('Do not report dates preserved without that readback; report any mismatch explicitly'), costing a point.

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 single top-level payload with a deeply nested, platform-specific schema and no output schema, the description covers the risky parts an agent cannot infer: partial-edit discipline, cross-channel date overwrite, draft behavior, and the verification/errors readback. Prerequisites like channel connection and audience resolution are carried by the schema fields.

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% and the nested fields are richly documented, so the baseline is 3; the description still adds value with a concrete payload example (campaign_data={"campaignId": 12345, "budgetGroup": "Destination"}) and the partial-edit contract that governs how the whole object is populated. That is meaning beyond the schema's field-by-field docs.

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

Purpose4/5

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

States a specific verb pair (add or edit) and a specific resource (channel containers + campaign-level settings of a Channel First / native campaign), so the agent knows exactly what changes. It does not distinguish itself from the sibling add_and_edit_campaign_elements (the non-native counterpart), which an agent would need to choose between.

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?

Strong when/how guidance: 'PARTIAL EDITS ONLY', 'Supply other fields only for the user's requested changes, never by copying the whole campaign read result', and the explicit omission rule for name/startDate/endDate/channel blocks. It also prescribes the read-before/read-after workflow for a budget-group-only move. It stops short of naming an alternative tool for the non-native case.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources