Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
KRITA_URLNoKrita MCP plugin HTTP endpointhttp://localhost:5678
RD_WS_URLNoLocal RD backend WebSocket endpointws://127.0.0.1:8765
RD_API_KEYNoretrodiffusion.ai key for rd_api_* tools. Resolution order per call: tool's api_key argument → this variable → key saved by the RD Aseprite dialog.
RD_OUT_DIRNoWhere generated images/sprites are saved<package>\output\ (auto-created)
ASEPRITE_EXENoPath to the Aseprite executable used for the headless CLI. Default varies by OS: Windows - %ProgramFiles%\Aseprite\Aseprite.exe or Steam common; macOS - /Applications/Aseprite.app/Contents/MacOS/aseprite; Linux - /usr/bin/aseprite or /usr/local/bin/aseprite.
RD_GEN_TIMEOUTNoGeneration timeout in seconds900
RD_PRESET_FILENoPreset store for rd_preset_*<package>\presets.json
RD_EXTENSION_DIRNoRetro Diffusion extension folder (backend, venv, models, LoRAs). Defaults: Windows - %APPDATA%\Aseprite\extensions\RetroDiffusion; macOS - ~/Library/Application Support/Aseprite/extensions/RetroDiffusion; Linux - ~/.config/aseprite/extensions/RetroDiffusion.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
rd_statusA

Check whether the Retro Diffusion local backend is reachable on ws://127.0.0.1:8765.

By default this only opens a socket (zero side effects). With handshake=True it also performs the version handshake, which makes the backend minimize its console window once - avoid unless diagnosing.

rd_start_backendA

Start the Retro Diffusion local backend (image_server.py in the extension venv) if not already listening.

Headless: no console window, UTF-8 IO env, logs to mcp-backend.log.

rd_stop_backendA

Ask the Retro Diffusion backend to shut down (also closes its console window loop).

rd_list_lorasA

List available Retro Diffusion style LoRAs (.pxlm) with their alias keys.

rd_list_modelsA

List selectable base models, ControlNet models, texture tiling modes and dimension presets.

rd_preset_saveA

Save a named generation preset (any rd_generate kwargs) to presets.json.

rd_preset_listA

List saved generation presets.

rd_preset_applyA

Return a saved preset's settings so they can be passed to rd_generate.

rd_preset_deleteB

Delete a saved preset.

rd_generateA

Text to Image with the local Retro Diffusion pixel-art model.

Output pixels = width//pixel_size (or a size_preset like 64x64/160x144, swap=True transposes). Internally normalized onto RD's 8px latent grid so small sprites never degrade. quality ~1.6-6 drives steps; cfg_scale is the prompt scale; adherence 0-5 trades ELLA/CLIP guidance. Modifiers: comp_* (hue/tint/brightness/saturation/contrast/outline sliders), light_* (directional lighting leco). Rendering options: pixelvae (fast pixel decoder), rembg, post_process (auto reduce colors), tile_x/tile_y. Display: save_grid composes one grid PNG; save_progress stores intermediate previews. preset + overrides replays a saved preset (other args ignored).

rd_img2imgC

Image to Image: refine/repaint existing PNGs. strength 0-100.

Inputs are resized to max side 512 like the UI does. Same advanced options as rd_generate.

rd_cn_txt2imgC

ControlNet Text to Image.

controlnets: list of {model: Composition|Depth|Pose|Sketch|Tile, weight: 0-100, process: bool (preprocess input), enabled: bool}; control_images: parallel list of input PNG paths (None for disabled slots). Palette constraint via palette_files (PNG palettes) or palette_url. Uses explicit steps (no quality).

rd_cn_img2imgA

ControlNet Image to Image: same as rd_cn_txt2img plus a source image (appended after the ControlNet slots, resized to 512 like the UI) and strength 0-100.

rd_neural_transformC

Neural Transform: re-imagine the input image in a new style/pose from a prompt.

rd_neural_pixelateB

Neural Pixelate: convert an image (photo/render) into pixel art.

blip auto-captions the input; color_map preserves the source palette.

rd_neural_resizeC

Neural Resize: change pixel density/resolution of pixel art while keeping detail coherent.

rd_neural_detailC

Neural Detail: add or remove detail (detail 0-100) on existing pixel art.

rd_api_txt2imgC

