justcaptions
Provides TikTok-optimized caption styles and safe-area presets for burning captions into videos intended for TikTok.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@justcaptionsCaption ~/Movies/intro.mp4 with Word Highlight for TikTok"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Just Captions for agents
Caption videos from Codex, Claude Code, any MCP client, or your terminal. This skill transcribes the speech, makes SRT/VTT/JSON files, and burns TikTok/Reels-style captions into the video. It does one video or a whole folder at a time.
15 animated portable presets follow the Just Captions app style families. Typography and sampled animations can differ from native iOS. Rendering runs on your machine with Pillow and ffmpeg.
Choose a style and copy a task · API docs · OpenAPI · Style catalog
Emoji | Mega | Reveal |
|
|
|
Neon | White box | Yellow box |
|
|
|
Gray box | Yellow outline | Word Highlight |
|
|
|
Highlight Box | Impact | Pop In |
|
|
|
Typewriter | Cinema | Editorial |
|
|
|
MCP quickstart
Python 3.10+, uv and ffmpeg are required for the packaged MCP/CLI. The plain skill still works with Python 3.9+ and Pillow.
Codex — add to ~/.codex/config.toml:
[mcp_servers.justcaptions]
command = "uvx"
args = ["--from", "https://github.com/SpaceSheepBoy/justcaptions-skill/releases/download/v1.3.1/justcaptions_agent-1.3.1-py3-none-any.whl", "justcaptions-mcp"]
startup_timeout_sec = 120
[mcp_servers.justcaptions_cloud]
url = "https://api.justcaptions.com/mcp"
bearer_token_env_var = "JUSTCAPTIONS_API_KEY"Claude Code — merge into your project's .mcp.json:
{
"mcpServers": {
"justcaptions": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "https://github.com/SpaceSheepBoy/justcaptions-skill/releases/download/v1.3.1/justcaptions_agent-1.3.1-py3-none-any.whl", "justcaptions-mcp"]
},
"justcaptions_cloud": {
"type": "http",
"url": "https://api.justcaptions.com/mcp",
"headers": {"Authorization": "Bearer ${JUSTCAPTIONS_API_KEY}"}
}
}
}Set JUSTCAPTIONS_API_KEY, or save a key with the CLI's --signup YOUR_EMAIL. The local MCP also reads ~/.config/justcaptions/api_key. Never put keys in prompts or commits. For recognition without a key, add "--with", "faster-whisper" before "--from" in the uvx arguments. The offline model downloads on first use.
Ask: “Caption ~/Movies/intro.mp4 with Word Highlight for TikTok. Save MP4, SRT, VTT and JSON in ./captioned/, and preserve the original.”
Tool | Purpose |
| Media tools and recognition/key availability; never reveals credentials |
| 15 presets, accepted overrides, aliases and safe-area margins |
| An inline PNG rendered from the selected settings, without a paid API call |
| Start a video/folder job; returns a job ID immediately |
| Poll stages and per-file verified output paths |
| Current API usage and estimated monthly charge |
caption_video takes input_path, output_dir, style_id, size, position, safe_area, length, overrides, captions_path, engine, language, translate_to, correct, glossary, burn, and overwrite. See MCP discovery for typed schemas. Up to 100 files per folder job, two concurrent jobs. Jobs persist locally across process restarts; use list_jobs and resume_job to recover. Existing outputs are protected unless explicitly overwritten; folder jobs use per-source output directories.
Remote MCP
https://api.justcaptions.com/mcp uses Streamable HTTP and your API key. It handles audio and caption text. It does not access local files, preview styles or render MP4.
For Codex:
[mcp_servers.justcaptions_cloud]
url = "https://api.justcaptions.com/mcp"
bearer_token_env_var = "JUSTCAPTIONS_API_KEY"For Claude Code, a project .mcp.json entry:
{"mcpServers":{"justcaptions_cloud":{"type":"http","url":"https://api.justcaptions.com/mcp","headers":{"Authorization":"Bearer ${JUSTCAPTIONS_API_KEY}"}}}}Tools: list_styles, get_pricing, get_usage, transcribe_audio, correct_captions, translate_captions, pick_emojis. Cloud operations use the existing API pricing and limits. Supply a unique request_id and reuse it only for identical retries. Request hashes and completed replies have a 24-hour replay window, then are removed on a subsequent request or daily cleanup (within 48 hours). The replay store does not retain audio.
Related MCP server: telop-codex
Styles and customization
All 15 presets animate in video exports and the website previews, using spoken-word highlights/reveals, pop entrances, fades, typewriting or a pulsing glow.
The authoritative versioned catalog is skills/justcaptions/assets/styles.json: Emoji, Mega, Reveal, Neon, White box, Yellow box, Gray box, Yellow outline, Word Highlight, Highlight Box, Impact, Pop In, Typewriter, Cinema and Editorial. Historical karaoke, black-box and white-outline CLI names remain supported. App IDs such as wordHighlight resolve to their portable preset IDs.
The local MCP accepts overrides, for example:
{"highlight_color":"#1A9E7A","text_color":"#FFFFFF","font_multiplier":1.2,"max_words":3}Named fonts are bundled for predictable local rendering. Run justcaptions --list-fonts or call MCP list_fonts; the public GET /v1/fonts endpoint returns the same catalog. Set {"font_id":"anton"} in overrides or a style config file. The 13 choices include Inter, Poppins, Montserrat, Merriweather, Bebas Neue, Oswald, Roboto Flex, Anton, Barlow Condensed, Nunito, Caveat, Patrick Hand and Permanent Marker. Variable fonts use the catalog's bold axis settings. A named font takes precedence over font_family; "font_id":null restores generic family selection. These named fonts target Latin captions; other scripts retain the renderer's system font fallback. SRT/VTT remain plain subtitles and do not embed fonts.
The CLI takes the same object in --style-config FILE.json. Unknown keys and invalid values are rejected. Colors, backgrounds, outlines, font families, size, word count and letter case are configurable. Use --safe-area tiktok|reels|shorts|none; conservative margins keep captions horizontally centered. Platform UI layouts can vary.
Recognition word timestamps are retained when text is unchanged. Corrected/translated text and imported subtitle-only files use estimated word timing, not forced alignment. Serif/regular families use available system fonts, with a bundled Geist fallback.
Install
You need ffmpeg and Python 3.9+ with Pillow:
brew install ffmpeg # or: sudo apt install ffmpeg
pip install Pillow
pip install faster-whisper # optional: offline transcriptionAs a Claude Code plugin
/plugin marketplace add SpaceSheepBoy/justcaptions-skill
/plugin install justcaptions@justcaptionsAs a plain skill
git clone https://github.com/SpaceSheepBoy/justcaptions-skill
cp -r justcaptions-skill/skills/justcaptions ~/.claude/skills/Then ask Claude something like "caption interview.mp4 with the emoji style" or "burn Spanish subtitles into everything in ./clips".
Use it without Claude
S=skills/justcaptions/scripts
python3 $S/jc.py talk.mp4 --burn # talk.srt, talk.json, talk.captioned.mp4
python3 $S/jc.py clips/ --style karaoke --burn # batch: every video in the folder
python3 $S/jc.py talk.mp4 --style emoji --burn
python3 $S/jc.py talk.mp4 --formats srt,vtt # subtitle files only
python3 $S/jc.py talk.mp4 --captions talk.srt --burn # burn a subtitle file you edited
python3 $S/jc.py talk.mp4 --style word-highlight --safe-area tiktok --burn --json
python3 $S/jc.py --helpoption | values |
| All 15 preset IDs plus legacy names; |
|
|
|
|
|
|
| spoken-language hint, e.g. |
| names and terms to spell right: |
|
|
| AI fix for recognition mistakes (needs an API key) |
| translate the captions (needs an API key) |
To change the wording before you burn: run the script without --burn, edit NAME.json or NAME.srt, then run it again with --captions NAME.json --burn. The JSON file keeps per-word timing for karaoke and emoji.
Just Captions API
Without a key, everything runs offline with faster-whisper. With a key you get:
cloud transcription (better on accents, noisy audio and many languages)
--correctand--translateAI emoji picks for the Emoji style (the offline fallback is a keyword table)
Getting a key is instant and needs no card:
python3 skills/justcaptions/scripts/jc.py --signup you@example.comThe key is saved to ~/.config/justcaptions/api_key (readable only by you). If JUSTCAPTIONS_API_KEY is set, it is used instead.
python3 skills/justcaptions/scripts/jc.py --account # usage this month and estimated chargePricing
price | free every month | |
Transcription | $0.01 per audio minute, billed per second | 30 minutes |
Correct, translate, emoji | $0.01 per 1,000 caption characters sent | 50,000 characters |
Free plan (no card): stops when the free allowance runs out. When faster-whisper is installed, transcription carries on locally.
Pay as you go: add a card at https://justcaptions.com/api/account/ to keep going past the free allowance. Stripe invoices you monthly, and the default spend cap is $100 a month.
Failed requests are not billed.
The API takes audio only. The script pulls a small mono track out of your video, so the video itself is never uploaded, and burning always happens on your machine. API reference: https://justcaptions.com/api/
Want this on your iPhone?
Just Captions on the App Store provides native caption styling on your phone, with on-device transcription, editing and batch export.
Development
Install in an isolated environment with uv pip install -e .. The worker MCP adapter is open source in remote/mcp.mjs; the host injects its existing authenticated API handler. tools/sync-agent-assets.py --site SITE_DIR --backend BACKEND_DIR publishes the canonical catalog, OpenAPI and adapter to the site and Worker source. Generated copies should not be edited independently.
python3 -m unittest discover -s tests
python3 tools/smoke-mcp.py # exercise the installed MCP with synthetic media
python3 tools/agent-previews.py --site SITE_DIR # regenerate videos/posters and animated README previews
python3 tools/gallery.py # regenerate the legacy five-style PNG galleryHow burning works: each caption state (one per word for karaoke and emoji) is drawn as a full-frame transparent PNG. The concat demuxer plays the PNGs back as a single image stream with exact durations, and one overlay filter puts it over the video. That keeps the ffmpeg command the same size no matter how many captions there are.
License
The code is MIT. Named font licenses and original source URLs are recorded in the catalog; license texts are included in assets/fonts/licenses/ (SIL OFL 1.1, plus Apache 2.0 for Permanent Marker). The bundled Geist font is SIL OFL 1.1 (skills/justcaptions/assets/fonts/OFL.txt).
Complete first export
After installing Python 3.10+, ffmpeg and the package, run justcaptions --demo --out-dir ./demo --style word-highlight. The bundled human-narration sample includes word timestamps and needs no API key or model download. In MCP use run_demo, then get_job. Narration is attributed in demo credits.
Durable jobs and account controls
list_jobs, get_job, cancel_job and resume_job operate on saved jobs in ~/.local/share/justcaptions (override with JUSTCAPTIONS_STATE_DIR). Resume skips completed files and reuses successful cloud responses. Source files must remain unchanged. An in-flight cloud request can finish and be charged after cancellation. Uncertain cloud requests older than the server replay window require manual usage review rather than silently repeating paid work.
Use estimate_video before recognition, supplying known text_chars for edits. Estimates exclude unknown future text and do not reserve credit. The API reserves capacity atomically for concurrent requests and all dedicated keys share one account's allowance. Manage monthly spend limits, scoped keys, expiry and revocation at https://justcaptions.com/api/account/. Existing charges and running holds are not removed by lowering a limit.
Setup/export statistics are optional. JUSTCAPTIONS_METRICS_ID enables the counters included in copied configurations only when a website visitor opts in. No file paths, captions or API keys are sent by these counters. To disable an installed client's reporting, remove that variable and restart the MCP server.
Distribution
Install a standard wheel from the latest GitHub release:
pip install https://github.com/SpaceSheepBoy/justcaptions-skill/releases/download/v1.3.1/justcaptions_agent-1.3.1-py3-none-any.whlGitHub Actions builds and checks wheel/sdist artifacts, attaches them to releases and publishes server.json to the official MCP Registry using GitHub OIDC. PyPI publishing uses a trusted publisher when the owner enables it; the website uses the release wheel until that registration is completed.
PyPI pending trusted publisher configuration: project justcaptions-agent; GitHub owner SpaceSheepBoy; repository justcaptions-skill; workflow release.yml; environment pypi. After registration, enable repository variable PYPI_PUBLISH_ENABLED=true and rerun the release workflow.
Available Tools
12 toolscancel_jobAInspect
Stop owned local rendering and pending files. An in-flight cloud request may finish and be charged; its response is cached for resume.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state the safety profile (readOnly/destructive/idempotent hints), whereas the description adds genuinely non-derivable behavior: an in-flight cloud request may still complete and be charged, and its response is cached for later resume. That cost/irreversibility context is exactly what an agent needs and is not in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, with the scope/action front-loaded and the cost caveat second. Every clause carries information; there is no padding or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema is present so return values need not be described, and the description covers the key caveats (partial cancellation, billing, resume caching). The remaining gap is the undocumented job_id and idempotency expectation, minor against an otherwise complete cancel tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter (job_id) with 0% schema description coverage, so the description carries the full burden, yet it never explains what job_id is or where to obtain it. The name is fairly self-evident, but the description adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Stop' plus the resource ('owned local rendering and pending files') makes the cancel intent clear, and the mention of an in-flight cloud request distinguishes behavior from a plain list/get job tool. It never uses the word 'cancel' or the job_id, so the mapping to the tool name is inferred rather than stated, keeping it just under 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: stopping work that is 'owned' and cannot be fully recalled on the cloud side. The cache-for-resume note hints that resume_job is the follow-up path, but no explicit when-to-use or when-not-to-use condition is given, and siblings like resume_job/get_job are not named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
caption_videoAInspect
Start captioning one local video or a folder. Returns a job ID immediately; poll get_job. API recognition sends audio, AI edits send text, and MP4 rendering remains local. captions_path reuses an existing SRT/VTT/JSON without recognition. Original video is preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| burn | No | ||
| size | No | medium | |
| engine | No | auto | |
| length | No | medium | |
| correct | No | ||
| glossary | No | ||
| language | No | ||
| position | No | bottom | |
| style_id | No | word-highlight | |
| overrides | No | ||
| overwrite | No | ||
| safe_area | No | tiktok | |
| input_path | Yes | ||
| output_dir | Yes | ||
| translate_to | No | ||
| captions_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: the call is asynchronous and returns a job ID, audio is transmitted off-machine for API recognition, AI edits send text, MP4 rendering stays local, and the original video is preserved. The privacy/processing split and the non-destructive guarantee are exactly the context an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, dense sentences with the core action and polling contract front-loaded; nothing is padding. Slightly telegraphic phrasing ("API recognition sends audio") costs a little readability but wastes no space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the async flow plus preservation guarantee cover the biggest risks. For a 16-parameter tool, though, the silence on rendering/style/translation options and on overwrite versus preserve behavior leaves real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 16 parameters, so the description must carry the load, and it explains only two: captions_path's bypass behavior and the implicit engine split (api vs local). The remaining 14 parameters (burn, size, length, correct, glossary, language, position, style_id, overrides, overwrite, safe_area, translate_to, input_path, output_dir) get no semantics at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Start captioning one local video or a folder") and immediately clarifies the async contract ("Returns a job ID immediately; poll get_job"). No sibling tool does captioning, and it names get_job as the poll target, so an agent can place it precisely in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: start the job here, then poll get_job; and states the alternate entry path ("captions_path reuses an existing SRT/VTT/JSON without recognition") that skips recognition. It does not state when not to use it or contrast engine choices as a decision rule, so it falls short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_environmentARead-onlyIdempotentInspect
Check media tools, fonts, API-key availability and offline recognition. Never returns the key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the description adds a genuinely useful, non-obvious security disclosure: 'Never returns the key.' That is exactly the kind of extra context annotations cannot express, though it says nothing about non-key output or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler: what is checked is front-loaded, and the security caveat follows. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the inspected surface plus a security note. The main gap is the absence of usage context, which is already penalized under usage guidelines; otherwise the definition is sufficient to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so per the rubric the baseline is 4. The description adds nothing parameter-related because there is nothing to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('check') and enumerates exactly what is inspected: media tools, fonts, API-key availability, and offline recognition. It is a clear diagnostic purpose, though it does not explicitly differentiate itself from the font/style-listing siblings like list_fonts and list_styles, which superficially overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives, nor any prerequisite or workflow context (e.g., 'run before caption_video to verify required binaries'). The agent must infer the diagnostic use case entirely from the content list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_videoARead-onlyIdempotentInspect
Estimate cloud cost before transcription. Audio is measured locally; supply known text_chars for editing/translation, otherwise their cost is excluded. Does not reserve credit.
| Name | Required | Description | Default |
|---|---|---|---|
| input_path | Yes | ||
| text_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, but the description adds non-obvious facts beyond them: that audio is measured locally and that no credit is reserved. The 'does not reserve credit' detail is exactly the kind of side-effect clarification an agent needs and is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences; purpose is front-loaded, followed by the parameter behavior and the no-reservation guarantee. No filler and nothing repeated from schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description only needs purpose, the one non-obvious parameter, and side effects — all of which it provides. Marginally incomplete in that it never frames this against the actual-usage tool get_usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it explains text_chars meaningfully: it only contributes to the estimate when supplied, otherwise that cost is excluded. input_path is left unexplained, but its meaning is self-evident, so coverage is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Estimate cloud cost before transcription'), which is distinct from every sibling (get_usage reports actual usage, caption_video does work). It stops short of naming the tool it contrasts with, so it is clear but not fully sibling-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a conditional instruction for supplying text_chars ('supply known text_chars for editing/translation, otherwise their cost is excluded'), which is genuinely useful usage context. However, it never says when to call this estimator at all versus alternatives like get_usage or preview_style, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobBRead-onlyIdempotentInspect
Read a saved caption job, including verified outputs and per-file failures.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful content context ('verified outputs and per-file failures'), but says nothing about error behavior when the job_id is unknown or what state a job must be in to be readable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource first and no filler. Every clause earns its place by adding return-content detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated in the description, and the annotations carry the safety profile. For a one-parameter read tool this is nearly complete; the only shortfall is the unexplained job_id, which the description leaves entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the sole parameter job_id carries no description. The description does not explain where the job_id comes from or its format, so it fails to compensate for the schema gap on the one parameter that matters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('saved caption job'), and adds scope detail (verified outputs, per-file failures) that separates it from list_jobs, cancel_job, and resume_job. It does not explicitly name a sibling, but the single-job read framing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a saved caption job' implies fetching a specific existing job (e.g., after caption_video) rather than enumerating them, which implicitly distinguishes it from list_jobs. However, it gives no explicit when-to-use condition, no prerequisite for obtaining the job_id, and no stated exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageARead-onlyIdempotentInspect
Read cloud API usage and estimated monthly charges. Requires a locally configured API key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered. The description adds one genuinely useful behavioral fact outside the annotations — the API-key prerequisite — but says nothing about rate limits, freshness of the usage data, or billing-period semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, with the core purpose front-loaded and the requirement trailing as a qualifier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations carry the safety profile. Combined with the auth prerequisite, the definition is nearly sufficient, missing only a note on how current the monthly estimate is or when it fails.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate and the schema is trivially complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading cloud API usage plus estimated monthly charges. No sibling (list_jobs, estimate_video, check_environment, etc.) overlaps with usage/billing reporting, so the tool is easily told apart, though the description never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a precondition ('Requires a locally configured API key') but no when-to-use guidance, no alternatives, and no indication of what to do if the key is absent. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fontsARead-onlyIdempotentInspect
List bundled named fonts, IDs, licenses and script coverage for local rendering. Pass overrides={"font_id": "anton"} to preview_style or caption_video.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, idempotentHint, destructiveHint false), so the bar is low. The description adds useful context beyond them: fonts are bundled and intended for local rendering, and the IDs are meant to be consumed by other tools. It doesn't note any availability constraints, which is the only gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler; the resource and its payload are front-loaded and the follow-up action is second. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be spelled out, and with no input parameters there is nothing else to document. The description supplies the remaining needed context: what the IDs are for and where to use them next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline a 4 applies. The description's only parameter-like content refers to other tools' overrides argument, not its own, which is appropriate rather than redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (bundled named fonts) and enumerates the returned attributes (IDs, licenses, script coverage), which distinguishes it from the sibling list_styles. An agent can tell at a glance this is the font-inventory tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit downstream usage path: feed a font_id as overrides to preview_style or caption_video. It does not state when not to use it or name a conflicting alternative, but for a zero-param discovery tool the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsBRead-onlyIdempotentInspect
Find durable jobs after reconnecting, including jobs interrupted by a process restart.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds useful durability context (jobs surviving/interrupted by a restart), but says nothing about pagination, result caps, or the default limit despite there being an output schema it could complement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence, front-loaded with the primary context. Nothing is wasted, though the phrasing is slightly indirect for a list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-param list tool with an output schema (so return values need not be explained), the description covers the trigger scenario adequately. It still omits the meaning of the limit parameter and any paging behavior, leaving a small but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'limit' parameter is undocumented in both schema and description. With low coverage the description is expected to compensate, but it makes no mention of result count or paging behavior at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (durable jobs) and a use scenario, but the verb 'Find' is softer than the tool's actual list semantics and it never states that it returns a collection of jobs. It does not explicitly distinguish itself from the sibling get_job, so an agent must infer the list-vs-single distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a genuine trigger context ('after reconnecting', jobs interrupted by a restart), which is more than most tools offer. However, it never states when not to use it or points to get_job for retrieving a specific job, leaving the alternative-selection decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_stylesBRead-onlyIdempotentInspect
Return 15 portable presets, supported overrides, aliases and conservative platform safe areas.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context — a fixed count of 15, 'portable', and 'conservative platform safe areas' — but says nothing about ordering, stability, or whether the set is platform-dependent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler or repetition. It is slightly overloaded (four distinct concepts packed into one clause), but everything stated is informative and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the zero-parameter surface keeps complexity low. However, for a discovery tool that agents will call to decide what to render, the absence of any usage/routing guidance leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly implies a no-argument call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and enumerates what comes back: portable presets, supported overrides, aliases and platform safe areas. An agent can tell this is an enumeration/listing tool rather than a mutating one, though the domain term 'styles' itself is never defined and no sibling (e.g. preview_style) is contrasted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all. With siblings like preview_style, check_environment and list_fonts present, the description never says when to call list_styles versus those alternatives, nor any prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_styleBRead-onlyIdempotentInspect
Return a caption PNG preview with a neutral backdrop. Does not call a paid API.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | large | |
| text | No | Make your next video stand out | |
| width | No | ||
| height | No | ||
| position | No | bottom | |
| style_id | No | word-highlight | |
| overrides | No | ||
| safe_area | No | tiktok |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the cost-side-effect fact ('does not call a paid API') and the output nature (caption PNG on a neutral backdrop), which is useful context, but omits output format details or any constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and followed by the key distinguishing trait. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 undocumented parameters, no output schema, and zero schema description coverage, the description is too thin to call it correctly. It doesn't explain what the parameters control or what the returned PNG will depict beyond 'caption on neutral backdrop'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 8 parameters, and the description mentions none of them. Opaque parameters like 'overrides', 'style_id', 'safe_area', and 'position' are left completely undefined, so the description does not compensate for the coverage gap at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return a caption PNG preview with a neutral backdrop.' An agent can tell it produces an image preview rather than a video render (caption_video) or a style listing (list_styles). It does not, however, explicitly name or differentiate itself from siblings like estimate_video or run_demo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Does not call a paid API' implies this is a cheap, safe way to preview before invoking a paid render, which is a usable when-to-use signal. But it never states explicit conditions or names an alternative tool, leaving the routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_jobAInspect
Resume an interrupted/cancelled/failed job. Completed files are skipped, failed files alone are retried, and successful cloud responses are reused.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-idempotent, non-destructive write. The description goes further by disclosing the partial re-execution model: completed files are skipped, only failed files are retried, and successful cloud responses are reused. That is real behavioral value beyond the structured hints, though it says nothing about permissions, cost, or what happens if the job is already complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence stating the action, the eligible job states, and the resume semantics, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the core resume semantics well for a one-parameter mutation tool. It is slightly incomplete on preconditions and on behavior when the target job is already finished.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter job_id, so the description technically fails to compensate. The parameter is self-evident from its name and the resource, so no format or sourcing detail (e.g., where to obtain the id) leaves an agent materially blocked, but the baseline remains 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ("Resume") and resource ("job") and narrows the applicable job states to interrupted/cancelled/failed, which lets an agent separate it from get_job, list_jobs, and cancel_job. It never explicitly contrasts itself with those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the state qualifier (resume only a job that is interrupted, cancelled, or failed), which is genuinely useful context. However, there is no explicit guidance on prerequisites (e.g., must the job still exist or be in a resumable state) and no named alternative such as get_job for checking status first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_demoBInspect
Export the bundled 6-second human-narration sample with animated captions. No API key, upload or model download required. Credits are bundled with the sample.
| Name | Required | Description | Default |
|---|---|---|---|
| style_id | No | word-highlight | |
| output_dir | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it non-read-only, non-idempotent and non-destructive, so the safety profile is partly covered. The description adds genuinely useful behavioral context not in the annotations - that no API key is needed and credits are bundled (cost implications). It does not disclose where the file lands or what happens on repeated runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler - the core action leads and the setup/cost caveats follow. Appropriately sized for a simple demo tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the tool's purpose and prerequisites are clear. Still, the two parameters - notably style_id's semantics and output_dir's role - remain unexplained, which is a real gap for a tool that writes a file somewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: neither style_id (with default 'word-highlight') nor the required output_dir is documented anywhere, and the description never mentions them. It therefore fails to compensate for the schema gap, leaving both parameters opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Export) and resource (bundled 6-second human-narration sample with animated captions), and the 'bundled sample / no upload' framing implicitly distinguishes it from caption_video, which processes user footage. It does not explicitly name that sibling, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'no API key, upload or model download required' and 'credits bundled' lines imply a zero-setup trial/evaluation use case, which is useful context. However, there is no explicit statement of when to prefer this over caption_video or when it is inappropriate, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.4.0- First observed
cancel_job - First observed
caption_video - First observed
check_environment - First observed
estimate_video - First observed
get_job - First observed
get_usage - First observed
list_fonts - First observed
list_jobs - First observed
list_styles - First observed
preview_style - First observed
resume_job - First observed
run_demo
TDQS
Scored across 12 tools
Each tool has a distinct action+resource: preview_style vs caption_video, get_job vs list_jobs, and cancel_job vs resume_job are clearly separated by description. The only mild overlap is check_environment vs get_usage, both touching API-key/cloud concerns, but their descriptions distinguish diagnostics from billing. An agent can reliably pick the right tool.
All 12 tools follow a uniform snake_case verb_noun pattern (check_environment, list_styles, get_job, cancel_job, resume_job, estimate_video, etc.). The convention is applied consistently with no camelCase or stylistic drift. Highly predictable.
Twelve tools sit squarely in the well-scoped 3-15 range, and each earns its place across config (list_styles/list_fonts), diagnostics (check_environment), execution (caption_video), lifecycle (get_job/list_jobs/cancel_job/resume_job), cost (get_usage/estimate_video), and demo (run_demo). No redundancy or filler.
The surface covers the full captioning lifecycle: discovery (styles/fonts/environment), estimation, creation, polling, cancellation, and resumption, plus a cost-free demo. The only notable gap is a delete/cleanup operation for finished jobs, which agents could work around but would round out the surface.
Maintenance
Related MCP Connectors
Transcribe TikTok, Instagram Reels, X, Facebook and MP4 videos to text with Whisper.
Generate SRT and VTT subtitles for any video or audio file, 99 languages.
Transcribe social videos, selected comments, URL batches and Instagram channels.
Transcribe Instagram Reels, Facebook, X and Reddit videos, podcasts (RSS, Apple) and any video URL.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceAn MCP server that automatically transcribes video content and burns stylized captions directly into the video file. It leverages the Groq Whisper API for fast transcription and supports multiple visual styles tailored for social media and professional content.-
- AlicenseNot gradedqualityDmaintenanceEnables AI to transcribe Japanese talk videos, edit subtitles with filler removal and timing correction, and export SRT files using local Whisper models.MIT
- AlicenseAqualityCmaintenanceEnables MCP clients to transcribe audio/video files locally, generate SRT subtitles, and burn captions into videos via tool calls, without a cloud API.3MIT
- 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














