Parse WebVTT, SRT, or TTML for conformance, timing, overlaps, line length, and reading speed.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Preflight one caption or subtitle file before delivery. Attach a WebVTT (.vtt), SRT (.srt), or TTML/IMSC (.ttml/.xml) caption file in chat or give a publicly fetchable URL and it downloads the artifact under an SSRF-guarded, 2 MB-capped fetch, detects the format by content and the byte encoding and BOM, then parses it with the real spec engine (the WebVTT spec parser, a dedicated SRT parser, or the imscJS TTML/IMSC profile engine) and returns deterministic evidence: pass/fail, cue count, structural spec and IMSC profile-conformance errors, overlapping / negative / out-of-order / empty cues, per-line length, and per-cue and summary reading speed (CPS) against a named platform profile (netflix-adult-20, netflix-children-17, youtube, ebu-tt). It reports only source-file conformance, timing, encoding, and reading-speed facts against a dated profile. It does not judge translation quality, transcription accuracy, or synchronization against the video. An arbitrary XML or text file that is not a caption track returns an explicit unsupported-format error. Fetching and parsing a full-length track can take up to 60 seconds. WebVTT limitation: the parser drops payload-less cues; cue counts, indices, timing checks and comparisons cover retained cues only, not those omitted cues.
A publicly fetchable HTTP(S) URL of a WebVTT, SRT, or TTML/IMSC caption file, detected by content not extension. Provide either this or an attached file, never both. Query strings are allowed but never logged. Pasted caption bodies, data URLs, FTP/SFTP, and URLs needing credentials, headers, or cookies are not supported. STRICT RULE: Caption check failed — provide either a caption URL or an attached caption file, not both STRICT RULE: Caption check failed — provide a public caption URL or attach the caption file
A caption file attached in chat (WebVTT, SRT, or TTML/IMSC), detected by content not extension. Provide either this or url, never both.
Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics.
Preflight one caption or subtitle file before delivery. Attach a WebVTT (.vtt), SRT (.srt), or TTML/IMSC (.ttml/.xml) caption file in chat or give a publicly fetchable URL and it downloads the artifact under an SSRF-guarded, 2 MB-capped fetch, detects the format by content and the byte encoding and BOM, then parses it with the real spec engine (the WebVTT spec parser, a dedicated SRT parser, or the imscJS TTML/IMSC profile engine) and returns deterministic evidence: pass/fail, cue count, structural spec and IMSC profile-conformance errors, overlapping / negative / out-of-order / empty cues, per-line length, and per-cue and summary reading speed (CPS) against a named platform profile (netflix-adult-20, netflix-children-17, youtube, ebu-tt). It reports only source-file conformance, timing, encoding, and reading-speed facts against a dated profile. It does not judge translation quality, transcription accuracy, or synchronization against the video. An arbitrary XML or text file that is not a caption track returns an explicit unsupported-format error. Fetching and parsing a full-length track can take up to 60 seconds. WebVTT limitation: the parser drops payload-less cues; cue counts, indices, timing checks and comparisons cover retained cues only, not those omitted cues.
| Argument | Type | Description |
|---|---|---|
| url | string | A publicly fetchable HTTP(S) URL of a WebVTT, SRT, or TTML/IMSC caption file, detected by content not extension. Provide either this or an attached file, never both. Query strings are allowed but never logged. Pasted caption bodies, data URLs, FTP/SFTP, and URLs needing credentials, headers, or cookies are not supported. STRICT RULE: Caption check failed — provide either a caption URL or an attached caption file, not both STRICT RULE: Caption check failed — provide a public caption URL or attach the caption file |
| file | object | A caption file attached in chat (WebVTT, SRT, or TTML/IMSC), detected by content not extension. Provide either this or url, never both. |
| profile | any | Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"pattern": "^https?://",
"maxLength": 2048,
"minLength": 1,
"description": "A publicly fetchable HTTP(S) URL of a WebVTT, SRT, or TTML/IMSC caption file, detected by content not extension. Provide either this or an attached file, never both. Query strings are allowed but never logged. Pasted caption bodies, data URLs, FTP/SFTP, and URLs needing credentials, headers, or cookies are not supported.\n\nSTRICT RULE: Caption check failed — provide either a caption URL or an attached caption file, not both\nSTRICT RULE: Caption check failed — provide a public caption URL or attach the caption file"
},
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id for the attached file"
},
"file_name": {
"type": "string",
"description": "Original file name when ChatGPT knows it"
},
"mime_type": {
"type": "string",
"description": "MIME type when ChatGPT knows it"
},
"download_url": {
"type": "string",
"description": "Temporary authorized download URL supplied by ChatGPT; fetch it only while handling this tool call"
}
},
"description": "A caption file attached in chat (WebVTT, SRT, or TTML/IMSC), detected by content not extension. Provide either this or url, never both.",
"additionalProperties": false
},
"profile": {
"anyOf": [
{
"type": "string",
"const": "netflix-adult-20",
"description": "Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics."
},
{
"type": "string",
"const": "netflix-children-17",
"description": "Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics."
},
{
"type": "string",
"const": "youtube",
"description": "Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics."
},
{
"type": "string",
"const": "ebu-tt",
"description": "Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics."
}
],
"description": "Named reading-speed profile to judge CPS and line length against. netflix-adult-20 (default, 20 CPS) and netflix-children-17 (17 CPS) are spec-backed; youtube and ebu-tt are advisory ~17 CPS heuristics."
}
},
"additionalProperties": false
}Compare exactly two caption or subtitle files under identical bounded checks: an original versus its translated track, before versus after a timing fix, or a format migration. Attach two WebVTT, SRT, or TTML/IMSC caption files in chat or give two publicly fetchable URLs and it runs the same SSRF-guarded, 2 MB-capped preflight as caption_check on each, then aligns them by cue index and reports side-by-side pass status, detected-format and encoding differences, the cue-count delta, timing drift and overlap differences, reading-speed (CPS) regressions, structural-error deltas, and a winner only when the measured checks separate the two. Use caption_check for a single file. It reports only source-file conformance, timing, encoding, and reading-speed facts against a dated profile: never translation quality, transcription accuracy, or sync against the video. Fetching and parsing two live files can take up to 60 seconds. WebVTT limitation: the parser drops payload-less cues; cue counts, indices, timing checks and comparisons cover retained cues only, not those omitted cues.
| Argument | Type | Description |
|---|---|---|
| urls | array | Exactly two public caption URLs to compare, in the order they should appear side by side (for example original then translated). Provide either this or files, never both. STRICT RULE: Caption compare failed — provide either two caption URLs or two attached caption files, not both STRICT RULE: Caption compare failed — provide two public caption URLs or attach two caption files |
| files | array | Exactly two caption files attached in chat to compare, in the order they should appear side by side (for example original then translated). Provide either this or urls, never both. |
| profile | any | Named reading-speed profile applied to both tracks. netflix-adult-20 (default), netflix-children-17, youtube, ebu-tt. |
{
"type": "object",
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string",
"pattern": "^https?://",
"maxLength": 2048,
"minLength": 1,
"description": "A publicly fetchable HTTP(S) WebVTT, SRT, or TTML/IMSC caption URL, detected by content."
},
"maxItems": 2,
"minItems": 2,
"description": "Exactly two public caption URLs to compare, in the order they should appear side by side (for example original then translated). Provide either this or files, never both.\n\nSTRICT RULE: Caption compare failed — provide either two caption URLs or two attached caption files, not both\nSTRICT RULE: Caption compare failed — provide two public caption URLs or attach two caption files"
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id for the attached file"
},
"file_name": {
"type": "string",
"description": "Original file name when ChatGPT knows it"
},
"mime_type": {
"type": "string",
"description": "MIME type when ChatGPT knows it"
},
"download_url": {
"type": "string",
"description": "Temporary authorized download URL supplied by ChatGPT; fetch it only while handling this tool call"
}
},
"description": "A caption file attached in chat (WebVTT, SRT, or TTML/IMSC), detected by content.",
"additionalProperties": false
},
"maxItems": 2,
"minItems": 2,
"description": "Exactly two caption files attached in chat to compare, in the order they should appear side by side (for example original then translated). Provide either this or urls, never both."
},
"profile": {
"anyOf": [
{
"type": "string",
"const": "netflix-adult-20",
"description": "Named reading-speed profile applied to both tracks. netflix-adult-20 (default), netflix-children-17, youtube, ebu-tt."
},
{
"type": "string",
"const": "netflix-children-17",
"description": "Named reading-speed profile applied to both tracks. netflix-adult-20 (default), netflix-children-17, youtube, ebu-tt."
},
{
"type": "string",
"const": "youtube",
"description": "Named reading-speed profile applied to both tracks. netflix-adult-20 (default), netflix-children-17, youtube, ebu-tt."
},
{
"type": "string",
"const": "ebu-tt",
"description": "Named reading-speed profile applied to both tracks. netflix-adult-20 (default), netflix-children-17, youtube, ebu-tt."
}
],
"description": "Named reading-speed profile applied to both tracks. netflix-adult-20 (default), netflix-children-17, youtube, ebu-tt."
}
},
"description": "STRICT RULE: Caption compare failed — the two caption files are the same; provide two distinct caption files.",
"additionalProperties": false
}