KinoPipe
FFmpeg as a service for AI agents.
What it can do
- Get Video Metadata: Read the duration, dimensions, rotation-corrected display size, frame rate, codecs and audio tracks of a media URL before choosing an edit. The finished job returns the metadata in
- Convert Video To Vertical: Turn a landscape video into a 9:16 vertical MP4 by padding it over a blurred (or black) background — the standard TikTok, Reels and Shorts look, with no cropping. The edit i
- Change Video Speed: Speed a video up or slow it down between 0.25x and 4x with pitch-corrected audio. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL.
What data it sees
Do you need an account
No: the server works without sign-in
FFmpeg as a service for AI agents. KinoPipe gives agents hosted video editing over remote MCP: 39 typed tools (trim, resize, crop, compress, convert, subtitles, watermark, GIF, scene and silence detection, local-file uploads) plus composable single-pass recipes with create_video_job. OAuth 2.1 sign-in, async jobs with get_job, signed download URLs. No shell commands: every request is validated before anything renders.
Free plan: 100 credits, no credit card. Docs: https://kinopipe.com/docs. Connect guide: https://kinopipe.com/connect
How to connect
How to connect KinoPipe to Claude
The server address to paste into Claude settings:
https://kinopipe--nicolas-coutureau.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect KinoPipe to ChatGPT
The server address to paste into ChatGPT settings:
https://kinopipe--nicolas-coutureau.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect KinoPipe to Cursor
The server address to paste into Cursor settings:
https://kinopipe--nicolas-coutureau.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (39)
Raw names from tools/list. Only developers need these.
| get_video_metadata | Read the duration, dimensions, rotation-corrected display size, frame rate, codecs and audio tracks of a media URL before choosing an edit. The finished job returns the metadata in result.input and as a downloadable JSON file. Runs no encode. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| convert_video_to_vertical | Turn a landscape video into a 9:16 vertical MP4 by padding it over a blurred (or black) background — the standard TikTok, Reels and Shorts look, with no cropping. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| change_video_speed | Speed a video up or slow it down between 0.25x and 4x with pitch-corrected audio. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| detect_scenes | List the timestamps where the picture cuts to a new scene, as JSON in result.analysis — use them to choose trim, split or clip boundaries before editing. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| detect_silence | List silent passages (start, end, duration) as JSON in result.analysis without editing anything — for chaptering, cut planning or deciding whether remove-silence is worth running. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| analyze_audio | Measure mean and peak volume, integrated loudness (LUFS), loudness range and true peak, as JSON in result.analysis — decide whether and how to normalize before editing. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| auto_orient_video | Fix a video that displays sideways or upside down: the rotation stored in metadata is baked into the pixels and the result plays upright everywhere. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| strip_video_metadata | Remove GPS location, device model, creation time and encoder tags from a video without re-encoding — a fast stream copy that rewrites only the container. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| create_audiogram | Turn audio into a shareable MP4 with an animated waveform — over a background image you supply or a solid dark canvas. The classic podcast and music share format. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| add_progress_bar | Overlay a thin animated progress bar that fills over the video duration — the TikTok-style retention cue. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| create_boomerang | Play a short clip forward then in reverse as one seamless loop-ready MP4. Sources up to 30 seconds. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| generate_audio_waveform | Draw the waveform of an audio file (or a video soundtrack) as a single image — transparent PNG by default, with configurable size and color. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| normalize_audio | Normalize loudness to platform targets: streaming (-14 LUFS, YouTube and Spotify), podcast (-16) or broadcast (-23). The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| remove_silence_from_audio | Strip silent passages from a video or audio source and return a tightened MP3 or WAV. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| compress_video | Compress a source video into a smaller web-ready MP4 while preserving useful visual quality. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| optimize_video_for_web | Create a browser-compatible fast-start MP4 for web delivery. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| convert_video_to_mp4 | Convert a supported source video such as MOV or WebM into a compatible H.264 MP4. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| resize_video | Resize and reframe a video for vertical, square or landscape delivery without stretching it. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| crop_video | Crop a video to a social aspect ratio with a predictable focal position. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| trim_video | Cut a precise time range from a source video and return a playable MP4. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| create_social_video_clip | Trim and reframe one source into a vertical, square or landscape social clip in a single job. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| extract_audio | Extract the primary audio track from a video as MP3 or uncompressed WAV. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| remove_audio_from_video | Remove every audio stream and return a silent MP4. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| generate_video_thumbnail | Extract a deterministic JPEG or WebP poster frame at an exact timestamp. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| convert_video_to_gif | Create a short palette-optimized animated GIF from a selected video range. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| add_subtitles_to_video | Burn a public SRT or WebVTT caption file into a durable MP4. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| add_music_to_video | Mix background music with the source soundtrack or replace it, looping music to the video duration. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| merge_videos | Normalize and join two to six public video clips into one playback-ready MP4 in the supplied order, with optional crossfade transitions between clips. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| merge_audio | Join two to six audio files (or the audio tracks of videos) into one normalized MP3 or WAV in the supplied order — voiceover chunks, podcast segments, TTS parts. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| format_video_for_platform | Produce a platform-ready 9:16 MP4 for Instagram Reels, TikTok or YouTube Shorts: 1080x1920, H.264 High@4.1, capped bitrate, constant 30 fps — crop to fill or pad over a blurred background. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| generate_video_filmstrip | Render one image strip of evenly spaced frames from a video — a filmstrip for timelines, previews, scene review or LLM vision input. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| image_to_video | Turn a still image (PNG, JPEG, WebP) into an MP4 of a chosen duration and aspect ratio — for slideshows, video references or platforms that only accept video. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| add_watermark_to_video | Overlay a public logo image with controlled position, width and opacity. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| create_picture_in_picture_video | Overlay a public facecam or secondary video over the main video. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| split_video | Split a source into equally sized, independently playable MP4 segments and return every output. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| split_video_by_scenes | Detect scene changes and cut the video at every real cut, returning one MP4 segment per scene. Use detect_scenes instead when you only need the timestamps. The edit is asynchronous; call get_job with the returned jobId to retrieve the download URL. |
| create_video_job | Queue a custom KinoPipe recipe containing bounded trim, resize, crop, thumbnail, subtitles, audio, composition or split operations. Prefer a focused tool when one matches the requested edit. |
| get_job | Read the current state of a KinoPipe video job. Poll until succeeded or failed. A succeeded job contains temporary downloadable output URLs. |
| create_upload | Create a signed upload slot so a LOCAL media file can be used as an input_url. byte_size must be the exact file size in bytes (macOS: stat -f%z file; Linux: stat -c%s file). Upload by running the returned command (or an equivalent multipart POST sending every field before the file), then pass media_url as the input_url of any editing tool within 24 hours. |