Skip to main content
Glama

Update layer template

update_layer_template
Idempotent

Rename a layer template, replace its timed layers, or set intro/outro bumpers while leaving omitted fields untouched; existing clips update only when reapplied.

Instructions

Rename a layer template, replace its layers (the whole list, each with a timing) and/or replace its intro / outro (bumpers; null = it sets neither); a field left out is untouched. Clips that already got the template keep what they have; apply_layer_template again to refresh them. Returns the template.

Input Schema

NameRequiredDescriptionDefault
nameNoTemplate name (1-120 chars)
layersNoThe template's layers, each with a timing (max 30)
bumpersNo
templateIdYesLayer template id (list_layer_templates)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.33.0
    • changedInput schema / properties / layers / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "assetId": {
      -        "description": "Library asset id (search_assets with source library): an image, an animation or a video",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Stable id for this overlay (any short string; keep it when editing)",
      -        "maxLength": 40,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "asset",
      -        "type": "string"
      -      },
      -      "loop": {
      -        "description": "Repeat a video / animation while its window is open (default: on for GIF and animated WebP, off for videos)",
      -        "type": "boolean"
      -      },
      -      "opacity": {
      -        "description": "0.1-1, default 1",
      -        "maximum": 1,
      -        "minimum": 0.1,
      -        "type": "number"
      -      },
      -      "timing": {
      -        "description": "Where the layer sits on a clip of any length",
      -        "oneOf": [
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Seconds after the clip starts (above start)",
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "head",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Seconds after the clip starts",
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Seconds before the clip ends (0 = the very end)",
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "tail",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Seconds before the clip ends (above end)",
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "mode": {
      -                "const": "fill",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "mode"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Fraction of the clip length (0-1, above start)",
      -                "maximum": 1,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "maxSec": {
      -                "description": "Never longer than this many seconds",
      -                "maximum": 600,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "minSec": {
      -                "description": "Never shorter than this many seconds",
      -                "maximum": 600,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "relative",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Fraction of the clip length (0-1)",
      -                "maximum": 1,
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "w": {
      -        "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      -        "maximum": 1,
      -        "minimum": 0.05,
      -        "type": "number"
      -      },
      -      "x": {
      -        "description": "Centre, fraction of the output width (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "y": {
      -        "description": "Centre, fraction of the output height (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "assetId",
      -      "x",
      -      "y",
      -      "kind",
      -      "timing"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "box": {
      -        "description": "text: dark plate behind the text (default: outlined text, no plate)",
      -        "type": "boolean"
      -      },
      -      "color": {
      -        "description": "text: colour as #RRGGBB, default white",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "font": {
      -        "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      -        "maxLength": 60,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Stable id for this overlay (any short string; keep it when editing)",
      -        "maxLength": 40,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "text",
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "0.1-1, default 1",
      -        "maximum": 1,
      -        "minimum": 0.1,
      -        "type": "number"
      -      },
      -      "size": {
      -        "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      -        "maximum": 0.12,
      -        "minimum": 0.02,
      -        "type": "number"
      -      },
      -      "text": {
      -        "description": "The line to show (1-120 chars)",
      -        "maxLength": 120,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "timing": {
      -        "description": "Where the layer sits on a clip of any length",
      -        "oneOf": [
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Seconds after the clip starts (above start)",
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "head",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Seconds after the clip starts",
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Seconds before the clip ends (0 = the very end)",
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "tail",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Seconds before the clip ends (above end)",
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "mode": {
      -                "const": "fill",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "mode"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Fraction of the clip length (0-1, above start)",
      -                "maximum": 1,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "maxSec": {
      -                "description": "Never longer than this many seconds",
      -                "maximum": 600,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "minSec": {
      -                "description": "Never shorter than this many seconds",
      -                "maximum": 600,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "relative",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Fraction of the clip length (0-1)",
      -                "maximum": 1,
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "x": {
      -        "description": "Centre, fraction of the output width (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "y": {
      -        "description": "Centre, fraction of the output height (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "text",
      -      "x",
      -      "y",
      -      "kind",
      -      "timing"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "assetId": {
      -        "description": "Library audio asset id (search_assets with source library, kind audio); the same asset can be used more than once",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "duck": {
      -        "description": "Lower the music while someone speaks (default true)",
      -        "type": "boolean"
      -      },
      -      "fade": {
      -        "description": "Fade in and out, seconds (default 0.5)",
      -        "maximum": 5,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "id": {
      -        "description": "Stable id for this track (any short string; keep it when editing)",
      -        "maxLength": 40,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "audio",
      -        "type": "string"
      -      },
      -      "loop": {
      -        "description": "Repeat the track when it is shorter than the window (default true)",
      -        "type": "boolean"
      -      },
      -      "offset": {
      -        "description": "Seconds into the track to start from (default 0)",
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "timing": {
      -        "description": "Where the layer sits on a clip of any length",
      -        "oneOf": [
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Seconds after the clip starts (above start)",
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "head",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Seconds after the clip starts",
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Seconds before the clip ends (0 = the very end)",
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "tail",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Seconds before the clip ends (above end)",
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "mode": {
      -                "const": "fill",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "mode"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "properties": {
      -              "end": {
      -                "description": "Fraction of the clip length (0-1, above start)",
      -                "maximum": 1,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "maxSec": {
      -                "description": "Never longer than this many seconds",
      -                "maximum": 600,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "minSec": {
      -                "description": "Never shorter than this many seconds",
      -                "maximum": 600,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "mode": {
      -                "const": "relative",
      -                "type": "string"
      -              },
      -              "start": {
      -                "description": "Fraction of the clip length (0-1)",
      -                "maximum": 1,
      -                "minimum": 0,
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "start",
      -              "end"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "volume": {
      -        "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "assetId",
      -      "kind",
      -      "timing"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "assetId": {
      +        "description": "Library asset id (search_assets with source library): an image, an animation or a video",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "fade": {
      +        "description": "Fade in when it appears and out when it goes, seconds (0-2, default 0 = appears and goes at once)",
      +        "maximum": 2,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "id": {
      +        "description": "Stable id for this overlay (any short string; keep it when editing)",
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "asset",
      +        "type": "string"
      +      },
      +      "loop": {
      +        "description": "Repeat a video / animation while its window is open (default: on for GIF and animated WebP, off for videos)",
      +        "type": "boolean"
      +      },
      +      "opacity": {
      +        "description": "0.1-1, default 1",
      +        "maximum": 1,
      +        "minimum": 0.1,
      +        "type": "number"
      +      },
      +      "timing": {
      +        "description": "Where the layer sits on a clip of any length",
      +        "oneOf": [
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Seconds after the clip starts (above start)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "head",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Seconds after the clip starts",
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Seconds before the clip ends (0 = the very end)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "tail",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Seconds before the clip ends (above end)",
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "mode": {
      +                "const": "fill",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "mode"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Fraction of the clip length (0-1, above start)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "maxSec": {
      +                "description": "Never longer than this many seconds",
      +                "maximum": 600,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "minSec": {
      +                "description": "Never shorter than this many seconds",
      +                "maximum": 600,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "relative",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Fraction of the clip length (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "w": {
      +        "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      +        "maximum": 1,
      +        "minimum": 0.05,
      +        "type": "number"
      +      },
      +      "x": {
      +        "description": "Centre, fraction of the output width (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "y": {
      +        "description": "Centre, fraction of the output height (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "assetId",
      +      "x",
      +      "y",
      +      "kind",
      +      "timing"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "box": {
      +        "description": "text: dark plate behind the text (default: outlined text, no plate)",
      +        "type": "boolean"
      +      },
      +      "color": {
      +        "description": "text: colour as #RRGGBB, default white",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "fade": {
      +        "description": "Fade in when it appears and out when it goes, seconds (0-2, default 0 = appears and goes at once)",
      +        "maximum": 2,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "font": {
      +        "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Stable id for this overlay (any short string; keep it when editing)",
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "text",
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "0.1-1, default 1",
      +        "maximum": 1,
      +        "minimum": 0.1,
      +        "type": "number"
      +      },
      +      "size": {
      +        "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      +        "maximum": 0.12,
      +        "minimum": 0.02,
      +        "type": "number"
      +      },
      +      "text": {
      +        "description": "The line to show (1-120 chars)",
      +        "maxLength": 120,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "timing": {
      +        "description": "Where the layer sits on a clip of any length",
      +        "oneOf": [
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Seconds after the clip starts (above start)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "head",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Seconds after the clip starts",
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Seconds before the clip ends (0 = the very end)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "tail",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Seconds before the clip ends (above end)",
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "mode": {
      +                "const": "fill",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "mode"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Fraction of the clip length (0-1, above start)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "maxSec": {
      +                "description": "Never longer than this many seconds",
      +                "maximum": 600,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "minSec": {
      +                "description": "Never shorter than this many seconds",
      +                "maximum": 600,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "relative",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Fraction of the clip length (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "x": {
      +        "description": "Centre, fraction of the output width (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "y": {
      +        "description": "Centre, fraction of the output height (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "text",
      +      "x",
      +      "y",
      +      "kind",
      +      "timing"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "assetId": {
      +        "description": "Library audio asset id (search_assets with source library, kind audio); the same asset can be used more than once",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "duck": {
      +        "description": "Lower the music while someone speaks (default true)",
      +        "type": "boolean"
      +      },
      +      "fade": {
      +        "description": "Fade in and out, seconds (default 0.5)",
      +        "maximum": 5,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "id": {
      +        "description": "Stable id for this track (any short string; keep it when editing)",
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "audio",
      +        "type": "string"
      +      },
      +      "loop": {
      +        "description": "Repeat the track when it is shorter than the window (default true)",
      +        "type": "boolean"
      +      },
      +      "offset": {
      +        "description": "Seconds into the track to start from (default 0)",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "timing": {
      +        "description": "Where the layer sits on a clip of any length",
      +        "oneOf": [
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Seconds after the clip starts (above start)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "head",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Seconds after the clip starts",
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Seconds before the clip ends (0 = the very end)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "tail",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Seconds before the clip ends (above end)",
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "mode": {
      +                "const": "fill",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "mode"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "end": {
      +                "description": "Fraction of the clip length (0-1, above start)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "maxSec": {
      +                "description": "Never longer than this many seconds",
      +                "maximum": 600,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "minSec": {
      +                "description": "Never shorter than this many seconds",
      +                "maximum": 600,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "mode": {
      +                "const": "relative",
      +                "type": "string"
      +              },
      +              "start": {
      +                "description": "Fraction of the clip length (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "start",
      +              "end"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "volume": {
      +        "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "assetId",
      +      "kind",
      +      "timing"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changedv0.28.1
    • addedInput schema / properties / bumpers
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Intro / outro the template puts on clips, as each clip's own choice",
      +      "properties": {
      +        "intro": {
      +          "anyOf": [
      +            {
      +              "maxLength": 100,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Library video or image id (list_bumpers) for the intro; null = no intro; left out = clips keep their own"
      +        },
      +        "introSec": {
      +          "description": "Seconds an image intro/outro shows (1-10); videos keep their own length",
      +          "maximum": 10,
      +          "minimum": 1,
      +          "type": "number"
      +        },
      +        "outro": {
      +          "anyOf": [
      +            {
      +              "maxLength": 100,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Library video or image id (list_bumpers) for the outro; null = no outro; left out = clips keep their own"
      +        },
      +        "outroSec": {
      +          "description": "Seconds an image intro/outro shows (1-10); videos keep their own length",
      +          "maximum": 10,
      +          "minimum": 1,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  3. Addedv0.23.0

TDQS

A4.6/5.0
Behavior5/5

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

With only idempotentHint=true supplied, the description carries the real weight: it discloses the destructive-but-scoped semantics of `layers` (the whole list is replaced, not merged), the null-vs-omitted distinction for bumpers, and the non-obvious side effect that existing clips keep their current settings until re-applied. That is behavior an agent could not infer from the annotations or schema alone.

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 sentences, front-loaded with the verb and the three editable surfaces, then the omission semantics, then the downstream effect on clips. No filler, and the closing 'Returns the template' is load-bearing given there is no output schema.

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 tool with a deeply nested layer schema and no output schema, the description covers the update contract, the omission/null rules, the return value, and the effect on existing clips. It does not mention validation failures (e.g. invalid assetId or duplicate layer ids) or whether replaced layers must be re-specified in full, which would round it out.

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 75% and the schema is already verbose about individual fields, so the baseline is 3; the description earns an extra point by stating the merge/replace semantics per parameter (whole-list replacement for layers, null = sets neither for bumpers, omission = untouched) which the schema does not state at the top level.

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?

Names a specific verb+resource and spells out the three distinct mutations it performs: rename, replace the layers list, replace intro/outro bumpers. An agent can tell immediately this is a partial-update tool for an existing template rather than a create/save one like save_layer_template.

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 clear operational context (partial update; omitted fields untouched) and points to apply_layer_template for refreshing already-templated clips, which is the key follow-up decision. It stops short of stating when to prefer save_layer_template (create) over this (edit), so it is not fully explicit about alternatives.

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