Skip to main content
Glama

Edit a batch

update_batch
Destructive

Renames a batch and changes, adds, or removes its pending jobs in one request. update merges each listed job's modifications over its own (a key given again replaces it, null clears it back to the page's value) and replaces the output fields given; unlisted jobs are untouched. remove deletes those pending jobs permanently, and add creates new jobs from rows on pages, templates or a flow, as create_batch does, so repeating a request with add duplicates them. Processing, rendered and failed jobs cannot change, and an archived batch does not change. Nothing renders until run_batch, and adding or removing jobs changes what it costs. Needs templates:read and batches:create.

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": {
      "batchId": "<batchId>"
    },
    "name": "update_batch"
  }
}

Input Schema

NameRequiredDescriptionDefault
addNoNew rows, on pages, templates or a flow, as at create
nameNoNew batch name, 1 to 200 characters; omit to keep it
removeNoIDs of pending jobs to delete permanently
updateNoJobs to change
batchIdYesBatch ID returned by create_batch or list_batches

Output Schema

NameRequiredDescriptionDefault
idYes
addedYesJobs added
removedYesJobs removed
updatedYesJobs changed

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed24 schema fields changed
    • addedInput schema / properties / add / additionalProperties
      Added value: +false
    • changedInput schema / properties / add / description
      Previous value: -"New jobs to append, up to 500"New value: +"New rows, on pages, templates or a flow, as at create"
    • removedInput schema / properties / add / items
      Removed value: -{
      -  "properties": {
      -    "flowId": {
      -      "description": "A flow of that template (get_template_inputs flows): the job renders it as a video, with a video outputFormat",
      -      "format": "uuid",
      -      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
      -      "type": "string"
      -    },
      -    "outputFormat": {
      -      "description": "Output format; defaults to png. mp4, gif, webm or mov makes it a video, which needs an animated template and costs more credits.",
      -      "enum": [
      -        "png",
      -        "jpeg",
      -        "webp",
      -        "pdf",
      -        "mp4",
      -        "gif",
      -        "webm",
      -        "mov"
      -      ],
      -      "type": "string"
      -    },
      -    "row": {
      -      "additionalProperties": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      -                "type": "string"
      -              },
      -              {
      -                "additionalProperties": {},
      -                "description": "A text layer's text and visibility",
      -                "properties": {
      -                  "text": {
      -                    "description": "The layer's new text, tagged like a string value",
      -                    "type": "string"
      -                  },
      -                  "visible": {
      -                    "description": "false hides the layer; layout closes the gap",
      -                    "type": "boolean"
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              {
      -                "additionalProperties": {},
      -                "description": "An image layer's image and framing",
      -                "properties": {
      -                  "asset": {
      -                    "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      -                    "type": "string"
      -                  },
      -                  "fit": {
      -                    "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      -                    "enum": [
      -                      "cover",
      -                      "contain",
      -                      "stretch",
      -                      "fill",
      -                      "fit"
      -                    ],
      -                    "type": "string"
      -                  },
      -                  "panX": {
      -                    "description": "Moves the image by this fraction of the slot width; positive = right",
      -                    "maximum": 1,
      -                    "minimum": -1,
      -                    "type": "number"
      -                  },
      -                  "panY": {
      -                    "description": "Moves the image by this fraction of the slot height; positive = down",
      -                    "maximum": 1,
      -                    "minimum": -1,
      -                    "type": "number"
      -                  },
      -                  "visible": {
      -                    "description": "false hides the layer",
      -                    "type": "boolean"
      -                  },
      -                  "zoom": {
      -                    "description": "Zoom about the slot centre; 1 = none",
      -                    "maximum": 4,
      -                    "minimum": 0.2,
      -                    "type": "number"
      -                  }
      -                },
      -                "type": "object"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "description": "Row for the new job, shaped like a create_batch row",
      -      "propertyNames": {
      -        "type": "string"
      -      },
      -      "type": "object"
      -    },
      -    "templateId": {
      -      "description": "Template for this job; defaults to the batch's template",
      -      "format": "uuid",
      -      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "row"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / add / maxItems
      Removed value: -500
    • addedInput schema / properties / add / properties
      Added value: +{
      +  "flow": {
      +    "description": "Instead of pages: one flow (get_template_inputs flows), a video joining some of its template's pages, that every row renders as, with a video output format. A name fills that layer on every page of the video; `<pageId>@<layer>` one page, `<pageId>#2@<layer>` a page's second visit.",
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "pages": {
      +    "description": "Page ids (get_template_inputs pages, from any templates) every row renders on, in order: one id for one file per row, several for one file per row per page, such as a carousel's slides. A row's plain keys fill every page that has the layer; `<pageId>@<layer>` fills one page.",
      +    "items": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "maxItems": 20,
      +    "minItems": 1,
      +    "type": "array"
      +  },
      +  "rows": {
      +    "description": "1 to 1,000 rows, each its own modifications and output, rendered on every page named (or as the flow's video)",
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "modifications": {
      +          "additionalProperties": {
      +            "anyOf": [
      +              {
      +                "anyOf": [
      +                  {
      +                    "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      +                    "type": "string"
      +                  },
      +                  {
      +                    "additionalProperties": {},
      +                    "description": "A text layer's text and visibility",
      +                    "properties": {
      +                      "text": {
      +                        "description": "The layer's new text, tagged like a string value",
      +                        "type": "string"
      +                      },
      +                      "visible": {
      +                        "description": "false hides the layer; layout closes the gap",
      +                        "type": "boolean"
      +                      }
      +                    },
      +                    "type": "object"
      +                  },
      +                  {
      +                    "additionalProperties": {},
      +                    "description": "An image layer's image and framing",
      +                    "properties": {
      +                      "asset": {
      +                        "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      +                        "type": "string"
      +                      },
      +                      "fit": {
      +                        "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      +                        "enum": [
      +                          "cover",
      +                          "contain",
      +                          "stretch",
      +                          "fill",
      +                          "fit"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "panX": {
      +                        "description": "Moves the image by this fraction of the slot width; positive = right",
      +                        "maximum": 1,
      +                        "minimum": -1,
      +                        "type": "number"
      +                      },
      +                      "panY": {
      +                        "description": "Moves the image by this fraction of the slot height; positive = down",
      +                        "maximum": 1,
      +                        "minimum": -1,
      +                        "type": "number"
      +                      },
      +                      "visible": {
      +                        "description": "false hides the layer",
      +                        "type": "boolean"
      +                      },
      +                      "zoom": {
      +                        "description": "Zoom about the slot centre; 1 = none",
      +                        "maximum": 4,
      +                        "minimum": 0.2,
      +                        "type": "number"
      +                      }
      +                    },
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "default": {},
      +          "description": "Layer key to value: a layer's name (case aside) or id, the key get_template_inputs gives, to a plain value: text as a string, an image as an asset id or file name, or { asset, fit, zoom, panX, panY } and { text, visible } when framing or visibility changes. rowExample in get_template_inputs is ready to use. null leaves a layer at the page's own value; layers left out keep it too.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "output": {
      +          "additionalProperties": false,
      +          "description": "What to make; png when omitted",
      +          "properties": {
      +            "fileName": {
      +              "description": "The file's name, without extension",
      +              "maxLength": 200,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "format": {
      +              "default": "png",
      +              "description": "png, jpeg and webp render an image and pdf one vector page; mp4 and gif render the whole motion as a video, and webm (VP9) and mov (ProRes 4444) as a transparent video for overlaying on other footage. Video needs an animated template (get_template_inputs isAnimated) and costs more credits",
      +              "enum": [
      +                "png",
      +                "jpeg",
      +                "webp",
      +                "pdf",
      +                "mp4",
      +                "gif",
      +                "webm",
      +                "mov"
      +              ],
      +              "type": "string"
      +            },
      +            "stillTime": {
      +              "description": "Animated pages, images only: the second of the motion the image shows. Omit it to use the page's own still time (get_template_inputs stillTime), else the last frame. If the page has no still time, ask the user, because an outro or a loop can make the last frame a bad image.",
      +              "maximum": 600,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "maxItems": 1000,
      +    "minItems": 1,
      +    "type": "array"
      +  },
      +  "templates": {
      +    "description": "Instead of pages: template ids whose every page each row renders on, in page order",
      +    "items": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "maxItems": 20,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / add / required
      Added value: +[
      +  "rows"
      +]
    • changedInput schema / properties / add / type
      Previous value: -"array"New value: +"object"
    • changedInput schema / properties / remove / description
      Previous value: -"IDs of editable jobs to delete permanently"New value: +"IDs of pending jobs to delete permanently"
    • changedInput schema / properties / remove / maxItems
      Previous value: -500New value: +1000
    • changedInput schema / properties / update / description
      Previous value: -"Jobs to change, up to 500"New value: +"Jobs to change"
    • addedInput schema / properties / update / items / additionalProperties
      Added value: +false
    • addedInput schema / properties / update / items / properties / job
      Added value: +{
      +  "description": "Pending job ID from get_batch_jobs",
      +  "format": "uuid",
      +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
      +  "type": "string"
      +}
    • removedInput schema / properties / update / items / properties / jobId
      Removed value: -{
      -  "description": "Editable job ID from get_batch_jobs",
      -  "format": "uuid",
      -  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
      -  "type": "string"
      -}
    • addedInput schema / properties / update / items / properties / modifications
      Added value: +{
      +  "additionalProperties": {
      +    "anyOf": [
      +      {
      +        "anyOf": [
      +          {
      +            "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      +            "type": "string"
      +          },
      +          {
      +            "additionalProperties": {},
      +            "description": "A text layer's text and visibility",
      +            "properties": {
      +              "text": {
      +                "description": "The layer's new text, tagged like a string value",
      +                "type": "string"
      +              },
      +              "visible": {
      +                "description": "false hides the layer; layout closes the gap",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": {},
      +            "description": "An image layer's image and framing",
      +            "properties": {
      +              "asset": {
      +                "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      +                "type": "string"
      +              },
      +              "fit": {
      +                "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      +                "enum": [
      +                  "cover",
      +                  "contain",
      +                  "stretch",
      +                  "fill",
      +                  "fit"
      +                ],
      +                "type": "string"
      +              },
      +              "panX": {
      +                "description": "Moves the image by this fraction of the slot width; positive = right",
      +                "maximum": 1,
      +                "minimum": -1,
      +                "type": "number"
      +              },
      +              "panY": {
      +                "description": "Moves the image by this fraction of the slot height; positive = down",
      +                "maximum": 1,
      +                "minimum": -1,
      +                "type": "number"
      +              },
      +              "visible": {
      +                "description": "false hides the layer",
      +                "type": "boolean"
      +              },
      +              "zoom": {
      +                "description": "Zoom about the slot centre; 1 = none",
      +                "maximum": 4,
      +                "minimum": 0.2,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ]
      +  },
      +  "description": "Only the layers to change; null clears one back to the page's value",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / update / items / properties / output
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Output fields to change; omit to keep them",
      +  "properties": {
      +    "fileName": {
      +      "description": "The file's name, without extension",
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "format": {
      +      "default": "png",
      +      "description": "png, jpeg and webp render an image and pdf one vector page; mp4 and gif render the whole motion as a video, and webm (VP9) and mov (ProRes 4444) as a transparent video for overlaying on other footage. Video needs an animated template (get_template_inputs isAnimated) and costs more credits",
      +      "enum": [
      +        "png",
      +        "jpeg",
      +        "webp",
      +        "pdf",
      +        "mp4",
      +        "gif",
      +        "webm",
      +        "mov"
      +      ],
      +      "type": "string"
      +    },
      +    "stillTime": {
      +      "description": "Animated pages, images only: the second of the motion the image shows. Omit it to use the page's own still time (get_template_inputs stillTime), else the last frame. If the page has no still time, ask the user, because an outro or a loop can make the last frame a bad image.",
      +      "maximum": 600,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • removedInput schema / properties / update / items / properties / outputFormat
      Removed value: -{
      -  "description": "New output format; omit to keep the job's format. mp4, gif, webm or mov makes it a video, which needs an animated template and costs more credits.",
      -  "enum": [
      -    "png",
      -    "jpeg",
      -    "webp",
      -    "pdf",
      -    "mp4",
      -    "gif",
      -    "webm",
      -    "mov"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / update / items / properties / row
      Removed value: -{
      -  "additionalProperties": {
      -    "anyOf": [
      -      {
      -        "anyOf": [
      -          {
      -            "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      -            "type": "string"
      -          },
      -          {
      -            "additionalProperties": {},
      -            "description": "A text layer's text and visibility",
      -            "properties": {
      -              "text": {
      -                "description": "The layer's new text, tagged like a string value",
      -                "type": "string"
      -              },
      -              "visible": {
      -                "description": "false hides the layer; layout closes the gap",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": {},
      -            "description": "An image layer's image and framing",
      -            "properties": {
      -              "asset": {
      -                "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      -                "type": "string"
      -              },
      -              "fit": {
      -                "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      -                "enum": [
      -                  "cover",
      -                  "contain",
      -                  "stretch",
      -                  "fill",
      -                  "fit"
      -                ],
      -                "type": "string"
      -              },
      -              "panX": {
      -                "description": "Moves the image by this fraction of the slot width; positive = right",
      -                "maximum": 1,
      -                "minimum": -1,
      -                "type": "number"
      -              },
      -              "panY": {
      -                "description": "Moves the image by this fraction of the slot height; positive = down",
      -                "maximum": 1,
      -                "minimum": -1,
      -                "type": "number"
      -              },
      -              "visible": {
      -                "description": "false hides the layer",
      -                "type": "boolean"
      -              },
      -              "zoom": {
      -                "description": "Zoom about the slot centre; 1 = none",
      -                "maximum": 4,
      -                "minimum": 0.2,
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "description": "Only the layers to change, keyed and valued as create_batch rows are",
      -  "propertyNames": {
      -    "type": "string"
      -  },
      -  "type": "object"
      -}
    • changedInput schema / properties / update / items / required
      Previous value: -[
      -  "jobId",
      -  "row"
      -]New value: +[
      +  "job"
      +]
    • changedInput schema / properties / update / maxItems
      Previous value: -500New value: +1000
    • addedOutput schema / properties / added
      Added value: +{
      +  "description": "Jobs added",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • removedOutput schema / properties / deleted
      Removed value: -{
      -  "description": "Jobs removed",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • removedOutput schema / properties / inserted
      Removed value: -{
      -  "description": "Jobs added",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • addedOutput schema / properties / removed
      Added value: +{
      +  "description": "Jobs removed",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "id",
      -  "inserted",
      -  "updated",
      -  "deleted"
      -]New value: +[
      +  "id",
      +  "added",
      +  "updated",
      +  "removed"
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / add / items / properties / flowId
      Added value: +{
      +  "description": "A flow of that template (get_template_inputs flows): the job renders it as a video, with a video outputFormat",
      +  "format": "uuid",
      +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
      +  "type": "string"
      +}
  3. Changed19 schema fields changed
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / add / items / additionalProperties
      Removed value: -false
    • removedInput schema / properties / add / items / properties / outputFormat / $ref
      Removed value: -"#/properties/update/items/properties/outputFormat"
    • addedInput schema / properties / add / items / properties / outputFormat / enum
      Added value: +[
      +  "png",
      +  "jpeg",
      +  "webp",
      +  "pdf",
      +  "mp4",
      +  "gif",
      +  "webm",
      +  "mov"
      +]
    • addedInput schema / properties / add / items / properties / outputFormat / type
      Added value: +"string"
    • removedInput schema / properties / add / items / properties / row / additionalProperties / $ref
      Removed value: -"#/properties/update/items/properties/row/additionalProperties"
    • addedInput schema / properties / add / items / properties / row / additionalProperties / anyOf
      Added value: +[
      +  {
      +    "anyOf": [
      +      {
      +        "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      +        "type": "string"
      +      },
      +      {
      +        "additionalProperties": {},
      +        "description": "A text layer's text and visibility",
      +        "properties": {
      +          "text": {
      +            "description": "The layer's new text, tagged like a string value",
      +            "type": "string"
      +          },
      +          "visible": {
      +            "description": "false hides the layer; layout closes the gap",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": {},
      +        "description": "An image layer's image and framing",
      +        "properties": {
      +          "asset": {
      +            "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      +            "type": "string"
      +          },
      +          "fit": {
      +            "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      +            "enum": [
      +              "cover",
      +              "contain",
      +              "stretch",
      +              "fill",
      +              "fit"
      +            ],
      +            "type": "string"
      +          },
      +          "panX": {
      +            "description": "Moves the image by this fraction of the slot width; positive = right",
      +            "maximum": 1,
      +            "minimum": -1,
      +            "type": "number"
      +          },
      +          "panY": {
      +            "description": "Moves the image by this fraction of the slot height; positive = down",
      +            "maximum": 1,
      +            "minimum": -1,
      +            "type": "number"
      +          },
      +          "visible": {
      +            "description": "false hides the layer",
      +            "type": "boolean"
      +          },
      +          "zoom": {
      +            "description": "Zoom about the slot centre; 1 = none",
      +            "maximum": 4,
      +            "minimum": 0.2,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / add / items / properties / row / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / add / items / properties / templateId / pattern
      Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
    • addedInput schema / properties / batchId / pattern
      Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
    • addedInput schema / properties / remove / items / pattern
      Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
    • removedInput schema / properties / update / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / update / items / properties / jobId / pattern
      Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
    • changedInput schema / properties / update / items / properties / row / additionalProperties / anyOf
      Previous value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      -        "type": "string"
      -      },
      -      {
      -        "additionalProperties": true,
      -        "description": "A text layer's text and visibility",
      -        "properties": {
      -          "text": {
      -            "description": "The layer's new text, tagged like a string value",
      -            "type": "string"
      -          },
      -          "visible": {
      -            "description": "false hides the layer; layout closes the gap",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "additionalProperties": true,
      -        "description": "An image layer's image and framing",
      -        "properties": {
      -          "asset": {
      -            "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      -            "type": "string"
      -          },
      -          "fit": {
      -            "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      -            "enum": [
      -              "cover",
      -              "contain",
      -              "stretch",
      -              "fill",
      -              "fit"
      -            ],
      -            "type": "string"
      -          },
      -          "panX": {
      -            "description": "Moves the image by this fraction of the slot width; positive = right",
      -            "maximum": 1,
      -            "minimum": -1,
      -            "type": "number"
      -          },
      -          "panY": {
      -            "description": "Moves the image by this fraction of the slot height; positive = down",
      -            "maximum": 1,
      -            "minimum": -1,
      -            "type": "number"
      -          },
      -          "visible": {
      -            "description": "false hides the layer",
      -            "type": "boolean"
      -          },
      -          "zoom": {
      -            "description": "Zoom about the slot centre; 1 = none",
      -            "maximum": 4,
      -            "minimum": 0.2,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "anyOf": [
      +      {
      +        "description": "A text layer's text, with <s1>...</s1> tags for runs when it has several styles; or an image layer's asset id or file name",
      +        "type": "string"
      +      },
      +      {
      +        "additionalProperties": {},
      +        "description": "A text layer's text and visibility",
      +        "properties": {
      +          "text": {
      +            "description": "The layer's new text, tagged like a string value",
      +            "type": "string"
      +          },
      +          "visible": {
      +            "description": "false hides the layer; layout closes the gap",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": {},
      +        "description": "An image layer's image and framing",
      +        "properties": {
      +          "asset": {
      +            "description": "An asset id (search_assets, upload_images), the image's file name, or a designer image key. Omit to keep the template's image and only re-frame it.",
      +            "type": "string"
      +          },
      +          "fit": {
      +            "description": "cover fills the slot and crops (default), contain shows the whole image, stretch distorts to the slot. The designer's names work too: fill is cover, fit is contain",
      +            "enum": [
      +              "cover",
      +              "contain",
      +              "stretch",
      +              "fill",
      +              "fit"
      +            ],
      +            "type": "string"
      +          },
      +          "panX": {
      +            "description": "Moves the image by this fraction of the slot width; positive = right",
      +            "maximum": 1,
      +            "minimum": -1,
      +            "type": "number"
      +          },
      +          "panY": {
      +            "description": "Moves the image by this fraction of the slot height; positive = down",
      +            "maximum": 1,
      +            "minimum": -1,
      +            "type": "number"
      +          },
      +          "visible": {
      +            "description": "false hides the layer",
      +            "type": "boolean"
      +          },
      +          "zoom": {
      +            "description": "Zoom about the slot centre; 1 = none",
      +            "maximum": 4,
      +            "minimum": 0.2,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / update / items / properties / row / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / deleted / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / id / pattern
      Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
    • addedOutput schema / properties / inserted / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / updated / maximum
      Added value: +9007199254740991
  4. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructive and non-idempotent, and the description justifies both: remove deletes permanently, and repeating a request with add duplicates jobs. It further discloses that update merges over existing values, that null reverts to the page default, that unlisted jobs are untouched, that adding/removing changes cost, and the required scopes templates:read and batches:create.

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?

One dense paragraph with every sentence carrying merge semantics, immutability rules, rendering timing, cost, or scopes — no filler. It would read better front-loaded into separate sentences per operation (update/remove/add), since the merge rules currently sit inside a long clause.

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 five-parameter tool with deep nested objects and an output schema, the description covers the merge/overwrite contract, destructiveness, duplicate-on-retry behavior, what is immutable, deferred rendering, cost impact, and required scopes. Nothing an agent needs to call it safely 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?

Coverage is 100%, so the baseline would be 3, but the description adds genuine semantics the schema cannot express: update applies modifications over each job's own values, a repeated key replaces, null clears back to the page's value, and output fields are replaced rather than merged. It does not spell out remove's UUID expectations or the per-array caps beyond what the schema says.

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?

Opens with a specific verb+resource+scope: 'Renames a batch and changes, adds, or removes its pending jobs in one request.' The three mutation modes are named, and the reference 'as create_batch does' lets an agent distinguish the add path from create_batch and update_job without opening schemas.

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?

Explicitly states what cannot be edited ('Processing, rendered and failed jobs cannot change, and an archived batch does not change') and that nothing renders until run_batch. It stops short of naming the alternative tools for single-job edits (update_job) or giving an explicit 'do not use when' routing statement, so it is strong context rather than full alternative mapping.

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