@alisaitteke/photoshop-mcp 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +35 -7
  2. package/dist/api/extendscript.d.ts +54 -0
  3. package/dist/api/extendscript.d.ts.map +1 -1
  4. package/dist/api/extendscript.js +535 -0
  5. package/dist/api/extendscript.js.map +1 -1
  6. package/dist/core/server.d.ts.map +1 -1
  7. package/dist/core/server.js +10 -0
  8. package/dist/core/server.js.map +1 -1
  9. package/dist/prompts/registry.d.ts +1 -1
  10. package/dist/prompts/registry.d.ts.map +1 -1
  11. package/dist/prompts/registry.js +2 -0
  12. package/dist/prompts/registry.js.map +1 -1
  13. package/dist/prompts/templates/csv-to-cards.d.ts +3 -0
  14. package/dist/prompts/templates/csv-to-cards.d.ts.map +1 -0
  15. package/dist/prompts/templates/csv-to-cards.js +43 -0
  16. package/dist/prompts/templates/csv-to-cards.js.map +1 -0
  17. package/dist/tools/color-adjustment-tools.d.ts +4 -0
  18. package/dist/tools/color-adjustment-tools.d.ts.map +1 -0
  19. package/dist/tools/color-adjustment-tools.js +147 -0
  20. package/dist/tools/color-adjustment-tools.js.map +1 -0
  21. package/dist/tools/data-tools.d.ts +4 -0
  22. package/dist/tools/data-tools.d.ts.map +1 -0
  23. package/dist/tools/data-tools.js +132 -0
  24. package/dist/tools/data-tools.js.map +1 -0
  25. package/dist/tools/export-tools.d.ts +4 -0
  26. package/dist/tools/export-tools.d.ts.map +1 -0
  27. package/dist/tools/export-tools.js +62 -0
  28. package/dist/tools/export-tools.js.map +1 -0
  29. package/dist/tools/recipes/csv-to-cards.d.ts +4 -0
  30. package/dist/tools/recipes/csv-to-cards.d.ts.map +1 -0
  31. package/dist/tools/recipes/csv-to-cards.js +257 -0
  32. package/dist/tools/recipes/csv-to-cards.js.map +1 -0
  33. package/dist/tools/recipes/index.d.ts +1 -1
  34. package/dist/tools/recipes/index.d.ts.map +1 -1
  35. package/dist/tools/recipes/index.js +3 -0
  36. package/dist/tools/recipes/index.js.map +1 -1
  37. package/dist/tools/stack-tools.d.ts +4 -0
  38. package/dist/tools/stack-tools.d.ts.map +1 -0
  39. package/dist/tools/stack-tools.js +72 -0
  40. package/dist/tools/stack-tools.js.map +1 -0
  41. package/dist/tools/style-tools.d.ts +4 -0
  42. package/dist/tools/style-tools.d.ts.map +1 -0
  43. package/dist/tools/style-tools.js +75 -0
  44. package/dist/tools/style-tools.js.map +1 -0
  45. package/dist/utils/js-string.d.ts.map +1 -1
  46. package/dist/utils/js-string.js +1 -0
  47. package/dist/utils/js-string.js.map +1 -1
  48. package/package.json +7 -3
package/README.md CHANGED
@@ -18,6 +18,7 @@
18
18
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
19
19
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue.svg)](https://www.typescriptlang.org/)
20
20
  [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS-lightgrey.svg)]()
