Skip to main content
Glama

Translate subtitles and make a dub script

translate_subtitles
Read-only

Translates subtitles or a saved transcript into another language and writes a dub script. Best for: "translate these subtitles to Spanish", "make a French dub script for my talk". Returns: translated SRT and VTT with the original times, and a dub script with one spoken line per segment, its start and end, max_chars and a fit of ok, tight or long (trim with include). Nothing is stored. Input tips: always pass target_lang. Give exactly one of transcript_id (with library_id when transcribe_media returned one) or subtitles, the text of an SRT or VTT file. With subtitles also pass source_lang and confirm_rights true, only after the user says they own the media or may use it. Limits: about 18,000 characters per call (about 20 minutes of speech) and a daily allowance of characters. Not for: transcribing audio; use transcribe_media first. Translation is machine output to check before publishing.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
includeNoWhat to return (default all three): translated SRT captions, translated VTT captions, a dub script with one spoken line per segment.
subtitlesNoThe full text of an SRT or WebVTT file the user owns or may use, with timing lines such as 00:00:01,000 --> 00:00:03,000. Give exactly one of transcript_id or subtitles. With subtitles, source_lang and confirm_rights true are required.
library_idNoThe library_id an earlier transcribe_media answer returned, such as lib_9b6a98861ea4f54bff8f5cf1. It names the set of transcripts that call saved. Pass it when that answer had one; leave it out when it was null or absent.
source_langNoLanguage of the text, as a two-letter code such as en. Required with subtitles; for a transcript the detected language is used when left out.
target_langYesLanguage to translate into, as a two-letter code such as es, fr, de, ja, ar or hi.
transcript_idNoThe transcript_id from transcribe_media, such as tr_a6f8c87a9b2eb748. Give exactly one of transcript_id or subtitles.
confirm_rightsNotrue, and only after the user has said they own this recording or have the rights to translate it. Required with subtitles; false is refused with rights_not_confirmed.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
srtNoTranslated SRT captions with the original times (when include has srt).
vttNoTranslated WebVTT captions with the original times (when include has vtt).
as_ofYesThe UTC day of the answer, such as 2026-10-10.
modelYesThe translation model, such as @cf/meta/m2m100-1.2b.
notesYes
usageYes
sourceYes
statusYesok: the text was translated. A refused call returns no object, only an error text such as "transcript_not_found: ..." that says what to do next.
targetYes
cue_countYesCaption cues translated.
dub_modelNoPresent when some dub lines were shortened by this model.
dub_scriptNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed30 schema fields changed
    • addedInput schema / dependentRequired
      Added value: +{
      +  "subtitles": [
      +    "source_lang",
      +    "confirm_rights"
      +  ]
      +}
    • changedInput schema / properties / confirm_rights / description
      Previous value: -"Set true only after the user has said they own this recording or have the rights to translate it. Required with subtitles."New value: +"true, and only after the user has said they own this recording or have the rights to translate it. Required with subtitles; false is refused with rights_not_confirmed."
    • changedInput schema / properties / library_id / description
      Previous value: -"The library_id that transcribe_media returned. Only needed when transcribe_media returned one; leave it out otherwise."New value: +"The library_id an earlier transcribe_media answer returned, such as lib_9b6a98861ea4f54bff8f5cf1. It names the set of transcripts that call saved. Pass it when that answer had one; leave it out when it was null or absent."
    • changedInput schema / properties / source_lang / description
      Previous value: -"Language of the text. Needed for subtitles; for a transcript the language it was detected in is used."New value: +"Language of the text, as a two-letter code such as en. Required with subtitles; for a transcript the detected language is used when left out."
    • changedInput schema / properties / subtitles / description
      Previous value: -"The text of an SRT or WebVTT file the user owns or may use. Give this or transcript_id."New value: +"The full text of an SRT or WebVTT file the user owns or may use, with timing lines such as 00:00:01,000 --> 00:00:03,000. Give exactly one of transcript_id or subtitles. With subtitles, source_lang and confirm_rights true are required."
    • changedInput schema / properties / transcript_id / description
      Previous value: -"The transcript_id from transcribe_media. Give this or subtitles."New value: +"The transcript_id from transcribe_media, such as tr_a6f8c87a9b2eb748. Give exactly one of transcript_id or subtitles."
    • addedOutput schema / properties / as_of / description
      Added value: +"The UTC day of the answer, such as 2026-10-10."
    • addedOutput schema / properties / as_of / format
      Added value: +"date"
    • addedOutput schema / properties / cue_count / description
      Added value: +"Caption cues translated."
    • addedOutput schema / properties / cue_count / minimum
      Added value: +0
    • addedOutput schema / properties / dub_script / items / properties / end / description
      Added value: +"End, in seconds from the beginning of the recording."
    • addedOutput schema / properties / dub_script / items / properties / end / minimum
      Added value: +0
    • addedOutput schema / properties / dub_script / items / properties / fit / description
      Added value: +"ok fits the time, tight is up to 15% over max_chars, long is further over and needs a shorter line."
    • addedOutput schema / properties / dub_script / items / properties / start / description
      Added value: +"Start, in seconds from the beginning of the recording."
    • addedOutput schema / properties / dub_script / items / properties / start / minimum
      Added value: +0
    • addedOutput schema / properties / dub_script / items / properties / text / description
      Added value: +"The spoken line in the target language."
    • addedOutput schema / properties / model / description
      Added value: +"The translation model, such as @cf/meta/m2m100-1.2b."
    • addedOutput schema / properties / source / properties / kind / description
      Added value: +"What was translated."
    • addedOutput schema / properties / source / properties / language / description
      Added value: +"Source language code, such as en."
    • addedOutput schema / properties / source / properties / transcript_id / description
      Added value: +"Id of a saved transcript, for suggest_clips and translate_subtitles."
    • addedOutput schema / properties / source / properties / transcript_id / pattern
      Added value: +"^tr_[0-9a-f]{16}$"
    • addedOutput schema / properties / srt / description
      Added value: +"Translated SRT captions with the original times (when include has srt)."
    • addedOutput schema / properties / status / description
      Added value: +"ok: the text was translated. A refused call returns no object, only an error text such as \"transcript_not_found: ...\" that says what to do next."
    • addedOutput schema / properties / target / properties / code / description
      Added value: +"Target language code, such as es."
    • addedOutput schema / properties / target / properties / name / description
      Added value: +"Its English name, such as Spanish."
    • addedOutput schema / properties / usage / properties / characters_charged / description
      Added value: +"Characters this call used from today's allowance."
    • addedOutput schema / properties / usage / properties / characters_charged / minimum
      Added value: +0
    • addedOutput schema / properties / usage / properties / characters_left_today / description
      Added value: +"Characters the caller can still translate today (UTC)."
    • addedOutput schema / properties / usage / properties / characters_left_today / minimum
      Added value: +0
    • addedOutput schema / properties / vtt / description
      Added value: +"Translated WebVTT captions with the original times (when include has vtt)."
  2. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  3. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false), but the description goes well beyond them: 'Nothing is stored', an ~18,000 character per-call cap plus a daily allowance, the rights_not_confirmed refusal on confirm_rights=false, and a quality caveat that output is machine translation to check before publishing. Rate limits, persistence behavior and auth prerequisites are all context the annotations do not carry.

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 purpose, then labeled blocks (Best for / Returns / Input tips / Limits / Not for) that make it scannable. It is dense and slightly overstuffed, and 'Returns' partly restates the output schema, but nearly every sentence carries a decision-relevant constraint.

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 7-parameter tool with an output schema, the description covers the remaining gaps: precedence rules between input modes, rights gating, language defaults, size limits, and the non-storage guarantee. Nothing an agent needs to invoke it correctly 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?

Schema coverage is 100%, so baseline is 3, but the description adds real cross-parameter semantics the schema does not encode: 'always pass target_lang', the mutual exclusivity of transcript_id and subtitles, the conditional library_id rule tied to transcribe_media's return, and the 'trim with include' hint that gives include an operational purpose. The enum values themselves are left to the schema.

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: translates subtitles or a saved transcript and writes a dub script. It also names sibling boundaries explicitly ('Not for: transcribing audio; use transcribe_media first'), so an agent can separate it from transcribe_media without reading either schema.

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

Usage Guidelines5/5

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

Gives literal trigger phrases ('translate these subtitles to Spanish'), states the exactly-one-of rule for transcript_id vs subtitles, the library_id pairing rule, and when confirm_rights is permitted ('only after the user says they own the media'). It also names the alternative tool and its ordering, so the when-to-use decision is fully specified.

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.