spine-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SPINE_MCP_PROFILE | No | Path to a team profile JSON file that holds default arguments, atlas limits, Unity texture and SkeletonGraphic settings and sprite slices. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Spine 4.3 tools (macOS and Windows, Spine Pro CLI + official spine-core runtime).
Paths must be absolute. .spine projects are exported to JSON into a cache folder (never next to the project); .json inputs work without the Spine CLI; binary .skel / .skel.bytes (a game build's data) are exported the same way for the read tools.
Only spine_add_animation / spine_derive_animation / spine_transfer_animation / spine_generate_animation (apply: true) and spine_restore_backup (apply: true) write to a project; spine_import_layers, spine_auto_rig and spine_rig_edit (apply: true) only create new projects; spine_update_images (apply: true) writes image files only (backed up) and never the .spine; they dry-run by default, back up first and verify. spine_unity_import (apply: true) writes into the Unity project you name (new folder, or update: true in place). spine_export writes runtime files only into the outputDir you give it, spine_showcase and spine_review_video only their output file (never over existing files unless overwrite). Everything else is read-only.
Writes are additive: prefer a new animation name over replacing the user's animation.
While a Spine editor window is open, writes go to a verified -mcp-staging.spine next to the project: tell the user to bring it in with Import Project (staged.importSteps), then confirm with spine_editor_status.
Resuming work on a project: spine_status first (instant; recent spine-mcp steps, outside changes since).
Typical flow: spine_project_info or spine_inspect (structure) -> spine_validate (problems) -> spine_measure (timing/spacing numbers) -> spine_render_frames (see it).
Each Spine CLI call costs ~3 s; spine-core based tools (inspect/validate/measure on cached JSON) are instant.
Prefer measured numbers over claims; the user owns artistic decisions.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| spine_doctorA | Checks the Spine CLI, editor version and license, spine-core version and work folder. Run first when something fails. |
| spine_project_infoA | Fast CLI summary ( |
| spine_export_jsonA | Exports a .spine project's skeletons to JSON in the cache folder (never next to the project); re-exports only when the project changed. |
| spine_inspectA | Skeleton structure. view summary (default): counts, bone tree, constraints, per-animation stats; bones|slots|skins|constraints: raw section JSON; animation: every timeline with exact keys. |
| spine_validateB | Finds problems: duplicate names, bone order, missing references (Spine drops them on import), mesh indices, key order, curves, keys on physics bones; samples every animation in spine-core (NaN, loop seams, clamps, invisible keys, mesh folds, joints opening). face: blinks vs pose changes and mouth swaps, lashes while shut, mouth bones, blink timing. |
| spine_measureB | Samples an animation in spine-core (constraints, physics warmed up); per bone: rotation range, path, peak speeds, pops, holds, loop seam. rootMotion: what SkeletonRootMotion reads (travel, sliding feet, in-place speed). parts: how far each slot travels. |
| spine_timingC | Timing structure from the keys: key poses and intervals, segment durations, ease type per segment, holds. |
| spine_compare_animationsB | A/B of two animations of one skeleton: duration, motion ratio, per-bone changes (biggest first), timing structure; optional contact sheets. |
| spine_render_framesA | Renders an animation with Spine's renderer (~4 s, cached) and returns a contact sheet. No MSAA or physics warm-up: for checking, not final video. |
| spine_add_animationA | Adds one Spine 4.3 JSON animation to a .spine project. Dry-run validates against the skeleton; apply backs up, imports only this animation through the CLI, re-exports, verifies and rolls back on any mismatch. Existing names need replace; prefer a new name. Times in seconds; rotate uses |
| spine_derive_animationA | Builds a new animation from an existing one with ops applied in order on the server, then adds it like spine_add_animation (validated, backed up, verified; dry-run unless apply). Ops: docs/USAGE.md#derive-operations. |
| spine_generate_animationA | A new animation of one type (fill only that type's object), added like spine_add_animation (validated, backed up, verified; dry-run unless apply). Missing bones/slots: suggestions by name, nothing written. breathe: torso scale or figure8, followers later; restStart. sway: chain swing. settle: decay after a gesture. blink: eye swaps and/or lid bones; onPoses hides head moves. gaze: eye darts between fixations; brows lift, arch, dip. lookAt: eyes lead, neck-to-head follows. followThrough: secondary motion baked over a source. turn: 2.5D head turn; squash: squash/stretch (mesh deform). walk: in-place cycle. blocking: pose-to-pose. lipSync: mouth/jaw from audio. Seconds, degrees, skeleton units; docs/USAGE.md#generate-options. |
| spine_import_layersA | New Spine project from a layered PSD: a region per layer at its canvas position, draw order from layer order, bones from groups (or PhotoshopToSpine tags), images next to it; masks baked, unsupported effects reported. Or json: PhotoshopToSpine's output (checked). Or parts: PNGs placed by a layout JSON (See-through, cut-boxes or {parts:[{file,x,y|bbox|center,order,bone,pivot,slot}]}). Dry-run by default, never overwrites; verified by re-export and a render against the PSD or the placed parts. Places art only. |
| spine_auto_rigB | Starting rig in a new project from a layered PSD or parts + layout: bones at joints, traced meshes, weights, optional two-bone IK; hidden lids rigged shut-collapsed. Without bones: suggests a skeleton over the art (nothing written; riders: one character sits on another; rigFrom: an approved rig's joints); pass back as bones. With bones: dry-run with checks; apply writes, validates, runs rig QA, renders test poses. Never overwrites. |
| spine_update_imagesA | Updates a project's image files from a layered PSD without touching the .spine: layers matched to images and cut to their frames, so meshes and animations stay valid. placement psd takes the PSD's layout; grow enlarges a region image. Dry-run with before/after renders; apply backs up and writes. restore: a backup id. |
| spine_rig_editA | Adds bones, IK, physics, events and skins, sets setup poses, removes constraints, traces regions into meshes in place (meshRegion), copies meshes from another rig (copyMesh); written to a NEW .spine via JSON import (original untouched), listing what else the round trip changed. Dry-run by default; one skeleton. |
| spine_list_backupsA | Backups made before writes (newest first), ids for spine_restore_backup. |
| spine_restore_backupA | Puts a backup back. Dry-run by default; apply backs up the current file first, then restores atomically. |
| spine_transfer_animationA | Copies an animation to another skeleton or project, matching names (exact, map, then case/separator-insensitive); reports what matched, renamed or could not move, then adds it like spine_add_animation (dry-run by default). copies: merge mode for animators on copies of one project: what each copy added or changed, conflicts (resolve with prefer), then writes into the base (to). |
| spine_exportA | Exports runtime files (JSON and/or .skel plus a packed atlas, optional scales), verified with spine-core in a temp folder before copying to outputDir (no overwrite unless set; project untouched, ~3-5 s). Reports page fill and texture memory. sweep: ranks atlas settings by texture memory and pages, writing nothing. |
| spine_showcaseA | 1-4 animations rendered by Spine side by side, labelled, as an animated .webp (alpha), .gif or .mp4 written only to output. For before/after and reels. Needs ImageMagick plus img2webp or ffmpeg. |
| spine_unity_checkC | Fresh export into a throwaway Unity project, every animation vs spine-core bone by bone (~30 s); perf: CPU/GC per skeleton. Options: docs/USAGE.md#into-your-unity-project. |
| spine_review_videoB | Review cut MP4: each animation rendered by Spine at each speed, every frame labelled (animation, speed, frame, time); optional audio under real-time passes and a title card. Writes only output. |
| spine_motion_visualB | Onion skin, bone arcs (one dot per frame) and value curves of one animation as an image, plus the numbers. Bones default to the 3 that travel furthest. |
| spine_reference_timingB | Timing from a reference video (optional crop): motion peaks, holds, cuts and repeat period as a frame table, graph and sheet. compare aligns a Spine animation on the peaks (speed ratio, offset, per-peak frames). |
| spine_video_inspectB | Frame-by-frame video check: encoding (VFR, size, pixel format, audio), segments at cuts and transitions with hold pattern (ones/twos), flashes, stutters, dropped frames, motion peaks, audio onsets vs cuts/peaks; an event list, per-frame curves and an overview sheet. verify compares a segment with a Spine animation. Exact frames: spine_video_frames. |
| spine_video_framesB | Exact video frames by number (spine_video_inspect's numbering) as a labelled sheet; diff marks changes in red, onion blends them. Up to 48 per call. |
| spine_unity_importB | Imports a .spine into a Unity project with spine-unity (data, atlas, materials, mixes, prefab), then compares it bone by bone with spine-core; reports texture settings and render pipeline. Dry-run by default. update: replace in place (backed up, GUIDs kept). With Unity open, only files are copied. audit: read-only scan (version, data files, API changes). |
| spine_web_checkB | Renders a fresh export with spine-webgl in headless Chrome and compares every frame with Spine's render (silhouette IoU, colour difference, worst frame). Needs Chrome or CHROME_BIN. |
| spine_mix_checkB | Plays transitions with spine-core's AnimationState like a game (mixes, optional base track), switching at several points; reports pops with phase and likely cause, timelines first keyed after 0, and events lost inside the mix. runtime mecanim: as spine-unity's SkeletonMecanim, plus the keys each incoming animation needs (setupKeys). |
| spine_budgetA | Spine Metrics over the setup pose and every frame: attachments, vertices, vertex transforms, triangles, area, clipping, draw call estimate, timelines, constraint costs; worst values with animation@time. limits for pass/fail; draw calls need atlas or pack (~4 s). |
| spine_snapshotA | Saves a labelled, verified backup copy before risky editor work (compare later with spine_reimport_diff). Without label: lists snapshots. |
| spine_reimport_diffB | Compares a project with a snapshot (default latest) or another .spine/.json: what broke (lost keys, weights, meshes, removed items) and what changed, then where playback of common animations now differs. |
| spine_editor_statusC | Is a Spine editor window open (and likely on this project)? While it is, writes go to a verified staging copy. With project: what still waits in the staging copy; animations confirms each one after Import Project and a save. |
| spine_statusA | Instant, no CLI: file state, editor window, staging copy, backups, spine-mcp's last steps on the project and outside changes since. Call first when resuming work. |
| spine_rig_qaA | Rig hygiene: names (spaces, clashes, default names, mixed left/right styles), unused bones, attachments, slots and events, bad setup scale, weights not summing to 1, too many influences, weights that fold when a bone turns, joints that open, art a mesh cuts off, missing or unused images. Complements spine_validate. |
| spine_skinsC | Checks each skin, or mix-and-match combinations: attachment counts, slots several skins set (last wins), slots none fills, and each one's budget over every frame. atlas or pack for exact draw calls. |
| spine_auditB | Validate, rig QA and budget on every .spine and skeleton .json under a folder: one ok/fail row per skeleton (strict: validation warnings fail too). For release checks and CI. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 38 tools
The tools are richly described, but several clusters are easy to confuse: validate vs. rig_qa vs. audit vs. budget, add vs. generate vs. derive vs. transfer_animation, and render_frames vs. showcase vs. review_video vs. motion_visual. Descriptions help separate them, but an agent still needs careful reading before selecting the right tool.
All tools use the spine_ prefix and snake_case, giving a predictable namespace. The main inconsistency is that many names are verb_noun while others are noun-only or adjective-like (doctor, status, timing, skins), but the set remains readable and coherent.
With 38 tools, this surface is well beyond the typical 3-15 range and is heavy for an agent to navigate reliably. The domain is complex, but many related checks and rendering helpers could be consolidated or grouped to reduce selection burden.
Coverage is broad across import, rigging, animation generation, validation, rendering, export, engine checks, backups, and status inspection. Minor gaps remain, such as explicit animation deletion/renaming or direct keyframe editing, but most workflows have a viable path.