Skip to main content
Glama

Update clip

update_clip

Edit a video clip's title, caption, hashtags, bounds, hook, framing or style. Text edits apply at once; burned-in changes re-render in the background.

Instructions

Edit one clip: only the fields you pass change; style and layoutSections replace the clip's whole value (null = back to the project's). Text-only edits (title, caption, hashtags) apply at once; bounds, hook, framing, style and emphasis are burned into the video and re-render in the background (~1 min) unless rerender is false. Returns the clip summary with its new status; poll get_clip until done.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesClip id (from get_project or search_clips)
hookNoOn-screen opening line (max 80 chars)
styleNoCaption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project
titleNoClip title (1-120 chars)
endSecNoNew end, seconds from the start of the source; clip must stay ≥3 s
captionNoPost caption, not burned in (max 300 chars)
emphasisNoWords the captions colour (max 30); replaces the list
hashtagsNoHashtags without # (max 20); replaces the list
rerenderNoRe-render when a burned-in field changed (default true); false = keep the old video until rerender_clip
startSecNoNew start, seconds from the start of the source video
layoutOverrideNoFraming for the whole clip; null = automatic
layoutSectionsNoFraming per time range (max 50), source seconds; replaces all sections; null or [] = automatic

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema fields changedv0.7.0
    • addedInput schema / properties / caption / description
      Added value: +"Post caption, not burned in (max 300 chars)"
    • changedInput schema / properties / emphasis / description
      Previous value: -"Words the captions emphasise"New value: +"Words the captions colour (max 30); replaces the list"
    • addedInput schema / properties / endSec / description
      Added value: +"New end, seconds from the start of the source; clip must stay ≥3 s"
    • addedInput schema / properties / hashtags / description
      Added value: +"Hashtags without # (max 20); replaces the list"
    • addedInput schema / properties / hook / description
      Added value: +"On-screen opening line (max 80 chars)"
    • addedInput schema / properties / id / description
      Added value: +"Clip id (from get_project or search_clips)"
    • changedInput schema / properties / layoutOverride / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auto",
      -      "face",
      -      "split",
      -      "stack",
      -      "fit",
      -      "center",
      -      "none"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Framing: auto (detect per section), face (follow the speaker), split (two speakers stacked), stack (full frame over a face crop), fit (whole frame on blur), center (static crop), none (original aspect)",
      +    "enum": [
      +      "auto",
      +      "face",
      +      "split",
      +      "stack",
      +      "fit",
      +      "center",
      +      "none"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / layoutSections / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "properties": {
      -        "end": {
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "mode": {
      -          "enum": [
      -            "auto",
      -            "face",
      -            "split",
      -            "stack",
      -            "fit",
      -            "center"
      -          ],
      -          "type": "string"
      -        },
      -        "offsetX": {
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "start": {
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "start",
      -        "end",
      -        "mode"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 50,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "properties": {
      +        "end": {
      +          "description": "Section end, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "mode": {
      +          "description": "Framing for this section (same modes as the project's reframe, without none)",
      +          "enum": [
      +            "auto",
      +            "face",
      +            "split",
      +            "stack",
      +            "fit",
      +            "center"
      +          ],
      +          "type": "string"
      +        },
      +        "offsetX": {
      +          "description": "Shift the crop sideways by this fraction of the source width (-0.5 to 0.5)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "start": {
      +          "description": "Section start, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "start",
      +        "end",
      +        "mode"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 50,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / layoutSections / description
      Added value: +"Framing per time range (max 50), source seconds; replaces all sections; null or [] = automatic"
    • addedInput schema / properties / rerender / description
      Added value: +"Re-render when a burned-in field changed (default true); false = keep the old video until rerender_clip"
    • addedInput schema / properties / startSec / description
      Added value: +"New start, seconds from the start of the source video"
    • changedInput schema / properties / style / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "captionSize": {
      -        "default": 1,
      -        "maximum": 2,
      -        "minimum": 0.5,
      -        "type": "number"
      -      },
      -      "captionX": {
      -        "default": 0.5,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captionY": {
      -        "default": 0.72,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captions": {
      -        "default": "karaoke",
      -        "enum": [
      -          "karaoke",
      -          "box",
      -          "plain",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "emphasis": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "emphasisColor": {
      -        "default": "#39FF14",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "highlightColor": {
      -        "default": "#FFD700",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "hookSeconds": {
      -        "default": 3.5,
      -        "maximum": 15,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookX": {
      -        "default": 0.5,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookY": {
      -        "default": 0.16,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "showHook": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "uppercase": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "wordsPerLine": {
      -        "default": 4,
      -        "maximum": 8,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "captionSize": {
      +        "description": "Caption size multiplier (0.5-2, default 1)",
      +        "maximum": 2,
      +        "minimum": 0.5,
      +        "type": "number"
      +      },
      +      "captionX": {
      +        "description": "Caption centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captionY": {
      +        "description": "Caption centre, vertical (default 0.72), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captions": {
      +        "description": "Caption look: karaoke (active word highlighted), box, plain, or none (no captions)",
      +        "enum": [
      +          "karaoke",
      +          "box",
      +          "plain",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "emphasis": {
      +        "description": "Colour the clip's key words (default true)",
      +        "type": "boolean"
      +      },
      +      "emphasisColor": {
      +        "description": "Colour of emphasised words, #RRGGBB (default #39FF14)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "highlightColor": {
      +        "description": "Karaoke active-word colour, #RRGGBB (default #FFD700)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "hookSeconds": {
      +        "description": "How long the hook shows, seconds (0-15, default 3.5)",
      +        "maximum": 15,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookX": {
      +        "description": "Hook centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookY": {
      +        "description": "Hook centre, vertical (default 0.16), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "showHook": {
      +        "description": "Show the hook text at the start of the clip (default true)",
      +        "type": "boolean"
      +      },
      +      "uppercase": {
      +        "description": "Captions in capitals",
      +        "type": "boolean"
      +      },
      +      "wordsPerLine": {
      +        "description": "Max caption words on screen at once (1-8, default 4)",
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / style / description
      Added value: +"Caption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project"
    • addedInput schema / properties / title / description
      Added value: +"Clip title (1-120 chars)"
  2. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so well: it discloses partial-update semantics, that style/layoutSections REPLACE the whole value (with null reverting to project defaults), the split between instant text edits and background-burned edits, the ~1 min async re-render, the rerender:false escape hatch, and that the response is the clip summary with a new status.

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 dense sentences, front-loaded with the most consequential fact (only passed fields change) before the render/timing details and the follow-up call. No filler; every clause conveys a distinct behavioral fact.

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

Completeness4/5

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

For a 12-parameter mutation tool with no annotations and no output schema, the description covers update semantics, async rendering, return shape and the polling loop. It omits error/conflict handling and any permission requirements, which are the remaining gaps for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond it by grouping parameters into instant text fields (title, caption, hashtags) versus burned-in fields (bounds, hook, framing, style, emphasis) and by clarifying the replace-vs-merge contract per group.

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

Purpose5/5

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

States a specific verb and resource ('Edit one clip') and immediately scopes it with the merge semantics ('only the fields you pass change'), which distinguishes it from update_project, set_clip_bumpers and rerender_clip. An agent knows this is the partial-metadata-and-render edit path without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It routes the agent to companion tools: poll get_clip until the re-render finishes, and it implies rerender_clip is the alternative when rerender is false. It doesn't state an explicit 'use this when X, use Y instead' exclusion, but the context for each edit class is clear.

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