Embedded MCP Server that exposes video editor tools over stdio for Claude Code, Cursor, and Claude Desktop. Enables AI-native video editing through the same command surface used by humans.
Strong foundation with 15 well-named tools using clear verb_noun patterns (get_, add_, remove_, ripple_, trim_, move_, split_, set_). All tools have descriptions (avg 156 chars, within 10-1024 baseline). Input schemas are comprehensive with Zod validation, frame bounds checking, and enum constraints. However, output schemas are not documented in the source, LLMs cannot see what these tools return. Error handling and recovery guidance are absent. Tool descriptions lack dependency hints and prerequisites. Some parameter descriptions could be more explicit about constraints and formats.
Add a media asset to the timeline at a given position.
Create a new track on the timeline.
List all clips on the timeline with their properties (position, duration, track, transforms).
List all media assets in the project bin.
Read the current timeline state: tracks, clips, playhead position, and project settings.
Move a clip to a new position on the timeline.
Remove a clip from the timeline by ID.
Output schemas not documented. LLMs cannot see what get_timeline, get_clips, get_media, or any tool returns. This breaks downstream tool chaining and forces agents to guess field names.
No error handling or recovery guidance. Tools lack descriptions of failure modes, retryability, or what the LLM should do if a call fails (e.g., 'clip not found, try get_clips first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Remove timeline clips and close their gaps in one undoable edit. Linked clips and sync-locked tracks stay aligned.
Close an empty timeline gap in one undoable edit, keeping sync-locked tracks aligned.
Cut one or more project-frame ranges from a track and close them in one undoable edit. Overlapping ranges merge; linked and sync-locked tracks remain aligned.
Trim one edge of a clip and shift downstream clips atomically. Linked clips and sync-locked tracks stay aligned.
Change the project's frame rate, resolution, or aspect ratio. Pass fps, explicit width+height, aspectRatio, or quality. aspectRatio accepts a preset or a custom width:height value and preserves the current short-edge resolution unless quality is also supplied.
Split a clip into two at the specified timeline frame.
Trim a clip by setting new in/out points (source-relative frames).
Trim or extend the edges of one or many clips — move where clips start or end — as a single undoable action. Each edit gives absolute project frames: startFrame moves the leading edge, endFrame the trailing edge (end-exclusive, matching get_timeline); pass either or both. Moving an edge inward trims material away; outward extends it, revealing more source when the media has headroom (images and titles extend freely). Linked audio/video partners trim together, so list a clip or its partner, not both. ripple=false (default): only the edited clips change — extending overwrites whatever the new span overlaps on that track, trimming leaves a gap. ripple=true: like a ripple-trim drag — downstream clips and sync-locked tracks shift to close (or open) the gap. Each requested frame is read as an amount of material to add or remove at that edge, applied before the shift. Requests are clamped by source headroom and sync-locked track room; the receipt reports every clamp, skipped edge, and overwritten clip — verify against it instead of assuming the exact frames landed.
Destructive operations (remove_clip, ripple_delete_*) lack confirmation or dry-run support. Agents can delete clips without verification, risking data loss.
Parameter descriptions lack explicit format/constraint details. E.g., 'startFrame' says 'Frame position' but doesn't state it's bounded by MAX_FRAME or that it must be non-negative. LLMs cannot read Zod schemas, they rely on description text.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). MCP clients cannot distinguish safe reads from destructive writes without explicit hints.