@engine-room/after-effects-mcp 0.5.1 → 0.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 (37) hide show
  1. package/README.md +126 -185
  2. package/bin/server.js +12567 -2478
  3. package/package.json +8 -8
  4. package/panel/CSXS/manifest.xml +44 -4
  5. package/panel/META-INF/signatures.xml +182 -0
  6. package/panel/client/csinterface.js +32 -0
  7. package/panel/client/main.js +522 -632
  8. package/panel/client/panelhash.js +79 -0
  9. package/panel/client/status.html +27 -0
  10. package/panel/client/status.js +112 -0
  11. package/panel/jsx/bundle.jsx +9032 -2393
  12. package/panel/mimetype +1 -0
  13. package/panel/node_modules/ws/LICENSE +20 -0
  14. package/panel/node_modules/ws/README.md +548 -0
  15. package/panel/node_modules/ws/browser.js +8 -0
  16. package/panel/node_modules/ws/index.js +22 -0
  17. package/panel/node_modules/ws/lib/buffer-util.js +131 -0
  18. package/panel/node_modules/ws/lib/constants.js +19 -0
  19. package/panel/node_modules/ws/lib/event-target.js +292 -0
  20. package/panel/node_modules/ws/lib/extension.js +203 -0
  21. package/panel/node_modules/ws/lib/limiter.js +55 -0
  22. package/panel/node_modules/ws/lib/permessage-deflate.js +530 -0
  23. package/panel/node_modules/ws/lib/receiver.js +743 -0
  24. package/panel/node_modules/ws/lib/sender.js +607 -0
  25. package/panel/node_modules/ws/lib/stream.js +161 -0
  26. package/panel/node_modules/ws/lib/subprotocol.js +62 -0
  27. package/panel/node_modules/ws/lib/validation.js +152 -0
  28. package/panel/node_modules/ws/lib/websocket-server.js +562 -0
  29. package/panel/node_modules/ws/lib/websocket.js +1421 -0
  30. package/panel/node_modules/ws/package.json +74 -0
  31. package/panel/node_modules/ws/wrapper.mjs +21 -0
  32. package/panel/package.json +2 -2
  33. package/panel/client/contactsheet.js +0 -347
  34. package/panel/client/framecache.js +0 -98
  35. package/panel/client/framereader.js +0 -248
  36. package/panel/client/mogrt.js +0 -328
  37. package/panel/client/pngcodec.js +0 -524
package/README.md CHANGED
@@ -6,24 +6,32 @@
6
6
 
7
7
  **Control Adobe After Effects with AI.**
8
8
 
9
- Describe the animation you want — a lower third, a logo reveal, an animated counter — and it gets built in your project: layers, keyframes, easing, effects, expressions and text. All of it editable afterwards, exactly like work you made by hand.
9
+ Describe the animation you want and it gets built in your project — layers, keyframes, easing, effects, expressions and text. All of it editable afterwards, exactly like work you made by hand.
10
10
 
