Skip to main content
Glama

Scribe Mail

Update a marketing campaign

update_marketing_campaign
DestructiveIdempotent

Update a marketing campaign by UUID. Only the fields you pass change (omit = leave as-is; content: null clears it). status is read-only — use schedule/pause/resume to change it. Invalid enums, unknown smart fields, or unknown signature templates return 422.

Input Schema

NameRequiredDescriptionDefault
idYesThe campaign's UUID (the `id` from list_marketing_campaigns).
nameNo
contentNoCampaign block tree (ILayoutBlock): a `stack` root whose `children` are blocks. Strict-validated server-side. Omit to leave unchanged; null to clear. Every node (block AND token) needs an `id` that is a fresh LOWERCASE uuid — any other string, including an uppercase uuid, is rejected 422. Every numeric size is in PIXELS, never a CSS multiplier: `lineHeight` is a px line box (~1.3x fontSize, e.g. fontSize 14 -> 18), so 1.3 is rejected. Call get_content_schema for the full schema, every enum value, and a worked example.
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
end_timeNoISO-8601 end of the campaign window.
behaviourNoHow the campaign content combines with the signature (replace or append).
time_zoneNoIANA time zone, e.g. 'Europe/Paris'.
send_emailNo
start_timeNoISO-8601 start of the campaign window.
filter_kindNoWhich targeting dimension applies: by signature_templates or by smart_fields conditions.
signature_template_idsNoUUIDs of the signature templates to apply the campaign to (replaces the set; [] clears).
smart_fields_conditionsNoSmart-field targeting: an array of OR-groups, each an array of AND-conditions { smart_field_id (uuid), operator, values }.

Output Schema

NameRequiredDescriptionDefault
dataYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / data / properties / name / description
      Added value: +"Campaign name. Null for a legacy draft that was saved without one. Report it as an unnamed draft and refer to it by its id rather than inventing a name."
    • changedOutput schema / properties / data / properties / name / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  2. Changed7 schema fields changed
    • changedInput schema / properties / content / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "blockStyle": {
      -        "additionalProperties": {},
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "children": {
      -        "items": {
      -          "additionalProperties": {},
      -          "properties": {
      -            "id": {
      -              "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.",
      -              "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      -              "type": "string"
      -            },
      -            "role": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "type": {
      -              "enum": [
      -                "stack",
      -                "text",
      -                "image",
      -                "icon",
      -                "list",
      -                "listItem",
      -                "listItemLabel",
      -                "socialList",
      -                "socialListItem",
      -                "button",
      -                "divider",
      -                "marketing"
      -              ],
      -              "type": "string"
      -            },
      -            "visible": {
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "type",
      -            "role",
      -            "visible"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.",
      -        "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      -        "type": "string"
      -      },
      -      "role": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "type": {
      -        "const": "stack",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "type",
      -      "role",
      -      "visible",
      -      "blockStyle",
      -      "children"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "blockStyle": {
      +        "additionalProperties": {},
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "children": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "id": {
      +              "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.",
      +              "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      +              "type": "string"
      +            },
      +            "role": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "type": {
      +              "enum": [
      +                "stack",
      +                "text",
      +                "image",
      +                "icon",
      +                "list",
      +                "listItem",
      +                "listItemLabel",
      +                "socialList",
      +                "socialListItem",
      +                "button",
      +                "divider",
      +                "marketing"
      +              ],
      +              "type": "string"
      +            },
      +            "visible": {
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "type",
      +            "role",
      +            "visible"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Lowercase uuid (8-4-4-4-12 hex), e.g. 6f1e8a2c-4b0d-4c8e-9f3a-2d7b5e9c1a4f. Generate a fresh one per element and keep it stable across updates so a link keeps its click-tracking identity.",
      +        "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      +        "type": "string"
      +      },
      +      "role": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "const": "stack",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "type",
      +      "role",
      +      "visible",
      +      "blockStyle",
      +      "children"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / data / properties / end_time / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / data / properties / end_time / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / data / properties / start_time / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / data / properties / start_time / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / data / properties / time_zone / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / data / properties / time_zone / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  3. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructive/idempotent/openWorld, and the description correctly adds non-obvious behavior on top: omit-equals-unchanged, `content: null` as the explicit clear, and 422 as the failure mode for bad enums, smart fields, or signature templates. It does not explain what makes the call destructive in the annotations' sense beyond content clearing, nor any permission or rate-limit constraints, so it stops short of a 5.

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?

Three short sentences, front-loaded with the identity (UUID) and the patch semantics, then error behavior last. Every clause carries information an agent would otherwise have to infer or discover on a 422.

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

Completeness4/5

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

For a 12-parameter, deeply nested mutation with an output schema, this covers the essentials: lookup key, partial-update semantics, content clearing, blocked field, and validation failures, with content-schema detail delegated to a sibling. The remaining gap is that no guidance is given on ordering against preview_marketing_campaign or on how filter_kind governs the targeting parameters.

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 83%, but the description still adds real meaning: the null-vs-omit distinction for `content`, the prohibition on changing `status`, and the pointer to get_content_schema for the block tree's enums and worked example. It does not address the interaction between `filter_kind` and its two targeting payloads, which is the one semantic gap left to the schema.

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?

States a specific verb and resource ("Update a marketing campaign by UUID") and immediately scopes it against the lifecycle siblings by declaring `status` read-only and routing status changes to schedule/pause/resume. An agent can distinguish this from pause_marketing_campaign, resume_marketing_campaign, schedule_marketing_campaign, and create_marketing_campaign without opening any schema.

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?

Gives an explicit alternative plus the condition that selects it ("status is read-only — use schedule/pause/resume to change it") and defers content structure to get_content_schema. It also states the partial-update contract ("only the fields you pass change"), which tells the agent this is a patch, not a replace-all.

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.