Editmamei
An MCP server that drives Adobe Photoshop — it lets an AI app open, inspect, edit, verify, and export real Photoshop documents, keeping everything on editable layers.
Session & discovery — ping Photoshop, list capability groups, fetch a workflow brief, or drop an anonymized diagnostic bundle for a bug report.
Documents — create, open from disk (with raw/HEIC handling and bit-depth choice), list/activate/close, save layered PSD, export JPEG/PNG with downscaling.
Layers & groups — create, delete, duplicate, layer-via-copy, group/ungroup, clipping masks, layer styles, opacity/blend/fill, reorder, bake appearance, merge/stamp/flatten.
Non-destructive adjustments — Curves, Levels, Hue/Saturation, B&W, Color Balance, Photo Filter, Vibrance, Channel Mixer, Selective Color, Gradient Map, Exposure, Color Lookup, Invert, Posterize, Threshold; maskable and clippable.
Destructive filters & adjustments — Shadows/Highlights, Equalize, LUT bakes; Gaussian/motion/lens/radial blur, sharpen, noise/reduce noise, high-pass, pixelate, distort, stylize, render, displace, oil paint — plus smart-filter list/toggle/re-blend/remove.
Selections — rectangles, ellipses, polygons, color/luminance ranges, magic wand, focus area, skin tones, out-of-gamut; then feather, refine edge, expand/contract, border, smooth, transform, grow/similar; save and reload as alpha channels; visual selection previews.
AI selection — Select Subject, Select Sky, and select-by-reference named regions (sky, ground, foliage, subject, face, shadows/highlights, skin, face features) with a confidence gate.
On-device perception — face and COCO-80 object bounding boxes, and a full scene model (subjects, faces, horizon, sky/ground map, tonal zones, composition, region menu).
Retouching — content-aware fill, patch, and content-aware move; 16 brush-family tools (clone, heal, dodge, burn, blur, sharpen, smudge, eraser, sponge…) along pixel or bezier paths; detection-driven portrait touch-up.
Geometry — resize, crop, canvas rotate/flip, layer transform (fit/fill, scale, move, rotate, flip, skew, free), place images as smart objects, document guides.
Type & vectors — text layers, rectangle/ellipse/line shapes, editable paths (from selection or a named curve, stroke, fill, clipping path), vector masks.
Compositing utilities — Apply Image, Calculations, smart-object conversion, rasterize, color-mode conversion, layer-bounds numeric diff.
Verification — rendered previews with drawn annotations (rectangles, guides, points, grids, composition overlays), histograms, region-vs-region comparison, document/layer-tree/history inspection.
Automation & safety — chain up to 25 tool calls in one round trip with stop/continue/rollback, plus undo/redo.
Drives headless GIMP as an independent second editing surface (beta, Community edition), exposing 24 gimp_* tools for document lifecycle (create, open, close, save XCF, export), layers and masks, non-destructive adjustments and effects, filters, canvas operations (crop, resize, transform, image-mode conversion), image placement, plus verification and checkpointing helpers such as previews, histograms, and region comparisons.
What you can ask
Talk to your assistant the way you'd brief a retoucher. These are three real requests, each in a fresh chat, with the result each one got.
Smaller requests work too, like "Isolate the subject onto its own layer with a clean mask" or "Export a 2048px web JPEG."
Here's the waterfall edit in its session. Your AI app runs beside your editor, and the result arrives on layers you can open and change yourself.
Related MCP server: photoshop-mcp-pro
Install
Claude Desktop, no terminal
Download
editmamei.mcpb.In Claude Desktop, go to Settings → Desktop app → Manage (next to Extensions) → Advanced settings → Install Extension… and choose the downloaded file.
Restart Claude Desktop, then ask it: "Is Photoshop connected?"
This route doesn't need Node.js, because Claude Desktop ships its own runtime. The install guide covers older versions of the app and updates.
Claude Code, Cursor, and other MCP apps
npm install -g editmamei
editmamei install # registers with Claude Desktop, Cursor, Claude Code
editmamei status # shows which AI apps it's registered withThen restart your AI app and ask it: "Is Photoshop connected?" For anything editmamei install doesn't detect, see docs/clients.md.
Requirements
Editor | Adobe Photoshop 2026 (v27.x) on Windows 10/11 or macOS 13+, or GIMP 3.2 on Windows, macOS, or Linux |
AI app | Any app that can run a local MCP server |
Node.js | 22+, for the npm route only |
What to expect
A first edit takes a while. The three requests above took 4 to 8 minutes, because your AI looks, plans, and checks at every step. Editmamei ships no chat model of its own, so every edit spends your AI app's tokens, and we measured what an edit costs.
If it works for you, a ⭐ helps other photographers find it.
Editmamei Connect
Want to edit from a browser or your phone, or don't have Photoshop or GIMP on this computer? Editmamei Connect is the hosted version. Add it to Claude, ChatGPT, or another AI app as a connector, send a photo, and get it back edited. There's nothing to install, and it's free to start.
Connect is a separate product, and its source isn't in this repository. It edits on Editmamei's server instead of on your computer, so your photo is uploaded, and uploads are deleted after 24 hours.
How it works
Your AI app decides each step and calls Editmamei's tools. Editmamei carries the step out in your editor and reports back with structured results and, when your AI needs to look, a preview. Your AI reads those and decides what to do next. Editmamei also sends content-free usage telemetry and checks npm for updates; see Privacy.
Real edits. Photoshop or GIMP does the pixel work with its own engine. Editmamei generates nothing itself; when an edit uses an AI feature built into the editor, like Sky Replacement, that's the editor's own tool at work.
Reversible. In Photoshop, adjustments land as adjustment layers and destructive pixel operations run on an automatic duplicate. In GIMP, adjustments stay live filters, and checkpoints stand in for undo.
Checked, not assumed. Histograms, region comparisons, and selection previews let your AI measure its own work.
On-device vision. In Photoshop, face, object, and scene detection run locally on bundled ONNX models, so your AI can target "the person on the left" without a cloud vision call.
Only verified tools ship. A new tool stays out of the tool list until it has passed live sessions against real Photoshop or GIMP.
112 tools: 83 for Photoshop (62 Community, 21 Pro) and 29 for GIMP (all Community). The full list is in docs/tools.md.
GIMP
When GIMP 3.2 is detected on your machine, a gimp_* tool set registers next to the ps_* one, for when you ask for GIMP or Photoshop isn't available. Edits happen in a background gimp-console process with no visible window, and you follow along through previews in the conversation. GIMP doesn't yet cover heal/clone or AI subject and sky selection. Details and troubleshooting, including Linux, are in docs/gimp.md.
Free and Pro
Community (free) | Pro | |
Documents, layers, masks, type, filters, and retouching | ✓ | ✓ |
Non-destructive adjustments | ✓ | ✓ |
AI Select Subject and Select Sky | ✓ | ✓ |
On-device perception | ✓ | ✓ |
Previews, histograms, and comparisons | ✓ | ✓ |
GIMP tools | ✓ | ✓ |
Camera Raw as a re-editable filter, and raw files developed before they open | ✓ | |
Folder batch | ✓ | |
Reproducible templates | ✓ | |
Warp, named-object masks, and precision placement | ✓ | |
Subject-instance and face-mesh targeting | ✓ | |
Photoshop Actions and the scripting escape hatch | ✓ |
Pro is a Photoshop-only upgrade and adds nothing to the GIMP tools. The split is detailed in pro-features.md, and pricing is at editmamei.com/desktop/pricing.
This repository holds the Community source. Pro is a separately licensed module and its source is not published here. Community never imports it, so this tree builds and runs on its own.
Privacy
Editmamei runs on your computer and edits in your desktop editor. No image content or file paths are sent to Editmamei's servers.
What | Where it goes | Setting |
Your photo file | Stays on your computer, apart from the previews below and any Adobe cloud selection | |
Previews, 1024px on the long edge by default (your AI can ask for up to 8192px) | Your AI app's model provider, the same as dropping a photo into a chat |
|
Tool results, such as file paths, layer names, measurements, and metadata like GPS if your AI asks for it | Your AI app's model provider | |
Content-free usage telemetry, with a random install ID | Editmamei |
|
Names of editing features and tool options used, from fixed lists (tool schemas and a published list), with no install ID | Editmamei |
|
Sanitized error details | Editmamei, only if you opt in |
|
Update check, with no identifiers | The npm registry |
|
Change these with editmamei config set <setting> false (or true). The Claude Desktop extension has its own switches for telemetry, feature names, diagnostics, and the update check. Pro also sends your license key and a per-device activation ID to a third-party licensing service, and to Editmamei's delivery service to check for module updates, plus a hashed device ID at activation. These have no setting. Photoshop's own Select Subject and Select Sky can use Adobe's cloud, depending on Photoshop's Image Processing preference.
Every field is documented in privacy.md, including your rights, and the legal basis. npm releases are published from this repository with signed provenance, so you can check the package against this source.
For developers
Editmamei is a stdio MCP server. In any MCP client, add a server that runs npx -y editmamei. The MCP reference covers client config, architecture, the MCP surface, settings and environment variables, and each network request the server makes.
The discovery chain is ps_ping (liveness), then ps_overview (the working method and capability map), then tools/list (the full schema-typed inventory). Every tool declares an outputSchema and returns typed JSON.
Build from source
git clone https://github.com/editmamei/editmamei.git
cd editmamei
npm install
npm run build
npm testYou need Node.js 22+ and Go 1.21+. The build compiles the editmamei-core binary that generates Photoshop scripts; it needs Go 1.27, which Go fetches for you from 1.21 on. The build warns instead of failing when Go is missing, so you can still run the test suite. Set EDITMAMEI_CORE_BIN to a prebuilt binary if you would rather not install Go.
The test suite runs without Photoshop. It verifies the ExtendScript Editmamei generates, never that Photoshop accepted it, so live verification against a real Photoshop is a separate step.
Contributions are welcome. CONTRIBUTING.md covers the CLA, the branch and pull-request flow, and what to include in a bug report.
Documentation
Guide | What's in it |
Every install route, updates, and Photoshop detection | |
Your first session and how to get good results | |
Setup for each client, and known limits | |
Every tool, by group and edition | |
Requirements, coverage, and troubleshooting | |
What Pro adds, and how to activate it | |
Architecture, settings, and network requests | |
Common questions | |
Fixes for common problems | |
What's planned |
Found a bug or want a feature? Use the issue tracker. If something's broken, ask your assistant to "report a problem" (or run editmamei report) to drop an anonymized diagnostic bundle in your Downloads folder, then attach it to the issue. For security issues, see SECURITY.md and don't file them publicly.
License
Editmamei CE is Fair Source software under the Functional Source License, v1.1, MIT Future License (FSL-1.1-MIT).
You can read, run, modify, and redistribute the code for almost anything: commercial photo editing, internal tools, education, research, security review. The one thing the license holds back, for two years per release, is offering the code to others in a commercial product or service that competes with Editmamei CE or Pro. If you redistribute the code, keep the license and copyright notices with it. Two years after each version ships, that version automatically becomes available under plain MIT.
This section is a plain-English summary. The LICENSE file is the license; where they differ, the LICENSE file controls. Editmamei is not open source under the OSI definition, and we don't call it that. It is source-available, with the full CE stack developed in the open.
Editmamei Pro is a separate, commercially licensed module; its source is not published. Third-party dependencies keep their own licenses, listed in NOTICES.md.
Available Tools
64 toolsps_add_adjustment_layerAIdempotent
Create a non-destructive adjustment layer above the active layer — hoisted out of the active layer's group by default even though Photoshop's own Mk-AdjL placement rule would otherwise nest it INSIDE that group (pass into_active_group:true to keep that native nesting). Supports the full real-Photoshop tonal/color surface: Curves (with S-curve presets), Levels, Hue/Saturation, Brightness/Contrast, Black & White (with optional tint), Color Balance, Photo Filter (preset or custom color), Vibrance, Channel Mixer, Selective Color, Gradient Map (preset), Exposure (stops + offset + gamma), Color Lookup (3DLUT presets or custom file path), and Invert. Values are editable, maskable, and removable. This is the canonical entry point for tonal/color adjustments — EXCEPT global tone/color on raw-sourced documents, which starts with a Camera Raw develop pass when a camera-raw develop tool is registered (see ps_open_document's is_raw_source); the old destructive bake tools (auto_levels / auto_contrast / desaturate / invert) were removed on 2026-05-31 — if you genuinely need a pixel bake, follow this call with ps_merge (mode=visible). Optionally clips the adjustment to only affect the layer directly below it. If a selection is active at call time, the new layer is automatically masked by it (toggle with mask_from_selection / mask_inverted). For destructive ops that don't have an adjustment-layer equivalent in Photoshop (Shadows/Highlights — single-pass shadow/highlight recovery), use ps_apply_adjustment (type=shadows_highlights) which auto-duplicates the active layer to keep the original intact. Returns context (the new adjustment layer becomes active) plus parent_path — the actual containing-group chain, so placement is never silent.
Inputs: type (required), hue, name, gamma, +67 more. Returns: type, clipped, context, created, +12 more
ps_add_fill_layerA
Add a non-destructive SOLID COLOR or GRADIENT fill layer (an editable content layer — distinct from ps_fill_layer, which bakes color into the active pixel layer). fill_type=gradient is the go-to for sky fades, color washes, and vignettes (radial + reverse + multiply blend); combine with opacity_stops 100→0 for fade-to-transparent, or ps_bake_layer to rasterize. For fading a layer out via its MASK use ps_layer_mask op=gradient instead. Hoisted out of the active layer's group by default (pass into_active_group:true to keep Photoshop's native nesting). The new fill layer becomes active.
Inputs: red, blue, angle, green, +10 more. Returns: angle, color, scale, context, +8 more
ps_add_layer_styleAIdempotent
Apply a layer style (drop shadow, stroke, outer glow, inner shadow, inner glow, or color overlay) to the active layer. Non-destructive and editable. For PHOTO workflows: stroke = print-style border around the image (apply to the flattened photo on a transparent canvas, or to a duplicated background); outer_glow = atmospheric lift on highlights (halo around the sun, glow around a window or lamp); drop_shadow = depth on text overlays and layered composites. Drop shadow uses Multiply blend; outer glow uses Screen; stroke uses Normal. Cannot be applied to a background layer (duplicate or convert it first). Returns context — applying a style changes what exists on the layer (the Lefx descriptor).
Inputs: style (required), size, angle, color, +7 more. Returns: style, applied, context, layerName
ps_apply_adjustmentADestructive
Apply a DESTRUCTIVE tonal adjustment, baked into pixels — chosen via type. Runs on a DUPLICATE of the active layer by default (auto-duplicate-first — the original is preserved; revert by deleting the copy); pass apply_to_active_layer: true to bake in place. Auto-rasterizes text/smart-object layers. shadows_highlights recovers blown highlights + crushed shadows in one pass (defaults match Adobe's dialog: 35 shadow amount, +20 color correction); equalize stretches/flattens the histogram (parameter-free); color_lookup bakes a 3DLUT grade (cl_lut_name required — leaf name of a file in Presets/3DLUTs/ or an absolute .cube/.3dl/.look path). For EDITABLE tonal/color work, prefer ps_add_adjustment_layer.
Inputs: type (required), black_clip, white_clip, cl_lut_name, +9 more. Returns: filter, context, lut_path, lut_format, +11 more
ps_apply_brush_strokeADestructive
Paint along a path with one of PS's 16 brush-family tools — supply the path EITHER as an anchor-relational placement (preferred: a path relation → the stroke traces a resolved, gate-verified curve along a traced edge / landmark / between two anchors, no pixel-guessing) OR as an explicit path list of anchor points — the retouch tools (healing_brush, clone_stamp, burn, dodge, blur, sharpen, smudge), the paint family (brush, pencil, eraser), and the specialty tools (pattern_stamp, art_history_brush, history_brush, color_replacement, background_eraser, sponge). The path parameter takes a list of anchor points with optional bezier handles, so the same tool handles straight-line strokes, freeform curves, and closed shapes — all by varying the path geometry. Reach for this when: (a) cloning out a distraction along a specific shape (clone_stamp with a source_point + a path tracing the unwanted edge); (b) healing a scratch or seam (healing_brush with source_point); (c) dodging / burning to redirect tonal balance along a contour; (d) painting a freehand line into the canvas (brush + foreground_color). Active layer must be a normal pixel layer (background auto-promotes); rasterize adjustment/shape/text/smart-object layers first. Auto-duplicates — the original is preserved and a "Brush Stroke ()" copy receives the paint. Brush dynamics: hardness, opacity, and flow are independently settable via hardness_pct / opacity_pct / flow_pct (the live tool options are mutated before stroking and restored to the user's prior state in finally). Sampled brushes (custom shape-stamp presets) silently ignore hardness/diameter mutations — vary their character via brush_preset instead.
Inputs: tool (required), brush_size (required), path, closed, +10 more. Returns: tool, closed, anchors, context, +17 more
ps_apply_imageADestructive
Composite a source layer + channel onto the ACTIVE layer using a calculation blend mode (Image ▸ Apply Image). Reach for this for luminosity blends, frequency-separation re-blends, texture overlays, or pulling one channel into another. Source = a layer (merged or named) and a channel (rgb/red/green/blue/alpha). Bakes into pixels, so by default it runs on a DUPLICATE of the active layer (set apply_to_active_layer=true to bake in place). The active layer must be a normal pixel layer. (AM-only; verified live on PS 27.2.0.)
Inputs: blend (required), opacity, source_layer, source_channel, +2 more. Returns: blend, applied, context, opacity, +4 more
ps_bake_layerA
Flatten the active layer's CURRENT APPEARANCE — the layer plus any adjustment layers clipped to it plus its layer styles — into a NEW pixel layer named " (baked)". Non-destructive: the originals are left intact. This is how you get real baked pixels out of a non-destructive stack: clip a Hue/Saturation (saturation -100) or an Invert adjustment to a layer, then bake to get a desaturated / inverted PIXEL layer for techniques that need actual pixels (line art, blurred-layer blends). Also works on a lone layer with nothing clipped to it — it rasterizes that layer's own appearance (layer styles, smart-object or text content) into a flat pixel copy. The active layer must be top-level (not inside a group).
Inputs: no named parameters. Returns: baked, context, baked_layer_name, source_layer_name, +1 more
ps_calculationsA
Blend TWO sources (each a layer + single channel) into a NEW alpha channel via a calculation blend mode (Image ▸ Calculations). Reach for this to build advanced selections/masks from channel math — e.g. difference of two channels to isolate edges, or multiply two channels for a luminosity mask. Non-destructive: adds a new channel (delete it to revert); the result is loadable as a selection via ps_selection_channel op=load. (AM-only; verified live on PS 27.2.0.)
Inputs: blend (required), opacity, source1_layer, source2_layer, +4 more. Returns: blend, context, opacity, calculated, +2 more
ps_clipping_maskAIdempotent
Clip or un-clip the active layer against the layer directly below it — choose with op. create: use the layer below as the alpha source; PS paints the active layer only where the layer below has pixels. Non-destructive — the upper layer is unchanged. Common for constraining a texture/photo to a shape, or masking an effect to a single underlying layer (the add_adjustment_layer tool already accepts clip_to_below for the adjustment-layer-specific case). Equivalent to Layer > Create Clipping Mask (Ctrl+Alt+G). release: the inverse — the layer returns to compositing against the whole canvas. Both ops are idempotent: create no-ops (already_clipped:true) on an already-clipped layer; release no-ops (released:false) on a non-clipped layer.
Inputs: op (required). Returns: clipped, context, released, layerName, +1 more
ps_close_documentADestructiveIdempotent
Close a Photoshop document — the active one by default, or a specific one by name or id. Destructive if save=false and the document has unsaved changes. If two open documents share the requested name the call fails rather than guessing. Returns the closed document name plus a fresh context block (which document, if any, is active afterwards).
Inputs: id, name, save. Returns: saved, closed, context, closedName
ps_compare_regionsARead-onlyIdempotent
Quantitative region comparison — the NUMERIC verification answer when "does it look right?" via get_preview is too subjective. Captures the histogram of two rectangular regions on the same document and reports per-channel mean / stdev / median for each region plus the deltas. Reach for this when: (a) "did the placed image match the room's lighting?" — sample a region of the placed image vs a region of the surrounding wall; (b) "did this adjustment do anything visible in the shadows?" — sample the same dark region before and after; (c) "is region A noticeably warmer/cooler than region B?" — read the channel means directly. Single-pixel sampling via a 1×1 rect is supported. Read-only.
Inputs: region_a_top (required), region_b_top (required), region_a_left (required), region_b_left (required), +6 more. Returns: context, region_a, region_b, differences
ps_convert_image_modeADestructiveIdempotent
Convert the document color mode (grayscale / rgb / cmyk / lab). Destructive and document-wide: the image is FLATTENED and, for grayscale, color is discarded (the confirmation prompt is auto-accepted). Use grayscale as the base for halftone / line-art workflows, or rgb to bring a CMYK/Lab doc back for normal editing. Returns updated document context.
Inputs: mode (required), angle, shape, frequency. Returns: context, converted, mode_after, mode_before, +1 more
ps_convert_to_smart_objectA
Convert the active layer to a Smart Object, or (mode=new_via_copy) copy an existing Smart Object to an independent new one. convert (default) wraps the layer content so every subsequent filter becomes a Smart Filter — fully editable and non-destructive. PREREQUISITE for Camera Raw Filter, non-destructive frequency separation, and any workflow where filter parameters need to stay adjustable after the fact. Works on pixel, text, shape, and adjustment layers. Auto-promotes the background layer if needed. Wrapping an already-Smart-Object layer creates a nested Smart Object (valid in Photoshop — the inner SO is preserved as-is). new_via_copy requires the active layer to already be a Smart Object and yields a copy with its OWN source (unlinked). Use ps_rasterize_layer to go the other direction.
Inputs: mode. Returns: context, layer_name, original_kind, is_smart_object, +3 more
ps_copy_to_new_layerA
Copy the current selection into a NEW layer above the active one — Photoshop's "Layer via Copy" (Ctrl+J) — hoisted out of the active layer's group by default even though the underlying CpTL event carries no placement target and would otherwise nest the new layer INSIDE that group (pass into_active_group:true to keep that native nesting). The source layer is left untouched and the new copied layer becomes active. With an active selection only the selected pixels are lifted; with no selection it copies the whole active layer (a plain duplicate). Reach for this to isolate a region for independent transforms or filters (stretch, light rays, a local grade) without altering the source. Returns context so the caller sees the new active layer.
Inputs: into_active_group. Returns: context, hoisted, parent_path, new_layer_name, +4 more
ps_create_documentA
Create a new empty Photoshop document with given dimensions, resolution, and color mode. Returns the new document id and name plus active context. Use this when starting from scratch; prefer ps_open_document to load an existing file.
Inputs: width (required), height (required), color_mode, resolution. Returns: id, name, context
ps_create_layerA
Create a new empty raster layer above the currently active layer. Non-destructive. Use ps_text (op=create) for text, ps_add_adjustment_layer for adjustments.
Inputs: name. Returns: context, created, layerName, parent_path
ps_crop_documentADestructiveIdempotent
Crop the document to a region — EITHER anchor-relational placement (preferred: a region relation like inside/gap → the crop is the resolved, gate-verified region bbox, no pixel-guessing) OR absolute pixel bounds (left/top/right/bottom in document space). Destructive: pixels outside the bounds are permanently lost. Idempotent for the same bounds. Returns updated document context.
Inputs: top, left, right, bottom, +1 more. Returns: context, cropped, newWidth, newHeight, +1 more
ps_delete_layerADestructive
DESTRUCTIVE: Delete a layer. With no arg, deletes the currently active layer (backward-compatible). With name, recurses into groups and deletes the first LAYER matching that name — useful for cleanup workflows where the dead layer is not currently active. A name that matches a group is refused rather than deleted; use ps_group(op=delete) to delete a group and all its contents. Recoverable only via Edit > Undo.
Inputs: name. Returns: context, deleted, layerName
ps_detectARead-onlyIdempotent
The cheap, narrow read: labeled bounding boxes only — faces and/or COCO-80 objects (person, dog, car, chair, sofa, …) in DOCUMENT-pixel space. Detection runs locally on this device; annotate:true returns a JPEG to your AI client. Use this for real coordinates before a spatially-targeted edit when boxes are all you need — far more reliable than estimating positions from a preview. For the full scene model (regions, horizon, tonal zones, composition, and a menu of selectable named regions), use ps_read_scene instead. target selects faces / objects / both. Read-only: renders a throwaway duplicate, never modifies the working document. Boxes are [x1, y1, x2, y2]. Pass annotate:true for an annotated preview JPEG (faces cyan, objects magenta) when you need to visually confirm a surprising result.
Inputs: target, annotate, max_objects, max_dimension, +2 more. Returns: faces, image, context, message, +2 more
ps_documentAIdempotent
See and steer WHICH documents are open, without touching their content. op=list answers 'what is open, which one is active, and does it have unsaved changes' — and it is the one document tool that works when nothing is open at all, so it is the recovery read after a 'No document is open' failure. op=activate switches the active document by name or id, which is how you fix having edited the wrong one. Read-only with respect to pixels; use ps_open_document to load a file and ps_close_document to close one.
Inputs: op (required), id, name. Returns: id, op, name, count, +3 more
ps_duplicate_layerA
Duplicate the active layer. The new layer becomes active. Returns context so the caller sees the new active layer. Not idempotent (each call creates another copy).
Inputs: new_name. Returns: context, newName, parent_path, originalName
ps_exportADestructiveIdempotent
Export the active document to a flattened image file — JPEG or PNG, chosen via format. Operates on a duplicate, so the working document is unchanged. Optionally downscales so the long edge equals long_edge_px. JPEG: quality 0-100 (Export As scale), optional sRGB convert + profile embed. PNG: transparent background (alpha preserved) or flattened onto white, compression 0-9.
Inputs: format (required), output_path (required), quality, overwrite, +5 more. Returns: context, quality, success, width_px, +4 more
ps_fill_layerAIdempotent
Fill the active layer (or the current selection within it) with a solid RGB color. Idempotent for the same color. Throws on fully-locked or text layers — rasterize text first if needed.
Inputs: red (required), blue (required), green (required). Returns: color, filled, layerName
ps_filterADestructive
Apply a Photoshop filter (op=apply, the default) to a DUPLICATE of the active layer by default — the original is preserved, undo by deleting the copy. Pass apply_to_active_layer:true to bake into the original instead. Choose the filter with type (see the type field for its params); pass as_smart_filter:true on a Smart Object to apply it as a re-editable SMART FILTER instead of rasterizing. This same tool also reads and manages that re-editable Smart Filter stack: op=list (every filter's index/name/type/enabled/opacity/blend), op=set_visibility (toggle one off/on), op=set_blend (restyle opacity/blend_mode), op=remove (delete one). Management ops need a 1-based index from op=list first — index 1 is the first-applied filter, at the bottom of the stack. Covers blur, sharpen, noise, high_pass, pixelate, distort, displace, and oil_paint.
Inputs: op, edge, mode, seed, +91 more. Returns: count, index, filter, applied, +18 more
ps_get_histogramARead-onlyIdempotent
Whole-image (or per-channel) histogram — the quantitative answer to questions get_preview can't reliably answer by eye. Returns 256 bin counts plus mean / stdev / median. Cheap (~50ms), read-only. Reach for this when: (a) clipping detection — bins 0 and 255 carry the count of crushed shadows / blown highlights; you can't see clipping reliably in a downsampled JPEG preview; (b) exposure verification after a levels/curves/exposure adjustment — confirm the histogram actually shifted; (c) "is this image neutral-gray?" — compare R / G / B channel means; (d) confirming a destructive op did anything (two identical histograms = no-op regardless of the tool's success message). Composite reads the visible flattened image (any color mode). Per-channel reads require the document have that channel.
Inputs: channel. Returns: bins, mean, stdev, median, +4 more
ps_get_layer_bounds_diffARead-onlyIdempotent
Numeric verification: compute the per-edge pixel deltas between a layer's actual bounds and a target rectangle. Returns left/top/right/bottom deltas (actual − target), scale ratio (actual_size / target_size), centroid offset, and a one-word verdict ("aligned", "shifted right", "layer too small", etc.). Use this AFTER ps_place_image / ps_transform_layer to confirm the operation produced the intended result — far more reliable than eyeballing a preview for fine alignment. Read-only. Layers nested in groups are found by name recursively.
Inputs: layer (required), target_top (required), target_left (required), target_right (required), +2 more. Returns: deltas, context, verdict, actual_bounds, +6 more
ps_get_previewARead-onlyIdempotent
Render the active Photoshop document as a flattened, downscaled image and return it inline so the calling AI can see the current visual state. Use this to verify edits visually, judge whether adjustments went too far or not far enough, and decide what to do next. Read-only with respect to the working document (renders a duplicate that is closed immediately). The optional annotations array draws overlays in document-space coordinates: rectangle / guide / point / selection for spatial verification, and grid / composition for coordinate readout and compositional evaluation (added 2026-06-09 — grid styles every / thirds / quarters / phi, composition styles diagonals / triangles / fibonacci_grid / golden_spiral). Use spatial annotations to verify ("did the placed image land inside the frame interior?") — pass both target and actual bounds in different colors. Use grid / composition annotations to EVALUATE composition (balance, thirds, leading lines, focal-point placement) — not to read a coordinate for a tool call. To place or select precisely, do NOT read a pixel off a grid (unreliable) — NAME the intent to the on-device perception tools instead: ps_detect (COCO objects → real document-pixel boxes), ps_select_by_reference (a named target → a real selection, not a guessed rectangle), plus any spatial-grounding locator / selection tools present in tools/list. Without annotations, behaves identically to a plain preview.
Inputs: quality, annotations, max_dimension. Returns: bytes, format, context, mime_type, +2 more
ps_get_selection_previewARead-onlyIdempotent
Render an inline JPEG so the agent can visually verify what is currently selected: by default a red-wash OVERLAY (50% red over the selected area, most intuitive); pass image:'mask' for a B/W MASK (black = selected, white = not) instead, or image:'both' for both. selection_info is always returned regardless of image. Heavier than the selection_info bundle alone (~2-4s) — call this when the stats look off or before committing a mask. Does NOT modify the source document.
Inputs: image, max_dimension. Returns: rendered, mask_bytes, max_dimension, overlay_bytes, +1 more
ps_groupADestructive
Layer group (LayerSet) lifecycle and membership — choose the operation with op. create/delete/ungroup/add_layer/set_blend_mode. See the op enum for per-operation params. delete and ungroup are DESTRUCTIVE and require confirm:true — delete removes the group AND everything inside it; ungroup dissolves the group but promotes its contents to the parent level (use ungroup, not delete, to keep the layers).
Inputs: op (required), name, layers, confirm, +4 more. Returns: set, moved, context, created, +12 more
ps_guidesA
Manage document guides — non-printing layout aids for a HUMAN working in Photoshop. Guides are editor-only chrome: they do NOT render into ps_get_preview (the exported/flattened image), so they are a user authoring aid, not a model-perception tool — place them when a person will open the PSD and wants alignment/composition marks. Choose with op. add places one guide (orientation horizontal|vertical) at a position in px. layout creates an evenly-spaced grid (columns and/or rows — great for rule-of-thirds at 3×3). clear removes all guides.
Inputs: op (required), rows, columns, position, +1 more. Returns: rows, columns, position, guide_added, +3 more
ps_inspectARead-onlyIdempotent
Read-only document inspection — choose with what (metadata / layer_tree / history / selection_info / smart_object). This is the assess/orientation surface: call it at the start of a workflow and whenever you need fresh state. For metadata, pass sections to subset (e.g. ["context"] for a cheap probe). For an IMAGE-based check use ps_get_preview; for NUMERIC verification use ps_get_histogram / ps_compare_regions / ps_get_layer_bounds_diff (these stay separate, named tools on purpose). Read-only and idempotent.
Inputs: what (required), sections. Returns: acr, gps, iptc, tree, +23 more
ps_layer_maskADestructive
Manage the active layer's mask — choose with op. create: add a layer mask; if a selection is active it reveals the selection and hides the rest (the one-call "mask the placed image to the frame opening" — make the selection first, then create); with no selection, a reveal-all mask; adjustment layers load the current selection into their built-in mask. delete: remove the mask (layer pixels preserved). apply: DESTRUCTIVE — permanently bake the mask into the pixels (outside-mask pixels lost). gradient: draw a linear fade into the mask (fade_to names the side that ends hidden; start/end place the fade; auto-creates the mask; replaces existing mask content and clears any active selection first) — the standard fade for reflections, sky blends, and soft edge falloff. Verify with ps_get_preview. Prefer keeping masks non-destructive unless flattening for export. Prefer this tool over a hand-written mask script; it already handles masks and gradients.
Inputs: op (required), end, start, extent, +1 more. Returns: to, from, extent, context, +11 more
ps_list_capabilitiesARead-onlyIdempotent
Live map of every tool this MCP exposes, grouped by capability — each group is a one-line purpose plus the tool names in it. Read-only and cheap. Reach for it to re-orient mid-session (what exists, what to reach for) when the overview brief has scrolled out of context, or to learn which tool names to look up. ps_overview tells you HOW to combine tools; this tells you WHAT exists, currently; tools/list has the full schema for any one you pick.
Inputs: no named parameters. Returns: groups, tool_count, group_count
ps_mergeADestructive
Merge layers — choose with mode. visible: collapse all visible layers into one (DESTRUCTIVE; identities lost). stamp: merge visible into a NEW layer on top, leaving originals intact (Ctrl+Alt+Shift+E — the non-destructive "final tweak" composite for output sharpening/grain/contrast; prefer this when building on top rather than collapsing). flatten: flatten ALL layers into the background (DESTRUCTIVE; transparency filled with bg color — use sparingly, usually prefer visible or exporting a flattened copy). Returns context.
Inputs: mode (required). Returns: merged, context, stamped, flattened, +4 more
ps_modify_selectionA
Modify the CURRENT selection — choose with op. (To create a NEW selection instead, use ps_select.) feather softens by radius_px (use when a selection was made hard, e.g. after select all/inverse, before applying an adjustment). refine_edge runs Select-and-Mask's global sliders headlessly (smooth, feather, contrast, shift_edge, edge-detection radius, decontaminate) to clean halos and soft/fuzzy edges (hair) after a rough color-range / magic-wand / subject selection. expand / contract grow / shrink the selection by amount px. border replaces the selection with an amount-px band around its edge. smooth rounds the corners with an amount-px radius. grow / similar expand the selection to similar-colour pixels by tolerance (+anti_alias) — grow to adjacent pixels only, similar document-wide. transform relatively scales (scale_x_percent / scale_y_percent), rotates (rotate_degrees) and/or translates (offset_x / offset_y) the marching ants — pixels are untouched. All require an active selection and return selection_info.
Inputs: op (required), amount, radius, smooth, +13 more. Returns: mode, method, output, radius, +20 more
ps_move_layer_to_positionAIdempotent
Move a layer to a position in the stack — the single ordering primitive (the per-direction helpers _to_top / _to_bottom / _up / _down were removed 2026-05-31; this tool covers all four cases). Position keywords: ABOVE/BELOW (requires target_layer_name — places the moved layer immediately above/below the target), TOP/BOTTOM (absolute — target_layer_name not needed). By default the ACTIVE layer is moved; pass layer_to_move= to move a specific layer by name (recurses into groups). COMMON CASES: an adjustment layer just created landed below another adjustment that masks its effect → move it to TOP; a vignette darkens the wrong layers → move ABOVE the layer it should affect; a sky-replacement composite is showing through the foreground → move the foreground to TOP. Idempotent for a given (layer_to_move, target, position).
Inputs: position (required), layer_to_move, target_layer_name. Returns: moved, context, message, position, +3 more
ps_open_documentA
Open a file from disk into Photoshop with all dialogs suppressed (uses last-used Camera Raw settings for raw/HEIC). Returns document name, dimensions, color mode, and whether the source was a raw format. is_raw_source is workflow-critical, not a passive status field: when true, the first edit should be a Camera Raw develop pass on the base smart object (via a camera-raw develop tool, if one is registered in tools/list) — NOT stacked tonal adjustment layers. Use this in the pipeline to load Inbox files for editing. If the file is ALREADY open, its existing document is activated rather than opened a second time — already_open: true says so, and any edits made to it are still there (Photoshop would otherwise open a duplicate with a fresh Background, which silently strands prior work).
Inputs: file_path (required), bit_depth, suppress_dialogs. Returns: context, message, success, width_px, +9 more
ps_overviewARead-onlyIdempotent
Orientation brief for the entire MCP — workflow contract, capabilities map by category, verification primitives, escape-hatch policy, known gaps. READ THIS FIRST when the user gives you an open-ended editing task. Read-only, idempotent, no document required, no Photoshop call (returns a static markdown brief). Skip it for trivial single-tool requests where you already know which tool fits.
Inputs: no named parameters. Returns: brief, bytes, sections
ps_pathADestructive
Work with editable vector PATHS — the connective tissue between selections, brush strokes, and clipping. One op-discriminated tool: create_from_selection (selection → work path), create_from_placement (NAME a curve → editable saved path, the grounded pen), save (name the work path), list, delete, load_as_selection (path → selection), stroke (paint a brush-family tool along a path), fill (fill a path region), set_clipping (mark a saved path as the clipping path). Reach for this when: tracing a named curve (an edge, a landmark contour) into an editable path, turning a precise selection into a reusable/strokeable outline, converting a saved path back to a selection, or outlining/filling a shape exactly. create_from_selection and load_as_selection are an exact round-trip. stroke/fill bake pixels and auto-duplicate the target layer. Every op returns path_info (counts + per-path subpath/anchor totals) so you can verify the path landed; load_as_selection also returns selection_info.
Inputs: op (required), mode, name, tool, +10 more. Returns: mode, name, tool, count, +22 more
ps_pingARead-onlyIdempotent
Test connection to Photoshop and report session-start discovery signals. Read-only and idempotent. Call this once at the start of a session to confirm liveness before invoking any other tool. If the user has given you an open-ended editing task, ALSO call ps_overview after this — it returns the workflow contract + capabilities map + verification primitives so you can plan well. Returns version (folds the removed get-version tool), custom_action_sets (count of Action Sets loaded in the Photoshop Actions palette — non-zero means recorded workflows exist; if action tools are available in this build they will appear in tools/list), user_templates (count of saved Editmamei templates), and open_documents (names of documents already open in Photoshop, so the LLM can see which document to target).
Inputs: no named parameters. Returns: message, version, degraded, connected, +5 more
ps_place_imageA
Place an image file (JPEG, PNG, PSD, etc.) as a new Smart Object layer in the active document, optionally offset from center. Rasterize separately if you need to apply pixel-only operations. Open-world: reads from the filesystem. Returns the new layer name, bounds, and updated document context.
Inputs: file_path (required), x, y, width_percent, +1 more. Returns: placed, context, filePath, position, +2 more
ps_portrait_touchupADestructive
Detection-driven face touch-ups using LOCAL on-device face detection. op=dodge_face brightens the detected face(s) with a non-destructive masked adjustment layer. op=soften_skin applies a soft blur over the face(s) on a duplicate layer (light, bounding-box-level smoothing). Works from the face bounding box — precise landmark ops (eyes/teeth/lips) are not part of this tool. Multiple faces are handled together. Pair with ps_detect (target=faces) to preview detection first.
Inputs: op (required), amount, max_dimension, face_threshold. Returns: op, boxes, faces, image, +2 more
ps_rasterize_layerADestructive
Rasterize the active layer (convert text or smart object to plain pixels). Destructive — the text/smart-object source is lost. No-op if already a normal raster layer. Returns context so the caller sees the layer kind transition.
Inputs: no named parameters. Returns: kind, context, message, newKind, +2 more
ps_read_sceneARead-onlyIdempotent
The full scene model — run this before a spatially-targeted edit, not the cheaper ps_detect: detected subjects (with the main one flagged) and faces in document pixels, a coarse sky/ground region map, the horizon line (y + placement + confidence), tonal zones (shadow/midtone/highlight bands + coverage), composition geometry (which thirds cell the subject sits in, balance, headroom), and the menu of selectable named regions. The structured model is complete on its own — pass annotate:true for an annotated preview JPEG when you actually need to see it drawn. Built using LOCAL on-device vision + classical CV; annotate:true returns a JPEG to your AI client. Select regions by name with ps_select_by_reference instead of guessing a rectangle. Read-only: renders a throwaway duplicate. Perception is cached per document state, so repeated reads are cheap.
Inputs: refresh, annotate, save_regions, max_dimension, +1 more. Returns: doc, faces, horizon, regions, +5 more
ps_redoA
Step forward in the document history (equivalent to Ctrl/Cmd+Shift+Z). Only works if ps_undo was the last operation; making a fresh edit destroys the redo stack. Returns updated context.
Inputs: steps. Returns: steps, redone, undone, context, +3 more
ps_replace_skyA
Run Photoshop's Sky Replacement (Adobe Sensei): detect the sky, composite a replacement, and relight/colour-grade the foreground to match. Non-destructive — everything lands in a "Sky Replacement Group" of editable layers above the original, so the result can be tuned or deleted afterwards. Pick one of Photoshop's built-in skies by name with sky (no path needed; sky "list" names them), or pass sky_file with an ABSOLUTE path to ANY image on disk; with neither, Photoshop's Blue Sky 001 is used (or the first installed sky). Reach for harmonization_opacity and foreground_lighting_opacity when the composite reads as pasted-on; those two carry most of the believability. Fails cleanly when the image has no detectable sky (indoor or closed compositions).
Inputs: sky, sky_file, sky_name, brightness, +6 more. Returns: skies, context, message, replaced, +5 more
ps_report_problemA
Collect an ANONYMIZED diagnostic bundle and write it to the user's Downloads folder so they can attach it to a bug report — use when Editmamei misbehaves (won't connect, a tool keeps failing, unexpected results). The bundle holds recent server logs, system info (Editmamei/OS/Photoshop versions), and a content-free summary of recent tool calls (name, success, duration, error class). It contains NO image content, the tool-call summary carries NO tool arguments, and file paths are reduced to basenames; log lines can still quote a layer name or a value from an error message. Does not touch Photoshop; writes one JSON file. After calling, tell the user the file path and that they can attach it to a new issue at https://github.com/editmamei/editmamei/issues.
Inputs: note. Returns: path, bytes, issues_url, server_log_lines, +2 more
ps_resize_imageADestructiveIdempotent
Resize the entire document canvas (all layers) to the specified absolute dimensions. Destructive: downscaling permanently loses pixel data. Idempotent: same width/height always yield the same result. For aspect-preserving downscale during export, see ps_export (format=jpeg / png) which resize a duplicate. Returns updated document context.
Inputs: width (required), height (required). Returns: width, height, context, success
ps_retouchADestructive
Selection-driven content-aware retouch — choose the technique with method. Requires an active selection (throws if none, so Content-Aware Fill never silently fills the whole layer). Auto-duplicates the active layer by default so the original is preserved (auto-duplicate-first); pass apply_to_active_layer: true to bake into the original. content_aware_fill synthesizes a fill from surroundings (remove wires/objects/blemishes); patch samples replacement pixels from a chosen offset — or NAME the source region with source_placement (grounded + gated); content_aware_move relocates the selection and fills the source — offset, or NAME where with destination_placement.
Inputs: method (required), scale, mirror, rotate, +15 more. Returns: context, retouch, target_was_copy, target_layer_name, +1 more
ps_save_psdADestructiveIdempotent
Save the active document as a layered PSD to the given path. Saves as a copy, so the working document is unmodified and unrenamed. Use this in the pipeline to land an editable PSD into the Edit folder.
Inputs: output_path (required), overwrite, keep_scene_channels, maximize_compatibility. Returns: bytes, layers, context, success, +4 more
ps_selectA
Create a NEW selection — choose with mode. (To edit the CURRENT selection instead — including growing it by colour similarity — use ps_modify_selection.) all selects the canvas; none deselects; inverse inverts the current selection (e.g. select the subject, then inverse to act on the background). rectangle (left/top/right/bottom, optional feather_px to avoid hard block-edges in smooth sky). ellipse (left/top/right/bottom bounding box + anti_alias — circles/ovals). color_range (target red/green/blue + fuzziness — "select all the red / skin tones"). luminance_range (highlights/shadows/midtones — foundation for glow / dodge-burn). magic_wand (click x/y + tolerance, contiguous). focus_area selects by depth of field rather than subject or colour (+in_focus_radius, soft_mask) — check whole_canvas_selected/warning in the result before trusting it. grow / similar are DEPRECATED here (they act on the CURRENT selection, not a new one) — use ps_modify_selection(op=grow|similar) instead; kept for one release for backward compatibility, identical behaviour. rectangle/ellipse/magic_wand also accept a grounded placement (NAME a region/point instead of guessing pixels — resolved + gate-verified). The geometric/color/wand modes take selection_type (replace|add|subtract|intersect) to combine with an existing selection and return a rich selection_info bundle — verify it (or ps_get_selection_preview) before committing to a mask.
Inputs: mode (required), x, y, red, +21 more. Returns: method, preset, warning, inverted, +24 more
ps_select_by_referenceA
Select a region by NAME instead of coordinates — the natural-mask alternative to a rectangle — with a CONFIDENCE GATE. target=sky/ground/foliage/subject/face/shadows/highlights/skin/above_horizon resolves through the right Photoshop-native method (threshold for sky, invert-sky−subjects for ground, luminance for shadows/highlights, skin-tone colour ∩ the subject box, the detected face/subject box) and is SCORED before it is offered: a clean region is left selected; an unconfident one is NOT selected and reported as honest absence (the city with no real sky gets no sky). Some builds add precise FACE-FEATURE targets backed by the face mesh — face_skin (the retouch mask: face minus eyes/brows/lips), face_eyes, face_brows, face_lips, face_teeth (mouth opening), face_nose, face_under_eye, face_cheeks — each a real geometry-following selection, derived on first request and then saved as a scene:face_* channel so repeats load instantly. passed/confidence are returned. A region derived here is cached as a scene:* channel keyed by TARGET ONLY, so a later call for the same target loads it by name; pass refresh:true to force a fresh derive after an edit that changes what the region means, and note that narrowing a call with label/instance/composition_context always derives (it neither reads nor writes that shared channel). The structural floor (coherence, horizon alignment) is never tuned; for an artistic/non-standard shot pass composition_context (e.g. profile:big_sky) to relax the compositional priors so a legitimately large sky is not rejected. For target=subject with several present, pass label and/or instance. Build/inspect with ps_read_scene first; verify with ps_get_selection_preview (the red-overlay is the human/agent oversight view). Prefer this over a rectangle for any real-world region.
Inputs: target (required), label, refresh, instance, +2 more. Returns: op, doc, detail, method, +6 more
ps_selection_channelA
Persist, restore, or manage a named Alpha channel — choose with op. save: store the current selection to channel_name (overwrites if it exists) so a complex AI/multi-step/feathered selection can be reloaded without rebuilding (throws if no active selection). load: restore a saved channel as the selection, with operation (replace|add|subtract|intersect) to combine — reapply one selection across layers. duplicate: copy an existing alpha/spot channel to a new one (optional new_channel_name). delete: remove an alpha/spot channel (won't touch the RGB/CMYK/Lab component channels).
Inputs: op (required), channel_name (required), operation, new_channel_name. Returns: saved, loaded, deleted, operation, +6 more
ps_select_layerAIdempotent
Make a layer active by name. Recurses into groups; if a name appears more than once, picks the first match in stack order (top-to-bottom). Throws if no layer by that name exists. Foundational for multi-layer workflows — use after ps_duplicate_layer or ps_add_adjustment_layer when you need to focus a specific layer before applying further operations.
Inputs: name (required). Returns: kind, name, context, selected
ps_select_skyAIdempotent
Run Photoshop's "Select Sky" (Adobe Sensei, PS 2021+). One-call sky masking for landscape work. Default sample_all_layers=true analyzes the full visible composite. Returns selection_info — high edge_complexity on tricky horizons (foreground objects against sky) is the signal to verify with ps_get_selection_preview before committing.
Inputs: selection_type, sample_all_layers. Returns: method, selected, strategy_used, selection_info, +3 more
ps_select_subjectAIdempotent
Run Photoshop's "Select Subject" (Adobe Sensei). One-call selection of the main subject — person, animal, product, etc. ~2-5s on typical images. Default sample_all_layers=true analyzes the full visible composite, which matches PS 2025 behavior and works around the PS 2026 "active layer only" default that fails opaquely when the active layer is a blurred / adjusted copy. Combines with existing selection via selection_type. Returns selection_info so the agent can verify area / edge complexity; if results look off, call ps_get_selection_preview for a visual. On failure, the error message lists fallbacks (Cloud processing in PS Preferences, manual UI selection).
Inputs: selection_type, sample_all_layers. Returns: method, selected, strategy_used, selection_info, +3 more
ps_sequenceADestructive
Run an ordered list of tool calls against the current document in ONE round trip. WHEN TO REACH FOR THIS: several dependent steps you already know you want (e.g. select → adjust → merge, or a repeated resize/export pass) where you do not need to look at the result between them — each step is dispatched the same way an ordinary call is and sees the document exactly as the previous step left it. Not for exploratory work: if the next step depends on inspecting this one first, call the tools individually instead. Every step must name a tool that already exists in this edition (ps_sequence cannot call itself). An inline preview (image content) returned by a step is dropped unless that step is the LAST one in the sequence, since previews are most of a result's bytes and the point of batching calls is to stop paying for them on every intermediate step. Each step keeps its own time limit, exactly as it would if you called it on its own. The sequence's overall budget only decides whether to START another step, so it never cuts one off mid-run — a call can therefore finish after that ceiling by however long the in-flight step still needs, plus the undo and its verification reads when on_error='rollback'. With return='full', every step's complete result (not just the last one's) lands in the logged call payload.
Inputs: steps (required), return, on_error. Returns: final, steps, return, message, +7 more
ps_set_layerAIdempotent
Set a property of the active layer — chosen via property. Idempotent absolute setters; do not change which layer is active. opacity: pass opacity (whole layer incl. styles) and/or fill_percent (pixels only — Photoshop's separate "Fill" slider, for Hard Mix / stroke-only effects). blend_mode: how the layer composites below (NORMAL to reset). visibility: show/hide via visible. locked: allLocked via locked. name: rename via name. Returns context so the LLM keeps state awareness.
Inputs: property (required), name, locked, opacity, +3 more. Returns: name, value, locked, context, +14 more
ps_shapeA
Draw a vector SHAPE layer — rectangle (optionally rounded via corner_radius), ellipse, or line — filled with a solid color, optionally stroked. Hoisted out of the active layer's group by default even though the underlying Mk-contentLayer descriptor carries no placement target and would otherwise nest the new layer INSIDE that group (pass into_active_group:true to keep that native nesting). Aim it EITHER by anchor-relational placement (preferred: name anchors + a relation and the resolver computes the geometry, verified by an objective gate — no pixel-guessing; rectangle/ellipse ← a region relation, line ← a path relation) OR by ABSOLUTE document pixels (top-left origin: rectangle/ellipse take left/top/right/bottom; line takes start_x/start_y → end_x/end_y plus weight — you must know the pixel positions, so prefer the anchor-relational placement path above and verify the result with a preview). Creates a new vector layer (non-destructive — delete it to remove). (AM-only; verified live on PS 27.2.0.)
Inputs: type (required), top, left, end_x, +12 more. Returns: context, hoisted, stroked, placement, +4 more
ps_textA
Text layer — create it or style it, chosen with op. create: a new text layer with text at x/y and font_size. set_content/set_font/set_color/set_alignment act on the currently active text layer (throws if it isn't one). Font names accept either the PostScript name ("ArialMT") or family name ("Arial", resolved to its Regular/first variant); throws clearly if no installed font matches. The set_* ops are idempotent.
Inputs: op (required), x, y, red, +6 more. Returns: font, size, text, color, +8 more
ps_transform_canvasA
Transform the whole document (canvas + all layers), not a single layer — choose with op. rotate spins the canvas by degrees (+cw; pass 90/180/-90 for quarter/half turns). flip mirrors the canvas horizontal|vertical. For rotating/flipping ONE layer use ps_transform_layer instead.
Inputs: op (required), degrees, orientation. Returns: axis, degrees, flipped_canvas, rotated_canvas
ps_transform_layerA
Transform the active layer — choose the operation with op. fit scales to fit (letterbox) or fill (crop) the canvas and centers (idempotent). scale does uniform (scale_percent) or non-uniform stretch/squash (scale_x_percent/scale_y_percent) — multiplicative, not idempotent. move translates via exactly one of delta (relative), absolute (top-left target), center_on (center target — best for "place inside the frame opening"), or an anchor-relational placement (preferred: a point relation → the layer center moves to the resolved, gate-verified point); mixing the raw modes errors. rotate rotates by relative degrees around center. flip mirrors horizontal/vertical. skew slants the layer (skew_h_degrees/skew_v_degrees). free is a numeric free-transform (scale + degrees + offset). scale/move/rotate/flip/skew/free auto-promote the background layer (background_promoted=true).
Inputs: op (required), axis, mode, degrees, +15 more. Returns: axis, mode, moved, fitted, +21 more
ps_undoA
Step backward in the document history (equivalent to Ctrl/Cmd+Z). WHEN TO REACH FOR THIS: after an experimental destructive bake (ps_merge mode=visible/flatten, ps_filter op=apply type=*_blur/sharpen/noise) produced a wrong result; or to revert an entire branch of exploration. Non-destructive workflows (adjustment layers + masks) rarely need this — just tweak/delete the offending layer instead. Reversible via ps_redo as long as no new edit has been made since. Returns current history state, remaining steps, and document context.
Inputs: steps. Returns: steps, redone, undone, context, +3 more
ps_vector_maskADestructive
Attach, remove, (un)link, or (dis/en)able a layer VECTOR MASK — the path-driven, resolution-independent companion to a pixel layer mask. Ops: add (from the active path via source=from_current_path — the typical flow after ps_path op=create_from_selection / save — or an empty source=reveal_all/hide_all mask), delete, link, unlink, disable (turn the mask off without deleting it), enable (turn it back on). Reach for this when you want a crisp vector-edged mask rather than a painted pixel mask. add needs a non-background layer (and a path for from_current_path); the other ops need a layer that already has a vector mask. (Vector masks are AM-driven; verified live on PS 27.2.0.)
Inputs: op (required), source. Returns: source, context, layer_name, vector_mask_added, +3 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 64 tools
Most tools occupy clearly distinct slots (layer ops, selection ops, path ops, verification reads), and the descriptions explicitly cross-reference near-neighbours ('prefer ps_add_adjustment_layer over ps_apply_adjustment', 'use ps_modify_selection for the current selection'). Residual overlap remains: ps_select_subject / ps_select_sky vs ps_select_by_reference(target=subject|sky), ps_detect vs ps_read_scene, ps_fill_layer vs ps_add_fill_layer, and ps_select(op=grow) duplicated in ps_modify_selection — all resolvable, but a real source of misselection at 64 tools.
Nearly everything is `ps_` + snake_case, which is highly predictable. The only deviation is noun-style names (ps_document, ps_layer_mask, ps_selection_channel, ps_path, ps_text, ps_group, ps_shape, ps_guides) alongside verb_noun names (ps_create_layer, ps_select_layer, ps_transform_layer), plus a scattering of pure-control names (ps_ping, ps_overview, ps_undo, ps_redo). Readable and mostly systematic, but not a single uniform verb_noun convention.
64 tools is far past the comfortable range and represents a large context/selection burden. The underlying domain (full Photoshop automation: layers, selections, masks, paths, shapes, text, filters, detection, verification) genuinely justifies breadth, and ps_overview / ps_list_capabilities exist to keep the agent oriented, so it is heavy-but-defensible rather than bloat.
Coverage is unusually thorough: documents, layers, groups, masks, paths, shapes, text, adjustments, filters, smart objects, history, plus a strong verification surface (preview, histogram, region compare, bounds diff). Gaps are minor but real — camera-raw develop is only referenced conditionally, layer-style editing is add-only (no modify/remove), and brush/preset selection is limited to a parameter rather than a discovery tool.
Maintenance
Related MCP Connectors
Hosted MCP server for AI photo editing: nothing to install, no desktop photo editor needed.
Edit images over MCP with object removal, background removal, and guided generative edits.
AI video editor for agents and humans: timeline, captions, color, audio and generation as MCP tools.
The Figma MCP server brings Figma design context directly into your AI workflow.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server for controlling Adobe Photoshop from AI assistants, with Windows-first workflow, structured state, smoke-tested action playback, and a bundled Codex skill for image editing.4MIT
- AlicenseAqualityDmaintenanceA professional MCP server that lets AI assistants directly control Adobe Photoshop for document creation, layer management, filters, adjustments, shapes, text, and design intelligence like palette generation and font pairing.322MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to control Adobe Photoshop programmatically, supporting recipe workflows, state awareness, and generative AI features through natural language commands.1289,145 npm856MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Adobe Photoshop programmatically through natural language, with state awareness, recipe tools, and a standalone UI.9,145 npmMIT