Skip to main content
Glama

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 name ffmpeg-mcp was already taken by another project). The GitHub repository is ffmpeg-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

winget install Gyan.FFmpeg

macOS

brew install ffmpeg

Debian/Ubuntu

sudo apt install ffmpeg

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-mcp

Claude 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

media_info

ffprobe summary: container, duration, size, bitrate, every stream (codec, resolution, fps, sample rate, channels).

convert

To mp4, mov, mkv (H.264+AAC), webm (VP9+Opus), mp3, wav, flac, ogg, m4a, opus, aac, or a short gif. quality low/medium/high.

compress

target_mb=N (two-pass, bitrate maths), preset (discord-10mb, discord-50mb, whatsapp, email-25mb, web), or a quality-based re-encode. max_height caps the resolution.

trim

start / end / duration (seconds or HH:MM:SS). mode="accurate" re-encodes; mode="fast" stream-copies.

extract_audio

mp3, wav, flac, ogg, m4a, opus, aac, or copy the original stream. Clear error if there is no audio.

make_gif

Palette-based GIF (palettegen + paletteuse). fps 1-30, width, start, duration (max 30 s), loop.

extract_frames

PNG/JPG stills at times=[...] or every every_s seconds, with a max_frames guard.

concat

Joins same-codec clips without re-encoding; says exactly which property differs if they don't match.

transform

Resize (width/height), crop (W:H[:X:Y]), speed (0.25-4, audio retimed).

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 to name.partial.ext and 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) or MEDIAKIT_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 ffmpeg and ffprobe. Input names can't be turned into options because every path is resolved to an absolute path first.

Limits

  • concat joins without re-encoding, so the clips must match. Use convert/transform first 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_run still runs ffprobe on 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 tests

The 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 tools
compressA

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.

NameRequiredDescriptionDefault
inputYes
outputNo
presetNo
dry_runNo
qualityNomedium
overwriteNo
target_mbNo
timeout_sNo
max_heightNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
inputsYes
outputNo
dry_runNo
overwriteNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
inputYes
formatNo
outputNo
dry_runNo
qualityNomedium
overwriteNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
inputYes
formatNomp3
outputNo
bitrateNo
dry_runNo
qualityNomedium
overwriteNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
inputYes
timesNo
widthNo
formatNopng
dry_runNo
every_sNo
overwriteNo
timeout_sNo
max_framesNo
output_dirNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fpsNo
loopNo
inputYes
startNo
widthNo
outputNo
dry_runNo
durationNo
overwriteNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
inputYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
cropNo
inputYes
speedNo
widthNo
heightNo
outputNo
dry_runNo
overwriteNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
endNo
modeNoaccurate
inputYes
startNo
outputNo
dry_runNo
durationNo
overwriteNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 9 tool updatesv0.1.0
    • First observedcompress
    • First observedconcat
    • First observedconvert
    • First observedextract_audio
    • First observedextract_frames
    • First observedmake_gif
    • First observedmedia_info
    • First observedtransform
    • First observedtrim

TDQS

A3.9/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers