gimp-mcp-studio
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GIMP_MCP_OPERATION_TIMEOUT | No | Overrides the operation timeout in seconds. The value is bounded to 1-600 seconds. | |
| GIMP_MCP_ALLOW_UNSAFE_PYTHON | No | Set to 1 to enable raw Python execution through call_api for the MCP server and plug-in. Typed tools and PDB access should be preferred. | 0 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
GIMP integration through MCP: focused editing tools, live PDB procedure discovery with typed execution, and progressive GEGL filter discovery/description with editable non-destructive filters.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_serverA | Check whether the GIMP MCP plugin socket is reachable and responding. Returns a status dict:
Use this before any other operation to verify the GIMP plugin is running. If not connected, open GIMP and run Tools > Start MCP Server. |
| restart_serverA | Drop and re-establish the connection to the GIMP MCP plugin. Use this when:
Returns the new connection status (same format as check_server). |
| new_canvasA | Create a new blank canvas in GIMP and open it in a display window. Parameters:
Returns:
Examples:
|
| get_image_bitmapA | Get the current open image in GIMP as an Image object with optional scaling and region selection. No size restrictions — pass any max_width/max_height you need. For large images, omit max_width/max_height to get the full resolution. Supports two main use cases:
Parameters:
Examples:
Returns:
The returned Image object automatically handles base64 encoding and MIME types according to the Model Context Protocol specification. Raises:
|
| get_image_metadataA | Get metadata about the current open image in GIMP without the bitmap data. Returns detailed information about the currently active image including:
This is much faster than get_image_bitmap() since it doesn't export the actual image data. Perfect for when you only need to know image properties for decision making. Returns:
|
| get_gimp_infoA | Get comprehensive information about the GIMP installation and environment. Returns detailed information about GIMP that AI assistants need to understand the current environment, including:
This information helps AI assistants provide better support and troubleshooting by understanding the specific GIMP setup they're working with. Returns:
|
| get_state_snapshotA | Return a live visual snapshot of the current image state — no file save needed. AI agents call this to get immediate visual feedback after any edit operation, letting them verify results and decide next steps without saving to disk. Parameters:
Returns:
Typical agent workflow: 1. open_image / new_canvas 2. 3. get_state_snapshot() ← see result, decide next step 4. 5. get_state_snapshot(region={"x":200,"y":300,"width":100,"height":80}) 6. export_image when satisfied |
| get_context_stateA | Get the current GIMP context state (colors, brush, settings). IMPORTANT: Context state can be changed by the user in GIMP UI at any time. Check context state before operations that depend on specific settings. Returns information about:
Use cases:
Returns:
|
| call_apiA | Call GIMP 3.2 API methods through PyGObject console. GIMP MCP Protocol:
For image operations, use get_image_bitmap() which return proper MCP Image objects that Claude can process directly. GUIDANCE PROMPTS:
Optional Initialization Pattern: ["images = Gimp.get_images()", "image1 = images[0]", "layers = image1.get_layers()", "layer1 = layers[0]", "drawable1 = layer1"] Common Operations:
Important Tips:
GIMP 3.2 API Changes:
Parameters:
Returns:
|
| open_imageA | Open an image file in GIMP and create a display window. Parameters:
Returns:
|
| save_xcfA | Save the current image as a GIMP XCF file (preserves all layers and metadata). Parameters:
Returns:
|
| export_imageA | Export the current image to a raster file (PNG, JPEG, WEBP, TIFF). Parameters:
Returns:
|
| batch_exportA | Export all open images (or a specific one) to a directory. Parameters:
Returns:
|
| auto_levelsB | Automatically stretch the tonal range of an image (auto levels / auto stretch contrast). Parameters:
Returns status dict. |
| adjust_curvesB | Adjust tonal curves for a layer. Parameters:
Returns status dict. |
| adjust_brightness_contrastB | Adjust brightness and contrast of a layer. Parameters:
Returns status dict. |
| adjust_hue_saturationB | Adjust hue, saturation, and lightness of a layer. Parameters:
Returns status dict. |
| adjust_color_balanceB | Adjust color balance (shadows / midtones / highlights) of a layer. Parameters:
Returns status dict. |
| sharpenB | Sharpen a layer using unsharp mask. Parameters:
Returns status dict. |
| blurB | Apply Gaussian blur to a layer. Parameters:
Returns status dict. |
| denoiseB | Reduce noise in a layer using GEGL noise-reduction. Parameters:
Returns status dict. |
| desaturateB | Convert a layer to grayscale (desaturate). Parameters:
Returns status dict. |
| invert_colorsB | Invert all colors in a layer (create a negative). Parameters:
Returns status dict. |
| scale_imageA | Scale an image to exact pixel dimensions. Parameters:
Returns: {status, width, height} |
| scale_to_fitA | Scale an image to fit within a bounding box, preserving aspect ratio. Parameters:
Returns: {status, width, height} — final dimensions after scaling |
| crop_to_selectionB | Crop the image canvas to the current selection bounds. Parameters:
Returns: {status, x, y, width, height} — crop region applied |
| crop_to_rectB | Crop the image canvas to an explicit rectangle. Parameters:
Returns: {status, x, y, width, height} |
| rotate_imageB | Rotate the entire image. Parameters:
Returns status dict. |
| flip_imageB | Flip the entire image horizontally or vertically. Parameters:
Returns status dict. |
| resize_canvasA | Resize the image canvas without scaling the content. Parameters:
Returns: {status, width, height, offset_x, offset_y} |
| select_rectangleB | Create a rectangular selection. Parameters:
Returns status dict. |
| select_ellipseB | Create an elliptical selection. Parameters:
Returns status dict. |
| select_by_colorB | Select regions by color similarity. Parameters:
Returns status dict. |
| select_allC | Select the entire image canvas. Parameters:
Returns status dict. |
| select_noneB | Remove / deselect all selections. Parameters:
Returns status dict. |
| invert_selectionC | Invert the current selection (select what is not selected). Parameters:
Returns status dict. |
| modify_selectionB | Grow, shrink, feather, border, or sharpen the current selection. Parameters:
Returns status dict. |
| create_layerA | Create and insert a new layer into an image. Parameters:
Returns: {layer_name, layer_id, width, height, position} |
| import_layerA | Import an existing local asset as a layer into the owned, already open image. Preserves the file's pixels/alpha and native dimensions. x/y are exact canvas pixel offsets; position is the top-to-bottom insertion index (0 means top). Does not open another image. Returns actual layer ID, name, bounds and image ID. |
| duplicate_layerA | Duplicate a layer and insert the copy above it. Parameters:
Returns: {layer_name, layer_id} |
| delete_layerB | Delete a layer from an image. Parameters:
Provide either layer_name or layer_index. Defaults to active layer if neither given. Returns status dict. |
| rename_layerB | Rename a layer. Parameters:
Returns: {old_name, new_name} |
| set_layer_propertiesA | Set properties on an existing layer. Parameters:
Returns status dict. |
| reorder_layerB | Move a layer to a new stack position. Parameters:
Returns status dict. |
| flatten_imageB | Flatten all layers into a single background layer. Parameters:
Returns status dict. |
| merge_visible_layersB | Merge all visible layers into a single layer. Parameters:
Returns: {layer_name, layer_id} |
| list_layersB | List all layers in an image with their properties. Parameters:
Returns: {layers: [{name, id, visible, opacity, blend_mode, width, height, has_alpha}], count} |
| transform_layerA | Apply a bounded, named-layer 2D transform without changing the canvas. Rotation is in degrees. Translation and optional pivot coordinates are image pixels. The default pivot is the layer center. This changes visible pixels; it does not invent a new camera view or reveal hidden product surfaces. |
| gegl_list_operationsC | Discover installed GIMP 3.2 GEGL filters with paging; patterns are case-insensitive regex. |
| gegl_describe_operationC | Inspect a live GEGL filter's property schema on a layer before applying it. |
| gegl_apply_filterC | Append a named, editable, non-destructive GEGL filter to a layer. |
| gegl_list_filtersC | List the editable non-destructive filters attached to a layer. |
| gegl_filter_actionB | Change a filter's visibility/opacity or remove it by its GIMP filter ID. |
| fill_layerB | Fill an entire layer with a solid color. Parameters:
Returns status dict. |
| fill_selectionB | Fill the current selection with a color or fill type. Parameters:
Returns status dict. |
| set_colorsA | Set the GIMP foreground and/or background color. Parameters:
Returns: {foreground, background} confirmation dict. |
| draw_lineA | Draw a straight line on a layer. Parameters:
Returns status dict. |
| draw_rectangleA | Draw a rectangle outline (stroke only) on a layer. Parameters:
Returns status dict. |
| draw_ellipseA | Draw an ellipse outline (stroke only) on a layer. Parameters:
Returns status dict. |
| fill_rectangleB | Fill a rectangular region with a solid color. Parameters:
Returns status dict. |
| fill_ellipseB | Fill an elliptical region with a solid color. Parameters:
Returns status dict. |
| gradient_fillA | Fill a layer or selection with a gradient. Parameters:
Returns status dict. |
| add_textA | Add a text layer to an image. Parameters:
Returns: {layer_name, layer_id, text_width, text_height, position} |
| edit_textA | Edit an existing text layer's content or formatting. Parameters:
Returns status dict. |
| list_fontsB | List available fonts installed in GIMP. Parameters:
Returns: {fonts: [font_name, ...], count} |
| apply_drop_shadowB | Apply a drop shadow effect to a layer. Parameters:
Returns status dict. |
| apply_gaussian_blurB | Apply Gaussian blur as a destructive filter operation. Parameters:
Returns status dict. |
| apply_pixelateB | Pixelate a layer using a mosaic/block effect. Parameters:
Returns status dict. |
| apply_embossA | Apply an emboss (bas-relief) effect to a layer. Parameters:
Returns status dict. |
| apply_vignetteB | Apply a vignette darkening effect around the edges of a layer. Parameters:
Returns status dict. |
| apply_noiseB | Add noise/grain to a layer. Parameters:
Returns status dict. |
| export_icon_sizesA | Export an image as a complete icon set for Android or iOS. Android sizes: 48 (mdpi), 72 (hdpi), 96 (xhdpi), 144 (xxhdpi), 192 (xxxhdpi), 512 (Play Store) iOS sizes: 20x1/2/3, 29x1/2/3, 40x2/3, 60x2/3, 76x1/2, 83.5x2, 1024x1 Parameters:
Returns: {exported: [{size, file_path}], count, platform} |
| export_web_optimizedA | Export an image as both JPEG and PNG, choosing the smaller format. Parameters:
Returns: {jpeg_path, jpeg_size, png_path, png_size, recommendation} |
| warp_regionA | Warp / liquify a region of the image by pushing pixels in a direction. Uses GEGL warp (GIMP 3 native) with plug-in-iwarp fallback. Ideal for subtle facial expression edits — e.g. turning a neutral mouth into a smile by pushing the mouth corners upward. Parameters:
Examples — make a character smile: warp_region(vectors=[ {"x": 215, "y": 355, "dx": 5, "dy": -8, "radius": 18, "amount": 0.45}, {"x": 295, "y": 355, "dx": -5, "dy": -8, "radius": 18, "amount": 0.45}, {"x": 255, "y": 370, "dx": 0, "dy": -4, "radius": 22, "amount": 0.30}, ]) Returns: {"warped_vectors": N} |
| batch_resizeA | Resize all open images to a common target size. Parameters:
Returns: {results: [{image_id, old_width, old_height, new_width, new_height}], count} |
| export_sprite_sheetA | Combine multiple frames into a sprite sheet PNG. Parameters:
Returns: {file_path, columns, rows, frame_width, frame_height, count} |
| export_social_media_kitA | Export an image resized for multiple social media platforms. Platform sizes (all in pixels):
Parameters:
Returns: {exported: [{platform, file_path, width, height}], count} |
| list_imagesA | List all images currently open in GIMP. Returns:
|
| set_active_imageA | Raise a specific image to the front / make it active in GIMP. Parameters:
Returns status dict. |
| undoB | Undo one or more operations on an image. Parameters:
Returns: {steps_undone} |
| redoA | Redo one or more previously undone operations on an image. Parameters:
Returns: {steps_redone} |
| convert_color_modeB | Convert an image to a different color mode. Parameters:
Returns status dict. |
| close_imageB | Close an image, optionally saving as XCF first. Parameters:
Returns status dict. |
| get_selection_boundsB | Get the bounding rectangle of the current selection. Parameters:
Returns: {has_selection, x, y, width, height} |
| get_pixel_colorB | Get the color of a single pixel. Parameters:
Returns: {color_hex, color_rgb: [r, g, b], alpha} |
| get_histogramA | Get histogram statistics for a channel of the active layer. Parameters:
Returns: {mean, median, std_dev, min, max, pixels, count} |
| pdb_searchA | Search procedures installed in this GIMP instance (read-only discovery). Use this when a focused tool does not cover the operation. Search any of GIMP's PDB metadata fields (name, blurb, help, help_id, authors, copyright, date, proc_type) using a regex, then call pdb_describe before execution. Results are paged because GIMP commonly exposes hundreds of procedures. |
| pdb_describeA | Inspect a GIMP PDB procedure's argument and return schemas without running it. |
| pdb_runA | Run one installed GIMP PDB procedure using named JSON-compatible arguments. This can modify the current document. Search and describe first. Procedures accept JSON scalars and arrays; object values use explicit references such as {"$ref": "image", "index": 0} or {"$ref": "layer", "index": 0, "image_index": 0}. Layer indices include nested layers. Drawable references resolve against the image's selected drawables. Inspect the schema first. Arbitrary Python/Scheme evaluation and GIMP shutdown procedures are blocked. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| gimp_best_practices | GIMP MCP best practices for common operations - filling shapes, bezier paths, and variable persistence |
| gimp_iterative_workflow | Iterative workflow guidance for building complex images with proper validation and layer management |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 89 tools
Most tools map to a distinct operation, but several pairs overlap significantly: blur vs apply_gaussian_blur (both Gaussian blur, destructive vs non-destructive), get_image_bitmap vs get_state_snapshot (both return a PNG of the current image), and scale_image vs scale_to_fit vs batch_resize. The generic escape hatches (pdb_run, call_api, gegl_apply_filter) also overlap with the focused effect tools (sharpen, denoise, apply_pixelate), forcing agents to guess which path is intended.
The set is overwhelmingly snake_case verb_noun (create_layer, select_rectangle, export_image, apply_noise), which is predictable. Deviations are minor: some filters use a bare verb (sharpen, blur, denoise) while siblings use apply_ (apply_emboss, apply_vignette), and the gegl_/pdb_ namespaces put the qualifier before the verb (gegl_list_filters vs list_layers).
89 tools is far beyond the practical range and clearly over-scoped; the effect/filter surface alone is split across dozens of near-duplicate entries (adjust_curves, auto_levels, adjust_brightness_contrast vs the GEGL filter tools). While image editing is a broad domain, a large fraction of these tools could be consolidated without losing capability.
Coverage is unusually thorough: lifecycle (new/open/save/export/close), layers, selections, transforms, drawing, text, filters, batch operations, and named export presets are all present. Gaps remain around layer masks, channels, and paths, but pdb_run/call_api provide a workaround for those.