generate_character
Create character sprites with multiple poses using AI workflows. Specify descriptions, poses, and style presets to generate 2D game assets.
Instructions
Generate character sprites with optional multiple poses.
Args:
description: Character description (e.g., "a knight in silver armor")
poses: List of poses to generate (e.g., ["idle", "walking", "attacking"])
preset: Style preset to use (default: character). Options: character, character_portrait, pixel_character
width: Sprite width in pixels
height: Sprite height in pixels
seed: Base seed for reproducibility (each pose gets seed+index)
steps: Override generation steps (higher = better quality but slower)
save_to_file: Whether to save images to disk
Returns:
JSON with base64 images for each pose
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| description | Yes | ||
| poses | No | ||
| preset | No | character | |
| width | No | ||
| height | No | ||
| seed | No | ||
| steps | No | ||
| save_to_file | No |
Implementation Reference
- server/main.py:353-437 (handler)The core handler function for the 'generate_character' MCP tool. Decorated with @mcp.tool() for automatic registration. Generates character sprites in specified poses using AI backend, handles prompting, image generation, resizing, and returns JSON with base64 images.@mcp.tool() async def generate_character( description: str, poses: List[str] = None, preset: str = "character", width: int = 256, height: int = 512, seed: Optional[int] = None, steps: Optional[int] = None, save_to_file: bool = False ) -> str: """Generate character sprites with optional multiple poses. Args: description: Character description (e.g., "a knight in silver armor") poses: List of poses to generate (e.g., ["idle", "walking", "attacking"]) preset: Style preset to use (default: character). Options: character, character_portrait, pixel_character width: Sprite width in pixels height: Sprite height in pixels seed: Base seed for reproducibility (each pose gets seed+index) steps: Override generation steps (higher = better quality but slower) save_to_file: Whether to save images to disk Returns: JSON with base64 images for each pose """ if poses is None: poses = ["idle"] preset_config = get_preset(preset) gen_steps = steps or preset_config.steps render_width = width render_height = height should_downscale = (width < preset_config.default_width) or (height < preset_config.default_height) if should_downscale: render_width = preset_config.default_width render_height = preset_config.default_height characters = [] for i, pose in enumerate(poses): prompt = f"{description}, {pose} pose" full_prompt = f"{preset_config.prompt_prefix}{prompt}{preset_config.prompt_suffix}" gen_seed = (seed + i) if seed is not None else None image_bytes = await backend.generate_image( prompt=full_prompt, negative_prompt=preset_config.negative_prompt, width=render_width, height=render_height, seed=gen_seed, steps=gen_steps, cfg_scale=preset_config.cfg_scale, sampler=preset_config.sampler, scheduler=preset_config.scheduler ) if should_downscale: resample = Image.Resampling.NEAREST if preset.startswith("pixel") else Image.Resampling.LANCZOS image_bytes = resize_image(image_bytes, width, height, resample=resample) char_data = { "index": i, "pose": pose, "image_base64": image_to_base64(image_bytes), "width": width, "height": height } if save_to_file: output_dir = ensure_directory(OUTPUT_DIR / "characters") fname = generate_filename(prefix=f"char_{pose}") file_path = output_dir / fname file_path.write_bytes(image_bytes) char_data["file_path"] = str(file_path) characters.append(char_data) return json.dumps({ "success": True, "description": description, "count": len(characters), "characters": characters }, indent=2)