remotion-mcp
The code-driven video engine's agent door — briefs and revisions, the composition catalog, brand presets, renders, and jobs.
This server fronts the code-driven half of the
Video studio — the Remotion engine, where videos are
produced from typed compositions rather than hand editing. Its 25 video_*
tools cover the full production loop: brief lifecycle with revision history
and a timeline, the composition catalog and its schemas, brand presets,
asset probing, rendering, and job tracking. Like the other creation
verticals it is a thin front over the automation daemon, which runs the
staged agent pipeline and the renders.
The brief is the working object. An agent creates one from your freeform direction, the staged pipeline enriches it — creative direction, then a scene-by-scene script, then a schema-correct render proposal — and every stage lands as a revision you can inspect and roll back. Nothing renders until the produce step is dispatched, which keeps the review gates in the studio meaningful: the tools create and inspect freely, but the expensive step is always an explicit decision.
How your agents use it
- "Set up a 30-second teaser for the launch." —
video_create_briefwith your direction and assets;video_analyze_briefstarts the staged pipeline;video_get_brief_timelineshows what has happened to the brief so far. - "What can the engine actually mount?" —
video_list_compositionsfor the catalog,video_get_composition_schemafor the exact parameters a composition accepts — this is how the pipeline's composer stays schema-correct. - "Render the approved proposal." —
video_produce_brief, thenvideo_get_jobto track the render;video_list_brief_rendersfor the results.
Prerequisites
The automation daemon must be running (Dashboard ▸ Platform Health) — it hosts the video API and executes renders locally. The pipeline's agent stages run on your Claude subscription. Daemon settings live in the configuration reference.
Tool reference
| Tool | Parameters | What it does |
|---|---|---|
video_list_compositions | — | List all registered video compositions in the Remotion engine. Returns a catalog with id, category (animated|static), display_name, description, supported_aspects, default/min/max durations, and consumer hints. Use this FIRST before video_render to discover what's available. For typed prop schemas use video_get_composition_schema. |
video_get_composition_schema | composition_id*: string | Return the JSON-Schema for one composition's input props (W9). Use this when you need authoritative prop names, required fields, types, enums, min/max constraints before composing a video_render or video_render_static call. The schema is derived from the composition's Zod schema with the auto-injected `brand` field stripped. |
video_list_composition_schemas | — | Return JSON-Schemas for all compositions in one call. Useful for agents that want to enumerate every renderable + its prop contract in a single round trip. |
video_probe_media | src*: string, timeout_sec: integer | Probe a media file (audio or video) via ffprobe and return its duration / codec / dimensions / channels (W11). Use when an agent wants to size a composition to a narration MP3 or a Veo clip before dispatching the render. Compositions with an `audioSrc` prop auto-probe on render dispatch; this tool is for pre-flight planning. |
video_health | — | Health check for the Remotion video subsystem. Confirms the engine root, node_modules, and render scripts are in place. Call before dispatching renders if the daemon was recently restarted or you suspect setup issues. |
video_render | composition_id*: string, props*: object, output_path*: string, brand_preset_id: string, consumer_tag: string, timeout_sec: integer | Dispatch an ANIMATED video render (MP4). Returns 202 with a job_id; poll via video_get_job until status is 'done' / 'failed' / 'cancelled' / 'timed_out'. Use video_list_compositions first to discover available composition_ids and their prop schemas. The `props` object must include at minimum `format` and `durationSec`; brand is auto-injected from brand_preset_id. External asset paths in props are automatically curated into the engine's publicDir — pass absolute filesystem paths freely. For single-frame still output (PNG/WebP infographics or poster export from an animated composition), use video_render_static instead. |
video_render_static | composition_id*: string, props*: object, output_path*: string, brand_preset_id: string, consumer_tag: string, frame: integer, image_format: string | Dispatch a SINGLE-FRAME still render (PNG or WebP). Returns 202 with a job_id. Works on dedicated static compositions (e.g. InfographicStat, PosterCard) and on animated compositions when combined with `props.freezeAt: <frame>` for poster-from-animation export. Use video_list_compositions to check `supports_freeze` for the freeze-frame path. |
video_get_job | job_id*: string | Poll a render job's status. Returns the full job row including status, progress_pct (0-100), error_class / error_message (on failure), output_path, output_bytes, wall_clock_sec. Terminal statuses: done, failed, cancelled, timed_out. |
video_cancel_job | job_id*: string | Cancel an in-flight render job. Marks the job as cancelled. The subprocess will be reaped by its timeout or finish on its own; the daemon does not currently force-kill the Node process (Wave 7 polish). |
video_list_jobs | status: string, consumer: string, limit: integer | List render jobs (history + in-flight). Filterable by status and/or consumer_tag. Useful for checking what's been rendered for a given product/post/newsletter. |
video_list_brand_presets | — | List available brand presets. Each preset bundles colors, fonts, and logos that compositions use. The default preset resolves from your Company Identity (falls back to 'default'). Operators add new presets via the Command Center; agents only read them. |
video_get_brand_preset | preset_id*: string | Get full detail of a brand preset (colors, fonts, logos). |
video_create_brief | name*: string, prompt*: string, assets: array, hints: object, brand_preset_id: string, consumer_tag: string | Create a new video brief (W10R). Briefs are the agentic two-phase replacement for direct render dispatch — provide name + prompt + assets + optional hints; the brief saves at status='drafted'. Trigger analysis via video_analyze_brief, review the proposal, then video_produce_brief to render via the existing pipeline. |
video_list_briefs | status: string, consumer: string, limit: integer | List video briefs (W10R). Filter by status / consumer_tag. |
video_get_brief | brief_id*: string | Get a brief plus its current revision detail (proposal JSON + script.md content). |
video_update_brief | brief_id*: string, name: string, prompt: string, assets: array, hints: object, brand_preset_id: string, consumer_tag: string | Update brief metadata (W10R). Rejected when brief is mid-analysis or mid-render. Whitelisted fields: name, prompt, assets, hints, brand_preset_id, consumer_tag. |
video_archive_brief | brief_id*: string | Archive a brief (soft delete; status='cancelled'). On-disk files preserved. |
video_analyze_brief | brief_id*: string, edit_instructions: string | Dispatch the video-composer agent (opus) to analyze a brief and produce a proposal + script. Creates a new revision_NNN. Returns 202 with brief_id + revision_id; brief status flows drafted/proposed → analyzing → proposed (or failed). Pass edit_instructions when revising an existing proposal. |
video_produce_brief | brief_id*: string, override: object | Render a brief's current revision via the existing /api/video/render pipeline (W10R). Optional `override` dict merges over the proposal before dispatch. Brief status flows proposed → producing → rendered. |
video_list_brief_revisions | brief_id*: string | List all revisions for a brief (W10R). |
video_get_brief_revision | brief_id*: string, revision_id*: integer | Get one revision's detail (proposal JSON + script.md content). |
video_activate_brief_revision | brief_id*: string, revision_id*: integer | Switch the brief's current_revision_id to a different revision (W10R). Status flips to 'proposed'. |
video_list_brief_renders | brief_id*: string | List the render history for a brief (W10R). One brief can be produced multiple times. |
video_get_brief_timeline | brief_id*: string, revision_id*: integer | (W16) Read the timeline for a long-form brief revision. Returns the 3-band timeline object (elements + text + audio) from the revision's proposal.json `props.timeline`. Errors if the revision's composition_id is not 'LongFormStory'. |
video_probe_brief_assets | brief_id*: string, revision_id*: integer | (W16) Probe every audio + video asset referenced in a long-form brief revision's timeline. Returns per-asset duration / codec / dimensions PLUS a roll-up summary (total ms, segment counts, estimated render-sec). Use for cost surfacing + sanity-check before Produce. |
Where to go next
- Video — the production studio — the human surface: briefs, review gates, and both engines side by side
- hyperframes-mcp — the HTML-first sibling engine
- footage-mcp — preparing raw recordings for either engine