generate_character
Create character sprites with multiple poses for game development using AI workflows. Specify character 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:382-479 (handler)The @mcp.tool()-decorated handler function implementing the 'generate_character' tool. Generates character sprites in specified poses using AI backend, handles presets, resizing, and returns JSON with base64 images or file paths.@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 = True ) -> 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"] desc_lower = description.lower() if preset == "character" and any( k in desc_lower for k in ( "top-down", "top down", "topdown", "overhead", "stardew", ) ): preset = "topdown_character" 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)