@alisaitteke/photoshop-mcp 1.3.13 → 1.6.0

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 (166) hide show
  1. package/README.de.md +787 -0
  2. package/README.es.md +737 -0
  3. package/README.ja.md +732 -0
  4. package/README.md +204 -41
  5. package/README.tr.md +842 -0
  6. package/README.zh-CN.md +727 -0
  7. package/dist/api/extendscript.d.ts +17 -1
  8. package/dist/api/extendscript.d.ts.map +1 -1
  9. package/dist/api/extendscript.js +301 -3
  10. package/dist/api/extendscript.js.map +1 -1
  11. package/dist/api/photoshop-api.d.ts +1 -1
  12. package/dist/api/photoshop-api.d.ts.map +1 -1
  13. package/dist/api/photoshop-api.js +4 -4
  14. package/dist/api/photoshop-api.js.map +1 -1
  15. package/dist/core/server.d.ts.map +1 -1
  16. package/dist/core/server.js +8 -0
  17. package/dist/core/server.js.map +1 -1
  18. package/dist/errors/envelope.d.ts +1 -1
  19. package/dist/errors/envelope.d.ts.map +1 -1
  20. package/dist/errors/envelope.js +4 -0
  21. package/dist/errors/envelope.js.map +1 -1
  22. package/dist/platform/capabilities.d.ts +7 -0
  23. package/dist/platform/capabilities.d.ts.map +1 -1
  24. package/dist/platform/capabilities.js +23 -1
  25. package/dist/platform/capabilities.js.map +1 -1
  26. package/dist/platform/macos-detector.d.ts.map +1 -1
  27. package/dist/platform/macos-detector.js +7 -4
  28. package/dist/platform/macos-detector.js.map +1 -1
  29. package/dist/platform/macos-executor.d.ts +11 -0
  30. package/dist/platform/macos-executor.d.ts.map +1 -1
  31. package/dist/platform/macos-executor.js +103 -32
  32. package/dist/platform/macos-executor.js.map +1 -1
  33. package/dist/platform/uxp-bridge-client.d.ts +13 -0
  34. package/dist/platform/uxp-bridge-client.d.ts.map +1 -0
  35. package/dist/platform/uxp-bridge-client.js +31 -0
  36. package/dist/platform/uxp-bridge-client.js.map +1 -0
  37. package/dist/platform/uxp-bridge-server.d.ts +16 -0
  38. package/dist/platform/uxp-bridge-server.d.ts.map +1 -0
  39. package/dist/platform/uxp-bridge-server.js +105 -0
  40. package/dist/platform/uxp-bridge-server.js.map +1 -0
  41. package/dist/prompts/instructions.d.ts.map +1 -1
  42. package/dist/prompts/instructions.js +21 -12
  43. package/dist/prompts/instructions.js.map +1 -1
  44. package/dist/prompts/registry.d.ts +2 -2
  45. package/dist/prompts/registry.d.ts.map +1 -1
  46. package/dist/prompts/registry.js +15 -0
  47. package/dist/prompts/registry.js.map +1 -1
  48. package/dist/prompts/templates/batch-watermark.d.ts +3 -0
  49. package/dist/prompts/templates/batch-watermark.d.ts.map +1 -0
  50. package/dist/prompts/templates/batch-watermark.js +67 -0
  51. package/dist/prompts/templates/batch-watermark.js.map +1 -0
  52. package/dist/prompts/templates/generative-expand.d.ts +3 -0
  53. package/dist/prompts/templates/generative-expand.d.ts.map +1 -0
  54. package/dist/prompts/templates/generative-expand.js +34 -0
  55. package/dist/prompts/templates/generative-expand.js.map +1 -0
  56. package/dist/prompts/templates/generative-fill.d.ts +3 -0
  57. package/dist/prompts/templates/generative-fill.d.ts.map +1 -0
  58. package/dist/prompts/templates/generative-fill.js +29 -0
  59. package/dist/prompts/templates/generative-fill.js.map +1 -0
  60. package/dist/prompts/templates/generative-remove.d.ts +3 -0
  61. package/dist/prompts/templates/generative-remove.d.ts.map +1 -0
  62. package/dist/prompts/templates/generative-remove.js +36 -0
  63. package/dist/prompts/templates/generative-remove.js.map +1 -0
  64. package/dist/prompts/templates/passport-photo.d.ts +3 -0
  65. package/dist/prompts/templates/passport-photo.d.ts.map +1 -0
  66. package/dist/prompts/templates/passport-photo.js +36 -0
  67. package/dist/prompts/templates/passport-photo.js.map +1 -0
  68. package/dist/prompts/templates/remove-distraction.d.ts.map +1 -1
  69. package/dist/prompts/templates/remove-distraction.js +4 -5
  70. package/dist/prompts/templates/remove-distraction.js.map +1 -1
  71. package/dist/prompts/templates/split-carousel.d.ts +3 -0
  72. package/dist/prompts/templates/split-carousel.d.ts.map +1 -0
  73. package/dist/prompts/templates/split-carousel.js +49 -0
  74. package/dist/prompts/templates/split-carousel.js.map +1 -0
  75. package/dist/tools/generative/_shared.d.ts +14 -0
  76. package/dist/tools/generative/_shared.d.ts.map +1 -0
  77. package/dist/tools/generative/_shared.js +79 -0
  78. package/dist/tools/generative/_shared.js.map +1 -0
  79. package/dist/tools/generative-tools.d.ts +8 -0
  80. package/dist/tools/generative-tools.d.ts.map +1 -0
  81. package/dist/tools/generative-tools.js +221 -0
  82. package/dist/tools/generative-tools.js.map +1 -0
  83. package/dist/tools/layer-properties-tools.d.ts.map +1 -1
  84. package/dist/tools/layer-properties-tools.js +2 -1
  85. package/dist/tools/layer-properties-tools.js.map +1 -1
  86. package/dist/tools/neural-tools.d.ts +8 -0
  87. package/dist/tools/neural-tools.d.ts.map +1 -0
  88. package/dist/tools/neural-tools.js +99 -0
  89. package/dist/tools/neural-tools.js.map +1 -0
  90. package/dist/tools/recipes/_shared.d.ts +8 -0
  91. package/dist/tools/recipes/_shared.d.ts.map +1 -1
  92. package/dist/tools/recipes/_shared.js +45 -0
  93. package/dist/tools/recipes/_shared.js.map +1 -1
  94. package/dist/tools/recipes/batch-watermark.d.ts +4 -0
  95. package/dist/tools/recipes/batch-watermark.d.ts.map +1 -0
  96. package/dist/tools/recipes/batch-watermark.js +283 -0
  97. package/dist/tools/recipes/batch-watermark.js.map +1 -0
  98. package/dist/tools/recipes/enhance-portrait.d.ts.map +1 -1
  99. package/dist/tools/recipes/enhance-portrait.js +47 -0
  100. package/dist/tools/recipes/enhance-portrait.js.map +1 -1
  101. package/dist/tools/recipes/index.d.ts +1 -1
  102. package/dist/tools/recipes/index.d.ts.map +1 -1
  103. package/dist/tools/recipes/index.js +9 -0
  104. package/dist/tools/recipes/index.js.map +1 -1
  105. package/dist/tools/recipes/passport-photo.d.ts +4 -0
  106. package/dist/tools/recipes/passport-photo.d.ts.map +1 -0
  107. package/dist/tools/recipes/passport-photo.js +202 -0
  108. package/dist/tools/recipes/passport-photo.js.map +1 -0
  109. package/dist/tools/recipes/remove-background.d.ts.map +1 -1
  110. package/dist/tools/recipes/remove-background.js +5 -0
  111. package/dist/tools/recipes/remove-background.js.map +1 -1
  112. package/dist/tools/recipes/remove-distraction.d.ts.map +1 -1
  113. package/dist/tools/recipes/remove-distraction.js +48 -8
  114. package/dist/tools/recipes/remove-distraction.js.map +1 -1
  115. package/dist/tools/recipes/sky-blend.d.ts.map +1 -1
  116. package/dist/tools/recipes/sky-blend.js +43 -1
  117. package/dist/tools/recipes/sky-blend.js.map +1 -1
  118. package/dist/tools/recipes/split-carousel.d.ts +4 -0
  119. package/dist/tools/recipes/split-carousel.d.ts.map +1 -0
  120. package/dist/tools/recipes/split-carousel.js +163 -0
  121. package/dist/tools/recipes/split-carousel.js.map +1 -0
  122. package/dist/tools/state-tools.js +2 -2
  123. package/dist/tools/state-tools.js.map +1 -1
  124. package/dist/ui/cli.js +7 -1
  125. package/dist/ui/cli.js.map +1 -1
  126. package/dist/ui/providers/anthropic.d.ts.map +1 -1
  127. package/dist/ui/providers/anthropic.js +11 -1
  128. package/dist/ui/providers/anthropic.js.map +1 -1
  129. package/dist/ui/providers/types.d.ts +1 -0
  130. package/dist/ui/providers/types.d.ts.map +1 -1
  131. package/dist/ui/security/session-token.d.ts +24 -0
  132. package/dist/ui/security/session-token.d.ts.map +1 -0
  133. package/dist/ui/security/session-token.js +72 -0
  134. package/dist/ui/security/session-token.js.map +1 -0
  135. package/dist/ui/server.d.ts +4 -0
  136. package/dist/ui/server.d.ts.map +1 -1
  137. package/dist/ui/server.js +79 -11
  138. package/dist/ui/server.js.map +1 -1
  139. package/dist/utils/js-string.d.ts.map +1 -1
  140. package/dist/utils/js-string.js +6 -1
  141. package/dist/utils/js-string.js.map +1 -1
  142. package/package.json +8 -4
  143. package/uxp-plugin/index.html +20 -0
  144. package/uxp-plugin/main.js +139 -0
  145. package/uxp-plugin/manifest.json +26 -0
  146. package/web/dist/assets/index-SNfxhJjr.js +350 -0
  147. package/web/dist/assets/index-vi5C3hqd.css +1 -0
  148. package/web/dist/index.html +2 -2
  149. package/dist/analytics/client-ip.d.ts +0 -5
  150. package/dist/analytics/client-ip.d.ts.map +0 -1
  151. package/dist/analytics/client-ip.js +0 -39
  152. package/dist/analytics/client-ip.js.map +0 -1
  153. package/dist/analytics/debug-log.d.ts +0 -3
  154. package/dist/analytics/debug-log.d.ts.map +0 -1
  155. package/dist/analytics/debug-log.js +0 -21
  156. package/dist/analytics/debug-log.js.map +0 -1
  157. package/dist/prompts/templates.d.ts +0 -8
  158. package/dist/prompts/templates.d.ts.map +0 -1
  159. package/dist/prompts/templates.js +0 -162
  160. package/dist/prompts/templates.js.map +0 -1
  161. package/dist/tools/recipe-tools.d.ts +0 -4
  162. package/dist/tools/recipe-tools.d.ts.map +0 -1
  163. package/dist/tools/recipe-tools.js +0 -265
  164. package/dist/tools/recipe-tools.js.map +0 -1
  165. package/web/dist/assets/index-BgiXf1Jy.css +0 -1
  166. package/web/dist/assets/index-DvGX0LLy.js +0 -346