Retrodiffusion.ai cloud API: text to image (needs an API key: arg, RD_API_KEY env, or the extension's settings rdapikey).

rd_api_img2imgC

Retrodiffusion.ai cloud API: image to image (needs an API key).

rd_api_txt2animA

Retrodiffusion.ai cloud API: text to animation. Returns frame PNGs plus an assembled GIF (needs an API key).

rd_api_img2animB

Retrodiffusion.ai cloud API: image to animation. Returns frame PNGs plus an assembled GIF (needs an API key).

rd_rembgB

Remove Background: cut the background out of images (ISNET matting).

rd_texture_genB

Generate Textures: PBR maps (normal/roughness/displacement) from images.

tiling: none | seamless | mirror | replicate (extend).

rd_palettizeB

Palettize: reduce images to a palette (file/URL constrained or automatic).

dither: None | Bayer 2x2 | Bayer 4x4 | Bayer 8x8; dither_strength, denoise, smoothness, intensity are 0-100 sliders mirroring the UI.

rd_color_transferC

Color Style Transfer: recolor images to match a reference image's palette.

strict enforces the exact reference colors.

rd_kcentroidB

K-Centroid Resize: downscale images with k-means palette preservation (centroids = target colors), optionally re-adding an outline.

rd_paletteA

Generate a color palette with Retro Diffusion's palette model.

Returns the swatch image path plus extracted hex colors (row-major, deduplicated).

rd_prompt_extractA

Extract a text prompt/description from a reference image (BLIP captioning, optionally guided by a partial description).

rd_translateC

Translate/enhance prompts into model-friendly English prompt text.

rd_benchmarkC

Run the backend benchmark (throughput/consistency measurement).

rd_quantizeA

Reduce a PNG to an indexed palette (GBA-friendly) and return the hex palette.

Pillow median-cut quantization; output is a P-mode PNG. Default out_path sits next to the input with a _q{colors} suffix.

ase_import_layerA

Import a PNG (e.g. an RD generation) into an .aseprite sprite as a new layer.

The image cel is placed at (0,0) on the given 1-based frame. The sprite file is saved in place. Runs headless via the Aseprite CLI.

ase_add_framesA

Append each PNG as a new animation frame on a new layer of an .aseprite sprite.

Useful to turn RD generations into idle-animation frames. Optionally wraps the new frames in an animation tag. Saves in place, headless CLI.

ase_create_canvasC

Create a new .aseprite sprite (rgb|grayscale|indexed). Returns its path.

ase_sprite_infoC

Sprite metadata: dimensions, color mode, frames (with durations), layers, tags.

ase_save_asC

Save a sprite copy to a new path.

ase_draw_pixelsB

Draw individual pixels [{x,y,r,g,b,a}] (or hex via r/g/b/a ints) on a cel.

merge=True skips fully transparent pixels (sprite stamping); default replaces everything including alpha.

ase_draw_pixels_hexC

Convenience: draw pixels given as [{x, y, color: '#rrggbb' or '#rrggbbaa'}].

ase_get_pixelsB

Read a rectangular region of a cel as {width,height,pixels:[{x,y,r,g,b,a,hex}]}.

ase_draw_lineB

Draw a line (Bresenham, optional thickness).

ase_draw_rectangleC

Draw a rectangle (filled or outline).

ase_draw_circleC

Draw a circle (filled or outline).

ase_draw_contourC

Draw a polyline/polygon through points.

ase_draw_with_ditherC

Fill a region with a dither pattern (bayer_2x2/4x4/8x8, checkerboard, noise).

ase_fill_areaB

Flood fill from a point (paint bucket), RGBA tolerance 0-255.

ase_select_rectangleB

Set the server-side selection to a rectangle.

ase_select_ellipseC

Set the server-side selection to an ellipse (bounding box).

ase_select_allD

Select the whole cel.

ase_deselectA

Clear the server-side selection.

ase_move_selectionB

Move the selection bounds (not pixels).

ase_get_selectionC

Current selection state.

ase_copy_selectionA

Copy the selected pixels to the server clipboard (keeps sprite intact).

ase_cut_selectionB

Copy the selection to the clipboard and clear it in the cel.

ase_paste_clipboardC

Paste the server clipboard onto a cel at (x,y), respecting alpha.

ase_apply_outlineC

Draw an outline around non-transparent pixels of a cel.

ase_apply_shadingB

Directional cell shading: recolor opaque pixels of the base color toward shadow/highlight depending on which way the silhouette faces the light.

ase_suggest_antialiasingB

Detect jagged diagonal edges and suggest (or apply) 50% blend pixels.

ase_analyze_palette_harmoniesB

Color-wheel analysis: complementary pairs, triads, analogous groups, temperature.

ase_get_paletteC

Return the sprite palette as hex colors.

ase_set_paletteC

Replace the sprite palette with the given hex colors.

ase_set_palette_colorC

Set one palette entry by index.

ase_add_palette_colorB

Append a color to the sprite palette (grows by one).

ase_sort_paletteC

Sort the sprite palette by hue|saturation|brightness|luminance.

ase_add_frameB

Append a frame; returns the new frame count.

ase_delete_frameC

Delete a 1-based frame.

ase_duplicate_frameC

Duplicate a frame; insert_after=0 appends at the end.

ase_set_frame_durationC

Set a frame's duration in ms.

ase_create_tagC

Create an animation tag (forward|reverse|pingpong).

ase_delete_tagC

Delete an animation tag by name.

ase_add_layerC

Add a new image layer.

ase_delete_layerC

Delete a layer by name.

ase_flatten_layersA

Flatten all layers into one.

ase_link_celC

Make a cel linked (shared image) with another frame's cel.

ase_scale_spriteC

Scale the whole sprite (nearest|bilinear).

ase_downsampleB

Box-ish downsample to target size (bilinear then nearest for pixel art).

ase_resize_canvasA

Resize canvas without scaling content (anchor: center|top_left|top_right|bottom_left|bottom_right).

ase_rotate_spriteB

Rotate 90/180/270 degrees clockwise (sprite or active layer).

ase_flip_spriteC

Flip horizontally|vertically (sprite or active layer).

ase_crop_spriteC

Crop the sprite to a rectangle.

ase_trim_spriteA

Trim transparent borders (optionally by grid boundaries).

ase_color_modeA

Convert color mode: rgb|grayscale|indexed, with optional ordered dithering (none|ordered) and bayer2x2|bayer4x4|bayer8x8 matrix.

ase_export_spriteB

Export sprite to png|gif|jpg|bmp; frame=0 exports the animation.

ase_export_spritesheetC

Export a spritesheet (horizontal|vertical|rows|columns|packed) with optional JSON metadata.

ase_rename_layerA

Rename a layer (accepts group/child paths).

ase_duplicate_layerA

Duplicate a layer with independent copies of all its cels, plus opacity and blend mode. The copy lands directly above the source; default name is the source name plus a copy suffix.

ase_reorder_layerB

Move a layer to a 1-based stack position (1 = bottom).

ase_set_layer_blend_modeA

Set a layer's blend mode: normal, darken, multiply, color_burn, lighten, screen, color_dodge, addition, overlay, soft_light, hard_light, difference, exclusion, subtract, divide, hue, saturation, color, luminosity.

ase_merge_layer_downB

Merge a layer into the layer directly below it (must not be bottom).

ase_set_layer_opacityB

Set layer opacity 0-255.

ase_set_layer_visibilityC

Show or hide a layer.

ase_replace_colorA

Replace one color with another across a layer (None = all layers), preserving alpha. frame=0 processes every frame. tolerance is per-channel 0-255. Returns the number of pixels replaced.

ase_adjust_hslA

Shift hue (-360..360 deg), saturation (-100..100) and lightness (-100..100) of all opaque pixels: palette swaps, night scenes, shadow layers. layer None = all layers; frame=0 processes every frame.

ase_erase_colorA

Magic eraser: make every pixel matching a color fully transparent (per-channel tolerance 0-255). layer None = all layers, frame=0 = every frame. Returns the number of pixels erased.

ase_dither_gradientA

Fill a rectangle with a two-color Bayer 4x4 ordered-dither gradient (the classic pixel-art blend: no new intermediate colors). Top-to-bottom by default; horizontal=true runs left-to-right. Coordinates are sprite-global (the cel is normalized to the canvas).

ase_list_palette_presetsA

List the built-in retro palette presets (gameboy, pico8, c64, cga, dawnbringer16/32, grayscale_4, monochrome) with their hex colors. Pure data: works without Aseprite.

ase_apply_palette_presetA

Set the sprite palette to a built-in retro preset. Only the palette is changed; snap existing pixels with ase_quantize_to_palette afterwards.

ase_generate_color_rampA

Generate a dark-to-light shading ramp around a base color using the standard pixel-art hue-shift technique: shadows lean cooler, highlights lean warmer, saturation tapers toward the light end. Pure computation (no Aseprite needed); feed the result to ase_set_palette or shading ops.

Returns the ramp darkest-first.

ase_quantize_to_paletteA

Snap every opaque pixel to the nearest color in the sprite's own palette (RGB distance, cached per color). layer None = all layers, frame=0 = every frame. Run after ase_apply_palette_preset / ase_set_palette to make existing art conform. Returns the number of pixels changed.

ase_add_frames_blankA

Append N blank frames, each with the given duration. Returns the new frame count.

ase_set_frame_duration_allA

Set every frame's duration in ms (unit-probed for Aseprite 1.3+).

ase_create_celA

Create an empty canvas-sized cel on a layer/frame (no-op if one exists). layer None = first image layer.

ase_clear_celA

Delete the cel on a layer/frame (makes it truly empty, unlike painting it transparent). layer None = first image layer.

ase_copy_celA

Copy a cel's image from one frame to another (independent clone, unlike ase_link_cel which shares the image). layer None = first image layer.

ase_set_cel_positionA

Place a cel at sprite coordinates (x, y). layer None = first image layer; errors when the cel does not exist (create/draw one first).

ase_set_cel_opacityA

Set a single cel's opacity 0-255 (layer None = first image layer).

ase_propagate_celsA

Copy the cels of a source frame across a frame range (per layer list; None = every image layer). The animation workhorse: draw once, propagate, then tween positions. replace=True overwrites existing cels.

ase_tween_cel_positionsA

Tween a cel's position linearly across a frame range (movement arcs, attacks, slides). easing: linear | ease_in | ease_out | ease_in_out | smoothstep. Missing cels are cloned from the start frame when create_missing=true. layer None = first image layer.

ase_oscillate_cel_positionsA

Sine-wave cel motion across a frame range (bobbing, breathing, hovering). Offsets are applied relative to each cel's position at script start, so run once per animation pass. x follows sin, y follows cos. layer None = first image layer.

ase_create_sliceC

Create a named slice (rectangular region exported for game engines).

ase_set_slice_centerC

Set a slice's 9-patch center rectangle (relative to the slice origin): the stretchable region for game-engine 9-patch scaling.

ase_set_slice_pivotC

Set a slice's pivot point (relative to the slice origin).

ase_list_slicesB

List all slices with bounds, 9-patch centers and pivots.

ase_delete_sliceB

Delete a slice by name.

ase_create_tilemap_layerA

Create a tilemap layer with its own tileset: sets the sprite grid to the tile size and adds the layer. Tile index 0 is the reserved empty tile; draw real tiles with ase_draw_on_tile (which appends on demand).

ase_draw_on_tileA

Paint pixels into a tile of a tilemap layer's tileset. Coordinates are tile-local (0,0 = tile top-left); pixels are [{x, y, color: '#rrggbb'}]. tile_index 1 is the first real tile (0 is the reserved empty tile); passing tile_index == current tile count appends a new tile.

ase_set_tilesA

Place tiles on a tilemap layer by grid position. tiles are [{col, row, tile_index}] (col/row are 0-based grid coordinates; tile_index 0 clears the cell). The cel is (re)built at map size.

ase_get_tile_atB

Read which tile occupies a grid cell (0 = empty).

ase_get_tilemap_infoC

Tilemap layer info: tile size, real tile count (excluding empty tile 0), and map dimensions in cells.

ase_render_onion_skinA

Render a frame over translucent ghosts of neighboring frames (batch onion-skinning) to check motion continuity without opening Aseprite. The flattened frames are exported via the CLI and composited with Pillow over white, then nearest-neighbor scaled. Returns the PNG path.

ase_compare_framesA

Diff two frames of the flattened sprite: changed pixel count, percent, and the bounding box of the changed region. Use while animating to confirm a frame actually changed (or did not change too much).

ase_get_color_statsB

Histogram the colors of a flattened frame: unique color count, opaque pixel count, and the most-used colors. Catches palette drift and near-duplicate colors.

ase_export_layersB

Export each visible layer as its own PNG named after the layer (--split-layers). out_dir defaults to output/layers_/. include_hidden also exports hidden layers.

ase_export_tagA

Export an animation tag: .gif output gives an animation, .png a frame-numbered sequence. The tag is validated up front because Aseprite's --tag silently exports ALL frames for a missing tag. output_path defaults to output/_.gif.

ase_run_luaA

Execute arbitrary Aseprite Lua in batch mode - the escape hatch when no dedicated tool fits (full API: https://www.aseprite.org/api/). One script can batch many operations into a single Aseprite launch.

Essentials: when sprite_path is given it is opened first and bound to a local 'spr' (also app.activeSprite); changes are NOT saved automatically - call spr:saveAs(spr.filename) at the end; print() is the only way to return data (captured in the result's output list); do NOT end the script with a top-level return (it skips the completion marker and the call is reported as failed). Cel-image coordinates are cel-local: offset sprite-global coordinates by cel.position.

WARNING: executes unrestricted Lua (including io/os access) on the host running Aseprite. Only pass scripts you trust.

ase_statusA

Check whether the headless Aseprite CLI is available (executable present and a probe batch run succeeds). Cached 60s; file-touching ase_* tools gate on this and report {available:false,...} instead of crashing when missing.

When the executable cannot be found the result also carries the locations that were probed, so an install in a custom folder can be pointed at directly instead of guessed.

px_capabilitiesA

One-call overview of what this server can currently do: Aseprite (primary subsystem) and Retro Diffusion (conditional) availability, the gating behavior, and how to fetch image content back to the caller.

px_image_base64A

Return a PNG file's bytes as a PLAIN TEXT base64 field in the JSON result ({"png_base64": "iVBORw0...", "mime": "image/png", "bytes": N, ...}) instead of an ImageContent block, so the caller can decode and write it themselves (e.g. into a sandboxed outputs directory). Transparency is preserved. max_side=0 keeps the original size; otherwise downscale before encoding.

px_view_imageB

Return an image file as MCP image content so the caller can SEE it (downscaled to max_side for token sanity), preceded by an info dict.

px_view_imagesC

Return several image files as MCP image content blocks (animation frames, before/after pairs), each preceded by its info dict.

ase_view_frameA

Render one cel of a sprite to PNG and return it as MCP image content so the caller can SEE the current sprite state (layer defaults to first).

krita_statusA

Check whether Krita is running with the MCP plugin active (forced probe).

krita_new_canvasC

Create a new canvas in Krita.

krita_set_colorB

Set the foreground (paint) color (hex like #ff6b6b).

krita_set_brushB

Set brush preset and properties (preset partial name, size px, opacity 0-1).

krita_strokeB

Paint a stroke through [x, y] points; pressure 0-1.

krita_fillC

Fill a circle at (x, y) with the current color.

krita_draw_shapeC

Draw rectangle|ellipse|line on the canvas; x2/y2 are line endpoints.

krita_get_canvasC

Export the current Krita canvas to PNG (plugin output dir).

as_base64=true returns the PNG bytes as a plain text png_base64 field for callers that decode/write themselves; otherwise returns the plugin result including the exported path.

krita_undoB

Undo the last action in Krita.

krita_redoA

Redo the last undone action in Krita.

krita_clearA

Clear the canvas to a solid color.

krita_saveC

Save the current Krita document to path (.kra/.png/...).

krita_get_color_atA

Sample the canvas color at (x, y) (eyedropper).

Falls back to exporting the canvas and reading the pixel locally when the Krita plugin's native action fails (older plugin builds crash on bytes formatting until Krita is restarted with the patched plugin).

krita_list_brushesA

List Krita brush presets (partial-name filter).

krita_open_fileB

Open a file in Krita (.kra, .png, .jpg, ...).

krita_document_infoA

Active Krita document overview: name, filename, size, resolution, color model/depth, layer count, active layer, selection state, zoom, Krita version.

krita_list_layersA

Layer tree of the active document (top-of-stack first): name, type, visibility, lock, opacity, blending mode, bounds, nested children.

krita_create_layerB

Create a paint or group layer. above = existing layer name to stack it over (default: top). The new layer becomes active.

krita_set_active_layerA

Make a layer the active paint target (searched recursively by exact name).

krita_set_layer_propsB

Change layer visibility/lock/opacity/blending mode/name. Only the provided fields are touched.

krita_remove_layerB

Delete a layer (refuses to delete the only top-level layer).

krita_duplicate_layerA

Duplicate a layer with its full pixel content; the clone lands directly above the source and becomes active.

krita_merge_layer_downC

Merge a layer into the one below it.

krita_get_pixelsA

Export a canvas region as PNG (merged projection; layer=None reads the whole composite). width/height 0 = to the canvas edge. Returns the file path; as_base64 also returns the PNG bytes as a text field. Pair with px_view_image / read_image to LOOK at the canvas.

krita_set_pixelsA

Stamp a PNG file into a layer at (x, y) - the bridge for bringing Aseprite sprites or Retro Diffusion generations into Krita. layer=None targets the active layer.

krita_list_filtersA

List Krita filter names usable with krita_apply_filter (partial-name filter).

krita_adjust_pixelsA

Crash-free image adjustments on a Krita layer region, computed with Pillow over the get_pixels/set_pixels PNG bridge (libkis Filter.apply() hard-crashes Krita 5.3.3, so native filters are quarantined; see krita_list_filters for names).

operation: invert | grayscale | hsv (hue_shift -360..360, saturation_shift/value_shift -100..100) | blur (radius px) | bright_contrast (brightness/contrast factors, 1.0 = unchanged) | posterize (bits 1-8). width/height 0 = to the canvas edge; layer=None targets the active layer. Alpha is preserved throughout.

krita_set_selectionC

Set the global selection to a rectangle, or the whole canvas (all=True).

krita_modify_selectionB

Modify the current selection: invert | feather(radius) | grow(x_radius,y_radius) | shrink(x_radius,y_radius,edge_lock) | smooth | erode | dilate | border(x_radius,y_radius).

krita_get_selectionA

Current global selection: exists flag plus bounding box.

krita_clear_selectionA

Deselect everything.

krita_resize_imageA

Resize the canvas without scaling content (crop or expand). x/y is the offset of the old canvas inside the new one (negative crops).

krita_scale_imageA

Scale the whole image to new pixel dimensions (resampling strategy: Bilinear | NearestNeighbor | Lanczos3 ...). xres/yres 0 keeps the current resolution.

krita_flattenA

Flatten all layers of the active document into one.

krita_export_layersA

Export every top-level layer as its own PNG (trimmed to its bounds). Defaults to the plugin's canvas output dir; returns per-layer paths.

krita_set_canvas_viewA

Control the active view's canvas: zoom level (1.0 = 100%), rotation degrees, mirror, wrap-around mode. Only provided fields change; returns the resulting zoom/rotation.

krita_list_actionsA

List Krita QAction names runnable via krita_run_action (partial-name filter on name or display text).

krita_run_actionA

Trigger any named Krita action (e.g. flatten_image, mirror_canvas, view_zoom_in, selectiontool...). Unknown names return did_you_mean suggestions from krita_list_actions.

krita_run_pythonA

Execute arbitrary Python inside Krita (escape hatch). The namespace provides: krita module, Krita/app, doc (active Document), view, InfoObject, Selection, QImage, os, json, math. print() is captured into the result's output field; assign to a variable named result to return a value (repr'd).

WARNING: executes unrestricted code inside the running Krita process. Only pass code you trust.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

C2.9/5.0

Scored across 169 tools

Disambiguation4/5

The subsystem prefixes (ase_, krita_, rd_, px_) separate concerns clearly, and most tools target a distinct resource or action. A few near-duplicates such as ase_draw_pixels vs ase_draw_pixels_hex, ase_add_frame vs ase_add_frames, and ase_dither_gradient vs ase_draw_with_dither create minor ambiguity, but the descriptions are detailed enough to resolve most confusion.

Naming Consistency4/5

Names are uniformly snake_case and follow a recognizable verb_noun pattern within each subsystem. Minor inconsistencies exist, such as mixing add vs create, get vs list, and delete vs remove across tools, but the overall convention is predictable and readable.

Tool Count1/5

169 tools is an extreme surface for any MCP server, even one spanning Aseprite, Krita, and Retro Diffusion. This volume will overwhelm context windows and make tool selection expensive and error-prone.

Completeness5/5

The tool surface is remarkably comprehensive, covering sprite/layer/frame/tag/palette/slice/tilemap operations, Krita document and layer workflows, image generation variants, and integration bridges between the subsystems. The escape hatches ase_run_lua and krita_run_python close almost any remaining gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues