WebMCPv4.0.518
Remotion Studio exposes WebMCP tools that allow an AI agent to inspect and steer it.
Capabilities
Agents can:
- See which items you currently have selected
- See selectable items and select them
- See available compositions and navigate to them
- Get the current HTML of your composition
- See current outlines of elements and their geometry
- Get your current playhead position and playback state
- Play, pause and seek
- Set timeline zoom, playback rate, and mute state
- See, add and remove guides
Requirements
Start the Remotion Studio and open it in a browser with an AI agent that supports WebMCP.
Compatible agents
Out of the major harnesses, only ChatGPT Codex supports WebMCP. We hope more agents add support soon.
Available tools
The shape of inputs and outputs is not currently stable.
Tools that modify the timeline, playback or guides require a composition to be open.
get_compositions
Returns the mounted compositions in the same nested folder hierarchy shown in the Studio sidebar.
Input{}
Outputtype CompositionTreeItem = | { type: 'composition'; compositionName: string; } | { type: 'folder'; folderName: string; children: CompositionTreeItem[]; }; { compositions: CompositionTreeItem[]; }
select_composition
Opens a registered composition by name.
Input{ compositionName: string; }
Output{ currentComposition: string; }
get_sequences
Returns the timeline sequences mounted for the current composition, including their hierarchy, timing, source stack and selection support.
Input{}
Output{ currentComposition: string | null; sequences: Array<{ sequenceId: string; name: string | null; type: 'sequence' | 'audio' | 'video' | 'image'; parentSequenceId: string | null; depth: number; startFrame: number; endFrame: number; durationInFrames: number; stack: string | null; selectable: boolean; }>; }
select_sequence
Selects and reveals a sequence using a sequenceId returned by get_sequences.
Input{ sequenceId: string; }
Output{ currentComposition: string; selectedSequence: { sequenceId: string; name: string | null; type: 'sequence' | 'audio' | 'video' | 'image'; parentSequenceId: string | null; depth: number; startFrame: number; endFrame: number; durationInFrames: number; stack: string | null; selectable: boolean; }; }
get_composition
Returns metadata and the current frame for the open composition. All fields are null when the canvas is showing an asset or other non-composition content.
Input{}
Output{ compositionName: string | null; stack: string | null; durationInFrames: number | null; height: number | null; width: number | null; fps: number | null; currentFrame: number | null; }
get_canvas_html
Returns the rendered composition HTML at the current frame without the surrounding Studio interface. The returned HTML is capped at 100,000 characters. Canvas and WebGL pixels are not represented.
Input{}
Output{ currentComposition: string | null; currentFrame: number | null; html: string | null; htmlLength: number | null; truncated: boolean; }
get_outlines
Returns the measurable selectable component outlines active at the current frame. Coordinates use composition pixels and do not change with the Studio canvas zoom.
Input{}
Output{ currentComposition: string | null; currentFrame: number | null; outlines: Array<{ sequenceId: string; parentSequenceId: string | null; name: string | null; location: { filename: string; line: number; } | null; geometry: { points: [ {x: number; y: number}, {x: number; y: number}, {x: number; y: number}, {x: number; y: number}, ]; boundingBox: { x: number; y: number; width: number; height: number; }; }; }>; }
get_playback_state
Returns the current playhead, playback, audio, looping and timeline zoom state. Timeline zoom is normalized between 0 (fully zoomed out) and 1 (maximum zoom). Playback fields are null when the canvas is not showing a composition.
Input{}
Output{ currentComposition: string | null; currentFrame: number | null; playing: boolean | null; muted: boolean | null; volume: number | null; playbackRate: number | null; looping: boolean | null; timelineZoom: number | null; }
get_selection
Returns source-code context when exactly one supported timeline item is selected. currentSelection is null when there is no selection, multiple items are selected, a guide is selected or the source location cannot be resolved. selectedSequence identifies the owning sequence when a property, effect or keyframe is selected.
Input{}
Output{ currentFrame: number; currentComposition: string | null; currentSelection: string | null; selectionType: | 'guide' | 'sequence' | 'sequence-prop' | 'sequence-all-effects' | 'sequence-effect' | 'sequence-effect-prop' | 'keyframe' | 'easing' | null; selectedSequence: { sequenceId: string; name: string | null; type: 'sequence' | 'audio' | 'video' | 'image'; parentSequenceId: string | null; depth: number; startFrame: number; endFrame: number; durationInFrames: number; stack: string | null; selectable: boolean; } | null; }
get_guides
Returns guides for the current composition. Vertical positions are x-coordinates from the left edge; horizontal positions are y-coordinates from the top edge.
Input{}
Output{ currentComposition: string | null; guidesVisible: boolean; guides: Array<{ id: string; orientation: 'horizontal' | 'vertical'; position: number; visible: boolean; }>; }
set_guides_visible
Shows or hides every guide in the current composition.
Input{ visible: boolean; }
Output{ currentComposition: string; guidesVisible: boolean; }
add_guide
Adds and shows a guide in the current composition. Positions use composition pixels.
Input{ orientation: 'horizontal' | 'vertical'; position: number; }
Output{ currentComposition: string; guide: { id: string; orientation: 'horizontal' | 'vertical'; position: number; visible: true; }; }
remove_guide
Removes a guide using an ID returned by get_guides or add_guide.
Input{ guideId: string; }
Output{ currentComposition: string; guideId: string; removed: true; }
play
Starts playback from the current frame. Still compositions cannot be played.
Input{}
Output{ currentComposition: string; playing: true; }
pause
Pauses playback at the current frame.
Input{}
Output{ currentComposition: string; playing: false; }
mute
Mutes audio playback.
Input{}
Output{ currentComposition: string; muted: true; }
unmute
Unmutes audio playback.
Input{}
Output{ currentComposition: string; muted: false; }
set_timeline_zoom
Sets the timeline zoom using a normalized value between 0 (fully zoomed out) and 1 (maximum zoom). The output contains the effective normalized zoom after Studio applies its supported zoom step. Still compositions do not have timeline zoom.
Input{ zoom: number; }
zoom must be a positive finite number.
Output{ currentComposition: string; timelineZoom: number; }
set_playback_rate
Sets the playback multiplier. Negative values play backwards.
Input{ playbackRate: | -4 | -2 | -1 | -0.5 | -0.25 | 0.25 | 0.5 | 1 | 1.5 | 2 | 4; }
Output{ currentComposition: string; playbackRate: number; }
seek_to_frame
Seeks to a zero-based frame. Values beyond the duration are clamped to the final frame.
Input{ frame: number; }
frame must be a non-negative integer.
Output{ currentComposition: string; currentFrame: number; }
Example prompts
You can ask a browser agent:
- "What is currently selected in the Studio?"
- "List all mounted compositions and their folders."
- "Open the
Shapescomposition." - "List the sequences and select the
Titlesequence." - "Inspect the HTML rendered on the canvas."
- "List the visible components and their canvas geometry."
- "What is the current playback state?"
- "Set the timeline zoom to 2.5x."
- "Seek to frame 90, set the playback rate to 0.5x and play."
- "List the guides in the current composition."
- "Hide the guides."
- "Add a vertical guide at 640 pixels."
- "Mute the preview."
The agent chooses and invokes the matching tools. Tool calls affect the open Studio tab immediately.
Browser support
WebMCP is a draft web platform API. Refer to the WebMCP specification and Chrome's WebMCP documentation for current browser and agent support.