@@ -0,0 +1,727 @@
1
+ # Photoshop MCP Server
2
+
3
+ <p align="center">
4
+ <a href="https://github.com/alisaitteke/photoshop-mcp">
5
+ <img src="./images/readme-hero.png" alt="Photoshop MCP — AI 驱动的 Photoshop 自动化" width="100%" />
6
+ </a>
7
+ </p>
8
+
9
+ **语言:** [English](README.md) · 简体中文 · [Español](README.es.md) · [Deutsch](README.de.md) · [日本語](README.ja.md) · [Türkçe](README.tr.md)
10
+
11
+ *v1.1+ — 配方工作流、更少的往返调用、更流畅的会话。独立 UI 附带 **Action Plan(测试版)**,支持先规划后执行的运行模式。*
12
+
13
+ > **注意:** 这是一个非官方的社区维护项目,与 Adobe Inc. 无任何关联,亦未获其背书。
14
+
15
+ [![npm version](https://img.shields.io/npm/v/@alisaitteke/photoshop-mcp.svg)](https://www.npmjs.com/package/@alisaitteke/photoshop-mcp)
16
+ [![GitHub release](https://img.shields.io/github/v/release/alisaitteke/photoshop-mcp?include_prereleases)](https://github.com/alisaitteke/photoshop-mcp/releases)
17
+ [![Action Plan](https://img.shields.io/badge/Action%20Plan-beta-amber.svg)](#action-plan-beta)
18
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
19
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue.svg)](https://www.typescriptlang.org/)
20
+ [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS-lightgrey.svg)]()
21
+
22
+ 一个模型上下文协议(MCP)服务器,使 Claude 和 Cursor 等 AI 助手能够以编程方式控制 Adobe Photoshop。通过这个工具,您可以在 IDE 中使用自然语言命令创建设计、处理图像并自动化 Photoshop 工作流——或者通过捆绑的**独立 Web UI** 进行操作,后者同时支持 API 密钥和 CLI 订阅账户(Claude Code / Gemini CLI)。该 UI 还提供可选的 **Action Plan(测试版)** 模式,可在一次 LLM 调用中规划所有 Photoshop 步骤,然后一次性执行。
23
+
24
+ ## 为何创建此项目
25
+
26
+ 设计师和开发者希望通过 AI 助手驱动 Photoshop,但原始的 ExtendScript 调用十分脆弱:代理会在试错过程中浪费大量 token,图层类型会破坏滤镜,一个失败的命令便会让文档陷入未知状态。
27
+
28
+ Photoshop MCP 添加了**状态感知**(`get_state`、`get_preview`、`get_capabilities`)、**配方工具**(将多步骤操作包装为单一撤销步骤),以及**结构化错误信封**,让代理知道下一步应该尝试什么。可选的独立 UI 和 Action Plan 模式可减少较长工作流中的往返次数——让自然语言真正能够产出像素,而不仅仅是给出建议。
29
+
30
+ 工程深度解析:[`docs/architecture.md`](docs/architecture.md)。
31
+
32
+ ## 🖥️ 独立 UI(无需 IDE)
33
+
34
+ 不想将其接入 Claude Desktop 或 Cursor?同一个软件包附带了一个完全本地化的 Web UI,让您可以与 AI 模型聊天,并通过底层的 MCP 服务器驱动 Photoshop。使用提供商 API 密钥进行连接,**或者**对于 Anthropic 和 Google,复用 **Claude Code** 或 **Gemini CLI** 的 OAuth 会话——无需单独的 API 密钥。
35
+
36
+ ![独立 UI 截图](./images/frame_generic_light.png)
37
+
38
+ ```bash
39
+ npx -p @alisaitteke/photoshop-mcp photoshop-mcp-ui
40
+ ```
41
+
42
+ 就这样。本地服务器在 `127.0.0.1`(随机空闲端口)上启动,您的默认浏览器会自动打开聊天 UI。
43
+
44
+ ### 支持的提供商
45
+
46
+ 首次启动时选择以下任意一个——使用 API 密钥**或**您现有的 CLI 订阅账户(Anthropic 和 Google):
47
+
48
+ | 提供商 | 模型 | API 密钥 | CLI 账户 |
49
+ |---|---|---|---|
50
+ | **Anthropic** | Claude Sonnet / Opus / Haiku | [console.anthropic.com](https://console.anthropic.com/settings/keys) | `npm i -g @anthropic-ai/claude-code` → `claude auth login` |
51
+ | **OpenAI** | GPT-5, GPT-4.1, o-series | [platform.openai.com](https://platform.openai.com/api-keys) | — |
52
+ | **Google** | Gemini 2.5 Pro / Flash / Flash-Lite | [aistudio.google.com](https://aistudio.google.com/apikey) | `npm i -g @google/gemini-cli` → `gemini auth login` |
53
+ | **OpenRouter** | 100+ 来自任意提供商的模型 | [openrouter.ai](https://openrouter.ai/keys) | — |
54
+
55
+ ### 认证模式
56
+
57
+ - **`api_key`(默认)** — 使用 Vercel AI SDK 和您的提供商 API 密钥。按 API 费率按 token 计费;UI 显示每次聊天的预估费用。
58
+ - **`cli_account`** — 使用您本地的 Claude Code 或 Gemini CLI OAuth 会话。不存储 API 密钥;UI 通过无头模式的 `claude auth status` / `gemini` 探测验证登录状态。使用量计入您的**订阅配额**,而非 API 账单——状态栏显示"订阅已包含"。
59
+
60
+ 您可以在"设置"中按提供商切换认证方式,不会丢失另一种凭据(例如,保留 API 密钥的同时尝试 CLI 账户,之后再切换回来)。
61
+
62
+ ### Action Plan(测试版)
63
+
64
+ 独立 Web UI 中的可选执行模式,**仅适用于 API 密钥认证**(`cli_account` 始终使用默认的代理流程)。在 composer 中的模型选择器旁边,通过 **Action Plan** 开关开启。
65
+
66
+ 与逐步 ReAct 循环(模型 → 工具 → 模型 → 工具……)不同,Action Plan:
67
+
68
+ 1. 发起**一次** LLM 规划调用,输出包含参数的 Photoshop MCP 工具调用有序待办清单。
69
+ 2. **直接**按顺序执行这些工具——步骤之间无额外的模型往返。
70
+ 3. 若某步骤失败或存在未解决的依赖项,运行有界**修复**循环(仅重新规划剩余步骤,最多 3 次)。
71
+
72
+ 计划以实时待办清单的形式显示在工具调用卡片上方,附带每步状态(`pending` → `running` → `done` / `error`)。计划会持久化到聊天历史中,重载后不会丢失。开关默认关闭;禁用 Action Plan 时,现有的代理流程不受影响。
73
+
74
+ 适合多步骤提示词,例如*"移除背景并导出为 Web 格式"*——可减少模型调用次数,加快端到端执行速度。
75
+
76
+ ### 首次启动时的流程
77
+
78
+ 1. 选择提供商,选择 **API 密钥**或 **Uses your account**。
79
+ 2. 验证密钥或检查 CLI 连接。配置以 `~/.photoshop-mcp/data.db`(SQLite,`chmod 600`)的形式存储在本地。API 密钥永远不会离开您的设备;CLI 模式继承来自 `~/.claude/` 或 `~/.gemini/` 的 OAuth 凭据。
80
+ 3. 输入自然语言提示词。UI 实时流式传输模型回复,实时执行 Photoshop 工具调用,并将每次工具调用渲染为可检查的卡片(输入 + 结果)。
81
+ 4. 随时从设置/模型选择器切换提供商、认证方式或模型——聊天记录、费用和工具历史会跨会话持久化。
82
+
83
+ ### 后续切换认证方式
84
+
85
+ 随时从侧边栏打开**设置**:
86
+
87
+ | 操作 | API 密钥模式 | CLI 账户模式 |
88
+ |---|---|---|
89
+ | 设置 | 粘贴密钥 → **保存** | 安装 CLI → `auth login` → **检查连接** |
90
+ | 切换 | 选择 **API 密钥** — 已存储的密钥保留 | 选择 **Uses your account** — 密钥不会被删除 |
91
+ | 自定义二进制路径 | — | 若 `claude` / `gemini` 不在 `PATH` 上,可填写可选的 **CLI 路径** |
92
+ | 费用显示 | 状态栏中的按 token 预估 | **订阅已包含**徽章 |
93
+
94
+ 认证方式以每提供商为单位存储在 `~/.photoshop-mcp/data.db` 中(`authMethod`:`api_key` 或 `cli_account`)。不含 `authMethod` 的现有配置默认为 `api_key`,保持正常工作。
95
+
96
+ ### CLI 参数
97
+
98
+ ```
99
+ photoshop-mcp-ui [--port 5174] [--host 127.0.0.1] [--no-open]
100
+ ```
101
+
102
+ ### 本地 API 安全
103
+
104
+ UI 服务器保存着你的模型提供方 API 密钥,并且可以驱动 Photoshop,因此 `/api/*`
105
+ 并不对本机上运行的所有程序开放。每个请求都必须通过三项检查:
106
+
107
+ 1. **Host** — 必须是服务器端口上的回环地址(或你通过 `--host` 绑定的主机),
108
+ 用于阻止 DNS 重绑定攻击。
109
+ 2. **Origin** — 如果存在,必须与 UI 自身的来源一致,用于阻止浏览器发起的跨源
110
+ 调用。
111
+ 3. **会话令牌** — 每次启动生成的随机密钥,用于阻止其他本地进程;它们可以伪造
112
+ 任意请求头,却无法读取该令牌。
113
+
114
+ 浏览器无需处理令牌:服务器会将其注入所返回的 `index.html`。编写脚本时,请从
115
+ `~/.photoshop-mcp/ui-session.json`(chmod 600)读取令牌,并通过
116
+ `x-psmcp-token` 或 `Authorization: Bearer` 请求头发送;也可以在启动服务器前用
117
+ `PSMCP_UI_TOKEN` 指定自己的令牌。缺少有效令牌的请求会收到 `401 unauthorized`。
118
+
119
+ ### 注意事项
120
+
121
+ - 代理仅限于使用 Photoshop MCP 工具——内置的 shell、文件和网络工具已禁用。
122
+ - 技术栈:前端使用 Vue 3 + Tailwind v4 + [shadcn-vue](https://www.shadcn-vue.com/);后端使用 [Hono](https://hono.dev/)。API 密钥模式使用 [Vercel AI SDK](https://sdk.vercel.ai/);CLI 账户模式使用 [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/mcp)(Anthropic)或 Gemini CLI 无头 `stream-json`(Google)。所有路径均通过 STDIO 与同一个 Photoshop MCP 服务器通信。
123
+ - **CLI 账户限制:** Gemini 无头模式每次对话可能开启新会话(历史记录会预置到提示词中)。Anthropic CLI 账户消耗订阅配额。OAuth 登录以 macOS 优先(在终端中运行 `claude auth login` / `gemini auth login`)。
124
+
125
+ ---
126
+
127
+ ## Photoshop 的 AI/提示词层
128
+
129
+ 在原子化 `photoshop_*` 工具之上,服务器附带了一个有主见的 AI/提示词层,帮助宿主 LLM(Cursor、Claude Desktop 等)将模糊的用户请求转化为可靠的 Photoshop 操作:
130
+
131
+ - **服务器 `instructions`** — 在 MCP `initialize` 时广播的工作流契约(ping 一次、操作前获取状态、优先使用配方、错误恢复)。参见 [`src/prompts/instructions.ts`](src/prompts/instructions.ts)。
132
+ - **MCP `prompts` 原语** — 19 个预先设计的模板(12 个配方 + 7 个指南:`ps.enhance_portrait`、`ps.remove_background`、`ps.generative_fill`……),通过 `prompts/list` 和 `prompts/get` 获取。
133
+ - **配方工具** — 12 个面向结果的 `photoshop_recipe_*` 工具(移除背景、增强人像、准备网络发布、导出社交媒体变体、色彩分级、频率分离、批量样机替换、整理图层、渐变淡出、天空混合、减淡与加深、移除干扰物)。每个工具将步骤包装在单一 Photoshop 历史状态中(一次撤销可还原全部)。**共 86 个工具**(74 个原子工具 + 12 个配方工具)。
134
+ - **生成式 AI** — `photoshop_generative_fill`、`photoshop_generative_remove`、`photoshop_generative_expand`、`photoshop_generative_upscale`、`photoshop_sky_replacement`、`photoshop_generate_image`(通过 ExtendScript 调用 Firefly;需要 Adobe 账户和积分)。
135
+ - **Neural Filters** — 通过可选的 UXP 桥接插件(`uxp-plugin/`)使用 `photoshop_neural_filter`。
136
+ - **状态与预览** — `photoshop_get_state`(轻量快照)、`photoshop_get_preview`(用于视觉验证的 base64 JPEG)、`photoshop_get_capabilities`(版本感知功能标志)。
137
+ - **结构化错误** — 失败时返回包含 `code` 和 `suggested_next_tool` 的 JSON 信封,用于自我纠错。
138
+
139
+ 完整参考:[`docs/prompt-layer.md`](docs/prompt-layer.md)。
140
+
141
+ 验证一致性:`npm run verify:photoshop-prompts`。最新结果:[`docs/development.md#integration-test-results`](docs/development.md#integration-test-results)。
142
+
143
+ ## 示例提示词
144
+
145
+ 以下是您在配置此 MCP 服务器后可与 AI 助手(Claude、Cursor 等)一起使用的示例提示词。对于多步骤结果,优先使用**配方工具**(`photoshop_recipe_*`)——每个配方是单一撤销步骤。仅对配方未覆盖的精细编辑使用原子 `photoshop_*` 工具。
146
+
147
+ <details>
148
+ <summary>🧠 状态感知会话(推荐的第一步)</summary>
149
+
150
+ ```
151
+ 连接 Photoshop 并读取我当前安装版本的功能信息。
152
+ 在做任何更改之前,先获取当前文档状态。
153
+ 打开 portrait.jpg,获取缩小的预览图,以便确认主体对象。
154
+ 每执行完一个主要配方后,再次获取预览图以确认效果。
155
+ ```
156
+
157
+ </details>
158
+
159
+ <details>
160
+ <summary>👤 人像修饰(配方)</summary>
161
+
162
+ ```
163
+ 以中等强度对活动图层上的人像进行增强,并开启皮肤磨皮。
164
+ 使用 enhance-portrait recipe——我希望在一个可撤销的步骤内同时完成频率分离和自动色调调整。
165
+ 如果活动图层是文字或 Smart Object,请先栅格化,或选择一个栅格图层。
166
+ 完成后给我看一下预览效果。
167
+ ```
168
+
169
+ 等效 MCP 提示词模板:`ps.enhance_portrait`,参数为 `{ intensity: "medium", skin_smoothing: "true" }`。
170
+
171
+ </details>
172
+
173
+ <details>
174
+ <summary>✂️ 背景移除(配方)</summary>
175
+
176
+ ```
177
+ 移除活动人像图层的背景。
178
+ 使用 Select Subject 配合 2px 羽化的图层蒙版,保留蒙版后面的原始像素。
179
+ 如果 brief 要求纯白底,填充 RGB(255,255,255),主体居中并占画面至少 70%。
180
+ 主体必须在活动图层上——不能是纯色填充图层。
181
+ ```
182
+
183
+ 等效 MCP 提示词模板:`ps.remove_background`,参数为 `{ feather_px: "2", keep_shadow: "false" }`。
184
+
185
+ </details>
186
+
187
+ <details>
188
+ <summary>🎨 色彩分级(配方)</summary>
189
+
190
+ ```
191
+ 以非破坏性调整图层的方式,对打开的文档应用暖色电影色调分级。
192
+ 使用 apply-color-grade recipe,预设选择 warm_film。
193
+ 完成后预览效果。
194
+ ```
195
+
196
+ </details>
197
+
198
+ <details>
199
+ <summary>🔬 频率分离设置(配方)</summary>
200
+
201
+ ```
202
+ 在活动栅格图层上设置频率分离,模糊半径为 6px。
203
+ 我会自己在低频层和高频层上绘制——不要额外添加磨皮处理。
204
+ 图层堆栈准备好后,告诉我应该编辑哪些图层。
205
+ ```
206
+
207
+ 等效 MCP 提示词模板:`ps.frequency_separation`,参数为 `{ radius_px: "6" }`。
208
+
209
+ </details>
210
+
211
+ <details>
212
+ <summary>🌐 网络准备 + 社交媒体导出(配方)</summary>
213
+
214
+ ```
215
+ 将活动文档准备好用于网络发布:转换为 sRGB,缩小尺寸,锐化,并将一张优化后的 JPEG 导出到 ~/.photoshop-mcp/exports。
216
+ 然后从同一文档导出 Instagram 帖子(1080×1080)、竖版 Feed(1080×1350)、Stories/Reels(1080×1920)和 X 帖子(1200×675)变体。
217
+ 将输出路径以表格形式列出。
218
+ ```
219
+
220
+ 等效模板:`ps.prepare_for_web`、`ps.export_social_variants`。
221
+
222
+ </details>
223
+
224
+ <details>
225
+ <summary>📦 批量样机替换(配方)</summary>
226
+
227
+ ```
228
+ 我有一个样机 PSD 文件已打开,其中有一个名为"Screen"的 Smart Object 图层。
229
+ 将其替换为 ~/assets/mockups/ 中的每个 PNG/JPG 文件,并为每个素材导出一张 JPEG。
230
+ 不要放置普通图层——替换 Smart Object 以保留透视效果。
231
+ ```
232
+
233
+ 等效 MCP 提示词模板:`ps.batch_mockup_replace`。
234
+
235
+ </details>
236
+
237
+ <details>
238
+ <summary>🗂️ 整理图层(配方)</summary>
239
+
240
+ ```
241
+ 整理图层堆栈:按类型重命名,自动将相关图层分组,保留原始内容。
242
+ 执行 organize-layers recipe,然后列出图层,以便我查看新的结构。
243
+ ```
244
+
245
+ </details>
246
+
247
+ <details>
248
+ <summary>🎨 基础设计创建</summary>
249
+
250
+ ```
251
+ 创建一个 1920x1080 的 Photoshop 文档,使用 RGB 颜色模式。
252
+ 添加一个浅蓝色背景图层,填充 RGB(240, 248, 255)。
253
+ 添加居中文字"Welcome",字号 64pt。
254
+ 保存为 welcome.psd 到桌面。
255
+ ```
256
+
257
+ </details>
258
+
259
+ <details>
260
+ <summary>🖼️ 素材图片设计(配合 Pexels MCP)</summary>
261
+
262
+ ```
263
+ 在 Pexels 上搜索"mountain sunset"图片。
264
+ 创建一个 1920x1080 的 Photoshop 文档。
265
+ 将下载的图片放置进来,并适配填满整个画布。
266
+ 应用 3px 的轻微高斯模糊。
267
+ 增加亮度 15,对比度 10。
268
+ 在顶部居中添加白色文字"Adventure Awaits",字号 72pt。
269
+ 将文字不透明度设为 90%,混合模式设为 OVERLAY。
270
+ 保存为 adventure.jpg,质量 10。
271
+ ```
272
+
273
+ </details>
274
+
275
+ <details>
276
+ <summary>✨ 照片增强</summary>
277
+
278
+ ```
279
+ 在 Photoshop 中打开桌面上的 photo.jpg。
280
+ 获取状态,然后以低强度运行 enhance-portrait recipe。
281
+ 如果只需要快速调整色调,改为对活动图层应用自动色阶、自动对比度和 USM 锐化(120%, 1.5, 0)。
282
+ 调整色相 +15、饱和度 +15,或在准备好导出时使用 prepare-for-web。
283
+ 保存为 enhanced-photo.jpg,质量 12。
284
+ ```
285
+
286
+ </details>
287
+
288
+ <details>
289
+ <summary>🎭 图层效果与混合</summary>
290
+
291
+ ```
292
+ 创建一个 1200x800 的文档。
293
+ 添加一个名为"Background"的新图层,填充 RGB(50, 50, 50)。
294
+ 将 logo.png 放置在 (100, 100) 位置。
295
+ 将 logo 图层缩放至当前尺寸的 50%。
296
+ 将混合模式设为 SCREEN,不透明度设为 85%。
297
+ 再添加一个图层,填充 RGB(255, 100, 50)。
298
+ 将该图层的混合模式设为 MULTIPLY,不透明度设为 60%。
299
+ 合并所有可见图层。
300
+ 保存为 composite.psd。
301
+ ```
302
+
303
+ </details>
304
+
305
+ <details>
306
+ <summary>📝 文字海报设计</summary>
307
+
308
+ ```
309
+ 创建一个 1080x1350 的竖版文档(Instagram 故事尺寸)。
310
+ 添加一个图层,填充渐变感颜色 RGB(120, 40, 200)。
311
+ 在 (540, 300) 处添加文字"SUMMER",字号 96pt。
312
+ 将文字颜色更改为白色 RGB(255, 255, 255)。
313
+ 将文字对齐方式设为 CENTER。
314
+ 在 (540, 450) 处再添加文字"2026",字号 128pt,白色。
315
+ 对背景图层应用 2px 高斯模糊。
316
+ 保存为 summer-poster.png。
317
+ ```
318
+
319
+ </details>
320
+
321
+ <details>
322
+ <summary>🎬 批处理</summary>
323
+
324
+ ```
325
+ 打开 image1.jpg。
326
+ 调整尺寸为 1920x1080。
327
+ 应用自动对比度。
328
+ 应用轻微锐化(强度 80%,半径 1.0)。
329
+ 保存为 processed-1.jpg,质量 10。
330
+ 关闭文件,不保存对原文件的修改。
331
+
332
+ 对 image2.jpg 和 image3.jpg 重复以上步骤。
333
+ ```
334
+
335
+ </details>
336
+
337
+ <details>
338
+ <summary>🖌️ 创意操控</summary>
339
+
340
+ ```
341
+ 创建一个 2000x2000 的正方形文档。
342
+ 放入 abstract-pattern.jpg 并适配填满文档。
343
+ 复制该图层。
344
+ 在副本图层上,应用 45 度方向、半径 50px 的动态模糊。
345
+ 将混合模式设为 OVERLAY,不透明度设为 70%。
346
+ 居中添加白色文字"MOTION",字号 120pt。
347
+ 创建从 (200, 200) 到 (1800, 1800) 的矩形选区。
348
+ 反选并删除(制造边框效果)。
349
+ 拼合图像。
350
+ 保存为 motion-art.jpg。
351
+ ```
352
+
353
+ </details>
354
+
355
+ <details>
356
+ <summary>🎯 高级工作流</summary>
357
+
358
+ ```
359
+ 创建一个用于印刷的 3000x2000、300 DPI 文档。
360
+ 放入 hero-image.jpg 并适配填满画布。
361
+ 复制图像图层。
362
+ 在副本图层上,将其完全去饱和。
363
+ 将混合模式设为 LUMINOSITY,不透明度设为 50%。
364
+ 创建一个名为"Overlay"的新图层。
365
+ 填充 RGB(255, 150, 0),将混合模式设为 SOFTLIGHT,不透明度 30%。
366
+ 在顶部居中 (1500, 200) 处添加文字"PORTFOLIO",字号 96pt。
367
+ 将文字颜色设为白色。
368
+ 在 (1500, 320) 处添加副标题"2026 Collection",字号 36pt。
369
+ 在文字区域周围创建矩形选区。
370
+ 在叠加图层上创建图层蒙版。
371
+ 合并可见图层。
372
+ 保存为 portfolio-cover.psd。
373
+ 导出为 portfolio-cover.jpg,质量 12。
374
+ ```
375
+
376
+ </details>
377
+
378
+ <details>
379
+ <summary>🔄 使用动作</summary>
380
+
381
+ ```
382
+ 打开 my-photo.jpg。
383
+ 播放"My Actions"动作组中的"Vintage Look"动作。
384
+ 将亮度调低 -10,使其略微变暗。
385
+ 保存为 vintage-photo.jpg。
386
+ ```
387
+
388
+ </details>
389
+
390
+ <details>
391
+ <summary>⚡ 自定义脚本执行</summary>
392
+
393
+ ```
394
+ 执行以下自定义 ExtendScript 代码:
395
+ app.beep();
396
+ alert('Processing started!');
397
+ ```
398
+
399
+ </details>
400
+
401
+ <details>
402
+ <summary>⏮️ 撤销/重做操作</summary>
403
+
404
+ ```
405
+ 对活动图层应用 15px 的高斯模糊。
406
+ [等待结果]
407
+ 这个模糊效果太强了,撤销这步操作。
408
+ 改为应用 5px 的高斯模糊。
409
+ ```
410
+
411
+ 或:
412
+
413
+ ```
414
+ 获取历史状态,查看已执行了哪些操作。
415
+ 撤销最后 3 步操作。
416
+ 重做 1 步,恢复其中一个操作。
417
+ ```
418
+
419
+ </details>
420
+
421
+ <details>
422
+ <summary>🔁 错误恢复(结构化信封)</summary>
423
+
424
+ ```
425
+ 如果某个配方返回 version_unsupported 或 generative_unavailable,调用 get_capabilities 并告诉我缺少哪个 Photoshop 功能。
426
+ 如果某个工具失败并返回 suggested_next_tool,按照提示操作(例如,在执行仅限栅格的配方之前先执行 rasterize_layer)。
427
+ 不要猜测——在失败后读取 get_state,然后提出下一个单一操作步骤。
428
+ ```
429
+
430
+ </details>
431
+
432
+ <details>
433
+ <summary>📱 社交媒体格式套件</summary>
434
+
435
+ ```
436
+ 我有一张 1:1 主视觉(2000×2000 px)已打开。
437
+ 用 prepare-for-web recipe 将活动文档准备好用于网络发布:转换为 sRGB,裁剪并导出变体。
438
+ 然后导出 Instagram Feed(1080×1350)、Stories/Reels(1080×1920,上下安全区)、LinkedIn(1200×628)和横版横幅(1200×628)变体。
439
+ 仅在 9:16 格式会裁切主体时使用生成式扩展。
440
+ 主体至少占画面 60%;logo 在右上角留 20 px 边距。
441
+ 以表格形式列出所有输出路径。
442
+ ```
443
+
444
+ 等效模板:`ps.prepare_for_web`、`ps.export_social_variants`。
445
+
446
+ </details>
447
+
448
+ <details>
449
+ <summary>🖨️ 印刷完稿(CMYK / 出血)</summary>
450
+
451
+ ```
452
+ 将活动文档准备好用于胶印:
453
+ 转换为 CMYK,使用 ISO Coated v2 配置文件,四边添加 3 mm 出血,检查最终尺寸 300 dpi 分辨率。
454
+ 为印刷配置文件设置软打样,并提示色域外颜色。
455
+ 大面积深黑使用 C50 M20 Y20 K100;黑色文字仅用 K100。
456
+ 导出带嵌入配置文件的 PDF/X-4,关闭前显示预览。
457
+ ```
458
+
459
+ </details>
460
+
461
+ <details>
462
+ <summary>🛍️ 生成式填充产品场景</summary>
463
+
464
+ ```
465
+ 活动图层上有一张已抠图的产品 PNG。
466
+ 用 photoshop_generative_fill 创建三个不同场景:暖光室内、日落户外、带水珠的反射表面。
467
+ 每个变体用 photoshop_generative_expand 扩展到 1080×1350(4:5),保持产品居中。
468
+ 每个场景完成后获取预览,检查阴影和透视。
469
+ 如果 generative_unavailable,调用 get_capabilities 并说明缺少什么。
470
+ ```
471
+
472
+ </details>
473
+
474
+ <details>
475
+ <summary>🎨 统一色彩分级</summary>
476
+
477
+ ```
478
+ 同一项目有 30 张照片,光线各不相同。
479
+ 用 apply-color-grade recipe 和 warm_film 预设,以非破坏性调整图层应用色彩分级。
480
+ 如有需要,调整曲线和色相/饱和度,营造温暖电影感:冷色阴影、金色高光。
481
+ 准备一个动作,将每张图以 1080 px 宽、sRGB、JPEG 质量 85 导出到 ~/.photoshop-mcp/exports/grade/。
482
+ 在三张代表性图片上显示前后对比预览。
483
+ ```
484
+
485
+ 等效 MCP 提示词模板:`ps.apply_color_grade`,参数为 `{ preset: "warm_film" }`。
486
+
487
+ </details>
488
+
489
+ <details>
490
+ <summary>🏢 批量品牌样机</summary>
491
+
492
+ ```
493
+ 我打开了一个样机 PSD,包含名片、A4 文档、包装和社交资料 Smart Object。
494
+ 用 ~/assets/brand/ 中的素材替换每个 Smart Object,不要拼合图层——保留透视和阴影。
495
+ 运行 batch_mockup_replace recipe,每个变体导出一张 JPEG 到 ~/.photoshop-mcp/exports/mockups/。
496
+ 以表格形式列出所有输出路径。
497
+ ```
498
+
499
+ 等效模板:`ps.batch_mockup_replace`。
500
+
501
+ </details>
502
+
503
+ <details>
504
+ <summary>🏷️ 从主文件导出多版本</summary>
505
+
506
+ ```
507
+ 我有一张 1:1 主创意和 ~/assets/logos/ 中的多个 logo。
508
+ 每个变体从同一 PSD 导出 Story 9:16、Feed 4:5 和横幅 1200×628,用 Smart Object 放置 logo 和文字。
509
+ 文件命名为 变体_格式.jpg,全部保存到 ~/.photoshop-mcp/exports/variants/。
510
+ 如果某步失败,读取 get_state 并只建议下一步。
511
+ 完成后用表格列出所有路径。
512
+ ```
513
+
514
+ </details>
515
+
516
+ ## 功能特性
517
+
518
+ - **独立 Web UI** — 本地聊天界面(`photoshop-mcp-ui`);每个提供商支持 API 密钥或 CLI 订阅认证(Anthropic、Google)
519
+ - **Action Plan(测试版)** — Web UI 中可选的先规划后执行模式(仅 API 密钥):一次规划调用、直接工具执行、失败时有界修复
520
+ - **同时支持 Windows 和 macOS**
521
+ - **支持 Photoshop 2012-2025+**
522
+ - **ExtendScript API**:通过 AppleScript/COM 自动化实现通用兼容性
523
+ - **自动检测**:自动在系统上找到 Photoshop 安装路径
524
+ - **78 个工具**:66 个原子 `photoshop_*` + 12 个配方 `photoshop_recipe_*`
525
+ - **AI/提示词层**:16 个 MCP 提示词模板(12 个配方 + 4 个指南)、服务器指令、状态/预览/能力工具
526
+ - **文档管理**:创建、打开、保存、关闭、裁剪文档
527
+ - **图层操作**:创建、删除、复制、合并、变换图层
528
+ - **图层属性**:不透明度、混合模式、可见性、锁定
529
+ - **文字格式化**:字体、大小、颜色、对齐控制
530
+ - **图片放置**:放置图片、打开文件、适应文档
531
+ - **滤镜**:高斯模糊、锐化、噪点、动态模糊
532
+ - **色彩调整**:亮度/对比度、色相/饱和度、曲线、自动色阶/对比度
533
+ - **选区与蒙版**:矩形选区、选择主体、内容感知填充、渐变蒙版、图层蒙版
534
+ - **历史控制**:撤销/重做操作、查看历史状态
535
+ - **动作**:播放录制的动作、执行自定义脚本
536
+ - **自动栅格化**:在需要时自动转换图层以用于滤镜
537
+ - **上下文追踪**:每次操作后返回文档/图层状态,以便 AI 保持上下文感知
538
+
539
+ ## 安装
540
+
541
+ ### 使用 NPX(推荐)
542
+
543
+ 无需安装!只需配置您的 MCP 客户端:
544
+
545
+ ```bash
546
+ npx @alisaitteke/photoshop-mcp
547
+ ```
548
+
549
+ 如需在本地对仓库进行开发,请参阅开发指南中的[从源码安装](docs/development.md#from-source)。
550
+
551
+ ## 配置
552
+
553
+ ### 适用于 Cursor
554
+
555
+ 在您的 Cursor 设置(`.cursor/config.json` 或工作区设置)中添加:
556
+
557
+ ```json
558
+ {
559
+ "mcpServers": {
560
+ "photoshop": {
561
+ "command": "npx",
562
+ "args": ["-y", "@alisaitteke/photoshop-mcp"],
563
+ "env": {
564
+ "LOG_LEVEL": "1"
565
+ }
566
+ }
567
+ }
568
+ }
569
+ ```
570
+
571
+ ### 适用于 Claude Desktop
572
+
573
+ 在您的 Claude Desktop 配置(macOS 上为 `~/Library/Application Support/Claude/claude_desktop_config.json`,Windows 上为 `%APPDATA%\Claude\claude_desktop_config.json`)中添加:
574
+
575
+ ```json
576
+ {
577
+ "mcpServers": {
578
+ "photoshop": {
579
+ "command": "npx",
580
+ "args": ["-y", "@alisaitteke/photoshop-mcp"],
581
+ "env": {
582
+ "LOG_LEVEL": "1"
583
+ }
584
+ }
585
+ }
586
+ }
587
+ ```
588
+
589
+ ### 环境变量
590
+
591
+ - `PHOTOSHOP_PATH`:(可选)指定自定义 Photoshop 安装路径
592
+ - `LOG_LEVEL`:日志级别(0=DEBUG,1=INFO,2=WARN,3=ERROR)
593
+ - `ANALYTICS_DISABLED`:设置为 `1` 或 `true` 可完全禁用匿名使用分析
594
+ - `POSTHOG_DISABLED`:`ANALYTICS_DISABLED` 的旧版别名
595
+ - `ANALYTICS_PROVIDER`:分析后端 — `mixpanel`(默认)或 `posthog`(回滚)
596
+ - `MIXPANEL_TOKEN`:(可选)覆盖 Mixpanel 项目令牌
597
+ - `MIXPANEL_API_HOST`:(可选)Mixpanel 数据采集主机(默认:`https://api-eu.mixpanel.com`)
598
+ - `POSTHOG_KEY`:(可选,旧版)PostHog 项目密钥 — 仅在 `ANALYTICS_PROVIDER=posthog` 时使用
599
+ - `POSTHOG_API_HOST`:(可选,旧版)PostHog 数据采集主机(默认:`https://a.alisait.com`)
600
+ - `POSTHOG_UI_HOST`:(可选,旧版)PostHog UI 主机(默认:`https://eu.posthog.com`)
601
+
602
+ ## 可用工具
603
+
604
+ 所有原子 `photoshop_*` 工具的完整参考(参数、示例和用法):[`docs/available-tools.md`](docs/available-tools.md)。
605
+
606
+
607
+ ## 上下文追踪
608
+
609
+ 每个工具都会返回关于 Photoshop 当前状态的全面上下文信息,包括:
610
+
611
+ - **文档信息**:名称、尺寸、分辨率、色彩模式、图层数量
612
+ - **活动图层信息**:名称、类型、不透明度、混合模式、可见性、锁定状态
613
+ - **选区状态**:是否有活动选区
614
+ - **操作结果**:关于所做更改的具体详情
615
+
616
+ 这使 AI 助手能够保持对以下内容的感知:
617
+ - 当前活动文档
618
+ - 正在处理的图层
619
+ - 当前图层属性(不透明度、混合模式等)
620
+ - 文档尺寸与设置
621
+
622
+ **响应示例:**
623
+ ```javascript
624
+ {
625
+ "applied": true,
626
+ "filter": "Gaussian Blur",
627
+ "radius": 10,
628
+ "wasRasterized": true,
629
+ "context": {
630
+ "hasDocument": true,
631
+ "document": {
632
+ "name": "design.psd",
633
+ "width": 1920,
634
+ "height": 1080,
635
+ "resolution": 72,
636
+ "colorMode": "RGBColorMode",
637
+ "layerCount": 3,
638
+ "hasSelection": false
639
+ },
640
+ "activeLayer": {
641
+ "name": "Background",
642
+ "kind": "NORMAL",
643
+ "opacity": 100,
644
+ "blendMode": "NORMAL",
645
+ "visible": true,
646
+ "locked": false,
647
+ "isBackground": false
648
+ }
649
+ }
650
+ }
651
+ ```
652
+
653
+ 此上下文帮助 AI 助手在多条命令中记住正在处理的文档和图层。
654
+
655
+ ---
656
+
657
+ ## 平台特定说明
658
+
659
+ ### Windows
660
+
661
+ - 使用 COM 自动化与 Photoshop 通信
662
+ - 基于注册表的安装路径自动检测
663
+ - 支持 32 位和 64 位版本
664
+
665
+ ### macOS
666
+
667
+ - 使用 AppleScript/OSA 与 Photoshop 通信
668
+ - 基于 Spotlight 的自动检测
669
+ - 支持同时安装多个 Photoshop 版本
670
+ - **CLI 账户认证**(独立 UI)以 macOS 优先:在终端中运行 `claude auth login` / `gemini auth login`;凭据存储在 `~/.claude/` 和 `~/.gemini/` 下
671
+
672
+ ## 支持的 Photoshop 版本
673
+
674
+ - **所有 Photoshop 版本**(2012-2025+):通过 AppleScript(macOS)或 COM(Windows)使用 ExtendScript API
675
+
676
+ **重要说明**:虽然 Photoshop 2022+ 支持用于插件的 UXP,但通过 AppleScript/COM 的外部自动化只能使用 ExtendScript。UXP 专为内部插件设计,无法从外部脚本调用。因此,此 MCP 服务器使用 ExtendScript 以实现跨所有 Photoshop 版本的最大兼容性。
677
+
678
+ ## 故障排除
679
+
680
+ 常见的连接、脚本和日志问题:[`docs/troubleshooting.md`](docs/troubleshooting.md)。
681
+
682
+ ### 独立 UI — CLI 账户认证
683
+
684
+ | 症状 | 可能原因 | 修复方法 |
685
+ |---|---|---|
686
+ | `cli_not_found` | Claude Code / Gemini CLI 未安装 | `npm i -g @anthropic-ai/claude-code` 或 `npm i -g @google/gemini-cli` |
687
+ | `not_authenticated` | 无 OAuth 会话 | 在终端中运行 `claude auth login` 或 `gemini auth login` |
688
+ | `claude` / `gemini` 不在 `PATH` 上 | 自定义安装位置 | 设置 → **CLI 路径** → **检查连接** |
689
+ | 在 IDE 中聊天正常但 UI 中无法使用(CLI 模式) | OAuth 令牌仅限 CLI | 在 UI 中使用 **CLI 账户**;API 密钥和 CLI 会话是分开的 |
690
+ | Gemini 多轮对话感觉健忘 | 无头 CLI 每次对话可能开启新会话 | 已知限制;历史记录会预置到提示词中(MVP) |
691
+
692
+ ## 开发
693
+
694
+ 从源码设置、构建、lint、集成测试(含最新结果)和使用示例:[`docs/development.md`](docs/development.md)。
695
+
696
+ ## 架构
697
+
698
+ 系统设计、数据流、平台抽象和 UI 代理模式:[`docs/architecture.md`](docs/architecture.md)。
699
+
700
+ 在 LinkedIn 或社交媒体上分享?使用 [`images/og-social.png`](images/og-social.png) 和 [`docs/social-preview.md`](docs/social-preview.md) 进行 OG 设置和帖子文案。
701
+
702
+ ## 贡献
703
+
704
+ 欢迎贡献!开 PR 前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。
705
+
706
+ ## 关于维护者
707
+
708
+ **[Ali Sait Teke](https://alisait.com)** — 全栈工程师及 AI 时代软件架构师(Python、Go、Node.js、React、Next.js、Vue)。
709
+
710
+ 这个项目起源于一个实际问题:*如何在不依赖脆弱的一次性脚本的情况下,让 Photoshop 被 LLM 可靠地控制?* 它逐渐演变为一个拥有 80 个工具的 MCP 服务器、用于可靠多步骤工作流的配方/提示词层,以及一个无需 IDE 即可进行创意工作的本地 Web UI。
711
+
712
+ **此代码库展示了:** TypeScript 系统设计、MCP 协议集成、跨平台桌面自动化(macOS AppleScript / Windows COM)、代理循环的结构化错误恢复,以及一个以生产为导向的本地优先 UI(Vue 3 + Hono + SQLite)。
713
+
714
+ - [个人网站](https://alisait.com) · [GitHub](https://github.com/alisaitteke) · [LinkedIn](https://www.linkedin.com/in/alisait/)
715
+
716
+ ## 许可证
717
+
718
+ MIT
719
+
720
+ ## 匿名使用分析
721
+
722
+ 默认情况下会收集匿名的聚合使用事件,以改进产品。您可以随时选择退出。完整详情:[`docs/anonymous-usage-analytics.md`](docs/anonymous-usage-analytics.md)。
723
+
724
+ ## 致谢
725
+
726
+ - 基于 [Model Context Protocol SDK](https://github.com/modelcontextprotocol/sdk) 构建
727
+ - 受 Adobe Photoshop 脚本社区的启发