rive-mcp
rive-mcp is a local MCP server for creating, editing, inspecting, rendering, and live-previewing Rive (.riv) animations without the Rive editor.
Create from scratch: build
.rivfiles from JSON scene specs with shapes, gradients, embedded images, text, bones/skinning, meshes, animation tracks, state machines, particles, audio, and semantic motion presets.Import and remix art: convert SVG, Iconify icons, and Lottie animations into Rive shapes/timing; decompile existing
.rivfiles into editable specs; auto-rig character PNGs.Inspect and diagnose: extract metadata and data bindings, dump binary structure, lint for structural/motion issues, check runtime compatibility, and diff files structurally or pixel-by-pixel.
Edit losslessly: change properties, swap text, delete subtrees, add/replace/remove keyframes, optimize redundant data, and repair safe lint findings.
Render and export: produce PNG frames, GIFs, APNGs, WebM videos, sprite sheets, batch renders, A/B comparison GIFs/APNGs, and Lottie JSON.
Critique and improve: generate design tokens, use motion presets, and run a critique loop with filmstrips, onion skins, motion vectors, metrics, and a scoring checklist.
Use the Studio: open a local Rive-editor-style UI with hierarchy, canvas editing, inspector, timeline, bezier curve editor, state-machine graph, onion skin, snapshots, bone posing, agent chat, hot reload, and one-click export.
Drive state machines: set/fire inputs, advance time, capture frames, and report state transitions.
Generate integration code: produce React, Vue, Svelte, plain JS, or Flutter code using real artboard/state-machine/input names.
Set up workflows: install the bundled design-guidelines skill and optionally share a read-only LAN Studio view.
Generates Flutter integration code for Rive animations, including artboard, state machine, and input names.
Generates React integration code for Rive animations, including artboard, state machine, and input names.
Allows creating, editing, inspecting, rendering, and live-previewing Rive (.riv) animations, including generating .riv from JSON, lossless editing, auto-rigging characters, and a local Studio for human-AI collaboration.
Generates Svelte integration code for Rive animations, including artboard, state machine, and input names.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rive-mcpcreate a bouncing ball .riv file"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
rive-mcp
Create, edit, inspect, render and live-preview Rive (.riv) animations from Claude โ no Rive editor and no subscription. The server runs on your machine; the few outside calls are listed under Network access.
๐ English | ๆฅๆฌ่ช | ็ฎไฝไธญๆ | ํ๊ตญ์ด | Espaรฑol | Franรงais | Deutsch | Portuguรชs (Brasil)
rive-mcp is a free MCP (Model Context Protocol) server that gives Claude (or any MCP client) full control over .riv files. Unlike the official Rive MCP (which requires the editor running) or paid third-party servers, it works with nothing but a .riv file โ and it can even build .riv files from scratch by serializing the binary format directly.
Rendering runs the official Rive runtime (@rive-app/canvas-advanced WASM) inside headless Chromium, so previews follow the runtime's output, except for the Canvas2D differences listed under Limitations.

