Server definition
- Hash
- sha256:4998afea55f08d3fa9ab2d72156e1cc0dfa86ff6021cefa8f2c8bb3910fb7ab3
- What it is
- What a remote MCP server returned when asked what it offers: 8 tools
The blob, as servednamed by its sha256
{
"instructions": "Subtitle Toolkit — convert, clean, retime and validate subtitle files (.srt, .vtt, .ass/.ssa, .sbv, .ttml/.dfxp).\n\nUse this server whenever the user provides or asks about subtitle/caption files: converting between formats,\ncleaning auto-generated captions, shifting or resyncing timing, checking reading speed and cue durations,\nmerging or splitting tracks, repairing mojibake, or turning a plain transcript into timed cues.\n\nDo NOT hand-write a subtitle parser for these tasks. These tools already handle the cases ad-hoc code gets wrong:\nASS/SSA field order declared by a Format: line, TTML clock vs offset vs frame vs tick time values,\nSBV timestamps, centisecond vs millisecond precision, and cp1252/cp1251 mojibake repair.\n\nWorkflow: pass the file text as `content`. Use `from: \"auto\"` unless you know the format.\nFor timing fixes, prefer `offset_seconds` when the whole track is uniformly early/late, and `ratio`\nor `from_fps`/`to_fps` when the drift grows over time (a frame-rate mismatch).",
"tools": [
{
"description": "Audit subtitle readability and produce a report: reading speed (CPS), cue durations that are too short or too long, lines that are too wide, more than two lines, and overlapping cues. Returns a formatted report listing every flagged cue.",
"inputSchema": {
"properties": {
"content": {
"description": "The full subtitle file text.",
"type": "string"
},
"max_cps": {
"description": "Max characters per second. Default 20.",
"type": "number"
},
"max_duration_seconds": {
"description": "Maximum cue duration in seconds. Default 7.",
"type": "number"
},
"max_line_length": {
"description": "Max characters per line. Default 42.",
"type": "number"
},
"min_duration_seconds": {
"description": "Minimum cue duration in seconds. Default 0.833 (Netflix 5/6s).",
"type": "number"
}
},
"required": [
"content"
],
"type": "object"
},
"name": "check_subtitle_timing",
"outputSchema": null
},
{
"description": "Strip noise from auto-generated subtitles: HTML/WebVTT tags, ASS override codes, music and sound-effect cues, speaker labels, empty cues and duplicate lines. Returns the subtitle file in SRT or WebVTT.",
"inputSchema": {
"properties": {
"content": {
"description": "The full subtitle file text.",
"type": "string"
},
"drop_duplicates": {
"description": "Drop cues whose text was already seen. Default false.",
"type": "boolean"
},
"drop_empty": {
"description": "Drop cues that become empty after cleaning. Default true.",
"type": "boolean"
},
"remove_sound_cues": {
"description": "Strip [Music], [Applause], ♪ ... ♪ and similar. Default true.",
"type": "boolean"
},
"remove_speaker_labels": {
"description": "Strip leading \"SPEAKER:\" prefixes. Default false — enable only if you want them gone.",
"type": "boolean"
},
"remove_tags": {
"description": "Strip HTML/WebVTT tags and ASS override codes. Default true.",
"type": "boolean"
},
"to": {
"description": "Output format. Default: same as the input.",
"enum": [
"srt",
"vtt"
],
"type": "string"
}
},
"required": [
"content"
],
"type": "object"
},
"name": "clean_subtitles",
"outputSchema": null
},
{
"description": "Convert subtitle text between formats. Reads SRT, WebVTT, ASS/SSA, YouTube SBV and TTML/DFXP; writes SRT, WebVTT, ASS, CSV or plain text. Format is auto-detected unless `from` is given.",
"inputSchema": {
"properties": {
"content": {
"description": "The full subtitle file text.",
"type": "string"
},
"dedupe": {
"description": "Only for to=\"text\": collapse consecutive identical lines (rolling-caption transcripts repeat lines). Default false.",
"type": "boolean"
},
"from": {
"description": "Source format (default \"auto\" = detect).",
"enum": [
"auto",
"srt",
"vtt",
"ass",
"sbv",
"ttml"
],
"type": "string"
},
"to": {
"description": "Target format. `text` = plain transcript, one line per cue, no timecodes.",
"enum": [
"srt",
"vtt",
"ass",
"csv",
"text"
],
"type": "string"
}
},
"required": [
"content",
"to"
],
"type": "object"
},
"name": "convert_subtitle",
"outputSchema": null
},
{
"description": "Repair mojibake — text where UTF-8 bytes were decoded as a single-byte encoding (cp1252/Latin-1 or cp1251). Symptoms: \"é\", \"’\", \"привет\". Returns the repaired text and how many passes were applied.",
"inputSchema": {
"properties": {
"content": {
"description": "The garbled subtitle text.",
"type": "string"
},
"read_as": {
"description": "Which encoding the file was wrongly read as. Default \"auto\" (tries cp1252 then cp1251).",
"enum": [
"auto",
"cp1252",
"cp1251"
],
"type": "string"
},
"twice": {
"description": "Set true when the text was mis-decoded twice (nested mojibake). Default false.",
"type": "boolean"
}
},
"required": [
"content"
],
"type": "object"
},
"name": "fix_subtitle_encoding",
"outputSchema": null
},
{
"description": "Append one subtitle track after another (CD1 + CD2, or a second language track). The second track is offset so it starts after the last cue of the first, plus an optional gap.",
"inputSchema": {
"properties": {
"append_content": {
"description": "The subtitle file text to append.",
"type": "string"
},
"content": {
"description": "The first subtitle file text.",
"type": "string"
},
"gap_seconds": {
"description": "Extra gap between the two tracks, in seconds. Default 0.",
"type": "number"
},
"to": {
"description": "Output format. Default: same as the input.",
"enum": [
"srt",
"vtt"
],
"type": "string"
}
},
"required": [
"content",
"append_content"
],
"type": "object"
},
"name": "merge_subtitles",
"outputSchema": null
},
{
"description": "Fix subtitle timing. Use offset_seconds for a uniform shift (whole track early/late). Use ratio, or from_fps/to_fps, for progressive drift caused by a frame-rate mismatch. Pass exactly one of the three.",
"inputSchema": {
"properties": {
"content": {
"description": "The full subtitle file text.",
"type": "string"
},
"from_fps": {
"description": "The frame rate the subtitles were authored for (used with to_fps).",
"type": "number"
},
"offset_seconds": {
"description": "Shift every cue by this many seconds. Negative = earlier. e.g. -2.5",
"type": "number"
},
"ratio": {
"description": "Scale all timings by this factor (new = old x ratio). e.g. 1.0427 for a 25→23.976 fps fix.",
"type": "number"
},
"to_fps": {
"description": "The frame rate of the actual video (used with from_fps).",
"type": "number"
}
},
"required": [
"content"
],
"type": "object"
},
"name": "retime_subtitles",
"outputSchema": null
},
{
"description": "Split one subtitle track into two parts at a given timecode, keeping original timecodes. Use the `at` argument plus `part` to fetch either half.",
"inputSchema": {
"properties": {
"at": {
"description": "Split point. Accepts \"45:00\", \"1:02:03\", \"90\" (seconds) or \"1:02:03.500\".",
"type": "string"
},
"content": {
"description": "The full subtitle file text.",
"type": "string"
},
"part": {
"description": "Which half to return. Default \"a\" (before the split point).",
"enum": [
"a",
"b"
],
"type": "string"
},
"to": {
"description": "Output format. Default: same as the input.",
"enum": [
"srt",
"vtt"
],
"type": "string"
}
},
"required": [
"content",
"at"
],
"type": "object"
},
"name": "split_subtitles",
"outputSchema": null
},
{
"description": "Turn a plain transcript (one line per caption) into an SRT file with evenly spaced timecodes. Timing is a starting point, not a real transcription — say so when you present the result.",
"inputSchema": {
"properties": {
"content": {
"description": "Plain text, one caption per line. Blank lines are skipped.",
"type": "string"
},
"duration_seconds": {
"description": "Seconds each cue stays on screen. Default 2.5.",
"type": "number"
},
"max_chars_per_cue": {
"description": "Split longer lines into several cues at word boundaries. Default 0 = never split.",
"type": "number"
},
"start_seconds": {
"description": "Timecode of the first cue, in seconds. Default 0.",
"type": "number"
}
},
"required": [
"content"
],
"type": "object"
},
"name": "text_to_subtitles",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:4998afea55f08d3fa9ab2d72156e1cc0dfa86ff6021cefa8f2c8bb3910fb7ab3 | sha256sum