pixelworks
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KRITA_URL | No | Krita MCP plugin HTTP endpoint | http://localhost:5678 |
| RD_WS_URL | No | Local RD backend WebSocket endpoint | ws://127.0.0.1:8765 |
| RD_API_KEY | No | retrodiffusion.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_DIR | No | Where generated images/sprites are saved | <package>\output\ (auto-created) |
| ASEPRITE_EXE | No | Path 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_TIMEOUT | No | Generation timeout in seconds | 900 |
| RD_PRESET_FILE | No | Preset store for rd_preset_* | <package>\presets.json |
| RD_EXTENSION_DIR | No | Retro 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 169 tools
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.
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.
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.
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.