Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

io.github.ODU33104/rive-mcp

NPM · RIVE-MCP-SERVER · SCANNED AUG 3

Free, editor-less MCP server for Rive: create, edit, inspect, render and preview .riv animations

Available components

+18 this week 67 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security88
  • No malware found by supply-chain analysis.Pass
  • Only part of the dependency tree could be resolved (99 of 103), so this covers what we could see, not the whole tree.Partial
  • No install/post-install scripts declared.Pass
  • Only part of the dependency tree could be resolved (99 of 103), so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency32
Schema Quality & AI Usability79
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5863 tokens (~209/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
  • Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage91
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 72% of tool parameters carry a description.Partial
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · rive-mcp-server

# add to Claude Code
claude mcp add odu33104-rive-mcp -- npx -y rive-mcp-server
# add to Codex CLI
codex mcp add odu33104-rive-mcp -- npx -y rive-mcp-server
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "odu33104-rive-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "rive-mcp-server"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add odu33104-rive-mcp --command npx --arg -y --arg rive-mcp-server
# ~/.hermes/config.yaml
mcp_servers:
  odu33104-rive-mcp:
    command: "npx"
    args: ["-y", "rive-mcp-server"]
// mcp.json
{
  "mcpServers": {
    "odu33104-rive-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "rive-mcp-server"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 2 Aug 26 +43
    • Provenance: unverified → fail security
    • Install scripts: unverified → pass security
    • Known CVEs: unverified → partial security
    • Malware scan: unverified → pass security
    • License: unverified → fail functional
    • Tool coverage: 100 → unverified functional
    • Schema quality: 100 → unverified functional
    • Dependency health: unverified → partial functional
    • Maintenance: unverified → pass functional
    • MCP protocol: unverified → pass functional
    • Stability: unverified → 0.23 functional
    • Schema quality: unverified → excellent functional
    • Licence: SEE LICENSE IN LICENSE functional
  • 31 Jul 26 −26
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Jul 26 49

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 3 Aug 2026 · Analysed npm/[email protected]

Provenance none

Ecosystem: npm · Outcome: none

Dependencies 99 packages

99 packages in the resolved dependency tree · 95 deprecated · 30 stale.

The dependency tree was only partially resolved, so these counts may be incomplete.

MCP tools — 28 exposed · ~5,863 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
riv_asset_search ~147

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.

NameTypeReqDescription
iconstringIcon to fetch, e.g. 'solar:rocket-bold' (from a previous search)
idPrefixstring
limitintegerMax results (default 24)
outSpecstringRequired with icon: output scene-fragment JSON path
querystringSearch terms, e.g. 'rocket launch'

No output schema declared.

No examples provided.

riv_create ~1,340

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 non-flat, non-"AI placeholder" quality (gradients, organic bezier curves, proper 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,…

NameTypeReqDescription
outPathstringyesOutput .riv path
previewTimenumberSeconds into first animation for the preview frame (default 0.4)
sceneobjectyesScene spec (see tool description for schema)

No output schema declared.

No examples provided.

riv_critique ~287

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.

NameTypeReqDescription
animationstringAnimation to sample (default: first)
artboardstring
framesintegerFrames to sample across the duration (default 6)
individualFramesbooleanAlso return each sampled frame as a separate full-size image (default false)
pathstringyesPath to the .riv file
stateMachinestring
widthintegerWidth of each filmstrip cell (default 200 — keep small, it saves tokens)

No output schema declared.

No examples provided.

riv_decompile ~201

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.

NameTypeReqDescription
outSpecstringWrite the scene spec JSON here (default: return summary only)
pathstringyesPath to the .riv file

No output schema declared.

No examples provided.

riv_design_tokens ~157

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).

NameTypeReqDescription
moodstring
schemestringDefault dark
seedstringBrand/seed color #RRGGBB (optional; mood default hue otherwise)

No output schema declared.

No examples provided.

riv_diff ~60

Structural diff between two .riv files: type count changes and per-object property differences.

NameTypeReqDescription
maxDiffsintegerMax object diffs to list (default 30)
pathAstringyes
pathBstringyes

No output schema declared.

No examples provided.

riv_dump ~75

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.

NameTypeReqDescription
fullbooleanReturn every object (default: summary + first 50)
pathstringyesPath to the .riv file

No output schema declared.

No examples provided.

riv_edit ~215

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).

NameTypeReqDescription
editsarrayyes
outPathstringOutput path (default: overwrite source)
pathstringyesSource .riv path

No output schema declared.

No examples provided.

riv_extract_assets ~119

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.

NameTypeReqDescription
outDirstringOutput directory (default: <file>.assets alongside the .riv)
pathstringyesPath to the .riv file

No output schema declared.

No examples provided.

riv_generate_code ~64

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.

NameTypeReqDescription
frameworkstringyes
pathstringyesPath to the .riv file

No output schema declared.

No examples provided.

riv_import_svg ~195

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: <text> (use texts[] with a font), <image>, filters, masks.

NameTypeReqDescription
idPrefixstringPrefix for generated shape ids (avoid collisions)
outSpecstringyesOutput scene-fragment JSON path (e.g. logo.scene.json)
svgstringInline SVG markup (alternative to svgPath)
svgPathstringPath to the .svg file

No output schema declared.

No examples provided.

riv_inspect ~61

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.

NameTypeReqDescription
pathstringyesPath to the .riv file

No output schema declared.

No examples provided.

riv_lint ~117

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).

NameTypeReqDescription
pathstringyesPath to the .riv file

No output schema declared.

No examples provided.

riv_list ~40

Recursively find .riv files under a directory and report size and format version for each.

NameTypeReqDescription
dirstringyesDirectory to search (absolute or relative)

No output schema declared.

No examples provided.

riv_lottie_import ~357

Convert a Lottie (bodymovin, .json) animation — the format used by LottieFiles' huge library of free, professionally animated assets — into a riv_create scene fragment. Unlike riv_import_svg (shapes only), this carries over the professional's actual choreography: keyframed position/rotation/scale/opacity with their exact bezier easing curves (not approximated 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.

NameTypeReqDescription
idPrefixstringPrefix for generated group/shape ids (avoid collisions)
jsonstringInline Lottie JSON text (alternative to path)
outSpecstringyesOutput scene-fragment JSON path (e.g. anim.scene.json)
pathstringPath to the Lottie .json file

No output schema declared.

No examples provided.

riv_optimize ~306

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. All steps are opt-in booleans (default: all on) and idempotent/safe to run repeatedly. Use dryRun=true to see the removal/thinning plan without writing anything. Run riv_lint afterwards if in doubt.

NameTypeReqDescription
dryRunbooleanReport the plan only; don't write anything (default false)
outPathstringOutput path (default: overwrite source)
pathstringyesSource .riv path
removeUnreferencedbooleanRemove unreferenced interpolators/events/empty tracks (default true)
thinKeyframesbooleanDouglas-Peucker thin redundant keyframes on linear-only runs (default true)
tolerancenumberThinning tolerance as a ratio of each track's own value range (default 0.01 = 1%, conservative)

No output schema declared.

No examples provided.

riv_play_state_machine ~102

Run a .riv state machine step by step: set/fire inputs, advance time, observe state transitions, and optionally capture frames. Returns a transition report.

NameTypeReqDescription
artboardstring
backgroundstring
pathstringyesPath to the .riv file
stateMachinestringState machine name (default: first)
stepsarrayyesSequence of interaction steps
widthinteger

No output schema declared.

No examples provided.

riv_render_apng ~249

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.

NameTypeReqDescription
animationstringAnimation name (default: first state machine or animation)
artboardstring
backgroundstringCSS background color when transparent=false (default #ffffff)
durationnumberSeconds to render (default 2)
fpsintegerFrames per second (default 20)
heightinteger
loopsintegerLoop count (0 = infinite, default 0)
outstringOutput path, .apng or .png (default: <name>.apng alongside the .riv)
pathstringyesPath to the .riv file
stateMachinestring
transparentbooleanRender on a transparent background to keep APNG alpha (default true). Set false to composite onto 'background'
widthintegerOutput width (default 480)

No output schema declared.

No examples provided.

riv_render_frame ~147

Render one frame of a .riv animation or state machine to PNG. Returns the image inline and saves it to disk.

NameTypeReqDescription
animationstringLinear animation name
artboardstringArtboard name (default: first)
backgroundstringCSS background color (default: transparent)
heightinteger
outPathstringOutput PNG path (default: alongside the .riv)
pathstringyesPath to the .riv file
stateMachinestringState machine name (takes precedence)
timenumberSeconds to advance before capturing (default 0)
widthinteger

No output schema declared.

No examples provided.

riv_render_gif ~159

Render a .riv animation (or state machine idle playback) to an animated GIF file for preview.

NameTypeReqDescription
animationstringAnimation name (default: first state machine or animation)
artboardstring
backgroundstringCSS background color (default white — GIF has no alpha)
durationnumberSeconds to render (default 2)
fpsintegerFrames per second (default 20)
outPathstringOutput GIF path (default: alongside the .riv)
pathstringyesPath to the .riv file
stateMachinestring
widthintegerOutput width (default: artboard width, capped 800)

No output schema declared.

No examples provided.

riv_render_sprites ~202

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.

NameTypeReqDescription
animationstring
artboardstring
backgroundstring
countintegerNumber of frames (default 16)
durationnumberSeconds spanned by the frames (default: one animation loop, or 2s)
fpsintegerMetadata playback fps (default: count/duration)
heightinteger
outstringOutput PNG path (default: alongside the .riv); metadata is written next to it with a .json extension
pathstringyesPath to the .riv file
stateMachinestring
widthinteger

No output schema declared.

No examples provided.

riv_render_video ~194

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).

NameTypeReqDescription
animationstring
artboardstring
backgroundstringCSS background color (default: transparent)
durationnumberSeconds to record (default: one animation loop, or 2s)
fpsintegercaptureStream() frame rate (default 30)
heightinteger
outstringOutput .webm path (default: alongside the .riv)
pathstringyesPath to the .riv file
stateMachinestring
widthinteger

No output schema declared.

No examples provided.

riv_rig_character ~235

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.

NameTypeReqDescription
artboardHeightnumber
artboardWidthnumber
backgroundColorstring
eyesarrayEye rects in image px coords (generates blink overlays)
furColorstringEyelid/patch color matching the fur (default #f8eee2)
headRationumberTop fraction of the image that is 'head' (default 0.45)
outPathstringyesOutput .riv path
partsobjectNamed cutout parts, e.g. {earL, earR, tail}. Names containing 'ear' attach to the head
pngPathstringyesCharacter PNG (transparent background recommended)

No output schema declared.

No examples provided.

riv_setup ~190

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.

NameTypeReqDescription
projectDirstringProject root for scope=project (default: current working directory)
scopestringproject = <projectDir>/.claude/skills (default), user = ~/.claude/skills

No output schema declared.

No examples provided.

riv_slice_image ~104

Cut polygon regions out of a character PNG for parts-based rigging (cutout animation). Writes each part as <name>.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.

NameTypeReqDescription
outDirstringyesDirectory to write part PNGs into
pngPathstringyesSource PNG path
regionsarrayyes

No output schema declared.

No examples provided.

riv_studio ~197

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.

NameTypeReqDescription
pathstringyesThe .riv file to preview (watched for changes)
portintegerPort (default 8787)
scenePathstringScene spec JSON path — enables the edit+rebuild panel
stopbooleanStop the running studio instead

No output schema declared.

No examples provided.

riv_studio_notes ~141

Fetch pending instructions the user typed into the Studio web UI's 'Instructions for AI' box. Call this when the user says things like 'check the studio notes' / 「スタジオの指示を確認して」, or after opening riv_studio when the user mentions they left notes. Consumes (clears) the queue by default; the Studio UI then shows the notes were picked up. Act on each instruction (usually via riv_edit or riv_create on the watched file — changes hot-reload in the browser).

NameTypeReqDescription
peekbooleanRead without consuming
portintegerStudio port (default 8787)

No output schema declared.

No examples provided.

riv_visual_diff ~202

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).

NameTypeReqDescription
animationstring
artboardstring
backgroundstring
heightinteger
outstringOutput diff PNG path (default: alongside pathA)
pathAstringyesPath to the first .riv file
pathBstringyesPath to the second .riv file
stateMachinestring
thresholdnumberMax per-channel diff (0-255) still counted as a match (default 16)
timenumberSeconds to advance before capturing (default 0)
widthinteger

No output schema declared.

No examples provided.