Skip to main content
Glama
hermoso-ai

Hermoso

Official

Add subtitles to a video

add_subtitles

Burn subtitles into any video or URL and optionally export the .srt, with sentence, word, or custom cue timing.

Instructions

Burn subtitles into ANY video and get the .srt too; nothing is cut or re-rendered. Set textStyle only when the user describes a look (default: white sentence case, thin outline, bottom). Timed per sentence, or auto:'words' for phrases on their spoken words. Or pass cues to burn your own lines exactly, untranscribed (reel-style phrases, stage directions). burn:false returns only the .srt. Takes a video file or URL, a YouTube/Vimeo-style page, or a TikTok / Reel / X post link. No speech is refused and refunded. Runs in the background and lands in the Library.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
autoNo
burnNofalse = only the .srt
cuesNoyour own lines in seconds, no overlap, max 90 chars, no emoji
videoYesthe video to subtitle
textStyleNothe look: words, a preset or fields; omit for the default
wordsPerCueNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv0.1.285
    • addedInput schema / properties / auto
      Added value: +{
      +  "enum": [
      +    "sentences",
      +    "words"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / cues
      Added value: +{
      +  "description": "your own lines in seconds, no overlap, max 90 chars, no emoji",
      +  "items": {
      +    "properties": {
      +      "end": {
      +        "type": "number"
      +      },
      +      "start": {
      +        "type": "number"
      +      },
      +      "text": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "text",
      +      "start",
      +      "end"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 400,
      +  "type": "array"
      +}
    • changedInput schema / properties / textStyle / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "pill",
      -      "editorial",
      -      "bold",
      -      "minimal",
      -      "handwritten",
      -      "boxed"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "properties": {
      -      "background": {
      -        "description": "none | pill | #hex box",
      -        "type": "string"
      -      },
      -      "color": {
      -        "description": "#hex",
      -        "type": "string"
      -      },
      -      "font": {
      -        "enum": [
      -          "sans",
      -          "serif",
      -          "elegant",
      -          "condensed",
      -          "hand"
      -        ],
      -        "type": "string"
      -      },
      -      "italic": {
      -        "type": "boolean"
      -      },
      -      "outline": {
      -        "type": "boolean"
      -      },
      -      "position": {
      -        "enum": [
      -          "top",
      -          "center",
      -          "lower",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "preset": {
      -        "enum": [
      -          "pill",
      -          "editorial",
      -          "bold",
      -          "minimal",
      -          "handwritten",
      -          "boxed"
      -        ],
      -        "type": "string"
      -      },
      -      "shadow": {
      -        "type": "boolean"
      -      },
      -      "size": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "s",
      -              "m",
      -              "l",
      -              "xl"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "number"
      -          }
      -        ]
      -      },
      -      "textCase": {
      -        "enum": [
      -          "as-is",
      -          "upper",
      -          "lower",
      -          "title"
      -        ],
      -        "type": "string"
      -      },
      -      "tilt": {
      -        "description": "degrees, ±12",
      -        "type": "number"
      -      },
      -      "weight": {
      -        "type": "number"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "properties": {
      +      "background": {
      +        "description": "none|pill|a colour",
      +        "type": "string"
      +      },
      +      "cardColor": {
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "any CSS colour",
      +        "type": "string"
      +      },
      +      "describe": {
      +        "description": "the look in words",
      +        "type": "string"
      +      },
      +      "font": {
      +        "description": "sans|serif|elegant|condensed|hand or any Google Fonts family",
      +        "type": "string"
      +      },
      +      "italic": {
      +        "type": "boolean"
      +      },
      +      "outline": {
      +        "type": "boolean"
      +      },
      +      "outlineColor": {
      +        "type": "string"
      +      },
      +      "position": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "description": "top|center|lower|bottom or 0.05-0.95 from the top"
      +      },
      +      "preset": {
      +        "type": "string"
      +      },
      +      "shadow": {
      +        "type": "boolean"
      +      },
      +      "size": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "description": "s|m|l|xl, '120px', or a 0.015-0.15 frame fraction"
      +      },
      +      "subFont": {
      +        "type": "string"
      +      },
      +      "subItalic": {
      +        "type": "boolean"
      +      },
      +      "textCase": {
      +        "enum": [
      +          "as-is",
      +          "upper",
      +          "lower",
      +          "title"
      +        ],
      +        "type": "string"
      +      },
      +      "tilt": {
      +        "description": "degrees, ±45",
      +        "type": "number"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / textStyle / description
      Previous value: -"the look: a preset or overrides; omit for the default"New value: +"the look: words, a preset or fields; omit for the default"
    • addedInput schema / properties / wordsPerCue
      Added value: +{
      +  "type": "number"
      +}
  2. Addedv0.1.227

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the write profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the bar is lower. The description still adds real behavioral context the annotations lack: source-is-not-re-rendered, background execution landing in the Library, and the notable 'no speech is refused and refunded' failure/refund behavior.

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?

Front-loaded with the core action and outcome, then branches into style/cue/burn options. Dense and slightly list-like across several long sentences, but every sentence carries information an agent needs; little is wasted.

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?

No output schema exists, yet the description explains the return surface (.srt output, burn:false mode, Library landing) and accepted input types (file/URL, YouTube/Vimeo page, TikTok/Reel/X link). Sufficient for correct invocation, though the exact job/response shape at completion is only gestured at.

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

Parameters4/5

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

With 67% schema coverage the schema documents several params, but the description adds semantics beyond it: the textStyle default (white sentence case, thin outline, bottom), the distinction between timed-per-sentence and auto:'words', and that cues burn lines 'exactly, untranscribed' with reel/stage-direction syntax. Only wordsPerCue is left undocumented.

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+resource ('Burn subtitles into ANY video and get the .srt too') and immediately scopes it against likely siblings by clarifying 'nothing is cut or re-rendered', separating it from edit_video/reframe_video/stitch_video. An agent can identify the tool's job without opening the 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?

Gives concrete when-to-use rules: set textStyle only when the user describes a look, use auto:'words' for word-timed phrases, pass cues for your own lines, burn:false for .srt only. It does not name alternative sibling tools (e.g., edit_video or dub_video), so the routing guidance is clear but not fully disambiguated.

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

Deploy Server

Other Tools