Koskamo

Retro Diffusion MCP

An official MCP server provided by Retro Diffusion that allows AI agents to generate authentic pixel art, including sprites, animations, and tilesets, as well as Low-Poly 3D models. It supports listing available styles, estimating generation costs, and executing image generation tasks directly from MCP-compatible clients.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Retro Diffusion MCP logo, by Retro DiffusionVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Retro Diffusion
MCP endpoint (Streamable HTTP)
https://mcp.retrodiffusion.ai/mcp
Vendor documentation

What its tools do

33 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

33 of 33 have a description · 33 of 33 declare behavior hints · 31 of 31 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to retrodiffusion.ai ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Generate pixel art sprites and animations from text prompts
  • Create Low-Poly 3D models with pixel-art textures
  • List available pixel art styles and cost estimates
  • Produce tilesets and game assets for development

Source and maintenance

Vendor evidenceRegistry 1.1.0
Maintenance checked

Protocol and capabilities

Server
retrodiffusion-api 2.14.7
MCP protocol negotiated in check
2025-11-25
Tools
33 advertised
Resources
0 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tasks": {
    "list": {},
    "cancel": {},
    "requests": {
      "tools": {
        "call": {}
      },
      "prompts": {
        "get": {}
      },
      "resources": {
        "read": {}
      }
    }
  },
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "subscribe": false,
    "listChanged": true
  },
  "experimental": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Authenticate first by calling authenticate(api_key), or pass rd_api_key directly on each tool call. For the highest quality stills prefer RD Pro styles (rd_pro__*); they support per-inference reference_images (up to 9) for character/style consistency, and most (rd_pro__default, painterly, fantasy, horror, scifi, simple, isometric, topdown, platformer) go as small as 12x12 px for tiny sprites and icons, and rd_pro__pixelate converts an input_image down to 16x16 px — check list_available_styles for each style's exact limits. To animate an existing sprite prefer the advanced animation styles (rd_advanced_animation__walking/idle/jump/crouch/attack/destroy/custom_action/subtle_motion) started via start_inference_job and polled with get_inference_job — animations are long-running. rd_advanced_animation__rotate turns one sprite into its 8 directional views instead of motion (prompt optional, frames_duration ignored; GIF by default, return_spritesheet=true for the 3x3 direction sheet). Use fix_pixel_art on enlarged, softened, or AI-rendered pixel art to recover its native pixel grid. Post-process results with run_edit_tool: background_remover, color_style_transfer are $0.01; color_reducer, palette_converter, pixel_correction, k_centroid_downscale, rotate are $0.001 per run (per frame for animations); image_edit, inpainting, outpainting, seam_tiling are premium. fix_pixel_art costs $0.002 (standard) or $0.005 (neural) per call. Before create_inference, use list_available_styles or get_style_usage(prompt_style) to confirm whether you should send input_image, per-inference reference_images, or style_reference_images. create_inference returns hosted output_urls and a request_id; if delivery is pending, call get_inference_result(request_id) and never repeat the paid generation automatically. estimate_inference_cost and estimate_edit_tool_cost are always free — check prices before spending. For 3D, use the Low-Poly tools: start_lowpoly_generate builds a low-poly model with pixel-art textures (sizes 16-256 or auto; $0.25-$3.00), then poll get_lowpoly_job; start_lowpoly_revise changes it (new version), start_lowpoly_animate adds motion (the first animation rigs it for free), start_lowpoly_split breaks a scene into separate models (one per object, animations included), and export_lowpoly_model returns .glb/.bbmodel/Minecraft/OBJ/GIF download URLs. 3D jobs take minutes, so never restart one that is still running. On a plan, 2 jobs run at once on plan usage; more use balance or wait. Check `billing.source` in results. When a result starts with a notice (from its warnings), tell the user that notice. get_balance shows balance, plan usage left (%) and API job slots in use.

Tools

33 advertised

authenticate — Authenticate
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Authenticate this MCP session with a RetroDiffusion public API key.

