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_add_adjustment_layer ~2,977
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.
| Name | Type | Req | Description |
|---|---|---|---|
| black_point | number | – | For type=levels. Input black (0-255). |
| brightness | number | – | For type=brightness_contrast. Brightness (-100 to 100). |
| bw_blues | number | – | For type=black_and_white. Blue-channel mapping (-200 to 300). PS default 20. |
| bw_cyans | number | – | For type=black_and_white. Cyan-channel mapping (-200 to 300). PS default 60. |
| bw_greens | number | – | For type=black_and_white. Green-channel mapping (-200 to 300). PS default 40. |
| bw_magentas | number | – | For type=black_and_white. Magenta-channel mapping (-200 to 300). PS default 80. |
| bw_reds | number | – | For type=black_and_white. Red-channel lightness mapping (-200 to 300). PS default 40. |
| bw_tint | boolean | – | For type=black_and_white. If true, applies a single-color tint over the grayscale conversion (split-toning effect). Pair with bw_tint_hue + bw_tint_saturation. |
| bw_tint_hue | number | – | For type=black_and_white when bw_tint=true. Tint hue in degrees (-180 to 180). Default 220 (cool blue). |
| bw_tint_saturation | number | – | For type=black_and_white when bw_tint=true. Tint saturation (0 to 100). Default 25. |
| bw_yellows | number | – | For type=black_and_white. Yellow-channel mapping (-200 to 300). PS default 60. |
| cb_highlights_cyan_red | number | – | For type=color_balance. Highlights: cyan↔red shift. |
| cb_highlights_magenta_green | number | – | For type=color_balance. Highlights: magenta↔green shift. |
| cb_highlights_yellow_blue | number | – | For type=color_balance. Highlights: yellow↔blue shift. |
| cb_midtones_cyan_red | number | – | For type=color_balance. Midtones: cyan↔red shift. |
| cb_midtones_magenta_green | number | – | For type=color_balance. Midtones: magenta↔green shift. |
| cb_midtones_yellow_blue | number | – | For type=color_balance. Midtones: yellow↔blue shift. |
| cb_preserve_luminosity | boolean | – | For type=color_balance. Preserve luminosity while shifting color. Default true (matches the PS dialog default). |
| cb_shadows_cyan_red | number | – | For type=color_balance. Shadows: cyan↔red shift (-100 cyan to +100 red). Default 0. |
| cb_shadows_magenta_green | number | – | For type=color_balance. Shadows: magenta↔green shift (-100 magenta to +100 green). |
| cb_shadows_yellow_blue | number | – | For type=color_balance. Shadows: yellow↔blue shift (-100 yellow to +100 blue). |
| cl_lut_name | string | – | For type=color_lookup. The LUT file name as Photoshop sees it. Common built-in 3DLUT presets: "3Strip.look", "Bleach Bypass.look", "Candlelight.CUBE", "Crisp_Warm.look", "Crisp_Winter.look", "DropBlu… |
| cl_lut_type | string | – | For type=color_lookup. Which LUT slot to load into. Default 3dlut covers .cube / .3dl / .look files (the photographer-typical case). abstract and device_link are for color-management workflows. |
| clip_to_below | boolean | – | If true, the adjustment only affects the layer directly below. |
| cm_b_constant | number | – | For type=channel_mixer. Constant added to Blue output. |
| cm_b_from_b | number | – | For type=channel_mixer. Blue-from-Blue weight. PS default 100. |
| cm_b_from_g | number | – | For type=channel_mixer. Blue-from-Green weight. |
| cm_b_from_r | number | – | For type=channel_mixer. Blue-from-Red weight. |
| cm_g_constant | number | – | For type=channel_mixer. Constant added to Green output. |
| cm_g_from_b | number | – | For type=channel_mixer. Green-from-Blue weight. |
| cm_g_from_g | number | – | For type=channel_mixer. Green-from-Green weight. PS default 100. |
| cm_g_from_r | number | – | For type=channel_mixer. Green-from-Red weight. |
| cm_gray_constant | number | – | For type=channel_mixer with cm_monochrome=true. Constant added to gray output. |
| cm_gray_from_b | number | – | For type=channel_mixer with cm_monochrome=true. Blue contribution to gray. PS default 20. |
| cm_gray_from_g | number | – | For type=channel_mixer with cm_monochrome=true. Green contribution to gray. PS default 40. |
| cm_gray_from_r | number | – | For type=channel_mixer with cm_monochrome=true. Red contribution to gray (-200 to 200). PS default 40. |
| cm_monochrome | boolean | – | For type=channel_mixer. If true, output is single gray channel and only cm_gray_* params apply. If false, the per-output cm_{r,g,b}_from_* and cm_{r,g,b}_constant params apply for RGB→RGB remix. |
| cm_r_constant | number | – | For type=channel_mixer. Constant added to Red output. |
| cm_r_from_b | number | – | For type=channel_mixer. Red-from-Blue weight. Default 0. |
| cm_r_from_g | number | – | For type=channel_mixer. Red-from-Green weight. Default 0. |
| cm_r_from_r | number | – | For type=channel_mixer with cm_monochrome=false. Red-from-Red weight. PS default 100 (identity). |
| contrast | number | – | For type=brightness_contrast. Contrast (-100 to 100). |
| curves_preset | string | – | For type=curves only. Default sCurveMedium. |
| exp_exposure | number | – | For type=exposure. Exposure shift in STOPS (-20 to +20). PS default 0. Photographer-feeling tonal control — 1 stop ≈ 2× linear brightness. |
| exp_gamma | number | – | For type=exposure. Gamma correction (0.01 to 9.99). PS default 1.0 (identity). Values <1 brighten midtones; >1 darken them. |
| exp_offset | number | – | For type=exposure. Offset shift (-0.5 to +0.5). PS default 0. Shifts the black point — most useful for paired with negative exposure for moody/crushed-shadow looks. |
| gamma | number | – | For type=levels. Midpoint gamma. |
| gm_dither | boolean | – | For type=gradient_map. Apply dithering to reduce banding. |
| gm_preset | string | – | For type=gradient_map. Preset gradient. "black_to_white" is the canonical tonal B&W via gradient. "sepia" is a warm vintage tone. "tint" maps black→tint_color→white using gm_tint_color_hex. For arbit… |
| gm_reverse | boolean | – | For type=gradient_map. Reverse the gradient direction. |
| gm_stops | array | – | For type=gradient_map. Custom color stops overriding gm_preset — each {red,green,blue (0-255), location (0-100 shadows→highlights), midpoint (5-95, default 50)}. At least 2; sorted by location. E.g.… |
| gm_tint_color_hex | string | – | For type=gradient_map with gm_preset=tint. Mid-tone tint color as a hex string like "#5588CC". Only used when gm_preset=tint. |
| hue | number | – | For type=hue_saturation. Hue shift in degrees (-180 to 180). |
| into_active_group | boolean | – | Photoshop's Mk-AdjL descriptor carries no placement target, so with a GROUP active it would natively nest the new layer INSIDE that group. Default false hoists the new layer back out so it lands abov… |
| lightness | number | – | For type=hue_saturation. Lightness (-100 to 100). |
| mask_from_selection | boolean | – | If true (default) and there is an active selection at the time of this call, the new adjustment layer is automatically masked by that selection. If false, any existing selection is dropped first and… |
| mask_inverted | boolean | – | Only meaningful when mask_from_selection is true AND there is an active selection. If true, the resulting mask is inverted — so the adjustment affects EVERYTHING OUTSIDE the selection rather than ins… |
| name | string | – | Optional name for the new adjustment layer. |
| pf_color_hex | string | – | For type=photo_filter. Custom filter color as a hex string like "#EC8A00". Only used when pf_preset is not set. |
| pf_density | number | – | For type=photo_filter. Filter strength (1-100). PS default 25. |
| pf_preserve_luminosity | boolean | – | For type=photo_filter. Preserve luminosity. Default true. |
| pf_preset | string | – | For type=photo_filter. Named filter preset. If set, takes precedence over pf_color_hex. Common picks: warming_85 (warm portraits), cooling_80 (cool down skies), sepia (vintage), warming_lba / cooling… |
| pos_levels | number | – | For type=posterize. Number of tonal levels per channel (2-255). PS default 4. Lower values yield a more graphic / illustration look (2-4); higher values are gentler. |
| saturation | number | – | For type=hue_saturation. Master saturation (-100 to 100). Note: vibrance has its own vib_saturation param. |
| sc_colors | object | – | For type=selective_color. Nested per-color-family CMYK shifts. Each family is an object {cyan, magenta, yellow, black} with values -100 to 100. Omitted families default to zero. Families: reds, yello… |
| sc_method | string | – | For type=selective_color. "relative" scales adjustments by the existing color amount (subtle, the PS default). "absolute" applies fixed CMYK shifts (more aggressive). |
| thr_level | number | – | For type=threshold. Threshold luminance (1-255). PS default 128. Pixels brighter than the threshold become white; darker become black. |
| type | string | yes | Adjustment kind. |
| vib_saturation | number | – | For type=vibrance. Master saturation override (-100 to 100). Affects all colors equally. |
| vib_vibrance | number | – | For type=vibrance. Vibrance (-100 to 100). Saturation boost that protects skin tones and already-saturated colors. Gentler than hue_saturation.saturation. |
| white_point | number | – | For type=levels. Input white (0-255). |
| Name | Type | Req | Description |
|---|---|---|---|
| clipError | string | – | – |
| clipped | boolean | – | – |
| context | object | – | – |
| created | boolean | – | – |
| customValuesApplied | boolean | – | – |
| had_selection | boolean | – | – |
| hoisted | boolean | – | True when the new layer had to be moved back out of the previously-active group to honor into_active_group:false (the default). False when it landed correctly on its own, or when the move-back itself… |
| kindMatches | boolean | – | – |
| layerKind | string | – | – |
| layerName | string | – | – |
| mask_applied | boolean | – | – |
| mask_inversion_error | string|null | – | – |
| mask_inverted | boolean | – | – |
| parent_path | array|null | – | The containing-group name chain (outermost first), empty array at the document root. |
| raw_develop_pending | string | – | Advisory, present only when the active document was opened from a raw source this session and no Camera Raw develop pass has run yet. Nothing failed — the layer was created. Global tone/color on raw… |
| type | string | – | – |
No examples provided.
ps_add_fill_layer ~611
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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | fill_type=gradient: gradient angle in degrees (Photoshop convention: 90 runs the first stop from the bottom up; 0 runs it left to right). |
| blue | integer | – | fill_type=solid_color: blue (0-255). Required for solid_color. |
| dither | boolean | – | fill_type=gradient: dither to reduce banding. |
| fill_type | string | – | Fill-layer type. solid_color takes red/green/blue (required for that type); gradient takes the gradient_* params + stops (pattern fills still planned). |
| gradient_type | string | – | fill_type=gradient: gradient geometry. linear for skies/fades, radial for vignettes/glows. |
| green | integer | – | fill_type=solid_color: green (0-255). Required for solid_color. |
| into_active_group | boolean | – | Photoshop's Mk-contentLayer descriptor carries no placement target, so with a GROUP active it would natively nest the new fill layer INSIDE that group. Default false hoists the new layer back out so… |
| offset_x | number | – | fill_type=gradient: horizontal center offset percent. |
| offset_y | number | – | fill_type=gradient: vertical center offset percent. |
| opacity_stops | array | – | fill_type=gradient: opacity stops, each {opacity (0-100), location (0-100), midpoint (5-95, default 50)}. Use e.g. 100→0 for a fade-to-transparent wash. Default: fully opaque. |
| red | integer | – | fill_type=solid_color: red (0-255). Required for solid_color. |
| reverse | boolean | – | fill_type=gradient: reverse the stop order. |
| scale | number | – | fill_type=gradient: gradient scale percent (compress/stretch the ramp). |
| stops | array | – | fill_type=gradient: color stops, each {red,green,blue (0-255), location (0-100 along the ramp), midpoint (5-95, default 50)}. At least 2 when supplied; sorted by location. Default: black at 0 → white… |
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | – |
| color | object | – | – |
| context | object | – | – |
| created | boolean | – | – |
| fill_type | string | – | – |
| gradient_type | string | – | – |
| hoisted | boolean | – | True when the new layer had to be moved back out of the previously-active group to honor into_active_group:false (the default). False when it landed correctly on its own, or when the move-back itself… |
| layer_name | string | – | – |
| parent_path | array|null | – | The containing-group name chain (outermost first), empty array at the document root. |
| reverse | boolean | – | – |
| scale | number | – | – |
| stop_count | number | – | – |
No examples provided.
ps_add_layer_style ~448
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).
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | drop_shadow/inner_shadow: light angle in degrees. 90 = top-down (standard product shadow). |
| color | object | – | Effect color RGB (0-255). Default black for drop shadow, white for glow, black for stroke. |
| distance | number | – | drop_shadow/inner_shadow: shadow offset in pixels. |
| glow_size | number | – | outer_glow/inner_glow: glow blur size in pixels. |
| glow_spread | number | – | outer_glow/inner_glow: glow choke/spread (0-100%). |
| opacity | number | – | Effect opacity (0-100). |
| size | number | – | drop_shadow/inner_shadow: shadow blur size in pixels. |
| spread | number | – | drop_shadow/inner_shadow: shadow choke/spread (0-100%). |
| stroke_position | string | – | stroke only: where the stroke sits relative to the layer edge. |
| stroke_size | number | – | stroke only: stroke width in pixels. |
| style | string | yes | Which layer style to apply. drop_shadow/inner_shadow share angle/distance/spread/size; outer_glow/inner_glow share glow_size/glow_spread; color_overlay uses only color + opacity. inner_shadow = reces… |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | – |
| context | object | – | – |
| layerName | string | – | – |
| style | string | – | – |
No examples provided.
ps_apply_adjustment ~737
Apply a DESTRUCTIVE tonal adjustment that Photoshop does NOT offer as an adjustment layer — 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.
| Name | Type | Req | Description |
|---|---|---|---|
| apply_to_active_layer | boolean | – | If false (default), the color lookup 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… |
| black_clip | number | – | Percent of the darkest shadow pixels to clip to pure black (0-50). PS default 0.01 — minimal clipping. Higher values increase contrast but lose shadow detail. |
| cl_lut_name | string | – | Leaf name of a 3DLUT file in PS's Presets/3DLUTs/ folder (e.g. "TealOrangePlusContrast.3DL", "FallColors.look", "Kodak 5205 Fuji 3510 (by Adobe).cube") OR an absolute path to a .3DL / .look / .cube f… |
| color_correction | number | – | Color saturation compensation for recovered shadows (-100 to +100). PS default +20 — counteracts the desaturation that shadow recovery tends to produce. |
| highlight_amount | number | – | Highlight recovery amount (0-100). PS default 0. |
| highlight_radius | number | – | Local-contrast radius for highlight recovery in pixels (0-2500). PS default 30. |
| highlight_width | number | – | Tonal width of highlights (0-100). PS default 50. |
| midtone_contrast | number | – | Midtone contrast (-100 to +100). PS default 0. |
| shadow_amount | number | – | Shadow recovery amount (0-100). PS default 35. |
| shadow_radius | number | – | Local-contrast radius for shadow recovery in pixels (0-2500). PS default 30. |
| shadow_width | number | – | Tonal width of shadows (0-100). Wider = more midtones treated as shadow. PS default 50. |
| type | string | yes | Which destructive adjustment to bake (none exist as adjustment layers in PS). shadows_highlights: one-pass shadow/highlight recovery (shadow_amount, highlight_amount, …). equalize: parameter-free his… |
| white_clip | number | – | Percent of the brightest highlight pixels to clip to pure white (0-50). PS default 0.01. Higher values increase contrast but lose highlight detail. |
| Name | Type | Req | Description |
|---|---|---|---|
| color_correction | number | – | – |
| context | object | – | – |
| filter | string | – | – |
| highlight_amount | number | – | – |
| highlight_radius | number | – | – |
| highlight_width | number | – | – |
| lut_format | string | – | – |
| lut_path | string | – | – |
| midtone_contrast | number | – | – |
| original_layer_name | string | – | – |
| shadow_amount | number | – | – |
| shadow_radius | number | – | – |
| shadow_width | number | – | – |
| target_layer_name | string | – | – |
| target_was_copy | boolean | – | – |
No examples provided.
ps_apply_image ~376
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.)
| Name | Type | Req | Description |
|---|---|---|---|
| apply_to_active_layer | boolean | – | If false (default), the composite 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 tru… |
| blend | string | yes | Calculation blend mode: how the source combines with the target. multiply (darken/texture), screen (lighten), overlay/soft_light/hard_light (contrast), difference/exclusion/subtract/add (channel math… |
| opacity | integer | – | Blend opacity 0-100. Default 100 (full strength). |
| source_alpha_name | string | – | Required when source_channel='alpha': the name of the alpha channel to read. |
| source_channel | string | – | Source channel: 'rgb' (the composite, default), a single 'red'/'green'/'blue' channel, or 'alpha' (then set source_alpha_name). |
| source_layer | string | – | Which layer to pull the source from: 'merged' (the flattened composite, default) or an exact layer name. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | – |
| blend | string | – | – |
| context | object | – | – |
| opacity | number | – | – |
| source_channel | string | – | – |
| source_layer | string | – | – |
| target_layer_name | string | – | – |
| target_was_copy | boolean | – | – |
No examples provided.
ps_bake_layer ~170
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 "<name> (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).
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| baked | boolean | – | – |
| baked_layer_name | string | – | – |
| clipped_layers_baked | number | – | – |
| context | object | – | – |
| source_layer_name | string | – | – |
No examples provided.
ps_calculations ~338
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.)
| Name | Type | Req | Description |
|---|---|---|---|
| blend | string | yes | Calculation blend mode: how the source combines with the target. multiply (darken/texture), screen (lighten), overlay/soft_light/hard_light (contrast), difference/exclusion/subtract/add (channel math… |
| opacity | integer | – | Blend opacity 0-100. Default 100. |
| source1_alpha_name | string | – | Required when source1_channel='alpha'. |
| source1_channel | string | – | Source 1 channel: a single 'red'/'green'/'blue' channel, or 'alpha' (+ name). |
| source1_layer | string | – | Source 1 layer: 'merged' (default) or an exact layer name. |
| source2_alpha_name | string | – | Required when source2_channel='alpha'. |
| source2_channel | string | – | Source 2 channel: a single 'red'/'green'/'blue' channel, or 'alpha' (+ name). |
| source2_layer | string | – | Source 2 layer: 'merged' (default) or an exact layer name. |
| Name | Type | Req | Description |
|---|---|---|---|
| blend | string | – | – |
| calculated | boolean | – | – |
| channel_count | number | – | – |
| context | object | – | – |
| new_channel_name | string | – | – |
| opacity | number | – | – |
No examples provided.
ps_clipping_mask ~243
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.
| Name | Type | Req | Description |
|---|---|---|---|
| op | string | yes | create: clip the active layer to the layer directly below it (that layer becomes the alpha source); no-ops (already_clipped:true) when the layer is already clipped. release: release the active layer… |
| Name | Type | Req | Description |
|---|---|---|---|
| already_clipped | boolean | – | – |
| clipped | boolean | – | – |
| context | object | – | – |
| layerName | string | – | – |
| released | boolean | – | – |
No examples provided.
ps_close_document ~172
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).
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | Target an open document by its Photoshop document id. Unambiguous — prefer this when names collide. |
| name | string | – | Target an open document by its exact Photoshop name, INCLUDING the extension as shown in the tab (e.g. 'portrait.jpg', not 'portrait'). If two open documents share a name the call fails rather than g… |
| save | boolean | – | Whether to save changes before closing |
| Name | Type | Req | Description |
|---|---|---|---|
| closed | boolean | – | – |
| closedName | string | – | – |
| context | object | – | – |
| saved | boolean | – | – |
No examples provided.
ps_compare_regions ~300
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.
| Name | Type | Req | Description |
|---|---|---|---|
| label_a | string | – | Optional label for region A in the response. |
| label_b | string | – | Optional label for region B in the response. |
| region_a_bottom | number | yes | Region A bottom edge. |
| region_a_left | number | yes | Region A left edge. |
| region_a_right | number | yes | Region A right edge. |
| region_a_top | number | yes | Region A top edge. |
| region_b_bottom | number | yes | Region B bottom edge. |
| region_b_left | number | yes | Region B left edge. |
| region_b_right | number | yes | Region B right edge. |
| region_b_top | number | yes | Region B top edge. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| differences | object | – | – |
| region_a | object | – | – |
| region_b | object | – | – |
No examples provided.
ps_convert_image_mode ~231
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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | bitmap only: halftone screen angle in degrees (-180 to 180). PS default 45. |
| frequency | number | – | bitmap only: halftone screen frequency in lines/inch (1-999). PS default 53. |
| mode | string | yes | Target document color mode. grayscale discards color (the "Discard color information?" prompt is auto-confirmed); the document is FLATTENED as part of the conversion. `bitmap` produces a 1-bit halfto… |
| shape | string | – | bitmap only: halftone dot shape. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| converted | boolean | – | – |
| mode_after | string | – | – |
| mode_before | string | – | – |
| requested_mode | string | – | – |
No examples provided.
ps_convert_to_smart_object ~277
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.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | convert (default): wrap the active layer into a Smart Object in place. new_via_copy: the active layer must ALREADY be a Smart Object — make a NEW Smart Object that is an INDEPENDENT copy (its own emb… |
| Name | Type | Req | Description |
|---|---|---|---|
| background_promoted | boolean | – | – |
| context | object | – | – |
| is_smart_object | boolean | – | – |
| layer_name | string | – | – |
| original_kind | string | – | – |
| source_unlinked | boolean | – | – |
| was_already_smart_object | boolean | – | – |
No examples provided.
ps_copy_to_new_layer ~233
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.
| Name | Type | Req | Description |
|---|---|---|---|
| into_active_group | boolean | – | Photoshop's CpTL (Layer via Copy) event carries no placement target, so with a GROUP active it would natively nest the new layer INSIDE that group. Default false hoists the new layer back out so it l… |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| copied_to_new_layer | boolean | – | – |
| hoisted | boolean | – | True when the new layer had to be moved back out of the previously-active group to honor into_active_group:false (the default). False when it landed correctly on its own, or when the move-back itself… |
| layer_count_after | number | – | – |
| layer_count_before | number | – | – |
| new_layer_name | string | – | – |
| original_active_layer_name | string | – | – |
| parent_path | array|null | – | The containing-group name chain (outermost first), empty array at the document root. |
No examples provided.
ps_create_document ~109
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.
| Name | Type | Req | Description |
|---|---|---|---|
| color_mode | string | – | Color mode (RGB, CMYK, Grayscale) |
| height | number | yes | Document height in pixels |
| resolution | number | – | Document resolution in DPI (default: 72) |
| width | number | yes | Document width in pixels |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| id | number | – | – |
| name | string | – | – |
No examples provided.
ps_create_layer ~57
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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Name for the new layer (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| created | boolean | – | – |
| layerName | string | – | – |
| parent_path | array|null | – | The containing-group name chain (outermost first), empty array at the document root. |
No examples provided.
ps_crop_document ~257
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.
| Name | Type | Req | Description |
|---|---|---|---|
| bottom | integer | – | Bottom edge position in pixels (raw mode; ignored when placement is set). |
| left | integer | – | Left edge position in pixels (raw mode; ignored when placement is set). |
| placement | object | – | ANCHOR-RELATIONAL crop (preferred over guessing pixels): a REGION relation (inside/gap) → the crop is the resolved region bounding box, verified by the gate. Crops ONLY if the gate PASSES. When set,… |
| right | integer | – | Right edge position in pixels (raw mode; ignored when placement is set). |
| top | integer | – | Top edge position in pixels (raw mode; ignored when placement is set). |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| cropped | boolean | – | – |
| newHeight | number | – | – |
| newWidth | number | – | – |
| placement | object | – | Present when anchor-relational placement was used: the resolved region + gate verdict. |
No examples provided.
ps_delete_layer ~137
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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Optional layer name. If supplied, recurses into groups and deletes the first layer matching this name. If omitted, deletes the currently active layer (backward-compatible). |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| deleted | boolean | – | – |
| layerName | string | – | – |
No examples provided.
ps_detect ~375
The cheap, narrow read: labeled bounding boxes only — faces and/or COCO-80 objects (person, dog, car, chair, sofa, …) in DOCUMENT-pixel space. LOCAL on-device computer vision; the image is never sent anywhere. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| annotate | boolean | – | Also return an annotated preview JPEG with the detected boxes drawn (faces cyan, objects magenta). Default false: the labeled boxes returned by this call are already complete on their own — ask for t… |
| face_threshold | number | – | Minimum face confidence (0–1). |
| max_dimension | number | – | Long-edge pixels of the JPEG the detectors run on. Smaller is faster; the models downscale internally so 1024 is plenty. Returned coordinates are always in full document pixels regardless. |
| max_objects | number | – | Cap on returned objects, highest-confidence first. |
| object_threshold | number | – | Minimum object confidence (0–1). |
| target | string | – | What to detect: 'faces' (forward-facing faces), 'objects' (COCO-80 classes: person, dog, car, chair, …), or 'both'. |
| Name | Type | Req | Description |
|---|---|---|---|
| backends | object | – | – |
| context | object | – | – |
| faces | array | – | – |
| image | object | – | – |
| objects | array | – | – |
No examples provided.
ps_document ~257
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | – | Target an open document by its Photoshop document id. Unambiguous — prefer this when names collide. |
| name | string | – | Target an open document by its exact Photoshop name, INCLUDING the extension as shown in the tab (e.g. 'portrait.jpg', not 'portrait'). If two open documents share a name the call fails rather than g… |
| op | string | yes | list: every open document (index, id, name, path, saved, active, dimensions) — safe to call when NOTHING is open, which is the point. activate: make one of them the active document, by name or id. |
| Name | Type | Req | Description |
|---|---|---|---|
| activated | boolean | – | – |
| context | object | – | – |
| count | number | – | – |
| documents | array | – | – |
| id | number | – | – |
| name | string | – | – |
| op | string | yes | – |
No examples provided.
ps_duplicate_layer ~66
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).
| Name | Type | Req | Description |
|---|---|---|---|
| new_name | string | – | Optional name for the duplicated layer. If omitted, Photoshop assigns "<name> copy". |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| newName | string | – | – |
| originalName | string | – | – |
| parent_path | array|null | – | The containing-group name chain (outermost first), empty array at the document root. layer.duplicate() is parent-preserving by DOM semantics, so this always matches the original layer's placement. |
No examples provided.
ps_export ~347
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 (Save-As scale), optional sRGB convert + profile embed. PNG: transparent background (alpha preserved) or flattened onto white, compression 0-9.
| Name | Type | Req | Description |
|---|---|---|---|
| compression | integer | – | PNG compression level 0-9. Lower = larger file, faster. Default 6. |
| convert_to_srgb | boolean | – | Convert to sRGB before export. Default true. |
| embed_color_profile | boolean | – | Embed color profile in the exported file. Default true. |
| format | string | yes | Output image format. jpeg: quality 0-100, optional convert_to_srgb + embed_color_profile. png: transparent_background (alpha) or flattened-on-white, compression 0-9. Both take output_path (required)… |
| long_edge_px | integer | – | Resize so the longest edge equals this value. Omit for full resolution. Downscale only. |
| output_path | string | yes | Absolute output path including filename. |
| quality | integer | – | JPEG quality 0-100 (the Photoshop 'Save As' / JPEG-dialog scale humans and the UI use). 100 = maximum. Mapped internally to Photoshop's 0-12 JPEGSaveOptions scripting scale (e.g. 90→11, 100→12). |
| transparent_background | boolean | – | If true, preserves transparency. If false, flattens onto white. Default false. |
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | – | – |
| exported_to | string | – | – |
| height_px | number | – | – |
| quality | number | – | – |
| quality_ps_scale | number | – | – |
| success | boolean | yes | – |
| transparent | boolean | – | – |
| width_px | number | – | – |
No examples provided.
ps_fill_layer ~90
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.
| Name | Type | Req | Description |
|---|---|---|---|
| blue | integer | yes | Blue component (0-255) |
| green | integer | yes | Green component (0-255) |
| red | integer | yes | Red component (0-255) |
| Name | Type | Req | Description |
|---|---|---|---|
| color | object | – | – |
| filled | boolean | – | – |
| layerName | string | – | – |
No examples provided.
ps_filter ~3,493
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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | – | Filter strength. Range depends on type — sharpen 1–500, noise 0.1–400, radial_blur 1–100, distort/ripple −999–999. |
| amplitude_max | integer | – | wave only: maximum amplitude (1-999). |
| amplitude_min | integer | – | wave only: minimum amplitude (1-998; must be <= amplitude_max). |
| angle | number | – | Angle in degrees. Used by motion_blur (−360–360) and distort/twirl (−999–999). |
| angle_1 | integer | – | color_halftone only: screen angle for channel 1 in degrees. PS default 108. |
| angle_2 | integer | – | color_halftone only: screen angle for channel 2. PS default 162. |
| angle_3 | integer | – | color_halftone only: screen angle for channel 3. PS default 90. |
| angle_4 | integer | – | color_halftone only: screen angle for channel 4. PS default 45. |
| apply_to_active_layer | boolean | – | If false (default), the filter 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 true,… |
| as_smart_filter | boolean | – | If true, apply the filter as a re-editable SMART FILTER riding the Smart Object instead of baking it into pixels — nothing is rasterized, and the filter can later be toggled, re-blended or removed in… |
| blend_mode | string | – | set_blend only: how the filter result composites against the unfiltered layer. Same names as ps_set_layer. Omit to leave the current mode untouched. |
| blue_preserve_details | number | – | Per-channel: blue channel preserve-details percentage. |
| blue_strength | number | – | Per-channel: blue channel noise-reduction strength. Usually the noisiest channel in low-light photos. |
| bristle_detail | number | – | Bristle detail (0-10). |
| brush_scale | number | – | Brush scale (0.1-2). |
| cell_size | integer | – | Cell size in pixels — used by mosaic (2-300, PS default 10), crystallize (3-300), and pointillize (3-300, PS default 5). Ignored by color_halftone/facet/fragment. |
| center_placement | object | – | Grounded alternative to center_x/center_y: NAME the blur center (a `placement` resolving to a POINT — an object centroid, an extremum, a grid intersection). The resolved document-pixel point is norma… |
| center_x | number | – | Horizontal blur center, normalized 0-1 (0.5 = middle). Resolution-independent. |
| center_y | number | – | Vertical blur center, normalized 0-1 (0.5 = middle). Resolution-independent. |
| cleanliness | number | – | Stroke cleanliness / smoothness (0-10). |
| color_noise | number | – | Color (chroma) noise reduction (0-100). PS default 45. Hits the colorful speckle noise typical of high-ISO photos. |
| conversion | string | – | polar only: rect_to_polar wraps the image into a circle; polar_to_rect unwraps it. |
| depth_source | string | – | Depth map source for selective focus. "none" = uniform blur across the whole layer. "transparency" = use the layer alpha channel as depth (foreground sharper). "layerMask" = use the layer mask. PS de… |
| displacement_map | string | – | How the map fits the layer: stretch_to_fit (resize the map) or tile (repeat it). |
| distribution | string | – | Noise distribution type. Default: UNIFORM. |
| edge | string | – | trace_contour only: trace the lower or upper edge of the level. PS default lower. |
| enabled | boolean | – | set_visibility only: true shows the filter, false hides it. The filter stays in the stack either way and keeps all its settings. |
| fiber_strength | integer | – | fibers only: fiber strength / definition (1-64). PS default 4. |
| focal_distance | number | – | Focal-plane depth value (0-255), only meaningful when depth_source != none. Pixels at this depth stay sharp; pixels farther from it blur progressively. |
| generators | integer | – | wave only: number of wave generators (1-999). |
| green_preserve_details | number | – | Per-channel: green channel preserve-details percentage. |
| green_strength | number | – | Per-channel: green channel noise-reduction strength. |
| height | integer | – | emboss only: relief height in pixels (1-100). PS default 3. |
| highlight_fade | number | – | Highlights tab: amount of sharpening to fade in highlight regions (0-100). PS default 0. |
| highlight_radius | number | – | Highlights tab: local-contrast radius in pixels (1-100). PS default 30. |
| highlight_tonal_width | number | – | Highlights tab: tonal width (0-100). PS default 50. |
| horizontal | integer | – | offset only: horizontal shift in pixels (positive = right). |
| horizontal_scale | integer | – | Horizontal displacement scale (-999 to 999). PS default 10. |
| index | integer | – | 1-based index of the filter to act on, as reported by op=list. 1 is the FIRST-APPLIED filter (bottom of the Smart Filters stack in the Layers panel). Required for every op except 'list'. |
| invert_depth | boolean | – | Invert the depth map. PS default false. |
| iris_blade_curvature | number | – | Iris blade curvature (0-100). 0 = polygonal bokeh, 100 = perfectly circular. PS default 0. |
| iris_rotation | number | – | Iris rotation in degrees (0-360). Rotates the iris-shape pattern. PS default 0. |
| iris_shape | string | – | Aperture iris shape — affects the look of out-of-focus highlights (bokeh). PS default hexagon. Triangle = 3 blades, octagon = 8 blades. Real lenses with fewer blades produce more polygonal bokeh. |
| level | integer | – | trace_contour only: brightness level the contour traces (0-255). PS default 128. |
| light_direction | integer | – | Lighting angle in degrees (-180 to 180). |
| lighting_on | boolean | – | Whether the lighting/shine relief is applied. |
| map_path | string | – | Absolute path to the displacement-map .psd file (required). The map's brightness drives the per-pixel warp — mid-gray = no shift, lighter/darker push in opposite directions. |
| max_radius | integer | – | color_halftone only: maximum dot radius in pixels (4-127). PS default 8. |
| method | string | – | spin = rotational blur around the center (turntable motion); zoom = radial streaks toward/from the center (the classic "god rays" / speed-zoom look). |
| mode | string | – | surface_blur = blur while preserving edges above a threshold (skin-smoothing; radius + threshold); box_blur = fast square-kernel blur (radius); average = fill the layer with its single average color… |
| monochromatic | boolean | – | Apply monochromatic noise. Default: false. |
| motion_angle | number | – | Motion blur angle in degrees (-360 to 360). Only meaningful when remove_mode=motionBlur. |
| noise_amount | number | – | Noise added to the blurred result (0-100). PS default 0. Lens Blur can produce un-naturally clean blur regions; a small noise amount (5-15) keeps the texture believable. |
| noise_distribution | string | – | Noise distribution type. PS default uniform. |
| noise_monochromatic | boolean | – | Monochromatic noise (luminance-only). PS default true. |
| noise_reduction | number | – | Noise reduction during sharpening (0-100). PS default 10. Prevents sharpening from amplifying existing noise. For low-light photos, raise this (25-50). |
| number | integer | – | tiles only: number of tiles across (1-99). PS default 10. |
| offset | integer | – | tiles only: maximum tile offset percent (1-99). PS default 10. |
| op | string | – | apply (default): apply a NEW filter — set `type` (+ its own params). list: read every re-editable Smart Filter on the active Smart Object (index, name, type, enabled, opacity, blend mode). set_visibi… |
| opacity | number | – | set_blend only: filter opacity 0-100. Omit to leave the current opacity untouched. |
| per_channel | boolean | – | Enable per-channel advanced mode. If true, the per-channel strength/preserve_details params (red_*, green_*, blue_*) override the global strength/preserve_details for each RGB channel — useful when n… |
| preserve | string | – | maximum/minimum only: edge-preservation shape. PS default roundness. |
| preserve_details | number | – | Preserve details percentage (0-100). PS default 50. Higher protects edges; lower lets the smoother kick in further. |
| quality | string | – | Render quality. best is smoothest but slowest. |
| radius | number | – | Radius/distance in px. Range depends on type — gaussian_blur 0.1–250, motion_blur 1–999, lens_blur 0–100, smart_sharpen 0.1–64, high_pass 0.1–1000. |
| random_seed | integer | – | wave only: random seed for the wave pattern (change for a different pattern). |
| red_preserve_details | number | – | Per-channel: red channel preserve-details percentage (0-100). Only used when per_channel=true. |
| red_strength | number | – | Per-channel: red channel noise-reduction strength (0-10). Only used when per_channel=true. |
| remove_jpeg_artifact | boolean | – | Remove JPEG compression artifacts (the 8x8 block boundaries and ringing). PS default false. |
| remove_mode | string | – | Blur model to remove. gaussianBlur (default) is the general-purpose modern Unsharp Mask replacement. lensBlur removes lens-style softness with better edge handling. motionBlur removes directional mot… |
| ridges | integer | – | zigzag only: number of concentric ridges (0-20). PS default 5. |
| scale_horizontal | integer | – | wave only: horizontal scale percent (1-100). |
| scale_vertical | integer | – | wave only: vertical scale percent (1-100). |
| seed | integer | – | fibers only: randomize seed — change for a different fiber pattern. PS default 12345. |
| shadow_fade | number | – | Shadows tab: amount of sharpening to fade in shadow regions (0-100). 0 = sharpen shadows fully, 100 = no shadow sharpening. Useful for preventing shadow-noise amplification. PS default 0. |
| shadow_radius | number | – | Shadows tab: local-contrast radius in pixels (1-100). PS default 30. Defines the neighborhood used to classify pixels as shadows. |
| shadow_tonal_width | number | – | Shadows tab: tonal width — how broadly "shadows" is defined (0-100). PS default 50. |
| sharpen_details | number | – | Sharpening to apply after noise reduction (0-100). PS default 25. Compensates for the softening that noise reduction causes. |
| shine | number | – | Specular shine (0-10). |
| size | string | – | ripple only: ripple wavelength size. |
| specular_brightness | number | – | Specular highlight brightness boost (0-255). PS default 0. Lift highlights to enhance bokeh "balls" — values around 50-100 produce visible specular highlights, higher = more dramatic. |
| specular_threshold | number | – | Specular highlight threshold (0-255). PS default 255 (no specular boost applies). Lower the threshold to let more pixels be treated as specular highlights for the brightness boost. Typical photograph… |
| strength | number | – | Luminance noise reduction strength (0-10). PS default 5. Higher = more aggressive noise reduction but more detail loss. |
| stylization | number | – | Brush-stroke stylization (0.1-10). |
| threshold | integer | – | surface_blur only: tonal threshold (0-255) — edges differing by more than this are preserved. PS default 20. |
| type | string | – | Which filter to apply. Required when op=apply (the default); ignored otherwise. Each type uses its own parameters: gaussian_blur(radius); motion_blur(angle, radius); lens_blur(radius, iris_shape, …);… |
| undefined_areas | string | – | How to fill areas pushed outside the layer. |
| variance | integer | – | fibers only: color variance / streak length (1-64). PS default 16. |
| vertical | integer | – | offset only: vertical shift in pixels (positive = down). |
| vertical_scale | integer | – | Vertical displacement scale (-999 to 999). PS default 10. |
| wave_type | string | – | wave only: waveform shape. |
| wavelength_max | integer | – | wave only: maximum wavelength (1-999). |
| wavelength_min | integer | – | wave only: minimum wavelength (1-998; must be <= wavelength_max). |
| wind_direction | string | – | wind only: streak direction. PS default left. |
| wind_method | string | – | wind only: streak intensity/style. PS default wind. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | – |
| blend_mode | string | – | – |
| context | object | – | – |
| count | number | – | – |
| enabled | boolean | – | – |
| filter | string | – | – |
| filter_name | string | – | – |
| filter_type | string | – | – |
| filters | array | – | – |
| index | number | – | – |
| is_smart_object | boolean | – | – |
| layer_name | string | – | – |
| opacity | number | – | – |
| original_layer_name | string | – | – |
| remaining_count | number | – | – |
| removed | boolean | – | – |
| removed_filter_name | string | – | – |
| removed_filter_type | string | – | – |
| requested_enabled | boolean | – | – |
| target_layer_name | string | – | – |
| target_was_copy | boolean | – | – |
| visibility_set | boolean | – | – |
No examples provided.
ps_get_histogram ~410
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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | Which channel to read. "composite" (default) is the visible flattened image; if the active layer is an adjustment/fill/shape layer the tool transparently switches to a pixel layer to read it. "red"/"… |
| Name | Type | Req | Description |
|---|---|---|---|
| bin_count | number | – | – |
| bins | array | – | – |
| channel | string | – | – |
| context | object | – | – |
| mean | number | – | – |
| median | number | – | – |
| stdev | number | – | – |
| total_pixels | number | – | – |
No examples provided.
ps_get_layer_bounds_diff ~253
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 place_image / scale_layer / move_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.
| Name | Type | Req | Description |
|---|---|---|---|
| layer | string | yes | Name of the layer to measure. Reads boundsNoEffects (raw pixel bounds without layer-style expansion). The active doc's layer tree is searched recursively (so layers nested in groups are findable by n… |
| target_bottom | number | yes | Target rectangle bottom edge. |
| target_left | number | yes | Target rectangle left edge in document pixels. |
| target_right | number | yes | Target rectangle right edge. |
| target_top | number | yes | Target rectangle top edge. |
| tolerance_px | number | – | Tolerance in pixels for the verdict — within this delta on every edge, the verdict is "aligned". Default 10. |
| Name | Type | Req | Description |
|---|---|---|---|
| actual_bounds | object | – | – |
| centroid_offset_x | number | – | – |
| centroid_offset_y | number | – | – |
| context | object | – | – |
| deltas | object | – | – |
| scale_ratio_x | number | – | – |
| scale_ratio_y | number | – | – |
| target_bounds | object | – | – |
| verdict | string | – | – |
| within_tolerance | boolean | – | – |
No examples provided.
ps_get_preview ~575
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.
| Name | Type | Req | Description |
|---|---|---|---|
| annotations | array | – | Optional list of visual annotations to draw onto the preview before rendering — rectangles (by explicit bounds OR by layer name), guides (horizontal / vertical reference lines), point markers, and th… |
| max_dimension | integer | – | Cap on the long edge in pixels. Defaults to 1024, which is plenty for tone/color/composition judgment and roughly halves the base64 payload vs the older 1500 default. Bump higher only when reading fi… |
| quality | integer | – | JPEG quality 1-12. Default: 6 (visibly clean for verification at the default 1024px max-dim; halves payload vs the older quality=8 default). Bump to 8-10 only when the preview is the deliverable, not… |
| Name | Type | Req | Description |
|---|---|---|---|
| annotation_count | number | – | – |
| bytes | number | – | – |
| context | object | – | – |
| dimensions | string | – | – |
| format | string | – | – |
| mime_type | string | – | – |
No examples provided.
ps_get_selection_preview ~234
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, Quick Mask-style — 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.
| Name | Type | Req | Description |
|---|---|---|---|
| image | string | – | Which rendered image(s) to return inline. 'overlay' (default): a 50% red wash over the selected area (Quick Mask-style — most intuitive). 'mask': a B/W mask (black=selected, white=not) instead. 'both… |
| max_dimension | integer | – | Long-edge pixel cap for the returned images. Default 800. |
| Name | Type | Req | Description |
|---|---|---|---|
| mask_bytes | number | – | – |
| max_dimension | number | – | – |
| overlay_bytes | number | – | – |
| rendered | 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.
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.