mediakit-mcp
Wraps ffmpeg and ffprobe to provide intent-level media inspection and processing tools, including converting, compressing to target sizes or service-specific presets, trimming, extracting audio or frames, creating GIFs, concatenating clips, and transforming video/audio with dry-run previews and safety controls.
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., "@mediakit-mcpCompress demo.mp4 to fit Discord's 10 MB limit."
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.
mediakit-mcp
Everyday media jobs for your AI agent: say what you want, not which ffmpeg flags to use.
mediakit-mcp is an MCP server that wraps ffmpeg in nine
intent-level tools: compress a video to fit Discord's 10 MB limit, turn a clip into a GIF, pull the
audio out, cut a section, grab thumbnails, join clips. The agent never has to remember
-c:v libx264 -pass 1 -passlogfile ...; you get the result and a short report, not a screen of
ffmpeg log.
Every tool has a dry run that returns the exact ffmpeg command it would execute, and nothing is ever overwritten unless you say so.
The PyPI package is
mediakit-mcp(the nameffmpeg-mcpwas already taken by another project). The GitHub repository isffmpeg-mcp.
What it looks like
Real output from the test suite:
> compress video.mp4 target_mb=1
Wrote C:\clips\video.compressed.mp4
size: 21.23 MB -> 0.93 MB (4% of the original)
duration: 6.02s | video: h264 640x360 | audio: aac
target 1 MB: met
note: two-pass encode: video 1200 kb/s, audio 128 kb/s
took 1.1s
> compress video.mp4 preset=discord-10mb dry_run=true
DRY RUN: nothing was executed. This is what would run:
Step 1/2 (analysis pass):
C:\...\ffmpeg.exe -hide_banner -nostdin -loglevel error -nostats -progress pipe:1 -y -i C:\clips\video.mp4 -map 0:v:0 -c:v libx264 -preset medium -b:v 1200000 -pix_fmt yuv420p -maxrate 1200000 -bufsize 2400000 -pass 1 -passlogfile ... -an -f null -
Step 2/2 (encode pass):
...Related MCP server: ffmpeg-mcp
Install
You need ffmpeg and ffprobe on PATH (or pointed to by FFMPEG_PATH / FFPROBE_PATH):
OS | Command |
Windows |
|
macOS |
|
Debian/Ubuntu |
|
Use a full build: the server needs libx264, libvpx-vp9, libopus and libmp3lame, and tells you which one is missing if it isn't there.
Claude Code
claude mcp add mediakit -- uvx mediakit-mcpClaude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"mediakit": {
"command": "uvx",
"args": ["mediakit-mcp"]
}
}
}Restrict it to the folders you work in (recommended):
{
"mcpServers": {
"mediakit": {
"command": "uvx",
"args": ["mediakit-mcp", "--dir", "C:\\Users\\you\\Videos", "--dir", "C:\\Users\\you\\Downloads"]
}
}
}Or with pip: pip install mediakit-mcp, then run mediakit-mcp.
Try asking
"What's in
C:\Videos\demo.mp4?""Compress demo.mp4 so I can send it on Discord." (
preset=discord-10mb)"Get this under 25 MB for email."
"Make a GIF of the first 4 seconds of demo.mp4, 480 px wide."
"Cut from 1:20 to 1:45 and keep the quality." / "...fast, I don't need it frame-exact."
"Extract the audio as an mp3 at 192k."
"Give me a thumbnail every 30 seconds."
"Join part1.mp4 and part2.mp4."
"Make it 720p wide and play it at 1.5x."
"Show me the ffmpeg command you'd use to convert this to webm, but don't run it."
Tools
Tool | What it does |
| ffprobe summary: container, duration, size, bitrate, every stream (codec, resolution, fps, sample rate, channels). |
| To mp4, mov, mkv (H.264+AAC), webm (VP9+Opus), mp3, wav, flac, ogg, m4a, opus, aac, or a short gif. |
|
|
|
|
| mp3, wav, flac, ogg, m4a, opus, aac, or |
| Palette-based GIF (palettegen + paletteuse). |
| PNG/JPG stills at |
| Joins same-codec clips without re-encoding; says exactly which property differs if they don't match. |
| Resize ( |
Every tool except media_info also takes output, overwrite (default false), dry_run and
timeout_s. Outputs go next to the input with a derived name: clip.mp4 becomes
clip.compressed.mp4, clip.trimmed.mp4, clip.gif, clip.audio.mp3, clip.frames/.
How compress hits a size
For target_mb=T and duration D: the total bitrate budget is T * 1 MiB * 8 * 0.95 / D (the 5%
is a margin for container overhead and rate-control error; VP9 uses 10%). Audio gets 128 kb/s, or
less if that would eat more than a quarter of the budget, and the rest goes to video. The video is
encoded in two passes with a peak cap, and if the bitrate works out below about 0.045 bits per pixel
per frame the resolution steps down a ladder (1080, 720, 480, 360, ...) rather than producing mush.
A target that is impossible even at minimum quality is an error that says how big the file would
need to be. The result always says whether the target was met. In the test suite, targets from
0.5 to 10 MB landed at 91-97% of the target.
email-25mb aims at 18 MB because attachments grow by about 37% when mailed (base64).
Safety
No shell. ffmpeg is started with an argument list, so file names with spaces, quotes or
; & |cannot inject anything. Dry-run output is quoted for pasting into cmd or PowerShell.Never overwrites by default. An existing output is an error unless
overwrite=true. ffmpeg writes toname.partial.extand the file is renamed only on success, so a failed or cancelled run leaves no half-written file and does not damage an existing one.Directory allow-list. Start with
--dir DIR(repeatable) orMEDIAKIT_ALLOWED_DIRS(separated by;on Windows,:elsewhere) and every input and output path must resolve inside one of them...and symlinks are resolved first. Without it, the server can read and write any file the user can, which is what a local ffmpeg tool normally does.Bounded runs. Each job has a timeout (default 900 s). On timeout, or when the client cancels the call, ffmpeg's whole process tree is killed and temporary files are removed.
Progress, not log spam. ffmpeg runs with
-loglevel error; progress arrives as MCP progress notifications, and a failure returns only the last few relevant stderr lines.It does not touch the network: it only runs
ffmpegandffprobe. Input names can't be turned into options because every path is resolved to an absolute path first.
Limits
concatjoins without re-encoding, so the clips must match. Useconvert/transformfirst if they don't.trim mode="fast"can only cut on keyframes, so the clip may start a little early.Hardware encoders (NVENC, QSV, VideoToolbox) are not used; software x264/VP9 is slower but consistent everywhere.
dry_runstill runsffprobeon the input (read-only) so that the command it prints is the real one.Only the first video and audio stream of a file are used.
Tests
uv sync --extra test
uv run ruff check src tests && uv run mypy --strict src
uv run pytest testsThe tests generate real media with ffmpeg's lavfi sources (testsrc2, sine), run every tool,
and check the results with ffprobe: durations within tolerance, sizes under their targets, codecs,
GIF frame counts, odd dimensions, no-audio inputs, corrupt and truncated files, existing outputs.
The runner is tested against real processes (progress, timeout, cancel, killing a grandchild
process), and tests/test_stdio_handshake.py launches the installed server over stdio and calls
every tool through MCP, including cancelling a running job.
Learn how it's built
ffmpeg-mcp-the-hard-way builds a minimal version of this server in seven modules.
License
MIT
Available Tools
9 toolscompressA
Make a video smaller. Three ways to say how:
target_mb: aim for a file size in MB (MiB). Uses a two-pass encode with bitrate maths (video bitrate = target size / duration - audio, with a 5% safety margin) and lowers the resolution automatically when the bitrate would be too low to look decent. The result reports whether the target was met; errors if the target is impossibly small.
preset: discord-10mb, discord-50mb, whatsapp (16 MB, 720p max), email-25mb (aims at 18 MB because attachments grow ~37% when mailed), or web (quality-based, 1080p max).
neither: a quality-based (CRF) re-encode controlled by quality low|medium|high.
max_height: never exceed this height in pixels. output ending in .webm uses VP9/Opus, otherwise H.264/AAC (default output: name.compressed.mp4 next to the input). overwrite: replace an existing output. dry_run: return the ffmpeg commands (both passes) without running them. timeout_s: stop after this many seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| output | No | ||
| preset | No | ||
| dry_run | No | ||
| quality | No | medium | |
| overwrite | No | ||
| target_mb | No | ||
| timeout_s | No | ||
| max_height | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: two-pass encoding, bitrate math with a 5% margin, automatic resolution lowering, reporting whether the target was met, erroring on impossible targets, codec selection driven by output extension, and the default output filename. Remaining gaps are behavioral edge cases such as what happens when the output path already exists and overwrite=false, and whether audio/subtitle streams are preserved beyond the bitrate subtraction. That is strong but not exhaustive disclosure for a 9-parameter mutation tool.
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?
Front-loaded with the outcome, then organized as a bullet per mode, followed by a compact pass over the remaining parameters. The bitrate-maths parenthetical is dense but it explains why resolution gets lowered, so it earns its place. No filler sentences.
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?
Nine parameters, no annotations, and an output schema that already covers return values — given that, the description supplies nearly everything needed to call the tool correctly. The one real hole is conflict resolution: it never says what happens if both target_mb and preset are provided, or whether quality is ignored when a preset is used (only implied by "neither").
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 schema declares no enums, so the description must supply all parameter meaning — and it does, covering target_mb, preset (with all five valid values and their caps), quality (low|medium|high), max_height, output (extension-to-codec mapping plus default), overwrite, dry_run, and timeout_s. Only the trivially obvious input is left undocumented. This fully compensates for the empty schema descriptions.
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?
"Make a video smaller" is a concrete verb+resource that an agent can distinguish from convert, trim, or extract_audio without opening the schema. The three named strategies (target_mb, preset, quality) further pin down what kind of operation this is. It stops short of explicitly contrasting itself with any sibling, which keeps it from 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?
The description lays out three mutually exclusive selection modes and what each is for, including the case of supplying neither (CRF re-encode via quality), which is exactly the decision an agent must make. It adds useful failure context ("errors if the target is impossibly small"). It gives no guidance on when to prefer a sibling tool such as convert instead, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
concatA
Join clips end to end without re-encoding (fast and lossless).
The clips must share codec, resolution, pixel format, frame rate and audio parameters (for example several recordings from one camera or pieces made by trim). If they differ, the error says exactly which property differs; convert/transform them to match first. Default output: first.concat.ext next to the first input.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | Yes | ||
| output | No | ||
| dry_run | No | ||
| overwrite | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the no-re-encoding guarantee, the fact that mismatches fail with a diagnostic naming the differing property, and the default output location. It stops short of stating whether existing files are clobbered by default, what dry_run does, or how timeout_s is enforced.
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?
The core capability is front-loaded in the first clause, followed by the precondition and the failure/remediation note. No redundant sentences; the default-output remark is the only optional detail and it is genuinely useful.
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 prose, and the hardest thing to get right — matching stream parameters before concatenation — is covered thoroughly. For a file-writing tool with zero annotations, the missing explanation of overwrite and dry_run semantics is the notable remaining 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%, so the description must compensate and it only partially does: it explains the constraints on 'inputs' and the default naming rule for 'output'. The three remaining parameters (dry_run, overwrite, timeout_s) are given no meaning beyond their names and defaults.
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 ('Join clips end to end') plus a defining technical property ('without re-encoding, fast and lossless'). This clearly separates it from siblings like trim, convert, and transform, which alter or slice media rather than concatenate it.
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 the positive condition (clips joined end to end) and the hard prerequisite (shared codec, resolution, pixel format, frame rate, audio parameters). It also names the remediation path explicitly — convert/transform them to match first — routing the agent to the correct siblings when the precondition fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convertA
Convert a file to another format with sensible codecs.
Video: mp4/mov/mkv (H.264 + AAC), webm (VP9 + Opus). Audio: mp3, wav, flac, ogg, m4a, opus, aac. gif: the first 5 seconds (use make_gif for control). Choose the target with format (e.g. "webm") or by the extension of output; the default output sits next to the input.
quality: low | medium | high (trades size for fidelity). For a size limit use compress. overwrite: replace an existing output (default: refuse). dry_run: return the ffmpeg command instead of running it. timeout_s: stop ffmpeg after this many seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| format | No | ||
| output | No | ||
| dry_run | No | ||
| quality | No | medium | |
| overwrite | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden; it does disclose key defaults: output lands next to the input, overwrite refuses by default, dry_run returns the ffmpeg command rather than executing, and timeout_s kills ffmpeg. It omits failure behavior, whether partial outputs are cleaned up, and any permission or resource constraints for a long-running ffmpeg invocation.
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?
Front-loaded purpose sentence followed by a compact format inventory and a param-by-param block; no filler. The format enumeration is dense but scannable and each clause carries distinct 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?
An output schema exists, so return values need no prose; the description instead spends its budget on defaults and failure-adjacent knobs (overwrite, timeout_s, dry_run), which is the right allocation for a mutating media tool with no annotations. Only error/cleanup behavior remains uncovered.
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 must compensate, and it largely does: format vs. output extension precedence, quality's low/medium/high trade-off, overwrite default-refuse, dry_run return semantics, and timeout_s behavior. Only `input` (accepted path/URL forms) is left unelaborated, which keeps it from a 5.
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 clear verb+resource ("Convert a file to another format") and enumerates supported target families (mp4/mov/mkv, webm, mp3/wav/flac, gif). It actively distinguishes itself from two siblings by name — make_gif for gif control and compress for size limits — so an agent can route without opening schemas.
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 explicit alternative routing for two cases: gif trimming (use make_gif) and size-limited output (use compress). No guidance on when to prefer extract_audio, transform, or concat over converting, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_audioB
Pull the audio track out of a video (or re-encode an audio file).
format: mp3 (default), wav, flac, ogg, m4a, opus, aac, or "copy" to keep the original audio stream untouched (fast, lossless; picks the matching extension). bitrate: for lossy formats, e.g. "192k" (overrides quality). Fails clearly if the input has no audio. Default output: name.audio.mp3 next to the input.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| format | No | mp3 | |
| output | No | ||
| bitrate | No | ||
| dry_run | No | ||
| quality | No | medium | |
| overwrite | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does supply useful behavior: it fails clearly when the input has no audio, it states the default output path and naming convention, and it notes that 'copy' is fast and lossless while bitrate overrides quality. It is silent, however, on the risk-relevant flags present in the schema — overwrite (a destructive write), dry_run (preview), and timeout — so the agent cannot infer side effects from the text.
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?
Front-loaded with the purpose, then structured as labeled facts (format, bitrate, failure mode, default output). Dense but every line is informative; the format enumeration earns its length precisely because the schema has no enum for it. Minor redundancy in the parenthetical asides.
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. But for an eight-parameter file-writing tool with zero annotation coverage, the omission of overwrite and dry_run semantics is a real gap an agent needs before invoking it safely.
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 must compensate for eight parameters. It does well on format (full enumerated value list plus default) and bitrate ('192k' example), and explains the default output naming, but says nothing about input, quality (default 'medium'), overwrite, dry_run, or timeout_s — leaving five parameters undocumented anywhere.
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 — 'Pull the audio track out of a video (or re-encode an audio file)' — which is immediately actionable. It does not, however, distinguish itself from the sibling 'convert', which plausibly overlaps with the re-encode case, so the agent gets no explicit routing signal.
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 only implied: the parenthetical hints that this doubles as an audio re-encoder, and 'copy' is framed as the fast/lossless option. There is no explicit 'use this when… / use convert instead when…' guidance, and no mention of when to prefer extract_frames or compress.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_framesA
Save still images (thumbnails) from a video.
Either times (a list like [1, 12.5, "0:01:30"]: one image per time) or every_s (one image every N seconds, starting at 0). With neither, one frame from the middle. format: png (default) or jpg. width: resize to this width (aspect kept). max_frames guards against producing thousands of files. Images go to output_dir (default: a "name.frames" folder next to the input) as name.frame-12.5s.png or name.frame-0001.png.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| times | No | ||
| width | No | ||
| format | No | png | |
| dry_run | No | ||
| every_s | No | ||
| overwrite | No | ||
| timeout_s | No | ||
| max_frames | No | ||
| output_dir | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose useful behavior: default output directory ('name.frames' beside the input), the exact output filename patterns, and that max_frames exists to prevent thousands of files. However it never mentions `overwrite` (default false — what happens to existing files?), `dry_run`, or `timeout_s`, all of which materially affect a tool that writes files to disk.
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?
The mode-selection logic is front-loaded in the first two sentences and the remaining details are packed into short parenthetical clauses with no filler. The heavy use of inline parentheses makes it denser to scan than a bulleted layout would be, but nothing is redundant.
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 frame-selection and naming behavior is well covered. For a 10-parameter tool with zero annotations that writes files to a directory, leaving overwrite semantics, dry_run and timeout unaddressed is a real gap an agent would have to guess about.
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 10 parameters, so the description must compensate and largely does: it explains `times` accepts numbers or timestamp strings like "0:01:30", `every_s` starts at 0, `format` defaults to png, `width` preserves aspect ratio, and where `output_dir` points by default. Three parameters — dry_run, overwrite, timeout_s — get no explanation at all, so the coverage is good but incomplete.
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 opening line gives a precise verb and resource: 'Save still images (thumbnails) from a video.' That unambiguously separates it from siblings like extract_audio, make_gif and trim without needing to name them. It stops short of explicitly routing against a sibling, so it is clear but not sibling-differentiated by name.
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 clearly explains the three mutually exclusive modes — explicit `times`, uniform `every_s` sampling, or the fallback single middle frame — which is exactly the decision an agent must make before calling. It gives no guidance on when to prefer this tool over transform/make_gif, so it is strong on intra-tool context but silent on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_gifA
Make a high-quality animated GIF from a video (two-step palette: palettegen + paletteuse).
start: where to begin (default 0). duration: seconds to capture (default 5, max 30; it is shortened if the clip ends sooner). fps 1-30 (default 12). width in pixels (default 480, height keeps the aspect ratio; never upscaled). loop: repeat forever (default true). GIFs grow fast: for long clips use convert to mp4/webm instead.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| loop | No | ||
| input | Yes | ||
| start | No | ||
| width | No | ||
| output | No | ||
| dry_run | No | ||
| duration | No | ||
| overwrite | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose real behavior: the two-pass palette approach, duration being shortened when the clip ends early, no upscaling, and that output size grows fast. It says nothing about file-writing semantics, however — overwrite behavior, where output lands when omitted, what dry_run does, or timeout handling — which matters for a tool that writes a file by default.
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 framing sentence followed by terse per-parameter clauses with defaults and hard limits, then a closing caution — front-loaded and free of filler. Every clause carries information an agent cannot get from the schema.
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 exists, so return values need no explanation, and the description covers the creative/quality parameters well. The gap is the file-management and safety surface (output path, overwrite, dry_run, timeout) on a ten-parameter, annotation-free mutation 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?
Schema coverage is 0%, so the description must supply all parameter meaning; it documents five of ten (start, duration with the 30s cap, fps range 1-30, width with aspect-ratio and no-upscale rules, loop). It leaves the required `input` parameter and output, dry_run, overwrite, and timeout_s entirely unexplained, so it only half compensates for the coverage gap.
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?
"Make a high-quality animated GIF from a video" is a specific verb plus resource, and the parenthetical naming the palettegen/paletteuse technique tells an agent exactly what pipeline it triggers. It also implicitly separates itself from the still-image and re-encode siblings by routing long clips to convert.
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 final sentence gives an explicit when-not and names the alternative (use convert to mp4/webm for long clips), which is the main misuse risk for a GIF tool. It stops short of covering the other plausible siblings (trim, extract_frames, compress) or stating prerequisites, so it is clear context rather than a full routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_infoA
Summarize a media file with ffprobe: container, duration, size, bitrate, and every stream (codec, resolution, fps, sample rate, channels). Use it first to learn what you have before compressing or converting, and to check results afterwards.
input: path to an audio/video/image file.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the burden. It discloses the underlying implementation (ffprobe) and the full content of the report, and the framing as 'learn what you have' / 'check results' makes clear this is a non-mutating inspection step. It stops short of explicitly stating the file is not modified or noting any size/format limitations, which is the only gap for an unannotated tool.
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 front-load the action and reported fields, then a terse parameter line. No filler, and the workflow guidance follows immediately after the capability statement.
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 one-parameter inspection tool with an output schema present, the description covers purpose, workflow placement, and the shape of the report, which is everything an agent needs to select and call it correctly. Return-value details are appropriately left to the output 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 coverage is 0%, so the description must compensate, and it does: 'input: path to an audio/video/image file' tells the agent the parameter is a filesystem path and which media categories are accepted. It adds the meaning the bare string-typed 'input' property lacks, though it offers no detail on path conventions or error behavior for unsupported files.
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 ('Summarize a media file with ffprobe') and enumerates exactly what is reported: container, duration, size, bitrate, and per-stream codec/resolution/fps/sample rate/channels. This clearly separates it from the sibling mutation tools (convert, compress, trim, extract_*), which all transform rather than inspect.
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 explicit sequencing guidance: 'Use it first to learn what you have before compressing or converting, and to check results afterwards.' It names the sibling activities (compress, convert) and the two points in the workflow where this tool applies, so the agent does not have to infer precedence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transformA
Resize, crop and/or change the speed of a video (re-encodes with H.264/AAC, or VP9 for .webm).
width / height: target size in pixels; give one and the other keeps the aspect ratio. crop: "W:H" (centered) or "W:H:X:Y" in pixels, applied before resizing. speed: 0.25-4 (2 = twice as fast, 0.5 = slow motion); audio is retimed to match. Default output: name.transformed.ext.
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | ||
| input | Yes | ||
| speed | No | ||
| width | No | ||
| height | No | ||
| output | No | ||
| dry_run | No | ||
| overwrite | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description still carries real behavioral weight: it discloses that the operation re-encodes (a lossy, potentially slow, quality-affecting step), names the codecs, notes audio is retimed with speed changes, that crop applies before resize, and that the default output is name.transformed.ext rather than overwriting the input. The gap is safety semantics — overwrite and dry_run exist in the schema but the description never says what overwrite destroys or that dry_run previews without writing.
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?
Front-loaded with the one-sentence capability statement, then grouped by parameter with each rule compressed into a clause. No filler, no restatement of the tool name, and the units, ranges, and defaults that matter are all present in a very short block.
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 means return values need no explanation, and the transformation semantics are well covered. But for a 9-parameter tool that writes a new media file, the description omits the flags an agent most needs to reason about safely (dry_run, overwrite, timeout_s) and says nothing about format inference from the output extension or failure conditions such as an existing target file.
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 9 parameters, so the description has to compensate and it only partially does. It richly explains width/height (aspect-ratio coupling), crop syntax ('W:H' centered vs 'W:H:X:Y'), speed range and semantics (0.25-4, 2 = twice as fast), and output naming, but input, output as an explicit parameter, dry_run, overwrite, and timeout_s are left entirely to the bare schema titles.
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 opening line gives a specific verb set and resource: 'Resize, crop and/or change the speed of a video'. That operation set is distinct from every sibling (convert, compress, trim, make_gif, extract_audio), so an agent can route to it without opening the schema, and the parenthetical about H.264/AAC vs VP9 adds useful precision about what re-encoding implies.
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 is effectively a parameter primer ('give one and the other keeps the aspect ratio', 'applied before resizing') rather than usage routing. It never says when to choose transform over compress (which also shrinks output) or convert, and offers no exclusions or preconditions such as requiring a valid video input. Usage is implied by the operation list, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trimA
Cut a section out of a video or audio file.
start, end, duration: seconds (12.5) or [HH:]MM:SS[.ms] ("1:02:03.5"). Give start and end, or start and duration; with only start the cut runs to the end of the file. mode: "accurate" (default) re-encodes so the cut is frame-exact; "fast" copies the streams without re-encoding (instant, lossless) but the cut snaps to the keyframe before start, so the clip may begin a little early. Default output: name.trimmed.ext.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| mode | No | accurate | |
| input | Yes | ||
| start | No | ||
| output | No | ||
| dry_run | No | ||
| duration | No | ||
| overwrite | No | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses re-encoding behavior, the keyframe-snapping side effect in fast mode ("the cut may begin a little early"), and the default output filename. It omits what happens when the output file already exists (the role of overwrite) and what dry_run returns, which are notable gaps for a mutating file tool.
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?
Front-loads the one-line purpose, then organizes the rest as short labelled lines for the time parameters and for mode. Every sentence carries information an agent needs; no restatement of the tool name or filler.
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 correctly omitted, and the tricky temporal/mode semantics are well covered for a nine-parameter tool. The remaining shortfall is operational: no statement of overwrite behavior, dry_run semantics, or the timeout default's implications.
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 must compensate, and it does for the hardest parameters: the accepted time formats for start/end/duration (seconds, [HH:]MM:SS[.ms], with examples), the mutual exclusivity of end vs duration, the mode values, and the output naming default. It leaves dry_run, overwrite, and timeout_s entirely to their bare names, so three of nine parameters get no added meaning.
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 and resource: "Cut a section out of a video or audio file." That cleanly separates it from join-oriented siblings like concat, or re-encode-only siblings like convert/compress, without the agent needing to open a schema.
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 concrete usage rules: supply start+end or start+duration, and with only start the cut runs to EOF. It also frames the accurate-vs-fast tradeoff as a selection decision (frame-exact vs instant/lossless). It stops short of explicitly contrasting against siblings such as extract_audio or make_gif, so no exclusions are stated.
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.
9 tool updates
v0.1.0- First observed
compress - First observed
concat - First observed
convert - First observed
extract_audio - First observed
extract_frames - First observed
make_gif - First observed
media_info - First observed
transform - First observed
trim
TDQS
Scored across 9 tools
Each tool targets a distinct operation (info, convert, compress, trim, gif, frames, concat, transform), and descriptions steer between them (e.g. 'for a size limit use compress', 'use make_gif for control'). However, overlap remains: compress with only a quality setting is essentially a quality-based re-encode that duplicates convert's quality path, and extract_audio's 're-encode an audio file' overlaps with convert for audio targets.
Mostly verb-based snake_case (convert, compress, trim, extract_audio, extract_frames, make_gif, transform), with two terse exceptions: the noun-style media_info and the bare verb concat. Predictable and readable overall, but not a strict uniform pattern.
Nine tools is a well-scoped surface for an ffmpeg wrapper: one tool per common media operation, with no filler or trivially thin coverage. Each tool has a clear reason to exist.
Covers the core lifecycle well: inspect (media_info), convert, resize/crop/speed (transform), shrink (compress), cut (trim), extract (audio, frames), compose (concat, make_gif). Gaps exist around muxing/replacing audio tracks, subtitle handling, and watermark/normalize operations, but agents can work around most of these with the given tools.
Maintenance
Related MCP Connectors
Transform video, audio and images, and generate media from prompts. FFmpeg, captions, models.
FFmpeg as a service for AI agents: typed video editing tools, async jobs, downloadable outputs.
Video, audio, and image processing for AI agents: convert, transcribe, upscale - 150+ operations.
Image and video AI tools and your own pipelines, run from any AI assistant.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides powerful video and audio editing capabilities through FFmpeg, enabling AI assistants to perform professional-grade operations including format conversion, trimming, overlays, transitions, and advanced audio processing.2789MIT
- AlicenseBqualityBmaintenanceProvides video and audio manipulation tools powered by FFmpeg, enabling AI assistants to perform media operations such as cutting, converting, and removing silence.6169 npm2MIT
- FlicenseBqualityDmaintenanceEnables AI assistants to perform video and audio processing tasks such as format conversion, cutting, merging, and adding effects via FFmpeg, with hardware acceleration support.193-
- FlicenseNot gradedqualityDmaintenanceEnables comprehensive video/audio processing, analysis, and streaming via natural language by exposing 40+ FFmpeg tools as MCP tools.21-