Docs
component MCP tool
Custom components and scene config.
MCP name component dispatches to renderer component.
Does not use hosted quota. Local editor operation.
Custom components and scene config. action create writes a new component from name, code, componentName. action createFromTemplate instantiates a catalog template. action edit updates an existing component assetId. action setSceneConfig sets resolution, fps, background, style, or caption defaults. After create or createFromTemplate, place the component with timeline_edit action addClip, type component, and the returned assetId. Editor must be open. Does not use hosted quota. Local editor operation.
Advertised MCP input
This tool is registered with passthrough. The fields below are what listTools advertises. The renderer still validates the child fields for the chosen action or kind. Extra advertised-only values are documented under Reachable behavior.
| Field | Type | Required | Constraints | Default | Description |
|---|---|---|---|---|---|
action | enum("create", "createFromTemplate", "edit", "setSceneConfig") | yes | — | — | action for component |
resultStart | integer | no | min 0; max 9007199254740991 | 0 | First character offset to return. Use 0 for the first call. |
resultEnd | integer | no | min 1; max 9007199254740991 | 8000 | Exclusive end offset. resultEnd - resultStart must be at most 8000. Increment resultStart by 8000 to page through large results. |
Reachable behavior
Advertised action values match the renderer children: create, createFromTemplate, edit, setSceneConfig.
Renderer child fields
These are the authoritative fields for each action. Send them on the same MCP call. Grouped MCP tools use passthrough, so these fields are not all listed in the advertised schema.
action=create
Renderer tool: createComponent.
Create a new Vidova custom component asset with TSX source code. Supports inputDefs including asset inputs: clip values store asset IDs; at preview/render, video/audio/image/model3d inputs become playback URLs, while assetTypes ['vidova'] becomes a VidovaClipData object with screen, camera, cursor, click, and keyboard data. For image/video/audio signals use @initial('') — never put an asset ID in @initial. Pass the signal to <Img src> or <Video src> with explicit width and height. Place only the component clip; do not add a parallel image/video clip for the same asset. Import from @vidova/2d, @vidova/core, and @vidova/components. Shaders are SkSL, not GLSL: wrap content in a cached node and pass shaders={{ fragment, uniforms }}. Put #include "@vidova/core/shaders/common.sksl" at the top of the fragment, or wrap the body with withCommonShader() from @vidova/core. Entry point is half4 main(float2 coord); sample with sampleSource(uv). For embedded Video nodes, call videoRef().play() directly; never spawn(videoRef().play()) because Video.play() returns void. The component will be compiled and available for use on the timeline.
| Field | Type | Required | Constraints | Default | Description |
|---|---|---|---|---|---|
name | string | yes | minLength 1 | — | Display name for the component asset |
code | string | yes | minLength 1 | — | Vidova Motion TSX source code |
componentName | string | yes | minLength 1 | — | Exported class name (e.g. ProgressRing) |
inputDefs | object[] | no | — | — | Input definitions for dynamic props. For type 'asset', default/component input values are asset IDs; Vidova resolves them to playback URLs before passing props into the component. |
inputDefs[].name | string | yes | — | — | — |
inputDefs[].type | enum("string", "number", "boolean", "color", "enum", "asset", "font") | yes | — | — | — |
inputDefs[].default | string \ | number \ | boolean | yes | — |
inputDefs[].label | string | no | — | — | — |
inputDefs[].options | string[] | no | — | — | For type 'enum': list of allowed options the user can choose from |
inputDefs[].assetTypes | enum("video", "audio", "image", "model3d", "vidova")[] | no | — | — | For type 'asset': accepted asset kinds. Defaults to video/audio/image/model3d/vidova. |
description | string | no | — | — | Short description of what the component does |
action=createFromTemplate
Renderer tool: createComponentFromTemplate.
Create a component from a premade template. Much faster than writing code from scratch. Use this when the user wants a standard component like simple text, a world map, typewriter text, progress ring, counter, pulsing dot, or lower third bar. You can customise the component by passing inputOverrides to set colours, text, sizes, and other parameters. Available templates:
| Field | Type | Required | Constraints | Default | Description |
|---|---|---|---|---|---|
templateId | string | yes | minLength 1 | — | ID of the template to use. Available templates: |
inputOverrides | object | no | — | — | Override default input values. Keys must match the template's inputDef names. For example: { "highlightCountry": "Brazil", "landColor": "#1b4332" } |
name | string | no | minLength 1 | — | Custom display name for the asset. Defaults to the template name. |
description | string | no | — | — | Short description of this instance |
Catalog templateId values:
simple-texttypewriterprogress-ringcounterpulsing-dotworld-map-3dlower-third-barfullscreen-overlay-afullscreen-overlay-bfullscreen-overlay-cfullscreen-overlay-dfullscreen-overlay-efullscreen-overlay-fcallout-arrowkeystroke-displaycode-blockcaption-pillcaption-karaokecaption-highlight
action=edit
Renderer tool: editComponent.
Edit an existing Vidova custom component. Can update code, name, componentName, inputDefs, or description. inputDefs may include asset inputs: clip values store asset IDs; at preview/render, video/audio/image/model3d inputs become playback URLs, while assetTypes ['vidova'] becomes a VidovaClipData object. For image/video/audio signals use @initial('') — never put an asset ID in @initial. Pass the signal to <Img src> or <Video src> with explicit width and height. Place only the component clip; do not add a parallel image/video clip for the same asset. Import from @vidova/2d, @vidova/core, and @vidova/components. Shaders are SkSL, not GLSL: wrap content in a cached node and pass shaders={{ fragment, uniforms }}. Put #include "@vidova/core/shaders/common.sksl" at the top of the fragment, or wrap the body with withCommonShader() from @vidova/core. Entry point is half4 main(float2 coord); sample with sampleSource(uv). For embedded Video nodes, call videoRef().play() directly; never spawn(videoRef().play()) because Video.play() returns void. When updating code, provide the complete new source.
| Field | Type | Required | Constraints | Default | Description |
|---|---|---|---|---|---|
assetId | string | yes | minLength 1 | — | ID of the component asset to edit |
code | string | no | — | — | Updated Vidova Motion TSX source code |
name | string | no | — | — | Updated display name |
componentName | string | no | — | — | Updated exported class name |
inputDefs | object[] | no | — | — | Updated input definitions. For type 'asset', default/component input values are asset IDs; Vidova resolves them to playback URLs before passing props into the component. |
inputDefs[].name | string | yes | — | — | — |
inputDefs[].type | enum("string", "number", "boolean", "color", "enum", "asset", "font") | yes | — | — | — |
inputDefs[].default | string \ | number \ | boolean | yes | — |
inputDefs[].label | string | no | — | — | — |
inputDefs[].options | string[] | no | — | — | For type 'enum': list of allowed options the user can choose from |
inputDefs[].assetTypes | enum("video", "audio", "image", "model3d", "vidova")[] | no | — | — | For type 'asset': accepted asset kinds. Defaults to video/audio/image/model3d/vidova. |
description | string | no | — | — | Updated description |
action=setSceneConfig
Renderer tool: setSceneConfig.
Set project resolution, frame rate, background, wallpaper, name, caption/text defaults, or a complete project style. Only provided fields are updated; explicit fields are applied after styleState.
| Field | Type | Required | Constraints | Default | Description |
|---|---|---|---|---|---|
width | integer | no | min 320; max 9007199254740991 | — | Output width in pixels (min 320) |
height | integer | no | min 240; max 9007199254740991 | — | Output height in pixels (min 240) |
fps | integer | no | min 1; max 240 | — | Frames per second (1–240). Common: 24, 30, 60. |
background | string | no | minLength 1 | — | Background color, gradient, or CSS value |
backgroundImage | object \ | null | no | — | — |
name | string | no | minLength 1; maxLength 180 | — | Project name |
captionSettings | object | no | strict | — | Project caption defaults; merges with current/default settings. |
captionSettings.enabled | boolean | no | — | — | — |
captionSettings.fontFamily | string | no | — | — | — |
captionSettings.fontWeight | 400 \ | 500 \ | 700 | no | — |
captionSettings.fontSize | number | no | — | — | — |
captionSettings.distanceFromBottom | number | no | — | — | — |
captionSettings.style | enum("pill", "karaoke-lime", "karaoke-magenta", "karaoke-cyan", "outlined", "bold-outline", "minimal", "word-highlight", "pink-pill", "dark-pill-lime", "cloud-blob", "amber-tape", "studio") | no | — | — | — |
captionSettings.textColor | string | no | — | — | — |
captionSettings.highlightColor | string | no | — | — | — |
captionSettings.backgroundColor | string | no | — | — | — |
captionSettings.shadowColor | string | no | — | — | — |
captionSettings.shadowBlur | number | no | — | — | — |
captionSettings.maxCharsPerLine | number | no | — | — | — |
textClipSettings | object | no | strict | — | Defaults for newly created text clips; merges with current/default settings. |
textClipSettings.fontFamily | string | no | — | — | — |
textClipSettings.fontWeight | 400 \ | 500 \ | 700 | no | — |
textClipSettings.defaultFontSize | number | no | — | — | — |
textClipSettings.defaultFill | string | no | — | — | — |
styleState | object | no | strict | — | Complete project style plus override keys. The style is applied to existing Vidova clips. |
styleState.style | object | yes | strict | — | — |
styleState.style.id | enum("launch", "demo-day", "tutorial", "social-cut", "deep-dive", "sales-demo", "parallax", "sunset", "pop", "terminal", "course", "mobile", "webinar", "mono", "plain") | yes | — | — | — |
styleState.style.background | string | yes | minLength 1 | — | — |
styleState.style.padding | number | yes | min 0; max 400 | — | — |
styleState.style.cornerRadius | number | yes | min 0; max 200 | — | — |
styleState.style.shadowStrength | number | yes | min 0; max 100 | — | — |
styleState.style.zoomIntensity | 0 \ | 1 \ | 2 \ | 3 \ | 4 \ |
styleState.style.zoomFeel | enum("soft-spring", "snappy-spring", "soft-landing", "fast-settle", "gentle-curve") | no | — | "soft-spring" | — |
styleState.style.zoom3D | boolean | no | — | false | — |
styleState.style.cursorStyle | enum("default", "cartoon", "modern", "original", "banana", "capitaine-dark", "capitaine-light", "touch", "tahoe", "whitesur", "bibata", "bibata-original") | no | — | "default" | — |
styleState.style.cursorSize | number | no | min 24; max 200 | 64 | — |
styleState.style.cursorSpotlight | boolean | no | — | false | — |
styleState.style.cameraShape | enum("default", "squircle", "circle") | yes | — | — | — |
styleState.style.cameraSize | number | yes | min 0; max 1 | — | — |
styleState.style.showShortcuts | boolean | yes | — | — | — |
styleState.style.captionsEnabled | boolean | yes | — | — | — |
styleState.style.captionStyle | enum("pill", "karaoke-lime", "karaoke-magenta", "karaoke-cyan", "outlined", "bold-outline", "minimal", "word-highlight", "pink-pill", "dark-pill-lime", "cloud-blob", "amber-tape", "studio") | yes | — | — | — |
styleState.style.captionFontSize | number | yes | min 8; max 200 | — | — |
styleState.overrides | enum("background", "padding", "cornerRadius", "shadowStrength", "zoomIntensity", "zoomFeel", "zoom3D", "cursor", "cameraShape", "cameraSize", "showShortcuts", "captions")[] | yes | — | — | — |
Result window
Every local MCP tool accepts resultStart and resultEnd so large payloads can be paged.
resultStart— first character offset. Default0.resultEnd— exclusive end offset. Default8000.resultEnd - resultStartmust be at most 8000 characters.- Increment
resultStartby 8000 to read the next window.