11
11
  [![npm](https://img.shields.io/npm/v/@engine-room/after-effects-mcp?logo=npm&color=cb3837)](https://www.npmjs.com/package/@engine-room/after-effects-mcp)
12
12
  [![CI](https://github.com/Engine-Room-Games/after-effects-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Engine-Room-Games/after-effects-mcp/actions/workflows/ci.yml)
13
13
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/Engine-Room-Games/after-effects-mcp/blob/main/LICENSE)
14
- [![After Effects 2026](https://img.shields.io/badge/After%20Effects-2026-9999ff?logo=adobeaftereffects&logoColor=white)](https://www.adobe.com/products/aftereffects.html)
14
+ [![After Effects 2026 tested](https://img.shields.io/badge/After%20Effects-tested%20on%202026-9999ff?logo=adobeaftereffects&logoColor=white)](https://www.adobe.com/products/aftereffects.html)
15
15
  ![Platforms](https://img.shields.io/badge/platform-macOS%20%7C%20Windows-lightgrey)
16
- [![MCP](https://img.shields.io/badge/MCP-server-000000)](https://modelcontextprotocol.io)
17
-
18
- Works with **Claude**, **Cursor**, **VS Code**, **Codex**, **Windsurf** and any other MCP client.
16
+ [![Sponsor](https://img.shields.io/badge/sponsor-%E2%9D%A4-db61a2?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/migus88)
19
17
 
20
18
  </div>
21
19
 
22
- ---
20
+ ## What you can do with it
21
+
22
+ Talk to your AI assistant the way you'd brief a colleague:
23
+
24
+ > Build a lower third that says *Chapter One*, sliding in from the left.
25
+
26
+ > Make the logo pop in with a little overshoot, then hold for two seconds.
27
+
28
+ > Every layer in this comp should ease in 4 frames later than the one above it.
23
29
 
24
- ## ✨ What it builds
30
+ > Render the main comp into the renders folder.
25
31
 
26
- Six scenes from one quarterly-report sequence, each in a different visual style. Every layer, keyframe and effect below was built through these tools.
32
+ It reads your comp before it changes anything, makes the change as ordinary After Effects work — keyframes you can drag, effects you can dial in — and can take a screenshot to check its own result. It can also learn your house style, export Motion Graphics templates for Premiere, place sound cues, and render in the background.
33
+
34
+ Six scenes from one sequence, each in a different style — every layer, keyframe and effect built through these tools:
27
35
 
28
36
  <table>
29
37
  <tr>
@@ -58,33 +66,51 @@ Six scenes from one quarterly-report sequence, each in a different visual style.
58
66
  </tr>
59
67
  </table>
60
68
 
61
- ---
69
+ ## What you need
70
+
71
+ - **After Effects on macOS or Windows.** Tested on After Effects 2026. The panel accepts 2022 or later, but older versions haven't been tested yet.
72
+ - **An AI app that runs tools on your own computer.** The tools talk to After Effects directly on your machine, so they work in any app that can start an MCP server locally: **Claude Desktop, Claude Code, Cursor, VS Code, Codex, Windsurf** and the like.
62
73
 
63
- ## 🚀 Getting started
74
+ **Claude in a web browser (claude.ai) and ChatGPT — on the web or in its app — can't use them.** Those connect only to tools hosted on the internet, which have no way to reach the After Effects on your computer.
75
+
76
+ ## Getting started
64
77
 
65
78
  Three steps, and you only do the first two once.
66
79
 
67
- **You'll need:** After Effects 2026, on macOS or Windows.
80
+ ### 1. Install the tools
68
81
 
69
- ### 1️⃣ Install
82
+ Pick the one that matches your app.
70
83
 
71
- Pick the row that matches how you work, and open it for the steps.
84
+ **Claude Desktop** — the easy one. Download the `.mcpb` file from [the latest release](https://github.com/Engine-Room-Games/after-effects-mcp/releases/latest) and open it. Claude Desktop does the rest; there's nothing else to install.
72
85
 
73
86
  <details>
74
- <summary><b>🖥️ Claude Desktop</b> — one click, nothing else to install</summary>
87
+ <summary><b>Claude Code</b></summary>
75
88
 
76
89
  <br>
77
90
 
78
- Download [the latest `.mcpb` file](https://github.com/Engine-Room-Games/after-effects-mcp/releases/latest) and open it. Claude Desktop takes it from there — no terminal, nothing else to install.
91
+ Either install the plugin, which also adds skills and slash commands:
92
+
93
+ ```
94
+ /plugin marketplace add Engine-Room-Games/after-effects-mcp
95
+ /plugin install after-effects@engine-room
96
+ ```
97
+
98
+ or add just the server (needs Node 22 or later):
99
+
100
+ ```bash
101
+ claude mcp add --scope user after-effects -- npx -y @engine-room/after-effects-mcp
102
+ ```
103
+
104
+ `--scope user` makes it available in every folder you open Claude Code in, not only the current one.
79
105
 
80
106
  </details>
81
107
 
82
108
  <details>
83
- <summary><b>⚡ Cursor, VS Code, Claude Code, Codex, Windsurf</b> — if you have Node 22+</summary>
109
+ <summary><b>Cursor, Windsurf and other apps</b> (needs Node 22 or later)</summary>
84
110
 
85
111
  <br>
86
112
 
87
- Add this to your client's MCP configuration:
113
+ Add this to your app's MCP configuration, then restart the app. In Cursor that's `~/.cursor/mcp.json` (or `.cursor/mcp.json` inside one project); in Windsurf, open its MCP settings and add it there.
88
114
 
89
115
  ```json
90
116
  {
@@ -97,7 +123,14 @@ Add this to your client's MCP configuration:
97
123
  }
98
124
  ```
99
125
 
100
- VS Code uses a slightly different shape — put this in `.vscode/mcp.json`:
126
+ </details>
127
+
128
+ <details>
129
+ <summary><b>VS Code</b> (needs Node 22 or later)</summary>
130
+
131
+ <br>
132
+
133
+ Put this in `.vscode/mcp.json`, then restart VS Code:
101
134
 
102
135
  ```json
103
136
  {
@@ -111,179 +144,116 @@ VS Code uses a slightly different shape — put this in `.vscode/mcp.json`:
111
144
  }
112
145
  ```
113
146
 
114
- Restart your client afterwards.
115
-
116
147
  </details>
117
148
 
118
149
  <details>
119
- <summary><b>📦 Any client, without Node</b> — a standalone download</summary>
150
+ <summary><b>Codex</b> (needs Node 22 or later)</summary>
120
151
 
121
152
  <br>
122
153
 
123
- Download the build for your machine from [the latest release](https://github.com/Engine-Room-Games/after-effects-mcp/releases/latest), unzip it anywhere, and point your client at the executable inside:
154
+ Add this to `~/.codex/config.toml`:
124
155
 
125
- ```json
126
- {
127
- "mcpServers": {
128
- "after-effects": {
129
- "command": "/Users/you/Applications/after-effects-mcp/after-effects-mcp"
130
- }
131
- }
132
- }
156
+ ```toml
157
+ [mcp_servers.after-effects]
158
+ command = "npx"
159
+ args = ["-y", "@engine-room/after-effects-mcp"]
133
160
  ```
134
161
 
135
- Keep the unzipped folder together — the After Effects panel lives next to the executable.
136
-
137
- The macOS builds are signed and notarized. The Windows build is unsigned, so SmartScreen may warn the first time you run it.
138
-
139
162
  </details>
140
163
 
141
164
  <details>
142
- <summary><b>🔌 Claude Code plugin</b> — adds skills and slash commands</summary>
165
+ <summary><b>Any app, without Node</b> — a standalone download</summary>
143
166
 
144
167
  <br>
145
168
 
146
- This repository doubles as a plugin marketplace:
169
+ From [the latest release](https://github.com/Engine-Room-Games/after-effects-mcp/releases/latest), download the zip for your machine — `macos-arm64` (Apple silicon), `macos-x64` (Intel Mac) or `windows-x64` — unzip it anywhere, and point your app at the executable inside:
147
170
 
171
+ ```json
172
+ {
173
+ "mcpServers": {
174
+ "after-effects": {
175
+ "command": "/Users/you/Applications/after-effects-mcp-0.5.2-macos-arm64/after-effects-mcp"
176
+ }
177
+ }
178
+ }
148
179
  ```
149
- /plugin marketplace add Engine-Room-Games/after-effects-mcp
150
- /plugin install after-effects@engine-room
151
- ```
180
+
181
+ The unzipped folder is named `after-effects-mcp-<version>-<machine>`, so use the name yours actually has. On Windows the executable is `after-effects-mcp.exe`. Keep the unzipped folder together — the After Effects panel lives next to the executable. The macOS builds are signed and notarized; the Windows build is unsigned, so SmartScreen may warn the first time you run it.
152
182
 
153
183
  </details>
154
184
 
155
- ### 2️⃣ Set up After Effects
185
+ ### 2. Set up After Effects
156
186
 
157
187
  **Quit After Effects if it's open**, then ask your assistant:
158
188
 
159
189
  > Set up After Effects.
160
190
 
161
- It installs a small panel into After Effects, which is how the tools talk to it. Open After Effects when it's finished and you're ready to go. 🎉
162
-
163
- <sub>Prefer to leave After Effects open? That works too — you'll just be asked to restart it at the end.</sub>
191
+ It installs a small panel into After Effects, which is how the tools talk to it. When it's done, open After Effects and you're ready.
164
192
 
165
- ### 3️⃣ Start animating
193
+ **After Effects must be closed while the panel installs.** If it's open, the installation won't work — quit After Effects first, then install, then reopen it. The same goes for updating the panel later.
166
194
 
167
- Open the project you want to work on, then say what you want:
195
+ You never have to open the panel yourself; it starts whenever After Effects does.
168
196
 
169
- > Build a lower third that says Chapter One, sliding in from the left.
197
+ ### 3. Start animating
170
198
 
171
- Your assistant reads the current state of your comp, makes the change, and can screenshot the result to check its own work. Everything it builds is ordinary, editable After Effects work — keyframes you can drag, effects you can dial in.
199
+ Open your project and say what you want. Two prompts are worth knowing, in any app that supports MCP prompts:
172
200
 
173
- Two commands worth knowing, in any client that supports MCP prompts:
174
-
175
- | Command | What it does |
201
+ | Prompt | What it does |
176
202
  |---|---|
177
- | `/init-after-effects` | 🧭 Walks you through setup and offers to capture your style |
178
- | `/create-style-guide` | 🎨 Teaches it what your work should look like |
179
-
180
- ---
181
-
182
- ## 🎨 Your house style
183
-
184
- Ask for a style guide and point at a comp you already like. Your colours, fonts, sizes and timing get read off it and saved as `house-style.md` **next to your After Effects project** — and everything built afterwards follows it.
185
-
186
- It sits beside the `.aep`, so it travels with the project and works in every client. It's plain markdown, so you can edit it in any text editor.
187
-
188
- > ⚠️ Your project needs to have been saved at least once, or there's no folder to put it in.
189
-
190
- <details>
191
- <summary><b>What goes in it, and project folders</b></summary>
203
+ | `/init-after-effects` | Walks you through setup and offers to capture your style |
204
+ | `/create-style-guide` | Teaches it what your work should look like |
192
205
 
193
- <br>
206
+ **One thing to know:** while a dialog box is open in After Effects, nothing else can happen there, so the tools wait and eventually say the panel didn't answer in time. Close the dialog and the work finishes on its own — don't ask for it again, or it gets done twice.
194
207
 
195
- A style guide that works is specific: `#131521 at 92% opacity`, not "dark and clean". The most useful lines are the prohibitions — "never put text directly on footage", "keep total runtime under 8 seconds". Ask for a style guide and you'll be walked through it.
208
+ ## Your house style
196
209
 
197
- Separately, "set up a project folder for me" creates a folder for one video, series or client, with a brief your assistant reads and a `renders/` directory. It writes whichever rules file your client actually reads — `AGENTS.md`, `CLAUDE.md`, `.cursor/rules/`, and so on. From a terminal, the same thing is:
210
+ Ask for a style guide and point at a comp you already like. Your colours, fonts, sizes and timing — including how your existing animation eases and staggers — get read off it and saved as `house-style.md` **next to your `.aep`**. Everything built afterwards follows it. It's plain markdown, travels with the project, and works in every app. (The project needs to have been saved once, so there's a folder to put it in.)
198
211
 
199
- ```bash
200
- npx @engine-room/after-effects-mcp init my-video
201
- ```
212
+ The best style guides are specific — `#131521 at 92% opacity`, not "dark and clean" — and the most useful lines are the rules: "never put text directly on footage", "keep total runtime under 8 seconds".
202
213
 
203
- Updating the tools never touches either file.
214
+ You can also ask it to **set up a project folder** for a video, series or client: a brief your assistant reads, a `renders/` folder, and whichever rules file your app reads (`AGENTS.md`, `CLAUDE.md`, `.cursor/rules/` and so on). From a terminal it's `npx @engine-room/after-effects-mcp init my-video`. Updating the tools never touches either file.
204
215
 
205
- </details>
216
+ ## Updating
206
217
 
207
- ---
218
+ Two pieces update separately, and **the panel inside After Effects does not update itself**:
208
219
 
209
- ## 🔄 Updating
220
+ 1. **The tools** — reinstall the `.mcpb`, download the new standalone build, or just restart your app if you use `npx`. On the Claude Code plugin, run `/plugin marketplace update engine-room` and `/plugin update after-effects@engine-room`, then restart Claude Code.
221
+ 2. **The panel** — quit After Effects, ask your assistant to *update the After Effects panel*, then reopen After Effects.
210
222
 
211
- Two pieces update separately, and **the After Effects panel does not update itself**.
223
+ Forget the second step and nothing breaks quietly: your next request stops with a plain explanation of what to do.
212
224
 
213
- 1. **The tools** — reinstall the `.mcpb`, download the new standalone build, or just restart your client if you're on `npx`.
214
- 2. **The panel** — quit After Effects, then say:
225
+ Afterwards, run `/absorb-release` in your project folder (other apps list it as `absorb-release` in their prompt menu). It tidies up any workarounds earlier sessions wrote into your project notes that the new version makes unnecessary.
215
226
 
216
- > Update the After Effects panel.
227
+ ## Safety and privacy
217
228
 
218
- Reopen After Effects and it's running the new version.
219
-
220
- If you forget the second step, nothing breaks silently: the next thing you ask for stops with a plain explanation, and your assistant walks you through it.
221
-
222
- ---
223
-
224
- <details>
225
- <summary><b>🧰 All 76 tools</b></summary>
229
+ - **Only your own computer can talk to After Effects.** The panel listens on `127.0.0.1` — your machine, never your network — and every request must carry a secret key the panel makes fresh each time After Effects starts. Without it, nothing runs.
230
+ - **Changes are ordinary undo steps.** Cmd/Ctrl+Z works on what your assistant did, just like on your own edits. In apps that support it, deleting a comp, purging unused footage or reverting a comp asks you first.
231
+ - **What your assistant sees goes to the AI model you use** — layer names, text, keyframes, file paths in your project, and screenshots of your comps. If a project is confidential, treat a session with it like pasting it into a chat.
226
232
 
227
- <br>
233
+ Two optional switches limit what it can do. Both are off unless you turn them on.
228
234
 
229
- | Group | Tools |
235
+ | Switch | What it does |
230
236
  |---|---|
231
- | Comps (10) | `list_comps`, `get_comp`, `get_comp_tree`, `create_comp`, `set_comp`, `delete_comp`, `set_active_comp`, `duplicate_comp`, `snapshot_comp`, `diff_comp` |
232
- | Layers (15) | `list_layers`, `get_layer_full`, `create_{text,shape,solid,null,adjustment,precomp,camera,light}_layer`, `duplicate_layer`, `delete_layer`, `set_layer`, `parent_layer`, `reorder_layer` |
233
- | Transforms (1) | `set_transform` — position, scale, rotation, anchor, opacity; 2D and 3D; optionally keyframed |
234
- | Keyframes (6) | `add_keyframe`, `remove_keyframe`, `get_keyframes`, `set_interpolation`, `set_temporal_ease`, `set_spatial_tangents` |
235
- | Expressions (4) | `get_expression`, `set_expression`, `toggle_expression`, `clear_expression` |
236
- | Effects (6) | `list_effects`, `add_effect`, `remove_effect`, `set_effect_param`, `set_effect_enabled`, `list_available_effects` |
237
- | Text (2) | `set_text`, `add_text_animator` |
238
- | Shapes (3) | `set_shape_path`, `add_shape_content`, `set_shape_property` |
239
- | Masks (3) | `add_mask`, `set_mask`, `remove_mask` |
240
- | Markers (2) | `add_marker`, `remove_marker` |
241
- | Vision (2) | `screenshot_frame`, `screenshot_layer` |
242
- | Batch (1) | `run_batch` |
243
- | Footage (3) | `import_footage`, `create_footage_layer`, `purge_unused_footage` — remove the solids (or any footage) no comp uses, with a dry run |
244
- | Audio (1) | `place_audio_cues` — a whole cue list placed as one undo step |
245
- | Motion Graphics (1) | `export_mogrt` — export a comp as a `.mogrt` template for Premiere |
246
- | Explore (2) | `get_project_summary`, `find_layers` |
247
- | Raw (1) | `run_jsx` |
248
- | House style (2) | `get_house_style`, `set_house_style` |
249
- | Jobs (3) | `await_job`, `get_job`, `cancel_job` |
250
- | Setup (3) | `check_setup`, `setup_panel`, `init_project` |
251
- | Guidance (1) | `ae_guide` |
252
- | Issues (4) | `list_known_issues`, `log_issue`, `mark_issue_reported`, `archive_issue` |
253
-
254
- A few behave differently from the rest:
255
-
256
- - **`get_layer_full`** returns a layer's transforms with their keyframes and expressions, every effect with every parameter, masks, markers and visible bounds — in one call.
257
- - **`run_batch`** runs many operations in a single pass. Up to 500 of them that is one undo step; past that it runs in the background, streams progress, and lands as one undo step per chunk — After Effects will not keep a single undo group across a long job, so the result tells the assistant exactly how many steps the work took. Ask for a single undo step at any size with `singleUndo`, at the cost of freezing After Effects until it finishes.
258
- - **`screenshot_frame`** and **`screenshot_layer`** are for occasional checks, not for reviewing motion frame by frame. To judge movement, `screenshot_frame` takes several times at once and returns them as one labelled contact sheet — one image instead of several. On large comps it renders at reduced resolution unless you ask otherwise.
259
- - **`import_footage`** checks what After Effects actually produced. An SVG whose `viewBox` asks for one shape and imports at another is a known After Effects bug that renders as nothing at all, with no error — so the import is refused and explained rather than left to fail silently later.
260
- - **`export_mogrt`** writes a Motion Graphics template for Premiere. It suppresses the modal dialogs that would otherwise sit there waiting for a click, and can set the thumbnail from any frame you choose, rather than the first one — which is usually black if the comp fades up.
261
- - **`snapshot_comp`** and **`diff_comp`** answer "what did that change actually do" without reading the whole comp back — the assistant fingerprints it before the change and asks afterwards what moved.
262
- - **`run_jsx`** runs arbitrary ExtendScript for anything the other tools don't cover. Long scripts can be run from a file so they never fill up the conversation.
263
- - **`ae_guide`** is how the assistant reads its own working guidance — the same text this server publishes as MCP resources and ships to Claude Code as skills.
264
-
265
- </details>
237
+ | **Read-only mode** | Your assistant can look at your project — list comps and layers, read keyframes, take screenshots — but every tool that changes something is removed. |
238
+ | **Turn off running scripts** | Removes `run_jsx`, the tool that lets your assistant write and run its own After Effects scripts. Everything else still works, rendering included; only jobs no other tool covers (like replacing or relinking footage) become impossible. |
266
239
 
267
240
  <details>
268
- <summary><b>🩺 When something goes wrong</b></summary>
241
+ <summary><b>How to turn them on</b></summary>
269
242
 
270
243
  <br>
271
244
 
272
- Start here: **ask your assistant to check the After Effects setup.** It reports which part is broken and what to do about it.
245
+ **Claude Desktop:** Settings → Extensions → After Effects, then tick *Read-only mode* or *Turn off running scripts (run_jsx)*.
273
246
 
274
- | Symptom | Cause and fix |
247
+ **Everywhere else:** add the setting to the configuration from step 1, then restart your app. Use either one on its own; read-only mode already includes the second.
248
+
249
+ | App | How |
275
250
  |---|---|
276
- | "Cannot reach the After Effects panel" | After Effects isn't running, or the panel isn't installed. Ask it to set up After Effects; if AE was closed, just open it afterwards. |
277
- | "The panel did not answer within 120 seconds" | Not the same thing. After Effects is busy — usually a long script, or a dialog waiting for a click behind another window. Wait a minute and check again before restarting anything; it normally comes back on its own. |
278
- | "The After Effects panel is out of date" | The tools were updated but the panel wasn't. Ask it to update the panel, then restart AE. |
279
- | "…updated on disk, but After Effects is still running the previous version" | The update landed; AE just hasn't restarted. Quit and reopen it. Updating again won't help. |
280
- | Panel never loads, but setup looks correct | On macOS, reboot once. Some builds cache the Adobe setting until a restart. |
281
- | A panel answers, but the setup check reports none installed | An older install is still serving. Remove it from the CEP extensions folder, reinstall, restart AE. |
282
- | "No project folder to write to" | Your client didn't tell the server where it's working. Say which folder you want. |
283
- | Style guide can't be saved | The After Effects project has never been saved. Save it, then try again. |
284
- | You need the panel's own log | In After Effects: **Window → Extensions → AE MCP Bridge**. |
285
-
286
- **If your work legitimately takes longer.** A heavy render or a deliberately long script can pass the limit honestly. Set `AE_MCP_OP_TIMEOUT_MS` in the server's environment to a larger number of milliseconds and it applies to every operation:
251
+ | Cursor, Windsurf and other `mcpServers` apps | Add `"env": { "AE_MCP_READ_ONLY": "1", "AE_MCP_DISABLE_RUN_JSX": "1" }` next to `"command"` and `"args"`. |
252
+ | VS Code | The same `"env"` block, inside the `after-effects` entry under `"servers"` in `.vscode/mcp.json`. |
253
+ | Codex | Add a section to `~/.codex/config.toml`: <br>`[mcp_servers.after-effects.env]`<br>`AE_MCP_READ_ONLY = "1"` |
254
+ | Claude Code | Re-add the server with the setting: `claude mcp remove after-effects`, then <br>`claude mcp add --scope user --env AE_MCP_READ_ONLY=1 after-effects -- npx -y @engine-room/after-effects-mcp` |
255
+
256
+ For example, in an `mcpServers` app:
287
257
 
288
258
  ```json
289
259
  {
@@ -291,47 +261,35 @@ Start here: **ask your assistant to check the After Effects setup.** It reports
291
261
  "after-effects": {
292
262
  "command": "npx",
293
263
  "args": ["-y", "@engine-room/after-effects-mcp"],
294
- "env": { "AE_MCP_OP_TIMEOUT_MS": "600000" }
264
+ "env": {
265
+ "AE_MCP_READ_ONLY": "1",
266
+ "AE_MCP_DISABLE_RUN_JSX": "1"
267
+ }
295
268
  }
296
269
  }
297
270
  }
298
271
  ```
299
272
 
300
- **The issue notebook.** These tools have rough edges. When your assistant hits one and works out a way around it, it writes the problem and the fix into `.ae-mcp/issues/` in your project folder — plain text files you can read, edit or delete. The next time the same thing fails, the error itself points at that note, so nothing has to be re-read up front. Notes that go quiet for a month, or that a newer version has fixed, drop out of the list on their own (they are kept, just hidden), and a note about something the maintainers already know can be retired outright. The folder keeps itself out of version control.
301
-
302
- **Reporting a bug.** If the problem looks like ours rather than yours, you'll be offered the chance to pass it on, or you can start it yourself with `/report-ae-issue`. It writes the report, shows it to you, and only sends it once you say yes. Nothing about your own work — comp names, file paths, clients — goes into it. Sending needs the [GitHub CLI](https://cli.github.com); without it you get a prefilled link to click.
273
+ A switched-off tool simply isn't there, so your assistant won't try it and will tell you when a request needs it. The switches limit this connection only — they don't lock After Effects, and another assistant connected without them still has every tool.
303
274
 
304
275
  </details>
305
276
 
306
- <details>
307
- <summary><b>💻 Platforms and limitations</b></summary>
308
-
309
- <br>
310
-
311
- macOS and Windows — the only two platforms After Effects runs on. Two things differ, and both are handled for you:
312
-
313
- | | macOS | Windows |
314
- |---|---|---|
315
- | Panel location | `~/Library/Application Support/Adobe/CEP/extensions` | `%APPDATA%\Adobe\CEP\extensions` |
316
- | Unsigned-panel setting | `defaults` preference | `HKCU\Software\Adobe\CSXS.*` registry value |
277
+ ## If something goes wrong
317
278
 
318
- macOS is the more exercised of the two; [issue reports](https://github.com/Engine-Room-Games/after-effects-mcp/issues) are welcome.
279
+ **Ask your assistant to check the After Effects setup.** It finds which part is broken and tells you what to do, in plain words.
319
280
 
320
- **Signing.** The macOS binaries in each release are signed and notarized by Engine Room, so they run without warnings. The Windows binary is unsigned — SmartScreen may warn on first run — because that needs a separate certificate. If you fork this project and build your own binaries, they'll be unsigned and Gatekeeper will refuse to launch them until you sign with your own Developer ID. The `npx` path has no such constraint.
281
+ For specific error messages, longer time limits, the issue notebook and how to report a bug, see [Troubleshooting](https://github.com/Engine-Room-Games/after-effects-mcp/blob/main/docs/troubleshooting.md). Bug reports are welcome in [the issues](https://github.com/Engine-Room-Games/after-effects-mcp/issues) — macOS is the more tested of the two platforms, so Windows reports especially.
321
282
 
322
- **Limitations.**
283
+ ## Good to know
323
284
 
324
- - The After Effects panel is unsigned, so loading it requires Adobe's `PlayerDebugMode`, which the setup step enables. This is Adobe's documented path for unsigned extensions.
325
- - `saveFrameToPng` is community-known rather than officially documented. It works, but alpha edges can be imperfect on some comps.
326
- - A long synchronous loop in `run_jsx` will freeze the After Effects UI. Use `run_batch` for bulk work.
327
- - Not covered: the render queue, footage import and replacement, and application preferences.
285
+ - **What's not covered:** replacing or relinking footage (importing it is covered), and After Effects' own preferences.
286
+ - **Screenshots are for spot checks.** Alpha edges can be slightly imperfect on some comps.
287
+ - **A long loop in a custom script freezes After Effects** until it finishes. Bulk work goes through `run_batch`, which doesn't.
288
+ - **The panel is signed**, so After Effects loads it without Adobe's `PlayerDebugMode` setting. Setup still turns that setting on as a fallback; it applies to your whole user account and lets Adobe apps load *any* unsigned panel. A panel installed from a git checkout is unsigned and does need it.
289
+ - **Removing it all:** see [Uninstalling](https://github.com/Engine-Room-Games/after-effects-mcp/blob/main/docs/uninstalling.md), which also covers turning the debug setting back off.
290
+ - **Every tool, listed:** see [the tools](https://github.com/Engine-Room-Games/after-effects-mcp/blob/main/docs/tools.md) — 89 of them, plus the extras some apps show, like an interactive comp timeline.
328
291
 
329
- </details>
330
-
331
- <details>
332
- <summary><b>🛠️ Development</b></summary>
333
-
334
- <br>
292
+ ## For developers
335
293
 
336
294
  ```bash
337
295
  git clone https://github.com/Engine-Room-Games/after-effects-mcp.git
@@ -341,27 +299,10 @@ npm run install:panel
341
299
  npm run doctor
342
300
  ```
343
301
 
344
- | Command | Purpose |
345
- |---|---|
346
- | `make build` | Compile TypeScript, the guides and the ExtendScript bundle |
347
- | `make jsx` | Rebuild `bundle.jsx` and hot-reload it into a running After Effects |
348
- | `make watch` | TypeScript watch mode |
349
- | `make doctor` | Diagnose the install |
350
- | `make verify` | Build, check version strings and generated files agree, dry-run the package |
351
- | `make artifacts` | Build the `.mcpb` and standalone binaries without releasing |
352
- | `make release` | Bump the patch version, build and sign every artifact, tag, and publish |
353
- | `make release 1.1.0` | The same with an explicit version |
354
-
355
- Adding a tool takes three edits: a zod schema in `packages/shared/src/schemas.ts`, a handler in the matching `packages/jsx/*.jsx` module, and a description in `packages/mcp-server/src/tools/descriptions.ts`. Registration is automatic.
356
-
357
- Guidance prose is written once in `packages/mcp-server/src/{guides,prompts}/*.md` and generated into the MCP resources, the `ae_guide` tool, the server's `instructions`, and the Claude Code skills and commands. Never edit the generated copies.
358
-
359
- Releases are cut from a Mac with a Developer ID certificate; see `scripts/sign-and-notarize.sh` for the environment it expects. See [CLAUDE.md](https://github.com/Engine-Room-Games/after-effects-mcp/blob/main/CLAUDE.md) for the architecture and the ExtendScript conventions, and [docs/](https://github.com/Engine-Room-Games/after-effects-mcp/tree/main/docs) for the known-fragile areas and the verification recipes.
360
-
361
- </details>
302
+ `make help` lists the rest (`make jsx` hot-reloads the ExtendScript bundle into a running After Effects; `make release` builds, signs and publishes). Start with [CLAUDE.md](https://github.com/Engine-Room-Games/after-effects-mcp/blob/main/CLAUDE.md) for the architecture, the conventions and how to add a tool, and [docs/](https://github.com/Engine-Room-Games/after-effects-mcp/tree/main/docs) for the fragile areas and the live verification recipes. Agent guidance is written once in `packages/mcp-server/src/{guides,prompts}/*.md` and generated everywhere else — never edit the generated copies. Forks that build their own binaries get unsigned ones; macOS will refuse them until they're signed with your own Developer ID.
362
303
 
363
304
  ---
364
305
 
365
306
  <div align="center">
366
- <sub>Built by <a href="https://github.com/Engine-Room-Games">Engine Room</a></sub>
307
+ <sub>Built by <a href="https://github.com/Engine-Room-Games">Engine Room</a> · free and open source — if it saves you time, <a href="https://github.com/sponsors/migus88">sponsor its development</a></sub>
367
308
  </div>