Skip to main content

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​

note

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
{}
Output
type 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 Shapes composition."
  • "List the sequences and select the Title sequence."
  • "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.

See also​