Highlights
Generate
.rivfrom JSON โ shapes, gradients, embedded PNGs, text (including text on path), bones + skinning, IK, mesh deformation, keyframe animation with easing, multi-layer state machines, listeners, events, physics baking, particles, embedded audio (WAV/MP3/FLAC) fired from the timeline or a state machinePro-quality by construction โ 28 semantic motion presets (
pop-in, staggeredrise-in,breathing,stagger-in,parallax-drift,shimmer, โฆ) with professionally tuned amplitudes/easings, an OKLCH design-token generator (riv_design_tokens), motion-quality lint rules (robotic linear movement, teleports, missing stagger), and a one-call critique loop (riv_critique: frames + objective metrics + scoring checklist)Real vector art pipeline โ import SVG (Figma/Illustrator/Iconify, or npm SVG sets like
@twemoji/svgwhen offline) as true bezier paths (riv_import_svg,riv_asset_search), decompile existing.rivfiles into editable specs including gradients, blend modes and hand-tuned animation tracks (riv_decompile), plus trim paths (draw-on), clipping masks, blend modes (multiplyshadows,screenglows), follow-path motion, solos and detached bezier handles in the scene specLosslessly edit existing
.rivโ change any property, swap text, delete subtrees (references auto-remapped)Local web Studio โ Rive-editor-style 3-pane UI (hierarchy / canvas with click-select & drag / inspector / timeline) with hot reload; edits apply live. Also includes a bezier curve editor for hand-tuning keyframe easing (drag control points, hold/linear/cubic switching, 10 one-click presets), a state machine graph view (node graph of layers/states/transitions with lint findings and live-playback state highlighting), and an onion skin overlay (0-5 surrounding frames) for checking motion at a glance
Studio keeps growing โ drag-and-drop image replacement for embedded assets (lossless swap), multi-artboard tabs, named snapshot save/restore/delete, dope-sheet marquee/Shift-click multi-select with grouped drag and Ctrl+C/V copy-paste, and a bone overlay with FK drag-to-pose that bakes straight to a keyframe
Human โ AI loop โ a two-way Agent chat in the Studio: you type feedback (with the current selection/artboard/animation/time attached), the AI picks it up via
riv_studio_notes, fixes the file, and replies into the same thread; your browser updates instantlyAuto-rig characters โ one call turns a character PNG into a rigged
.rivwith cutout parts, bone-skinned head mesh, eye blink, idle/happy animations and a state machineData binding & pipeline tooling โ
riv_inspectdecodes ViewModel definitions, instances (with resolved values), enums, converters and bind wiring โ data binding inspection that few tools support yet;riv_batch_renderexports many files ร formats in one glob-aware call for CI, andriv_ab_comparecomposites two files side by side into one labeled GIF/APNG for design reviewTested end to end โ
test/e2e.mjsstarts the server and calls its tools over JSON-RPC onsamples/vehicles.riv; generated files are loaded, rendered and state-machine-driven by the official runtime in those tests
Related MCP server: RiveMCP
Tools (35)
Tool | What it does |
| Recursively find |
| Full metadata: artboards, animations (duration/fps/loop), state machines and inputs, plus data-binding structure (ViewModel definitions, instances with resolved values, enums, converters, bind wiring) when the file uses it |
| Static diagnostic: broken references, oversized embedded assets, unreachable state-machine states, unconditional self-transitions (infinite-loop risk), unused inputs, easing silently discarded on a track's last keyframe, motion-quality rules (all-linear "robotic" movement, teleporting objects, missing stagger, one-sided scale) |
| Render any moment to PNG (inline image + file) |
| Turn an animation into a preview GIF |
| Animated PNG export โ 24-bit color + alpha transparency (plays on GitHub) |
| Record an animation or state machine to WebM video |
| Sprite-sheet PNG + JSON metadata (for game engines) |
| Render a list of jobs โ single files or globs โ to png/gif/apng/webm/sprites in one call; per-job error isolation and a timing report, built for CI |
| Set/fire inputs โ advance โ state-transition report (+ optional frame captures) |
| Integration code with real artboard/SM/input names (React / JS / Vue / Svelte / Flutter) |
| Build a |
| Generate design tokens before designing: OKLCH-harmonized palette (+WCAG contrast), gradient pairs, Material-Motion durations & easing roles, spacing/radius/type scales โ deterministic from seed color + mood |
| SVG โ Rive bezier shapes (Figma/Illustrator exports, icons, illustrations): full cubic vertices, multi-contour paths, gradients, strokes, nested transforms โ so the AI composes pro artwork instead of drawing with primitives. Fragments plug into riv_create via |
| Search Iconify's ~200k professionally designed icons and import one directly as Rive shapes (needs network) |
| Lottie/bodymovin JSON โ Rive scene fragment โ pulls in LottieFiles' huge library of free professionally-animated assets art and choreography: keyframed transforms with exact bezier easing curves (not preset-approximated), path morphing (per-vertex keyframes), shape/null/precomp layers, gradients, trim-path draw-on, visibility windows. Unsupported bits (text layers, masks, mattes, โฆ) are counted, not silently dropped |
| .riv โ editable scene spec: study or remix professional files (bezier paths, gradients, solos, trim paths, animations with named easings); unsupported types are counted, not silently dropped |
| One-call review bundle that makes motion visible to a VLM: a filmstrip (frames leftโright), an onion-skin overlay (motion trails), a motion report (net displacement vector per animated object), objective metrics (bezier ratio, palette flags, easing distribution) + lint findings + a fixed 7-axis scoring checklist incl. spatial/directional coherence (does each mover travel toward its artwork's front? is the perspective consistent?) |
| Lossless editing of existing |
| Shrink a |
| Repair lint findings that can be fixed safely, one change at a time. Each candidate is compared pixel by pixel with the original, and a change that alters the rendering is skipped with the reason. Covers unused inputs, dead easing, broken references and unused interpolators. |
| Export one animation of a |
| Check which runtimes can run a |
| Extract embedded images/fonts from a |
| Pixel diff of two |
| Render two |
| Low-level binary structure dump (typeKeys / properties / hierarchy) |
| Cut character parts out of a PNG by polygon (for cutout rigging) |
| Character PNG โ fully rigged |
| Structural diff between two |
| Local web Studio: Rive-editor-style dark UI โ hierarchy tree, canvas select/drag/resize, inspector, keyframe timeline editing, bezier curve editor (drag control points, hold/linear/cubic, 10 easing presets), state machine graph view (node graph, transition details, lint-highlighted states, live playback highlighting), onion skin overlay, undo/redo, playback speed, one-click export (PNG/APNG/GIF/WebM), live preview + hot reload, EN/JA. |
| Read the Studio's Agent chat (with auto-attached context: selection, artboard, animation, playback time) and post replies back into it |
| Read a UI screenshot โ or, with |
| Screenshot โ animated |
| One-call environment setup: installs the bundled |
Screenshot โ animated prototype

riv_ui_detect reads a UI screenshot into an element tree with a numbered
overlay; assign a role to each element and riv_ui_prototype writes a working
.riv. Panels come back as editable vector rectangles, pictures as image slices,
and text is cut out with a real alpha matte where the colour model holds โ where
it does not, the element fades in place instead of moving, and says so. The
detector's limits are measured rather than asserted: see
docs/ui-screenshot-to-prototype.md.
If you still have the vector source, pass svgPath instead of imagePath to
the same two tools โ Figma's right-click โ Copy as SVG, or any Illustrator
export. Nothing is estimated then: rectangles, fills, corner radii and the
parent/child tree are read out of the file, artwork keeps its real bezier
vertices, <text> becomes editable Rive text (pass fonts for the design's own
faces; a run whose glyphs are missing is baked as a picture rather than as tofu,
always with a warning), embedded <image> data becomes an image asset, and Figma
layer names arrive as role hints. Nothing is fetched over the network โ unless
you opt in by setting FIGMA_TOKEN, which enables a figmaUrl argument that
pulls one frame straight from Figma's REST API; without the variable that
argument errors and no request is made, and no other tool reads it. Rive's
editor has accepted pasted SVGs since 2023; what these two calls add is that no
editor and no person are in the loop, and that the roles bring the motion โ
entrances, ambient loops and hover/press states โ with them.
Showcases: professional assets in, professional motion out
Four sample scenes are built end-to-end by the pipeline, each rebuildable with node samples/<name>/build-scene.mjs:
samples/weather-widget/โ the hero animation above: a UI weather card that cycles sunny โ rain (with a lightning flash) โ sunny on one looping timeline. Twemoji sun/cloud/bolt imported as SVG, colors fromriv_design_tokens, ambient motion from presets, everything clipped to the card.samples/cosmic-journey/โ every piece of artwork is professionally designed (Twemoji rocket, ringed planet, moon, stars, comet โ fetched as SVG via npm and converted withriv_import_svg); colors fromriv_design_tokens, motion from presets, composition fixed through theriv_critiqueloop.samples/night-delivery/โ remixes a professional.riv: Rive's official truck (hand-drawn bezier art and its hand-tuned wheel/body animation tracks) is extracted withriv_decompileand composed into a new night scene with a Twemoji moon, scrolling road and ascreen-blended headlight beam.samples/launch-success/โ hand-authored SVG + tokens + presets + TrimPath draw-on + particles + introโidle state machine.
Twemoji artwork ยฉ Twitter/X and contributors, CC-BY 4.0; truck artwork from Rive's official example files.
Design quality guidance
riv_create output can look like flat "AI placeholder" shapes if a client just wings the scene spec. The server bakes quality in structurally โ the recommended flow for any non-trivial scene is:
riv_design_tokensโ use only the returned palette/gradients/durations/easings (never invent raw hex or ad-hoc timings)riv_createwith motionpresetsinstead of hand-authored keyframes wherever one fitsriv_critiqueโ look at the frames, score the 7-axis checklist, fix anything below 4, re-run (at least twice)
The same workflow plus hand-authoring craft rules (bezier curves, easing semantics, rigging) is exposed as the rive-design-guidelines MCP prompt. It also carries numeric recipes (spacing/timing tokens, composition & layering rules, anti-patterns to avoid) across 6 dedicated sections. For clients without MCP prompts support, it ships as a portable skill file at skills/rive-design-guidelines/SKILL.md.
Quick start
Claude Code plugin (recommended) โ one install gets the MCP server, the design-guidelines skill, and the rive-designer agent:
/plugin marketplace add ODU33104/rive-mcp
/plugin install rive-mcp@rive-toolsOr install from npm:
# Register with Claude Code (user scope = available in every project)
claude mcp add --scope user rive -- npx -y rive-mcp-serverOr install globally first:
npm install -g rive-mcp-server
claude mcp add --scope user rive -- rive-mcpOr run from source:
git clone https://github.com/ODU33104/rive-mcp.git
cd rive-mcp
npm install
npm run build
claude mcp add --scope user rive -- node /absolute/path/to/rive-mcp/dist/index.jsTo check the registration, run claude mcp list: rive should show as Connected. Restart Claude Code after registering, then ask it to run riv_list on a folder to confirm the tools respond.
A Chromium-based browser is auto-detected in this order (nothing to install if Chrome or Edge is already present):
RIVE_MCP_CHROMEenv var (path to Chrome/Edge executable)Playwright browser cache
Installed Chrome โ Edge
Requires Node.js 20+ and a Chromium-based browser (Chrome, Edge or Chromium). If none is detected, set the RIVE_MCP_CHROME env var to the executable's path.
Relative paths in tool arguments resolve against the working directory the MCP server was started in. Use absolute paths when in doubt.
The Studio: human โ AI collaboration
riv_studio opens a local web page where a human can inspect, directly edit, and request changes to whatever the AI built (first-run guide included, UI in English/Japanese):
Let the AI build โ "create a bouncing-ball riv and open it with riv_studio"
Touch it โ click/drag objects on the canvas, tweak numbers & colors in the inspector (applies live)
Ask the AI โ type bigger changes into the Agent panel, then say "check the studio notes" in chat
When the AI edits the file, the browser hot-reloads instantly โ and it writes back what it changed, in the same chat
Works without a scene JSON too: any .riv can be edited property-by-property through the hierarchy + inspector.

Feature tour
Laid out like the editor you already know โ the Studio follows the official Rive editor's operating model: a Design / Animate mode switch, a Hierarchy panel with Expand All / Collapse All / Deep Expand / Deep Collapse on right-click and a name filter, Data / Assets / Animations / Agent accordions along the bottom of the left panel, and a Console / Problems / Changes status bar at the very bottom (Problems is wired to the same static checks as riv_lint, and clicking a finding jumps to it in the state-machine graph).
Keys are created where you'd expect them โ in Animate mode every animatable inspector row grows a diamond key button with three states: hollow (no track), outlined blue (animated but no key under the playhead), filled blue (keyed here). Click to key or unkey at the playhead. The dope sheet below is for reading and rearranging what's already there.
Multiple artboards & snapshots โ switch between a file's artboards with a tab bar, and save, restore or delete named snapshots of your edits โ a separate history from undo/redo.

Timeline / dope sheet โ per-track keyframes with seek, zoom and playback-speed control. Marquee- or Shift-click to select across tracks, drag a whole selection of keyframes together, and copy/paste with Ctrl+C/V anchored at the playhead (curves carry over).


Bezier curve editor โ pick a keyframe span, drag the control points, or apply one of 10 easing presets. Switch any span between hold / linear / cubic.

State machine graph view โ layers, states and transitions as a node graph; click a transition to see its duration / exitTime / conditions. Lint-integrated: unreachable states are red, unconditional self-transitions yellow, and the active state glows during playback.

State machine playground โ flip bool inputs and fire triggers from the browser to watch transitions happen.

Onion skinning โ ghost the surrounding 0โ5 frames with distance-based opacity to check motion arcs at a glance.

Direct editing โ select in the hierarchy or on the canvas, then edit position / rotation / scale / colors / text in the inspector with undo/redo.

Bone overlay & posing โ see the bone skeleton over the canvas, following the playhead (scrubbing, playing and paused all show the runtime-evaluated pose), drag to rotate a bone (FK) while paused, and bake the current pose into a keyframe.

Agent chat โ a two-way conversation, not a suggestion box. Your message ships with the current selection, artboard, animation and playhead time attached; the AI picks it up via riv_studio_notes and posts its result back into the same thread, so you can see what it changed without leaving the Studio.

One-click export
Click PNG / APNG / GIF / WebM in the Studio toolbar to render the current animation on the spot โ no MCP round-trip needed for a quick preview export.

Character animation
Turn a single character PNG into a naturally moving .riv:
riv_slice_imagecuts out ears/tail/etc. by polygon,riv_rig_characterassembles the whole rig in one call: pivot groups, a seamless 2-bone head mesh for tilting, vector eyelid blink, idle/happy animations and ahappytriggerOr compose manually with
riv_create: image embedding, grid meshes with per-vertex keyframes, bone chains with distance-weighted skinning, IK constraints
Example prompts
Examples for a cloned repository. With the npm version, the sample is in the package at <npm root -g>/rive-mcp-server/samples/ (global install), or use the path to your own .riv file.
"List the riv files in
samples/and inspect vehicles.riv""Render the
curvesanimation as a GIF""Create a riv of falling snow over a night sky and open it in the studio"
"Rig
characters/cat.pngโ ears and tail should move, and it should look happy on click""Check the studio notes" (after typing feedback into the Studio UI)
"Write the React integration code for this file"
Development
npm run build # vendor runtime assets + tsc
npm run test:e2e # spawns the real server, exercises all 35 tools over JSON-RPCdocs/riv-format.md documents the reverse-engineered knowledge of the .riv binary format used by the writer (typeKeys/propertyKeys resolved from the official rive-runtime type definitions vendored in vendor/rive-defs/defs.json).
Limitations
Text-run enumeration is not exposed by the runtime API (access by name works)
GIF output has no transparency (composited on a background color)
The Canvas2D preview renderer can show mesh seams that don't exist in the file (WebGL/Skia render clean)
fill.feather/stroke.feather(vector blur) writes correctly to the.rivbut isn't rendered by this server's Canvas2D preview pipeline โ only a GPU Rive Renderer supports itLuau scripting and the Layout engine are not generated (runtime spec still moving)
Screenshot detection (
riv_ui_detect) is sensitive to small pixel changes: a lossless PNG re-encode is identical, but ยฑ2 RGB noise reclassifies most vector panels and can nearly triple the element count. Every flat fill is test-rendered against the screenshot before it ships, so what survives is measured to match โ the cost is that fidelity wins over editability on photo-heavy pages, where most elements come back as slices that only fade. See docs/ui-screenshot-to-prototype.md for the measured numbers and the rest of the limits
Network access
The server runs locally. It makes outside requests only in these cases:
riv_asset_search: the Iconify API (api.iconify.design)figmaUrlonriv_ui_detect/riv_ui_prototype: the Figma REST API (api.figma.com), and only whenFIGMA_TOKENis set in the server's environment. Without it, no request is maderiv_studiowithshare: true: a read-only view that other devices on the same LAN can open. This is incoming traffic, not an outside callThe first
npx -y rive-mcp-serverdownloads the package from npm
License
Free to use (personal & commercial) โ but not open source. This is source-available freeware:
โ Use the software freely; the
.rivfiles and code it generates are yours without restrictionโ No modification, no redistribution, no derivative works
โ No reverse engineering; no AI-assisted analysis, extraction or reproduction of the code (including use as training data)
See LICENSE for the exact terms. Bundled third-party components: Inter font (OFL 1.1), Rive runtime & type definitions (MIT, ยฉ Rive, Inc.).
rive-mcp is an unofficial tool and is not affiliated with or endorsed by Rive, Inc.
Available Tools
35 toolsriv_ab_compareRender two .riv files side by side for visual A/B reviewA
Render the same artboard/animation/state-machine from two .riv files under identical conditions and composite them side by side (horizontal or vertical) into a single GIF/APNG for human review โ e.g. a rig before/after an edit, or two design variants. 'A: ' / 'B: ' labels are burned into each frame by default. If the two files' animation lengths differ, the shorter one holds on its final frame once it ends. Different from riv_visual_diff: that tool computes a per-pixel numeric diff of the SAME thing rendered two ways (for regression testing); this tool is for eyeballing two DIFFERENT things playing side by side (for design review), not measuring a delta.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Default 20 | |
| out | No | Output path (default: alongside pathA) | |
| pathA | Yes | First .riv file | |
| pathB | Yes | Second .riv file | |
| width | No | Panel width (default 320); panel height is derived from file A's aspect ratio and then forced onto file B so both panels align | |
| format | No | Output format (default gif) | |
| height | No | Panel height (default: derived from file A's own aspect ratio) | |
| labels | No | Burn 'A: <file>' / 'B: <file>' labels into each frame (default true) | |
| layout | No | Panel arrangement (default horizontal) | |
| artboard | No | Artboard name, applied to both files (default: first) | |
| duration | No | Seconds to render (default: the longer of the two files' own animation lengths) | |
| animation | No | Animation name, applied to both files (default: first) | |
| background | No | CSS background per panel (default: white for gif, transparent for apng) | |
| stateMachine | No | State machine name, applied to both files (takes precedence over animation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses labels burned by default, shorter file holds final frame, panel height derived from A and forced onto B, stateMachine precedence over animation, and default background behavior. These are meaningful behavioral traits beyond parameter names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-organized paragraph that front-loads the core purpose, includes concrete examples, and differentiates from alternatives without redundancy. Every sentence contributes information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 14 parameters and no output schema, the description covers key behaviors, defaults, and the output format. It could mention what the tool returns (e.g., path to output file), but overall it provides sufficient context for an agent to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies. The description reinforces that artboard/animation/stateMachine are applied to both files, but this is already present in the parameter descriptions. No new semantic value is added beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders two .riv files side by side into a composite GIF/APNG, with specific verbs and resource types. It also explicitly differentiates from riv_visual_diff, making the purpose unmistakable even among sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance (e.g., 'rig before/after an edit', 'design variants') and names the alternative riv_visual_diff, explaining why this tool is chosen for side-by-side review rather than pixel diff.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_asset_searchSearch/fetch professional vector icons (Iconify)A
Search Iconify's ~200k professionally designed open-source icons and convert one directly into Rive shapes. Two modes: query-only returns matching icon names; icon+outSpec downloads the SVG and imports it (same output as riv_import_svg). Requires network access to api.iconify.design.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Icon to fetch, e.g. 'solar:rocket-bold' (from a previous search) | |
| limit | No | Max results (default 24) | |
| query | No | Search terms, e.g. 'rocket launch' | |
| outSpec | No | Required with icon: output scene-fragment JSON path | |
| idPrefix | No | Prefix for generated shape ids; applies when fetching an icon (default: the icon name with non-alphanumerics replaced, plus an underscore) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a good job: it discloses the external network dependency on api.iconify.design, that the SVG is downloaded and imported into Rive, and that output matches riv_import_svg. It leaves unspecified whether the import mutates the active document or only writes the outSpec file, and says nothing about network failure or rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with scale and purpose, then modes, then the environment prerequisite. Every sentence adds information; nothing is repeated from the schema or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, annotation-free, no-output-schema tool, the description covers purpose, mode selection, network requirement, and return-shape parity with a sibling. The remaining gap is what exactly happens to the target Rive document on import, which matters for an agent deciding whether this is a safe read or a mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema cannot express: which parameters form which mode and that icon+outSpec are jointly required for the import path. Defaults and formats are already in the schema, so no further compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search Iconify's ~200k ... icons') plus the conversion behavior, and separates itself from riv_import_svg by declaring output parity. The dual-mode framing lets an agent distinguish the search-only and fetch-and-import paths without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lays out the two operating modes and the parameter combinations that select them ('query-only returns ...', 'icon+outSpec downloads and imports'), and states the network prerequisite. It stops short of an explicit when-to-use-this-vs-riv_import_svg rule, though 'same output as riv_import_svg' implicitly routes local-SVG cases to the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_batch_renderBatch-render many .riv files/formats in one callA
Render a list of jobs โ each a single .riv (rivPath) or a glob of .riv files (glob) โ to png/gif/apng/webm/sprites, sequentially reusing the same headless Chromium page (no parallel pages). Built for CI/scripts: call this tool repeatedly from your pipeline instead of expecting a live watch mode โ none is provided, since MCP's request/response model doesn't fit a background file watcher. 'defaults' holds options shared across every job; each job's own fields override them. Every job needs a format (in the job or in defaults), or that job fails. One job's failure does not stop the batch โ every job (and every file a glob expands to) gets its own success/error/outPath/durationMs entry in the returned report.
| Name | Required | Description | Default |
|---|---|---|---|
| jobs | Yes | Jobs to render, in order | |
| defaults | No | Shared defaults merged under each job (job-level values win) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: sequential rendering on one headless Chromium page, no parallel pages, no watch mode, per-job failure isolation, and report entries for every job/file. These are exactly the operational traits an agent needs before invoking it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well front-loaded, starting with what the tool renders before moving to execution and failure semantics. Most sentences earn their place, though the long paragraph could be slightly easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex nested-job tool with no output schema, the description is complete enough: it explains batching, defaults merging, format requirements, failure behavior, and the shape of the returned report entries. An agent has what it needs to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters thoroughly. The description adds meaningful semantics beyond it: defaults are merged under each job with job-level values winning, and every job needs a format either in the job or in defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: batch-render a list of .riv jobs to png/gif/apng/webm/sprites. It clearly distinguishes this batch tool from single-file rendering siblings by emphasizing lists, globs, and one-call batching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage context: built for CI/scripts and meant to be called repeatedly, with no live watch mode. It does not explicitly name single-render siblings as alternatives, but the batch-vs-single distinction is implicit and usable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_createCreate a .riv file from a scene specA
Create a working .riv animation file from scratch (no Rive editor needed) and validate it with the official runtime. Returns a rendered preview frame. For polished results (gradients, organic bezier curves, easing, springy motion), read the "rive-design-guidelines" prompt this server exposes before designing a non-trivial scene. Scene spec example: { "artboard": {"name":"Demo","width":400,"height":300}, "backgroundColor": "#1a1a2e", "shapes": [ {"id":"box","type":"rect","x":120,"y":150,"width":80,"height":80,"cornerRadius":12,"rotation":0,"opacity":1, "fill":{"color":"#e94560"},"stroke":{"color":"#fff","thickness":3}}, {"id":"ball","type":"ellipse","x":280,"y":150,"width":70,"height":70, "fill":{"gradient":{"type":"linear","stops":[{"color":"#00d9ff"},{"color":"#0066ff"}]}}}, {"id":"tri","type":"polygon","x":200,"y":100,"points":[{"x":0,"y":-40},{"x":35,"y":20},{"x":-35,"y":20}],"fill":{"color":"#ffd700"}} ], "animations": [ {"name":"spin","fps":60,"duration":60,"loop":"loop","tracks":[ {"target":"box","property":"rotation","keyframes":[{"frame":0,"value":0},{"frame":60,"value":360,"easing":"linear"}]}, {"target":"ball","property":"y","keyframes":[{"frame":0,"value":150},{"frame":30,"value":80,"easing":"ease-out"},{"frame":60,"value":150,"easing":"ease-in"}]} ]} ], "stateMachine": {"name":"SM","inputs":[{"name":"go","type":"bool"}], "states":[{"name":"spinning","animation":"spin"}], "transitions":[{"from":"entry","to":"spinning","condition":{"input":"go"}}]} } Character animation (images/groups/mesh): { "groups": [{"id":"rig","x":300,"y":200}], "images": [{"id":"chara","pngPath":"./cat.png","x":0,"y":0,"scale":0.25,"parent":"rig", "mesh":{"columns":6,"rows":6}}], "animations": [{"name":"idle","duration":240,"loop":"loop","tracks":[ {"target":"rig","property":"y","keyframes":[{"frame":0,"value":200},{"frame":120,"value":195,"easing":"ease-in-out"},{"frame":240,"value":200,"easing":"ease-in-out"}]}, {"target":"chara#v0_3","property":"x","keyframes":[{"frame":0,"value":0},{"frame":120,"value":40,"easing":"ease-in-out"},{"frame":240,"value":0,"easing":"ease-in-out"}]} ]}] }
layouts[]: Flex nodes {id,parent?,width?,height?,widthMode?,heightMode?,widthWeight?,heightWeight?,direction?,justifyContent?,alignItems?,gap?,padding?,margin?,wrap?,fillColor?}. Modes: fixed (default), percent (width/height is 0-100 percentage), auto (hug contents), fill (remaining space; optional positive weight per axis). gap: number or {horizontal?,vertical?}; padding/margin: number or {left?,right?,top?,bottom?}. Parent must be an earlier layout id. Shapes themselves do not become Flex items.
images[].pngPath: PNG file embedded into the .riv. mesh enables vertex deformation; vertices addressed as "#v_" (row 0 = top), coordinates in the image's natural pixel space centered at origin. Mesh vertex tracks support x/y only.
texts[].followPath {"path":"<shapes[].id>","start":0,"end":1,"offset":0,"strength":1,"orient":true} bends the text along that shape's path (text on path; start/end/offset are 0-1 fractions of the path length). Needs fonts[] like any text.
groups are Nodes usable as parents (parent) of shapes/images for rig hierarchies and pivots; animatable like shapes.
transitions support exitTimeMs (play source animation this long before transitioning). Motion presets (tuned amplitudes and easings; about 10x fewer tokens than hand-authored keyframes): "animations":[{"name":"intro","duration":90,"presets":[ {"preset":"pop-in","target":"logo"}, {"preset":"rise-in","targets":["c1","c2","c3"],"at":12,"stagger":4}, {"preset":"float","target":"logo"} ],"tracks":[]}] Available: fade-in rise-in drop-in slide-in pop-in bounce-in | fade-out sink-out slide-out pop-out | pulse heartbeat tada shake wobble | breathing float sway spin glow-pulse blink(for eyelid overlays). Options: at(start frame), stagger(frames between targets), intensity(0.25-3), direction(left|right|up|down), cycleSeconds. Ambient presets (breathing..blink) span the whole animation seamlessly. A preset and a manual track must not drive the same target+property. Pro features: stroke.trim {start,end,mode} + trimStart/trimEnd tracks (draw-on effect), shapes[].clipBy (mask via an invisible shape), groups[].solo+active + soloActive track with keyframes[].ref (pose/mouth switching), constraints [{type:"followPath",item,path}] + followDistance track 0-1 (motion along a path), open paths (closed:false), multi-contour shapes (subpaths), stroke cap/join. "imports":[{"spec":"logo.scene.json","x":200,"y":150,"scale":0.8}] places riv_import_svg / riv_asset_search fragments under a wrapper group (id = file basename) โ animate the wrapper or individual shape ids. PREFER imported real vector art over drawing with primitives for anything illustrative. Recommended flow: riv_design_tokens โ (riv_import_svg / riv_asset_search for artwork) โ riv_create (token values + presets + imports) โ riv_critique โ fix โ re-critique. Shape z-order: later in array = on top; images render above shapes. properties for tracks: x,y,rotation(deg),scaleX,scaleY,opacity(0-1),width,height,fillColor(needs "color" in keyframes). Colors: #RRGGBB or #AARRGGBB. rotation in degrees. Easings include emphasized-decel (enters) / emphasized-accel (exits). Audio: "audio":[{"id":"beep","path":"./beep.wav"}] embeds a WAV/MP3/FLAC file (path resolved relative to cwd, or pass bytes directly). "events":[{"id":"beepEvent","type":"audio","audio":"beep"}] declares an AudioEvent bound to that clip. Trigger it either from a state machine state ("states":[{"name":"s1","fireEvent":"beepEvent"}]) or at specific frames inside a timeline via animations[].events: {"name":"anim1","duration":60,"tracks":[...],"events":[{"event":"beepEvent","frame":0},{"event":"beepEvent","frame":30}]}. NOTE: this server's preview (Canvas2D) does not play audio, so PNG/GIF/video previews and riv_studio stay silent. The AudioAsset/AudioEvent are still written correctly and play in a GPU-backed Rive runtime (WebGL/Skia).
| Name | Required | Description | Default |
|---|---|---|---|
| scene | Yes | Scene spec with optional Flex layouts (see tool description) | |
| outPath | Yes | Output .riv path | |
| previewTime | No | Seconds into first animation for the preview frame (default 0.4) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the file is validated against the official runtime, that a rendered preview frame is returned, that PNG paths resolve relative to cwd, that z-order favors later array entries and images over shapes, and that the Canvas2D preview will not play audio even though the AudioAsset is written correctly. It never states what happens when outPath already exists (overwrite vs error) or how invalid specs fail, which keeps it short of a 5 for a file-writing mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but the complexity of the scene spec justifies most of the volume, and the core purpose and return value are front-loaded in the first line before any examples. Minor waste remains โ rotation units are stated twice, and the trailing bullet sprawl (layouts, mesh, followPath, groups, imports, pro features, audio) is appended rather than organized into a scan-friendly outline.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema and a 100%-covered top level but wide-open nested scene object, the description supplies everything an agent needs: two contrasting worked specs (graphics and character rig), preset catalog, pro-feature syntax, import behavior, z-order rules, and the audio limitation. No material invocation detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema coverage is 100%, but the scene object is declared with additionalProperties:true and only layouts is actually documented, so the description must supply the real semantics โ and it does, in depth, for shapes, animations, tracks, presets, groups, mesh vertices, followPath, imports, and audio events. It falls short of 5 because much of the meaning is conveyed by worked examples rather than enumerated fields, leaving some sub-keys (e.g. keyframe field options, state machine inputs) inferential.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ('Create a working .riv animation file from scratch') plus the distinguishing value proposition ('no Rive editor needed') and the side effect of runtime validation returning a preview frame. This clearly separates it from riv_edit, riv_import_svg, and other siblings that operate on existing files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit recommended pipeline ('riv_design_tokens โ riv_import_svg / riv_asset_search โ riv_create โ riv_critique โ fix โ re-critique') that tells the agent both when to use this tool and which siblings precede and follow it. It also states a preference rule ('PREFER imported real vector art over drawing with primitives') and directs the agent to the rive-design-guidelines prompt for non-trivial scenes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_critiqueCritique a .riv: filmstrip + onion skin + motion vectors + metrics + checklistA
One-call review bundle for the renderโcritiqueโrevise loop. Returns (1) a FILMSTRIP image โ N frames leftโright across the duration, so motion is readable as a sequence, (2) an ONION-SKIN image โ all frames ghost-overlaid so every mover leaves a visible trail (use it to check trajectories and travel direction vs the artwork's facing), (3) a MOTION REPORT โ net displacement/rotation vector per animated object computed from the file data, (4) objective design metrics + lint findings, and (5) a fixed 7-axis scoring checklist (incl. spatial/directional coherence). LOOK at the images, score each axis 1-5, fix anything below 4 (riv_edit / regenerate), then re-run. Iterate at least twice before delivering any non-trivial scene.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| width | No | Width of each filmstrip cell (default 200 โ keep small, it saves tokens) | |
| frames | No | Frames to sample across the duration (default 6) | |
| artboard | No | Artboard name (default: first artboard) | |
| animation | No | Animation to sample (default: first) | |
| stateMachine | No | State machine name (takes precedence over animation) | |
| individualFrames | No | Also return each sampled frame as a separate full-size image (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses all five return artifacts and what each is for (onion skin for trajectories/direction vs facing, motion vectors computed from file data, objective metrics + lint). It stops short of stating cost/failure behavior (e.g. what happens if the path is invalid or the scene has no animation), which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a numbered enumeration of returns, then the workflow imperative. Dense but every sentence earns its place โ no restating of the tool name, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema tool, the description covers the return surface thoroughly and tells the agent the decision procedure. The remaining gap is that only one of the seven checklist axes ('spatial/directional coherence') is named, so the agent cannot pre-anticipate the scoring rubric without the call result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (path, width, frames, artboard, animation, stateMachine, individualFrames) is already documented with defaults and ranges. The description only adds the 'N frames leftโright' framing and doesn't clarify precedence between animation and stateMachine or the token tradeoff of width/frames, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One-call review bundle for the renderโcritiqueโrevise loop') and enumerates exactly what it returns: filmstrip, onion skin, motion report, metrics/lint, and a 7-axis checklist. This clearly separates it from siblings like riv_lint, riv_visual_diff, and riv_render_gif, which each cover only a slice of this bundle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the when ('renderโcritiqueโrevise loop') and the when-next ('score each axis 1-5, fix anything below 4 (riv_edit / regenerate), then re-run'). It even names the alternative tool to use for fixes and sets a minimum iteration count ('at least twice'), leaving almost no scheduling inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_decompileDecompile a .riv into an editable scene specA
Reverse a .riv file into a riv_create scene spec (shapes with bezier vertices, solid/gradient fills incl. gradient opacity, blend modes, artboard background, groups/solos, trim paths, clipping, animations with named easings, loop modes). Paint objects are resolved by parentId, so editor-authored files (paints deferred to the stream tail) decompile correctly. Use it to study professional files as few-shot examples, or to remix them โ art AND hand-tuned animation tracks โ into new scenes (decompile โ edit spec โ riv_create; see samples/night-delivery). Object types outside the writer's coverage are counted in 'skipped', not silently dropped. Note: community/marketplace files are CC BY 4.0 โ keep attribution.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| outSpec | No | Write the scene spec JSON here (default: return summary only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does not disappoint. It discloses the parentId resolution behavior for editor-authored files, explains that unsupported object types are counted in 'skipped' rather than silently dropped, and flags licensing attribution for community/marketplace files. This goes beyond basic operation, though it omits side effects like writing the outSpec file and the default return behavior (which only appear in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a meaty paragraph, but every sentence carries substantive information: the core operation, supported features, parentId handling, skipped counting, workflow use, sample pointer, and licensing note. It is dense yet front-loaded with the primary purpose, and while it could be trimmed, it is not inflated with filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex conversion tool with no output schema, the description covers a wide range of relevant behavior: the exact types of content preserved, file provenance handling, unsupported-content visibility, practical use cases, and legal considerations. It does not fully specify the return format (only 'scene spec' and the schema's 'return summary only'), but it is broadly adequate for an agent to understand scope, limitations, and expected outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for both parameters (path and outSpec), so the baseline is 3. The description adds workflow context (decompile โ edit spec โ riv_create) and mentions the scene-spec output, but does not elaborate on parameter syntax or formatting beyond what the schema names. It is adequate but does not significantly enhance schema understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Reverse') and identifies the exact resource and output ('a .riv file into a riv_create scene spec'). It further enumerates the included element types (shapes, bezier vertices, fills, blend modes, etc.), clearly distinguishing this tool from siblings like riv_dump or riv_inspect by its transformation goal and editable-spec target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool: 'study professional files as few-shot examples, or to remix them', and provides a concrete workflow (decompile โ edit spec โ riv_create with sample reference). It lacks explicit 'when not to use' or named alternatives, but the use cases are clearly framed with enough context to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_design_tokensGenerate a design-token set (palette / motion / layout)A
Deterministically generate professional design tokens for a scene BEFORE calling riv_create: an OKLCH-harmonized palette (with WCAG contrast ratios), gradient pairs, Material-Motion-derived durations & easing roles, spacing/radius/stroke scales and a type scale. Call this first, then use ONLY the returned values in the scene spec โ never invent raw hex colors or ad-hoc durations. Inputs: optional seed color, mood (calm|playful|elegant|tech|warm|natural), scheme (dark|light).
| Name | Required | Description | Default |
|---|---|---|---|
| mood | No | Sets the default hue when seed is absent (default calm) | |
| seed | No | Brand/seed color #RRGGBB (optional; mood default hue otherwise) | |
| scheme | No | Default dark |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses determinism, what each generated group contains (OKLCH palette with WCAG ratios, gradient pairs, motion roles, scales), and the strict usage contract. It does not explicitly state side effects or permissions, but the generative read-only nature is strongly implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: first sentence states what is generated, second states the critical usage contract, third summarizes inputs. Every clause earns its place and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return values, and it does so at the category level (palette, gradients, motion, scales, type). It lacks exact output shape or pagination-style details, but is complete enough for an agent to know what to expect and how to use the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents mood, seed, and scheme with defaults. The description lists the same inputs and the mood enum, adding only minor framing ('optional seed color') beyond the structured schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (generate) and resource (design tokens) with clear scope: palette, gradients, motion, spacing, type. It explicitly distinguishes itself from sibling riv_create by saying it must be called before scene creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call this first, then to use ONLY the returned values and never invent raw hex colors or ad-hoc durations. It also names the downstream sibling riv_create, leaving no ambiguity about ordering or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_diffDiff two .riv filesB
Structural diff between two .riv files: type count changes and per-object property differences.
| Name | Required | Description | Default |
|---|---|---|---|
| pathA | Yes | Path to the first .riv file | |
| pathB | Yes | Path to the second .riv file | |
| maxDiffs | No | Max object diffs to list (default 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses what the diff reports (type counts, per-object property diffs), which is real behavioral content, but says nothing about read-only semantics, error behavior on invalid/mismatched files, or that the per-object list is truncated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource, the operation, and the two comparison axes with no filler. Nothing to trim and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and its parameters are fully documented in the schema, but with no output schema the description should convey the return shape more concretely. It hints at result content (count deltas, property differences) yet omits result structure and truncation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pathA/pathB/maxDiffs are already documented, and the baseline of 3 applies. The description adds no meaning beyond the schema โ notably it never mentions that the per-object diff list is capped by maxDiffs (default 30), which is the one non-obvious parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (structural diff of two .riv files) plus the exact dimensions compared: type count changes and per-object property differences. This implicitly separates it from riv_visual_diff, but the sibling is never named, so an agent must infer that 'structural' excludes rendering/pixel comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites (are the files required to be valid/parsable?), and no explicit routing to alternatives. With riv_visual_diff, riv_ab_compare, and riv_inspect in the sibling set, the absence of any exclusion or selection criteria leaves the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_dumpDump .riv binary structureA
Low-level dump of a .riv file's object stream (typeKeys, property values, hierarchy). Useful for debugging and format research. Large files return a summary unless full=true.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Return every object (default: summary + first 50) | |
| path | Yes | Path to the .riv file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a critical non-obvious behavior: large files return a summary unless full=true. Since no annotations are provided, this is important context. It could additionally mention output format or errors, but for a read-only dump tool the disclosure is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose and key behavior. Every sentence earns its place, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter set and full schema coverage, the description provides the essential context: purpose, use case, and truncation behavior. It lacks explicit return format details, but as a low-level debugging tool this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully documented in the schema (100% coverage), and the description only restates the 'full' parameter's behavior without adding new details. Baseline 3 is appropriate when the schema already handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Dump') on a specific resource ('.riv file's object stream') and enumerates the content (typeKeys, property values, hierarchy). It distinguishes itself from sibling tools like riv_inspect or riv_list by emphasizing its low-level binary focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Useful for debugging and format research' provides clear context for when to use the tool. It does not explicitly mention alternatives or when not to use it, but the stated use cases effectively guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_editEdit an existing .riv fileA
Modify an existing .riv (lossless roundtrip): set any property, change named text runs, delete objects (with automatic subtree + reference remapping), or edit keyframes on an existing animation (op=setKeyframes). Use riv_dump to find object indices/names. Renders a preview of the result. setKeyframes: target an animated object via index/name(+type), give 'animation' (LinearAnimation name) and 'property' (x/y/rotation/scaleX/scaleY/opacity/width/height โ rotation in degrees), then 'keyframes' (array of {frame,value,easing}). 'mode': replace (default, swaps the whole track) | add (appends keyframes, creating the track if absent) | remove (deletes keyframes matching the given frame numbers; keyframes[].value/easing are ignored).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Source .riv path | |
| edits | Yes | Edit operations, applied in order | |
| outPath | No | Output path (default: overwrite source) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does much of it: it discloses that deletes trigger automatic subtree and reference remapping, that a preview is rendered, and that edits apply in order. It leaves gaps around failure behavior (partial application on error), overwrite risk confirmed only via the schema's outPath default, and what the preview actually returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation inventory in sentence one, then spends the second paragraph exclusively on the most complex op (setKeyframes), which is the right allocation of space. It is dense with long parentheticals and could be split into a short bulleted op list, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested, multi-op mutation tool with no annotations and no output schema, the description covers the operation taxonomy and the hardest sub-mode in usable depth. Remaining gaps are error/atomicity semantics and what the rendered preview contains โ meaningful but secondary for a call to succeed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics: rotation is in degrees, mode=replace swaps the whole track vs add appends/creates, and remove deletes by frame number while ignoring value/easing. The schema's own enum descriptions for mode and keyframes are terse, so this materially improves correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Modify an existing .riv') and immediately enumerates the four supported operations (set, setText, delete, setKeyframes), which maps directly onto the op enum. It is clearly distinguishable from riv_create (new file) and riv_dump (read-only inspection), which it explicitly references as the companion lookup tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite and routing instruction: use riv_dump to find object indices/names before editing, and notes the roundtrip is lossless. It does not state explicit when-not conditions (e.g. when to prefer riv_create vs this, or when to use riv_optimize afterwards), so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_export_lottieExport a .riv animation to Lottie JSONB
Export one .riv animation to Lottie JSON. Reports unsupported and approximated features, and indicates whether pixel comparison was available.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Output FPS (default: animation FPS) | |
| out | No | Output JSON path (default: adjacent .lottie.json) | |
| path | Yes | Path to a .riv file | |
| artboard | No | Artboard name (default: first) | |
| animation | No | Animation name (default: first; all unsupported) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden, and it does add real value by disclosing that the result reports unsupported/approximated features and whether pixel comparison was available โ non-obvious fidelity caveats for a Lottie exporter. However, it never states that the tool writes a file to disk, what happens if the output path already exists, or what the "all unsupported" annotation on the animation parameter means for callers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and format, followed by what the result reports. Nothing is wasted and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five fully documented parameters and no output schema, the description usefully explains what the response conveys (unsupported/approximated features, pixel comparison availability). The remaining gap is the file-write side effect and its overwrite/error semantics, which an agent needs before pointing the tool at a real path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (fps, out, path, artboard, animation) is already documented with defaults. The description adds only the "one animation at a time" scoping constraint and otherwise restates the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource+target format ("Export one .riv animation to Lottie JSON"), which cleanly separates it from render-oriented siblings like riv_render_video or riv_render_gif. It doesn't acknowledge the near-neighbor sibling riv_lottie_import or state the inverse relationship, so the differentiation is inferred rather than declared.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no "use this when..." clause, no exclusions, and no mention of alternatives such as riv_render_video for visual output or riv_dump for raw data. The agent must infer the conversion use case entirely from the one-line purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_extract_assetsExtract embedded assets from a .riv fileA
Extract embedded image/font/audio asset binary contents (ImageAsset/FontAsset/AudioAsset + FileAssetContents pairs) from a .riv file to disk, with the file extension inferred from magic bytes (PNG/JPEG/WEBP/TTF/OTF/WOFF/WOFF2/GIF). Externally-referenced (non-embedded) assets are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| outDir | No | Output directory (default: <file>.assets alongside the .riv) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full transparency burden. It discloses important behavioral details: file extension inference from magic bytes (PNG/JPEG/WEBP/TTF/OTF/WOFF/WOFF2/GIF) and the skipping of externally-referenced assets. This goes beyond a simple action statement, though it omits overwrite behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that is front-loaded with the primary action and resource. Every clause adds value: asset types, destination, magic-byte inference, and the exclusion of external references. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter extraction tool with no output schema and no annotations, the description covers all essential aspects: what is extracted, how files are named, and what is skipped. It could mention folder creation or overwrite behavior, but that is not critical for tool selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with both 'path' and 'outDir' well-described. The tool description adds no additional parameter meaning beyond what is already in the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts embedded image/font/audio asset binaries from a .riv file to disk. It specifies exact asset types (ImageAsset/FontAsset/AudioAsset + FileAssetContents pairs) and the magic-byte inference, which distinguishes it from sibling tools like riv_asset_search or riv_inspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool (extracting raw embedded asset binaries to disk) and gives context that externally-referenced assets are skipped. However, it does not explicitly name alternative tools or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_generate_codeGenerate integration codeA
Generate ready-to-use integration code (React/Vue/Svelte/plain JS/Flutter) for a .riv file, using its real artboard, state machine and input names.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| framework | Yes | Target: react, js (plain JavaScript), vue, svelte or flutter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose one meaningful behavioral trait โ the generated code uses the file's real artboard, state machine and input names rather than placeholders. However it never says whether code is returned inline or written to disk, whether it overwrites anything, or what permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb, output type, and resource; nothing is wasted and the framework list is compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both required parameters are well covered by the schema, but with no output schema and no annotations, the description should clarify the return shape (code string vs. written file, where it lands). That missing piece leaves an agent unsure what to expect after the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both `path` and `framework` (with its enum) are already fully documented in the schema. The description adds only the framing that the file's real names drive generation; it adds no syntax or format detail beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Generate ready-to-use integration code ... for a .riv file', with the supported frameworks enumerated. It is clearly distinguishable from render/inspect/edit siblings, though it does not explicitly name what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb and resource โ an agent can infer this is what you call when you need integration code for a .riv file. There is no explicit when-to-use/when-not guidance, no mention of prerequisites such as the file existing or being inspected first, and no routing to siblings like riv_inspect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_import_svgImport an SVG as Rive vector shapesA
Convert an SVG file (Figma/Illustrator export, icon, illustration) into Rive bezier path shapes โ the professional way to get high-quality artwork instead of drawing with primitives. Writes a scene-fragment JSON (shapes with full cubic vertices, gradients, strokes) and returns a rendered preview. Use the fragment in riv_create via "imports". Supports path/rect/circle/ellipse/polygon/polyline/line, nested transforms, style attrs, linear/radial gradients. Not imported: (use texts[] with a font), , filters, masks.
| Name | Required | Description | Default |
|---|---|---|---|
| svg | No | Inline SVG markup (alternative to svgPath) | |
| outSpec | Yes | Output scene-fragment JSON path (e.g. logo.scene.json) | |
| svgPath | No | Path to the .svg file | |
| idPrefix | No | Prefix for generated shape ids (avoid collisions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the output format ('Writes a scene-fragment JSON... returns a rendered preview'), supported elements ('Supports path/rect/circle/ellipse/polygon/polyline/line, nested transforms, style attrs, linear/radial gradients'), and limitations ('Not imported: <text>, <image>, filters, masks'). It doesn't mention overwrite behavior or error handling, but the disclosed behavior goes well beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (about 80 words) and front-loaded with the primary action in the first sentence. It logically flows from action to output to integration to supported/unsupported elements, with no wasted or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, but the description covers the key contextual needs: what input it accepts, what it produces (scene-fragment JSON and rendered preview), how the output is used (in riv_create), and the supported/unsupported SVG features. It could be more specific about the preview return format, but for a tool of this complexity, the description is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with all four parameters (svg, svgPath, outSpec, idPrefix) already described in the input schema. The description adds no parameter-specific details beyond the schema, so the baseline of 3 applies. It does connect outSpec to riv_create, but that is not a semantic clarification of the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Convert an SVG file (Figma/Illustrator export, icon, illustration) into Rive bezier path shapes' and 'Writes a scene-fragment JSON (shapes with full cubic vertices, gradients, strokes) and returns a rendered preview.' It differentiates from siblings by positioning it as 'the professional way to get high-quality artwork instead of drawing with primitives' and by mentioning integration with riv_create via 'imports.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context and exclusions: it is 'instead of drawing with primitives,' tells how to use the output ('Use the fragment in riv_create via imports'), and lists what is not imported with an alternative for text: 'Not imported: <text> (use texts[] with a font), <image>, filters, masks.' This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_inspectInspect a .riv fileA
Extract full metadata from a .riv file: artboards, animations (duration/fps/loop), state machines and their inputs (name/type/initial value). Uses the official Rive runtime. Also decodes Data Binding (ViewModel) structure when present โ ViewModel definitions and their properties, ViewModelInstances with resolved property values (including enum/nested-viewmodel/list references), enums, converters, and DataBind wiring (which target object/property each bind writes to) โ via direct binary parsing (returned as dataBinding, omitted when the file has none).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the transparency burden. It openly discloses that it uses the official Rive runtime for metadata and direct binary parsing for data binding, and notes that the `dataBinding` field is omitted when absent. This adds meaningful behavioral context beyond a simple 'inspect' claim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but all information is relevant and no words are wasted. It efficiently packs a lot of detail into two sentences, though the second sentence is long and could be split for easier reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description provides a solid overview of return contents, listing all major categories and clarifying that data binding is included only when present. It could benefit from mentioning error behavior or file-format limitations, but overall it is sufficiently complete for an inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single `path` parameter (100% coverage). The description adds no new semantic meaning for the parameter beyond restating that it is a .riv file, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts full metadata from .riv files, listing specific content types (artboards, animations, state machines, data binding). This distinguishes it from sibling tools like riv_list or riv_dump by detailing its comprehensive inspection scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for inspection and full metadata extraction, but it does not explicitly state when to use it over alternatives or mention any exclusions. It gives context about what it covers (including data binding) but lacks explicit 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_lintDiagnose a .riv file for structural problemsA
Static diagnostic pass over a .riv file: broken/out-of-range references, oversized embedded assets, state-machine states unreachable by any transition, unconditional self-transitions (infinite-loop risk), unused state-machine inputs, keyframe easing silently discarded on a track's last keyframe, plus motion-quality rules (all-linear robotic movement, teleporting objects, missing stagger on simultaneous fade-ins, one-sided scale animation). Complements riv_dump (which shows raw structure but doesn't judge it).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly states the operation is a 'static diagnostic pass,' implying no file mutation, and lists the specific behavioral scopes it checks (unreachable states, easing discarded, motion-quality rules). This provides useful behavioral context, though it does not mention output format, exit codes, or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core function and then uses a colon-led list to enumerate checks efficiently. The list is long but each item adds distinct value; the closing sentence about riv_dump is also purposeful. Slightly verbose, but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter, no annotations, and no output schema, the description is quite complete in explaining what the tool does and what it checks. The only gap is that it doesn't describe the return value format (e.g., a list of issues), which would be expected in the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for the only parameter ('path' with description 'Path to the .riv file'). The description adds no additional detail about the parameter, so per the rubric the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Static diagnostic pass over a .riv file') and enumerates precise diagnostic categories (broken references, oversized assets, unreachable states, etc.). It also explicitly distinguishes itself from the sibling riv_dump by stating it 'complements' it and 'doesn't judge it,' making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names riv_dump as a complementary tool and contrasts it by noting riv_dump shows raw structure but doesn't judge it, giving the agent a clear alternative. However, it does not explicitly state when not to use riv_lint or list other alternatives, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_listList .riv filesA
Recursively find .riv files under a directory and report size and format version for each.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | Yes | Directory to search (absolute or relative) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behavior: recursive traversal, target file type, and reported properties (size and format version). This is sufficient for a simple listing tool, though it does not mention output format or edge cases like permissions or symlinks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that covers purpose and output in a clear, front-loaded manner. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one required parameter and no output schema. The description explains what it reports (size and format version), which is sufficient for invocation. It lacks an explicit output format, but for a listing tool the description is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the 'dir' parameter with a clear description (Directory to search, absolute or relative). The tool description adds the 'recursive' aspect, which relates to behavior rather than parameter semantics. Since schema coverage is 100%, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool recursively finds .riv files under a directory and reports size and format version. It uses a specific verb ('find') and resource ('.riv files'), and distinguishes it from sibling tools like riv_inspect or riv_dump which operate on individual files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this tool to list .riv files in a directory tree with metadata. It implies a directory-wide search, distinguishing it from siblings that target single files. However, it does not explicitly name alternatives or say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_lottie_importImport a Lottie/bodymovin JSON as a Rive scene fragment (art + timing + easing)A
Convert a Lottie (bodymovin, .json) animation โ the format of LottieFiles' free animation library โ into a riv_create scene fragment. Unlike riv_import_svg (shapes only), this keeps the keyframed timing: position, rotation, scale and opacity with their exact bezier easing (not mapped to a named preset), shape/null/precomp layer hierarchy, solid layers, gradient fills, stroke trim-path animation, and layer in/out visibility windows. Writes a scene-fragment JSON with {groups,shapes,animations} plus a rendered preview and a coverage/warnings summary. Since the fragment includes animations (which riv_create's "imports" mechanism does not merge), splice its groups/shapes/animations arrays directly into your riv_create scene spec instead of using "imports". Supported: shape layers (path/ellipse/rect/star/polygon/fill/stroke/gradient/trim/nested groups), null layers, solid layers, one level of precomp inlining, parented layers, hold and bezier easing. Not imported (counted in coverage.skipped, not silently dropped): text layers, masks, track mattes, repeaters, merge-paths, path/gradient-position keyframe morphing (frozen to first frame + warning), time-remapped precomps, expressions.
| Name | Required | Description | Default |
|---|---|---|---|
| json | No | Inline Lottie JSON text (alternative to path) | |
| path | No | Path to the Lottie .json file | |
| outSpec | Yes | Output scene-fragment JSON path (e.g. anim.scene.json) | |
| idPrefix | No | Prefix for generated group/shape ids (avoid collisions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses that the tool writes a scene-fragment JSON, a rendered preview, and a coverage/warnings summary; that skipped features are counted rather than silently dropped; and that some unsupported features are frozen with warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and remains information-dense, but it is a single long paragraph with several dense clauses. The supported/unsupported lists earn their place, though bullet-like structure would improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex import tool with no annotations and no output schema, the description is complete enough: it explains the output artifact, preview and warning side effects, supported and unsupported feature coverage, and how to consume the generated fragment.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters. The description does not add parameter-specific syntax or constraints beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: convert a Lottie/bodymovin JSON animation into a riv_create scene fragment. It immediately distinguishes itself from riv_import_svg by noting that this tool preserves keyframed timing rather than importing shapes only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts this tool with riv_import_svg, explains that the resulting fragment must be spliced into a riv_create scene spec rather than used through 'imports', and lists unsupported Lottie features that will be skipped. This gives clear routing and usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_optimizeOptimize a .riv file (lossless)A
Shrink a .riv without changing its visual output: remove unreferenced objects (dangling easing interpolators, fired-events nothing points to, empty keyframe tracks left over from prior edits) and thin redundant keyframes on strictly-linear-interpolation runs within a tolerance. Only runs where every segment is linear are touched โ any run touching hold/cubic easing is left alone, so no easing gets shifted (see keyed_property.cpp semantics: a KeyFrame's interpolationType applies to the segment going INTO the next frame). Colors and id-keyframes (soloActive) are never thinned, only numeric (KeyFrameDouble) tracks. Each step is a boolean that is on by default (set it to false to skip that step), and the run is idempotent/safe to repeat. Use dryRun=true to see the removal/thinning plan without writing anything. Run riv_lint afterwards if in doubt.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Source .riv path | |
| dryRun | No | Report the plan only; don't write anything (default false) | |
| outPath | No | Output path (default: overwrite source) | |
| tolerance | No | Thinning tolerance as a ratio of each track's own value range (default 0.01 = 1%, conservative) | |
| thinKeyframes | No | Douglas-Peucker thin redundant keyframes on linear-only runs (default true) | |
| removeUnreferenced | No | Remove unreferenced interpolators/events/empty tracks (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and meets it: it names precisely what is destroyed (dangling easing interpolators, fired-events with no referrers, empty keyframe tracks), what is explicitly protected (colors, soloActive id-keyframes, any run touching hold/cubic easing), and why no easing shifts. It also declares idempotency and safety to repeat, plus the dryRun non-destructive path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the benefit and the mechanics, and every clause is load-bearing. It is dense and the parenthetical citation of keyed_property.cpp semantics is somewhat academic overhead, but it justifies the linear-run restriction rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating file-rewriting tool with no annotations, no output schema, and an overwrite-by-default outPath, the description covers safety, destructiveness, idempotency, preview mode, and a verification path via riv_lint. There is no output schema to explain, and nothing an agent needs before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics beyond the schema: the booleans are a uniform 'on by default, set false to skip' contract, and the tolerance is scoped to linear-only runs so an agent understands it cannot affect eased segments. It does not discuss outPath overwrite behavior or the interaction between thinKeyframes and removeUnreferenced when both are false.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Shrink a .riv') and immediately bounds the claim with 'without changing its visual output', then enumerates the two exact operations (removing unreferenced objects, thinning keyframes on linear runs). No sibling tool does lossless shrinking, and the description makes that unique role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: each boolean is on by default, set to false to skip, use dryRun=true to preview, and 'Run riv_lint afterwards if in doubt' โ an explicit follow-up with a named sibling. It does not name a condition under which a user should skip the tool entirely or prefer a different sibling, which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_play_state_machineInteractively drive a state machineB
Run a .riv state machine step by step: set/fire inputs, advance time, observe state transitions, and optionally capture frames. Returns a transition report.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| steps | Yes | Sequence of interaction steps | |
| width | No | Output width in px (default 480) | |
| artboard | No | Artboard name (default: first artboard) | |
| background | No | CSS background color (default: transparent) | |
| stateMachine | No | State machine name (default: first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the execution flow and that a transition report is returned, plus optional frame capture, but it does not clarify side effects, whether the .riv file is modified, permission requirements, output format, or constraints such as step limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that lists the key actions and return value without waste. Every clause contributes to understanding the tool's operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core workflow and return value at a high level. Given the tool's complexity (six parameters, nested steps, no output schema, and no annotations), it leaves gaps around step execution semantics, output structure, and behavioral constraints, but is minimally adequate for an agent to attempt invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all six parameters and the nested step fields. The description adds a high-level mapping of inputs, advancement, and capture to the step workflow, but no syntax or constraints beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it runs a .riv state machine step by step, with set/fire inputs, time advancement, transition observation, and optional frame capture. It is clear what the tool does, but it does not explicitly distinguish itself from render-oriented siblings such as riv_render_frame or riv_render_gif.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the step-by-step interaction model and the optional frame capture, which suggests it is for scripted state-machine playback rather than static rendering. However, it gives no explicit when-to-use, when-not-to-use, or named alternatives among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_preflightCheck .riv runtime compatibilityB
Detect .riv features and compare optional target runtime versions with documented minimums. Report unsupported, conditional, or unverified support, and inspect the file with bundled official WASM.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| strict | No | Count unverified compatibility as a warning (default false) | |
| targets | No | Target runtimes (default: all supported target names) | |
| versions | No | Target runtime versions as numeric dotted strings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It does disclose the mechanism ('inspect the file with bundled official WASM') and the outcome taxonomy (unsupported / conditional / unverified), but it never states that the operation is read-only, whether it fails or succeeds on mismatches, or how 'documented minimums' are determined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core capability front-loaded and the WASM implementation note trailing. Slightly dense phrasing ('report unsupported, conditional, or unverified support') but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description needs to convey what comes back; it lists the three support classifications but does not describe the report shape, whether results are per-target/per-feature, or whether an incompatible file yields an error versus a report. Adequate but leaves real gaps for a 4-parameter tool with nested objects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds mild value by framing targets/versions as optional comparisons against documented minimums, and the 'unverified' category relates to the strict flag, but it does not directly explain what each parameter changes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific verbs and resource: detect .riv features, compare against documented minimum runtime versions, and report support status. This is clearly a compatibility preflight, not a generic inspection. It doesn't explicitly differentiate from close siblings like riv_lint or riv_inspect, which keeps it at 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'preflight' framing and 'optional target runtime versions' imply usage before targeting a runtime, but there is no explicit when-to-use or when-not-to-use statement, and no named alternative (e.g., riv_lint for general correctness checks). Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_render_apngRender an animation to APNGA
Render a .riv animation (or state machine playback) to an animated PNG (APNG). Unlike GIF this supports 24-bit color plus full alpha transparency, and GitHub READMEs animate it like a regular image. Frames are rendered with a transparent background by default.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Frames per second (default 20) | |
| out | No | Output path, .apng or .png (default: <name>.apng alongside the .riv) | |
| path | Yes | Path to the .riv file | |
| loops | No | Loop count (0 = infinite, default 0) | |
| width | No | Output width (default 480) | |
| height | No | Output height in px (default: keeps the artboard aspect ratio) | |
| artboard | No | Artboard name (default: first artboard) | |
| duration | No | Seconds to render (default 2) | |
| animation | No | Animation name (default: first state machine or animation) | |
| background | No | CSS background color when transparent=false (default #ffffff) | |
| transparent | No | Render on a transparent background to keep APNG alpha (default true). Set false to composite onto 'background' | |
| stateMachine | No | State machine name (takes precedence over animation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden; it usefully notes frames default to a transparent background and explains the transparency/background relationship. However it omits write-side behavior: that it writes a file to disk, overwrite semantics, and any setup/dependency requirements, which matters for a render-and-save tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler, leading with what it does and the format's key differentiator before the background note. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter render tool with no output schema, the description adequately conveys the core capability and a key default. It could be slightly fuller on output file placement and state-machine precedence, but nothing critical for invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 12 parameters including defaults are already documented in the schema. The description only reinforces the transparent-background default and adds no format or interpretation detail beyond the structured fields, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (render) and resource (.riv animation or state machine) to a precise output format (APNG). It explicitly contrasts with GIF, letting an agent distinguish it from riv_render_gif without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the selection rationale versus GIF (24-bit color, alpha transparency, GitHub README animation) which gives clear context for when to choose this format. It does not name other siblings like riv_render_video or state explicit when-not conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_render_frameRender a single frame to PNGA
Render one frame of a .riv animation or state machine to PNG. Returns the image inline and saves it to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .riv file | |
| time | No | Seconds to advance before capturing (default 0) | |
| width | No | Output width in px (default: artboard width) | |
| height | No | Output height in px (default: keeps the artboard aspect ratio) | |
| outPath | No | Output PNG path (default: alongside the .riv) | |
| artboard | No | Artboard name (default: first) | |
| animation | No | Linear animation name | |
| background | No | CSS background color (default: transparent) | |
| stateMachine | No | State machine name (takes precedence) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose the useful dual behavior of returning the image inline AND writing a file to disk, which is real value beyond the schema. However, it omits whether an existing file at outPath is overwritten, what happens on invalid animation/stateMachine names, and any permission or side-effect warnings for a tool that writes to disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core action front-loaded and the output behavior summarized second. Nothing is padded or repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter tool with full schema coverage and no output schema, the description covers what the tool produces (inline image plus file on disk), which is the main gap an output schema would otherwise fill. Overwrite/error semantics are the remaining omission, keeping it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the nine parameters is already documented with defaults and constraints; baseline 3 applies. The description adds only the passing mention of 'animation or state machine' and no detail on time, artboard, background, or the stateMachine-over-animation precedence that the schema encodes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource โ render one frame of a .riv animation or state machine to PNG. The 'one frame' qualifier implicitly separates it from the sibling renderers (riv_render_gif, riv_render_apng, riv_render_video, riv_render_sprites, riv_batch_render), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'one frame' versus the animated-format siblings, but the description never states when to prefer this over riv_render_gif or riv_render_sprites, nor any prerequisites such as the .riv file needing to exist. The agent must infer the choice from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_render_gifRender an animation to GIFB
Render a .riv animation (or state machine idle playback) to an animated GIF file for preview.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Frames per second (default 20) | |
| path | Yes | Path to the .riv file | |
| width | No | Output width in px (default 480) | |
| outPath | No | Output GIF path (default: alongside the .riv) | |
| artboard | No | Artboard name (default: first artboard) | |
| duration | No | Seconds to render (default 2) | |
| animation | No | Animation name (default: first state machine or animation) | |
| background | No | CSS background color (default white โ GIF has no alpha) | |
| stateMachine | No | State machine name (takes precedence over animation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses very little. It never states that rendering writes a file to disk, whether an existing outPath is overwritten, how long the render blocks, or what happens when the named artboard/animation is missing. The only real behavioral hint is "for preview."
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler and the key resource and output format stated first. It is efficient, though the terseness is part of why behavioral context is thin.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 9-parameter rendering tool with no annotations and no output schema, so the description must explain the result of the call. It says nothing about whether the tool returns the written GIF path, whether output is silent, or how errors for invalid artboard/animation names surface, leaving a real gap for a file-producing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with per-parameter defaults and bounds, so the schema already does the explanatory work. The description adds only the notion of "state machine idle playback," which loosely maps to the stateMachine/animation parameters, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (render) and precise input/output (a .riv animation or state-machine playback to an animated GIF). It is clear on its own, but it never distinguishes itself from near siblings such as riv_render_apng, riv_render_video, or riv_render_frame, so an agent must infer the choice from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For preview" implies a lightweight, quick-look use case, which is a genuine usage signal. However, there is no explicit when-to-use/when-not, and no routing to GIF vs APNG vs video vs single-frame rendering, which is exactly the decision an agent faces with this sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_render_spritesRender an animation to a sprite sheet PNGA
Render N evenly-spaced frames of a .riv animation/state machine into a single grid sprite sheet PNG (columns = ceil(sqrt(N))). Writes the PNG plus a JSON metadata file (cellW/cellH/cols/rows/count/fps) alongside.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Metadata playback fps (default: count/duration) | |
| out | No | Output PNG path (default: alongside the .riv); metadata is written next to it with a .json extension | |
| path | Yes | Path to the .riv file | |
| count | No | Number of frames (default 16) | |
| width | No | Output width in px (default: artboard width) | |
| height | No | Output height in px (default: keeps the artboard aspect ratio) | |
| artboard | No | Artboard name (default: first artboard) | |
| duration | No | Seconds spanned by the frames (default: one animation loop, or 2s) | |
| animation | No | Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation) | |
| background | No | CSS background color (default: transparent) | |
| stateMachine | No | State machine name (takes precedence over animation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key side effect: it writes a PNG plus a JSON metadata file next to it, and even names the metadata fields. However, it never states overwrite behavior for existing files, failure modes (bad path, missing artboard/state machine), or whether the operation is idempotent โ gaps that matter for a write-to-disk tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the artifact and layout rule front-loaded, and the side-effect file is noted immediately after. Dense but every clause carries information; only the parenthetical formula mildly interrupts the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, annotation-free tool with no output schema, the description covers the essentials: what is produced, where it lands, and the default grid behavior, while the schema fully documents each parameter. The only meaningful omission is write-side behavior (overwriting existing output) and error conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3 and the schema already documents every parameter including defaults and bounds. The description adds only the grid formula and confirms the JSON metadata contents (cellW/cellH/cols/rows/count/fps), which is marginal value on top of a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (render), a precise resource (grid sprite sheet PNG), and the exact output composition (N evenly-spaced frames, grid laid out by ceil(sqrt(N))). This clearly distinguishes it from riv_render_frame, riv_render_gif, riv_render_apng and riv_render_video, which produce different artifacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The output format implies when to use it (you want a sprite sheet rather than a GIF/APNG/video), but no sibling is ever named and there is no explicit when/when-not guidance. An agent must infer the choice from the artifact description alone, which is implied usage rather than stated routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_render_videoRender an animation to a WebM videoA
Render a .riv animation (or state machine) to a real-time WebM video using canvas.captureStream() + MediaRecorder (VP9, falls back to VP8/generic webm). Default duration is one loop of the animation (2s for a bare state machine or when the animation's length can't be determined).
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | captureStream() frame rate (default 30) | |
| out | No | Output .webm path (default: alongside the .riv) | |
| path | Yes | Path to the .riv file | |
| width | No | Output width in px (default: artboard width) | |
| height | No | Output height in px (default: keeps the artboard aspect ratio) | |
| artboard | No | Artboard name (default: first artboard) | |
| duration | No | Seconds to record (default: one animation loop, or 2s) | |
| animation | No | Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation) | |
| background | No | CSS background color (default: transparent) | |
| stateMachine | No | State machine name (takes precedence over animation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the whole burden and does add real behavior: the captureStream/MediaRecorder mechanism, VP9 with VP8/generic-webm fallback, and the duration fallback rule (2s for bare state machines or undeterminable length). It stops short of stating whether rendering requires a headless browser, whether existing output files are overwritten, or roughly how long the operation takes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core action and output format, then the implementation and defaulting rules. No filler and nothing that could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, annotation-free tool with no output schema, the description covers the mechanism and key defaults but says nothing about the return value (e.g., whether it returns the written path), the cost/latency of rendering, or any environment prerequisites. Adequate but noticeably incomplete for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only re-states defaults already documented per-parameter (duration, animation vs. stateMachine precedence) rather than adding syntax, formats, or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Render') plus the resource (a .riv animation or state machine) and the exact output artifact (real-time WebM video), which cleanly separates it from riv_render_gif, riv_render_apng, riv_render_frame and riv_render_sprites without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The WebM output format implies when to choose this over the GIF/APNG/frame siblings, but no alternative is named and no conditions or exclusions are given. The only explicit guidance is about defaults (duration, animation vs. stateMachine precedence), not about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_repairRepair safe .riv lint findingsA
Repair lint findings one change at a time. Compare pixels for each candidate, skip visual changes with reasons, and validate the final result before writing. dryRun never writes.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output path (default: <name>.repaired.riv next to the source; the source is never overwritten) | |
| path | Yes | Source .riv path | |
| fixes | No | Selected fix types (default all supported types) | |
| dryRun | No | Inspect and validate without writing (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does real work: it discloses the per-change pixel comparison, that visual changes are skipped with reasons, that the result is validated before writing, and that dryRun never writes. This is substantive safety/behavior context beyond a bare 'repair' verb; only failure modes and what the validation report contains are left open.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information (procedure, per-change policy, dryRun guarantee), with the core action front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param mutation tool with no annotations and no output schema, the description covers process, safety of writes, and dryRun behavior well. It stops short of describing the returned result or how skipped changes are reported, which an agent calling it blind might want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents path, out, fixes, and dryRun, including the 'source is never overwritten' guarantee. The description reinforces dryRun semantics ('dryRun never writes') but adds no syntax, defaults, or interaction details beyond the schema โ baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource โ 'Repair lint findings' โ and scopes it to 'one change at a time', which separates it from the detection-side sibling riv_lint. It never names a sibling explicitly, so the differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (run after lint, one fix at a time, skip visual changes) but there is no explicit 'use this when / use riv_edit or riv_optimize instead' routing. An agent must infer the position in the workflow from the mention of 'lint findings'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_rig_characterAuto-rig a character PNGA
One call: character PNG -> fully rigged .riv with cutout parts (ears/tail via polygons), 2-bone head-tilt mesh (seamless), vector eyelid blink, idle + happy animations, and a state machine with a 'happy' trigger. Returns a preview. Fine-tune afterwards with riv_edit or riv_studio.
| Name | Required | Description | Default |
|---|---|---|---|
| eyes | No | Eye rects in image px coords (generates blink overlays) | |
| parts | No | Named cutout parts, e.g. {earL, earR, tail}. Names containing 'ear' attach to the head | |
| outPath | Yes | Output .riv path | |
| pngPath | Yes | Character PNG (transparent background recommended) | |
| furColor | No | Eyelid/patch color matching the fur (default #f8eee2) | |
| headRatio | No | Top fraction of the image that is 'head' (default 0.45) | |
| artboardWidth | No | Artboard width in px (default 600) | |
| artboardHeight | No | Artboard height in px (default 460) | |
| backgroundColor | No | CSS background color (default: transparent) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the rig structure produced (polygon cutouts, seamless 2-bone head mesh, vector eyelids), the animation set, and that a preview is returned. The notable gap is write-safety behavior โ nothing says whether outPath is overwritten or what happens if it already exists, which matters for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output pipeline is front-loaded ("One call: ...") and nearly every clause adds a concrete capability rather than filler. It is a long run-on sentence with several comma-separated clauses, which slightly hurts scannability, but there is no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, nested-object tool with no annotations and no output schema, the description explains the produced .riv well but is thin on returns โ "Returns a preview" doesn't say whether that is an image, a frame, or a path. The pipeline coverage is good; the response-side and overwrite behavior leave gaps an agent may need to discover at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (eyes, parts, furColor, headRatio, artboard size, background) is already documented in the schema, including the pivot default and behindBody semantics. The description only echoes 'ears/tail via polygons' without adding format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (auto-rig a character PNG into a fully rigged .riv) and enumerates the produced artifacts: cutout parts, head-tilt mesh, vector blink, idle/happy animations, state machine. This is unmistakably distinct from siblings like riv_create or riv_edit, which the agent can rule out without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"One call" frames this as the one-shot automated path, and "Fine-tune afterwards with riv_edit or riv_studio" explicitly routes post-processing to the correct siblings. It stops short of stating when *not* to use it (e.g. when an existing .riv should be extended rather than regenerated), so it isn't fully 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_setupInstall the bundled rive-design-guidelines skill into this environmentA
One-time setup: copies the bundled rive-design-guidelines skill (the mandatory tokens โ pro-asset ingestion โ presets โ critique workflow, asset-source registry, icon-animation recipes and craft rules) into the client's skills directory so it auto-triggers on future Rive work โ .claude/skills/ in the current project (scope=project, default) or ~/.claude/skills/ for all projects (scope=user). Idempotent: re-running updates the skill to this server version's copy. Recommended on first use of this server in a new environment; clients without skill support can read the same content via the rive-design-guidelines MCP prompt instead.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | project = <projectDir>/.claude/skills (default), user = ~/.claude/skills | |
| projectDir | No | Project root for scope=project (default: current working directory) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It discloses that the tool copies files ('copies the bundled skill'), is idempotent ('re-running updates the skill to this server version's copy'), has scope-dependent behavior, and notes the auto-triggering effect. It could be more explicit about overwriting existing skill directories, but 'updates' strongly implies that behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the essential action ('One-time setup: copies') and packs critical details into a single well-structured sentence. Every clause adds value: idempotency, scope, default, auto-triggering, recommendation, and alternative. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description comprehensively covers what the tool does, when to use it, what behavior to expect (idempotent, scope options), and how to fall back if skill support is unavailable. All essential context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% โ both 'scope' and 'projectDir' are fully described in the input schema. The description repeats these facts (e.g., 'scope=project, default') but adds no parameter-specific meaning beyond what the schema already provides. The baseline of 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'One-time setup: copies the bundled `rive-design-guidelines` skill ... into the client's skills directory'. It uses a specific verb ('copies'), names the resource, and explains the effect ('auto-triggers on future Rive work'). This distinguishes it from sibling tools, all of which perform Rive processing or analysis rather than setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends when to use the tool: 'Recommended on first use of this server in a new environment'. It also provides an alternative for clients without skill support: 'clients without skill support can read the same content via the rive-design-guidelines MCP prompt instead'. This clearly conveys both when to use and when not to use, with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_slice_imageSlice a PNG into parts for riggingA
Cut polygon regions out of a character PNG for parts-based rigging (cutout animation). Writes each part as .png plus base.png (source with parts erased) into outDir, and returns each part's bbox for placement. Use with riv_create: images per part + groups as pivots.
| Name | Required | Description | Default |
|---|---|---|---|
| outDir | Yes | Directory to write part PNGs into | |
| pngPath | Yes | Source PNG path | |
| regions | Yes | Polygon regions to cut out, one per part |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses file outputs (each part as <name>.png plus base.png with erased parts) and bbox returns, but omits overwrite behavior, error conditions, and permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste, front-loaded with the core action and followed by output behavior and integration guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a rich input schema and no output schema, the description adequately explains what is produced and returned (part PNGs, base.png, bboxes). Minor gaps around overwrite/error behavior remain, but an agent can call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds minor context about output naming and base erasure, but does not add syntax or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: cut polygon regions out of a character PNG for parts-based rigging. It is clear what the tool does and what artifacts it produces, though it does not explicitly distinguish itself from potentially similar sibling tools such as riv_extract_assets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: parts-based rigging and use with riv_create for images and pivots. It does not state when to avoid this tool or name alternatives, but the intended workflow is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_studioStart the local Studio web UIA
Start a local web UI (Rive-editor-like 3-pane layout) for live-previewing and editing a .riv file: hierarchy tree + click/drag selection on canvas + inspector (position/size/color/text edits apply live), timeline with keyframe markers, hot reload on file change, auto-generated state machine input controls, event log, and (with scenePath) direct scene-JSON editing. The UI also has an 'Instructions for AI' box โ fetch those with riv_studio_notes. Re-running riv_create/riv_edit on the watched file updates the browser instantly. Only one studio runs at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The .riv file to preview (watched for changes) | |
| port | No | Port (default 8787) | |
| stop | No | Stop the running studio instead | |
| share | No | Also open a READ-ONLY view on the LAN (default false: Studio listens on 127.0.0.1 only). Returns a URL with an unguessable token; viewers can play/scrub/drive state-machine inputs but cannot edit, save, chat or write files. Plain HTTP, so only share on a network you trust. | |
| scenePath | No | Scene spec JSON path โ enables the edit+rebuild panel | |
| shareHost | No | Local IPv4 address to listen on for the read-only view (default: the auto-detected LAN address; '0.0.0.0' = all interfaces) | |
| sharePort | No | Port for the read-only view (default: port + 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add useful behavior: hot reload, live-applied edits, the one-studio-at-a-time limit. But key operational facts are missing โ whether the call blocks until stopped, what it returns (a URL? a port?), what happens on port conflict, and that stopping requires the separate stop flag. The LAN-sharing security caveat lives only in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by a capability list and then the sibling pointer and the singleton constraint. The feature enumeration is long but each item is substantive rather than filler; only the parenthetical layout description is arguably decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, long-running server tool with no annotations and no output schema, the description covers what the UI offers and points at riv_studio_notes, but omits lifecycle and return-value essentials an agent needs to invoke it correctly โ blocking behavior, the URL/port it yields, and how stop interacts with a running instance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters including share, shareHost, sharePort and stop. The description only adds meaning for scenePath ('with scenePath, direct scene-JSON editing'); it says nothing about port, stop, or the share trio beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a local web UI ... for live-previewing and editing a .riv file') and enumerates the concrete capabilities (hierarchy tree, inspector, timeline, hot reload, state-machine controls, scene-JSON editing). It also names the sibling riv_studio_notes and what that sibling is for, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: re-running riv_create/riv_edit on the watched file refreshes the browser, and the riv_studio_notes box should be fetched separately. It also states the singleton constraint ('Only one studio runs at a time'). It never explicitly contrasts with alternatives such as riv_render_frame or riv_inspect, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_studio_notesRead the Studio chat and reply into itA
Read the Studio web UI's Agent chat and reply into it.
READ: call with no
replyto fetch the messages the user typed (consumes the queue; the Studio shows them as picked up). Trigger on 'check the studio notes' / ใในใฟใธใชใฎๆ็คบใ็ขบ่ชใใฆใ, or after opening riv_studio when the user mentions they left notes. Act on each instruction โ usually riv_edit or riv_create on the watched file, which hot-reloads the browser.REPLY: after doing the work, call again with
replyset to a short summary of what you changed (and anything you could not do). It appears as your message in the same chat. Always reply: without a reply the user cannot tell whether you acted. Both can be done in one call: passreplytogether with the read to answer and pick up anything new at the same time.
| Name | Required | Description | Default |
|---|---|---|---|
| peek | No | Read without consuming | |
| port | No | Studio port (default 8787) | |
| reply | No | Message to post back into the Studio chat as the assistant (what you changed, what you skipped, what you need) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does so: it discloses the non-obvious side effect that a read consumes the queue and shows as 'picked up' in the Studio, and that edits hot-reload the browser. It does not cover failure behavior (Studio not running, wrong port) or that peek avoids consumption โ that detail lives only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Numbered READ/REPLY structure with the mode selection front-loaded is easy to scan and the closing sentence about combining both modes is useful. A few sentences are slightly repetitive ('Always reply: without a reply the user cannot tell whether you acted'), but nothing is wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description adequately says what a read returns (messages the user typed) and what a reply produces in the chat. Combined with full schema coverage this is close to complete; the omission of `peek` semantics in prose is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining what `reply` should contain (short summary of changes and anything skipped) and that read+reply can be combined in one call. `peek` and `port` are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb pair (read / reply) against a specific resource (the Studio web UI's Agent chat), and the two numbered sections make the dual purpose explicit. An agent can immediately tell this apart from riv_studio, which merely opens the UI, without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives literal trigger phrases in two languages ('check the studio notes' / ใในใฟใธใชใฎๆ็คบใ็ขบ่ชใใฆใ), a situational trigger (after opening riv_studio when the user left notes), and names the follow-up siblings (riv_edit, riv_create). It also mandates always replying, closing the main failure mode of silently acting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_ui_detectDetect UI elements in a screenshotA
Find the rectangles, text runs and images in a UI screenshot or design comp. Returns a nested element tree with rects, corner radii and fill colours, plus a numbered overlay PNG. Coordinates are in source pixels (accurate to about 1-2 px); corner radii to about 1 px. Each element carries renderMode ("vector-panel" | "raster" โ how it would be reconstructed; flat fills are test-rendered and turned into crops when more than 2% of their visible pixels would differ, the measured share is returned as renderRisk) and semanticHint ("panel" | "text" | "image" | "line" โ what it looks like) as independent fields. Next, give each element a role and pass the result to riv_ui_prototype. This is geometry only: it does not know a button from a card. If you have the vector source, pass svgPath instead of imagePath: nothing is estimated, the element tree is the SVG's own group nesting, non-rectangular artwork comes through as "vector-shape" with its real bezier vertices, becomes "vector-text" (editable Rive text โ the bundled Inter is substituted unless you pass fonts, and a run whose glyphs are missing is baked as a picture instead, always with a warning), embedded data comes through as its own pixels, and Figma layer names arrive as roleHint.
| Name | Required | Description | Default |
|---|---|---|---|
| fonts | No | Fonts for the SVG's <text>. svgPath only โ pass the same list to riv_ui_prototype | |
| minArea | No | Ignore regions smaller than this many pixels (default 576). imagePath only | |
| svgPath | No | Vector source instead of a screenshot (Figma/Illustrator SVG export). Nothing is estimated: rects, fills, corner radii and nesting come straight from the file | |
| figmaUrl | No | A Figma link to one frame (Copy link to selection), fetched as SVG through the Figma REST API. Off unless FIGMA_TOKEN is set in the server's environment; without it this errors and nothing is requested. Everything else works offline | |
| imagePath | No | Screenshot or design comp (PNG/JPEG) | |
| maxElements | No | Keep at most this many elements, largest first (default 120, or 300 for svgPath) | |
| overlayPath | No | Where to write the numbered overlay PNG |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the return shape, coordinate accuracy, renderMode semantics, renderRisk behavior, SVG handling, font substitution and bake-with-warning behavior, Figma token requirements, and that it writes an overlay PNG. These are substantial behavioral details beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the text is dense but mostly earns its place by explaining complex output and mode behavior. It is a long single paragraph with several parentheticals, so it is not maximally concise, but the length is justified for a tool with this much behavioral nuance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must carry the return-value and behavioral contract. It explains the nested element tree, overlay PNG, accuracy, independent renderMode and semanticHint fields, vector-source behavior, and font warnings, leaving no major ambiguity for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful selection and behavior semantics for svgPath, fonts, and the vector-vs-screenshot mode, though it does not add much beyond the schema for minArea, maxElements, or overlayPath.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: find rectangles, text runs and images in a UI screenshot or design comp. It clearly distinguishes the tool from downstream tools by stating it is geometry only and does not know a button from a card, and it names riv_ui_prototype as the next step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit selection guidance: use svgPath instead of imagePath when a vector source exists, with different behavior clearly described. It also names the downstream tool riv_ui_prototype and explains that this tool only extracts geometry, so the agent knows when to use it and when to hand off.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_ui_prototypeTurn a detected UI screenshot into an animated .rivA
Take the elements from riv_ui_detect, assign each one a role, and get back a working .riv: every element becomes a shape or an image asset, each gets an entrance appropriate to its role, and buttons and cards get hover and press states. Roles: background, nav, header, card, panel, button, fab, text, icon, image, chart, list-item, badge, divider, avatar, input. Elements you leave unassigned animate as a generic panel. Pass exactly one of imagePath, svgPath or figmaUrl, the same one you gave riv_ui_detect. If you changed minArea or maxElements there, pass the same values here so the ids match. With svgPath no screenshot is embedded, every element stays editable, and the file reproduces the SVG; its becomes real Rive text you can re-type at runtime, and its embedded data becomes an image asset. figmaUrl fetches the same thing straight from Figma, and needs FIGMA_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| fonts | No | Fonts for the SVG's <text>. svgPath only. Without a match the bundled Inter is used and a warning says so; a run whose glyphs the font lacks (CJK, say) is baked as a picture rather than embedded as tofu | |
| roles | Yes | Role for each element. Ids you omit fall back to a generic panel. | |
| ambient | No | Give roles with an idle motion a looping ambient animation (default true) | |
| minArea | No | Must match the riv_ui_detect call. imagePath only (default 576) | |
| outPath | Yes | Where to write the .riv | |
| stagger | No | Delay between elements entering, in milliseconds | |
| svgPath | No | The same SVG you passed to riv_ui_detect (instead of imagePath) | |
| figmaUrl | No | The same Figma link you passed to riv_ui_detect. Off unless FIGMA_TOKEN is set in the server's environment. The frame is fetched again, so a design that changed in between can move the ids | |
| imagePath | No | The same screenshot you passed to riv_ui_detect | |
| entranceMs | No | How long the whole entrance takes, in milliseconds | |
| maxElements | No | Must match the riv_ui_detect call (default 120, or 300 for svgPath) | |
| interactions | No | Add hover and press states where the role has them (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it explains role-driven shape/image creation, entrance animations, hover/press states, fallback behavior for unassigned elements, and how svgPath preserves editable text/images. It stops short of covering overwrite behavior for outPath, failure modes, or what the call returns beyond producing a .riv.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and workflow, then moves to roles, path constraints, and svgPath/figmaUrl behavior. It is dense but appropriately sized for a complex 12-parameter tool, with little wasted text, though the long role list and packed sentences reduce readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no annotations and no output schema, the description is largely complete: it covers purpose, required prior-step alignment, role mapping, input exclusivity, svgPath semantics, and FIGMA_TOKEN requirements. It could be stronger by stating the actual return value or outPath overwrite behavior, but the essential invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter, but the description adds important semantics beyond it: exactly one of imagePath, svgPath, or figmaUrl must be passed, the same one used in riv_ui_detect, and minArea/maxElements must match across calls. It also explains role assignment and the generic-panel fallback, though it does not clarify every behavioral parameter such as stagger, ambient, or entranceMs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: taking elements from riv_ui_detect, assigning roles, and producing an animated .riv file. It clearly distinguishes this prototyping step from the upstream detection call and from generic creation/import siblings by naming the source tool and the resulting artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the intended workflow after riv_ui_detect, requiring the same imagePath/svgPath/figmaUrl input and matching minArea/maxElements values so ids line up. It provides clear context and prerequisites but does not explicitly name when to prefer alternatives such as riv_import_svg or riv_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riv_visual_diffPixel-diff two .riv filesA
Render the same artboard/animation/time from two .riv files under identical conditions (forced to the same output size) and compute a thresholded per-pixel visual diff. Returns match rate, differing pixel count, and a diff visualization PNG (differing pixels in red, matching pixels dimmed).
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output diff PNG path (default: alongside pathA) | |
| time | No | Seconds to advance before capturing (default 0) | |
| pathA | Yes | Path to the first .riv file | |
| pathB | Yes | Path to the second .riv file | |
| width | No | Output width in px (default: artboard width) | |
| height | No | Output height in px (default: keeps the artboard aspect ratio) | |
| artboard | No | Artboard name (default: first artboard) | |
| animation | No | Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation) | |
| threshold | No | Max per-channel diff (0-255) still counted as a match (default 16) | |
| background | No | CSS background color (default: transparent) | |
| stateMachine | No | State machine name (takes precedence over animation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden, and it does disclose useful traits: both inputs are forced to the same output size, the diff is thresholded, and the PNG color-codes differing (red) vs matching (dimmed) pixels. It says nothing about cost/runtime, what happens when the artboard or animation is missing in one file, or whether comparison failures error or return a partial result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the operation and its conditions stated before the return values. Nothing is repeated from the schema and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Eleven parameters, no output schema, no annotations - the description compensates by spelling out the render conditions and the exact return payload (match rate, differing pixel count, diff PNG). The remaining gap is failure/edge behavior (mismatched artboards, unresolvable names) for a comparison tool whose whole value depends on the two inputs being comparable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: 'same artboard/animation/time' ties artboard, animation and time into one comparison contract, and 'forced to the same output size' explains that width/height govern both renders, not just one. That is a modest but genuine lift over the per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: render two .riv files under identical conditions and compute a thresholded per-pixel diff, plus what it returns. The pixel-level framing implicitly separates it from riv_diff and riv_ab_compare, but no sibling is named, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the mechanics described ("render the same artboard/animation/time from two .riv files"); there is no explicit when-to-use, when-not-to-use, or statement of how this differs from riv_diff / riv_ab_compare. Given those siblings exist, an agent gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.12.0- Changed
riv_create3 fields changed- changed
Input schema / properties / scene / additionalPropertiesPrevious value: -{}New value: +true - changed
Input schema / properties / scene / descriptionPrevious value: -"Scene spec (see tool description for schema)"New value: +"Scene spec with optional Flex layouts (see tool description)" - added
Input schema / properties / scene / propertiesAdded value: +{ + "layouts": { + "items": { + "additionalProperties": true, + "properties": { + "alignItems": { + "enum": [ + "start", + "center", + "end" + ], + "type": "string" + }, + "direction": { + "enum": [ + "row", + "column" + ], + "type": "string" + }, + "fillColor": { + "type": "string" + }, + "gap": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "additionalProperties": false, + "properties": { + "horizontal": { + "minimum": 0, + "type": "number" + }, + "vertical": { + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "height": { + "minimum": 0, + "type": "number" + }, + "heightMode": { + "enum": [ + "fixed", + "percent", + "auto", + "fill" + ], + "type": "string" + }, + "heightWeight": { + "exclusiveMinimum": 0, + "type": "number" + }, + "id": { + "type": "string" + }, + "justifyContent": { + "enum": [ + "start", + "center", + "end", + "space-between" + ], + "type": "string" + }, + "margin": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "additionalProperties": false, + "properties": { + "bottom": { + "minimum": 0, + "type": "number" + }, + "left": { + "minimum": 0, + "type": "number" + }, + "right": { + "minimum": 0, + "type": "number" + }, + "top": { + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "padding": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "additionalProperties": false, + "properties": { + "bottom": { + "minimum": 0, + "type": "number" + }, + "left": { + "minimum": 0, + "type": "number" + }, + "right": { + "minimum": 0, + "type": "number" + }, + "top": { + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + ] + }, + "parent": { + "type": "string" + }, + "width": { + "minimum": 0, + "type": "number" + }, + "widthMode": { + "enum": [ + "fixed", + "percent", + "auto", + "fill" + ], + "type": "string" + }, + "widthWeight": { + "exclusiveMinimum": 0, + "type": "number" + }, + "wrap": { + "type": "boolean" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + } +}
- Added
riv_export_lottie - Added
riv_preflight - Added
riv_repair
18 tool updates
v0.8.0- Changed
riv_asset_search1 field changed- added
Input schema / properties / idPrefix / descriptionAdded value: +"Prefix for generated shape ids; applies when fetching an icon (default: the icon name with non-alphanumerics replaced, plus an underscore)"
- Changed
riv_batch_render14 fields changed- added
Input schema / properties / defaults / properties / animation / descriptionAdded value: +"Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation)" - added
Input schema / properties / defaults / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - changed
Input schema / properties / defaults / properties / format / descriptionPrevious value: -"Output format for this job"New value: +"Output format: png, gif, apng, webm or sprites. Required on every job, set here or in defaults" - added
Input schema / properties / defaults / properties / fps / descriptionAdded value: +"Frames per second (default 20; 30 for webm)" - added
Input schema / properties / defaults / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / defaults / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)" - added
Input schema / properties / defaults / properties / width / descriptionAdded value: +"Output width in px (default: artboard width; 480 for gif and apng)" - added
Input schema / properties / jobs / items / properties / animation / descriptionAdded value: +"Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation)" - added
Input schema / properties / jobs / items / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - changed
Input schema / properties / jobs / items / properties / format / descriptionPrevious value: -"Output format for this job"New value: +"Output format: png, gif, apng, webm or sprites. Required on every job, set here or in defaults" - added
Input schema / properties / jobs / items / properties / fps / descriptionAdded value: +"Frames per second (default 20; 30 for webm)" - added
Input schema / properties / jobs / items / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / jobs / items / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)" - added
Input schema / properties / jobs / items / properties / width / descriptionAdded value: +"Output width in px (default: artboard width; 480 for gif and apng)"
- Changed
riv_critique2 fields changed- added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)"
- Changed
riv_design_tokens1 field changed- added
Input schema / properties / mood / descriptionAdded value: +"Sets the default hue when seed is absent (default calm)"
- Changed
riv_diff2 fields changed- added
Input schema / properties / pathA / descriptionAdded value: +"Path to the first .riv file" - added
Input schema / properties / pathB / descriptionAdded value: +"Path to the second .riv file"
- Changed
riv_edit5 fields changed- added
Input schema / properties / edits / descriptionAdded value: +"Edit operations, applied in order" - added
Input schema / properties / edits / items / properties / keyframes / items / properties / easing / descriptionAdded value: +"Easing for the segment from this keyframe to the next (default linear; hold = step)" - added
Input schema / properties / edits / items / properties / keyframes / items / properties / frame / descriptionAdded value: +"Frame number within the animation" - added
Input schema / properties / edits / items / properties / keyframes / items / properties / value / descriptionAdded value: +"Value at this frame (required unless mode=remove)" - added
Input schema / properties / edits / items / properties / op / descriptionAdded value: +"set: properties; setText: text run; delete: object; setKeyframes: animation track"
- Changed
riv_generate_code1 field changed- added
Input schema / properties / framework / descriptionAdded value: +"Target: react, js (plain JavaScript), vue, svelte or flutter"
- Changed
riv_play_state_machine3 fields changed- added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / background / descriptionAdded value: +"CSS background color (default: transparent)" - added
Input schema / properties / width / descriptionAdded value: +"Output width in px (default 480)"
- Changed
riv_render_apng3 fields changed- added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)"
- Changed
riv_render_frame2 fields changed- added
Input schema / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / width / descriptionAdded value: +"Output width in px (default: artboard width)"
- Changed
riv_render_gif3 fields changed- added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)" - changed
Input schema / properties / width / descriptionPrevious value: -"Output width (default: artboard width, capped 800)"New value: +"Output width in px (default 480)"
- Changed
riv_render_sprites6 fields changed- added
Input schema / properties / animation / descriptionAdded value: +"Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation)" - added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / background / descriptionAdded value: +"CSS background color (default: transparent)" - added
Input schema / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)" - added
Input schema / properties / width / descriptionAdded value: +"Output width in px (default: artboard width)"
- Changed
riv_render_video5 fields changed- added
Input schema / properties / animation / descriptionAdded value: +"Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation)" - added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)" - added
Input schema / properties / width / descriptionAdded value: +"Output width in px (default: artboard width)"
- Changed
riv_rig_character7 fields changed- added
Input schema / properties / artboardHeight / descriptionAdded value: +"Artboard height in px (default 460)" - added
Input schema / properties / artboardWidth / descriptionAdded value: +"Artboard width in px (default 600)" - added
Input schema / properties / backgroundColor / descriptionAdded value: +"CSS background color (default: transparent)" - added
Input schema / properties / eyes / items / properties / height / descriptionAdded value: +"Height in image px" - added
Input schema / properties / eyes / items / properties / width / descriptionAdded value: +"Width in image px" - added
Input schema / properties / eyes / items / properties / x / descriptionAdded value: +"Left edge in image px" - added
Input schema / properties / eyes / items / properties / y / descriptionAdded value: +"Top edge in image px"
- Changed
riv_slice_image2 fields changed- added
Input schema / properties / regions / descriptionAdded value: +"Polygon regions to cut out, one per part" - added
Input schema / properties / regions / items / properties / name / descriptionAdded value: +"Part name; the output file is <name>.png"
- Changed
riv_studio3 fields changed- added
Input schema / properties / shareAdded value: +{ + "description": "Also open a READ-ONLY view on the LAN (default false: Studio listens on 127.0.0.1 only). Returns a URL with an unguessable token; viewers can play/scrub/drive state-machine inputs but cannot edit, save, chat or write files. Plain HTTP, so only share on a network you trust.", + "type": "boolean" +} - added
Input schema / properties / shareHostAdded value: +{ + "description": "Local IPv4 address to listen on for the read-only view (default: the auto-detected LAN address; '0.0.0.0' = all interfaces)", + "type": "string" +} - added
Input schema / properties / sharePortAdded value: +{ + "description": "Port for the read-only view (default: port + 1)", + "type": "integer" +}
- Changed
riv_ui_prototype2 fields changed- changed
Input schema / properties / maxElements / descriptionPrevious value: -"Must match the riv_ui_detect call (default 120)"New value: +"Must match the riv_ui_detect call (default 120, or 300 for svgPath)" - changed
Input schema / properties / minArea / descriptionPrevious value: -"Must match the riv_ui_detect call (default 576)"New value: +"Must match the riv_ui_detect call. imagePath only (default 576)"
- Changed
riv_visual_diff6 fields changed- added
Input schema / properties / animation / descriptionAdded value: +"Animation name; ignored when stateMachine is set (default: the first state machine, else the first animation)" - added
Input schema / properties / artboard / descriptionAdded value: +"Artboard name (default: first artboard)" - added
Input schema / properties / background / descriptionAdded value: +"CSS background color (default: transparent)" - added
Input schema / properties / height / descriptionAdded value: +"Output height in px (default: keeps the artboard aspect ratio)" - added
Input schema / properties / stateMachine / descriptionAdded value: +"State machine name (takes precedence over animation)" - added
Input schema / properties / width / descriptionAdded value: +"Output width in px (default: artboard width)"
5 tool updates
v0.6.1- Changed
riv_batch_render48 fields changed- removed
Input schema / properties / defaults / properties / animation / $refRemoved value: -"#/properties/jobs/items/properties/animation" - added
Input schema / properties / defaults / properties / animation / typeAdded value: +"string" - removed
Input schema / properties / defaults / properties / artboard / $refRemoved value: -"#/properties/jobs/items/properties/artboard" - added
Input schema / properties / defaults / properties / artboard / typeAdded value: +"string" - removed
Input schema / properties / defaults / properties / background / $refRemoved value: -"#/properties/jobs/items/properties/background" - added
Input schema / properties / defaults / properties / background / descriptionAdded value: +"CSS background color" - added
Input schema / properties / defaults / properties / background / typeAdded value: +"string" - removed
Input schema / properties / defaults / properties / count / $refRemoved value: -"#/properties/jobs/items/properties/count" - added
Input schema / properties / defaults / properties / count / descriptionAdded value: +"format=sprites: frame count (default 16)" - added
Input schema / properties / defaults / properties / count / exclusiveMinimumAdded value: +0 - added
Input schema / properties / defaults / properties / count / maximumAdded value: +256 - added
Input schema / properties / defaults / properties / count / typeAdded value: +"integer" - removed
Input schema / properties / defaults / properties / duration / $refRemoved value: -"#/properties/jobs/items/properties/duration" - added
Input schema / properties / defaults / properties / duration / descriptionAdded value: +"format=gif/apng/webm/sprites: seconds to render (default: one animation loop, or 2s)" - added
Input schema / properties / defaults / properties / duration / exclusiveMinimumAdded value: +0 - added
Input schema / properties / defaults / properties / duration / maximumAdded value: +30 - added
Input schema / properties / defaults / properties / duration / typeAdded value: +"number" - removed
Input schema / properties / defaults / properties / format / $refRemoved value: -"#/properties/jobs/items/properties/format" - added
Input schema / properties / defaults / properties / format / descriptionAdded value: +"Output format for this job" - added
Input schema / properties / defaults / properties / format / enumAdded value: +[ + "png", + "gif", + "apng", + "webm", + "sprites" +] - added
Input schema / properties / defaults / properties / format / typeAdded value: +"string" - removed
Input schema / properties / defaults / properties / fps / $refRemoved value: -"#/properties/jobs/items/properties/fps" - added
Input schema / properties / defaults / properties / fps / exclusiveMinimumAdded value: +0 - added
Input schema / properties / defaults / properties / fps / maximumAdded value: +60 - added
Input schema / properties / defaults / properties / fps / typeAdded value: +"integer" - removed
Input schema / properties / defaults / properties / height / $refRemoved value: -"#/properties/jobs/items/properties/height" - added
Input schema / properties / defaults / properties / height / exclusiveMinimumAdded value: +0 - added
Input schema / properties / defaults / properties / height / maximumAdded value: +2048 - added
Input schema / properties / defaults / properties / height / typeAdded value: +"integer" - removed
Input schema / properties / defaults / properties / loops / $refRemoved value: -"#/properties/jobs/items/properties/loops" - added
Input schema / properties / defaults / properties / loops / descriptionAdded value: +"format=apng: loop count, 0=infinite (default 0)" - added
Input schema / properties / defaults / properties / loops / minimumAdded value: +0 - added
Input schema / properties / defaults / properties / loops / typeAdded value: +"integer" - removed
Input schema / properties / defaults / properties / outDir / $refRemoved value: -"#/properties/jobs/items/properties/outDir" - added
Input schema / properties / defaults / properties / outDir / descriptionAdded value: +"Output directory (default: alongside the source .riv)" - added
Input schema / properties / defaults / properties / outDir / typeAdded value: +"string" - removed
Input schema / properties / defaults / properties / stateMachine / $refRemoved value: -"#/properties/jobs/items/properties/stateMachine" - added
Input schema / properties / defaults / properties / stateMachine / typeAdded value: +"string" - removed
Input schema / properties / defaults / properties / time / $refRemoved value: -"#/properties/jobs/items/properties/time" - added
Input schema / properties / defaults / properties / time / descriptionAdded value: +"format=png: seconds to advance before capture (default 0)" - added
Input schema / properties / defaults / properties / time / typeAdded value: +"number" - removed
Input schema / properties / defaults / properties / transparent / $refRemoved value: -"#/properties/jobs/items/properties/transparent" - added
Input schema / properties / defaults / properties / transparent / descriptionAdded value: +"format=apng: render on a transparent background (default true)" - added
Input schema / properties / defaults / properties / transparent / typeAdded value: +"boolean" - removed
Input schema / properties / defaults / properties / width / $refRemoved value: -"#/properties/jobs/items/properties/width" - added
Input schema / properties / defaults / properties / width / exclusiveMinimumAdded value: +0 - added
Input schema / properties / defaults / properties / width / maximumAdded value: +2048 - added
Input schema / properties / defaults / properties / width / typeAdded value: +"integer"
- Changed
riv_rig_character2 fields changed- changed
Input schema / properties / parts / additionalProperties / properties / pivot / itemsPrevious value: -[ - { - "type": "number" - }, - { - "type": "number" - } -]New value: +{ + "type": "number" +} - changed
Input schema / properties / parts / additionalProperties / properties / polygon / items / itemsPrevious value: -[ - { - "type": "number" - }, - { - "type": "number" - } -]New value: +{ + "type": "number" +}
- Changed
riv_slice_image1 field changed- changed
Input schema / properties / regions / items / properties / polygon / items / itemsPrevious value: -[ - { - "type": "number" - }, - { - "type": "number" - } -]New value: +{ + "type": "number" +}
- Added
riv_ui_detect - Added
riv_ui_prototype
1 tool update
- Changed
riv_studio_notes1 field changed- added
Input schema / properties / replyAdded value: +{ + "description": "Message to post back into the Studio chat as the assistant (what you changed, what you skipped, what you need)", + "type": "string" +}
30 tool updates
v0.5.0- First observed
riv_ab_compare - First observed
riv_asset_search - First observed
riv_batch_render - First observed
riv_create - First observed
riv_critique - First observed
riv_decompile - First observed
riv_design_tokens - First observed
riv_diff - First observed
riv_dump - First observed
riv_edit - First observed
riv_extract_assets - First observed
riv_generate_code - First observed
riv_import_svg - First observed
riv_inspect - First observed
riv_lint - First observed
riv_list - First observed
riv_lottie_import - First observed
riv_optimize - First observed
riv_play_state_machine - First observed
riv_render_apng - First observed
riv_render_frame - First observed
riv_render_gif - First observed
riv_render_sprites - First observed
riv_render_video - First observed
riv_rig_character - First observed
riv_setup - First observed
riv_slice_image - First observed
riv_studio - First observed
riv_studio_notes - First observed
riv_visual_diff
TDQS
Scored across 35 tools
Most tools target a clearly distinct action or output format, and the descriptions explicitly distinguish similar pairs like riv_visual_diff vs riv_ab_compare and riv_repair vs riv_optimize. There is still some clustering among rendering tools and among edit/lint/repair/optimize tools, but an agent can resolve it from the descriptions.
All tools use the same riv_ prefix, snake_case, and generally a verb or action-oriented naming pattern. Variants like riv_render_frame, riv_render_gif, and riv_render_apng are predictable and consistent.
35 tools is a very large surface for a single MCP server, even given the broad Rive workflow it covers. The set spans rendering, editing, linting, rigging, UI prototyping, studio interaction, and setup, which makes selection and maintenance heavy.
The surface covers an unusually complete Rive lifecycle: listing, inspection, rendering, diffing, creation, editing, linting, optimization, import/export, character rigging, UI prototyping, and live studio interaction. Minor gaps remain around general file management and some runtime/preview limitations, but core workflows are well covered.
Maintenance
Related MCP Connectors
Turn Claude into a creative studio: DNA-locked characters, images, video, voiceover โ 55 tools.
Make animated videos by asking Claude, Cursor or any MCP client. Your AI writes it, we render it.
Hosted motion engine for agents. Builds layers and keyframes, exports MP4, WebM or Lottie.
Build, version, review, and export websites, web apps, and games from a conversation.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to inspect, validate, control, and ship Rive animation files with 11 tools for parsing, scanning, generating types, comparing files, and more.9-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to create and edit Rive animations through 139 MCP tools, supporting shapes, animations, state machines, physics, and export to .riv or .rev files.453 npm2-
- AlicenseNot gradedqualityDmaintenanceEnables authoring, preview, and export of Spine 2D skeletal animations via natural language from Claude Code or any MCP client, with a web dashboard and tools for keyframing, templates, and GIF preview.7MIT

paraplex-mcpofficial
AlicenseNot gradedqualityCmaintenanceEnables Claude Code and other MCP clients to connect to an open browser-based 3D motion design studio tab, build and modify real layers and keyframes, inspect frames, and export PNG or video files.264 npmMIT