authenticate input schema
{
  "type": "object",
  "required": [
    "api_key"
  ],
  "properties": {
    "api_key": {
      "type": "string",
      "description": "RetroDiffusion API key (rdpk-...), created free at https://retrodiffusion.ai/app/devtools."
    }
  }
}
authenticate output schema
{
  "type": "object",
  "additionalProperties": true
}
authenticate annotations
{
  "title": "Authenticate",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
logout — Log Out
Advertised by the server during the last successful anonymous check.

Clear the authenticated RetroDiffusion API key for this MCP session.

logout input schema
{
  "type": "object",
  "properties": {}
}
logout output schema
{
  "type": "object",
  "additionalProperties": true
}
logout annotations
{
  "title": "Log Out",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_user_style — Create Custom Style
Advertised by the server during the last successful anonymous check.
Open-world

Create a user style from the public RD Pro template using /v2/styles. Use `style_reference_images` and `style_reference_caption` for style-level references. These are baked into the custom style and are not the same as per-inference `reference_images`.

create_user_style input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Display name for the custom style."
    },
    "min_width": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Force a fixed width (96-256); must be provided together with min_height."
    },
    "min_height": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Force a fixed height (96-256); must be provided together with min_width."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "style_icon": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Icon name for the style (e.g. 'sparkles')."
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Short description of the custom style."
    },
    "force_palette": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Always apply palette constraining for this style."
    },
    "force_bg_removal": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Always remove backgrounds for this style."
    },
    "llm_instructions": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Instructions for the prompt-expansion LLM when this style is used."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Alias for style_reference_images on this tool; prefer style_reference_images and never provide both."
    },
    "reference_caption": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Alias for style_reference_caption on this tool; prefer style_reference_caption and never provide both."
    },
    "apply_prompt_fixer": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Let the API tidy prompts automatically for this style (default true)."
    },
    "user_prompt_template": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Prompt template for the style; must contain the {prompt} token."
    },
    "style_reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Style-level reference image(s), base64, baked into the custom style (max 1 via the public API)."
    },
    "style_reference_caption": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Caption describing the style reference image(s)."
    },
    "expanded_llm_instructions": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Extended instructions for the prompt-expansion LLM."
    }
  }
}
create_user_style output schema
{
  "type": "object",
  "additionalProperties": true
}
create_user_style annotations
{
  "title": "Create Custom Style",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
update_user_style — Update Custom Style
Advertised by the server during the last successful anonymous check.
Open-world

Update a public RD Pro user style using /v2/styles/{style_id}. Use `style_reference_images` and `style_reference_caption` for style-level references. These are baked into the custom style and are not the same as per-inference `reference_images`.

update_user_style input schema
{
  "type": "object",
  "required": [
    "style_id"
  ],
  "properties": {
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "New display name for the custom style."
    },
    "style_id": {
      "type": "string",
      "description": "Style id — the internal id or the prompt_style/public id (e.g. user__mystyle_ab12)."
    },
    "min_width": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Force a fixed width (96-256); must be provided together with min_height."
    },
    "min_height": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Force a fixed height (96-256); must be provided together with min_width."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "style_icon": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Icon name for the style (e.g. 'sparkles')."
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Short description of the custom style."
    },
    "force_palette": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Always apply palette constraining for this style."
    },
    "force_bg_removal": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Always remove backgrounds for this style."
    },
    "llm_instructions": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Instructions for the prompt-expansion LLM when this style is used."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Alias for style_reference_images on this tool; prefer style_reference_images and never provide both."
    },
    "reference_caption": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Alias for style_reference_caption on this tool; prefer style_reference_caption and never provide both."
    },
    "apply_prompt_fixer": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Let the API tidy prompts automatically for this style (default true)."
    },
    "user_prompt_template": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Prompt template for the style; must contain the {prompt} token."
    },
    "style_reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Style-level reference image(s), base64, baked into the custom style (max 1 via the public API)."
    },
    "reset_forced_dimensions": {
      "type": "boolean",
      "default": false,
      "description": "Clear previously forced dimensions; do not combine with min_width/min_height."
    },
    "style_reference_caption": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Caption describing the style reference image(s)."
    },
    "expanded_llm_instructions": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Extended instructions for the prompt-expansion LLM."
    }
  }
}
update_user_style output schema
{
  "type": "object",
  "additionalProperties": true
}
update_user_style annotations
{
  "title": "Update Custom Style",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
delete_user_style — Delete Custom Style
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a user style using /v2/styles/{style_id}. style_id can be either internal id or prompt_style/public_id.

delete_user_style input schema
{
  "type": "object",
  "required": [
    "style_id"
  ],
  "properties": {
    "style_id": {
      "type": "string",
      "description": "Style id — the internal id or the prompt_style/public id (e.g. user__mystyle_ab12)."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
delete_user_style output schema
{
  "type": "object",
  "additionalProperties": true
}
delete_user_style annotations
{
  "title": "Delete Custom Style",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
list_available_styles — List Styles
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List publicly available styles from /v2/styles/selector. Use this to discover valid prompt_style values plus style metadata such as require_input_image and supports_reference_images.

list_available_styles input schema
{
  "type": "object",
  "properties": {
    "tab": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter styles by tab: tab:image, tab:animation, tab:advanced-animation, or tab:tileset."
    },
    "model": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter styles by model: rd_fast, rd_plus, rd_pro, or rd_mini."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
list_available_styles output schema
{
  "type": "object",
  "additionalProperties": true
}
list_available_styles annotations
{
  "title": "List Styles",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_available_models — List Models
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Return unique public model identifiers available in /v2/styles/selector.

list_available_models input schema
{
  "type": "object",
  "properties": {
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
list_available_models output schema
{
  "type": "object",
  "additionalProperties": true
}
list_available_models annotations
{
  "title": "List Models",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_style_usage — Get Style Usage
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Explain how to use a public prompt_style from the RetroDiffusion API. Use this before create_inference if you are unsure whether a style expects `input_image`, supports per-inference `reference_images`, or whether you meant style-level `style_reference_images`.

get_style_usage input schema
{
  "type": "object",
  "required": [
    "prompt_style"
  ],
  "properties": {
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "prompt_style": {
      "type": "string",
      "description": "Style id from list_available_styles (e.g. 'rd_fast__default', 'rd_pro__isometric', or a custom 'user__...' style)."
    }
  }
}
get_style_usage output schema
{
  "type": "object",
  "additionalProperties": true
}
get_style_usage annotations
{
  "title": "Get Style Usage",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_balance — Get Balance
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get your balance, plan usage left (%) and API job slots in use. Reads /v2/inferences/credits plus the account usage (GET /usage). On a plan, 2 API jobs run at once on plan usage; usage.api_job_slots shows how many are busy.

get_balance input schema
{
  "type": "object",
  "properties": {
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
get_balance output schema
{
  "type": "object",
  "additionalProperties": true
}
get_balance annotations
{
  "title": "Get Balance",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_inference_cost — Estimate Cost (Free)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Estimate generation cost using the public /v2/inferences endpoint with check_cost=true. Use `input_image` for the main source image, `reference_images` for extra per-inference guidance, and `style_reference_images` only on create_user_style/update_user_style.

estimate_inference_cost input schema
{
  "type": "object",
  "required": [
    "prompt",
    "prompt_style",
    "width",
    "height"
  ],
  "properties": {
    "width": {
      "type": "integer",
      "description": "Output width in pixels. Each style enforces its own limits; check list_available_styles or get_style_usage. Genre-native sizes per item: Minecraft 16; items/icons/props 32-64; character sprites 16-48 retro or 96-128 showcase; tiles 16-32; portraits 96-128; full scenes 256 (RD Pro's max; 16:9 scenes = 256x144 — pixel art integer-upscales losslessly)."
    },
    "height": {
      "type": "integer",
      "description": "Output height in pixels. Each style enforces its own limits; check list_available_styles or get_style_usage."
    },
    "prompt": {
      "type": "string",
      "description": "Describe the SUBJECT only, richly and concretely ('a squat round flask of glowing crimson liquid, cork stopper, bright highlight on the upper-left rim' beats 'a potion'). Never write 'pixel art' — the selected style handles all rendering. For standalone assets, state a flat background color that contrasts the subject (default 'on a plain white background') and pair with remove_bg=true; never write 'transparent background' (that is remove_bg's job), and never leave the background unstated (it drifts to drab dark gray). Scenes instead describe their real environment. For rd_advanced_animation__rotate the prompt is only an optional hint describing the uploaded subject — a few words or an empty string."
    },
    "strength": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How strongly to change input_image, 0-1 (default 0.75). Lower values keep more of the original."
    },
    "num_images": {
      "type": "integer",
      "default": 1,
      "description": "How many images to generate in one batch; a batch produces varied takes of one prompt (the right way to get N distinct items as individually usable images — never pack N items into a single sheet/grid image unless a sheet IS the deliverable). Style-specific maximums apply."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 PNG used as the main source image for edits, variations, tilesets, animations, or styles that require a starting frame. Raw base64 or a data URL. Send the NATIVE-resolution image: an upscaled display copy (e.g. a 96px sprite exported at 4x = 384px) exceeds style ranges and gets rejected — downscale to the true pixel grid first. For advanced animations the frame's dimensions must equal width/height, and sprites whose opaque pixels touch the canvas edge animate badly (pad onto a larger transparent canvas first, e.g. 48x48 content onto 64x64)."
    },
    "extra_prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Secondary prompt for styles that use one (e.g. the transition texture in advanced tilesets)."
    },
    "prompt_style": {
      "type": "string",
      "description": "Style id from list_available_styles (e.g. 'rd_fast__default', 'rd_pro__isometric', or a custom 'user__...' style)."
    },
    "input_palette": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "frames_duration": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Animation frame count for animation styles: 4, 6, 8, 10, 12, or 16. Pick deliberately: 8 is the sweet spot for loops (walking, idle), 6 for a snappy single action, 10-12 for flowing ambient motion. Ignored by rd_advanced_animation__rotate (always 8 views)."
    },
    "timeout_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Read-timeout override in seconds for this call; increase for animations or large batches."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Extra per-inference guidance images (base64), only for styles where supports_reference_images is true. Not for defining custom styles."
    },
    "extra_input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Second base64 input image for styles that use one (e.g. the second texture in rd_tile__tileset_advanced)."
    },
    "return_pre_palette": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Also return the render from before palette constraints were applied."
    },
    "return_spritesheet": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "For animation styles: return a PNG sprite sheet instead of a GIF (for rd_advanced_animation__rotate, the 3x3 direction sheet whose views face the center)."
    },
    "return_non_bg_removed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Also return the render from before background removal was applied."
    },
    "upscale_output_factor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Integer upscale factor for the output image; 1 returns the native pixel size."
    },
    "bypass_prompt_expansion": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Skip the automatic LLM prompt enrichment and use the prompt verbatim."
    },
    "include_downloadable_data": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Include extra structured assets when available (e.g. tileset atlas JSON, animation frame data)."
    }
  }
}
estimate_inference_cost output schema
{
  "type": "object",
  "additionalProperties": true
}
estimate_inference_cost annotations
{
  "title": "Estimate Cost (Free)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
create_inference — Generate Pixel Art
Advertised by the server during the last successful anonymous check.
Open-world

Generate images using the public /v2/inferences endpoint. For the highest quality prefer RD Pro styles (rd_pro__*); they support reference_images for character/style consistency, and most go as small as 12x12 px (check list_available_styles for each style's limits) — a small target size is never a reason to switch to a cheaper model family. Style ids are opaque strings with no uniform format (some RD Fast styles appear as "default:rd_flux"); take them verbatim from the catalog and never infer capabilities from an id's prefix. For animation styles prefer start_inference_job + get_inference_job instead — animations are long-running, and a failed animation is worth one retry with identical parameters (failures auto-refund). Field-tested workflow rules: N distinct items = N individually usable images (separate calls or num_images=N), never one sheet/grid image unless a sheet IS the deliverable. Variants of ONE image (seasons, day/night, palettes) = generate the base once, then derive each variant with the image_edit tool ("... keep the exact same composition") — independent generations of the "same" scene come out unrelated. Converting an existing image INTO pixel art is rd_pro__pixelate with input_image (16-256 px output, batch<=16); reference_images-based generation re-imagines rather than converts. To animate an image you already have, use rd_advanced_animation__* with input_image (fixed-format rd_animation__* styles generate their own subject from the prompt instead). To get the other directional views of a sprite you already have, use rd_advanced_animation__rotate with input_image (same 8-direction layout as rd_animation__8_dir_rotation). Use `input_image` for the main source image, `reference_images` for extra per-inference guidance, and `style_reference_images` only on create_user_style/update_user_style. The response excludes raw base64 image payloads to keep MCP outputs compact.

create_inference input schema
{
  "type": "object",
  "required": [
    "prompt",
    "prompt_style",
    "width",
    "height"
  ],
  "properties": {
    "seed": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Seed for reproducible results; reuse the same seed to iterate on one composition."
    },
    "width": {
      "type": "integer",
      "description": "Output width in pixels. Each style enforces its own limits; check list_available_styles or get_style_usage. Genre-native sizes per item: Minecraft 16; items/icons/props 32-64; character sprites 16-48 retro or 96-128 showcase; tiles 16-32; portraits 96-128; full scenes 256 (RD Pro's max; 16:9 scenes = 256x144 — pixel art integer-upscales losslessly)."
    },
    "height": {
      "type": "integer",
      "description": "Output height in pixels. Each style enforces its own limits; check list_available_styles or get_style_usage."
    },
    "prompt": {
      "type": "string",
      "description": "Describe the SUBJECT only, richly and concretely ('a squat round flask of glowing crimson liquid, cork stopper, bright highlight on the upper-left rim' beats 'a potion'). Never write 'pixel art' — the selected style handles all rendering. For standalone assets, state a flat background color that contrasts the subject (default 'on a plain white background') and pair with remove_bg=true; never write 'transparent background' (that is remove_bg's job), and never leave the background unstated (it drifts to drab dark gray). Scenes instead describe their real environment. For rd_advanced_animation__rotate the prompt is only an optional hint describing the uploaded subject — a few words or an empty string."
    },
    "tile_x": {
      "type": "boolean",
      "default": false,
      "description": "Make the result tile seamlessly on the horizontal axis."
    },
    "tile_y": {
      "type": "boolean",
      "default": false,
      "description": "Make the result tile seamlessly on the vertical axis."
    },
    "strength": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How strongly to change input_image, 0-1 (default 0.75). Lower values keep more of the original."
    },
    "remove_bg": {
      "type": "boolean",
      "default": false,
      "description": "Remove the background for transparent output. Use true for standalone assets and pair it with a stated contrasting background in the prompt ('on a plain white background') — removal works best on flat contrasting backdrops. Animations inherit the start frame's transparency automatically."
    },
    "num_images": {
      "type": "integer",
      "default": 1,
      "description": "How many images to generate in one batch; a batch produces varied takes of one prompt (the right way to get N distinct items as individually usable images — never pack N items into a single sheet/grid image unless a sheet IS the deliverable). Style-specific maximums apply."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 PNG used as the main source image for edits, variations, tilesets, animations, or styles that require a starting frame. Raw base64 or a data URL. Send the NATIVE-resolution image: an upscaled display copy (e.g. a 96px sprite exported at 4x = 384px) exceeds style ranges and gets rejected — downscale to the true pixel grid first. For advanced animations the frame's dimensions must equal width/height, and sprites whose opaque pixels touch the canvas edge animate badly (pad onto a larger transparent canvas first, e.g. 48x48 content onto 64x64)."
    },
    "extra_prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Secondary prompt for styles that use one (e.g. the transition texture in advanced tilesets)."
    },
    "prompt_style": {
      "type": "string",
      "description": "Style id from list_available_styles (e.g. 'rd_fast__default', 'rd_pro__isometric', or a custom 'user__...' style)."
    },
    "input_palette": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "upload_outputs": {
      "type": "boolean",
      "default": true,
      "description": "Host outputs and return URLs in output_urls (recommended for MCP clients) instead of only base64 payloads."
    },
    "frames_duration": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Animation frame count for animation styles: 4, 6, 8, 10, 12, or 16. Pick deliberately: 8 is the sweet spot for loops (walking, idle), 6 for a snappy single action, 10-12 for flowing ambient motion. Ignored by rd_advanced_animation__rotate (always 8 views)."
    },
    "timeout_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Read-timeout override in seconds for this call; increase for animations or large batches."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Extra per-inference guidance images (base64), only for styles where supports_reference_images is true. Not for defining custom styles."
    },
    "extra_input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Second base64 input image for styles that use one (e.g. the second texture in rd_tile__tileset_advanced)."
    },
    "return_pre_palette": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Also return the render from before palette constraints were applied."
    },
    "return_spritesheet": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "For animation styles: return a PNG sprite sheet instead of a GIF (for rd_advanced_animation__rotate, the 3x3 direction sheet whose views face the center)."
    },
    "return_non_bg_removed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Also return the render from before background removal was applied."
    },
    "upscale_output_factor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Integer upscale factor for the output image; 1 returns the native pixel size."
    },
    "bypass_prompt_expansion": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Skip the automatic LLM prompt enrichment and use the prompt verbatim."
    },
    "include_downloadable_data": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Include extra structured assets when available (e.g. tileset atlas JSON, animation frame data)."
    }
  }
}
create_inference output schema
{
  "type": "object",
  "additionalProperties": true
}
create_inference annotations
{
  "title": "Generate Pixel Art",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
list_edit_tools — List Edit Tools
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List the enabled canvas edit tools from /v2/edit/tools with their fields, costs, and limits. Edit tools are the recommended way to post-process generated pixel art: background removal, palette conversion, color reduction, pixel correction, rotation, inpainting, outpainting, seam tiling, and prompt-driven edits.

list_edit_tools input schema
{
  "type": "object",
  "properties": {
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
list_edit_tools output schema
{
  "type": "object",
  "additionalProperties": true
}
list_edit_tools annotations
{
  "title": "List Edit Tools",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
fix_pixel_art — Fix Pixel Art
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Recover the native pixel grid from enlarged, softened, AI-rendered, or compressed pixel art. Standard uses the native Rust detector. Neural uses the neural reconstruction engine and accepts optional target width and height values. This repairs existing art—it does not generate a new image. Standard costs $0.002 per call and neural $0.005, charged before running and refunded automatically if the call fails. Both engines share a limit of 10 requests per minute per API token. Provide exactly one source as base64 input_image or a public HTTPS image_url. URL input avoids the ALB request-body limit. Decoded images may contain up to 16 megapixels. Successful response JSON is limited to 850,000 bytes for AWS ALB compatibility.

fix_pixel_art input schema
{
  "type": "object",
  "properties": {
    "width": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional neural target dimension in pixels. Accepted only with engine='neural'."
    },
    "engine": {
      "enum": [
        "standard",
        "neural"
      ],
      "type": "string",
      "default": "standard",
      "description": "Fixer engine. Standard uses the native Rust detector; neural uses the neural reconstruction engine."
    },
    "height": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional neural target dimension in pixels. Accepted only with engine='neural'."
    },
    "image_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Public HTTPS PNG or JPEG URL to reconstruct. Provide this or input_image, not both. URL downloads may contain up to 20 MB and bypass the API request-body limit."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 PNG or JPEG to reconstruct at its native pixel grid. Raw base64 or a data URL; provide this or image_url, not both. Decoded input may contain up to 16 megapixels, and complete base64 request JSON must stay within 900,000 bytes."
    },
    "timeout_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Read-timeout override in seconds for this call; increase for animations or large batches."
    }
  }
}
fix_pixel_art output schema
{
  "type": "object",
  "additionalProperties": {
    "type": "array",
    "items": {
      "type": "string"
    }
  }
}
fix_pixel_art annotations
{
  "title": "Fix Pixel Art",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
run_edit_tool — Run Edit Tool
Advertised by the server during the last successful anonymous check.
Open-world

Run a canvas edit tool on an image via /v2/edit/tools/{tool_id}. $0.001 tools (per frame for animated inputs): color_reducer, palette_converter, pixel_correction, k_centroid_downscale, rotate. $0.01 tools: background_remover, color_style_transfer. Premium ($0.18): image_edit, inpainting, outpainting, seam_tiling. Use estimate_edit_tool_cost first for anything that charges — estimation is free. The edited image is returned in base64_images.

run_edit_tool input schema
{
  "type": "object",
  "required": [
    "tool_id",
    "input_image"
  ],
  "properties": {
    "seed": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Seed for reproducible results; reuse the same seed to iterate on one composition."
    },
    "width": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "k_centroid_downscale: target width in pixels (required for that tool)."
    },
    "height": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "k_centroid_downscale: target height in pixels (required for that tool)."
    },
    "prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "What to generate or change (required by image_edit and inpainting; optional for outpainting)."
    },
    "tile_x": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: repair the horizontal seam (tool default applies when omitted)."
    },
    "tile_y": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: repair the vertical seam (tool default applies when omitted)."
    },
    "tool_id": {
      "type": "string",
      "description": "Edit tool id. One of: image_edit, inpainting, outpainting, seam_tiling, background_remover, color_style_transfer, color_reducer, palette_converter, pixel_correction, k_centroid_downscale, rotate. Use list_edit_tools for authoritative fields, costs, and limits."
    },
    "expand_top": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the top edge."
    },
    "mask_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 mask for inpainting: white pixels are regenerated, black pixels are kept."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "seam_width": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: width in pixels of the seam band to repair."
    },
    "color_count": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer: target number of colors."
    },
    "dither_mode": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer/palette_converter: dithering mode."
    },
    "expand_left": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the left edge."
    },
    "input_image": {
      "type": "string",
      "description": "Base64 PNG of the image to edit (raw base64 or a data URL). Required by every edit tool."
    },
    "expand_right": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the right edge."
    },
    "soft_inpaint": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inpainting/outpainting: blend edits softly with the surrounding pixels."
    },
    "expand_bottom": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the bottom edge."
    },
    "input_palette": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "dither_strength": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer/palette_converter: dithering strength, 0-10 (0 disables, default 5)."
    },
    "timeout_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Read-timeout override in seconds for this call; increase for animations or large batches."
    },
    "rotation_degrees": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "rotate: rotation angle in degrees (clean-edge pixel rotation)."
    },
    "extra_input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Second base64 input image for styles that use one (e.g. the second texture in rd_tile__tileset_advanced)."
    },
    "force_solid_pixels": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "background_remover: force fully solid or fully transparent pixels (tool default applies when omitted)."
    },
    "repair_window_size": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: size of the repair window."
    },
    "transparency_threshold": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "background_remover: alpha threshold for treating pixels as transparent."
    }
  }
}
run_edit_tool output schema
{
  "type": "object",
  "additionalProperties": true
}
run_edit_tool annotations
{
  "title": "Run Edit Tool",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
estimate_edit_tool_cost — Estimate Edit Cost (Free)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Validate an edit-tool request and estimate its cost and duration without running it. Always free.

estimate_edit_tool_cost input schema
{
  "type": "object",
  "required": [
    "tool_id",
    "input_image"
  ],
  "properties": {
    "width": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "k_centroid_downscale: target width in pixels (required for that tool)."
    },
    "height": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "k_centroid_downscale: target height in pixels (required for that tool)."
    },
    "prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "What to generate or change (required by image_edit and inpainting; optional for outpainting)."
    },
    "tile_x": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: repair the horizontal seam (tool default applies when omitted)."
    },
    "tile_y": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: repair the vertical seam (tool default applies when omitted)."
    },
    "tool_id": {
      "type": "string",
      "description": "Edit tool id. One of: image_edit, inpainting, outpainting, seam_tiling, background_remover, color_style_transfer, color_reducer, palette_converter, pixel_correction, k_centroid_downscale, rotate. Use list_edit_tools for authoritative fields, costs, and limits."
    },
    "expand_top": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the top edge."
    },
    "mask_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 mask for inpainting: white pixels are regenerated, black pixels are kept."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "seam_width": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: width in pixels of the seam band to repair."
    },
    "color_count": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer: target number of colors."
    },
    "dither_mode": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer/palette_converter: dithering mode."
    },
    "expand_left": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the left edge."
    },
    "input_image": {
      "type": "string",
      "description": "Base64 PNG of the image to edit (raw base64 or a data URL). Required by every edit tool."
    },
    "expand_right": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the right edge."
    },
    "soft_inpaint": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inpainting/outpainting: blend edits softly with the surrounding pixels."
    },
    "expand_bottom": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Outpainting: pixels to add on the bottom edge."
    },
    "input_palette": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "dither_strength": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer/palette_converter: dithering strength, 0-10 (0 disables, default 5)."
    },
    "timeout_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Read-timeout override in seconds for this call; increase for animations or large batches."
    },
    "rotation_degrees": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "rotate: rotation angle in degrees (clean-edge pixel rotation)."
    },
    "extra_input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Second base64 input image for styles that use one (e.g. the second texture in rd_tile__tileset_advanced)."
    },
    "force_solid_pixels": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "background_remover: force fully solid or fully transparent pixels (tool default applies when omitted)."
    },
    "repair_window_size": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "seam_tiling: size of the repair window."
    },
    "transparency_threshold": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "background_remover: alpha threshold for treating pixels as transparent."
    }
  }
}
estimate_edit_tool_cost output schema
{
  "type": "object",
  "additionalProperties": true
}
estimate_edit_tool_cost annotations
{
  "title": "Estimate Edit Cost (Free)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_inference_result — Get Generated Outputs
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Retrieve retained outputs for a synchronous generation. Use the request_id returned by create_inference to recover or refresh signed output URLs. This lookup is read-only; never repeat a paid create_inference call just because delivery URLs are temporarily missing.

get_inference_result input schema
{
  "type": "object",
  "required": [
    "request_id"
  ],
  "properties": {
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "request_id": {
      "type": "string",
      "description": "Inference request id returned by create_inference."
    }
  }
}
get_inference_result output schema
{
  "type": "object",
  "additionalProperties": true
}
get_inference_result annotations
{
  "title": "Get Generated Outputs",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
start_inference_job — Start Async Generation
Advertised by the server during the last successful anonymous check.
Open-world

Start a generation as an async job (POST /v2/inferences with async=true) and return a task_id. Recommended for advanced animations (rd_advanced_animation__*), other animation styles, and batches — they run for tens of seconds and can outlive a synchronous MCP call. Poll the returned task_id with get_inference_job roughly every 2-5 seconds.

start_inference_job input schema
{
  "type": "object",
  "required": [
    "prompt",
    "prompt_style",
    "width",
    "height"
  ],
  "properties": {
    "seed": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Seed for reproducible results; reuse the same seed to iterate on one composition."
    },
    "width": {
      "type": "integer",
      "description": "Output width in pixels. Each style enforces its own limits; check list_available_styles or get_style_usage. Genre-native sizes per item: Minecraft 16; items/icons/props 32-64; character sprites 16-48 retro or 96-128 showcase; tiles 16-32; portraits 96-128; full scenes 256 (RD Pro's max; 16:9 scenes = 256x144 — pixel art integer-upscales losslessly)."
    },
    "height": {
      "type": "integer",
      "description": "Output height in pixels. Each style enforces its own limits; check list_available_styles or get_style_usage."
    },
    "prompt": {
      "type": "string",
      "description": "Describe the SUBJECT only, richly and concretely ('a squat round flask of glowing crimson liquid, cork stopper, bright highlight on the upper-left rim' beats 'a potion'). Never write 'pixel art' — the selected style handles all rendering. For standalone assets, state a flat background color that contrasts the subject (default 'on a plain white background') and pair with remove_bg=true; never write 'transparent background' (that is remove_bg's job), and never leave the background unstated (it drifts to drab dark gray). Scenes instead describe their real environment. For rd_advanced_animation__rotate the prompt is only an optional hint describing the uploaded subject — a few words or an empty string."
    },
    "tile_x": {
      "type": "boolean",
      "default": false,
      "description": "Make the result tile seamlessly on the horizontal axis."
    },
    "tile_y": {
      "type": "boolean",
      "default": false,
      "description": "Make the result tile seamlessly on the vertical axis."
    },
    "strength": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How strongly to change input_image, 0-1 (default 0.75). Lower values keep more of the original."
    },
    "remove_bg": {
      "type": "boolean",
      "default": false,
      "description": "Remove the background for transparent output. Use true for standalone assets and pair it with a stated contrasting background in the prompt ('on a plain white background') — removal works best on flat contrasting backdrops. Animations inherit the start frame's transparency automatically."
    },
    "num_images": {
      "type": "integer",
      "default": 1,
      "description": "How many images to generate in one batch; a batch produces varied takes of one prompt (the right way to get N distinct items as individually usable images — never pack N items into a single sheet/grid image unless a sheet IS the deliverable). Style-specific maximums apply."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 PNG used as the main source image for edits, variations, tilesets, animations, or styles that require a starting frame. Raw base64 or a data URL. Send the NATIVE-resolution image: an upscaled display copy (e.g. a 96px sprite exported at 4x = 384px) exceeds style ranges and gets rejected — downscale to the true pixel grid first. For advanced animations the frame's dimensions must equal width/height, and sprites whose opaque pixels touch the canvas edge animate badly (pad onto a larger transparent canvas first, e.g. 48x48 content onto 64x64)."
    },
    "extra_prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Secondary prompt for styles that use one (e.g. the transition texture in advanced tilesets)."
    },
    "prompt_style": {
      "type": "string",
      "description": "Style id from list_available_styles (e.g. 'rd_fast__default', 'rd_pro__isometric', or a custom 'user__...' style)."
    },
    "input_palette": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "upload_outputs": {
      "type": "boolean",
      "default": true,
      "description": "Host outputs and return URLs in output_urls (recommended for MCP clients) instead of only base64 payloads."
    },
    "frames_duration": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Animation frame count for animation styles: 4, 6, 8, 10, 12, or 16. Pick deliberately: 8 is the sweet spot for loops (walking, idle), 6 for a snappy single action, 10-12 for flowing ambient motion. Ignored by rd_advanced_animation__rotate (always 8 views)."
    },
    "timeout_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Read-timeout override in seconds for this call; increase for animations or large batches."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Extra per-inference guidance images (base64), only for styles where supports_reference_images is true. Not for defining custom styles."
    },
    "extra_input_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Second base64 input image for styles that use one (e.g. the second texture in rd_tile__tileset_advanced)."
    },
    "return_pre_palette": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Also return the render from before palette constraints were applied."
    },
    "return_spritesheet": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "For animation styles: return a PNG sprite sheet instead of a GIF (for rd_advanced_animation__rotate, the 3x3 direction sheet whose views face the center)."
    },
    "return_non_bg_removed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Also return the render from before background removal was applied."
    },
    "upscale_output_factor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Integer upscale factor for the output image; 1 returns the native pixel size."
    },
    "bypass_prompt_expansion": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Skip the automatic LLM prompt enrichment and use the prompt verbatim."
    },
    "include_downloadable_data": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Include extra structured assets when available (e.g. tileset atlas JSON, animation frame data)."
    }
  }
}
start_inference_job output schema
{
  "type": "object",
  "additionalProperties": true
}
start_inference_job annotations
{
  "title": "Start Async Generation",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_inference_job — Check Async Job
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Check the status of an async generation started with start_inference_job. Statuses: pending, running, succeeded, failed. On success the result carries hosted output_urls (raw base64 payloads are excluded to keep MCP outputs compact).

get_inference_job input schema
{
  "type": "object",
  "required": [
    "task_id"
  ],
  "properties": {
    "task_id": {
      "type": "string",
      "description": "Async job id returned by start_inference_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
get_inference_job output schema
{
  "type": "object",
  "additionalProperties": true
}
get_inference_job annotations
{
  "title": "Check Async Job",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_inference_jobs — List Async Jobs
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List your most recent async jobs, newest first (GET /v2/inferences/tasks). Recovery path: if a submission response was lost (timeout, disconnect) before the task_id arrived, the job was still accepted — find it here instead of re-submitting and being charged twice. Then poll it with get_inference_job.

list_inference_jobs input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum number of recent jobs to return (1-100, default 20)."
    },
    "status": {
      "anyOf": [
        {
          "enum": [
            "pending",
            "running",
            "succeeded",
            "failed"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional: only return jobs with this status."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
list_inference_jobs output schema
{
  "type": "object",
  "additionalProperties": true
}
list_inference_jobs annotations
{
  "title": "List Async Jobs",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_service_status — Service Status
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Check RetroDiffusion subsystem health (/v2/status, no auth). Useful before bulk generation runs.

get_service_status input schema
{
  "type": "object",
  "properties": {}
}
get_service_status output schema
{
  "type": "object",
  "additionalProperties": true
}
get_service_status annotations
{
  "title": "Service Status",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_lowpoly_pricing — Low-Poly Pricing
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Low-Poly (3D) sizes, prices per operation (generate / revise / animate), styles, limits and export targets. Free.

get_lowpoly_pricing input schema
{
  "type": "object",
  "properties": {
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
get_lowpoly_pricing output schema
{
  "type": "object",
  "additionalProperties": true
}
get_lowpoly_pricing annotations
{
  "title": "Low-Poly Pricing",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_lowpoly_cost — Estimate Low-Poly Job
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Price a Low-Poly job without starting it (free). For generate with size auto, returns the size auto would pick. style prices a generate in that style (Lite styles cost less); other operations use the model's own style.

estimate_lowpoly_cost input schema
{
  "type": "object",
  "properties": {
    "size": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cube size in texels: \"16\", \"32\", \"64\", \"128\", \"256\", or \"auto\" (default). Auto reads the prompt; reference-image-only requests default to 64. Bigger sizes cost more (see get_lowpoly_pricing)."
    },
    "style": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Low-Poly style id: rd_lowpoly__detailed (default, free-form shapes), rd_lowpoly__blocky (boxes only, tilted where needed, Minecraft-like), their Lite versions rd_lowpoly__detailed_lite / rd_lowpoly__blocky_lite (a lighter model: simpler results for much less, and Lite prices for everything done to the model later), or another style listed by get_lowpoly_pricing (each style lists its prices)."
    },
    "prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "What to build or change, up to 250 characters."
    },
    "asset_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Required for revise, animate, split and rerig."
    },
    "operation": {
      "type": "string",
      "default": "generate",
      "description": "generate, revise, animate, split or rerig."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
estimate_lowpoly_cost output schema
{
  "type": "object",
  "additionalProperties": true
}
estimate_lowpoly_cost annotations
{
  "title": "Estimate Low-Poly Job",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
start_lowpoly_generate — Start Low-Poly 3D Model
Advertised by the server during the last successful anonymous check.
Open-world

Start building a low-poly 3D model with pixel-art textures from a prompt and/or reference images (paid). reference_models puts your existing models (by asset_id) into it exactly, e.g. "a tavern with my table". Optional input_palette (a palette image, as for create_inference): the model uses only its colors, and revisions and animations keep them. Returns task_id and asset_id immediately; poll get_lowpoly_job(task_id) until it succeeds (usually 1-5 minutes). Then use export_lowpoly_model for .glb/.bbmodel/Minecraft/OBJ files, start_lowpoly_revise to change it, or start_lowpoly_animate to add motion. Failed jobs are refunded automatically; never restart a running job.

start_lowpoly_generate input schema
{
  "type": "object",
  "properties": {
    "mode": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Omit (auto) to let the service pick: quality, or fast for simple requests. \"quality\" or \"fast\" to choose. Same price."
    },
    "size": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cube size in texels: \"16\", \"32\", \"64\", \"128\", \"256\", or \"auto\" (default). Auto reads the prompt; reference-image-only requests default to 64. Bigger sizes cost more (see get_lowpoly_pricing)."
    },
    "style": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Low-Poly style id: rd_lowpoly__detailed (default, free-form shapes), rd_lowpoly__blocky (boxes only, tilted where needed, Minecraft-like), their Lite versions rd_lowpoly__detailed_lite / rd_lowpoly__blocky_lite (a lighter model: simpler results for much less, and Lite prices for everything done to the model later), or another style listed by get_lowpoly_pricing (each style lists its prices)."
    },
    "prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "What to build or change, up to 250 characters."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "input_palette": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "idempotency_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional retry key: repeating a start call with the same key returns the same job instead of charging again."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Up to 4 base64 reference images (PNG/JPEG/WEBP) of the object, e.g. front and side views."
    },
    "reference_models": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "asset_ids of your own finished Low-Poly models to build in: each is placed exactly (same shapes and textures) where the prompt puts it, or adapted. Images and models together: at most 4."
    }
  }
}
start_lowpoly_generate output schema
{
  "type": "object",
  "additionalProperties": true
}
start_lowpoly_generate annotations
{
  "title": "Start Low-Poly 3D Model",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
start_lowpoly_revise — Start Low-Poly Revision
Advertised by the server during the last successful anonymous check.
Open-world

Change an existing Low-Poly model (paid, priced by its size). The result is saved as a new version. Poll get_lowpoly_job(task_id). One job per model at a time.

start_lowpoly_revise input schema
{
  "type": "object",
  "required": [
    "asset_id",
    "prompt"
  ],
  "properties": {
    "mode": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Omit (auto) to let the service pick: quality, or fast for simple requests. \"quality\" or \"fast\" to choose. Same price."
    },
    "prompt": {
      "type": "string",
      "description": "What should change, up to 250 characters."
    },
    "version": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Version number to work on (default: the newest). Revisions create versions; animations do not."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "idempotency_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional retry key: repeating a start call with the same key returns the same job instead of charging again."
    },
    "reference_images": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Up to 4 base64 reference images (PNG/JPEG/WEBP) of the object, e.g. front and side views."
    }
  }
}
start_lowpoly_revise output schema
{
  "type": "object",
  "additionalProperties": true
}
start_lowpoly_revise annotations
{
  "title": "Start Low-Poly Revision",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
start_lowpoly_animate — Start Low-Poly Animation
Advertised by the server during the last successful anonymous check.
Open-world

Add an animation to a Low-Poly model version, or change an existing one by passing its name as animation (paid, priced by size). The first animation rigs the model for free. Animations attach to the version; they do not create a new version. Poll get_lowpoly_job(task_id).

start_lowpoly_animate input schema
{
  "type": "object",
  "required": [
    "asset_id",
    "prompt"
  ],
  "properties": {
    "mode": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Omit (auto) to let the service pick: quality, or fast for simple requests. \"quality\" or \"fast\" to choose. Same price."
    },
    "prompt": {
      "type": "string",
      "description": "The motion, e.g. 'a bouncy walk cycle' or 'swing the sword overhead'. With animation: what should change about it."
    },
    "version": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Version number to work on (default: the newest). Revisions create versions; animations do not."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "animation": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Name of an existing animation on the version to change instead of adding a new one (it keeps its name). Omit to add a new animation."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "idempotency_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional retry key: repeating a start call with the same key returns the same job instead of charging again."
    }
  }
}
start_lowpoly_animate output schema
{
  "type": "object",
  "additionalProperties": true
}
start_lowpoly_animate annotations
{
  "title": "Start Low-Poly Animation",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
start_lowpoly_split — Split Low-Poly Model
Advertised by the server during the last successful anonymous check.
Open-world

Break a Low-Poly model into separate models (paid, priced by its size): a desk scene becomes the desk, a candle, each book, and so on. Each piece is a new model (and history item) facing the front, with its own textures, rig and animations; the original is unchanged. Poll get_lowpoly_job(task_id); its pieces list the new models.

start_lowpoly_split input schema
{
  "type": "object",
  "required": [
    "asset_id"
  ],
  "properties": {
    "prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "How to split, e.g. 'only the books' or 'each drawer too' (up to 250 characters). Omit to split off every separate object that makes sense."
    },
    "version": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Version number to work on (default: the newest). Revisions create versions; animations do not."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "idempotency_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional retry key: repeating a start call with the same key returns the same job instead of charging again."
    }
  }
}
start_lowpoly_split output schema
{
  "type": "object",
  "additionalProperties": true
}
start_lowpoly_split annotations
{
  "title": "Split Low-Poly Model",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
start_lowpoly_rerig — Re-rig Low-Poly Model
Advertised by the server during the last successful anonymous check.
Open-world

Rebuild the skeleton of a rigged Low-Poly model version (paid, priced by size), e.g. to move a pivot or add bones. The version is updated in place; animations whose bones the new rig still has are kept. Versions without a rig are rigged for free by their first animation instead. Poll get_lowpoly_job(task_id).

start_lowpoly_rerig input schema
{
  "type": "object",
  "required": [
    "asset_id"
  ],
  "properties": {
    "prompt": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "What to change about the rig, e.g. 'give the tail three bones' (up to 250 characters). Omit for a fresh rig."
    },
    "version": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Version number to work on (default: the newest). Revisions create versions; animations do not."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "idempotency_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional retry key: repeating a start call with the same key returns the same job instead of charging again."
    }
  }
}
start_lowpoly_rerig output schema
{
  "type": "object",
  "additionalProperties": true
}
start_lowpoly_rerig annotations
{
  "title": "Re-rig Low-Poly Model",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_lowpoly_job — Check Low-Poly Job
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Status of a Low-Poly job: pending, running, succeeded or failed. On success, the model with its versions, render URLs and animations. Poll every 10-20 seconds; jobs take minutes.

get_lowpoly_job input schema
{
  "type": "object",
  "required": [
    "task_id"
  ],
  "properties": {
    "task_id": {
      "type": "string",
      "description": "Async job id returned by start_inference_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
get_lowpoly_job output schema
{
  "type": "object",
  "additionalProperties": true
}
get_lowpoly_job annotations
{
  "title": "Check Low-Poly Job",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_lowpoly_model — Get Low-Poly Model
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

A Low-Poly model: status, versions (render URLs, animations) and any running job.

get_lowpoly_model input schema
{
  "type": "object",
  "required": [
    "asset_id"
  ],
  "properties": {
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
get_lowpoly_model output schema
{
  "type": "object",
  "additionalProperties": true
}
get_lowpoly_model annotations
{
  "title": "Get Low-Poly Model",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_lowpoly_models — List Low-Poly Models
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The account's Low-Poly models, newest first.

list_lowpoly_models input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 100,
      "minimum": 1,
      "description": "How many models to return (newest first)."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
list_lowpoly_models output schema
{
  "type": "object",
  "additionalProperties": true
}
list_lowpoly_models annotations
{
  "title": "List Low-Poly Models",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
export_lowpoly_model — Export Low-Poly Model
Advertised by the server during the last successful anonymous check.
Open-world

Export a Low-Poly model for an engine or tool and return a hosted download URL (free). Engines (Godot, Unity, Unreal, three.js) and Blender get .glb; Blockbench gets .bbmodel; Minecraft gets a resource pack; .glb and .bbmodel include every animation. Animated GIFs, sprite sheets and MP4 videos need an animation name from the model.

export_lowpoly_model input schema
{
  "type": "object",
  "required": [
    "asset_id",
    "target"
  ],
  "properties": {
    "target": {
      "type": "string",
      "description": "godot, unity, unreal, web, blender (all .glb), blockbench (.bbmodel), obj (zip), minecraft (resource pack zip), atlas (png), turntable (png), axis_views (zip of 6 pixel-exact PNGs, one per axis direction), gif, sheet or mp4 (1024px video) (need an animation). The .glb and .bbmodel files include every animation."
    },
    "version": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Version number to work on (default: the newest). Revisions create versions; animations do not."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "animation": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Animation name for the gif, sheet and mp4 targets. Omit it for gif or sheet to get every animation in one zip."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
export_lowpoly_model output schema
{
  "type": "object",
  "additionalProperties": true
}
export_lowpoly_model annotations
{
  "title": "Export Low-Poly Model",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
recolor_lowpoly_model — Recolor Low-Poly Model
Advertised by the server during the last successful anonymous check.
Open-world

Recolor a Low-Poly model's textures with the image color tools and save the result as a new version (returns the model). Color Reducer and Palette Converter cost $0.001; Color Style Transfer costs $0.01. Later revisions and animations keep the new colors.

recolor_lowpoly_model input schema
{
  "type": "object",
  "required": [
    "asset_id",
    "tool"
  ],
  "properties": {
    "tool": {
      "type": "string",
      "description": "color_reducer (limit the colors), palette_converter (convert to a palette image) or color_style_transfer (take a reference image's color style)."
    },
    "version": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Version number to work on (default: the newest). Revisions create versions; animations do not."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    },
    "color_count": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_reducer: how many colors, 2-256 (omit for automatic)."
    },
    "dither_mode": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "none | bayer_2x2 | bayer_4x4 | bayer_8x8 (color_reducer, palette_converter)."
    },
    "palette_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Base64 image of a color palette; output colors are constrained to it."
    },
    "dither_strength": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Dithering strength, 0-10 (default 5)."
    },
    "reference_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "color_style_transfer: base64 reference image."
    }
  }
}
recolor_lowpoly_model output schema
{
  "type": "object",
  "additionalProperties": true
}
recolor_lowpoly_model annotations
{
  "title": "Recolor Low-Poly Model",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_lowpoly_animation — Delete Low-Poly Animation
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete one animation from a Low-Poly model's version (free) and return the model. The rig stays, so animating again needs no new rig. This cannot be undone.

delete_lowpoly_animation input schema
{
  "type": "object",
  "required": [
    "asset_id",
    "version",
    "animation"
  ],
  "properties": {
    "version": {
      "type": "integer",
      "description": "The version the animation belongs to."
    },
    "asset_id": {
      "type": "string",
      "description": "asset_id returned by start_lowpoly_generate or get_lowpoly_job."
    },
    "animation": {
      "type": "string",
      "description": "The animation's name, as listed on the version."
    },
    "rd_api_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "RetroDiffusion API key (rdpk-...) for this call only; overrides session or header auth."
    }
  }
}
delete_lowpoly_animation output schema
{
  "type": "object",
  "additionalProperties": true
}
delete_lowpoly_animation annotations
{
  "title": "Delete Low-Poly Animation",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

0 advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
794 ms
95th percentile latency
794 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 794 ms · metadata changed · 33 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http retro-diffusion-mcp https://mcp.retrodiffusion.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add retro-diffusion-mcp --url https://mcp.retrodiffusion.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable retro-diffusion-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "retro-diffusion-mcp": {
      "url": "https://mcp.retrodiffusion.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "retro-diffusion-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.retrodiffusion.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start retro-diffusion-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "retro-diffusion-mcp": {
      "type": "http",
      "url": "https://mcp.retrodiffusion.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http retro-diffusion-mcp https://mcp.retrodiffusion.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.retrodiffusion.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "retro-diffusion-mcp": {
      "serverUrl": "https://mcp.retrodiffusion.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Retro Diffusion MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Retro Diffusion MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing