GIMP Studio MCP
PYPI · TWELVETAKE-GIMP-STUDIO-MCP · SCANNED OCT 4
Lets an AI assistant edit images in GIMP 3, including print and DTF transfer prep.
Available components
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 build step with no custom scripting around it. View diagnostics → Pass
- 0 of 28 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to TwelveTake-Studios/gimp-studio-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 4 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability69
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 9684 tokens (~81/item across 119 items; 119 tools + 0 resources), lean.Pass
- 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 Coverage67
- 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
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "gimp_exec" implies "exec" 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 120 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.
How do I install the GIMP Studio MCP server?
GIMP Studio MCP runs locally as a PyPI package, launched with uvx twelvetake-gimp-studio-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 · twelvetake-gimp-studio-mcp
claude mcp add com-twelvetake-gimp-studio-mcp -- uvx twelvetake-gimp-studio-mcp
{
"mcpServers": {
"com-twelvetake-gimp-studio-mcp": {
"command": "uvx",
"args": [
"twelvetake-gimp-studio-mcp"
]
}
}
} {
"servers": {
"com-twelvetake-gimp-studio-mcp": {
"command": "uvx",
"args": [
"twelvetake-gimp-studio-mcp"
]
}
}
} codex mcp add com-twelvetake-gimp-studio-mcp -- uvx twelvetake-gimp-studio-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-twelvetake-gimp-studio-mcp": {
"type": "local",
"command": [
"uvx",
"twelvetake-gimp-studio-mcp"
],
"enabled": true
}
}
} openclaw mcp add com-twelvetake-gimp-studio-mcp --command uvx --arg twelvetake-gimp-studio-mcp
mcp_servers:
com-twelvetake-gimp-studio-mcp:
command: "uvx"
args: ["twelvetake-gimp-studio-mcp"] {
"McpServers": {
"com-twelvetake-gimp-studio-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"twelvetake-gimp-studio-mcp"
]
}
}
} assistant mcp add com-twelvetake-gimp-studio-mcp -t stdio -c uvx -a twelvetake-gimp-studio-mcp
{
"mcpServers": {
"com-twelvetake-gimp-studio-mcp": {
"command": "uvx",
"args": [
"twelvetake-gimp-studio-mcp"
]
}
}
} 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.
- 30 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 29 Sept 26 61
First indexed and scored.
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 7 Oct 2026 · Analysed pypi/twelvetake-gimp-studio-mcp@0.3.4
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | TwelveTake-Studios/gimp-studio-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/TwelveTake-Studios/gimp-studio-mcp/.github/workflows/publish.yml@refs/tags/v0.3.4 |
| Rekor log index | 3005126583 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:546f91479bbf6134b1a41b19bea981fe512b71f5192e9d0e3612aa522bb9a986 |
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 28 packages
| Packages resolved | 28 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 →
add_alpha ~30
Add an alpha channel to the layer if it lacks one.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
add_mask ~126
Add a layer mask. mask_type: white|black|alpha|alpha-transfer| selection|copy|channel. Omit `layer` for the selected/top layer. For mask_type='channel' pass `channel` (id/name) as the source, or have a channel already selected; with neither, channel masks return supported=False (GIMP 3.0.4 create_mask(CHANNEL) needs a selected channel and exposes no source-channel parameter).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | – | – | – |
| image | – | – | – |
| layer | – | – | – |
| mask_type | string | – | – |
No output schema declared.
No examples provided.
apply_filter ~85
Apply any GEGL operation to a layer (destructive merge). `op` = full op name e.g. 'gegl:pixelize'. `params` = {property: value} (underscores become hyphens; color-like values auto-coerced).
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| op | string | yes | – |
| params | – | – | – |
No output schema declared.
No examples provided.
apply_mask ~36
Merge the layer's mask into its alpha (destructive). No-op if no mask.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
assign_profile ~56
Tag the image with an ICC profile WITHOUT converting pixels (assign). `icc_path` = path to a .icc/.icm file. RGB/working-space use.
| Name | Type | Req | Description |
|---|---|---|---|
| icc_path | string | yes | – |
| image | – | – | – |
No output schema declared.
No examples provided.
bleed_and_safe ~59
Add a bleed margin (resize canvas by bleed_in on each side) and report the inner safe-area rect (inset by safe_in).
| Name | Type | Req | Description |
|---|---|---|---|
| bleed_in | number | – | – |
| image | – | – | – |
| safe_in | number | – | – |
No output schema declared.
No examples provided.
brightness_contrast ~54
Adjust brightness and contrast. Each ranges -1.0..1.0 (0 = no change).
| Name | Type | Req | Description |
|---|---|---|---|
| brightness | number | – | – |
| contrast | number | – | – |
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
bucket_fill ~81
Flood-fill from seed point (x, y) with `color` (or current fg). mode = layer-mode name (e.g. 'normal', 'multiply').
| Name | Type | Req | Description |
|---|---|---|---|
| color | – | – | – |
| image | – | – | – |
| layer | – | – | – |
| mode | – | – | – |
| opacity | – | – | – |
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
check_fonts ~27
Report availability of each font name -> {name: bool}.
| Name | Type | Req | Description |
|---|---|---|---|
| fonts | array | yes | – |
No output schema declared.
No examples provided.
checkpoint ~53
Snapshot an image (a real duplicate) so you can restore() it later. Returns a numeric checkpoint_id. `image` = id/basename, or omit for active.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| label | – | – | – |
No output schema declared.
No examples provided.
clean_for_dtf ~132
Binarize the ALPHA channel at `threshold` (0-1, default 0.5): pixels below it -> fully transparent (drops faint dust/noise), at/above -> fully opaque (crisp ink edges for film). RGB is untouched. NOTE: this HARDENS every soft/anti-aliased edge and drops intentional low-alpha interior detail (faint gradients / highlights) below the threshold — skip it, or lower the threshold, when the art has soft edges worth keeping.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| threshold | number | – | – |
No output schema declared.
No examples provided.
color_at ~50
Sample one pixel: returns {rgba:[r,g,b,a]} (0-255).
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| x | integer | yes | – |
| y | integer | yes | – |
No output schema declared.
No examples provided.
color_balance ~91
Shift color balance for a tonal range: shadows|midtones|highlights. Each channel pair is -100..100; preserve_lum keeps luminosity.
| Name | Type | Req | Description |
|---|---|---|---|
| cyan_red | number | – | – |
| image | – | – | – |
| layer | – | – | – |
| magenta_green | number | – | – |
| preserve_lum | boolean | – | – |
| range | string | – | – |
| yellow_blue | number | – | – |
No output schema declared.
No examples provided.
color_to_alpha ~194
SOFT knockout: remove a color to transparency with graded alpha (destructive; gegl:color-to-alpha). color: name/#rrggbb. The colour is subtracted from every pixel that contains it, so edges and matching interior tones fade smoothly — great for feathered/anti-aliased backgrounds (e.g. a clean black knockout from #000000 at threshold ~0.15-0.20). Higher `transparency_threshold` (0-1) removes a wider band of near-target colours; `opacity_threshold` (0-1) sets where fully-opaque begins. For a CRISP, hard-edged cut (select-by-colour + delete, no fade) use `cutout_color`.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | – |
| image | – | – | – |
| layer | – | – | – |
| opacity_threshold | number | – | – |
| transparency_threshold | number | – | – |
No output schema declared.
No examples provided.
convert_profile ~77
Convert pixels into the target ICC working space (RGB/working-space only). intent: perceptual|relative-colorimetric|saturation|absolute-colorimetric. bpc = black-point compensation.
| Name | Type | Req | Description |
|---|---|---|---|
| bpc | boolean | – | – |
| icc_path | string | yes | – |
| image | – | – | – |
| intent | string | – | – |
No output schema declared.
No examples provided.
create_layer ~83
Create a new transparent RGBA layer (default sized to the image) and insert it at `position` (0=top) under optional `parent` group.
| Name | Type | Req | Description |
|---|---|---|---|
| height | – | – | – |
| image | – | – | – |
| name | string | yes | – |
| opacity | number | – | – |
| parent | – | – | – |
| position | integer | – | – |
| width | – | – | – |
No output schema declared.
No examples provided.
create_text_layer ~108
Create a text layer. font=name (else context font); size in px; color by name/#hex/(r,g,b); justify=left|right|center|fill; x/y = position offsets.
| Name | Type | Req | Description |
|---|---|---|---|
| color | – | – | – |
| font | – | – | – |
| image | – | – | – |
| justify | – | – | – |
| letter_spacing | – | – | – |
| line_spacing | – | – | – |
| size | number | – | – |
| text | string | yes | – |
| x | – | – | – |
| y | – | – | – |
No output schema declared.
No examples provided.
curves ~94
Apply a spline curve. `points` = flat [x0,y0,x1,y1,...] control points in 0.0-1.0, in LINEAR light like levels (not the sRGB values color_at reports). channel: value|red|green|blue|alpha.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | – |
| image | – | – | – |
| layer | – | – | – |
| points | array | yes | – |
No output schema declared.
No examples provided.
cutout_color ~290
HARD knockout: select a colour and DELETE it to transparency — the crisp, predictable cutout (the tool form of by-hand 'add alpha -> select by colour -> delete'). Auto-adds alpha. WYSIWYG: no auto-mode, no defringe, no alpha-clean. Colour to remove: explicit `color` (name/#hex/rgb) OR a `sample_xy=[x,y]` eyedropper (one is required). `threshold` (0-1, default 0.15) = colour-match tolerance. `contiguous=True` removes only the edge-connected region (keeps interior areas that reuse the colour); seeds from `sample_xy` if given, else the nearest-matching corner. `antialias` (default on) smooths the cut edge; `feather` softens it further. For a soft/graded knockout use `color_to_alpha`. Returns the colour used, `cleared`, `content_bbox` as `[x1,y1,x2,y2]` (or null), and canonical `layer`/`image` ids.
| Name | Type | Req | Description |
|---|---|---|---|
| antialias | boolean | – | – |
| color | – | – | – |
| contiguous | boolean | – | – |
| feather | number | – | – |
| image | – | – | – |
| layer | – | – | – |
| sample_xy | – | – | – |
| threshold | number | – | – |
No output schema declared.
No examples provided.
delete_layer ~37
Remove a layer from the image. `layer` = id/name, or omit for active.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
desaturate ~48
Convert to grayscale values in place. mode: luminance|luma|lightness| average|value.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| mode | string | – | – |
No output schema declared.
No examples provided.
describe_op ~31
Introspect a GEGL op: categories, description, and its properties.
| Name | Type | Req | Description |
|---|---|---|---|
| op | string | yes | – |
No output schema declared.
No examples provided.
despill ~55
Reduce edge color spill left over from a knockout (best-effort approximation; flag if results are off).
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | – | – |
| color | string | – | – |
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
drop_shadow ~187
Add a drop shadow to a layer (gegl:dropshadow). x/y = offset, blur = shadow radius, grow = shadow expansion, color = name/'#rrggbb'/(r,g,b). NOTE: gegl:dropshadow ENLARGES the target layer and shifts its offsets so the soft shadow has room to render (verified on GIMP 3.0.4: a 64x48 layer at (0,0) became 116x100 at (-20,-20)). The layer may therefore extend beyond the canvas; flatten or crop afterward if you need it clipped.
| Name | Type | Req | Description |
|---|---|---|---|
| blur | number | – | – |
| color | string | – | – |
| grow | number | – | – |
| image | – | – | – |
| layer | – | – | – |
| opacity | number | – | – |
| x | number | – | – |
| y | number | – | – |
No output schema declared.
No examples provided.
duplicate_layer ~50
Duplicate a layer; the copy is inserted just above the original. `layer` = id/name, or omit for the active layer.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| name | – | – | – |
No output schema declared.
No examples provided.
edge_choke ~56
Pull the art's effective alpha edge inward by `pixels` (trims a thin rim — useful before underbase or to remove fringing).
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| pixels | integer | – | – |
No output schema declared.
No examples provided.
edge_spread ~73
Grow (dilate) the art's alpha edge outward by `pixels`, fattening the artwork and carrying the edge colour into the grown ring (morphological alpha dilate via gegl:median-blur).
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| pixels | integer | – | – |
No output schema declared.
No examples provided.
export_dtf_png ~149
Export a transparent, print-ready PNG. PRESERVES ALPHA — merges visible layers WITHOUT flattening (flattening would drop alpha and ruin the DTF transfer). DPI: if `dpi` is given the file is tagged at it; if OMITTED the file inherits the image's CURRENT resolution (e.g. whatever `print_geometry` set). This only writes the DPI tag — it never resamples pixels, so set the physical print size with `print_geometry` FIRST, then export. Works on a duplicate (source untouched); returns the saved path and the DPI tag written.
| Name | Type | Req | Description |
|---|---|---|---|
| dpi | – | – | – |
| image | – | – | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
export_image ~182
Export an image to a file (format by extension: png/jpg/tiff/webp/...). Works on a COPY — the source image is never modified. ALPHA-SAFE: transparency is PRESERVED by default for formats that support it (png/tiff/webp/tga/gif) and only flattened for formats that can't hold alpha (jpg/bmp) — so a transparent cutout isn't silently ruined. `flatten=True` forces a flattened opaque export; `flatten=False` forces keep-alpha (merge visible, no flatten). For DTF PNGs prefer `export_dtf_png` (also tags DPI). Returns {saved, format, flattened, alpha (kept in the file?), had_alpha, warning (set when alpha had to be dropped)}.
| Name | Type | Req | Description |
|---|---|---|---|
| flatten | – | – | – |
| image | – | – | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
fill ~55
Fill the whole drawable. fill_type: foreground|background|white| transparent|pattern. `layer`/`image` optional (default active).
| Name | Type | Req | Description |
|---|---|---|---|
| fill_type | string | – | – |
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
flatten ~23
Flatten the image to a single layer. Destructive.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
No output schema declared.
No examples provided.
foreground_select ~473
Edge-aware SUBJECT selection via SIOX/matting (gimp-drawable-foreground-extract). Refines a ROUGH hint into a clean foreground selection — good for hair/soft/complex edges and backgrounds that AREN'T a flat colour (where cutout_color / select_by_color fail). It is SEMI-automatic: it needs a rough hint and does NOT auto-detect the subject. Rough hint: pass a bounding box `x, y, w, h` roughly around the subject, OR make a rough selection first and omit the box. `band` = px the hint is grown / shrunk to form the 'unknown' boundary ring the matting solves (so the ring is ~2*band wide; default auto from the region size; larger = more slack for an imprecise hint). Internally builds a trimap (shrink→foreground / grow→background / the ring between→unknown), runs matting, and REPLACES the selection with the refined matte. KNOWN LIMITATION — the hint must roughly FIT the subject's shape. Everything inside the shrunk hint is treated as definite foreground, so if the subject does NOT fill its box (an irregular shape, or several subjects with background showing between them), that interior background is KEPT and only the edge band is refined. A rectangular box works when the subject fills it; for an irregular subject give a rough OUTLINE *selection* (omit the box) instead. This is an edge REFINER, not a subject detector — for cutting a subject out of a busy scene (e.g. people in a crowd) use an external model (rembg/u²-net; not built in). A subject running to the image edge may also lose a thin strip there. On failure the incoming selection is restored and no scratch channel is left behind. Follow with `select_invert` + `cutout_color`/clear to knock out the background. Returns {bounds, band, hint, fg_core_empty, selection_empty, layer, image}.
| Name | Type | Req | Description |
|---|---|---|---|
| band | – | – | – |
| h | – | – | – |
| image | – | – | – |
| layer | – | – | – |
| w | – | – | – |
| x | – | – | – |
| y | – | – | – |
No output schema declared.
No examples provided.
fuzzy_select ~78
Contiguous color (magic-wand) selection seeded at x,y within threshold (0..1). op: replace|add|subtract|intersect.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| op | string | – | – |
| threshold | number | – | – |
| x | integer | yes | – |
| y | integer | yes | – |
No output schema declared.
No examples provided.
gang_sheet ~103
Lay out multiple design files on a print sheet via a left-to-right / top-to-bottom shelf packer (gutter between items), growing height as needed, then export a transparent PNG. Returns {placed, sheet_px, out_path}.
| Name | Type | Req | Description |
|---|---|---|---|
| dpi | number | – | – |
| files | array | yes | – |
| gutter_in | number | – | – |
| out_path | string | yes | – |
| rotate | boolean | – | – |
| sheet_width_in | number | – | – |
No output schema declared.
No examples provided.
gaussian_blur ~57
Gaussian blur a layer (gegl:gaussian-blur). std_dev_x/y in pixels.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| std_dev_x | number | – | – |
| std_dev_y | number | – | – |
No output schema declared.
No examples provided.
get_bitmap ~197
THE vision tool: render a scaled/cropped/composited COPY and return it as a VIEWABLE image (an MCP image block you can actually see) plus size metadata. region=[x,y,w,h] crops first; background (name/hex) flattens over an opaque colour (else alpha is kept); the longest side is scaled to <= max_dim (clamped 1..4096). If the encoded image would exceed max_bytes (~4 MB default) it is auto-downscaled to fit your context. Pass save_to=<abs path> to write the render to disk and get the path back instead of an inline image — use this for previews too large to view inline.
| Name | Type | Req | Description |
|---|---|---|---|
| background | – | – | – |
| fmt | string | – | – |
| image | – | – | – |
| max_bytes | integer | – | – |
| max_dim | integer | – | – |
| region | – | – | – |
| save_to | – | – | – |
No output schema declared.
No examples provided.
get_metadata ~110
Metadata for an OPEN image: pixel width/height, resolution [x_dpi, y_dpi], base type, precision, file path, dirty flag, and per-layer info (size, opacity, visible, has_alpha). `image` = id/basename, or omit for the active image. To inspect a file ON DISK (e.g. verify an export's pixels / DPI), open_image it first, then call this on the returned id.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
No output schema declared.
No examples provided.
get_profile ~45
Read the image's embedded ICC profile label (None = built-in sRGB). `image` = id/basename, or omit for the active image.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
No output schema declared.
No examples provided.
gimp_exec ~143
Raw escape hatch: run Python inside GIMP. Returns the structured envelope {ok, result, stdout, warnings, error}; stdout is preserved even on error. Set a top-level `_result` for structured output. The persistent namespace has Gimp/Gegl/Gio/GLib/GObject/Babl, `pdb`, `find_image(spec)`, and `compat` (color/read_pixel/color_to_alpha/...). Runs arbitrary host code by design (same trust boundary as the local user); set GIMP_MCP_NO_EXEC=1 to skip registering this tool. See SECURITY.md.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | – |
| undo_group | boolean | – | – |
No output schema declared.
No examples provided.
gradient ~109
Draw a gradient from (x1,y1) to (x2,y2). `gradient` = named gradient (else fg->bg). gradient_type: linear|bilinear|radial|conical-symmetric|...
| Name | Type | Req | Description |
|---|---|---|---|
| gradient | – | – | – |
| gradient_type | string | – | – |
| image | – | – | – |
| layer | – | – | – |
| x1 | number | yes | – |
| x2 | number | yes | – |
| y1 | number | yes | – |
| y2 | number | yes | – |
No output schema declared.
No examples provided.
group_add ~47
Move an existing layer into a layer group at `position` (0=top).
| Name | Type | Req | Description |
|---|---|---|---|
| group | – | – | – |
| image | – | – | – |
| layer | – | – | – |
| position | integer | – | – |
No output schema declared.
No examples provided.
group_create ~52
Create an empty layer group, inserted at `position` (0=top) under optional `parent`.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| name | – | – | – |
| parent | – | – | – |
| position | integer | – | – |
No output schema declared.
No examples provided.
group_ungroup ~51
Dissolve a layer group: lift its children to the group's parent (in order) and remove the empty group. Destructive to the group structure.
| Name | Type | Req | Description |
|---|---|---|---|
| group | – | – | – |
| image | – | – | – |
No output schema declared.
No examples provided.
halftone_separation ~73
Apply a newsprint halftone screen. PREVIEW/APPROXIMATION ONLY — this is a visual halftone, NOT registration-accurate channel film separations.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | – |
| cell_size | number | – | – |
| image | – | – | – |
| layer | – | – | – |
No output schema declared.
No examples provided.
histogram ~160
Channel statistics (value|red|green|blue|alpha|luminance). space='perceptual' (default) computes the stats from the drawable's own pixels in the same 0-255 sRGB values as color_at/get_bitmap, returning mean, std_dev, median, min, max (all 0-255) plus pixels/count. space='gimp' returns GIMP's native PDB histogram (mean/std_dev/median/percentile, no min/max). Very large drawables are point-sampled at reduced resolution (min/max are from the sample, flagged by `sampled`).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | – |
| image | – | – | – |
| layer | – | – | – |
| space | string | – | – |
No output schema declared.
No examples provided.
hue_saturation ~100
Adjust hue/lightness/saturation. range: all|red|yellow|green|cyan|blue| magenta. hue -180..180, lightness/saturation -100..100, overlap 0..100.
| Name | Type | Req | Description |
|---|---|---|---|
| hue | number | – | – |
| image | – | – | – |
| layer | – | – | – |
| lightness | number | – | – |
| overlap | number | – | – |
| range | string | – | – |
| saturation | number | – | – |
No output schema declared.
No examples provided.
invert ~40
Invert colors. linear=True inverts in linear light, else perceptual.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| layer | – | – | – |
| linear | boolean | – | – |
No output schema declared.
No examples provided.
knockout_background ~636
One-click DTF background / shirt-colour knockout. Auto-adds an alpha channel if the source is flat (no need to call add_alpha first). For a dead-simple crisp cutout of ONE flat colour, prefer `cutout_color` (hard) or `color_to_alpha` (soft) — this tool adds garment-aware auto-technique + presets on top. Colour to remove, by priority: explicit `color` (name/#hex) > `shirt=` garment preset (see list_shirt_presets) > `sample_xy=[x,y]` eyedropper > AUTO-DETECT from the image edges. (A `shirt=` preset still supplies the technique + tolerance defaults even when an explicit `color` overrides its hue.) `mode='auto'` snaps the resolved colour to the nearest garment preset and inherits its technique (e.g. red -> hard, so reds in the art aren't eaten; black -> subtract, since on a black shirt black shows through); with no preset table it falls back to a luma rule (dark -> subtract / light -> hard). Override with 'hard'/'subtract' (case-insensitive). `tolerance` = match aggressiveness (default 0.15; a `shirt` preset supplies its own). `contiguous=True` (BOTH modes) removes only the border-connected region, so areas of the background colour ENCLOSED by artwork survive. Leave it off (default) when those enclosed areas are letter counters (the hole in an O) or donut holes — background that must knock out so the garment shows through. Turn it ON when they are interior ARTWORK in the garment colour (black linework on a black shirt). Colour cannot distinguish the two, so when a non-contiguous run clears enclosed regions the result reports `enclosed_bbox` + a `warning` telling you to re-run with contiguous=True if that was art. `feather` softens the cut. `defringe` (default OFF) trims a 1px halo but ERODES the art edge — enable only if you actually see a fringe. `clean` (default OFF) binarizes/denoises the alpha for film but HARDENS soft/anti-aliased edges — enable for crisp film output, leave off to preserve a clean subtract/feathered result. Returns the colour used, effective `…
| Name | Type | Req | Description |
|---|---|---|---|
| clean | boolean | – | – |
| color | – | – | – |
| contiguous | – | – | – |
| defringe | boolean | – | – |
| feather | number | – | – |
| image | – | – | – |
| layer | – | – | – |
| mode | string | – | – |
| sample_xy | – | – | – |
| shirt | – | – | – |
| tolerance | – | – | – |
No output schema declared.
No examples provided.
layer_from_file ~70
Load an image file as a new layer in the image and insert it (top by default). Optional `name`/`parent`/`position`.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | – | – |
| name | – | – | – |
| parent | – | – | – |
| path | string | yes | – |
| position | integer | – | – |
No output schema declared.
No examples provided.
levels ~137
Adjust levels on a drawable. channel: value|red|green|blue|alpha. Inputs/outputs are 0.0-1.0 floats in LINEAR light, not the 0-255 sRGB values color_at reports: a pixel color_at reads as 200 sits at about 0.58 here. gamma is the midtone exponent.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | – |
| gamma | number | – | – |
| high_in | number | – | – |
| high_out | number | – | – |
| image | – | – | – |
| layer | – | – | – |
| low_in | number | – | – |
| low_out | number | – | – |
No output schema declared.
No examples provided.
What is the GIMP Studio MCP server?
GIMP Studio MCP is listed in the public MCP registry as com.twelvetake/gimp-studio-mcp. Lets an AI assistant edit images in GIMP 3, including print and DTF transfer prep. This page covers its PyPI package (twelvetake-gimp-studio-mcp).
Is the GIMP Studio MCP server safe to use?
GIMP Studio MCP scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 October 2026. Its build provenance is signed and verified. 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 Studio MCP server expose?
GIMP Studio MCP exposes 119 tools: status, list_images, set_active_image, gimp_exec, reset_namespace, and 114 more. Their descriptions and schemas cost roughly 8,781 tokens of context every time the server is loaded.
Is the GIMP Studio MCP server still maintained?
GIMP Studio MCP is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the GIMP Studio MCP server under?
GIMP Studio MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.