io.github.editmamei/editmamei
NPM · EDITMAMEI · SCANNED SEP 20
Photoshop MCP server: natural-language AI photo editing in desktop Photoshop. AI orchestration.
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 Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 39 of 115 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency87
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to editmamei/editmamei). View diagnostics → Pass
- License check failed: the license (FSL-1.1-MIT) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability59
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 28680 tokens (~462/item across 62 items; 62 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management88
- Stability check failed: the tool surface changed between 1.1.0 and 1.5.0: 8 tool removals, 0 breaking changes, 3 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 62 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
How do I install the io.github.editmamei/editmamei MCP server?
io.github.editmamei/editmamei runs locally as an npm package, launched with npx -y editmamei. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · editmamei
claude mcp add editmamei-editmamei -- npx -y editmamei
{
"mcpServers": {
"editmamei-editmamei": {
"command": "npx",
"args": [
"-y",
"editmamei"
]
}
}
} {
"servers": {
"editmamei-editmamei": {
"command": "npx",
"args": [
"-y",
"editmamei"
]
}
}
} codex mcp add editmamei-editmamei -- npx -y editmamei
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"editmamei-editmamei": {
"type": "local",
"command": [
"npx",
"-y",
"editmamei"
],
"enabled": true
}
}
} openclaw mcp add editmamei-editmamei --command npx --arg -y --arg editmamei
mcp_servers:
editmamei-editmamei:
command: "npx"
args: ["-y", "editmamei"] {
"McpServers": {
"editmamei-editmamei": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"editmamei"
]
}
}
} assistant mcp add editmamei-editmamei -t stdio -c npx -a -y editmamei
{
"mcpServers": {
"editmamei-editmamei": {
"command": "npx",
"args": [
"-y",
"editmamei"
]
}
}
} 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.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 85 to 88.
- 19 Sept 26 +26
- Malware scan: unverified → pass ▲ security
- Judged manipulation: unverified → pass ▲ security
- Schema quality: unverified → excellent ▲ functional
- 18 Sept 26 −25
- Judged manipulation: pass → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Schema quality: excellent → unverified ▼ functional
- Package version: 1.4.0 → 1.5.0 functional
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 71 to 75.
- 14 Sept 26 −3
No change was recorded against any check on this day. Stability & Change Management went from 88 to 68.
- 13 Sept 26 +1
- CVE-2026-76845 no longer affects this package ▲ security
- Known CVEs: partial → pass ▲ security
- 10 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 79 to 83.
- 9 Sept 26 0
- CVE-2026-76845 affects this package ▼ security
- Known CVEs: pass → partial ▼ security
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 20 Sept 2026 · Analysed npm/editmamei@1.5.0
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 | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | editmamei/editmamei |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/editmamei/editmamei/.github/workflows/release.yml@refs/heads/main |
| Rekor log index | 2886636615 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:00d87a3ffac9c868ae28d039ae0bfca545b44242cf73cf40367141ccdcfebf0060d03eda3d5673c2e334fa4d50bf3a5f166f82a580e8b2708557b7e11 |
Background: How many MCP packages publish verified provenance →
Dependencies 115 packages
| Packages resolved | 115 |
|---|---|
| Stale | 39 |
| 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 →
ps_group ~621
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).
| Name | Type | Req | Description |
|---|---|---|---|
| blend_mode | string | – | Blend mode (Photoshop ExtendScript BlendMode enum). PASSTHROUGH (default for new groups) lets adjustments inside the group affect the layers below the group; NORMAL treats the group as a single compo… |
| confirm | boolean | – | REQUIRED for op=delete and op=ungroup, ignored by the other ops. Must be true — guards against accidental loss of a group and (for delete) everything it contains. |
| group_name | string | – | Name of the destination group (recursive search). |
| into_active_group | boolean | – | Photoshop's Mk-layerSection descriptor carries no placement target, so with a GROUP active it would natively nest the new group INSIDE that group. Default false hoists the new group back out so it la… |
| layer_name | string | – | Name of the layer to move (recursive search). A layer is preferred over a group of the same name; a group is moved only when no layer matches, which is how one group is nested inside another. |
| layers | array | – | Optional list of existing layer names to move into the new group. The first listed name ends up on top of the group stack. Layers not found are returned in `not_found`. |
| name | string | – | Group name. create: name for the NEW group. delete/ungroup/set_blend_mode: the EXISTING group to act on (recursive search). |
| op | string | yes | create: make a new group above the active layer named `name` (hoisted out of an active group by default; into_active_group:true keeps Photoshop's native nesting), optionally moving `layers` into it.… |
| Name | Type | Req | Description |
|---|---|---|---|
| blendMode | string | – | op=set_blend_mode: the mode applied. |
| child_names | array | – | op=ungroup: names of the promoted children. |
| children_promoted | number | – | op=ungroup: children promoted to the parent level. |
| context | object | – | – |
| created | boolean | – | op=create: true on success. |
| deleted | boolean | – | op=delete: true on success. |
| descendants_deleted | number | – | op=delete: total layers removed with the group. |
| groupName | string | – | – |
| hoisted | boolean | – | op=create: true when the new group had to be moved back out of the previously-active group to honor into_active_group:false. |
| layerName | string | – | op=add_layer: the moved layer. |
| moved | boolean | – | op=add_layer: true on success. |
| moved_count | number | – | op=create: layers moved into it. |
| not_found | array | – | op=create: requested layer names that were not found. |
| parent_path | array|null | – | op=create: the containing-group name chain (outermost first), empty array at the document root. |
| set | boolean | – | op=set_blend_mode: true on success. |
| ungrouped | boolean | – | op=ungroup: true on success. |
No examples provided.
ps_guides ~284
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.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | integer | – | Number of evenly-spaced columns (vertical guides). 0 = none. |
| op | string | yes | Guide operation. add: one guide at position (orientation + position px). layout: an evenly-spaced grid (columns and/or rows). clear: remove ALL guides from the document. |
| orientation | string | – | 'vertical' adds a top-to-bottom guide positioned by its x coordinate; 'horizontal' adds a left-to-right guide positioned by its y coordinate. |
| position | number | – | Guide position in document pixels (the x for a vertical guide, the y for a horizontal guide). |
| rows | integer | – | Number of evenly-spaced rows (horizontal guides). 0 = none. |
| Name | Type | Req | Description |
|---|---|---|---|
| columns | number | – | – |
| guide_added | boolean | – | – |
| guide_layout_created | boolean | – | – |
| guides_cleared | boolean | – | – |
| orientation | string | – | – |
| position | number | – | – |
| rows | number | – | – |
No examples provided.
ps_inspect ~336
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.
| Name | Type | Req | Description |
|---|---|---|---|
| sections | array | – | Optional subset of sections to return. Omit for all sections. The context block (active doc + layer + selection state) is always returned regardless. Use ["context"] for a cheap orientation call that… |
| what | string | yes | Which read-only state to return. metadata: document/IPTC/camera-EXIF/GPS/ACR develop settings + active context (optionally subset with `sections`; sections=["context"] is the cheap orientation probe)… |
| Name | Type | Req | Description |
|---|---|---|---|
| acr | object | – | – |
| activeLayer | string | – | – |
| bounds | array | – | – |
| camera | object | – | – |
| canRedo | boolean | – | – |
| canUndo | boolean | – | – |
| context | object | – | – |
| currentIndex | number | – | – |
| currentState | string | – | – |
| document | object | – | – |
| documentName | string | – | – |
| document_id | string|null | – | – |
| file_reference | string|null | – | – |
| gps | object | – | – |
| iptc | object | – | – |
| is_smart_object | boolean | – | – |
| layer_kind | string | – | – |
| layer_name | string | – | – |
| linked | boolean | – | – |
| placed | string|null | – | – |
| selection_info | object | – | – |
| smart_filter_count | number | – | – |
| source_metadata | object | – | – |
| states | array | – | – |
| topLevelCount | number | – | – |
| totalStates | number | – | – |
| tree | array | – | – |
No examples provided.
ps_layer_mask ~493
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. **Don't write `Mk Chnl At=Msk` or `Grdn` AM scripts in execute_script — this tool already does both.**
| Name | Type | Req | Description |
|---|---|---|---|
| end | number | – | op=gradient: 0-1 fraction where the fade completes — fully hidden from here on. Must be greater than start. |
| extent | string | – | op=gradient: measure start/end over the active layer's pixel bounds (default) or the whole canvas. A layer with no pixel bounds falls back to canvas. |
| fade_to | string | – | op=gradient: the side that ends fully HIDDEN (mask black). The opposite side stays fully visible. E.g. a water reflection fades with fade_to=bottom. |
| op | string | yes | create: add a layer mask on the active layer (if a selection is active it reveals the selection — the "mask to the frame opening" answer; adjustment layers load the selection into their built-in mask… |
| start | number | – | op=gradient: 0-1 fraction along the fade direction where the fade begins — the layer stays fully visible up to here. |
| Name | Type | Req | Description |
|---|---|---|---|
| activeLayerKind | string | – | – |
| bounds_used | object | – | – |
| context | object | – | – |
| created_mask | boolean | – | op=gradient: true when the reveal-all mask had to be created first. |
| extent | string | – | op=gradient: 'layer' or 'canvas' — reports the extent actually used. |
| fade_to | string | – | – |
| from | object | – | op=gradient: fully-visible end of the drawn fade, doc pixels. |
| hadSelection | boolean | – | – |
| layer_name | string | – | – |
| maskApplied | boolean | – | – |
| maskCreated | boolean | – | – |
| maskDeleted | boolean | – | – |
| mask_gradient | boolean | – | – |
| modifiedExistingMask | boolean | – | – |
| to | object | – | op=gradient: fully-hidden end of the drawn fade, doc pixels. |
No examples provided.
ps_list_capabilities ~111
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| group_count | number | – | – |
| groups | array | – | – |
| tool_count | number | – | – |
No examples provided.
ps_merge ~194
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.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | yes | visible: collapse all visible layers into one (DESTRUCTIVE; identities lost). stamp: merge visible into a NEW layer on top, originals kept (Ctrl+Alt+Shift+E — non-destructive "final tweak" composite)… |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| flattened | boolean | – | – |
| layer_count_after | number | – | – |
| layer_count_before | number | – | – |
| merged | boolean | – | – |
| new_layer_name | string | – | – |
| original_active_layer_name | string | – | – |
| stamped | boolean | – | – |
No examples provided.
ps_modify_selection ~847
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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | – | Pixel amount: expand/contract distance, smooth radius, or border width. Required for expand/contract/border/smooth. |
| anti_alias | boolean | – | Soften the selection edge. Default true. |
| at_canvas_bounds | boolean | – | expand/contract/smooth: if true, the effect still applies where the selection meets the canvas edge. Default false. |
| contrast | number | – | Edge contrast percent (0-100) — re-sharpens an over-soft edge. |
| decontaminate | boolean | – | Decontaminate edge colors (removes color fringing). |
| feather | number | – | Feather radius in pixels (0-1000) — softens the edge. |
| offset_x | number | – | Translate the selection horizontally, pixels (relative). Default 0. |
| offset_y | number | – | Translate the selection vertically, pixels (relative). Default 0. |
| op | string | yes | feather: soften the selection edge by radius_px. refine_edge: Select-and-Mask global sliders (smooth, feather, contrast, shift_edge, radius edge-detection, decontaminate) to clean halos / soft hair e… |
| radius | integer | – | Edge-detection radius in pixels (0-250) — helps capture soft/fuzzy edges (hair). |
| radius_px | number | – | Feather radius in pixels (must be > 0). |
| rotate_degrees | number | – | Rotate the selection clockwise, degrees. Default 0. |
| scale_x_percent | number | – | Horizontal scale of the selection, percent. Default 100 (no change). |
| scale_y_percent | number | – | Vertical scale of the selection, percent. Default 100 (no change). |
| shift_edge | number | – | Shift the edge inward (negative) or outward (positive), percent (-100 to 100). |
| smooth | integer | – | Smooth the selection edge (0-100). |
| tolerance | integer | – | Color similarity tolerance (0-255) for which neighbouring pixels are added. Default 32. |
| Name | Type | Req | Description |
|---|---|---|---|
| amount_px | number | – | – |
| anti_alias | boolean | – | op=grow/similar: anti_alias used. |
| contrast | number | – | – |
| decontaminate | boolean | – | – |
| feather | number | – | – |
| feathered | boolean | – | – |
| method | string | – | op=grow/similar: "grow" or "similar". |
| mode | string | – | – |
| modified | boolean | – | – |
| offset_x | number | – | – |
| offset_y | number | – | – |
| output | string | – | – |
| radius | number | – | – |
| radius_px | number | – | – |
| refined | boolean | – | – |
| rotate_degrees | number | – | – |
| scale_x_percent | number | – | – |
| scale_y_percent | number | – | – |
| selected | boolean | – | op=grow/similar: true on success. |
| selection_info | object | – | Rich post-op stats. Use these to verify the selection actually grabbed what was intended before committing it to a mask. `has_selection:false` short-circuits the rest of the fields (they will be abse… |
| shift_edge | number | – | – |
| smooth | number | – | – |
| tolerance | number | – | op=grow/similar: tolerance used. |
| transformed | boolean | – | – |
No examples provided.
ps_move_layer_to_position ~309
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=<name> 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).
| Name | Type | Req | Description |
|---|---|---|---|
| layer_to_move | string | – | Optional: name of the layer being moved. If omitted, the active layer is moved (legacy behaviour). |
| position | string | yes | Where to move the layer. ABOVE/BELOW = relative to target_layer_name (which is then REQUIRED); TOP/BOTTOM = absolute top/bottom of the layer stack (target_layer_name not needed). Uppercase required. |
| target_layer_name | string | – | Required for ABOVE/BELOW: the layer to move relative to. Ignored for TOP/BOTTOM. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| direction | string | – | – |
| layerName | string | – | – |
| message | string | – | – |
| moved | boolean | – | – |
| position | string | – | – |
| relativeTo | string | – | – |
No examples provided.
ps_open_document ~310
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).
| Name | Type | Req | Description |
|---|---|---|---|
| bit_depth | number | – | Open-time bits per channel, RAW sources only. Set this here rather than converting later: ps_convert_image_mode FLATTENS the document, so depth cannot be changed once an edit stack exists. Prefer 16… |
| file_path | string | yes | Absolute path to the file to open |
| suppress_dialogs | boolean | – | Suppress all PS dialogs during open (raw/HEIC use last-used ACR settings). Default true for pipeline use. |
| Name | Type | Req | Description |
|---|---|---|---|
| already_open | boolean | – | – |
| bit_depth_warning | string | – | Present only when a requested bit_depth was not what the document actually opened at — because the file is not a raw source, or Photoshop declined the requested depth. Absent means bits_per_channel i… |
| bits_per_channel | number | – | – |
| color_mode | string | – | – |
| context | object | – | – |
| document_name | string | – | – |
| file_path | string | – | – |
| height_px | number | – | – |
| is_raw_source | boolean | – | True when the source file was a raw capture (DNG/NEF/CR3/ARW/…). Workflow-critical: the open used last-used/default Camera Raw settings, so no deliberate develop has happened yet. When true, run the… |
| resolution | number | – | – |
| success | boolean | yes | – |
| width_px | number | – | – |
No examples provided.
ps_overview ~85
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | number | – | – |
| sections | array | – | – |
No examples provided.
ps_path ~1,017
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.
| Name | Type | Req | Description |
|---|---|---|---|
| anti_alias | boolean | – | load_as_selection / fill: anti-alias the edge. Default true. |
| apply_to_active_layer | boolean | – | If false (default), the stroke / fill op is applied to a duplicate of the active layer named "<OpName> (<Original Name>)" — the original is preserved and the LLM can undo simply by deleting the copy.… |
| closed | boolean | – | create_from_placement only: close the path into a loop (connect the last anchor back to the first). Default false (an open path). |
| color | object | – | fill only: RGB fill color (each 0-255). Default black. |
| feather | number | – | load_as_selection / fill: soften the result edge by this many pixels. Default 0. |
| flatness | number | – | set_clipping only: device-pixel flatness for the clipping path (0.2-100; higher = coarser curve approximation). Omit for the PS default. |
| mode | string | – | fill only: blend mode for the fill. Default 'normal'. |
| name | string | – | Path name. REQUIRED for save, set_clipping, and create_from_placement (the new saved path is named). Optional for delete / load_as_selection / stroke / fill — when omitted those target the current wo… |
| op | string | yes | create_from_selection: convert the active selection into a work path (tolerance = crude↔detailed dial; CLEARS the selection). create_from_placement: NAME a curve (placement → a path relation: `along`… |
| opacity | number | – | fill only: fill opacity percent (0-100). Default 100. |
| operation | string | – | load_as_selection only: how the loaded selection combines with any existing one. Default 'replace'. |
| placement | object | – | create_from_placement only: NAME the curve the path follows, as an anchor-relational placement that resolves to a PATH (relation `along` a traced edge / a Pro landmark curve, or a `segment` between t… |
| tolerance | number | – | create_from_selection only: makeWorkPath tolerance in pixels (0.5 = hug every detail → 10 = crude). Default 2. |
| tool | string | – | stroke only: which brush-family tool paints the path (see this field's own enum for the full supported set). Default 'brush'. |
| Name | Type | Req | Description |
|---|---|---|---|
| anchors | number | – | – |
| clipping_path_set | boolean | – | – |
| closed | boolean | – | – |
| context | object | – | – |
| count | number | – | – |
| created | boolean | – | – |
| deleted | boolean | – | – |
| filled | boolean | – | – |
| loaded | boolean | – | – |
| mode | string | – | – |
| name | string | – | – |
| operation | string | – | – |
| original_layer_name | string | – | – |
| path_info | object | – | – |
| path_name | string | – | – |
| paths | array | – | – |
| placement | object | – | – |
| saved | boolean | – | – |
| selection_consumed | boolean | – | – |
| selection_info | object | – | – |
| stroked | boolean | – | – |
| target_layer_name | string | – | – |
| target_was_copy | boolean | – | – |
| tolerance | number | – | – |
| tool | string | – | – |
| tool_type | string | – | – |
No examples provided.
ps_ping ~182
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 does not have to ask which doc to edit).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| connected | boolean | – | – |
| custom_action_sets | number | – | – |
| degraded | array | – | List of optional discovery signals that could not be gathered (e.g. "pingState" if the go-core snippet builder itself failed to produce the in-PS state script — a broken/missing local install, unrela… |
| notify_user | boolean | – | True on the one ping whose text carries the update notice — relay that notice to the user before continuing. False on later pings and when no update is available. |
| open_documents | array | – | – |
| update_available | object|null | – | Set when a newer Editmamei version is published, else null: { current, latest, channel (npm/mcpb/dev), how_to_update, fixed_tools (tools whose recorded failures the newer version fixes) }. The relay… |
| user_templates | number | – | – |
| version | string | – | – |
No examples provided.
ps_place_image ~272
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.
| Name | Type | Req | Description |
|---|---|---|---|
| file_path | string | yes | Full path to the image file (JPEG, PNG, PSD, etc.) |
| height_percent | number | – | Scale the placed layer vertically to this percent of its native height. Omit (or pass 100) to keep native size. Pair with width_percent for uniform scale (set both to the same value). |
| width_percent | number | – | Scale the placed layer horizontally to this percent of its native width. Omit (or pass 100) to keep native size. Common ratios: 50 for half-size, 200 for double. Independent from height_percent — pas… |
| x | integer | – | X position offset in pixels from the canvas centre (default 0). Negative places the layer further left; bounded at ±300,000 px. |
| y | integer | – | Y position offset in pixels from the canvas centre (default 0). Negative places the layer further up; bounded at ±300,000 px. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| filePath | string | – | – |
| layerBounds | object | – | – |
| layerName | string | – | – |
| placed | boolean | – | – |
| position | object | – | – |
No examples provided.
ps_rasterize_layer ~58
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| kind | string | – | – |
| message | string | – | – |
| newKind | string | – | – |
| originalKind | string | – | – |
| rasterized | boolean | – | – |
No examples provided.
ps_read_scene ~561
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; the image never leaves the machine. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| annotate | boolean | – | Also return an annotated preview JPEG with subject boxes (magenta), faces (cyan), and the horizon line (yellow) drawn. Default false: the structured scene model returned by this call is already compl… |
| composition_context | object | – | Optional: tune the confidence gate for an artistic/non-standard composition (e.g. profile:big_sky) so a legitimately large region is not rejected. Same shape as ps_select_by_reference. |
| max_dimension | number | – | Long-edge px of the perception export. Returned coordinates are always in full document pixels. |
| refresh | boolean | – | Force a fresh perception pass even if a cached model for the current document state exists. Perception is normally cached per (document, history-state) so it runs once per state. |
| save_regions | boolean | – | EAGERLY derive every region (sky/ground/shadows/highlights/skin/subject/face) up front and SAVE each confident one as a managed `scene:*` alpha channel, so the returned menu carries a verified method… |
| Name | Type | Req | Description |
|---|---|---|---|
| composition | object | – | – |
| doc | object | – | – |
| faces | array | – | – |
| horizon | object | – | – |
| provenance | object | – | – |
| region_menu | array | – | – |
| regions | array | – | – |
| subjects | array | – | – |
| tonal_zones | object | – | – |
No examples provided.
ps_redo ~68
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.
| Name | Type | Req | Description |
|---|---|---|---|
| steps | integer | – | Number of steps to redo (default: 1) |
| Name | Type | Req | Description |
|---|---|---|---|
| availableRedoSteps | number | – | – |
| context | object | – | – |
| currentHistoryState | string | – | – |
| redone | boolean | – | – |
| remainingStates | number | – | – |
| steps | number | – | – |
| undone | boolean | – | – |
No examples provided.
ps_replace_sky ~427
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. sky_file takes an ABSOLUTE path to ANY image on disk, not only Photoshop's built-in presets. 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).
| Name | Type | Req | Description |
|---|---|---|---|
| border_smoothness | number | – | Softens the boundary between sky and foreground. 0 is a hard cut. |
| brightness | number | – | Brightness of the replaced sky itself. |
| edge_lighting_opacity | number | – | Strength of the light wrap along the foreground edge where it meets the sky. |
| foreground_lighting_opacity | number | – | Strength of the relighting applied to the foreground so it appears lit by the new sky. |
| harmonization_opacity | number | – | How strongly the foreground is colour-graded to match the new sky. This is what sells the composite — 0 leaves the foreground untouched and usually reads as pasted-on. |
| shift_edge | number | – | Moves the sky/foreground boundary inward (negative) or outward (positive). Use it when the horizon leaves a halo or eats into the foreground. |
| sky_file | string | yes | ABSOLUTE path to the image to use as the sky. Any image Photoshop can open works — it does not need to be a registered Photoshop sky preset. The built-in skies live as .jpg files under the Sky_Preset… |
| sky_name | string | – | Label recorded on the operation. Cosmetic — it does not select the sky, sky_file does. |
| temperature | number | – | Warms (positive) or cools (negative) the replaced sky. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| group_layers | array | – | Layers inside the group, top to bottom — typically the sky layer, an edge-lighting group, a foreground-lighting layer and a foreground-colour curves layer. |
| group_name | string | – | Name of the layer group Photoshop created. |
| replaced | boolean | – | – |
| sky_file | string | – | – |
| sky_name | string | – | – |
| strategy_used | string | – | – |
No examples provided.
ps_report_problem ~195
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, NO tool arguments, and file paths reduced to basenames. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | – | Optional short description of the problem (what went wrong, what you were doing). Embedded verbatim after sanitization. No file contents or paths needed. |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | number | – | – |
| desktop_log_included | boolean | – | – |
| issues_url | string | – | – |
| path | string | – | – |
| recent_session_count | number | – | – |
| server_log_lines | number | – | – |
No examples provided.
ps_resize_image ~124
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.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | yes | New height in pixels (1..300,000 — Photoshop's max canvas size). |
| width | integer | yes | New width in pixels (1..300,000 — Photoshop's max canvas size). |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| height | number | – | – |
| success | boolean | yes | – |
| width | number | – | – |
No examples provided.
ps_retouch ~895
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`.
| Name | Type | Req | Description |
|---|---|---|---|
| apply_to_active_layer | boolean | – | If false (default), the retouch op is applied to a duplicate of the active layer named "<OpName> (<Original Name>)" — the original is preserved and the LLM can undo simply by deleting the copy. If tr… |
| blend_mode | string | – | Blend mode for the fill. Default `normal`. Use `multiply` or `darken` when filling around hair to keep darker edges; `lighten` for highlights. |
| color_adaptation | boolean | – | When true (default), PS adjusts the synthesized fill to match the surrounding region's color. Turn off only when matching color would compromise structure. |
| destination_placement | object | – | Grounded alternative to offset_x/offset_y: NAME where to move the selection (resolves to a POINT via the grounding resolver + objective gate — a grid intersection, an object centroid, an extremum). T… |
| heal_smooth_factor | integer | – | Internal smoothing factor (0-10). Default 5. |
| method | string | yes | Retouch technique (all require an active selection). content_aware_fill: synthesize a fill from surrounding content (color_adaptation, opacity, blend_mode, rotate/scale/mirror). patch: sample replace… |
| mirror | boolean | – | Allow PS to mirror sampled patches when synthesizing. Default false. |
| offset_x | number | – | Horizontal pixel delta to move the selected content. Positive = right. Required unless destination_placement is given. |
| offset_y | number | – | Vertical pixel delta to move the selected content. Positive = down. Required unless destination_placement is given. |
| opacity | integer | – | Fill opacity 1-100%. Default 100. |
| patch_color | integer | – | Options bar > Color slider (0-10). Default 5. |
| patch_structure | integer | – | Options bar > Structure slider (1-7). Default 4 (CAM default). |
| reshuffle | boolean | – | Allow PS to recompose the moved content from non-contiguous source pixels. Default true (Photoshop default for CAM). |
| rotate | boolean | – | Allow PS to rotate sampled patches when synthesizing. Default false (Photoshop default). |
| sample_all_layers | boolean | – | Sample from all visible layers. Default false. |
| scale | boolean | – | Allow PS to rescale sampled patches when synthesizing. Default false. |
| source_placement | object | – | Grounded alternative to offset_x/offset_y: NAME the patch SOURCE (resolves to a POINT via the grounding resolver + objective gate — e.g. an extremum for the cleanest nearby skin, a grid intersection)… |
| transparent | boolean | – | Respect layer transparency. Default false. |
| use_source | boolean | – | When true (default), the user-drawn selection is the patch source — the natural "patch this region" semantic. False inverts to destination-mode patching. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| original_layer_name | string | – | – |
| retouch | string | – | – |
| target_layer_name | string | – | – |
| target_was_copy | boolean | – | – |
No examples provided.
ps_save_psd ~254
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.
| Name | Type | Req | Description |
|---|---|---|---|
| keep_scene_channels | boolean | – | Keep the managed scene:* alpha channels ps_read_scene precomputes. Default false — they are DERIVED masks (rebuilt by the next scene read) and each is a full-resolution channel, so baking them into t… |
| maximize_compatibility | boolean | – | Include flattened composite for compatibility with other apps. Default true. |
| output_path | string | yes | Absolute output path including filename, e.g. E:\Photos\Edit\shell_01.psd |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| document_name | string | – | – |
| layers | number | – | – |
| saved_to | string | – | – |
| success | boolean | yes | – |
No examples provided.
ps_select ~1,599
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.
| Name | Type | Req | Description |
|---|---|---|---|
| anti_alias | boolean | – | Soften the selection edge. Default true. |
| blue | integer | – | Target blue (0-255). |
| bottom | number | – | Bottom edge in pixels |
| contiguous | boolean | – | If true (default), only selects connected matching pixels. |
| feather_px | number | – | Feather the selection edge by this many pixels after creating it. Default 0 (hard edge). REQUIRED for regional adjustments in smooth areas like open sky — a hard rectangular selection will produce a… |
| fuzziness | integer | – | skin_tones: tolerance/spread around skin-tone colours (0-200). Default 40. |
| green | integer | – | Target green (0-255). |
| in_focus_radius | number | – | How much blur still counts as "in focus", in pixels. Higher pulls more of the soft transition zone into the selection; lower keeps only the crisply resolved plane. 4.07 is the Photoshop dialog defaul… |
| left | number | – | Left edge in pixels |
| lower_limit | integer | – | highlights/midtones: lower brightness bound (0-255). Default 190 (highlights) / 105 (midtones). |
| luminance | string | – | Which tonal band to select by brightness. |
| mode | string | yes | all: select the whole canvas. none: deselect. inverse: invert the current selection. rectangle: left/top/right/bottom (+optional feather_px). ellipse: left/top/right/bottom bounding box (+anti_alias,… |
| placement | object | – | Grounded coordinates (rectangle/ellipse/magic_wand): NAME anchors + a relation instead of guessing pixels. rectangle/ellipse ← a REGION relation (inside/gap) → the selection bounding box; magic_wand… |
| points | array | – | Polygon vertices in ABSOLUTE document pixels: [{x, y}, ...], minimum 3. (0,0) is top-left. The ring auto-closes (last vertex connects back to the first). You must know the pixel coordinates to aim th… |
| red | integer | – | Target red (0-255). |
| right | number | – | Right edge in pixels |
| sample_all_layers | boolean | – | If true, samples color across all visible layers. If false (default), samples the active layer only. |
| selection_type | string | – | How this selection combines with any existing one. 'replace' (default) overwrites; 'add' unions with the existing selection; 'subtract' removes this from the existing; 'intersect' keeps only the over… |
| soft_mask | boolean | – | False (default) yields a hard-edged selection — every pixel fully in or fully out, which is what you want before ps_modify_selection feathering. True lets Photoshop feather the focus falloff itself,… |
| tolerance | integer | – | Color similarity tolerance (0-255). Default 32. |
| top | number | – | Top edge in pixels |
| upper_limit | integer | – | shadows/midtones: upper brightness bound (0-255). Default 65 (shadows) / 150 (midtones). |
| use_faces | boolean | – | skin_tones only: refine the skin-tone selection using face detection. Default false (pure Lab skin-tone colour preset, no AI dependency). |
| x | integer | – | Click X in document pixel coords. |
| y | integer | – | Click Y in document pixel coords. |
| Name | Type | Req | Description |
|---|---|---|---|
| active_layer_temporarily_changed | boolean | – | mode=focus_area: true if the active layer was not an ordinary pixel layer and detection was temporarily retargeted to the bottom layer. Restored before return. |
| anti_alias | boolean | – | – |
| contiguous | boolean | – | – |
| deselected | boolean | – | – |
| feather_px | number | – | – |
| fuzziness | number | – | – |
| in_focus_radius | number | – | mode=focus_area: radius used. |
| inverted | boolean | – | – |
| lower_limit | number | – | – |
| luminance | string | – | – |
| method | string | – | – |
| placement | object | – | – |
| point_count | number | – | – |
| preset | string | – | – |
| requested_bounds | array | – | – |
| sample_all_layers | boolean | – | – |
| sample_point | object | – | – |
| selected | boolean | – | – |
| selection | string | – | – |
| selection_info | object | – | Rich post-op stats. Use these to verify the selection actually grabbed what was intended before committing it to a mask. `has_selection:false` short-circuits the rest of the fields (they will be abse… |
| selection_type | string | – | – |
| soft_mask | boolean | – | mode=focus_area: soft_mask used. |
| strategy_used | string | – | mode=focus_area: "executeAction:focusMask". |
| target_color | object | – | – |
| tolerance | number | – | – |
| upper_limit | number | – | – |
| warning | string|null | – | mode=focus_area: set when whole_canvas_selected is true. |
| whole_canvas_selected | boolean | – | mode=focus_area: true when the RAW detection (before any selection_type combine) covered essentially the entire canvas — usually a non-result. selection_info reports the FINAL, post-combine selection… |
No examples provided.
ps_select_by_reference ~784
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). Pro adds 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.
| Name | Type | Req | Description |
|---|---|---|---|
| composition_context | object | – | Optional: tune the confidence gate from what you SEE in the preview, so an artistic shot is not rejected for breaking norms. The structural floor (coherence / horizon alignment) is never tuned; only… |
| instance | integer | – | For target=subject only: 0-based index counting left-to-right among matching subjects (0 = leftmost). Omit to pick the main/largest. |
| label | string | – | For target=subject only: a COCO class ('person', 'dog', 'car', …) to pick instead of the largest subject. Ignored for other targets. |
| max_dimension | number | – | Long-edge px of the perception export when a fresh pass runs. |
| refresh | boolean | – | Force a fresh perception pass before resolving (default false uses the cached scene model for the current document state). |
| target | string | yes | What to select by NAME (no coordinates): 'sky' (threshold white split), 'above_horizon' (everything above the horizon line), 'ground' / 'foliage' (posterize-region blob), 'subject' (the main detected… |
| Name | Type | Req | Description |
|---|---|---|---|
| confidence | number | – | – |
| detail | object | – | – |
| doc | object | – | – |
| method | string | – | – |
| op | string | – | – |
| passed | boolean | – | – |
| reasons | array | – | – |
| selection_info | object|null | – | – |
| target | string | – | – |
No examples provided.
ps_select_layer ~121
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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the layer to make active. Recurses into groups; matches the first layer in stack order (top-to-bottom). Throws if no layer by that name exists. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| kind | string | – | – |
| name | string | – | – |
| selected | boolean | – | – |
No examples provided.
ps_select_sky ~166
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.
| Name | Type | Req | Description |
|---|---|---|---|
| sample_all_layers | boolean | – | If true (default), the sky model considers all visible layers — the correct setting for most workflows. If false, considers only the active layer. |
| selection_type | string | – | How this selection combines with any existing one. 'replace' (default) overwrites; 'add' unions with the existing selection; 'subtract' removes this from the existing; 'intersect' keeps only the over… |
| Name | Type | Req | Description |
|---|---|---|---|
| active_layer_temporarily_changed | boolean | – | True if active layer was temporarily switched to the bottom layer during detection. Restored before return. |
| method | string | – | – |
| sample_all_layers | boolean | – | – |
| selected | boolean | – | – |
| selection_info | object | – | Rich post-op stats. Use these to verify the selection actually grabbed what was intended before committing it to a mask. `has_selection:false` short-circuits the rest of the fields (they will be abse… |
| selection_type | string | – | – |
| strategy_used | string | – | "dom:selectSky" (preferred DOM method when exposed) or "executeAction:selectSky" (AM fallback). |
No examples provided.
ps_select_subject ~296
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).
| Name | Type | Req | Description |
|---|---|---|---|
| sample_all_layers | boolean | – | If true (default), the model considers all visible layers — matches PS 2025 behavior and the user mental model of "select the subject of this image." If false, considers only the active layer (PS 202… |
| selection_type | string | – | How this selection combines with any existing one. 'replace' (default) overwrites; 'add' unions with the existing selection; 'subtract' removes this from the existing; 'intersect' keeps only the over… |
| Name | Type | Req | Description |
|---|---|---|---|
| active_layer_temporarily_changed | boolean | – | True if we temporarily switched the active layer to the bottom layer during detection (to work around PS 2026 "active layer only" behavior when sample_all_layers=true). Original active layer is resto… |
| method | string | – | – |
| sample_all_layers | boolean | – | – |
| selected | boolean | – | – |
| selection_info | object | – | Rich post-op stats. Use these to verify the selection actually grabbed what was intended before committing it to a mask. `has_selection:false` short-circuits the rest of the fields (they will be abse… |
| selection_type | string | – | – |
| strategy_used | string | – | "dom:selectSubject" (preferred — DOM method, PS handles descriptor internals) or "executeAction:autoCutout" (legacy AM fallback). Telemetry surface: lets us see in the field whether the DOM path need… |
No examples provided.
ps_selection_channel ~360
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).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_name | string | yes | Name of the Alpha channel to restore. Must have been previously saved with ps_selection_channel (op=save). |
| new_channel_name | string | – | duplicate only: name for the new channel. Optional — Photoshop auto-names it "<source> copy" when omitted. |
| op | string | yes | save: store the current selection to a named Alpha channel (channel_name; overwrites if it exists). load: restore a saved Alpha channel as the selection (channel_name + operation to combine). duplica… |
| operation | string | – | How this selection combines with any existing one. 'replace' (default) overwrites; 'add' unions with the existing selection; 'subtract' removes this from the existing; 'intersect' keeps only the over… |
| Name | Type | Req | Description |
|---|---|---|---|
| channel_count | number | – | Total channels in the document after the op. |
| channel_name | string | – | – |
| deleted | boolean | – | – |
| duplicated | boolean | – | – |
| loaded | boolean | – | – |
| new_channel_name | string | – | – |
| operation | string | – | – |
| overwritten | boolean | – | True if an existing channel with the same name was replaced. |
| saved | boolean | – | – |
| selection_info | object | – | Rich post-op stats. Use these to verify the selection actually grabbed what was intended before committing it to a mask. `has_selection:false` short-circuits the rest of the fields (they will be abse… |
No examples provided.
ps_sequence ~559
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.
| Name | Type | Req | Description |
|---|---|---|---|
| on_error | string | – | stop: halt at the first failing step and return results so far. continue: record the failure and run every remaining step anyway. rollback: on the first failing step, undo back to the history state c… |
| return | string | – | summary: one line per step plus the LAST step's full result. full: every step's full result — note this means every embedded payload (not just the last step's) lands in the logged call record. Either… |
| steps | array | yes | Ordered list of tool calls to run against the current document, 1 to 25 items. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap_exceeded | boolean | – | – |
| failed_step | object|null | – | The first failing step, or the step skipped by the overall time budget. Null when every step succeeded. |
| final | object | – | The last step's full CallToolResult (summary mode only). |
| on_error | string | yes | – |
| ran_steps | number | yes | How many steps actually ran — excludes a step skipped by the time budget. |
| return | string | yes | – |
| rollback_reason | string | – | Set only when on_error="rollback" and rolled_back is false: history_evicted, undo_failed, cursor_moved_backward, or document_changed. |
| rolled_back | boolean | – | – |
| steps | array | yes | One entry per step run — carries `text` in summary mode, `result` in full mode. |
| total_steps | number | yes | – |
No examples provided.
ps_set_layer ~366
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.
| Name | Type | Req | Description |
|---|---|---|---|
| blend_mode | string | – | Blend mode name (Photoshop ExtendScript BlendMode enum). Use COLORBLEND for the "Color" mode — Photoshop reserves the bare "COLOR" name for the SolidColor class. |
| fill_percent | number | – | Fill opacity (0-100) — the "Fill" slider. Affects the layer's pixels/fill but NOT its layer styles. Distinct from opacity; used for Hard Mix and stroke-only tricks. Pass opacity and/or fill_percent. |
| locked | boolean | – | Whether the layer should be fully locked (allLocked). |
| name | string | – | New name for the active layer. |
| opacity | number | – | Layer opacity (0-100) — affects the whole layer including its styles. |
| property | string | yes | Which property to set on the active layer (idempotent absolute setters; do not change which layer is active). opacity: opacity (whole layer incl. styles) and/or fill_percent (pixels only — the Fill s… |
| visible | boolean | – | Whether the layer should be visible. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| fill_opacity | number | – | – |
| fill_opacity_verified | boolean | – | – |
| layerName | string | – | – |
| locked | boolean | – | – |
| name | string | – | – |
| newName | string | – | – |
| oldName | string | – | – |
| opacity | number | – | – |
| opacity_verified | boolean|null | – | – |
| property | string | – | – |
| requested | number|string|boolean | – | – |
| requested_fill_opacity | number | – | – |
| requested_opacity | number|null | – | – |
| value | number|string | – | – |
| verification_unreadable | boolean | – | visibility only: true when the write itself did not throw but the own-flag verification read failed (Action Manager error, or the layer had no readable id) — verified is false, but this is NOT proof… |
| verified | boolean | – | – |
| visible | boolean | – | – |
No examples provided.
What is the io.github.editmamei/editmamei MCP server?
io.github.editmamei/editmamei is an MCP server listed in the public MCP registry as io.github.editmamei/editmamei. Photoshop MCP server: natural-language AI photo editing in desktop Photoshop. AI orchestration. This page covers its npm package (editmamei).
Is the io.github.editmamei/editmamei MCP server safe to use?
io.github.editmamei/editmamei scores 88 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. 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 io.github.editmamei/editmamei MCP server expose?
io.github.editmamei/editmamei exposes 62 tools: ps_ping, ps_list_capabilities, ps_create_document, ps_document, ps_close_document, and 57 more. Their descriptions and schemas cost roughly 28,680 tokens of context every time the server is loaded.
Is the io.github.editmamei/editmamei MCP server still maintained?
io.github.editmamei/editmamei is still listed as active in the MCP registry. We last reached this channel on 20 September 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 io.github.editmamei/editmamei MCP server under?
io.github.editmamei/editmamei declares the FSL-1.1-MIT licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.