Mcp Video

media MCP Server

Guardrailed video editing MCP server for AI agents. FFmpeg, Hyperframes, repurposing tools, Python client, and CLI. Local, fast, free.

VerifiedFreshInstall ReadyReviewed
mediamediapython
23 views190 stars43 forksApache-2.0

Why This Matters

Discovered via github-seeds:mcp-hot and last synced Today.

VerifiedFreshInstall ReadyReviewed
Source
github-seeds:mcp-hot
Stars
190
Last synced
Today
Install
Instructions detected

Install

1. Install the package

uvx --from kinocut kino --mcp

2. Add to claude_desktop_config.json

{
  "mcpServers": {
    "mcp-video": {
      "command": "uvx",
      "args": [
        "--from",
        "kinocut",
        "kino",
        "--mcp"
      ]
    }
  }
}

Config file location: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) / %APPDATA%\Claude\claude_desktop_config.json (Windows)

54
Tools
0
Resources
0
Prompts
Standard I/O
Transport

Available Tools (54)

Transitions

3

Analysis

8

Repurposing

2

video_record

cinema, scroll, multi-device

video_text

subtitles, caption, overlay, animate

VIDEO_OUTPUT_DIR

`./output`

MCP_PORT

`9847`

Tool

Operations

Default

Description

video_screenshot

capture, detect

video_edit

speed, crop, reverse, keyframe, pip

video_color

grade, effect, lut, chroma

ELEVENLABS_API_KEY

—

OPENAI_API_KEY

—

video_compose

concat, intro, social, beat-sync, templates

MCP_HOST

`127.0.0.1`

video_speech

generate, voices, narrated

MCP_VIDEO_DEBUG

`false`

video_audio

extract, music, ducking, mix, voice

MCP_HTTP

`false`

8

vignette, glow, noise, scanlines, chromatic aberration, luma key, mask, shape mask, bounded filter parameters

01-social-media-clip

5

29

trim, merge, text, audio, resize, convert, filters, stabilize, chroma key, subtitles, watermark, batch, export, normalize audio

1

`search_tools` — keyword search across all tools

Video

Audio (extraction)

04-hyperframes-video

5

Interface

Typed MCP / Python / CLI

3

extract colors, generate palettes, analyze product images

03-explainer-video

7

02-podcast-clip

6

4

project scaffold, style-pack parsing, storyboard parsing, shot prompt expansion

Hyperframes

18

Discovery

1

32

trim, merge, resize, crop, rotate, convert, overlays, subtitles, export, cleanup, templates, merge-compatibility guardrails

6

grid, picture-in-picture, split-screen, animated text, counters, progress bars, auto-chapters, layout mismatch warnings

Install

Approx. extra size

7

synthesize, compose, presets, effects, sequences, generated audio, spatial audio, mix-parameter guardrails

Category

Count

Workflow

Example prompt

Area

What landed on `master`

Slice

Focus

S12

Thin public discovery / Python adapters

trim

resize

merge

add_text

Kinocut

Raw FFmpeg in agent shell

Surface

Version / tip

11

transcription, scene detection, upscaling, stem separation, silence removal, color grading

5

still-match, still-grade, still-gate, image-edit, still-package — establish-locked color match with cohesion gate

crop

merge

composite_layers

