The ffmpeg MCP server. Video jobs from your assistant.
Give your AI assistant a video tool that runs. Ask in plain words; the assistant writes the ffmpeg job, runs it on Videxo and hands back the download link, with your account’s credits and limits.
Connect Claude Code
claude mcp add --transport http videxo https://api.videxo.io/mcp \
--header "Authorization: Bearer $VIDEXO_API_KEY"500 free credits to start, no card.
Connect
One URL, one header. Your API key in it.
The server speaks Streamable HTTP. Put your API key in the Authorization header: Claude Code, Cursor and VS Code read it from an environment variable or ask for it once, so it never sits in a file you commit; Claude Desktop keeps it in the app’s own config file, outside your projects. The assistant then works for your account: its jobs use your credits and show up in your dashboard. A client that supports the MCP authorization specification can sign in with OAuth instead.
Where each config goesclaude mcp add --transport http videxo https://api.videxo.io/mcp \
--header "Authorization: Bearer $VIDEXO_API_KEY" {
"mcpServers": {
"videxo": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.videxo.io/mcp",
"--header",
"Authorization:${VIDEXO_AUTH}"
],
"env": {
"VIDEXO_AUTH": "Bearer <your key>"
}
}
}
} {
"mcpServers": {
"videxo": {
"url": "https://api.videxo.io/mcp",
"headers": {
"Authorization": "Bearer ${env:VIDEXO_API_KEY}"
}
}
}
} {
"inputs": [
{
"type": "promptString",
"id": "videxo-key",
"description": "Videxo API key",
"password": true
}
],
"servers": {
"videxo": {
"type": "http",
"url": "https://api.videxo.io/mcp",
"headers": {
"Authorization": "Bearer ${input:videxo-key}"
}
}
}
} Claude Desktop reaches remote servers through the mcp-remote package, which needs Node.
A real session
One sentence in. A GIF out.
Claude Code got one task in plain words. Its first call was refused with the reason, so it fixed the request, created the job and waited for it; 8 s after the job was created, it had the file and its link. The tool answers are summed up in a line each, the link is shortened and the reply is cut to what it says about the file.
GIF previews and thumbnailsYou
Make a 4-second GIF preview of https://videxo.io/samples/talk.mp4 starting at 0:02, 480 pixels wide, and give me the download link.
Tool call
compile_job{ "inputs": "{\"video\": \"https://videxo.io/samples/talk.mp4\"}", "outputs": "[{\"type\": \"gif\", \"filename\": \"talk-preview.gif\", \"trim\": {\"start\": 2, \"duration\": 4}, \"resize\": {\"width\": 480}}]" }Answered: invalid_request: inputs and outputs must be JSON, not strings, each with its field named. Nothing was created.
Tool call
create_job{ "inputs": { "video": "https://videxo.io/samples/talk.mp4" }, "outputs": [ { "type": "gif", "filename": "talk-preview.gif", "trim": { "start": 2, "duration": 4 }, "resize": { "width": 480 } } ], "idempotency_key": "talk-preview-gif-480w-2s-4s-v1" }Answered: job_fxm8ed8pofu8k6nz0gv908yo, queued, with the ffmpeg command it compiled to
Tool call
wait_for_job{ "job_id": "job_fxm8ed8pofu8k6nz0gv908yo", "timeout_seconds": 50 }Answered: succeeded: talk-preview.gif, 818,769 bytes, its SHA-256 and a download link valid for one hour
Claude Code
Your GIF is ready: https://api.videxo.io/v1/files/job_fxm8ed8pofu8k6nz0gv908yo/out_main?…
This link expires at 03:48 UTC on 2026-11-07, about an hour after the job finished. The stored file is kept until 2026-11-14, and I can get a fresh link from the job until then.
4 seconds, from 0:02 to 0:06. 480 pixels wide with the aspect ratio kept, about 819 KB. 12 fps, with a 256-colour palette. Cost: 2.1 credits.
Tools
15 tools. Check, compile, run, wait.
The assistant checks a job before it runs, so a wrong option comes back with a code and a sentence it can act on, and nothing is charged. The docs pages come along as resources, with prompts that turn a task into a job.
Without an account
Nothing is created or charged.
- Check an ffmpeg command
check_command - Compile a JSON job
compile_job - List presets
list_presets - List fonts
list_fonts - Estimate credits and the plan
estimate_cost - List what a command can use
list_allowed
With your API key or OAuth sign-in
Acts for your account.
- Create a one-time upload
create_upload - Create a job
create_job - Read media metadata
probe_media - Get a job
get_job - List jobs
list_jobs - Cancel a job
cancel_job - Wait for a job to end
wait_for_job - Get the account's credits
get_usage - List a job's webhook deliveries
list_webhook_deliveries
Video editing by MCP
Ask for the edit. Get the file.
- Transcode and compress
Compress video, convert between H.264, H.265, VP9 and AV1, resize and set the frame rate.
- Social formats
Crop to 9:16 and 1:1, letterbox into a new frame, rotate and flip.
- Clips and trims
Trim clips by time, join files, change the speed, fade in and out, and find the scenes of a video.
- Watermarks and overlays
Overlay logos, watermarks, titles and captions, and place one video over another as picture in picture.
- Colour and effects
Correct colour with eq and hue, blur a region for privacy, sharpen after scaling.
- Thumbnails and GIFs
Pick thumbnails, lay out storyboards and contact sheets, and make GIF previews with a fitted palette.
- Audio
Extract and convert audio, normalise loudness, mix background music and draw waveforms.
- All features, each with a request that runs
Price
2.1 credits for that GIF. 500 free to start.
The job above made a 4 s GIF at 30 credits a minute, which is 2 credits, and read and wrote 4.9 MB at 10 credits a GB. Rounded up once, that is 2.1 credits, or $0.0021 at the base rate. Your personal organization gets 500 free credits once, valid 30 days, with no card: about 238 previews like it. Tool calls that only check or compile cost nothing.
Rates and the cost calculatorQuestions, answered.
Which assistants can use it?
An MCP client that connects to a Streamable HTTP server and lets you set a request header can use your API key. The docs show that config for Claude Code, Claude Desktop, Cursor and VS Code, and the session on this page was recorded with Claude Code.
The server also takes OAuth sign-in by the MCP authorization specification, for clients that support it. You choose an organization and see what the app asks for, and you can end its access under Connected apps.
Can my assistant try it before I make a key?
Yes. The tools that need no account have a public address of their own, in the docs: check_command, compile_job, list_presets, list_fonts, estimate_cost, list_allowed. They check commands, compile JSON jobs, list what is available and estimate prices, and create nothing. They answer up to 60 calls a minute from one address.
What can it do to video?
Everything the API does: transcode and compress, resize and crop, trim and join, watermarks, colour, thumbnails, storyboards, GIFs and audio, as a JSON job or as an ffmpeg command. It runs ffmpeg 6.1.1 with the codecs libx264, libx265, libvpx, libvpx-vp9, libaom-av1, mpeg4, mjpeg, png, gif, ffv1, aac, libmp3lame, libopus, libvorbis, flac, pcm_s16le, pcm_s24le, pcm_f32le, alac.
What are the limits?
On Pay as you go a job runs up to 10 min of ffmpeg with inputs up to 1 GB; on Scale up to 60 min and 10 GB. Each tool call counts as one request against your plan’s rate limit, like a REST call. wait_for_job waits up to 50 seconds a call, and the assistant calls it again for longer jobs.
How long do the files stay?
Outputs stay for your plan’s retention: 7 days on Pay as you go, up to 30 days on Scale. Each download link is signed and lasts up to one hour; get_job hands out a fresh one. Private inputs go up with create_upload, up to 100 MB, and stay for 24 hours.
Can my backend hear about jobs the assistant starts?
Yes. A job created through MCP takes the same webhook_url as one created through the API, and your account’s webhook endpoint gets it too. Each delivery is signed in the Standard Webhooks format; list_webhook_deliveries shows the attempts.
Who runs Videxo?
BEO TECHNOLOGY sp. z o.o., a limited company in Poland, in the European Union. Write to hello@videxo.io.