caption-forge-mcp
Accepts Deepgram word-timestamp JSON as input to captions_from_words, enabling frame-accurate caption generation from Deepgram speech-to-text output.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
caption-forge-mcp
Subtitles that your AI assistant can actually fix.
caption-forge-mcp is a Model Context Protocol server for working with captions: convert SRT ⇄ VTT ⇄ ASS, fix sync drift, lint for readability, and turn long subtitle lines or raw speech-to-text word timings into the short, punchy captions you see on Reels, TikTok and Shorts.
Pure TypeScript. No ffmpeg, no API keys, no network. Works on any caption file you point it at — or on caption text pasted straight into the chat.
You: My podcast SRT is 1.2 seconds late and the lines are huge. Make reel captions,
all caps, and give me an ASS file I can burn into the vertical cut.
Claude: Shifted -1200 ms, then reflowed 214 cues → 611 three-word captions.
Saved ep42_reels.ass (1080x1920, bold, above the UI zone). Burn in with:
ffmpeg -i ep42_vertical.mp4 -vf "subtitles='ep42_reels.ass'" -c:a copy out.mp4Tools
Tool | What it does |
| Format, cue count, time span, words and speaking rate, reading speed (CPS), longest line, lines per cue, tags, parse warnings, preview. |
| SRT ⇄ WebVTT ⇄ ASS ⇄ JSON → plain text. Styled ASS output (presets or custom font/size/color/outline/box/position) plus an ffmpeg burn-in command. |
| Move all cues (or only cues after a point, e.g. after a cut) earlier or later. |
| Fix drift: frame-rate conversion (23.976 → 25 etc.), stretch factor, or two-point sync (tell it the right time for an early and a late line). |
| Readability check with cue numbers and timestamps: line length, line count, reading speed, min/max duration, overlaps, order, flicker gaps, empty cues. |
| Auto-fix: whitespace, empty cues, sorting, duplicate merging, overlaps, gaps, too-short cues. Optional removal of |
| Re-chunk existing cues: reels (1–3 words, one short line, optional ALL CAPS) or standard (balanced ≤42-char lines, max 2). Breaks on sentence/phrase boundaries. |
| Frame-accurate captions from word timestamps (Whisper, faster-whisper, WhisperX, Deepgram, or a plain |
| Keep only a time range and re-zero it — for clips cut from a long video or podcast. |
| Find where something is said, with timestamps and surrounding lines. |
| Clean transcript: tags stripped, rolling duplicates from auto-captions removed, paragraphs on pauses, optional timestamps. |
Every tool accepts either path (a local file) or content (the caption text). Results come back inline unless you pass output_path.
Formats
Format | Read | Write | Notes |
SRT | ✅ | ✅ | BOM, CRLF, missing indexes and UTF-16 files handled. |
WebVTT | ✅ | ✅ | Cue settings, identifiers, |
ASS / SSA | ✅ | ✅ | Reads any |
JSON | ✅ | ✅ |
|
Plain text | — | ✅ | Transcript. |
Related MCP server: faster-whisper-mcp
Requirements
Node.js 20+. That's it.
Install
Runs straight from GitHub with npx — nothing to publish or build.
Claude Desktop
Settings → Developer → Edit Config:
{
"mcpServers": {
"caption-forge": {
"command": "npx",
"args": ["-y", "github:anshumanofficial2002-cpu/caption-forge-mcp"]
}
}
}Restart Claude Desktop.
Claude Code
claude mcp add caption-forge -- npx -y github:anshumanofficial2002-cpu/caption-forge-mcpCursor / Windsurf / VS Code / other clients
{
"caption-forge": {
"command": "npx",
"args": ["-y", "github:anshumanofficial2002-cpu/caption-forge-mcp"]
}
}From source
git clone https://github.com/anshumanofficial2002-cpu/caption-forge-mcp.git
cd caption-forge-mcp && npm install && npm run build
# point your client at: node /absolute/path/to/caption-forge-mcp/dist/index.jsExample prompts
"What's wrong with
~/Downloads/interview.srt? Lint it with the standard streaming rules.""These captions start in sync but are 3 seconds late by the end. Line 1 should be at 00:00:02,100 and the last line at 00:41:55,300."
"Convert
episode.vttto SRT and remove the [MUSIC] tags.""Make TikTok-style captions from
whisper_words.json, two words at a time, uppercase, as an ASS file for a vertical video.""I clipped 12:03 to 12:58 from the podcast. Give me captions for just that clip."
"Find every time the guest says 'compounding' in
ep12.srt.""Turn this SRT into a clean transcript with timestamps every paragraph, I need show notes." (paste the SRT)
Tool reference
Common input params for every caption tool:
Param | Type | Notes |
| string | Local |
| string | Caption text instead of a file. |
|
| Force input format (auto-detected otherwise). |
| string | Write to this file. Format follows the extension unless set explicitly. |
|
| Output format (defaults to input format). |
| boolean | Default |
convert_captions
to (required), ass_style:
| Meaning |
|
|
| Font family and size in pixels of the play resolution |
|
|
| Thickness in pixels |
| boolean |
| Numpad position: 2 bottom-center, 5 middle, 8 top |
| Distance from the aligned edge |
| Opaque box behind text instead of an outline |
shift_captions
offset — ms number or "2.5s", "-1500ms", "-00:00:01,200". from — only shift cues at/after this time.
retime_captions
mode: fps (from_fps, to_fps), factor (factor), or sync_points (first_original, first_correct, second_original, second_correct).
lint_captions
Preset | Chars/line | Lines | Max CPS | Min/Max duration | Min gap |
| 42 | 2 | 17 | 0.833 s / 7 s | 83 ms |
| 24 | 1 | 22 | 0.3 s / 3 s | 0 |
| 37 | 2 | 13 | 1.5 s / 7 s | 83 ms |
Override any rule: max_chars_per_line, max_lines, max_cps, min_duration_ms, max_duration_ms, min_gap_ms. Limit output with max_issues.
clean_captions
min_gap_ms (83), min_duration_ms (833), merge_duplicates (true), remove_hearing_impaired (false).
reflow_captions / captions_from_words
Param | reels default | standard default |
|
|
|
| 3 | 40 |
| 22 | 42 |
| 1 | 2 |
| false | false |
| true | false |
| 250 | 833 |
reflow_captions estimates word timing inside each original cue from word length. For exact timing, use captions_from_words with words_path or words_json. Accepted shapes:
[{ "word": "Hey", "start": 0.0, "end": 0.3 }] // seconds
[{ "text": "Hey", "start_ms": 0, "end_ms": 300 }] // milliseconds
{ "segments": [{ "words": [{ "word": " Hey", "start": 0.0, "end": 0.3 }] }] } // Whisper
{ "results": { "channels": [{ "alternatives": [{ "words": [...] }] }] } } // Deepgramclip_captions
start, end (source times), rezero (true).
search_captions
query, regex (false), whole_word (false), context (1), max_results (50).
extract_transcript
timestamps (false), paragraph_gap_ms (2000), strip_speaker_tags (false), output_path.
Notes
ASS input loses its original styles when written back out; text and timing are kept.
Reading speed (CPS) counts every visible character including spaces, the usual convention for subtitle guidelines.
Overwrites are refused unless
overwrite: true, and writing over the input file needs it explicitly.
Development
npm install
npm run build
npm test # parser/ops unit tests + end-to-end tests over stdio
npm run inspect # MCP Inspectordist/ is committed so npx github:… works without a build; CI verifies it matches src/.
Related servers
video-probe-mcp — inspect and conform video for each platform
caption-forge-mcp — SRT/VTT/ASS conversion, timing, linting and reel-style captions
loudness-check-mcp — LUFS, true peak, normalization, silence and clipping
frame-grab-mcp — frames, contact sheets, scene cuts and thumbnails your AI can see
script-timer-mcp — time, trim and format scripts for short-form video
License
MIT © 2026 Anshuman
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Convert, clean, retime and validate SRT, WebVTT, ASS/SSA, SBV and TTML subtitles. 8 tools.
Convert subtitles, transcripts, broadcast captions (SCC/MCC/STL), EDLs, and Premiere files.
Add burned-in captions to any video in one call: 28 caption styles, transcription, translation, dubbing, silence trimming and AI shorts. REST + MCP, prepaid credits (1 credit = 1 cent), free tools work without a key.
Transform video, audio and images, and generate media from prompts. FFmpeg, captions, models.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI coding agents to programmatically assemble vertical videos and manage local CapCut Desktop drafts, including AI background removal, audio mastering to -14 LUFS or Demucs vocal isolation, music auto-ducking, punch zooms, karaoke captions, PiP proof overlays, hook badges, safe-zone linting, proxy previews, and EN→ES cloning/dubbing. It outputs real CapCut draft JSON ready for review and export.172MIT
- AlicenseNot gradedqualityCmaintenanceEnables local transcription of audio/video files and YouTube URLs, generation of SRT/VTT subtitles, and analysis of speech pacing and audience retention risk using faster-whisper.MIT
- AlicenseAqualityBmaintenanceEnables AI apps to transcribe local audio and video files on the user's own GPU, producing SRT/VTT subtitles and text without cloud uploads. It also helps find media files, list available devices, and list supported languages and models.4132 PyPI8MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients such as Claude, Cursor and VS Code to validate SRT and WebVTT caption files mid-task against Netflix, BBC or DCMP limits, flagging reading speed, line length, line count, on-screen duration, gaps, overlaps and broken timestamps. Runs locally as a dependency-free stdio server, accepting a file path or pasted caption text and exposing each standard's limits with their source pages.MIT