burn_in`) mapped 1:1 to the same vetted engine functions the individual tools use; media references are symbolic and workspace-confined; everything fails closed. ```json { "schema_version": 1, "name": "captioned-vertical-short", "sources": { "hero": { "path": "input/hero.mp4" } }, "steps": [ { "id": "trim-hero", "op": "trim", "inputs": { "src": "@sources.hero" }, "params": { "start": 0, "duration": 6 }, "output": "@work/hero_trim.mp4" }, { "id": "vertical", "op": "resize", "inputs": { "src": "@work/hero_trim.mp4" }, "params": { "width": 1080, "height": 1920 }, "output": "@work/hero_vertical.mp4" }, { "id": "caption", "op": "add_text", "inputs": { "src": "@work/hero_vertical.mp4" }, "params": { "text": "Watch this", "position": "bottom-center" }, "output": "@outputs.master" } ], "outputs": { "master": { "path": "output/final.mp4" } } } ``` ```bash kino workflow-validate --spec job.json # cheap structural gate, no render kino workflow-plan --spec job.json --save-plan plan.json # dry-run op graph + hashes kino workflow-render --spec job.json --save-receipt receipt.json # execute + provenance receipt kino workflow-inspect --receipt receipt.json # read-only integrity re-check ``` The render receipt records per-step input/output hashes, a resume cursor, and a cleanup manifest, all with workspace-relative paths: ```json { "receipt_kind": "workflow", "versions": { "mcp_video": "1.13.2", "ffmpeg": "8.1" }, "spec_hash": "sha256:be2f3a9b...", "steps": [ { "id": "trim-hero", "op": "trim", "status": "completed", "input_hashes": { "src": "sha256:3b976d49..." }, "output": "work/be2f3a9b-2effedb3/mcp_video_hero_trim.mp4", "output_hash": "sha256:00727499..." }, { "id": "caption", "op": "add_text", "status": "completed", "output": "output/final.mp4", "output_hash": "sha256:8633ad2a..." } ], "cleanup_manifest": { "cleaned": true, "policy": "clean-on-success" }, "resume_cursor": { "last_completed_step": "caption", "next_step": null }, "status": "completed", "render_determinism_scope": "spec/input/output hashes are deterministic; rendered bytes may vary across FFmpeg builds" } ``` `--all-variants` emits N distinct outputs from one declaration, and `--resume` continues a job that failed with its intermediates kept (fail-closed on a changed spec). Full schema, `@ref` grammar, variants, resume, and cleanup are in [docs/WORKFLOWS.md](docs/WORKFLOWS.md); a runnable spec is in [examples/workflows/](examples/workflows/captioned-vertical-short/). ## Governed AI-video review In **Kinocut**, a contract-first path is provided for agent-edited media that must stay attributable and reviewable: 1. **Ingest** the source into a private content-addressed project (`video_ingest` / `video-ingest`) 2. **Preflight + temporal inspection** on the stored asset (`video_preflight`, `video_inspect_temporal`) 3. **Verdict + acceptance** with exact human evidence (`video_verdict`, `video_acceptance_eval`) 4. **Bounded derivatives only** — audio-preserving body swap or allowlisted salvage recipes (`video_body_swap`, `video_salvage`), each with lineage and a fresh non-approved review slot There is no force/bypass flag. Analyzer output alone cannot approve. Stale, aliased, or protected inputs fail closed. Operating guide: [docs/AI_VIDEO_REVIEW_AND_SALVAGE.md](docs/AI_VIDEO_REVIEW_AND_SALVAGE.md). These surfaces are fully integrated in the published 1.15.x line — see [Status and releases](#status-and-releases). ## Dedicated Video Rescue For "fix this clip" requests where the story and timeline must remain unchanged, use the review-first rescue pipeline. Plan and inspect the diagnosis, approve only safe repair IDs, render, then inspect the verified package. The source stays immutable; master and universal sharing copy are always verified; optional captions remain sidecars. See [docs/RESCUE.md](docs/RESCUE.md) for CLI, MCP, Python, cancellation, resume, and stable errors. ## Layered Compositing `composite-layers` / `video_composite_layers` adds a spec-driven ordered layer stack for agents that need more than two-shot overlay primitives. It supports image, video, and solid layers; normal alpha compositing; per-layer opacity; x/y placement; transform sizing; timing windows; and mask/matte alpha sources — plus **full-canvas and positioned blend modes** (`multiply`, `screen`, `overlay`, `darken`, `lighten`) and **rotation** with a new `pivot` reference point. Dry-run plans and deterministic `layer_plan` v2 receipts capture source, filtergraph, and output hashes. ```bash kino composite-layers --spec layers.json --dry-run --save-layer-plan layer-plan.json kino composite-layers --spec layers.json -o out.mp4 --save-layer-plan layer-plan.json ``` Use `composite-layers` when an agent needs a planned stack of overlays, mattes, lower thirds, blurback plates or platform variants reviewed before rendering. Non-`normal` blends support opacity and `start`/`duration` windows in two geometries: full-canvas at `{0,0}` without explicit sizing, or a positioned rectangle with both positive integer `width` and `height` and an integral nonnegative in-canvas position. RGB blending avoids applying color arithmetic to subsampled chroma planes. Scale, rotation/pivot, mask/matte, fractional positions and out-of-canvas rectangles remain deferred and fail closed with `unsupported_blend_geometry`. Video layers and masks begin playback at the declared layer start. Keep sources and masks inside the spec directory, placing the spec in a common parent of its media. Output remains video-only. ## 360 dual-cam assembly Any stitched equirect 360 MP4 (Insta360, Ricoh Theta, GoPro MAX, DJI, …) can become a two-cam 16:9 or 9:16 edit without a new tool name. Export from the camera app first — Kinocut does not stitch `.insv` or GoPro `.360`. ```python from kinocut import Client video = Client() plan = video.propose_360_assembly("x4-export.mp4", goal="desk 360 split 9:16") approved = video.decide_360_assembly(plan, "approve") video.render_360_assembly(approved, "desk-split.mp4") ``` Agents: `video_intent` with a 360/desk/table goal and `source=`, then `video_review_decide`. Full contract: [docs/360_ASSEMBLY.md](docs/360_ASSEMBLY.md). ## Still / Image Editing Kinocut treats multi-still packages as first-class media — plan → receipt → fail-closed gate, same safety posture as video rescue. Requires `pip install "kinocut[image]"`; run `kino doctor` to verify the image stack. **Workflow:** establish a hero plate → edit beats toward it → match shared WB/exposure → grade (optional signal LUT) → cohesion gate. ```bash # Image analysis: extract colors, generate palettes, analyze products kino image-extract-colors product.jpg -n 8 kino image-generate-palette scene.png --harmony triadic kino image-analyze-product listing.jpg --use-ai # Still/plate editing: match package to hero, grade, gate kino still-match --hero establish.png --inputs beat1.png beat2.png --output-dir out/matched kino still-grade --inputs out/matched/*.png --hero establish.png --output-dir out/graded kino still-gate --inputs out/graded/*.png --output-dir out/gate # Establish-locked edit with plan/receipt (dry-run first) kino image-edit --source beat.png --reference establish.png \ --intent "match establish world and light" --output-dir out/edit --dry-run # Or run the full pipeline in one shot kino still-package --establish establish.png --beats beat1.png beat2.png --output-dir out/pkg ``` ```python from kinocut import Client c = Client() c.still_match(hero="establish.png", inputs=["a.png", "b.png"], output_dir="out/m") c.still_gate(inputs=["out/m/a_matched.png", "out/m/b_matched.png"], output_dir="out/g") ``` `still-gate` fails closed on luma spread and shadow green/cyan metrics; every tool writes a JSON receipt with hashes and gains. Paid generative backends stay off by default (`prefer=edit`, `allow_paid_gen=false`). Full guide: [docs/STILL_PLATES.md](docs/STILL_PLATES.md). ## Public Discovery Kinocut is built to be **findable and citable** by both search engines and AI answer engines: - Canonical product URL: **https://kinocut.dev/** - GitHub README + [`llms.txt`](llms.txt) with entity facts, install commands, and safety rules - Official MCP Registry record under `io.github.KyaniteLabs/kinocut` - FAQ answers in this README and [docs/faq.md](docs/faq.md) (answer-first, versioned claims) ### Kinocut vs raw FFmpeg (and vs cloud editors)

Preflight

Guardrails before render

Local-first

Local

Free

Often metered

Revideo

4