PhotoshopBLOCK
MCP for Adobe Photoshop. 118 tools. Control from Cursor, Claude or custom LLMs.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Languages: English · 简体中文 · Español · Deutsch · 日本語 · Türkçe · [Website](https://photoshop-mcp.com/)
[](https://www.npmjs.com/package/@alisaitteke/photoshop-mcp) [](https://github.com/alisaitteke/photoshop-mcp/releases) [](docs/standalone-ui.md#action-plan-beta) [](#new-instant-edits-with-jev) [](https://opensource.org/licenses/MIT) [](https://www.typescriptlang.org/) []() [](https://registry.modelcontextprotocol.io) [](https://mcptoplist.com/server/io.github.alisaitteke%2Fphotoshop-mcp) [](https://photoshop-mcp.com/)
[](https://glama.ai/mcp/servers/alisaitteke/photoshop-mcp)
Chat with Photoshop like a colleague. Describe what you want in plain words — "remove this background", "resize the
36c0e79852b8OBSERVED · 2026-10-05Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add photoshop-mcp -- npx -y @alisaitteke/[email protected]
Exposed tools (172)
92 read · 69 write · 11 destructive. Blast radius: 11 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
angle_deg | read | Optional gradient angle override in degrees. |
assets_dir | read | Absolute path to the directory containing the source asset images (jpeg/png/psd). Subdirectories are not recursed. |
auto_group | read | When true, group layers by kind (text / image / shape / adjustment) into folders. Default true. |
auto_select_subject | write | Run Select Subject when no selection (true/false, default false) |
blend_mode | read | Layer blend mode after placement: normal (default), multiply, screen, overlay, soft_light. |
csv_path | read | Absolute path to the CSV file (first row = variable names matching the template variables). |
direction | read | left | right | top | bottom | all (default all) |
end_pct | read | Gradient end along the fade axis (0-100). Default 100. |
feather_pct | read | Half-width of the transition zone around the horizon (0-50). Default 15. |
feather_px | destructive | Edge feather 0-20 before remove (default 0) |
format | read | JPEG or PNG. Default JPEG. |
horizon_pct | read | Document-height percentage where sky meets landscape (0-100). Default 50. |
image_path | read | Absolute path to the image file to place (sky, background, texture). Required. |
intensity | read | Retouch strength: low (subtle), medium (default), or high (heavy smoothing). |
keep_shadow | read | When true, records intent for a contact shadow in the recipe response. Shadow layer creation is not yet implemented. Default false. |
logo_path | read | Absolute path to a logo image (transparent PNG recommended). |
make_sheet | read | true to also export a 10×15 cm print sheet with multiple copies. Default false. |
max_dimension_px | read | Longest-edge pixel cap. Default 2048. Common values: 1080, 1600, 2048, 2560. |
naming_scheme | write | How to rename layers. One of: type_index (default, e.g. text_01), content_summary (text layers get a slug of their content), preserve (do not rename, only group). |
opacity | read | Watermark opacity 0-100. Default 40. |
output_dir | read | Directory where generated files are written. |
photoshop-preview | read | Interactive preview of the active Photoshop document. |
photoshop_adjust_brightness_contrast | write | Apply Image > Adjustments > Brightness/Contrast once to the active layer. Values are deltas on pixels, not an adjustment layer.\n\n |
photoshop_adjust_curves | write | Create a Curves adjustment layer on the active document.\n\n |
photoshop_adjust_exposure | write | Create an Exposure adjustment layer (stops, offset, gamma correction).\n\n |
photoshop_adjust_hue_saturation | read | Shift hue, saturation, and lightness on the active layer via Image > Adjustments > Hue/Saturation. Values are applied once to pixels, not stored as an adjustment layer.\n\n |
photoshop_adjust_vibrance | write | Create a Vibrance adjustment layer. Vibrance boosts muted colors while protecting skin tones.\n\n |
photoshop_apply_gaussian_blur | write | Apply Gaussian Blur filter to the active layer |
photoshop_apply_gradient_map | write | Create a Gradient Map adjustment layer (black→white by default) for duotone/B&W tonal remapping.\n\n |
photoshop_apply_gradient_mask | write | Apply a linear black-to-white gradient on the active layer mask channel (fade/blend).\n\n |
photoshop_apply_high_pass | write | Apply the High Pass filter to the active raster layer — edge/detail extraction for sharpening workflows or frequency separation prep.\n\n |
photoshop_apply_layer_mask | destructive | Bake the active layer mask into its pixels and remove the mask. Pixels the mask hid are deleted.\n\n |
photoshop_apply_layer_style | destructive | Apply a layer style (drop shadow, outer glow, stroke, bevel & emboss) to the active layer via Action Manager layer effects.\n\n |
photoshop_apply_lut | write | Apply a Color Lookup (3D LUT) adjustment layer for cinematic color grading. Accepts a built-in LUT name (e.g. |
photoshop_apply_motion_blur | write | Apply Motion Blur to the active raster layer (angle in degrees, distance in pixels).\n\n |
photoshop_apply_noise | write | Apply Add Noise to the active raster layer (amount percent, UNIFORM or GAUSSIAN, optional monochromatic).\n\n |
photoshop_apply_photo_filter | write | Create a Photo Filter adjustment layer (warming/cooling/custom tint with density control).\n\n |
photoshop_apply_sharpen | write | Apply Unsharp Mask to the active raster layer (amount, radius, threshold). This is a pixel filter on one layer, not a web-export sharpen pass.\n\n |
photoshop_apply_smart_blur | write | Apply the Smart Blur filter to the active raster layer — edge-preserving blur for smoothing skin or simplifying backgrounds.\n\n |
photoshop_auto_contrast | write | Run Auto Contrast on the active layer. Photoshop picks the contrast; there is no amount parameter.\n\n |
photoshop_auto_levels | write | Run Auto Levels on the active layer. Photoshop sets the black, white, and gray points; there is no amount parameter.\n\n |
photoshop_close_document | read | Close a Photoshop document tab. Defaults to the active document; pass document_id to close a specific open file.\n\n |
photoshop_content_aware_fill | read | Fill the current pixel selection using Content-Aware Fill.\n\n |
photoshop_contract_selection | read | Contract (shrink) the active pixel selection inward by a pixel amount.\n\n |
photoshop_convert_to_smart_object | read | Convert the active layer (or a named layer) to an embedded Smart Object.\n\n |
photoshop_create_artboard | write | Create a Photoshop artboard (AM artboardSection) at an explicit origin or placed to the right of existing artboards.\n\n |
photoshop_create_clipping_mask | write | Create a clipping mask on the active layer (or a named layer).\n\n |
photoshop_create_document | write | Create a new empty Photoshop document with specified dimensions and color mode.\n\n |
photoshop_create_layer | write | Create a new empty layer above the active layer.\n\n |
photoshop_create_layer_mask | write | Create a layer mask on the active layer from the current selection (reveal selection).\n\n |
photoshop_create_smart_object_via_copy | write | Create an independent Smart Object via Copy — unlinked duplicate with its own embedded contents.\n\n |
photoshop_create_text_layer | write | Create a text layer with content, position, font, and optional typography (tracking, leading, paragraph box, alignment, color).\n\n |
photoshop_crop_document | read | Crop the active document to a pixel rectangle (left, top, right, bottom). Pixels outside that rectangle are deleted and the canvas shrinks.\n\n |
photoshop_delete_layer | destructive | Delete the active layer, including its pixels, mask, and effects.\n\n |
photoshop_delete_layer_mask | destructive | Delete the layer mask from active layer |
photoshop_desaturate | read | Desaturate the active layer (convert to grayscale) |
photoshop_deselect | destructive | Clear the current pixel selection. Pixels are unchanged.\n\n |
photoshop_duplicate_layer | read | Duplicate the active layer. The duplicate becomes the active layer; |
photoshop_edit_smart_object_contents | write | Open a Smart Object for editing (double-click / Edit Contents). The embedded .psb becomes the active document until you save and close it.\n\n |
photoshop_execute_script | write | Execute custom ExtendScript (JSX) code inside Photoshop (advanced escape hatch).\n\n |
photoshop_expand_selection | read | Expand the active pixel selection outward by a pixel amount.\n\n |
photoshop_export_artboards | read | Export every artboard in the active document to a folder (duplicate + crop to artboardRect, then PNG/JPEG/WebP/AVIF).\n\n |
photoshop_export_as | read | Export a copy of the active document as PNG, JPEG, WebP or AVIF without changing the open document. WebP/AVIF require Photoshop 23.2+/recent builds and return a clear error when unsupported.\n\n |
photoshop_feather_selection | read | Feather (soften) the edges of the active pixel selection.\n\n |
photoshop_fill_gradient | read | Paint a two-color linear gradient on the active layer pixels.\n\n |
photoshop_fill_layer | read | Fill the active layer with a solid RGB color. If a selection exists, only that region is filled and the selection stays; otherwise the whole layer is filled and the selection is cleared.\n\n |
photoshop_fit_layer_to_document | read | Scale the active layer to the document canvas, keeping aspect ratio. |
photoshop_flatten_image | read | Flatten the active document into a single Background layer. Hidden layers are discarded.\n\n |
photoshop_generate_from_datasets | write | Batch-export the active document once per data set: applies each data set, saves a copy, moves on. |
photoshop_generate_image | write | Photoshop Generate Image (Firefly ImageGen): create an image from a text prompt.\n\n |
photoshop_generative_expand | read | Extend the canvas beyond its edges using Generative Expand (Firefly).\n\n |
photoshop_generative_fill | read | Fill the current selection using Adobe Generative Fill (Firefly) with a text prompt.\n\n |
photoshop_generative_remove | destructive | Remove content using the AI Remove tool (or generative fill fallback) on the current selection.\n\n |
photoshop_generative_upscale | read | Upscale the active document using Generative Upscale (PS 27+).\n\n |
photoshop_get_capabilities | read | Return version-aware feature flags for the installed Photoshop (Select Subject v2, Generative Fill, etc.).\n\n |
photoshop_get_document_info | read | Read the active document id, name, size, resolution, and color mode. Does not change pixels or which tab is active.\n\n |
photoshop_get_history | read | Read the history stack of the active document, including which state is current. Does not change pixels.\n\n |
photoshop_get_layers | read | List all layers in the active document with kind, visibility, and opacity.\n\n |
photoshop_get_preview | read | Export the active document as a base64 JPEG preview for visual verification.\n\n |
photoshop_get_selection_bounds | read | Read the active pixel selection bounds in document pixels (read-only).\n\n |
photoshop_get_state | read | Return a cheap read-only snapshot of Photoshop session state (active document, layer, selection).\n\n |
photoshop_get_version | read | Return the detected Photoshop version string.\n\n |
photoshop_image_stack | write | Load 2+ image files into one document, convert to a smart object and apply a stack mode (mean/median/max/min/...). Classic |
photoshop_import_datasets | write | Import a Photoshop variables/data-sets XML file into the active document (the same file Image > Variables > Data Sets > Import accepts).\n\n |
photoshop_install_font | write | Install a font file for the current user and reload Photoshop\ |
photoshop_invert | read | Invert colors of the active layer |
photoshop_invert_selection | read | Invert the current pixel selection: selected pixels become unselected and the rest become selected. Layer pixels are unchanged.\n\n |
photoshop_list_artboards | read | List artboards in the active document with id, name, pixel bounds, and which one contains the active layer.\n\n |
photoshop_list_datasets | read | List the data sets defined on the active document (Image > Variables > Data Sets).\n\n |
photoshop_list_documents | read | List every open Photoshop document with id, dimensions, saved flag, artboard_count, and which tab is active.\n\n |
photoshop_list_fonts | read | List installed fonts available to Photoshop.\n\n |
photoshop_merge_visible_layers | write | Merge every visible layer into one layer. Hidden layers stay in the stack.\n\n |
photoshop_move_layer | write | Move the active layer by specified offset |
photoshop_move_layer_down | write | Move the active layer down one position in the layer stack |
photoshop_move_layer_to_bottom | write | Move the active layer to the bottom of the layer stack |
photoshop_move_layer_to_position | write | Reorder the active layer relative to a named layer. |
photoshop_move_layer_to_top | write | Move the active layer to the top of the layer stack |
photoshop_move_layer_up | write | Move the active layer up one position in the layer stack |
photoshop_neural_filter | write | Apply a Photoshop Neural Filter via the companion UXP bridge plugin.\n\n |
photoshop_open_image | read | Open an image file as a new Photoshop document.\n\n |
photoshop_ping | write | Verify that the Photoshop scripting engine can run a script.\n\n |
photoshop_place_image | read | Place an external image file as a new layer in the active document.\n\n |
photoshop_play_action | write | Play a named action from a named action set in the Actions panel. The action runs whatever steps were recorded; this tool does not limit them.\n\n |
photoshop_rasterize_layer | read | Rasterize the active layer (convert text/smart object to normal layer) |
photoshop_redo | read | Redo the previously undone operation(s), equivalent to Ctrl/Cmd+Shift+Z.\n\n |
photoshop_release_clipping_mask | destructive | Release (remove) the clipping mask from the active layer (or a named layer).\n\n |
photoshop_rename_layer | write | Rename the active layer. Does not change pixels, order, or visibility.\n\n |
photoshop_replace_smart_object_contents | read | Replace the embedded contents of a Smart Object layer from an image file. Preserves transforms, warps, and Smart Filters on the layer.\n\n |
photoshop_resize_image | read | Resample the active document to a new pixel width and height (bicubic). Every layer scales and the canvas size changes.\n\n |
photoshop_rotate_layer | read | Rotate the active layer by |
photoshop_save_document | write | Save the active document to disk in PSD, JPEG, or PNG format.\n\n |
photoshop_save_selection | write | Save the active pixel selection to a new alpha channel.\n\n |
photoshop_scale_layer | read | Scale the active layer by a percentage (100 leaves the size unchanged). |
photoshop_select_all | read | Select every pixel of the active document. Does not change layer pixels.\n\n |
photoshop_select_ellipse | write | Create an elliptical pixel selection from a bounding box (anti-aliased).\n\n |
photoshop_select_layer_by_name | read | Select the active layer by exact name, including layers inside groups.\n\n |
photoshop_select_rectangle | write | Create a rectangular pixel selection from corner coordinates.\n\n |
photoshop_select_subject | write | Run Select Subject on the active layer (creates a pixel selection only, no mask).\n\n |
photoshop_set_active_artboard | write | Select an artboard layer group by artboard_id (preferred) or unique name so subsequent edits and Select All target that board.\n\n |
photoshop_set_active_document | write | Switch the active document tab by document_id (preferred), zero-based index, or name.\n\n |
photoshop_set_layer_blend_mode | write | Set the blend mode of the active layer.\n\n |
photoshop_set_layer_locked | write | Set the all-lock flag on the active layer. |
photoshop_set_layer_opacity | write | Set the active layer opacity to an absolute 0–100 value. The number replaces the current opacity; it is not added to it.\n\n |
photoshop_set_layer_visibility | write | Show or hide the active layer |
photoshop_set_text_alignment | write | Set justification on the whole active text layer (LEFT through FULLYJUSTIFIED).\n\n |
photoshop_set_text_color | write | Set one RGB color on the whole active text layer.\n\n |
photoshop_set_text_font | write | Set font family and size for active text layer.\n\n |
photoshop_set_text_ranges | write | Apply mixed fonts, sizes, and colors inside a single text layer (Action Manager textStyleRange).\n\n |
photoshop_set_text_style | write | Set layer-wide typography on the active text layer: tracking, leading, point vs paragraph box, alignment, font, size, color.\n\n |
photoshop_sky_replacement | read | Replace the sky using Photoshop native Sky Replacement when available.\n\n |
photoshop_submit_feedback | write | Record the user |
photoshop_undo | read | Step the active document back through history (Ctrl/Cmd+Z). Each call moves the active history state earlier by |
photoshop_update_text_content | write | Replace the string contents of the active text layer. Font, color, and alignment stay as they are.\n\n |
platforms | read | Comma-separated platform slugs. Known: instagram_post, instagram_story, instagram_reel, x_post, x_header, facebook_post, facebook_cover, linkedin_post, linkedin_banner, youtube_thumbnail, tiktok_vertical, pinterest_pin. Default: instagram_post,instagram_story,x_post. |
position | read | One of: ${POSITIONS.join( |
preset | read | Preset name. One of: cinematic, vintage, teal_orange, bw, warm_film, cool_dusk. Default: cinematic. |
prompt | read | How to extend the image (default: extend the background naturally) |
ps.apply_color_grade | write | Apply a named color grading preset (curves + hue/saturation + selective color) as a single non-destructive recipe. Users often say: cinematic, teal orange, moody grade, color grade. |
ps.batch_mockup_replace | read | Iterate a directory of asset images, swap each one into the named Smart Object in the active mockup PSD, and export a flattened JPEG per asset. |
ps.batch_watermark | write | Apply a text or logo watermark to every image in a folder and export watermarked JPEGs. Users often say: watermark these photos, add my logo to all, toplu filigran. |
ps.color_correct | read | Fix flat or dull tonality with auto levels or brightness/contrast — stepping stone until curves atomics ship. |
ps.composite_blend | write | Place an external image into the active document, mask it, and set blend mode — interim workflow for sky replacement and compositing. |
ps.csv_to_cards | read | Generate one image per CSV row from the active template PSD (data-driven graphics / |
ps.dodge_burn | read | One-shot dodge & burn setup: 50% gray layer in Overlay or Soft Light for non-destructive light sculpting. Users often say: dodge and burn, sculpt light, lighten face, darken shadows. User paints white (dodge) and black (burn) manually after setup. |
ps.dodge_burn_guide | write | Set up a non-destructive dodge & burn layer (50% gray + Overlay or Soft Light) for manual light sculpting. |
ps.enhance_portrait | read | Multi-step retouch plan for a portrait: non-destructive skin smoothing via frequency separation, mild dodge & burn, and auto-tone — wrapped in a single undoable history step. Users often say: smooth skin, retouch portrait, fix blemishes. |
ps.export_social_variants | read | Generate one JPEG per social-media platform from the active document, each at the platform |
ps.frequency_separation | write | Set up a frequency separation stack on the active layer (Low Frequency + High Frequency layers) so the user can smooth tones and retouch texture independently — without applying any actual smoothing. Users often say: frequency separation, split texture and color. |
ps.generative_expand | read | Generative Expand beyond canvas edges. Users often say: extend canvas, outpainting, expand background, generative expand. |
ps.generative_fill | read | Generative Fill inside the current selection with a text prompt. Users often say: add object, replace selection, generative fill, firefly fill. |
ps.generative_remove | destructive | AI Remove tool on the current selection. Users often say: remove person, erase distraction, generative remove, delete object. |
ps.gradient_blend | read | Fade the active layer into the background using a linear gradient on the layer mask — common for soft compositing and horizon blends. |
ps.gradient_fade | read | One-shot gradient fade on the active layer mask — soft edge blending into the background. Users often say: fade into background, gradient mask, blend subject, soft edge fade, arka planı yumuşat. Applies a linear gradient on the layer mask, not a Gradient Fill layer. |
ps.organize_layers | write | Clean up a messy PSD: rename layers using a consistent scheme and optionally auto-group them by kind or spatial proximity. Users often say: organize layers, rename mess, tidy layers. |
ps.passport_photo | read | Turn the active portrait into a passport/ID photo: white background, ICAO-style framing, exact official pixel size at 300 DPI, optional 10×15 cm print sheet. Users often say: passport photo, visa photo, ID photo, vesikalık, biyometrik. |
ps.prepare_for_web | read | Convert the active document to sRGB, downscale its longest edge, sharpen for screen, and export at the chosen format and quality. Does not mutate the source document. Users often say: for web, web export, optimize for web. |
ps.remove_background | destructive | Remove the background from the active document in one recipe call. The recipe unlocks a Background layer itself and prefers Photoshop\ |
ps.remove_distraction | destructive | One-shot distraction removal: generative AI remove when available, else content-aware fill. Users often say: remove that person, erase distraction, content aware remove, clone out object. |
ps.sky_blend | read | Place an external sky image and blend it at the horizon with a gradient mask — one undo. Users often say: replace sky, fix blown sky, better clouds, swap sky background. Photoshop Sky Replacement menu is not scriptable via ExtendScript. |
ps.split_carousel | read | Split the active wide document into N equal vertical slices exported as sequentially numbered files for a seamless Instagram/TikTok carousel. Users often say: carousel, seamless carousel, swipe, split panorama, slayt. |
quality | read | JPEG quality 1-12 (Photoshop scale). Default 9. Ignored for png. |
radius_px | read | Gaussian blur radius in pixels used for the low-frequency layer. 4-8 for portraits, 10-20 for products. Default 6. |
size | read | Optional final slide size as WxH (e.g. 1080x1350 for Instagram portrait). Omit to keep native slice dimensions. |
skin_smoothing | write | Whether to apply frequency separation skin smoothing. Default true. |
sky_image_path | read | Absolute path to the sky image file (JPEG, PNG, etc.). Required. |
slides | read | Number of slides to split into (2-10). |
smart_object_layer_name | read | Exact name of the Smart Object layer inside the active document whose contents will be replaced for each asset. |
spec | read | Target size: us_2x2 (US 2×2 in), eu_35x45 (EU/Schengen 35×45 mm), tr_50x60 (Türkiye 50×60 mm). Default us_2x2. |
start_pct | write | Gradient start along the fade axis (0-100). Default 0. |
text | read | Watermark text (e.g. |
x | read | Placement X offset in pixels. Default 0. |
y | read | Placement Y offset in pixels. Default 0. |
Trust audit
BLOCKgrade F · trust 58/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (1 observation(s))
- Network
- declared (8 observation(s))
- Shell
- declared (8 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (23)
var opts2 = eval('new ' + saveCandidates[c] + '()');return new Function(`return ${trimmed}`)() as unknown;return new Function(`return ${trimmed.slice(1, -1)}`)() as unknown;const res = await fetch(`http://127.0.0.1:${port}/health`, {const url = new URL(req.url ?? '/', `http://127.0.0.1:${listenPort}`);const BRIDGE_BASE = `http://127.0.0.1:${BRIDGE_PORT}`;body: JSON.stringify({ apiKey: 'sk-test-key-0123456789abcdef' }),feather_px, photoshop_apply_layer_mask, photoshop_apply_layer_style, photoshop_delete_layer, photoshop_delete_layer_mask, photoshop_deselect, photoshop_generative_remove, photoshop_release_clipping_ma
.prettierignore
expect(eval(`"${literal}"`)).toBe(nasty);expect(eval(jsStringLiteral('São Paulo — "skyline"'))).toBe('São Paulo — "skyline"');import type { Os } from '../../../data/clients';import en from '../../../i18n/en.json';
import tr from '../../../i18n/tr.json';
import zh from '../../../i18n/zh.json';
import es from '../../../i18n/es.json';
curl -H "x-psmcp-token: $TOKEN" http://127.0.0.1:5174/api/status
**Fix:** Reach the UI through the exact URL the CLI printed (`http://127.0.0.1:<port>`), not through a hostname that merely points at your machine, and not from a page served on another port.
@ai-sdk/anthropic, @ai-sdk/google, @ai-sdk/mcp, @ai-sdk/openai, @anthropic-ai/claude-agent-sdk, @hono/node-server, @modelcontextprotocol/sdk, @openrouter/ai-sdk-provider
@fontsource-variable/ibm-plex-sans, @fontsource/ibm-plex-mono, tsx, typescript, vitepress
@fontsource-variable/source-sans-3, @lucide/vue, @vueuse/core, class-variance-authority, clsx, lucide-vue-next, reka-ui, tailwind-merge
**Cause:** The UI server holds your LLM provider API keys and can drive Photoshop, so every `/api/*` request must present the token generated when the server starts. The browser gets it automatically
images/frame_generic_light.png
Gates applied: no_behavioural_pass.
36c0e79852b8full audit observations/trust-audit/mcp-server/alisaitteke__photoshop.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-05 | 36c0e79852b8 | BLOCK | F | 58 | first audit |
Questions
What is the Photoshop MCP server?
MCP for Adobe Photoshop. 118 tools. Control from Cursor, Claude or custom LLMs.
What tools does Photoshop expose?
172 in total: 92 read-only, 69 that write, and 11 that can delete or overwrite (feather_px, photoshop_apply_layer_mask, photoshop_apply_layer_style, photoshop_delete_layer, photoshop_delete_layer_mask). Every one is listed on this page with its risk.
Is Photoshop safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (58/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 11 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Photoshop need?
It reads PSMCP_UI_TOKEN and RYBBIT_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Photoshop run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as photoshop-mcp-ui-web at 0.1.8.
How current is this page?
The grade is for one exact copy of the source (36c0e79852b8), read on 2026-10-05. The repository is watched and re-audited when it changes.