Skip to main content
Glama

Add title

title.add
Idempotent

Text on a video track, over the tracks below: styled with font, size, colour, outline, shadow and box, placed by x/y, revealed with a typewriter or word animation. A style field you leave out takes the published default (video://catalog/text: bold white Inter at 9% of the frame height, centred, with a soft shadow); timeline.get shows the full style. spans style part of the text (words first_word to last_word, from 0: one word in yellow or bold). It is a clip, so transforms, masks, animations and transitions apply. Returns the edit result (see the server instructions).

Input Schema

NameRequiredDescriptionDefault
textYesLine breaks with \n
spansNoStyle part of the text: each span restyles words first_word to last_word (from 0: the timed words, or the text split at spaces), e.g. one word in yellow
styleNo
previewNoinline: image in the result; link: URI that renders on read; nonelink
at_frameNoDefault: after the last clip on the track
track_idYesA video track; text composites over the tracks below
timeline_idYesTimeline handle; every edit returns a new one
duration_framesNoDefault 3 s

Output Schema

NameRequiredDescriptionDefault
parentYesTimeline handle; every edit returns a new one
changedYes
clip_idNo
previewYes
clip_idsNo
track_idNo
warningsYes
timeline_idYesTimeline handle; every edit returns a new one

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / $defs / TextSpan
      Added value: +{
      +  "properties": {
      +    "bold": {
      +      "type": "boolean"
      +    },
      +    "color": {
      +      "type": "string"
      +    },
      +    "first_word": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "italic": {
      +      "type": "boolean"
      +    },
      +    "last_word": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "size": {
      +      "description": "Of frame height",
      +      "maximum": 1,
      +      "minimum": 0.005,
      +      "type": "number"
      +    },
      +    "underline": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "first_word",
      +    "last_word"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / $defs / TextStyle / properties / highlight / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "color": {
      -        "type": "string"
      -      },
      -      "mode": {
      -        "enum": [
      -          "none",
      -          "fill",
      -          "word",
      -          "karaoke",
      -          "pop"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "color"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "color": {
      +        "type": "string"
      +      },
      +      "mode": {
      +        "description": "Needs caption word timings. karaoke: each word takes color as it is spoken and keeps it; fill: likewise, sweeping across each word; word: only the word being spoken; pop: that word, growing a little",
      +        "enum": [
      +          "none",
      +          "fill",
      +          "word",
      +          "karaoke",
      +          "pop"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "color"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / $defs / TextStyle / properties / max_lines
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 20,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "At most this many lines at once: longer text shows in turn, a screenful at a time, each from its first word (by word timing, or by length without it). Lines are broken here, by the font, balanced in length; null shows it all at once"
      +}
    • addedInput schema / $defs / TextStyle / properties / max_width / description
      Added value: +"Of frame width: longer text wraps onto more lines, balanced in length"
    • addedInput schema / properties / spans
      Added value: +{
      +  "description": "Style part of the text: each span restyles words first_word to last_word (from 0: the timed words, or the text split at spaces), e.g. one word in yellow",
      +  "items": {
      +    "$ref": "#/$defs/TextSpan"
      +  },
      +  "maxItems": 500,
      +  "type": "array"
      +}
  2. First observed

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, idempotent mutation. The description adds useful behavioral context beyond the annotations: omitted style fields use published defaults, timeline.get reveals the full style, spans can restyle word ranges, and the tool returns an edit result. No annotation contradiction is present.

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?

The description is front-loaded with the purpose and core behavior, and most clauses carry useful information for a complex 8-parameter tool. It is dense and somewhat run-on, but not bloated with repetition.

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 complex nested-style clip creation tool with an output schema and detailed annotations, the description covers the important operational context: defaults, span styling, clip semantics, and the edit result. The main remaining gap is explicit sibling routing.

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 high at 88%, so the baseline is 3. The description adds meaning beyond the schema by explaining default style behavior, span word indexing/ranges, text positioning, reveal animations, and that style fields default when omitted.

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

Purpose4/5

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

The description clearly states a specific verb and resource: adding text/title as a clip on a video track. It explains compositing over lower tracks and that transforms, masks, animations, and transitions apply. However, it does not explicitly distinguish itself from relevant siblings such as text.set or caption.add.

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

Usage Guidelines3/5

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

Usage is implied by phrases like 'Text on a video track' and the explanation of default placement, but there is no explicit guidance on when to use this tool versus text.set, caption.add, or clip.add. The description provides context but leaves alternative selection to inference.

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.