Skip to main content
Glama

Edit promotion

update_promotion
DestructiveIdempotent

Apply narrow ordered changes to a promotion, including public promotions. Read its schema first. Omitted values survive; a theme replaces all colors. Changes affect the public promotion immediately. Before changing the prize, Official Rules, or start/end dates of a promotion that is currently accepting entries, show the user the exact change and get their explicit confirmation; entrants may have relied on the published terms. Retries must keep their key and payload.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
operationsYesBatch related changes into one ordered atomic update, up to 50 operations. Remove takes singular id; order takes every active ids value. Discover the target section for allowed values.
promotion_idYes
response_modeNoSummary returns actual saved changed values and created/removed IDs; minimal omits changed values; full includes saved configuration subject to pagination limits. All include advisory readiness. Keep the original payload for exact retries.summary
idempotency_keyYesUnique to this operation on this connection. Identical requests replay for seven days or until the connection expires, whichever is sooner. Expired keys are rejected. After reconnecting, read current state before a new operation; retry keys do not carry across connections.
expected_revisionYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / operations / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "set",
      -        "type": "string"
      -      },
      -      "section": {
      -        "enum": [
      -          "content",
      -          "rules",
      -          "security",
      -          "colors",
      -          "fonts",
      -          "layout",
      -          "theme",
      -          "assets",
      -          "schedule",
      -          "custom_css",
      -          "design"
      -        ],
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": true,
      -        "maxProperties": 30,
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "set",
      -        "type": "string"
      -      },
      -      "id": {
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "section": {
      -        "enum": [
      -          "fields",
      -          "prizes",
      -          "bonus_actions"
      -        ],
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": true,
      -        "maxProperties": 30,
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "id",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "add",
      -        "type": "string"
      -      },
      -      "section": {
      -        "enum": [
      -          "fields",
      -          "bonus_actions"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": true,
      -        "maxProperties": 30,
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "add",
      -        "type": "string"
      -      },
      -      "section": {
      -        "enum": [
      -          "prizes"
      -        ],
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": true,
      -        "maxProperties": 30,
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "add",
      -        "type": "string"
      -      },
      -      "section": {
      -        "enum": [
      -          "assets"
      -        ],
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": true,
      -        "maxProperties": 30,
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "remove",
      -        "type": "string"
      -      },
      -      "id": {
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "section": {
      -        "enum": [
      -          "fields",
      -          "prizes",
      -          "bonus_actions",
      -          "assets"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "order",
      -        "type": "string"
      -      },
      -      "ids": {
      -        "items": {
      -          "minimum": 1,
      -          "type": "integer"
      -        },
      -        "maxItems": 50,
      -        "type": "array",
      -        "uniqueItems": true
      -      },
      -      "section": {
      -        "enum": [
      -          "fields",
      -          "bonus_actions",
      -          "assets"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "ids"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "reset",
      -        "type": "string"
      -      },
      -      "section": {
      -        "enum": [
      -          "colors",
      -          "fonts",
      -          "layout"
      -        ],
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": true,
      -        "maxProperties": 30,
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "section",
      -      "action",
      -      "values"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "set",
      +        "type": "string"
      +      },
      +      "section": {
      +        "enum": [
      +          "content",
      +          "rules",
      +          "security",
      +          "colors",
      +          "fonts",
      +          "layout",
      +          "theme",
      +          "assets",
      +          "schedule",
      +          "custom_css",
      +          "design",
      +          "quiz"
      +        ],
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": true,
      +        "maxProperties": 30,
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "set",
      +        "type": "string"
      +      },
      +      "id": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "section": {
      +        "enum": [
      +          "fields",
      +          "prizes",
      +          "bonus_actions",
      +          "quiz_results"
      +        ],
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": true,
      +        "maxProperties": 30,
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "id",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "add",
      +        "type": "string"
      +      },
      +      "section": {
      +        "enum": [
      +          "fields",
      +          "bonus_actions"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": true,
      +        "maxProperties": 30,
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "add",
      +        "type": "string"
      +      },
      +      "section": {
      +        "enum": [
      +          "prizes",
      +          "quiz_results"
      +        ],
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": true,
      +        "maxProperties": 30,
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "add",
      +        "type": "string"
      +      },
      +      "section": {
      +        "enum": [
      +          "assets"
      +        ],
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": true,
      +        "maxProperties": 30,
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "remove",
      +        "type": "string"
      +      },
      +      "id": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "section": {
      +        "enum": [
      +          "fields",
      +          "prizes",
      +          "bonus_actions",
      +          "assets",
      +          "quiz_results"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "order",
      +        "type": "string"
      +      },
      +      "ids": {
      +        "items": {
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "maxItems": 50,
      +        "type": "array",
      +        "uniqueItems": true
      +      },
      +      "section": {
      +        "enum": [
      +          "fields",
      +          "bonus_actions",
      +          "assets",
      +          "quiz_results"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "ids"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "reset",
      +        "type": "string"
      +      },
      +      "section": {
      +        "enum": [
      +          "colors",
      +          "fonts",
      +          "layout"
      +        ],
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": true,
      +        "maxProperties": 30,
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "action",
      +      "values"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds material context beyond them: omitted values survive (merge, not replace), a theme replaces all colors (a specific destructive side effect), changes hit the public promotion immediately, and retry keys must be reused verbatim. It also mandates user confirmation for high-stakes term changes, which annotations cannot express.

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?

Dense but front-loaded: the core action comes first, then merge semantics, then the confirmation obligation, then retry rules. Every clause carries operational information; nothing is filler.

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 destructive mutation with no output schema, it covers the essentials agents need: schema pre-read, merge behavior, immediate public effect, confirmation requirement, and idempotency/retry rules. The remaining gap is expected_revision handling, which is left to the bare schema pattern.

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?

With 60% schema description coverage, the description adds real meaning: merge semantics for omitted values, the theme-replaces-colors rule, and that operations are ordered/narrow. It does not, however, explain expected_revision's optimistic-concurrency role (schema gives only a pattern), which is the parameter most likely to cause a failed call.

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?

Specific verb+resource: 'Apply narrow ordered changes to a promotion, including public promotions.' It distinguishes this tool from create_promotion/duplicate_promotion by emphasizing narrow ordered edits rather than creation or copying, and it clarifies that live public promotions are in scope.

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?

Gives a clear directive to 'Read its schema first' (i.e., get_promotion_schema) and spells out a when-to-act condition: show the user the exact change and get explicit confirmation before altering prize, Official Rules, or start/end dates on a promotion accepting entries. It stops short of naming sibling tools explicitly or excluding cases (e.g., when to prefer validate_promotion or preview_promotion).

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