MCP server that controls a running GIMP instance via its Script-Fu server, with live-UI support
GimpMCP has 17 well-named tools with consistent verb_noun patterns (open_image, resize_image, list_layers). All tools have descriptions (avg ~120 chars, within baseline 34-392 range). Input schemas are present and typed for all tools. However, parameter descriptions are sparse, many lack detail on constraints, ranges, or expected formats. Output schemas are documented for some tools (get_image_info returns dict with width/height) but missing for others (run_script_fu returns raw string). Error handling is minimal; most tools raise RuntimeError without recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications in metadata. Composition is strong, tools chain well (open_image → export_image) and each has a single responsibility.
Add a new text layer to the image and return the new layer's ID. color_hex is a CSS-style hex color like '#ff0000'.
Close/delete an image from GIMP's memory (does not touch any file on disk).
Crop the image canvas to width x height, anchored at (offset_x, offset_y).
Open the image in a visible GIMP window (requires GIMP running with a GUI).
Export an image to a file. Format is inferred from the path's extension. Non-destructive: works on a temporary flattened duplicate, so the original keeps its layers.
Flatten all layers of an image into a single layer.
Apply a Gaussian blur (roughly `radius` pixels of standard deviation) to the active layer.
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint). Metadata declares risk levels (READ_ONLY, WRITE, REVERSIBLE) but these are not exposed in tool definitions, preventing LLMs from reasoning about side effects.
Parameter descriptions lack constraint details. E.g., color_hex accepts 'CSS-style hex' but no validation pattern or example format. radius in gaussian_blur has no min/max bounds. LLMs cannot infer valid ranges.
Error handling is minimal. Most tools raise RuntimeError with generic messages. No recovery guidance (e.g., 'image_id not found, call list_open_images() to see available IDs'). Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Return width and height (in pixels) for the given image ID.
Check whether GIMP's Script-Fu server is reachable, starting it if needed.
List all layers of an image, top to bottom.
List the image IDs of all images currently open in GIMP.
Create a new RGB image with a single filled background layer; returns the image ID. When show is true (default) it opens in a visible GIMP window.
Load an image file into GIMP and return its numeric image ID. When show is true (default) the image opens in a visible GIMP window if GIMP is running with a GUI.
Flush pending updates so all changes become visible in the GIMP UI.
Scale the entire image (all layers) to the given pixel dimensions.
Execute raw Script-Fu (TinyScheme) code against the running GIMP instance's PDB. Use this for anything the other tools don't cover. Every PDB call returns a list of its results even when there is only one, so extract values with e.g. (car (gimp-file-load RUN-NONINTERACTIVE "path.png" "path.png")). Returns the printed representation of the final evaluated expression.
Sharpen the active layer using an unsharp mask. amount is roughly 0.0-1.0.
Output schemas incomplete. run_script_fu returns raw string with no structure. list_open_images returns list[int] but no documentation of what each int represents or how to use it downstream.
No idempotency guarantees. Tools like export_image, add_text_layer, and resize_image modify state. If an agent retries after a transient failure, duplicate operations may occur (e.g., text layer added twice).