Server data from the Official MCP Registry
Generate game assets with AI: sprites, animations, 3D models with rigging, video, music, SFX, voices
About
Generate game assets with AI: sprites, animations, 3D models with rigging, video, music, SFX, voices
Remote endpoints: streamable-http: https://mcp.ludo.ai/mcp
Security Report
Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Imported from the Official MCP Registry.
48 tools verified · Open access · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Permissions Found in Source Code
Found by scanning the linked source code. This listing connects to a hosted endpoint, so none of this runs on your machine: it describes what the server software does where it is hosted.
How to Connect
Remote Plugin
No local installation needed. Your AI client connects to the remote endpoint directly.
Add this to your MCP configuration to connect:
{
"mcpServers": {
"ai-ludo-game-assets": {
"url": "https://mcp.ludo.ai/mcp"
}
}
}Documentation
View on GitHubFrom the project's GitHub README.
Ludo AI MCP Server
Generate game assets using AI through the Model Context Protocol (MCP).
Features
| Category | Capabilities |
|---|---|
| Images | Sprites, icons, screenshots, backgrounds, UI assets, textures, background removal, upscaling, pixel-art conversion |
| 3D Models | Character images ready for a 3D model (from a prompt, or your own image redrawn as a 3D render), convert 2D images to GLB models with PBR textures (prop or the more detailed hero model, rigged in the same call if you like), auto-rig models (skeleton + skin weights, engine-ready joint naming), text-driven skeletal animation, retarget curated animation presets onto rigged models |
| Directional Sprites | Render a 3D model as styled sprites from up to 8 directions that line up, in looks from pixel art to painted to 3D render, animated with a preset or your own clip, holding fitted accessories (swords, shields, helmets...), previewed for free before you render |
| Animation | Animated spritesheets from static sprites (4-64 frames), keyframe animation through up to three fixed frames, motion transfer from video or presets, spritesheet editing (re-prompt, outpaint, loop fixing, finer-detail re-render), free re-export with other sheet settings, sound effects for a spritesheet |
| Video | Generate short videos from images or reference images (5-15 seconds, with a soundtrack), prompt-driven video editing, 2x upscaling |
| Audio | Sound effects, background music, character voices, TTS |
| Jobs & History | Async job queue: submit, poll or long-poll, list and cancel jobs (queued jobs refund their credits), plus paginated generation history across the API and the web app |
| Account | Credit balance, plan and auto top-up settings, to check before an expensive generation; plans, prices and what each call costs |
| Documentation | Search or read Ludo's own feature guidance before generating: animation modes, model choice, margins, known limitations |
| Feedback | Report a limitation, bug or missing capability straight to the Ludo team |
Quick Start
1. Get an API Key
API access comes with the Pro and Studio plans. Create a key at app.ludo.ai/api-keys; it is shown only once.
Using a coding agent (Claude Code, Codex, Cursor)? The Ludo CLI is the better fit: the agent loads only the commands it needs, and files go in and out by path.
2. Configure Your MCP Client
The server speaks Streamable HTTP at https://mcp.ludo.ai/mcp. Every client sends the key in a header:
Authorization: ApiKey YOUR_API_KEY
Setups for eleven clients, including Windsurf, Cline, Zed and Kiro, are on ludo.ai/developers/mcp.
Claude Code
claude mcp add --transport http ludo https://mcp.ludo.ai/mcp --header "Authorization: ApiKey YOUR_API_KEY"
Add -s user to use it in every project.
Claude Desktop and claude.ai
Open Customize > Connectors, click Add, then Add custom connector. Name it Ludo, use the URL https://mcp.ludo.ai/mcp, and under Request headers add Authorization: ApiKey YOUR_API_KEY. (claude_desktop_config.json only starts local servers; a remote server goes in as a connector.)
Codex
Add to ~/.codex/config.toml:
[mcp_servers.ludo]
url = "https://mcp.ludo.ai/mcp"
[mcp_servers.ludo.http_headers]
Authorization = "ApiKey YOUR_API_KEY"
Cursor
Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"ludo": {
"url": "https://mcp.ludo.ai/mcp",
"headers": {
"Authorization": "ApiKey YOUR_API_KEY"
}
}
}
}
VS Code
Add to .vscode/mcp.json, then use Copilot Chat in Agent mode. VS Code asks for the key once and stores it securely:
{
"inputs": [
{ "type": "promptString", "id": "ludo-api-key", "description": "Ludo.ai API key", "password": true }
],
"servers": {
"ludo": {
"type": "http",
"url": "https://mcp.ludo.ai/mcp",
"headers": { "Authorization": "ApiKey ${input:ludo-api-key}" }
}
}
}
Gemini CLI
gemini mcp add -s user --transport http --header "Authorization: ApiKey YOUR_API_KEY" ludo https://mcp.ludo.ai/mcp
Clients that only run local servers
Bridge with mcp-remote (needs Node.js). Keep the header argument free of spaces and pass the key through env:
{
"mcpServers": {
"ludo": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.ludo.ai/mcp", "--header", "Authorization:${LUDO_AUTH}"],
"env": { "LUDO_AUTH": "ApiKey YOUR_API_KEY" }
}
}
}
Available Tools
Generation tools run on a job queue and return a job id immediately; the Returns field of each tool below describes the result you get back from getApiJob once the job succeeds. See How Generation Calls Work.
Models
Sprite animation, motion transfer, spritesheet editing and video generation take an optional model. Pick from the current models; the defaults are what the Ludo web app uses.
| Model | Used for | Notes |
|---|---|---|
hydra | Sprite animation, keyframes, motion transfer and spritesheet editing (the default for all four) | Most capable all-around model; its spritesheets come with a generated sound effect (audio_url, an mp3). 3 credits/s, shortest animation 3s (9 credits minimum) |
griffin-hd (Griffin) | Sprite animation, keyframes and spritesheet editing | Highest resolution and best image fidelity. Flat 10 credits per animation; up to 5s |
forge | Sprite animation, keyframes, motion transfer, spritesheet editing | Cost-effective, for basic animations and simple sprites; on motion transfer it works best with presets and matching poses. Multiple tries might be needed. 1.5 credits/s on animation, 2 credits/s on transfer and editing, no minimum charge |
forge-pixel | Same actions as forge | Same pricing as forge; for low-res pixel-art sprites |
griffin-hd (Griffin) | Video generation, video from references and video editing (the default for all three) | Cinematic video in any style with a soundtrack, 720p. 2 credits/s on all three, 5s to 15s. Landscape and portrait output is too large for upscaleVideo |
griffin (480p) was retired from video generation and video from references on 2026-10-27. Requests that name it are rejected; use griffin-hd.
Legacy models - hydra-plus (since 2026-11-02), blitz, eagle, eagle-audio, tango (and the alias standard) - are still accepted so existing integrations keep working, but they are scheduled for removal. Do not use them for new work. The server marks them LEGACY in every tool description and lists them last.
Search Documentation (searchDocs)
Ask Ludo's own documentation a plain-language question and get back only the few sections that answer it: how to choose a sprite animation mode, when to use Generate Before / Generate After, how margins behave, which model suits a job, what something costs, and each generator's known limitations. This is the fastest way to learn how a feature is meant to be used before generating with it, so start here rather than reading whole documents.
| Parameter | Required | Description |
|---|---|---|
query | Yes | What you want to know, in plain language (up to 500 characters), e.g. "how do I keep a sprite animation's colors consistent" |
n | No | Maximum number of sections to return (1-10, default: 3) |
Returns:
results: Array of{ doc, label, section, relevance, content }, best first.contentis the section's full markdown;docandsectioncan be passed straight togetDocsto read it again.relevanceis a 0-1 match score, and only results scoring 0.6 or higher are returnedmessage: Present only whenresultsis empty, which means the documentation does not cover the question. Rephrase it, or browse withgetDocs
If the search backend is briefly unavailable the tool returns 503; fall back to getDocs rather than retrying in a loop.
Credits: Free
Feature Documentation (getDocs)
Browse or read Ludo's documentation in full. This is the same documentation the Ludo web app shows its users, so it occasionally describes buttons rather than parameters; the substance applies here just the same. To answer a specific question, use searchDocs first.
Call it with no parameters to get a table of contents, then again with doc (and ideally sections) to read only what you need. The whole corpus is roughly 280,000 characters, so fetching a full document without naming sections can return tens of thousands of characters.
| Parameter | Required | Description |
|---|---|---|
doc | No | Document to read. Omit for the table of contents. One of assistant, game-ideator, image-generator, project, account, faq, 3d-generator, video-generator, sprite-generator, audio-generator, api-mcp, game-asset-generation |
sections | No | Section titles to return from doc, matched ignoring case, spacing and punctuation. Only valid together with doc |
Returns:
docs: Array of{ id, label, sections }, where each section is{ title, content }.contentis markdown, and is omitted from the table of contentsunmatched_sections/available_sections: Present only when some, but not all, requested titles matched: the titles that matched nothing, and every valid title ofdoc
An unknown doc, or a request where no section title matches, returns 400 listing the valid values, so a wrong guess costs one extra call rather than a dead end.
The server also announces both documentation tools to MCP clients via its instructions field during the initialize handshake, so models connected through clients that surface server instructions are told to search the documentation before generating.
Credits: Free
Image Generation (createImage)
Generate sprites, icons, backgrounds, UI assets, and textures from a text prompt alone (no source image needed). To match the art style of an existing image use generateWithStyle, to modify an existing image use editImage, and to cut out a subject use removeBackground.
| Parameter | Required | Description |
|---|---|---|
prompt | Yes | Detailed description of the image |
image_type | Yes | sprite, icon, screenshot, art, asset, sprite-vfx, ui_asset, fixed_background, side_scrolling_background, texture, horizontal_tile, tile, item-icon, portrait, card-art, splash, 3d, generic |
art_style | No | 8-Bit, 16-Bit, 32-Bit, Hi-Bit, Low Poly, Stylized 3D, Voxel Art, Flat Design, Anime/Manga, Western Cartoon, Hand-Painted, Photorealistic 3D, Cel-Shaded, etc. |
perspective | No | Side-Scroll, Top-Down, Isometric, First-Person, Third-Person, 2.5D |
aspect_ratio | No | default, ar_1_1, ar_4_3, ar_16_9, ar_9_16 |
n | No | Number of variations (1-8, default: 1) |
request_id | No | Client-provided ID to retrieve results later |
Credits: 0.5 per image
Edit Image (editImage)
Modify an existing image using text instructions (smart editing).
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded image to edit |
prompt | Yes | Description of changes (e.g., "remove the background", "make it darker", "add clouds to the sky") |
reference_image | No | URL or base64 reference image for style/content guidance |
n | No | Number of variations (1-4, default: 1) |
request_id | No | Client-provided ID to retrieve results later |
Credits: 0.5 per image
Generate with Style (generateWithStyle)
Generate new content while maintaining the visual style of a reference image.
| Parameter | Required | Description |
|---|---|---|
style_image | Yes | URL or base64-encoded reference image for style matching |
prompt | Yes | Description of what to generate (e.g., "a warrior character", "a treasure chest") |
image_type | Yes | sprite, icon, screenshot, art, asset, sprite-vfx, ui_asset, fixed_background, texture, 3d, generic |
n | No | Number of variations (1-4, default: 1) |
request_id | No | Client-provided ID to retrieve results later |
Credits: 0.5 per image
Generate Pose (generatePose)
Generate a new pose for an existing sprite. Use this BEFORE animateSprite to get the best animation results - the starting pose should match your intended animation.
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded sprite image |
pose | Yes | Target pose: Idle (Front), Idle (Back), Idle (Left Facing), Idle (Right Facing), Walk (Left), Walk (Right), Run (Left), Run (Right), Crouching, Crawling, Sitting, Attack Ready, Jump Preparation, Defending / Blocking, Flying, Sleeping, or Other (with a free-text description) |
description | No | Additional instructions to guide pose generation |
n | No | Number of variations (1-4, default: 1) |
request_id | No | Client-provided ID to retrieve results later |
Returns: url, pose, motion_prompt
Example workflow:
- Generate a "Walk (Left)" pose with
generatePose - Use the returned
motion_promptdirectly inanimateSpritefor optimal animation results
Credits: 0.5 per image
Rotate Sprite (rotateSprite)
Rotate the camera view of an existing sprite to a new angle, keeping the same character and pose. Useful for generating turnaround / directional views of a sprite.
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded sprite image |
camera_rotation | Yes | Camera azimuth in degrees: 0 (front), 45 (front-right), 90 (right side), 135 (back-right), 180 (back), -135 (back-left), -90 (left side), -45 (front-left) |
camera_elevation | No | Camera tilt in degrees: 0 (eye-level), 30 (elevated), 60 (high-angle). Omit to keep the sprite's current elevation. |
n | No | Number of variations (1-4, default: 1) |
request_id | No | Client-provided ID to retrieve results later |
Returns: url, camera_rotation, camera_elevation
Credits: 0.5 per image
Remove Background (removeBackground)
Remove the background from a single image, returning the subject isolated on a transparent background. For broader edits (not just cutting out the subject), use editImage instead.
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded image |
crop | No | Trim the result to the subject's bounding box (default: false) |
creative_edit | No | Higher-quality output that may not match the input pixel-for-pixel (default: true). Set false when the subject must stay pixel-identical, e.g. an existing sprite you will animate |
request_id | No | Client-provided ID to retrieve results later |
Returns: a single result with url (transparent PNG)
Credits: 0.5 per image
Upscale Image (upscaleImage)
The same image at a higher resolution, up to 4x, with the result capped at 2048px on its longest side. The source must be below 2048px on its longest side; a larger one is rejected with HTTP 400 before anything is charged.
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded image, below 2048px on its longest side |
request_id | No | Client-provided ID to retrieve results later |
Returns: a single result with url
Credits: 0.5 per image
Convert to Pixel Art (convertToPixelArt)
Any art, broken AI pixel art or pixel art comes back as pixel art at about the input's own size. Synchronous: the call answers with the result directly, with no job to poll.
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded image, up to 15MB |
pixel_size | No | Size of one pixel-art pixel in the input's pixels (at least 2); larger is coarser. Omit to use the image's own pixel grid, which must be detectable (otherwise HTTP 400 asks for a pixel_size). On an input already on a grid it snaps to whole steps of that grid |
palette_size | No | At most this many colours (2-256); omit to keep the colours |
request_id | No | Client-provided ID to retrieve results later |
Returns: url, pixel_size (yours, or the detected one, which can be fractional), and columns / rows, the art's size in pixel-art pixels: resize to columns x rows with nearest-neighbour for one image pixel per art pixel
Credits: Free (20 calls per 5 minutes, 120 an hour, 1,000 a day)
3D Model Generation (create3DModel)
Convert a 2D image to a 3D GLB model with textures, optionally rigged in the same call.
| Parameter | Required | Description |
|---|---|---|
image | Yes | URL or base64-encoded image, taken as the front view |
model | No | prop (default): low-cost, for everyday props and environment pieces. hero: far more detailed and accurate, for close-up assets, but slower and more expensive |
back_image | No | prop only: the same subject seen from behind (URL or base64), so the back of the model follows it instead of being invented. hero rejects it |
texture_type | No | pbr (default), simple, none |
texture_size | No | 1024, 2048 (default) |
target_num_faces | No | Triangle count 1,000-200,000 (default: 50,000) |
rig | No | Also rig the model (skeleton + skin weights) in the same call (default: false). It gets the general rig, which suits any shape; there is no rig type to pick here (rigModel offers the others). Animation presets and Directional Sprites' preset_id retarget onto it, though not onto every model |
joint_naming | No | With rig: the bone naming convention, as in rigModel (default: smpl) |
request_id | No | Client-provided ID to retrieve results later |
Returns: model_url (GLB file), snapshot images from different angles, and rigged
Credits: 4 per model with prop, 15 with hero; rig adds 1, charged only when the model comes back rigged
Processing time: 60-120 seconds with prop; hero is slower
Image for a 3D Model (create3DModelImage)
A character image ready for create3DModel, the first step of Directional Sprites on the web. create3DModel converts the image it is given as it is; this makes one for it first. Pass a prompt, your own image, or both: an image is redrawn as a 3D render, and the prompt then says what to change. A redraw is a new picture each time, so call again for another try.
| Parameter | Required | Description |
|---|---|---|
prompt | One of the two | Without an image: a description of the character (e.g. "a knight in green armour, full body, standing"). With an image: the changes to make (e.g. "add a red cape and a sword"), optional. Up to 1,000 characters |
image | One of the two | URL or base64-encoded image of your own, redrawn as a 3D render |
request_id | No | Client-provided ID to retrieve results later |
Returns: a single result with url, to pass as create3DModel's image
Credits: 0.5 per image
Rig 3D Model (rigModel)
Generate a skeleton and skin weights for an existing 3D model so it can be animated. Non-destructive to the geometry: it returns a new rigged GLB. Rig a model before using animate3DModel.
| Parameter | Required | Description |
|---|---|---|
model | Yes | URL or base64-encoded GLB to rig |
rig_type | No | Skeleton style prior: general (default, works for any asset), humanoid (anime-style characters, densest skeleton), game (classic game-character rig), or the pinned humanoid templates with named joints: humanoid_template (22 joints) and humanoid_template_hands (52 joints, five fingers per hand). The templates only suit two-armed, two-legged characters. Animation presets (animate3DModelPreset) retarget onto any rig type, though not onto every model |
joint_naming | No | Bone naming convention for the identified joints: smpl (default), mixamo (Unity's humanoid auto-mapper), humanik (unprefixed names for Maya/MotionBuilder/FBX), unreal (UE mannequin), godot (SkeletonProfileHumanoid), rigify (Blender) or vroid (VRM). Purely a relabel, the skeleton is identical |
request_id | No | Optional client-provided identifier for this request |
Returns: model_url (rigged GLB, skeleton + skin weights baked in), rigged (true)
Credits: 1 per rig Processing time: 60-120 seconds
Animate 3D Model (animate3DModel)
Generate text-driven skeletal animations for an already-rigged 3D model (rig it first with rigModel). Animation quality is hit-or-miss, so several candidates are returned for you to choose from. Each candidate is a standalone animation-only GLB (skeleton + one clip, no mesh) plus an mp4 preview; pick the best one and fuse it onto your model in a game engine or three.js.
| Parameter | Required | Description |
|---|---|---|
model | Yes | URL or base64-encoded rigged GLB to animate (rig it first with rigModel) |
prompt | Yes | Desired motion (e.g., "walking", "swinging an axe", "waving hello") |
mode | No | Animation representation: rot_trans (default, per-bone rotation + translation, most faithful) or rot_only (rotation + root translation only, for retargeting to other skeletons / engine pipelines that ignore bone translation) |
num_variants | No | Number of candidate animations to generate (1-8, default: 4) |
loop | No | Return to the initial pose: each clip plays forward then mirrors back to the rest pose for a seamless loop (default: true). Best for one-way motions (crouch, punch, wave); reads oddly for cyclic gaits like walking |
augment_prompt | No | Rewrite the prompt into a detailed motion caption behind the scenes (default: true) |
request_id | No | Optional client-provided identifier for this request |
Returns: animations, an array of candidates, each with clip_name, glb_url (animation-only GLB), preview_url (mp4), mode, seed, motion, fit_rmse
Credits: 0.5 per generation (one charge returns all variants; promotional price) Processing time: 60-120 seconds
Animate 3D Model from Preset (animate3DModelPreset)
Apply a curated animation preset to an already-rigged 3D model (retargeting). Unlike animate3DModel, the motion comes from a professionally curated clip library instead of a text prompt, so exactly one clip is returned. Any rig type can take a preset (rig the model first with rigModel, or create3DModel with rig: true), though retargeting does not succeed on every model; when it does not, the job returns an error. Any preset id from listAnimationPresets works.
| Parameter | Required | Description |
|---|---|---|
model | Yes | URL or base64-encoded rigged GLB (any rig type) |
preset_id | Yes | id of a preset from listAnimationPresets |
crop_loop | No | Trim the animation to the span that loops seamlessly. Omit for Auto: cyclic motions (walk, idle) loop, one-shots (jump, cast) keep their full arc |
in_place | No | Remove the animation's net travel so the character moves on the spot, the treadmill clip a game engine expects, with the engine driving locomotion. Omit to follow crop_loop |
request_id | No | Optional client-provided identifier for this request |
Returns: animations, the same envelope as animate3DModel, containing one clip with clip_name, preset_id, glb_url (animation-only GLB, joints named as on your model), preview_url (mp4), seed, motion, fit_rmse
Credits: 0.5 per retarget Processing time: 30-90 seconds
Directional Sprites
Render a 3D model as styled sprites seen from up to 8 directions (where the camera stands around a character facing S). Every direction asked for in one call is rendered together, on the same frame size, scale and floor, so the sprites line up. The usual flow:
- (Optional) A character image:
create3DModelImagefrom a prompt, or your own image redrawn as a 3D render. - A rigged model:
create3DModelwith that image andrig: true(orrigModelfor a model you already have). Any rig type can take an animation preset, though retargeting does not succeed on every model. - (Optional) An animation, at most one: a
preset_idfromlistAnimationPresets, or ananimation_urlmade for this model byanimate3DModelPresetoranimate3DModel. With none, the sprites are a still pose. - (Optional) Accessories:
fitDirectionalAccessoryfor each item (a sword, a shield, a helmet...), adjusted until it looks right, thenattachDirectionalAccessoriesfor one model holding them all. Use itsmodel_urlasmodelfrom here on. listDirectionalSpriteStyles: pick a look.previewDirectionalSprites: check it, free.createDirectionalSpritesfor animated spritesheets, orcreateDirectionalStillsfor still images.
fitDirectionalAccessory
Fit one item GLB to a rigged model, held by one bone: a hand, the head, the back or the hips. The item is first placed automatically for its kind (a sword by its handle, a gun by its pistol grip, a shield on the forearm, a helmet over the head, a backpack on the back), and the hand closes round it. Adjust it relative to that automatic fit and call again until it looks right: each call starts from the automatic fit, so send the full adjustment every time. Nothing is saved. Free and synchronous (not a job): a few seconds with previews, about a second without.
| Parameter | Required | Description |
|---|---|---|
model | Yes | The rigged model (create3DModel with rig: true, or rigModel), URL or base64 GLB, up to 30MB |
item | Yes | The item, any 3D model (create3DModel without rig), URL or base64 GLB, up to 30MB |
name | No | What the item is, in words ("rusty sword"); used to guess kind when it is omitted |
kind | No | blade, gun, staff, bow, shield, helmet, hat, back, ...: decides how it is first held |
point / bone | No | Where it goes: an attach point (the response lists the ones this skeleton has), or a bone by name. Default: where its kind goes |
size | No | % of the automatic fit's size (100 = as fitted) |
move | No | {forward, up, out} in % of the character's height, e.g. {"up": 3} |
turn | No | {forward, up, out} in degrees |
flip | No | Hold it by its other end |
grip | No | Close the hand round it (skeletons with finger bones) |
preview | No | false returns only the fit and its checks |
preview_preset_id | No | The animation preset the previews show |
Returns: the fit as applied (kind, point, bone, size, move, turn, flip, grip), the placement to pass to attachDirectionalAccessories, checks (how far the item sinks into the body, how far its grip is from the palm, how much of the head pokes through a helmet), points (this skeleton's attach points) and, unless preview is false, model_url (the model holding the item, kept 7 days) and previews (4 walking frames each from SW and SE). Previews share previewDirectionalSprites' one-at-a-time slot; when they could not be made, preview_error says why and the fit is still valid.
Credits: Free (30 calls per 5 minutes, 200 an hour, 1,000 a day)
attachDirectionalAccessories
Put up to 8 items on the model, each at the placement fitDirectionalAccessory returned (or, without one, at the automatic fit plus the same kind / point / bone / size / move / turn / flip / grip adjustments). At most one item closes each hand: the first one listed. Free and synchronous.
| Parameter | Required | Description |
|---|---|---|
model | Yes | The rigged model, URL or base64 GLB, up to 30MB. The URL of one of your 3D models also saves the items on it |
items | Yes | Every item the model holds: item (URL or base64 GLB, as sent to the fit), name, and placement or the adjustments above |
save_on_model | No | false only builds the GLB, without saving the items on your model |
Returns: model_url (one GLB of the model holding every item, kept 7 days: pass it as model to previewDirectionalSprites, createDirectionalSprites or createDirectionalStills), saved (whether the items were saved on your model, which replaces its previous items and shows them in the Ludo web app's Directional Sprites) and items
Credits: Free (20 calls per 5 minutes, 300 a day)
listDirectionalSpriteStyles
Free. Returns styles (each with id, label, description, family, pixel, thumbnail_url, version and its settings / advanced_settings: a name, kind of choice, bool or color, options and default), plus the perspectives and directions to choose from.
previewDirectionalSprites
A few frames of the model in a style, from each direction asked for, to check a look before rendering. Synchronous (not a job) and free; nothing is saved to your generations. Returns previews, one per direction: frame_urls (transparent images: 4 frames when animated, 1 for a still model), width, height, num_frames, fps and render_3d (the style and settings as rendered). An account runs one preview at a time: starting another cancels the one still running, which then answers with no body (HTTP 204). Takes the model, animation, camera and style parameters below, and target_frame_size (32-384, default 256).
createDirectionalSprites
| Parameter | Required | Description |
|---|---|---|
model | Yes | URL or base64-encoded GLB (rigged, to animate it) |
animation_url | No | An animation made for this model: the glb_url from animate3DModel or animate3DModelPreset (URL or base64) |
preset_id | No | A preset from listAnimationPresets, retargeted onto the model (any rig type can take one, though retargeting does not succeed on every model, and when it does not the call returns an error) |
crop_loop | No | With preset_id: trim the preset to the span that loops seamlessly |
model_animation | No | The name of an animation the GLB itself carries |
perspective | No | horizon, low, isometric (default), high, top |
directions | No | Up to 8 of S, SW, W, NW, N, NE, E, SE (default: ["SW"]) |
style_id | No | A style from listDirectionalSpriteStyles (default: render_3d) |
style_params | No | The style's settings to change, by name |
style_version | No | Pin a style version, e.g. the one a previous render_3d reports |
target_frame_size | No | Sprite size in pixels, 32-640 (default: 640) |
num_frames | No | Frames per sheet, 4-100 (default: 36) |
loop | No | Sample the animation as a seamless loop; omit to follow the animation |
keep_horizontal_travel / keep_vertical_travel | No | Keep the animation's ground travel (default: off) / its vertical motion (default: on) |
gif / individual_frames | No | Also return each sheet as a GIF / its frames as separate images |
request_id | No | Client-provided ID to retrieve results later |
At most one of animation_url, preset_id and model_animation; with none, each sheet is a single frame.
Returns: sheets, one per direction in the order asked, each with direction, spritesheet_url, video_url, num_frames, num_cols, num_rows, fps, render_3d, and gif_url / individual_frame_urls when asked
Credits: 1 per direction
createDirectionalStills
The model as it is, one large transparent sprite image per direction, ready for animateSprite or editImage. Takes model, perspective, directions, style_id, style_params, style_version and request_id as above.
Returns: images, one per direction, each with direction, url, width, height and render_3d
Credits: 0.5 per direction
Sprite Animation (animateSprite)
Create animated spritesheets from static images. Use this when you can describe the motion in text; use transferMotion to copy an exact motion from a reference video or a named preset, and generatePose first when the source image is not yet in the pose the animation should start from.
| Parameter | Required | Description |
|---|---|---|
initial_image | Yes | URL or base64 of the starting frame |
motion_prompt | Yes | Animation description (e.g., "walking", "idle breathing", "attack slash", "casting a fireball with both hands"). See Writing the motion prompt |
image_type | No | sprite (default), sprite-vfx, ui_asset |
frames | No | 4, 9, 16, 25, 36 (default), 49, 64 |
frame_size | No | 0 (default, max resolution), 32, 64, 96, 128, 192, 256, 384, -1 (AI 1.5× upscale), -9 (match input frame) |
loop | No | Seamless loop (default: true) |
crop | No | Crop frames to fit content (default: true); smaller spritesheets but inconsistent frame sizes across animations |
margin_ratio_horizontal | No | Horizontal padding around the sprite as a ratio 0.0–1.0 (only used when margin_ratio_mode is manual). Useful for animations that extend sideways, e.g. sword slashes or punches |
margin_ratio_vertical | No | Vertical padding around the sprite as a ratio 0.0–1.0 (only used when margin_ratio_mode is manual). Useful for animations that extend up or down, e.g. jumps |
margin_ratio | No | Deprecated - uniform padding on both axes, equivalent to setting both per-axis params to the same value. Cannot be combined with the per-axis params (fails with 400) |
margin_ratio_mode | No | auto (default), manual, none |
augment_prompt | No | Augment the motion prompt behind the scenes (default: true) |
model | No | hydra (default; best motion and prompt adherence, generates audio), griffin-hd (Griffin: highest resolution and best image fidelity), forge (cheapest, for simple body shapes and simple actions), forge-pixel (low-res pixel art). Legacy, avoid for new work: hydra-plus, blitz, eagle, eagle-audio (alias standard→blitz) |
duration | No | Default 3s. Hydra / Hydra+: 3–5s in 0.5 steps; Griffin: 5s only; Forge / Forge Pixel: 1–5s in 0.5 steps. A model that does not offer the requested default falls back to its shortest |
final_image | No | Ending frame for interpolation |
gif | No | Generate an animated GIF (default: false) |
individual_frames | No | Extract individual frame images (default: false) |
spritesheet_with_background | No | Also return the spritesheet with background intact, before background removal (default: false) |
request_id | No | Client-provided ID to retrieve results later |
Returns: spritesheet_url (the sheet), video_url (an mp4 of the animation - pass it to transferMotion as video or to createSpriteAudio as spritesheet_video_url), audio_url (hydra and hydra-plus only: URL of a generated sound effect (mp3), so there is no need to call createSpriteAudio), num_frames, num_cols, num_rows, duration (seconds, to play the sheet at its real speed), and when requested gif_url, individual_frame_urls, spritesheet_with_background_url, individual_frame_with_background_urls
Credits: rate × seconds - Hydra: 3/sec (shortest 3s, so 9 minimum; the default 3s = 9); Forge and Forge Pixel: 1.5/sec, no minimum (3s = 4.5). Griffin: flat 10 per animation. Legacy: Hydra+ 4/sec (shortest 3s, so 12 minimum); Blitz 1.9/sec, Eagle 2.6/sec, Eagle with Audio 3.1/sec, all with a 4-credit minimum. Processing time: 30-90 seconds
Writing the motion prompt
Applies to animateSprite and animateSpriteKeyframes.
- Describe exactly and unambiguously what the character should do. Specific or complex actions are fine; there is no need to simplify them.
- Don't over-describe: too much detail can harm the animation. Name an action the model already knows instead of breaking it into steps ("walking", never "move the left foot forward, then the right foot").
- Don't restate what the image or keyframes already show (the character, its equipment, the art style, background, lighting, camera). Leave frame count and timing to
framesandduration. - Negative phrasing ("no background", "do not move the camera", "without a weapon") works only on
hydraandhydra-plus. Onforge,forge-pixeland the legacy models it backfires: naming something you don't want makes it more likely to appear. On those models state only what should happen.
Keyframe Animation (animateSpriteKeyframes)
Animate a sprite through up to three fixed keyframes (initial_image, middle_image, final_image), producing a spritesheet that interpolates through the provided frames in order. Runs on hydra (default), griffin-hd, forge or forge-pixel (and the legacy hydra-plus) - the models that support a middle keyframe. The motion prompt is optional here: when omitted, the motion is derived purely from the keyframes. For just a start and end frame, animateSprite with final_image does the same job.
Documentation truncated — see the full README on GitHub.
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Rea
Freeby Morluto · Developer Tools
Reverse engineer anything from your terminal or agent with one CLI and MCP server.
Paperclip
Freeby Paperclipai · Developer Tools
Trending hip-hop artist momentum scores across four cultural dimensions.
Fetch
Freeby Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
MCP Marketplace
Freeby mcp-marketplace · Developer Tools
Search and install MCP servers from inside your AI client.
