A reproducible MCP editing exercise: four video clips, the verbatim prompt behind the agent session on the weftcut.com homepage, and a checklist.
What this verifies. An agent drives the app through MCP tools alone, with no human intervention, and in a single pass reproduces something close to the homepage session.
| Path | Description |
|---|---|
footage/*.mp4 |
4 source clips — identical stream spec, one thing to check in each |
footage/preview.webp |
the clip preview used in this document |
prompts/aurora-ridge.md |
the prompt from the agent session; substitute the <REPO> placeholder |
prompts/aurora-ridge.zh-CN.md |
the same brief, Simplified Chinese |
weftcut-mcp.example.json |
MCP client config template |
tools/scenes.html |
where the clips came from |
Every clip: mov,mp4 container, h264 High@4.0 yuvj420p 1920×1080 @ 30/1 fps,
300 frames, 10.000 s, aac LC 48 kHz stereo ~161 kb/s. Video bitrates 0.68–2.09 Mb/s.
The scenes are synthetic, and each one hides something the agent has to handle.
| Clip | Scene | Exercises |
|---|---|---|
aurora.mp4 |
Aurora curtains over a ridge, seeded starfield, ambient audio; a meteor streak at 6.20 s – 7.00 s source-relative | precision of the in and out points |
ridgeline.mp4 |
Sunrise behind layered ridges, drifting mist, birds, swelling warm ambient audio | scale_x/scale_y param tracks (clip scaling) |
lakeside.mp4 |
Dusk mirror-lake, full moon, moonlight path on the water, foreground reeds, calm ambient audio | wipe transition |
embers.mp4 |
Bokeh embers above an off-frame fire, crackling audio that drops below −45 dBFS from 4.010667 s to 7.210729 s (3.200063 s) | silence detection and trimming |
Checking the clip spec and those timestamps:
ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name,profile,pix_fmt,width,height,r_frame_rate,nb_frames \
-of compact=p=0 footage/aurora.mp4
# codec_name=h264|profile=High|pix_fmt=yuvj420p|width=1920|height=1080|r_frame_rate=30/1|nb_frames=300
ffmpeg -hide_banner -i footage/embers.mp4 -af silencedetect=noise=-45dB:d=0.3 -f null -
# [silencedetect] silence_start: 4.010667
# [silencedetect] silence_end: 7.210729 | silence_duration: 3.200063| Requirement | Detail |
|---|---|
| WeftCut | Any recent build of the app that launches. |
| Project state | A new project with an empty timeline. |
| Agent client | Any MCP client that speaks streamable HTTP — Codex, Claude Code, Cursor, or your own. |
| Paths | The brief addresses clips by absolute path; replace <REPO> with the absolute path of your clone. |
Settings → Agent — copy the prompt from there and let the agent connect itself, or write your client's MCP config file by hand.
Substitute <REPO> in prompts/aurora-ridge.md (or the zh-CN variant) and hand
everything below the divider to the agent. Claude Code as an example:
claude -p "$(cat prompts/aurora-ridge.md)" \
--mcp-config weftcut-mcp.json --strict-mcp-config \
--allowedTools "mcp__weftcut" \
--model opus --max-turns 80| Flag | Effect |
|---|---|
--strict-mcp-config |
Ignores user- and project-level MCP servers; only weftcut is used. |
--allowedTools "mcp__weftcut" |
Turns off Bash/Read/Write/Web — the editor is the only thing the agent can act on, so no other tool can route around it. |
--max-turns 80 |
The brief takes roughly 40 calls; leave more headroom if you like. |
Every MCP tool call lands on the timeline live, and the app's log console records it.
Claude Code + Opus:
| Metric | Value |
|---|---|
mcp__weftcut__* tool calls |
38 |
Resource reads (project://tracks, project://current) |
5 |
| Structured tool errors (self-corrected) | 3 |
| Output | 15.000 s sequence, 3 A-roll acts + 1 B-roll accent + motif + 3 captions |
Tools called: import_media, add_video_layer, trim_layer, update_layer,
update_layer_params, add_transition, list_motifs, add_motif, set_keyframe,
smooth_keyframes, get_param_track, set_param_track, add_effect,
update_effect, detect_silences, apply_subtitles, add_marker, checkpoint.
Editorial choices differ a little from agent to agent and run to run. This run cut
aurora at src_in_us = 3_000_000 → src_out_us = 8_800_000 (containing the meteor),
with an 800 ms crossfade and a 700 ms wipe.
| # | Requirement | What you should see |
|---|---|---|
| 1 | Three acts, all on A roll, ~5 s each, starting at 0 | A roll holds exactly 3 video layers in sequence, adjacent acts joined by a transition, total ≤ 16 s |
| 2 | embers accent on B roll: eased fade + gentle blur | The clip layer on B roll has at least 3 opacity keyframes, fully transparent at both ends, eased on both ramps, and carries a blur effect |
| 3 | Crossfade first, then a directional wipe | A transition badge on each of the two A-roll cuts |
| 4 | Lower third | A Motif layer on the timeline, placed on an auto-created Overlay track, rendering the briefed strings in the accent colour |
| 5 | Push-in across act two | That layer has X/Y scale keyframe lanes; the preview pushes in slowly |
| 6 | Three captions | 3 text layers on an auto-created track, each with different content, non-overlapping spans across the 15 s |
| 7 | Scene labels on the clip layers | Layer names read as scenes, not filenames or anything else |
| 8 | Marker + checkpoint | A marker on the ruler at 0; a checkpoint in history |
| — | Silence | Audible crackle on the embers accent — no silent gap |
If anything doesn't match, you're welcome to raise it at UncleChair/WeftCut/issues with the agent transcript and the app's log console output. You can also compare against the replay and tool-call trace on the homepage.
Captured frame by frame from tools/scenes.html, then muxed with ffmpeg over
synthesized ambient audio. No sampled footage and no third-party audio.
MIT; everything in the repository falls under the same license. See LICENSE.