21
+ [![MCP Registry](https://img.shields.io/badge/MCP%20Registry-io.github.alisaitteke%2Fphotoshop--mcp-purple.svg)](https://registry.modelcontextprotocol.io)
21
22
 
22
23
  A Model Context Protocol (MCP) server that enables AI assistants like Claude and Cursor to control Adobe Photoshop programmatically. This allows you to create designs, manipulate images, and automate Photoshop workflows through natural language commands while working in your IDE — or through the bundled **standalone web UI**, which supports both API keys and CLI subscription accounts (Claude Code / Gemini CLI). The UI also offers an opt-in **Action Plan (beta)** mode that plans every Photoshop step in one LLM call, then runs them in a single pass.
23
24
 
@@ -171,16 +172,16 @@ requests into reliable Photoshop actions:
171
172
  - **Server `instructions`** — workflow contract advertised on MCP `initialize`
172
173
  (ping once, state-before-action, prefer recipes, error recovery). See
173
174
  [`src/prompts/instructions.ts`](src/prompts/instructions.ts).
174
- - **MCP `prompts` primitive** — 22 pre-engineered templates (15 recipe + 7 guide:
175
+ - **MCP `prompts` primitive** — 23 pre-engineered templates (16 recipe + 7 guide:
175
176
  `ps.enhance_portrait`, `ps.remove_background`, `ps.generative_fill`, …)
176
177
  via `prompts/list` and `prompts/get`.
177
- - **Recipe tools** — 15 outcome-oriented `photoshop_recipe_*` tools (remove
178
+ - **Recipe tools** — 16 outcome-oriented `photoshop_recipe_*` tools (remove
178
179
  background, enhance portrait, prepare for web, export social variants, color
179
180
  grade, frequency separation, batch mockup, organize layers, gradient fade,
180
181
  sky blend, dodge & burn, remove distraction, split carousel, batch watermark,
181
- passport photo). Each wraps steps in a single
182
- Photoshop history state (one Undo reverts all). **89 tools total** (74 atomic
183
- + 15 recipe).
182
+ passport photo, csv to cards). Each wraps steps in a single
183
+ Photoshop history state (one Undo reverts all). **102 tools total** (86 atomic
184
+ + 16 recipe).
184
185
  - **Generative AI** — `photoshop_generative_fill`, `photoshop_generative_remove`,
185
186
  `photoshop_generative_expand`, `photoshop_generative_upscale`, `photoshop_sky_replacement`,
186
187
  `photoshop_generate_image` (Firefly via ExtendScript; Adobe account + credits required).
@@ -387,6 +388,17 @@ Note: framing is approximated from subject bounds — official acceptance is not
387
388
 
388
389
  Equivalent MCP prompt template: `ps.passport_photo` with `{ spec: "us_2x2", make_sheet: "true" }`.
389
390
 
391
+ #### 🪪 CSV → cards (data-driven graphics)
392
+
393
+ <img src="./images/recipe-csv-cards.svg" alt="CSV rows become data sets; one personalized card exported per row" width="640" />
394
+
395
+ ```
396
+ Generate a name card for every row in ~/cards/speakers.csv using the open template PSD.
397
+ PNG output to ~/cards/out — one file per row, named after the row.
398
+ ```
399
+
400
+ Equivalent MCP prompt template: `ps.csv_to_cards` with `{ csv_path: "~/cards/speakers.csv", output_dir: "~/cards/out", format: "PNG" }`.
401
+
390
402
  ### More examples
391
403
 
392
404
  <details>
@@ -585,15 +597,20 @@ Never guess — read get_state after a failure and propose the next single step.
585
597
  - **Supports Photoshop 2012-2025+**
586
598
  - **ExtendScript API**: Universal compatibility via AppleScript/COM automation
587
599
  - **Auto-Detection**: Automatically finds Photoshop installation on your system
588
- - **89 Tools**: 74 atomic `photoshop_*` + 15 recipe `photoshop_recipe_*`
589
- - **AI/Prompt Layer**: 22 MCP prompt templates (15 recipe + 7 guide), server instructions, state/preview/capabilities tools
600
+ - **102 Tools**: 86 atomic `photoshop_*` + 16 recipe `photoshop_recipe_*`
601
+ - **AI/Prompt Layer**: 23 MCP prompt templates (16 recipe + 7 guide), server instructions, state/preview/capabilities tools
590
602
  - **Document Management**: Create, open, save, close, crop documents
591
603
  - **Layer Operations**: Create, delete, duplicate, merge, transform layers
592
604
  - **Layer Properties**: Opacity, blend modes, visibility, locking
605
+ - **Layer Styles**: Drop shadow, outer glow, stroke, bevel & emboss
593
606
  - **Text Formatting**: Font, size, color, alignment controls
594
607
  - **Image Placement**: Place images, open files, fit to document
595
608
  - **Filters**: Gaussian Blur, Sharpen, Noise, Motion Blur
596
609
  - **Color Adjustments**: Brightness/Contrast, Hue/Saturation, Curves, Auto Levels/Contrast
610
+ - **Color Grading**: 3D LUT (Color Lookup) layers, Vibrance, Exposure, Photo Filter, Gradient Map
611
+ - **Data-Driven Graphics**: CSV/variables XML → one image per row ("mail merge for images")
612
+ - **Image Stacking**: Mean/median stack modes for tourist removal & noise reduction
613
+ - **Modern Export**: PNG/JPEG plus WebP/AVIF (native, PS 23.2+)
597
614
  - **Selections & Masks**: Rectangular selections, select subject, content-aware fill, gradient mask, layer masks
598
615
  - **History Control**: Undo/Redo operations, view history states
599
616
  - **Actions**: Play recorded actions, execute custom scripts
@@ -602,6 +619,17 @@ Never guess — read get_state after a failure and propose the next single step.
602
619
 
603
620
  ## Installation
604
621
 
622
+ ### One-click install
623
+
624
+ [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=photoshop&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBhbGlzYWl0dGVrZS9waG90b3Nob3AtbWNwIl19)
625
+ [![Install in VS Code](https://img.shields.io/badge/Install%20in-VS%20Code-0098FF)](https://vscode.dev/redirect/mcp/install?name=photoshop&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40alisaitteke%2Fphotoshop-mcp%22%5D%7D)
626
+
627
+ Or from a terminal — Claude Code:
628
+
629
+ ```bash
630
+ claude mcp add photoshop -- npx -y @alisaitteke/photoshop-mcp
631
+ ```
632
+
605
633
  ### Using NPX (Recommended)
606
634
 
607
635
  No installation required! Just configure your MCP client:
@@ -314,6 +314,60 @@ export declare const ExtendScriptSnippets: {
314
314
  generativeUpscale: (targetScale: number) => string;
315
315
  skyReplacement: (skyImagePath: string) => string;
316
316
  generateImage: (prompt: string, width: number, height: number) => string;
317
+ /**
318
+ * Apply a layer style (drop shadow / outer glow / stroke / bevel) via Action Manager layerEffects.
319
+ */
320
+ applyLayerStyle: (options: {
321
+ style: "drop_shadow" | "outer_glow" | "stroke" | "bevel_emboss";
322
+ red: number;
323
+ green: number;
324
+ blue: number;
325
+ opacity: number;
326
+ size: number;
327
+ distance: number;
328
+ angle: number;
329
+ }) => string;
330
+ /**
331
+ * Color Lookup (3D LUT) adjustment layer — cinematic grades via built-in or file-based LUTs.
332
+ */
333
+ applyLut: (lut: string) => string;
334
+ /**
335
+ * Vibrance adjustment layer.
336
+ */
337
+ adjustVibrance: (vibrance: number, saturation: number) => string;
338
+ /**
339
+ * Exposure adjustment layer.
340
+ */
341
+ adjustExposure: (exposure: number, offset: number, gamma: number) => string;
342
+ /**
343
+ * Photo Filter adjustment layer (warming/cooling/tint with density).
344
+ */
345
+ applyPhotoFilter: (red: number, green: number, blue: number, density: number, preserveLuminosity: boolean) => string;
346
+ /**
347
+ * Gradient Map adjustment layer (black→white custom gradient by default).
348
+ */
349
+ applyGradientMap: (reverse: boolean) => string;
350
+ /**
351
+ * List data sets defined on the active document (data-driven graphics).
352
+ */
353
+ listDataSets: () => string;
354
+ /**
355
+ * Import variables/data sets XML (Image > Variables > Data Sets > Import).
356
+ */
357
+ importDataSets: (xmlPath: string) => string;
358
+ /**
359
+ * Batch-export one file per data set: applies each data set then saves a copy.
360
+ */
361
+ applyDataSetsExport: (outputDir: string, format: "JPEG" | "PNG" | "PSD", datasetNames: string[]) => string;
362
+ /**
363
+ * Load image files into one document, convert to a smart object and apply a stack mode.
364
+ * Classic "remove tourists with median stack" without any generative AI.
365
+ */
366
+ imageStackMode: (files: string[], mode: string) => string;
367
+ /**
368
+ * Export a copy of the active document as PNG/JPEG (Save for Web) or WebP/AVIF (native, PS 23.2+).
369
+ */
370
+ exportAs: (filePath: string, format: "PNG" | "JPEG" | "WEBP" | "AVIF", quality: number) => string;
317
371
  };
318
372
  /**
319
373
  * Generate ExtendScript code with error handling
@@ -1 +1 @@
1
- {"version":3,"file":"extendscript.d.ts","sourceRoot":"","sources":["../../src/api/extendscript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extendscript.d.ts","sourceRoot":"","sources":["../../src/api/extendscript.ts"],"names":[],"mappings":"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"}