Docs

component MCP tool

Custom components and scene config.

View as Markdown

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.

FieldTypeRequiredConstraintsDefaultDescription
actionenum("create", "createFromTemplate", "edit", "setSceneConfig")yes——action for component
resultStartintegernomin 0; max 90071992547409910First character offset to return. Use 0 for the first call.
resultEndintegernomin 1; max 90071992547409918000Exclusive 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.

FieldTypeRequiredConstraintsDefaultDescription
namestringyesminLength 1—Display name for the component asset
codestringyesminLength 1—Vidova Motion TSX source code
componentNamestringyesminLength 1—Exported class name (e.g. ProgressRing)
inputDefsobject[]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[].namestringyes———
inputDefs[].typeenum("string", "number", "boolean", "color", "enum", "asset", "font")yes———
inputDefs[].defaultstring \number \booleanyes—
inputDefs[].labelstringno———
inputDefs[].optionsstring[]no——For type 'enum': list of allowed options the user can choose from
inputDefs[].assetTypesenum("video", "audio", "image", "model3d", "vidova")[]no——For type 'asset': accepted asset kinds. Defaults to video/audio/image/model3d/vidova.
descriptionstringno——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:

FieldTypeRequiredConstraintsDefaultDescription
templateIdstringyesminLength 1—ID of the template to use. Available templates:
inputOverridesobjectno——Override default input values. Keys must match the template's inputDef names. For example: { "highlightCountry": "Brazil", "landColor": "#1b4332" }
namestringnominLength 1—Custom display name for the asset. Defaults to the template name.
descriptionstringno——Short description of this instance

Catalog templateId values:

  • simple-text
  • typewriter
  • progress-ring
  • counter
  • pulsing-dot
  • world-map-3d
  • lower-third-bar
  • fullscreen-overlay-a
  • fullscreen-overlay-b
  • fullscreen-overlay-c
  • fullscreen-overlay-d
  • fullscreen-overlay-e
  • fullscreen-overlay-f
  • callout-arrow
  • keystroke-display
  • code-block
  • caption-pill
  • caption-karaoke
  • caption-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.

FieldTypeRequiredConstraintsDefaultDescription
assetIdstringyesminLength 1—ID of the component asset to edit
codestringno——Updated Vidova Motion TSX source code
namestringno——Updated display name
componentNamestringno——Updated exported class name
inputDefsobject[]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[].namestringyes———
inputDefs[].typeenum("string", "number", "boolean", "color", "enum", "asset", "font")yes———
inputDefs[].defaultstring \number \booleanyes—
inputDefs[].labelstringno———
inputDefs[].optionsstring[]no——For type 'enum': list of allowed options the user can choose from
inputDefs[].assetTypesenum("video", "audio", "image", "model3d", "vidova")[]no——For type 'asset': accepted asset kinds. Defaults to video/audio/image/model3d/vidova.
descriptionstringno——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.

FieldTypeRequiredConstraintsDefaultDescription
widthintegernomin 320; max 9007199254740991—Output width in pixels (min 320)
heightintegernomin 240; max 9007199254740991—Output height in pixels (min 240)
fpsintegernomin 1; max 240—Frames per second (1–240). Common: 24, 30, 60.
backgroundstringnominLength 1—Background color, gradient, or CSS value
backgroundImageobject \nullno——
namestringnominLength 1; maxLength 180—Project name
captionSettingsobjectnostrict—Project caption defaults; merges with current/default settings.
captionSettings.enabledbooleanno———
captionSettings.fontFamilystringno———
captionSettings.fontWeight400 \500 \700no—
captionSettings.fontSizenumberno———
captionSettings.distanceFromBottomnumberno———
captionSettings.styleenum("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.textColorstringno———
captionSettings.highlightColorstringno———
captionSettings.backgroundColorstringno———
captionSettings.shadowColorstringno———
captionSettings.shadowBlurnumberno———
captionSettings.maxCharsPerLinenumberno———
textClipSettingsobjectnostrict—Defaults for newly created text clips; merges with current/default settings.
textClipSettings.fontFamilystringno———
textClipSettings.fontWeight400 \500 \700no—
textClipSettings.defaultFontSizenumberno———
textClipSettings.defaultFillstringno———
styleStateobjectnostrict—Complete project style plus override keys. The style is applied to existing Vidova clips.
styleState.styleobjectyesstrict——
styleState.style.idenum("launch", "demo-day", "tutorial", "social-cut", "deep-dive", "sales-demo", "parallax", "sunset", "pop", "terminal", "course", "mobile", "webinar", "mono", "plain")yes———
styleState.style.backgroundstringyesminLength 1——
styleState.style.paddingnumberyesmin 0; max 400——
styleState.style.cornerRadiusnumberyesmin 0; max 200——
styleState.style.shadowStrengthnumberyesmin 0; max 100——
styleState.style.zoomIntensity0 \1 \2 \3 \4 \
styleState.style.zoomFeelenum("soft-spring", "snappy-spring", "soft-landing", "fast-settle", "gentle-curve")no—"soft-spring"—
styleState.style.zoom3Dbooleanno—false—
styleState.style.cursorStyleenum("default", "cartoon", "modern", "original", "banana", "capitaine-dark", "capitaine-light", "touch", "tahoe", "whitesur", "bibata", "bibata-original")no—"default"—
styleState.style.cursorSizenumbernomin 24; max 20064—
styleState.style.cursorSpotlightbooleanno—false—
styleState.style.cameraShapeenum("default", "squircle", "circle")yes———
styleState.style.cameraSizenumberyesmin 0; max 1——
styleState.style.showShortcutsbooleanyes———
styleState.style.captionsEnabledbooleanyes———
styleState.style.captionStyleenum("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.captionFontSizenumberyesmin 8; max 200——
styleState.overridesenum("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. Default 0.
  • resultEnd — exclusive end offset. Default 8000.
  • resultEnd - resultStart must be at most 8000 characters.
  • Increment resultStart by 8000 to read the next window.