Check generated audio, video and stills for defects. Returns a verdict, not more media.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
The worst bugs in generated media don't throw.
"the audio often cuts off the final sentence [β¦] though the API returns success without error signals"
β a developer on the OpenAI forum, April 2026, describing production output

If you generate speech or video with a model β TTS, voice agents, podcasts, avatars, AI video β your tests catch the exception that never happens. They do not catch the narration that reads at 300 words per minute, the voice track sitting 18 dB below the footage it's cut against, the clip that rendered at 42% length and got cached as a success, the captions that describe the audio three seconds before it happens, or the file whose audio track is missing entirely.
The 2026 state of the art for catching these is a person listening to the output. That works, and it costs more than everything else in your pipeline combined.
rendercheck makes them throw.
Plain assert functions. No framework, no runner, no service. They raise
AssertionError, so they already work in pytest, in CI, or in a five-line
script. Eighteen of the nineteen checks have no dependencies and make no
network calls β if you have ffmpeg, you're ready.
You need ffmpeg on your PATH (brew install ffmpeg, apt-get install ffmpeg,
or winget install ffmpeg). Then:
Or drop a file into the playground β same checks, running on ffmpeg compiled to WebAssembly, nothing uploaded.
demo synthesises ten defective files and runs the real checks against them,
so you can see it fire without owning a broken render. Verbatim, first two of
eight:
β¦and one of the two added in 0.3.0:
Then point it at your own output:
Exit code is 1 if anything failed β or if nothing could be measured, because
a run that looked at nothing is not a clean one. A path you typo'd exits 2.
--json gives you the same report for pipelines in any language, and --strict
rejects partial runs too.
"How loud should this be?" has no single answer β it depends entirely on where
the file ends up, and every platform publishes a different number. --preset
turns that table into something a build can enforce:
None of those numbers are ours. The contribution is that --preset ebu is a
decision a reviewer can read, where --target-lufs -23 is a magic number the
next person will not dare touch. A preset that states a ceiling also switches on
the true-peak check, which catches a master measuring clean locally and
distorting after upload. web exists only to name the built-in defaults, so
it states none and behaves exactly like passing no preset at all.
Project-wide settings go in rendercheck.toml (or [tool.rendercheck] in
pyproject.toml) so a CI step is not eight flags on one line:
Flags you type still beat the file, and the file beats the built-in defaults.
In pytest they're just asserts β no plugin, no fixtures:
For one of the nineteen checks, roughly yes. None of these measurements are novel, and it would be dishonest to imply otherwise:
| The measurement | Already available from |
|---|---|
| Integrated loudness, true peak | pyloudnorm, ffmpeg's loudnorm |
| Silence detection | pydub.silence, ffmpeg's silencedetect |
| Duration, stream layout, frame rate | ffprobe |
| Black frames, freezes | ffmpeg's blackdetect, freezedetect |
| Captionβaudio offset | ffsubsync β which corrects it |
| Container and codec conformance | MediaConch β policy-driven, pass/fail, from the CLI |
| Speaker identity | resemblyzer |
| Video quality metrics | VMAF, ffmpeg-quality-metrics |
Most of those hand a number to a researcher. The two that are already gates gate a different thing: MediaConch checks that a file conforms to a container policy, which is a preservation question, not a perceptual one β a file can pass every MediaConch rule and still be narrated at 300 WPM. ffsubsync will happily realign captions that were never wrong, because it has no opinion about whether they needed it.
What is actually missing, and what this is:
Against the LLM-eval tools the difference is structural rather than a matter of coverage. promptfoo, DeepEval and RAGAS are excellent and none of them can do this: their test case is a string. There is no assertion to add, because there is nowhere to put the file. Use them for the script; use this for what the script turned into.
And if you already run broadcast QC β Interra BATON, Telestream Vidchecker, QCTools β you have had most of this for twenty years. It just isn't in your git hooks.
GitHub Actions β installs ffmpeg and fails the build on a defect:
Node, Remotion, anything that renders in a build step:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/rendercheck)<a href="https://allmcps.com/mcp/rendercheck"><img src="https://allmcps.com/api/badge/rendercheck?style=directory" alt="Rendercheck on AllMCPs" /></a>