AI-first vertical (9:16) video editor engine — the LLM plans, a deterministic FFmpeg renderer executes. Exposes the VertIR engine as an MCP tool server.
VertIR exposes 14 well-named, domain-specific tools with complete input schemas and descriptions. Naming follows verb_noun convention (ingest, build_short, validate, render, add_*). Descriptions are detailed and contextual (avg ~180 chars), explaining WHAT, WHEN, and prerequisites. However, output schemas are entirely undocumented, LLMs cannot predict return structure or plan downstream calls. Parameter descriptions are present but inconsistent: some lack type hints (e.g., 'corner' enum values are clear, but 'scale'/'opacity' lack ranges). Error handling is absent from tool definitions. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Composition is strong: tools chain logically (propose_plan → apply_plan, add_broll/logo/title mutate IR). Idempotency and retry safety are not addressed.
Add a source-anchored b-roll cutaway to an existing IR: it covers the frame over the speech window [sourceAtUs,sourceEndUs) (original-recording time) while the talking-head audio keeps playing. Re-validates and saves the IR.
Set a program-anchored corner logo/watermark for the whole video on an existing IR. Re-validates and saves.
Add a program-anchored full-screen title card (intro/outro/hook) to an existing IR. Use position='intro' (starts at 0), 'outro' (ends at program end), or explicit atUs/endUs. Re-validates and saves.
STEP 2 of the editorial loop. Apply an Editorial Plan to footage and render. Validates the plan fail-closed first (it will refuse an invalid plan rather than silently degrade). Pass plan_json inline, or plan as a file path. Omit both to use the deterministic baseline plan (no editorial judgement).
Full core pipeline: talking-head footage + word-level transcript JSON -> filler-cut + 9:16 reframe + word-highlight captions -> validated IR -> rendered final.mp4 + preview.mp4. Returns the validation report and output paths.
Output schemas completely undocumented. No tool returns a documented structure. LLMs cannot predict what fields to extract or plan downstream calls. E.g., build_short returns 'validation report and output paths' but structure is opaque.
No tool annotations despite clear risk classifications. Tools marked WRITE (build_short, render, add_*, apply_plan, export_capcut, reconcile_capcut, demo) lack destructiveHint=true. READ_ONLY tools lack readOnlyHint=true. LLMs cannot distinguish safe from risky operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Check whether the optional capcut-cli bridge is usable (Node, CLI, draft dirs).
Generate a synthetic source + transcript and render an end-to-end example short (incl. b-roll + logo + intro/outro + music ducking). No footage needed.
Export a Timeline IR to a CapCut / JianYing draft so a human can do the final tweak in the app. ALWAYS read the returned `losses` and tell the user what did not survive: loudness normalisation, side-chain ducking, word-level caption highlighting and reframe focus have no CapCut equivalent. Requires the optional capcut-cli (Node); without it the spec is still written and the reason reported.
Probe a media file (ffprobe) and return its content-addressed asset block.
STEP 1 of the editorial loop. Returns the word-level transcript plus the Editorial Plan schema and rules. YOU then author the plan: pick the hook (the strongest 1-3s, which gets MOVED to the front), the spans to keep and drop, punch-in beats every 3-5s, the few words to emphasise, and the outro/CTA. All times are SOURCE microseconds. Feed the plan you write to apply_plan.
Pull a human's CapCut edits back into the IR. PATCHES the existing IR using `capcut diff` against the export snapshot — it never rebuilds the IR from the draft, because the IR carries intent (reframe focus, source-anchored b-roll, ducking rules) that a draft does not. Report `pinnedInCapCut` to the user: those are edits that stay in the draft and are NOT managed by the IR.
Render a Timeline IR JSON to MP4 (validates first). Set proxy=true for a fast low-res preview.
Run the fail-closed validator on a Timeline IR JSON file. Returns errors/warnings.
Check an Editorial Plan against a transcript without applying it. Returns errors/warnings.
Numeric parameters lack range constraints. 'scale' and 'opacity' in add_logo, 'durUs' in add_title, 'sourceAtUs'/'sourceEndUs' in add_broll have no min/max documented. LLMs may pass invalid values (negative durations, opacity > 1).
No error handling guidance in tool definitions. Tools can fail (invalid IR, missing files, validation errors) but descriptions do not explain recovery paths. LLMs have no guidance on retry vs. user-fixable vs. fatal errors.
Idempotency not addressed. Tools like add_broll, add_logo, add_title mutate IR in place. Unclear if repeated calls with same params are safe or cause duplicates. No confirmation/dry-run pattern for destructive operations.