ART-PIPELINE-MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| doctorA | Check the toolchain: Python deps, Node (official spine-core runtime for validation and previews) and the Spine editor CLI (editable .spine export). |
| make_sampleC | Create a procedural sample project to try the tools on. kind: "symbol" (slot symbol: plate, gem, letter, highlight) or "character" (mascot with arms, cape, hair locks, face features, ears). |
| inspect_psdA | List a PSD's layers (names, groups, visibility, blend, bounds, [tags]) without writing anything. Run before import_psd. |
| import_psdC | PSD → project: one slot per visible layer, placed exactly as on the canvas, PNGs cropped to content, Photoshop blend modes mapped. origin "center" for symbols, "bottom" for characters standing on y=0. |
| project_infoC | Bones (with world head positions), slots (bone, attachment type, blend), constraints and animations of a project. |
| add_bonesB | Add bones in WORLD coordinates (y up). Each item: {"name", "parent" (default "root"), "x", "y", "rotation" (world degrees, default 0), "length" (default 0)}. Art never moves; only bones are added. |
| add_chainA | Bones along a polyline of world points (n points → n-1 bones, each reaching the next point). Use for limbs, spines, tails, tentacles. |
| reparent_slotB | Move a slot to another bone without moving its art. |
| rig_meshB | Turn a slot's region into a clean contour mesh (or re-mesh a mesh) with bone-heat weights. Outline traced from alpha and simplified without clipping art; interior vertices denser at joints; conforming Delaunay (valid for Spine's importer). Weights diffuse from bone segments over the mesh, so they blend smoothly across joints and never leak across gaps in the art. bones bones to weight to; omit with auto_bones=True to pick the slot bone + descendants that touch the part; [] with auto_bones=False gives an unweighted mesh. detail vertex density (0.5 light … 1 balanced … 2 dense) smooth >1 widens weight blending across joints, <1 tightens |
| rig_ikC | 1- or 2-bone IK (e.g. ["upper_arm", "forearm"]). Creates a target bone at
the chain tip unless |
| rig_physicsC | Spine 4.2 physics constraints (runtime secondary motion, no baked keys).
presets: hair, cloth, tail, ribbon, jiggle, antenna, tassel. Down a chain
each bone is |
| rig_transformC | Transform constraint: |
| rig_strandC | Hair lock / cape / ribbon / tail in one call: a bone chain along the part's own centre line, a heat-weighted mesh and physics. root_end: auto(top)|top|bottom|left|right. physics: preset name or "none". |
| rig_turnA | 2.5D head turn driven by ONE control bone (turn_ctrl). face_slot becomes a mesh whose middle travels with the control while its
outline stays pinned (a surface turning, not a sticker sliding).
features {slot: depth}: nose 1.25, mouth 1.0, brows 0.95, eyes 0.9,
fringe 0.8; parts behind the head negative: ears -0.35, back hair -0.5.
Adds a |
| juice_applyB | Slot-symbol juice. Default clips = the symbol contract: idle, land, win, win_loop, anticipation, dim. Extras: scatter_trigger, wild_expand, flip, flip_depth, multiplier_fly, win_big, win_mega, win_epic. Animates only two inserted bones (juice_ground at the base, juice_core at the centre) so the artist's own keys are never touched. One-shots end on the setup pose; loops are seamless; events fire for SFX (sfx_land, sfx_win…). intensity 0.5 subtle … 1.6 loud. fx=True layers matching FX. shine_slot adds a clipped shine sweep in win. options: back= (flip), rows (wild_expand), to=[x,y] (multiplier_fly), darkness (dim). |
| fx_generateB | Add an FX preset built from Spine primitives with procedural textures (tinted per slot, so the atlas stays tiny). presets: explosion (flash + shockwave + sparks + smoke), shockwave, coin_burst (spinning flipbook coins on true parabolas), coin_shower, ripple (seamless water rings), glow_pulse, sparkle, shine_sweep (needs slot=; light band clipped to that part's outline). into: merge into an existing animation (e.g. "win") instead of a new one. Each preset fires an event fx_ so the engine can add heavy particles (pixi emitters) at the same moment. |
| fx_recipeA | Authored FX layers lifted from real reference clips: lotus set (rune_ring, burst_flare, rim_wisps, bloom_aura, floor_glow, fireflies, twinkles, plus magic_reveal = all seven timed like the clip, 13.2 s), light_beam (style gold | ribbon | blue), crosshair / hit_burst / lock_on (reticle locks on, fires, impact), cell_glow (resizable 9-slice glowing cells that pop), puff (cartoon smoke puff, or flash + ring for an AE smoke_puff), smoke_glow (rising haze with a base glow), meteor_trace (comet racing around a frame), projectile (shot on an arc + impact), ice and water (frost, icicles, ice_shatter, bubbles, water_splash; AE template caustics), explosion and shine, the reel moments reel_stop (spring thud, squash, dust, screen shake on your reel/screen bones through inserted carrier bones) and anticipation_reel (accelerating heartbeat glow, edge flames or sparks, dimmed neighbours), the slot families (spin: near_miss, spin_blur, turbo_spin, screen_shake; wins: payline, win_highlight, multiplier_stack, win_rollup; payouts: coin_fountain, cascade_pop; features: wild_land, expanding_wild, scatter_trigger, free_spins_transition; bonus: pick_reveal, hold_respin, jackpot_wheel, meter_fill; ambient: weather, god_rays, water_surface, heat_shimmer, fog_roll, lightning_storm; UI: button_press, idle_shimmer, focus_glow, padlock, popup; saber = a port of Video Copilot's Saber beams with 12 presets and an ae_hint for the saber AE template; pinata family = wild_glow, wild_transform, mult_cell_glow, cell_pop, confetti_burst, mult_streak, wild_merge, coins_to_bar, bar_sweep, pinata_hit, jar_burst, banner_backdrop from one picture kit (swap a texture pack in by name with art=, retune it with options gain / thick); recipes that move your reel / symbol / screen / button bones do it through inserted carrier bones, never your own keys), and the hybrids portal and electric_frame, whose plasma / lightning part is After Effects: they return a ring_hint to pass to ae_fx_to_spine (guide explains). Procedural textures, additive only (one draw call), one group bone per recipe so it recolours, resizes and retimes as one piece, and it merges into any animation with into=. recipe="" lists every recipe with its options and defaults; recipe="guide" returns the guide (how to use, fork and mix them, how they were made, and the traps). x, y = the subject centre in the parent bone's space; scale 1 = a ~720-unit canvas with a ~420-wide subject; start = seconds into the animation; duration = life window (window recipes) or a time scale (one-shots); color = main tint; intensity = alpha gain; count = tufts / motes / stars / sparks; options = recipe-specific values (see the listing). magic_reveal takes options={skip: [recipe, ...], overrides: {recipe: {param: value}}}. Each recipe fires an fx_ event. art = your own pictures instead of the generated ones, keeping all the motion: {role: "file.png" | "file.psd#Layer" | {path, blend, scale, slice, px, anchor}}; the roles of each recipe are in the listing (e.g. crosshair: reticle). For lock_on / magic_reveal key it by member: {"crosshair": {"reticle": ...}}. tier = small | medium | big | mega | epic: one recipe covers every win size (scale, counts, one-shot time and the
recipe's own tier overrides; see the listing's |
| ae_fx_to_spineA | Render an After Effects comp and play it in Spine as a frame sequence, timing matched to the comp. Source: aep + comp (rendered headless with aerender from the SAVED .aep, over the work area, never touching the project open in the AE window), or frames_dir + fps (frames already rendered: .tif premultiplied, or .png). mode: "alpha" (the comp's own transparency; normal blend) or "additive" (light on black: alpha from brightness; additive blend). blend overrides the slot blend. Timing: playback speed equals the comp's (delay = 1/comp fps). Place it with start= (seconds into the Spine animation) or, to land an AE moment on a Spine one, hit_ae= (seconds in the comp, e.g. the impact) + hit_at= (Spine time it should coincide with). fit_duration= stretches the sequence to span that many seconds (loops that must divide the symbol's loop). seq_mode: once | loop | pingpong; a loop runs to until= (default: the end of the animation it is merged into). max_frames/max_size shrink it (every Nth frame; longest side in px), scale = game units per comp pixel, fade = fade-out seconds. animation= merges into an existing animation, otherwise ae_ is created. Leading and trailing empty frames are trimmed. Frames land in images/ae/NN.png; an event ae fires at the start. |
| ae_templateA | Build an After Effects FX comp from a template: returns a script to run in AE (nothing is rendered here). name="" lists the templates with their parameters and defaults. Otherwise name is one of: glow_pulse,
shockwave, sparkle, relief_shimmer (light wave over a picture, traced by its relief or a depth map),
fire, fire_aura (flame ring shooting out of a hole: fists, scatters, power-ups), lightning, burst (parabolic sparks),
splash. params override the defaults (comp= names the comp;
save_as= saves the open AE project to that .aep right after, which aerender needs).
Then: run the returned |
| add_keysB | Key one timeline with named easing (Spine curves are written for you). Bone timelines: rotate [t, deg], translate/scale/shear [t, x, y],
translatex/translatey/scalex/scaley [t, v]. Slot timelines: rgba/rgb
[t, "RRGGBBAA"], attachment [t, name-or-null]. Values are offsets from the
setup pose (Spine semantics). Append an easing name to a key to override
|
| add_eventC | Fire a Spine event (SFX cue, rollup start/stop, particle trigger) in an animation. |
| validateC | Structural validation (references, weights, triangulations, UV range, curves, events) plus — when Node is available — loading the skeleton in the official spine-core runtime and applying every animation frame by frame (non-finite vertices, missing regions). |
| qa_budgetB | Performance budget for mobile web. Profiles: mobile_symbol, mobile_banner, mobile_character, desktop. Counts bones, slots, vertices, weighted vertices, clipping, physics, deform keys, influences, atlas pages, and estimates draw calls (every blend-mode or page change along the draw order breaks the batch). Returns what is over budget and how to fix it. |
| previewC | Render animations through the official spine-core runtime (IK, physics, clipping all solved) to GIFs + contact sheets, plus a setup-pose PNG. |
| pack_atlasB | Pack every image the skeleton references (sequence frames included) into a Spine 4.x .atlas + pages. Copies the skeleton JSON next to it, so out_dir is a ready runtime folder. |
| make_editableB | Import the project into an editable .spine file with the licensed Spine editor CLI. Reports any repairs the importer made. |
| export_runtimeC | Export a .spine project to runtime data with the Spine CLI (json|binary or a path to an export-settings JSON). |
| make_face_sampleB | Create the procedural sample face: a mascot head drawn as separate layers named exactly as import_psd names a PSD that follows the face convention (face/head, face/eye_L/{white,iris,pupil,highlight,lid_upper,lid_lower}, face/brow_L, face/nose, face/mouth/{A,E,I,O,U,M,F,L,smile,frown}, face/jaw, face/cheek_L, face/ear_L, hair/back, hair/bangs, hair/strand_L ...), all on root. Run rig_face on it. |
| rig_faceA | Rig a whole face from named layers in one call, then build its clips. Recognises parts by layer name (case-insensitive, L/R sides, any group prefix): face/head (REQUIRED; also face, skin, base), face/eye_L/{white, iris, pupil, highlight, lid_upper, lid_lower}, face/brow_L, face/nose, face/mouth/{A,E,I,O,U,M,F,L} (+ rest, smile, frown) or one plain mouth layer, face/jaw (chin art), face/cheek_L, face/ear_L, hair/back, hair/bangs (fringe), hair/strand* / lock*. Missing parts are skipped and reported. project="" returns the naming convention (FACE_LAYERS) without changing anything. Builds: the 2.5D turn (rig_turn) as the base layer; eyes whose iris follows face_look and is CLAMPED inside the socket ellipse (one-bone IK with compress inside a (1, ry/rx)-scaled space) with pupil dilation and lid meshes that blink to the white's own 70/30 meeting line; 3-bone brows on a mesh; a viseme mouth slot riding a jaw that opens by stretching the lower face (scaleX = scaleY^-1/2); cheek bones in the face mesh, stretched by the jaw and lifted by face_smile (which also pushes the lower lids: smiling squints); hair strands (chain + mesh + physics) and a separate bangs swing bone. clips (default all): idle (seamless: breath, Poisson micro-saccades with the head 100 ms behind, Poisson blinks 80 ms down / 160 ms up), happy, sad, angry, surprised (spring envelopes with exact overshoot, brows a frame ahead, surprised anticipates with a 2-frame squash), talk (lipsync of talk_text). Events: sfx_blink, sfx_, sfx_talk, talk_word (string = word), talk_end. parent = the character's head bone (default juice_core or root); spine = a body bone that joins look_at two frames after the head. Scales are stored in bone lengths (face_rig = face height, turn_base = turn range, face_look_base = full gaze, lid bones = blink travel). |
| face_clipA | (Re)build one face clip on a rigged face: idle | happy | sad | angry | surprised | talk. duration 0 = the clip's default (idle 4 s loop, expressions ~1.8-2 s; talk = the speech + 0.35 s). intensity scales amplitudes, seed drives idle's Poisson saccades/blinks, text/phonemes/wpm feed talk, name renames the animation (e.g. happy_big). |
| look_atA | Bake a lagged look chain into an animation: eyes -> head -> spine (or any bones: works for bodies). gaze [[t, gx, gy], ...]: fixations in normalised gaze units (-1..1, +x = viewer's right, +y = up); saccades are instant. Or target = a bone whose translate keys in that animation are the gaze path (divided by target_range, default the length of the target's parent bone: face_look_base on a face rig). levels [{bone, channel: translate|rotate, range: [x, y] (px, or degrees per unit gaze), weight (share of the gaze it takes), lag (dead time s), hz + zeta (damped-spring response), limit (normalised radius for translate, degrees for rotate), role: "eyes"}]. Default on a face rig: face_look (eyes, instant), turn_ctrl (0.4 of the gaze, 100 ms later, slight overshoot), and spine= (0.15, two frames after the head, via an inserted carrier bone so the artist's keys stay). counter=True: the eyes take gaze minus the other levels, so they jump first and roll back as the head arrives (vestibulo-ocular reflex). loop=True solves the response periodically. |
| lipsyncA | Viseme + jaw keys from text or phonemes into an animation (works on any rig with a mouth slot whose attachments are named A E I O U M F L [rest], and/or a jaw bone). text: plain English through a tiny grapheme-to-viseme table (digraphs th/sh/ch/ee/oo/ou..., a silent final e
dropped), timed by wpm (each word 60/wpm s, vowels 1.6x a consonant, , ; . ! ? pause). phonemes: ARPAbet
(HH AH0 L OW1), viseme letters or rest/sil, optionally [phoneme, seconds]; durations={viseme: s} sets defaults.
Visemes are stepped attachment keys |
| rig_serpentA | Fish, eel, snake, dragon body or tentacle: ONE long chain along the body layer with a travelling wave. Layers by name (case-insensitive): body (required, one long layer), head + eye*/jaw/mouth (ride the first bone), fin* (2-bone strands with physics on the nearest body bone), tail_fin / fluke (strand on the last bone). Physics: y(s,t) = A(s) sin(2 pi (s/lambda - f t)) head -> tail, amplitude growing toward the tail
(head_amp = the head's share). speed (body lengths/s) sets the beat like a fish: f = speed / (0.7 lambda);
the tail amplitude follows Strouhal St = 0.3 (x exaggerate) unless amp (fraction of length) is given; the head
recoils sideways and thrust surges the body at 2f. Clips: swim (exact loop, |
| rig_flierB | Bird / flier (front view, wings to the sides). Layers by name: body (required), head (stabilised), beak/eye*/head_* (ride the head), wing_l / wing_r (3-bone chains, shoulder = the end nearest the body), wing__feather (primary feathers fanning off the hand, strands with physics), tail (strand, physics). flap: a warped sine per joint, downstroke = 58% of the beat, each joint |
| attach_rigA | Plug a sub-rig into a named bone of ANY rig; its clips MERGE by name into the host's clips (same name = same animation, timelines added; a host clip keeps its length, loops refit to divide it exactly, one-shots retime). kind="" lists the kinds with their layer names, default bones and options. Kinds (default bone): ears (head): ear_l/ear_r 2-bone strands with physics; clips ear_perk (exact spring overshoot), ear_flatten, ear_swivel (toward options.sound, the far ear lags), idle twitches. tail (hips): strand with physics; options.tail_mood happy | alert | angry drives idle; clips tail_happy, tail_alert, tail_angry; reacts in walk / run / win if the host has them. wings (chest): wing_l/wing_r (+ wing__feather); options.wing_type feathered | bat | insect; idle = slow breathing fold, excited = flutter; win reaction. horns (head): horn*/antler*: rigid, tiny inertia lag on head turns (physics on shear only). digitigrade (hips): leg_l/leg_r zigzag layers -> thigh, shin, metatarsus with the reversed hock, IK feet (foot_l/r ride them); walk (planted feet, sfx_step with l/r in the string), run reaction. mermaid (hips): mermaid_tail (+ fluke) as a rig_serpent chain; legs hidden; swim, idle_float, idle. snake_hair (head): snake (8-12): each a serpent with its own randomised idle; snake_look (shared IK target). fur (any): options.slots or fur*/coat*/mane*/ruff*: outline bones with physics; fur_ruffle (wind gust). glow (any): options.slots or eye*/rune*/vein*: the FX shine pulse (eyes) or electric_frame (runes) via fx_recipes.apply, tiled into options.clips (default idle) with exact loops and fx* events. name prefixes the new bones (attach the same kind twice). |
| make_serpent_sampleB | Procedural sample for rig_serpent. kind "fish": a koi (body, head, eye, fin_dorsal, fin_pectoral, tail_fin), head to the right. kind "tentacle": one tapered tentacle with suckers, base at the bottom. |
| make_flier_sampleB | Procedural front-view bird for rig_flier: tail, wing_l/r with wing_feather1..N, body, head, beak, eyes. |
| make_host_sampleA | Procedural minimal biped host for attach_rig (bones root > hips > chest > head, legs, arms; clips idle
2.4 s loop, walk 1.0 s loop, win 1.2 s one-shot) with the layers for the add-ons in |
| gaitA | Key a gait on ANY rig that has foot IK targets and a body bone: planted stance, swing arc, toe roll, body bob and pitch coupled to the footfalls, and an sfx_step event (string = leg name) at every touch-down. Call with no project to list the gaits. gait: walk (4-beat LH LF RH RF), trot (diagonals), pace (laterals), canter (3-beat), gallop (rotary, two
flights), bound (hind pair / fore pair) for 4 legs; tripod (L1 R2 L3 / R1 L2 R3) and wave for 6;
biped_walk / biped_run for 2 ("walk"/"run" resolve by leg count).
legs: the foot IK target bones, e.g. ["ik_front_L", "ik_front_R", "ik_hind_L", "ik_hind_R"]; side and end are
read from the name (_L/_R, front/hind/middle, LF, RH, L1..R3) or given as dicts
{"target", "side": "L|R", "end": "front|middle|hind", "name", "roll", "hip", "reach", "offset", "bias"}.
Hip, reach and the hock offset are found from the IK constraint that serves each target.
body: the bone that bobs and pitches (its children carry the hips/shoulders; the targets must NOT be under it).
speed: units/s (default: the gait's typical speed in leg lengths/s x the hip height). The cycle is in place;
the game scrolls the world at this speed. Frequency f = c sqrt(speed / leg_length), stride = speed / f,
so speed scales both by sqrt; if a stride would over-stretch a leg the frequency is raised (reported).
frequency / duty / clearance / bob / pitch / roll: overrides (0 or -1 = gait default; clearance and bob in units,
pitch and roll in degrees). exaggerate scales clearance, bob, pitch and roll. facing: 1 right, -1 left,
0 auto (front feet ahead of hind feet). Loops close exactly; keys go into animation |
| rig_quadrupedA | Rig a four-legged animal from its layers and build its clips in one call. Layers (case-insensitive, R = near side, L = far side, the animal faces right or left; see QUADRUPED_LAYERS): REQUIRED body, head, {front|hind}{upper|lower|foot}{L|R}; optional {front|hind}mid{L|R} (metapodial), neck, tail, ear_L/ear_R, eye_L/eye_R, mane*, tuft*, wattle*, snout/nose/jaw/... (ride the head); anything else rides the nearest body bone. Missing optional parts are skipped; missing required ones are listed in the error. leg_type: plantigrade (2-bone IK, flat foot), digitigrade (3 segments: 2-bone IK to a hock/carpus target + 1-bone IK on the metapodial; made by splitting the lower leg if there is no mid layer), unguligrade (long cannon + pastern bone for the hoof). Spine q_body -> spine_back/hips + spine_front/shoulders, neck1/neck2, head, eye bones, physics strands (tail loose and wild, ears, mane, tufts, wattles). clips (default all): idle, alert, walk, trot, gallop, bound, pounce, sleep, shake (+ pace, canter). Loops are exact, one-shots end on the setup pose. Events: sfx_step (string = foot), sfx_idle (ear_flick / tail_swish / blink), sfx_alert, sfx_pounce, sfx_sleep, sfx_shake. speeds: {clip: units/s} for the gait clips. seed drives the idle's ear flick / tail swish / blink timer. exaggerate scales every amplitude. |
| make_quadruped_sampleB | A procedural dog-like side view (faces right, stands on y = 0) with one layer per part, named by the QUADRUPED_LAYERS convention, to try rig_quadruped and gait on. rig=True also runs rig_quadruped (all clips). with_mid=False leaves out the metapodial layers (the rig then splits the lower legs). |
| make_biped_sampleA | Create a procedural biped (a chibi adventurer, side view) whose layers follow BIPED_LAYERS, exactly as import_psd would bring in a PSD with origin="bottom": torso, head, arm_l/r, hand_l/r, leg_l/r, foot_l/r (or upper_arm/lower_arm and thigh/shin with split_limbs=true), plus cape, ponytail, belt_tail, pouch and head features (eye_r, brow_r, mouth, ear_r, hat). Try rig_biped → clip_set → qa_character on it. |
| rig_bipedA | Rig a biped from its PSD layers in one call (import_psd origin="bottom" first). Layers are recognised by name (BIPED_LAYERS, case-insensitive, sides _l/_r, "Arm L", "arm.l", "left_arm"): required torso (body), head, arm_l/r (or upper_arm + lower_arm / forearm), leg_l/r (or thigh + shin / calf); optional pelvis, neck, hand_l/r, foot_l/r (boot/shoe), eye*, mouth, and strand layers (hair, cape, scarf, belt_tail, chain, feather, tail, pouch...). Missing required layers → a clear error listing them. Builds root → ground → hips → spine1-3 → chest → neck → head, shoulders/arms/hands, thighs/shins, floor-pinned
foot IK (ik_foot_l/r under ground: the body bobs and the feet stay put), arm IK (ik_hand_l/r ride the chest),
bones placed from each layer's own centre line, the knee/elbow bend taken from the art (straight art: knees
forward, elbows back). One weighted mesh across each joint (shoulders, hips, elbows, knees) so bends cannot
crack. breathing adds the 4 s |
| clip_setA | The character contract: the SAME clip names for every character, so game code never changes. idle (loop 4 s: one real breath), idle_fidget, walk (loop), run (loop), jump, land, hit, attack, win, lose, talk (loop). Loops close exactly, one-shots end exactly on the setup pose, the artist's setup never moves. Events: sfx_step on every footfall (string = the foot bone, float = the ground speed in px/s: move the character at that speed and the feet do not slide), sfx_jump, sfx_land, sfx_hit, sfx_attack + attack_hit (damage frame), sfx_win, sfx_lose, sfx_talk, sfx_idle_fidget. Physics: walk = inverted pendulum, run = spring-mass + gravity-parabola flight, land = exact spring squash 0.85 → overshoot 1.05 (volume kept), hit = 2-frame anticipation against the blow then a spring recoil lagging up the chain, attack = wind-up, strike, spring follow-through. Strands get a headwind ~ v^2 in walk/run. Works on any rig that has the bones a clip needs (canonical names from rig_biped; bone_map renames them, e.g. {"hips": "hip", "ik_hand_r": "arm_r2_ik"}); clips whose bones are missing are skipped and listed with what is missing. intensity 0.5 subtle … 1 standard … 1.6 cartoon. durations {clip: seconds}. blow_from front|back. |
| secondaryA | Secondary motion in one call: find every strand-like layer and give it a chain along its own centre line, a weighted mesh and Spine physics. By name (hair/lock/ponytail/braid → hair; cape/cloak/skirt → cloth; scarf/ribbon/sash → silk; belt_tail/strap → leather; chain/necklace → chain; feather/plume → feather; tail; pouch/bag/charm/pendant → a one-bone pendulum) and, with by_shape, any other elongated layer (cloth). The chain starts at the end that overlaps the body and hangs from the body bone nearest it. presets {slot: hair|cloth|silk|leather|chain|feather|tail|ear|pouch} overrides; n_bones 0 = the preset's. |
| squash_stretchB | Volume-preserving squash & stretch of any bone chain on an exact spring, keyed into |
| qa_characterC | Character QA played in spine-core: joint cracks (where two parts' art separates at a bending joint, or a
single mesh folds), foot slide (a planted foot drifting from the clip's ground speed) and the mobile bone budget
for the rig type (biped, quadruped, flier, serpent, face; auto detects) plus mobile_character. Returns |
| rig_creatureA | Rig a non-humanoid creature from its layers and build its clip set, composing the existing rigs (gait / rig_quadruped, rig_serpent chains, rig_flier wings, clip merge by name, fx recipes). kind="" lists every kind with its layer convention (case-insensitive, last group/ part of a PSD name counts), clips and options. Kinds (clips): slime (idle, hop, hit, win): body = one mesh on a core + n_outline (6-8) outline bones with soft physics; squash keeps the volume (scaleY 0.7 -> scaleX 1.195; options.law="area" -> 1/scaleY); hop = anticipation squash, ballistic parabola (stretch ~ speed), splat recovering on an exact spring; outline wobble in Rayleigh drop modes (mode 3 at 1.936 x mode 2). Events sfx_hop, sfx_land, sfx_hit, sfx_win. golem (idle, stomp, hit): rigid parts with gaps, each lagging its parent through a critically / over-damped filter (zeta >= 1: never overshoots; fists lag two levels); glowing seams (additive glow slot per crack*); stomp = slow heavy rise, gravity drop, dust, event screen_shake (float = px, int = ms) + sfx_stomp. ghost (idle, swoop, fade_out, fade_in): strand-chain body with physics, no legs; bob and sway from two incommensurate periods closed exactly over the loop; alpha breathing; trailing wisp* strands. fade_out ends invisible (bones on setup), fade_in starts there. tentacle (idle, reach, slam): tentacle layers each a rig_serpent tentacle chain off the core with reach IK on the tip; idle phases per tentacle; reach = spring strike + IK grab (sfx_reach, sfx_grab); sucker template clones swap to stretched art while the tentacle stretches; slam whips (screen_shake). dragon (idle, walk, fly, breath, roar): rig_quadruped body + serpent neck and tail + bat wings (rig_flier stroke); breath = generated fire flipbook from the mouth (fx_fire, sfx_breath) with an ae_hint for the AE fire template; roar with screen_shake. insect (idle, walk, fly): leg_{L|R}{1|2|3}_{upper|lower}, tripod (or wave) gait with sfx_step per foot, antenna strands, wing-blur flipbook in fly. plant (idle, grow, attack): trunk chain, branch* strands, root* IK feet, leaf* physics fans; grow is diffusion-limited (front s = sqrt(2 k t)), leaves pop on a spring; attack whips a branch (screen_shake). mimic (idle, open, bite, land, win): spring hinge lid (exact overshoot), gravity close with restitution bounces, tongue strand, teeth; open fires the FX shine; land / win through the juice_apply contract. Loops close exactly, one-shots end on the setup pose; the artist's setup never moves. The result reports the bones / slots / constraints and qa.budget(mobile_character). |
| make_creature_sampleA | Procedural sample for rig_creature (slime | golem | ghost | tentacle | dragon | insect | plant | mimic): simple readable parts drawn with PIL, one image per layer, named exactly as import_psd names a PSD that follows the kind's convention. Not rigged: run rig_creature on it. |
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 49 tools
Several tool families overlap: rig_mesh and secondary both build weighted meshes, rig_strand and secondary add physics strands, make_sample and specialized make_*_sample creators overlap, and fx_generate and fx_recipe both add FX. Detailed descriptions help, but with 49 tools an agent can easily misselect among the rigging and sample-generation clusters.
All names use snake_case and are generally readable, but the set mixes verb_noun (add_bones, rig_biped, make_sample) with bare nouns (doctor, validate, preview, gait, secondary) and prefix families (fx_, ae_, qa_). The convention is not uniform, though it remains consistent enough to follow.
49 tools far exceeds the 3-15 sweet spot; although the domain is broad, the server is heavy and many tools are variants of sample/rig generators. An agent faces a very large decision space.
Covers import, sample generation, many rig types, animation, FX, AE integration, QA, preview, export, and atlas packing—a very wide lifecycle. Minor gap: no explicit delete/remove or general editing tools for existing bones/slots/constraints/animations, though make_editable offers an external workaround.