Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

GIMP 3 MCP

PYPI · GIMP3-MCP · SCANNED SEP 21

Let AI assistants paint, edit and export images in a running GIMP 3, with 80 tools.

Available components

65 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
  • 0 of 29 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency32
Schema Quality & AI Usability79
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 13732 tokens (~171/item across 80 items; 80 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (1% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "restart_server" implies "drop" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 81 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the GIMP 3 MCP server?

GIMP 3 MCP runs locally as a PyPI package, launched with uvx gimp3-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · gimp3-mcp

# add to Claude Code
claude mcp add tifyr-gimp3-mcp -- uvx gimp3-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "tifyr-gimp3-mcp": {
      "command": "uvx",
      "args": [
        "gimp3-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "tifyr-gimp3-mcp": {
      "command": "uvx",
      "args": [
        "gimp3-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add tifyr-gimp3-mcp -- uvx gimp3-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tifyr-gimp3-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "gimp3-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add tifyr-gimp3-mcp --command uvx --arg gimp3-mcp
# ~/.hermes/config.yaml
mcp_servers:
  tifyr-gimp3-mcp:
    command: "uvx"
    args: ["gimp3-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "tifyr-gimp3-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "gimp3-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add tifyr-gimp3-mcp -t stdio -c uvx -a gimp3-mcp
// mcp.json
{
  "mcpServers": {
    "tifyr-gimp3-mcp": {
      "command": "uvx",
      "args": [
        "gimp3-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Sept 26 +15
    • Malware scan: unverified → pass security
  • 16 Sept 26 50

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed pypi/gimp3-mcp@0.2.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 29 packages
Packages resolved 29
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 80 exposed · ~13,404 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
invert_colors ~65

Invert all colors in a layer (create a negative). Parameters: - image_index: Target image index (default 0) - layer_name: Layer to invert; defaults to active layer Returns status dict.

NameTypeReqDescription
image_indexinteger
layer_name

No output schema declared.

No examples provided.

invert_selection ~46

Invert the current selection (select what is not selected). Parameters: - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
image_indexinteger

No output schema declared.

No examples provided.

list_brushes ~164

List brushes available to paint_stroke. Parameters: - filter: Optional regular expression matched against brush names, e.g. "Oils|Bristles" Brushes that paint well: "2. Hardness 025" to "100" (plain round), "Acrylic 01"/"03" (dry, textured), "Bristles 01" to "03" (streaky), "Oils 01" to "03" (soft blending), "Charcoal 01"/"Chalk 01" (grainy), "Pencil 02" (sketchy line), "Sponge 01" (soft texture). Returns: {brushes: [name, ...], count}

NameTypeReqDescription
filter

No output schema declared.

No examples provided.

list_fonts ~110

List fonts installed in GIMP. Parameters: - filter: Optional text matched against font names, case-insensitive (e.g. "sans") - limit: Maximum number of names to return (default 100). There can be thousands of fonts: if truncated is true, narrow with filter instead of assuming a font is missing. Returns: {fonts: [font_name, ...], count (returned), total (matching filter), truncated}

NameTypeReqDescription
filter
limitinteger

No output schema declared.

No examples provided.

list_images ~100

List all images currently open in GIMP. Index 0 is the most recently opened or created image, and indices shift when images are opened or closed; image_id stays the same for an image's lifetime. Every image_index parameter uses this order. Returns: - images: list of {index, image_id, name, width, height, color_mode, num_layers, file_path, is_dirty} - count: total number of open images

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_layers ~117

List all layers in an image with their properties. Parameters: - image_index: Target image index (default 0) Returns: {layers: [{index, name, id, visible, opacity, blend_mode, width, height, has_alpha, offsets, active}], count}. Index 0 is the top layer; active marks the layer that tools use when layer_name is omitted. blend_mode uses set_layer_properties names (e.g. "NORMAL"); offsets is [x, y].

NameTypeReqDescription
image_indexinteger

No output schema declared.

No examples provided.

merge_visible_layers ~49

Merge all visible layers into a single layer. Parameters: - image_index: Target image index (default 0) Returns: {layer_name, layer_id}

NameTypeReqDescription
image_indexinteger

No output schema declared.

No examples provided.

modify_selection ~103

Grow, shrink, feather, border, or sharpen the current selection. Parameters: - operation: "grow", "shrink", "feather", "border", "sharpen" - amount: Pixel radius for grow/shrink/feather/border; ignored for sharpen - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
amountnumberyes
image_indexinteger
operationstringyes

No output schema declared.

No examples provided.

new_canvas ~313

Create a new blank canvas in GIMP and open it in a display window. Parameters: - width: Canvas width in pixels - height: Canvas height in pixels - name: Image name reported by list_images, also used for the background layer (default: "Untitled") - color_mode: "RGB" (default), "RGBA", "GRAY", "GRAYA" - fill: Background: "white" (default), "transparent", or a color as hex "#rrggbb" or a basic name (black, white, gray, silver, red, maroon, yellow, olive, lime, green, aqua, teal, blue, navy, fuchsia, purple) - resolution: DPI resolution (default: 72) Returns: - image_id: internal GIMP image ID - name: the image name - width / height: confirmed dimensions - color_mode: confirmed mode - display_opened: whether a GIMP window was opened Examples: - new_canvas(1024, 1024) — white 1024x1024 RGB canvas - new_canvas(1920, 1080, name="Background", fill="black") - new_canvas(512, 512, color_mode="RGBA", fill="transparent")

NameTypeReqDescription
color_modestring
fillstring
heightintegeryes
namestring
resolutioninteger
widthintegeryes

No output schema declared.

No examples provided.

open_image ~110

Open an image file in GIMP and create a display window. Parameters: - file_path: Absolute path to the image file to open (PNG, JPEG, TIFF, etc.) Returns: - image_id: internal GIMP image ID - width / height: image dimensions in pixels - color_mode: RGB / Grayscale / Indexed - num_layers: number of layers in the image - display_opened: whether a GIMP display window was created

NameTypeReqDescription
file_pathstringyes

No output schema declared.

No examples provided.

paint_stroke ~889

Paint a batch of brush strokes, working in rounds like a painter. Paints on an open image. To start a new painting, first call new_canvas(width, height) (white by default), or open a file with open_image. Paint a few strokes (typically 3-30), look at the result (preview=True or get_state_snapshot), then paint the next batch. All strokes in one call land on one layer and form a single undo step in GIMP's own history. To be able to discard a round, paint it on a new layer (create_layer) and remove it with delete_layer. Every stroke is validated before anything is painted. Parameters: - strokes: 1-50 stroke objects. Only "points" is required: - points: [[x, y], ...] in image pixels, 1-2000 points (one point paints a dab). 3-12 points are enough for a curve. - tool: "paintbrush" (default), "pencil" (hard edge), "airbrush", "eraser", "smudge" - brush: Brush name from list_brushes (default "2. Hardness 050") - size: Brush size in pixels, 1-10000 (default 20) - color: Hex "#rrggbb", "#rgb" or "#rrggbbaa", or a basic name like "white" (default: current foreground). rgb() and other names are rejected. Ignored by eraser and smudge. - opacity: 0-100 (default 100) - hardness: 0-1 (default: the brush's own) - angle: -180 to 180 degrees (default 0); aspect_ratio: -20 to 20 (default 0) - spacing: Distance between dabs as a fraction of brush size, 0.01-50 (default: the brush's own) - pressure: "taper" (default; thin ends like a real stroke), "none" (even width), or a list of 0-1 values spread evenly along the stroke, e.g. [0.2, 1, 0.5] (paintbrush, pencil and airbrush only) - taper_affects: "size" (default) or "opacity" (ends fade instead of thinning) - smooth: true (default) turns the points into a smooth curve; false draws straight segments - mode: Blend mode, e.g. "normal" (default), "multiply", "screen", "overlay", "soft_light" - strength: 0-100 (default 50) for airbrush and smudge; applie…

NameTypeReqDescription
image_indexinteger
layer_name
previewboolean
preview_max_sizeinteger
strokesarrayyes

No output schema declared.

No examples provided.

rename_layer ~96

Rename a layer. Parameters: - new_name: New name for the layer - old_name: Current name of the layer to rename - layer_index: Position index alternative to old_name - image_index: Target image index (default 0) Returns: {old_name, new_name}

NameTypeReqDescription
image_indexinteger
layer_index
new_namestringyes
old_name

No output schema declared.

No examples provided.

reorder_layer ~98

Move a layer to a new stack position. Parameters: - new_position: Target stack index, 0 = top (same order as list_layers) - layer_name / layer_index: Identify the layer (defaults to active layer) - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
image_indexinteger
layer_index
layer_name
new_positionintegeryes

No output schema declared.

No examples provided.

resize_canvas ~235

Resize the image canvas without scaling the content. Parameters: - width, height: New canvas dimensions in pixels - anchor: Position of existing content — "center" (default), "top-left", "top", "top-right", "left", "right", "bottom-left", "bottom", "bottom-right" - fill: New canvas areas: "transparent" (default) or a color as hex "#rrggbb" or a basic name (black, white, gray, silver, red, maroon, yellow, olive, lime, green, aqua, teal, blue, navy, fuchsia, purple). A color is painted on a new bottom layer named "Canvas fill"; existing layers and the selection are left as they are - image_index: Target image index (default 0) Returns: {status, width, height, offset_x, offset_y, fill_layer (its name, or null)}

NameTypeReqDescription
anchorstring
fillstring
heightintegeryes
image_indexinteger
widthintegeryes

No output schema declared.

No examples provided.

restart_server ~72

Drop and re-establish the connection to the GIMP MCP plugin. Use this when: - GIMP was restarted after the MCP client was already running - The socket connection dropped mid-session - check_server() shows not connected but GIMP is open Returns the new connection status (same format as check_server).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

rotate_image ~90

Rotate the entire image. Parameters: - angle: Rotation in degrees — 90, 180, 270 use lossless GIMP rotation; other values rotate all layers about the center with interpolation, enlarge the canvas to fit, and flatten - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
anglenumberyes
image_indexinteger

No output schema declared.

No examples provided.

sample_color ~197

Pick a color from the canvas, like a painter's eyedropper. Same as get_pixel_color, plus optional averaging over a radius. Parameters: - x, y: Image coordinates in pixels - radius: Average the color over this many pixels around the point (default 0 = one pixel) - sample_merged: true (default) samples what is visible across all layers; false samples one layer - layer_name: Layer to sample when sample_merged is false; defaults to the active layer - image_index: Target image index (default 0) Returns: {color_hex: "#rrggbb" (sRGB, usable as a paint_stroke color), alpha: 0-1}

NameTypeReqDescription
image_indexinteger
layer_name
radiusnumber
sample_mergedboolean
xnumberyes
ynumberyes

No output schema declared.

No examples provided.

save_xcf ~102

Save the current image as a GIMP XCF file (preserves all layers and metadata). Parameters: - file_path: Absolute path for the output .xcf file - image_index: Index of the image to save (default 0 = most recently opened; see list_images) Returns: - status: "success" or "error" - file_path: confirmed output path

NameTypeReqDescription
file_pathstringyes
image_indexinteger

No output schema declared.

No examples provided.

scale_image ~100

Scale an image to exact pixel dimensions. Parameters: - width: Target width in pixels - height: Target height in pixels - interpolation: "cubic" (default), "linear", "none" - image_index: Target image index (default 0) Returns: {status, width, height}

NameTypeReqDescription
heightintegeryes
image_indexinteger
interpolationstring
widthintegeryes

No output schema declared.

No examples provided.

scale_to_fit ~119

Scale an image to fit within a bounding box, preserving aspect ratio. Parameters: - max_width: Maximum allowed width in pixels - max_height: Maximum allowed height in pixels - interpolation: "cubic" (default), "linear", "none" - image_index: Target image index (default 0) Returns: {status, width, height} — final dimensions after scaling

NameTypeReqDescription
image_indexinteger
interpolationstring
max_heightintegeryes
max_widthintegeryes

No output schema declared.

No examples provided.

select_all ~40

Select the entire image canvas. Parameters: - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
image_indexinteger

No output schema declared.

No examples provided.

select_by_color ~168

Select regions by color similarity. Parameters: - color: Target color as hex "#rrggbb" or a basic name (black, white, gray, silver, red, maroon, yellow, olive, lime, green, aqua, teal, blue, navy, fuchsia, purple) - threshold: Color similarity tolerance 0-255 (default 15) - operation: "replace" (default), "add", "subtract", "intersect" - image_index: Target image index (default 0) - layer_name: Layer to sample from; defaults to active layer Returns status dict.

NameTypeReqDescription
colorstringyes
image_indexinteger
layer_name
operationstring
thresholdinteger

No output schema declared.

No examples provided.

select_ellipse ~135

Create an elliptical selection. Parameters: - x, y: Top-left corner of the bounding box - width, height: Bounding box dimensions - operation: "replace" (default), "add", "subtract", "intersect" - feather: Feather radius in pixels (default 0) - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
feathernumber
heightintegeryes
image_indexinteger
operationstring
widthintegeryes
xintegeryes
yintegeryes

No output schema declared.

No examples provided.

select_none ~41

Remove / deselect all selections. Parameters: - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
image_indexinteger

No output schema declared.

No examples provided.

select_rectangle ~137

Create a rectangular selection. Parameters: - x, y: Top-left corner of the selection - width, height: Dimensions of the selection - operation: "replace" (default), "add", "subtract", "intersect" - feather: Feather radius in pixels (default 0 = no feather) - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
feathernumber
heightintegeryes
image_indexinteger
operationstring
widthintegeryes
xintegeryes
yintegeryes

No output schema declared.

No examples provided.

set_active_image ~100

Raise a specific image's window to the front in GIMP. Works for images opened with new_canvas or open_image. GIMP 3 gives plug-ins no way to find windows opened from GIMP's own menus, so those return an error; every other tool still works on them by image_index. Parameters: - image_index: Index of the image to activate (from list_images) Returns status dict.

NameTypeReqDescription
image_indexintegeryes

No output schema declared.

No examples provided.

set_colors ~113

Set the GIMP foreground and/or background color. Parameters: - foreground: New foreground color as hex "#rrggbb" or a basic name (black, white, gray, silver, red, maroon, yellow, olive, lime, green, aqua, teal, blue, navy, fuchsia, purple); omit to leave unchanged - background: New background color, same formats; omit to leave unchanged Returns: {foreground, background} confirmation dict.

NameTypeReqDescription
background
foreground

No output schema declared.

No examples provided.

set_layer_properties ~192

Set properties on an existing layer. Parameters: - layer_name / layer_index: Identify the layer (defaults to active layer) - opacity: New opacity 0-100 (omit to leave unchanged) - blend_mode: Omit to leave unchanged, or one of NORMAL (default), MULTIPLY, SCREEN, OVERLAY, DARKEN, LIGHTEN, DODGE, BURN, HARD_LIGHT, SOFT_LIGHT, DIFFERENCE, HUE, SATURATION, COLOR, LUMINOSITY or DISSOLVE (case-insensitive; other names are rejected) - visible: True/False visibility (omit to leave unchanged) - image_index: Target image index (default 0) Returns status dict.

NameTypeReqDescription
blend_mode
image_indexinteger
layer_index
layer_name
opacity
visible

No output schema declared.

No examples provided.

sharpen ~131

Sharpen a layer using unsharp mask. Parameters: - amount: Sharpening strength 0-500 (default 50.0) - radius: Blur radius for the mask in pixels (default 3.0) - threshold: Minimum difference before sharpening is applied (default 0) - image_index: Target image index (default 0) - layer_name: Layer to sharpen; defaults to active layer Returns status dict.

NameTypeReqDescription
amountnumber
image_indexinteger
layer_name
radiusnumber
thresholdinteger

No output schema declared.

No examples provided.

warp_region ~338

Disabled: always returns an error and leaves the image unchanged. On GIMP 3.2 this erased the whole layer instead of warping it, and GIMP 3.2 gives plug-ins no working warp operation. Use GIMP's Warp Transform tool by hand. Parameters: - vectors: List of warp stroke dicts, each with: - x, y : center of the warp influence (pixels) - dx, dy : push direction — negative dy = push upward - radius : influence radius in pixels (default: 40) - amount : deform strength 0–1 (default: 0.3) - image_index: Which open image to edit (default: 0) - layer_name: Target layer; omit to use the active/top layer 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}

NameTypeReqDescription
image_indexinteger
layer_name
vectorsarrayyes

No output schema declared.

No examples provided.

Common questions

What is the GIMP 3 MCP server?

GIMP 3 MCP is listed in the public MCP registry as io.github.tifyr/gimp3-mcp. Let AI assistants paint, edit and export images in a running GIMP 3, with 80 tools. This page covers its PyPI package (gimp3-mcp).

Is the GIMP 3 MCP server safe to use?

GIMP 3 MCP scores 65 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the GIMP 3 MCP server expose?

GIMP 3 MCP exposes 80 tools: check_server, restart_server, new_canvas, get_image_bitmap, get_image_metadata, and 75 more. Their descriptions and schemas cost roughly 13,404 tokens of context every time the server is loaded.

Is the GIMP 3 MCP server still maintained?

GIMP 3 MCP is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.