Chorono
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Control the real connected Chorono editor. Start with list_sessions and get_capabilities; choose sessionId if more than one tab is connected. Read get_scene before editing existing work. Use expectedRevision to prevent overwriting manual edits, and requestId for retry-safe mutations. run_script is isolated and atomic. Create/select explicit timelines for multiple animations. Use render_preview and inspect the returned image; evaluate_frame alone does not prove visual quality. Save portable projects with save_project. Use only documented SceneAPI methods.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| clear_sceneB | Remove all layers and timelines from the scene (fresh start). Use before generating a complete new animation from scratch. |
| update_compositionC | Change canvas composition settings (size, duration, framerate, background color). |
| add_layerB | Add a new layer to the scene. Set a meaningful id (e.g. "bg_rect", "title_text") — you will use this id in add_keyframes track targets. |
| update_layerB | Update properties of an existing layer. Only provide fields you want to change. |
| delete_layerC | Remove a layer from the scene. |
| create_timelineA | Create an animation timeline. You MUST create a timeline before calling add_keyframes. Set a meaningful id (e.g. "intro", "loop_anim") — you will reference it in add_keyframes. |
| add_keyframesA | Add keyframes to animate a layer property. Auto-creates timeline + track if missing. TRACK TARGET FORMAT: "layers.{layerId}.{property}" AVAILABLE PROPERTIES: opacity → 0.0 - 1.0 transform.x → pixels (horizontal position) transform.y → pixels (vertical position) transform.scaleX → 1.0 = 100% transform.scaleY → 1.0 = 100% transform.rotationDeg → degrees style.fill.color → "#rrggbb" hex string (SNAP — does NOT interpolate) style.fill.opacity → 0.0 - 1.0 style.stroke.width → pixels style.cornerRadius → pixels text.fontSize → pixels text.letterSpacing → pixels effects.blur → 0 - 100 EXAMPLES: target: "layers.bg_circle.opacity" target: "layers.title_text.transform.y" target: "layers.logo.transform.scaleX" |
| list_layersB | List all layers in the scene (terse): id, type, name, visibility. Use to discover what exists before editing. |
| list_assetsA | List uploaded media assets (image/video/audio) with their ids. Use to find a valid assetId before add_layer type=image/video/audio. AI cannot upload files. |
| describe_layerB | Detailed dump of one layer (transform, opacity, size, style, type-specific data). |
| describe_timelineB | List a timeline's tracks and their keyframes (target, times, values). |
| get_scene_jsonA | Full ChronoScene JSON. Use sparingly (large) — prefer list_layers / describe_*. |
| evaluate_at_timeB | Compute animated property values at a given time (ms). Optionally filter to one target path (e.g. "layers.ball.transform.y"). Use to VERIFY an animation. |
| create_state_machineA | Create a state machine that switches between timelines based on events/guards. Create the per-state timelines FIRST, then this, then add_sm_state for each state. Use for interactive / multi-state scenarios (hover→active, idle→walk→run, 4 seasons…). |
| add_sm_stateB | Add a state to a state machine. Each state plays one timeline while active. The first state added becomes the initial state automatically. |
| add_sm_transitionA | Connect two states with a transition. Fires on |
| set_initial_stateC | Set which state a state machine starts in. |
| add_particle_emitterB | Add a particle emitter. Pick a preset by friendly name — confetti, sparkle, magic, smoke, fire, snow, rain, rocket — then optionally override count / durationMs / loop / position. Use for "confetti", "fireworks", "falling snow", etc. |
| add_parameterA | Add a scene parameter — a named runtime value (number/boolean/color/string) that triggers, bindings, wires, and state-machine guards can read and write. |
| add_triggerA | Add an event→action rule. When |
| add_bindingB | Add a linear binding that remaps a source (parameter or layer property) onto a target (layer property / timeline progress / parameter) via inputMin→outputMin … inputMax→outputMax. |
| add_parameter_wireA | Add an expression-driven wire. The source value is bound as |
| set_interactiveA | Make a layer interactive: tappable (fires click triggers) and/or draggable (fires drag events). Drag can follow the cursor, drive a parameter (setsParameter), or scrub a timeline (scrubsTimeline). |
| clone_layerA | Duplicate a layer. mode="copy" makes independent copies; mode="instance" makes live instances that mirror the source visual (editing the source updates them). count = number of NEW copies, each offset by (offsetX, offsetY) from the last. |
| array_layerA | Lay out copies of a layer in a pattern: "linear" (row/column via moveX/moveY), "grid" (columns×rows), "radial" (count around a circle: radius + angles), or "path" (distribute along a path layer). count includes the source. cloneMode copy|instance. |
| add_pathA | Create a bezier path layer from an array of [x,y] points. role="visual" draws a stroke; role="motion" is an invisible guide for assign_motion_path. Points are in layer-local px; set x/y to position the path. |
| assign_motion_pathB | Make a layer travel along a path layer (followPath). Set animateMs to auto-animate progress 0→1 over that duration. orientToPath rotates the layer to face the path tangent. |
| trim_pathA | Reveal only part of a layer's stroke (line-draw / progress effect). start/end/offset are 0–1. Animate the reveal by keyframing layers..style.stroke.trim.end. |
| add_splineA | Create an editable spline primitive (circle/ellipse/rectangle/line/arc/donut/ngon/star). Use over add_layer shapes when the user wants an editable vector path (points/handles). Each kind takes its own geometry params (radius, sides, angles…). |
| create_objectB | Create ANY registered object kind, including shapes, text, group, media, spline, path, repeater or particle emitter. patch is a Partial. Discover kinds and properties with get_capabilities. |
| patch_objectA | Patch any Layer fields: text, typography, transforms, effects, masks, repeater, visibility, stroke, geometry or particle configuration. Nested objects replace their existing value; read describe_layer first. |
| update_timelineC | Set timeline duration, looping, pingPong, autoplay, work area, layer membership, markers, segments or events. |
| clone_timelineC | Duplicate an animation including keyframes, curves, modifiers, events and segments with a new timeline id. |
| delete_timelineB | Delete one timeline. Refuses timelines referenced by state machines. |
| set_keyframesB | Add or replace keyframes on an explicit timeline and layer property. Supports customBezier with {type:"customBezier",bezier:{cx1,cy1,cx2,cy2}}. Easing belongs to the starting keyframe. |
| update_trackB | Set track fields: keyframes, outOfRange, easeCurve, timeWarp, multiplierCurve, multiplierAmplitude, procedural waveform/noise controller, or complete modifier stack. |
| remove_trackC | Remove an animation track from an explicit timeline. |
| add_modifierC | Add a track modifier: sine, pulse, quantize, offset, scale, clamp, wave, noise, fractalNoise, jitter, timeWarp, bounce, elastic, overshoot, decay, spring. |
| bake_trackC | Bake procedural animation/modifiers into editable linear keyframes. |
| configure_particlesC | Update emitter and particle settings, gradients, physics and lifetime properties. |
| edit_entityB | Add/update/remove parameters, triggers, bindings, parameterWires or stateMachines by id. Use for advanced guards, transitions, formula wiring and runtime behavior. |
| list_timelinesB | List all animations, their duration, loop settings, tracks, segments and events. |
| group_layersC | Group selected layer ids in one undoable operation. |
| ungroup_layerB | Ungroup a group and preserve children transforms and animation. |
| list_sessionsB | List explicitly connected Chorono editor tabs. Use sessionId when several tabs are open. |
| get_capabilitiesB | Discover all tools, object kinds, particle presets, limits and the exact script API. |
| get_sceneA | Read the live editor scene plus revision, selected timeline and playhead. Read before editing existing work. |
| run_scriptA | Execute synchronous JavaScript in isolated QuickJS. Only scene API is available; no Node, DOM, fetch, imports or filesystem. All edits are atomic. dryRun returns a planId which apply_script_plan commits without rerunning code. |
| apply_script_planA | Commit a previously prepared script plan exactly once, retaining generated object ids. Refuses a stale scene revision. |
| batch_actionsB | Apply ordered native tools atomically as ONE undo step. run_script and transport/file tools cannot be nested here. |
| render_previewA | Return an actual PNG frame. With no timeMs/timelineIds/parameters, captures the current live state including state machines. For deterministic time-based state-machine previews specify timelineIds. parameters overrides values for this frame only. |
| control_playbackB | Play, pause, stop or seek the editor; select a timeline and set speed. timelineIds isolates animations in the live viewport; [] restores all animations. |
| control_runtimeB | Set live runtime parameters and dispatch a state-machine event. Events enable runtime test ticks so transitions/blends work while paused; testMode:false stops test ticks. |
| get_runtimeB | Read current runtime parameters, state-machine states, active timelines and playback state. |
| evaluate_frameC | Evaluate timelines, bindings, parameter wiring and runtime parameters at a requested time. Returns property values without rendering pixels. |
| undoC | Undo one editor transaction. |
| redoC | Redo one editor transaction. |
| save_projectB | Save a portable scene JSON with local blob media embedded. Files stay inside the configured project directory. Returns exact path, bytes, revision and hash. |
| list_projectsC | List saved project files inside the project directory. |
| load_projectA | Load a saved project by file name into the current editor as one undoable change. |
| export_runtimeC | Save validated and optimized runtime JSON in the export directory. |
| export_svgC | Save an SVG export using the existing vector exporter. |
| export_sequenceC | Render a frame sequence ZIP using the editor. Bounded to 300 frames per call. Does not include audio. |
| import_assetB | Import a media asset supplied as base64 file content using the existing import pipeline. No arbitrary local paths or server-side URL fetches. |
| validate_sceneB | Validate scene structure and return runtime-export diagnostics. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| animate_scene | Read, build, preview, refine and save a Chorono animation. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Chorono scripting API | |
| Tools, object kinds and particle presets | |
| Connected editor sessions |
TDQS
Scored across 65 tools
Many tools overlap: add_layer/create_object/add_spline/add_path all create visual objects; update_layer/patch_object/edit_entity all mutate layers or entities; add_keyframes/set_keyframes/update_track/add_modifier overlap animation editing. list_layers/describe_layer/get_scene_json/get_scene and evaluate_at_time/evaluate_frame are also easy to confuse despite some descriptive boundaries.
Most names are snake_case verb_noun, but verb families are inconsistent (add vs create vs set; update vs patch vs edit; get vs describe vs list). Abbreviations like add_sm_state and set_initial_state, plus get_scene vs get_scene_json, reduce predictability across 65 tools.
65 tools far exceed a well-scoped MCP surface and include many redundant or low-level alternatives to run_script/batch_actions. This is an extreme count for the apparent purpose, with overlapping clusters rather than distinct earned tools.
The surface covers scene/layer/timeline editing, animation, modifiers, particles, runtime behavior, state machines, export, persistence, assets, validation and undo. Minor lifecycle gaps remain, such as deleting saved projects/assets and full audio/video export, but core workflows are well covered.