@engine-room/after-effects-mcp 0.1.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.
- package/LICENSE +21 -0
- package/README.md +176 -0
- package/bin/server.js +1616 -0
- package/package.json +64 -0
- package/panel/CSXS/manifest.xml +49 -0
- package/panel/client/csinterface.js +32 -0
- package/panel/client/index.html +27 -0
- package/panel/client/main.js +371 -0
- package/panel/jsx/boot.jsx +3 -0
- package/panel/jsx/bundle.jsx +1562 -0
- package/panel/package.json +9 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Engine Room
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Engine Room — After Effects for AI agents
|
|
2
|
+
|
|
3
|
+
Drive Adobe After Effects by describing what you want. Comps, layers, keyframes with real easing, expressions, effects, text, shapes, masks — **60 tools**, driven by an agent that can read the project back before it changes anything.
|
|
4
|
+
|
|
5
|
+
Built for motion designers, not just developers. Setup happens through conversation; you never have to open a terminal if you don't want to.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
"Build a lower third that says Chapter One, sliding in from the left with an easy ease,
|
|
9
|
+
in my house style."
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**Requirements:** macOS · After Effects 2026 · [Node.js 20+](https://nodejs.org)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
### Claude Code (recommended)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/plugin marketplace add Engine-Room-Games/after-effects-mcp
|
|
22
|
+
/plugin install after-effects@engine-room
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
That installs the tools *and* the knowledge of how to use them well — two skills covering AE craft and setup troubleshooting.
|
|
26
|
+
|
|
27
|
+
### Any other MCP client
|
|
28
|
+
|
|
29
|
+
Add this to your client's MCP config (for Claude Desktop, `~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"after-effects": {
|
|
35
|
+
"command": "npx",
|
|
36
|
+
"args": ["-y", "@engine-room/after-effects-mcp"]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Restart the client.
|
|
43
|
+
|
|
44
|
+
## Connect After Effects
|
|
45
|
+
|
|
46
|
+
The tools talk to a small panel that runs **inside** After Effects. Installing it is a conversation, not a chore:
|
|
47
|
+
|
|
48
|
+
> **You:** Set up After Effects.
|
|
49
|
+
|
|
50
|
+
Claude runs `check_setup`, tells you what's missing, asks before it changes anything, then runs `setup_panel` — which installs the panel and switches on the Adobe preference that allows it to load. Then:
|
|
51
|
+
|
|
52
|
+
1. **Quit and reopen After Effects.** The panel only loads at launch.
|
|
53
|
+
2. If it still doesn't connect, **reboot once**. On some macOS builds the Adobe preference only applies after a restart. One time only.
|
|
54
|
+
|
|
55
|
+
Ask Claude to "check the After Effects setup" any time something stops working.
|
|
56
|
+
|
|
57
|
+
## Start a project
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx @engine-room/after-effects-mcp init my-video
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This creates a folder built around one idea — **the plugin knows the tool, you own the taste**:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
my-video/
|
|
67
|
+
├── .claude/skills/house-style/SKILL.md ← your palette, type, timing. Edit this.
|
|
68
|
+
├── CLAUDE.md ← what this project is
|
|
69
|
+
└── renders/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Fill in `house-style/SKILL.md` with your colours, fonts and motion defaults and everything Claude builds follows them. Upgrading the plugin never touches it; your style survives tool updates, and the tool's knowledge updates without touching your style.
|
|
73
|
+
|
|
74
|
+
The fastest way to write it: build one piece the way you like it, then ask *"read this comp and write it up in my house-style skill."*
|
|
75
|
+
|
|
76
|
+
Keep a folder per client or series. Or put the file in `~/.claude/skills/house-style/` to make it your default everywhere.
|
|
77
|
+
|
|
78
|
+
> Didn't install the plugin? Run `init` with `--with-mcp` to add a project-level connection instead.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## What it can do
|
|
83
|
+
|
|
84
|
+
| Group | Tools |
|
|
85
|
+
|---|---|
|
|
86
|
+
| **Comps** (7) | `list_comps`, `get_comp`, `get_comp_tree`, `create_comp`, `set_comp`, `delete_comp`, `set_active_comp` |
|
|
87
|
+
| **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` |
|
|
88
|
+
| **Transforms** (1) | `set_transform` — position/scale/rotation/anchor/opacity, 2D and 3D, optionally keyframed |
|
|
89
|
+
| **Keyframes** (6) | `add_keyframe`, `remove_keyframe`, `get_keyframes`, `set_interpolation`, `set_temporal_ease`, `set_spatial_tangents` |
|
|
90
|
+
| **Expressions** (4) | `get_expression`, `set_expression`, `toggle_expression`, `clear_expression` |
|
|
91
|
+
| **Effects** (6) | `list_effects`, `add_effect`, `remove_effect`, `set_effect_param`, `set_effect_enabled`, `list_available_effects` |
|
|
92
|
+
| **Text** (2) | `set_text`, `add_text_animator` |
|
|
93
|
+
| **Shapes** (3) | `set_shape_path`, `add_shape_content`, `set_shape_property` |
|
|
94
|
+
| **Masks** (3) | `add_mask`, `set_mask`, `remove_mask` |
|
|
95
|
+
| **Markers** (2) | `add_marker`, `remove_marker` |
|
|
96
|
+
| **Vision** (2) | `screenshot_frame`, `screenshot_layer` |
|
|
97
|
+
| **Batch** (1) | `run_batch` — many ops, one undo step, progress streaming |
|
|
98
|
+
| **Explore** (2) | `get_project_summary`, `find_layers` |
|
|
99
|
+
| **Raw** (1) | `run_jsx` — arbitrary ExtendScript escape hatch |
|
|
100
|
+
| **Jobs** (3) | `await_job`, `get_job`, `cancel_job` |
|
|
101
|
+
| **Setup** (2) | `check_setup`, `setup_panel` |
|
|
102
|
+
|
|
103
|
+
⭐ **`get_layer_full` is the centrepiece.** One call returns a layer's transforms *with* keyframes and expressions, every effect with every parameter, masks, markers and visible bounds. Reading before writing is what separates an agent that builds what you asked for from one that guesses.
|
|
104
|
+
|
|
105
|
+
Three design decisions worth knowing about:
|
|
106
|
+
|
|
107
|
+
- **Screenshots are diagnostics, not a feedback loop.** The tool descriptions tell the agent to take two or three, never to scrub frame by frame. Pass `downsample` on large comps — a full 4K frame is big enough to exhaust an agent's context in one call.
|
|
108
|
+
- **Bulk work is one undo step.** `run_batch` runs hundreds of operations in a single ExtendScript pass, so "undo that" does what you mean. Long batches stream progress.
|
|
109
|
+
- **Failures are loud.** Tools that can't do what was asked return an error naming the problem rather than reporting success — an agent can only correct a mistake it's told about.
|
|
110
|
+
|
|
111
|
+
## How it works
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
Claude / MCP client
|
|
115
|
+
│ stdio (JSON-RPC)
|
|
116
|
+
▼
|
|
117
|
+
MCP server (Node)
|
|
118
|
+
│ HTTP + WebSocket on 127.0.0.1
|
|
119
|
+
▼
|
|
120
|
+
CEP panel inside After Effects
|
|
121
|
+
│ evalScript
|
|
122
|
+
▼
|
|
123
|
+
ExtendScript → After Effects
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The panel is the only thing that talks to AE, and it serialises calls because ExtendScript is single-threaded. The server is stateless apart from a job table. The bridge listens on localhost only and refuses outside connections.
|
|
127
|
+
|
|
128
|
+
## Troubleshooting
|
|
129
|
+
|
|
130
|
+
Ask Claude to run `check_setup` first — it reports exactly which link in the chain is broken and what to do about it.
|
|
131
|
+
|
|
132
|
+
| Symptom | Cause |
|
|
133
|
+
|---|---|
|
|
134
|
+
| "Cannot reach the After Effects panel" | AE isn't running, or the panel isn't installed. Run `setup_panel`, then restart AE. |
|
|
135
|
+
| Tools worked before, now error inside AE | The server was upgraded but the panel wasn't. Run `setup_panel`, restart AE. |
|
|
136
|
+
| Panel never loads, setup looks correct | Reboot the Mac once — the Adobe preference sometimes needs it. |
|
|
137
|
+
| Want to see the panel's own log | In AE: **Window > Extensions > AE MCP Bridge**. |
|
|
138
|
+
|
|
139
|
+
## Limitations
|
|
140
|
+
|
|
141
|
+
- **macOS only.** Windows uses a different CEP location and a registry key; not implemented.
|
|
142
|
+
- **Unsigned panel.** Loading it requires Adobe's `PlayerDebugMode`, which `setup_panel` enables. This is Adobe's documented path for unsigned extensions.
|
|
143
|
+
- **`saveFrameToPng` is community-known**, not officially documented by Adobe. It works, but alpha edges can be imperfect on some comps.
|
|
144
|
+
- **Long `run_jsx` loops freeze AE's UI**, because ExtendScript is single-threaded. Use `run_batch` for bulk work.
|
|
145
|
+
- **Not covered:** render queue, footage import and replacement, AE preferences. Preferences are excluded by design — this tool animates, it doesn't reconfigure your app.
|
|
146
|
+
|
|
147
|
+
## Development
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
git clone https://github.com/Engine-Room-Games/after-effects-mcp.git
|
|
151
|
+
cd after-effects-mcp
|
|
152
|
+
npm install && npm run build
|
|
153
|
+
npm run install:panel # or: ask Claude to run setup_panel
|
|
154
|
+
npm run doctor # verify the whole chain
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
| Command | Does |
|
|
158
|
+
|---|---|
|
|
159
|
+
| `npm run build` | Compile TypeScript, concatenate the ExtendScript bundle |
|
|
160
|
+
| `npm run build:jsx` | Rebuild only `bundle.jsx` (fast loop) |
|
|
161
|
+
| `npm run watch:ts` | TypeScript watch mode |
|
|
162
|
+
| `npm run doctor` | Diagnose the install |
|
|
163
|
+
| `npm run inspect` | MCP Inspector against the server |
|
|
164
|
+
| `npm run pack:check` | Preview the publishable tarball |
|
|
165
|
+
|
|
166
|
+
Reload ExtendScript changes without restarting AE:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
curl -X POST http://127.0.0.1:7777/reload-jsx
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**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. See [CLAUDE.md](CLAUDE.md) for the architecture in depth, the ExtendScript conventions, and the known-fragile areas.
|
|
173
|
+
|
|
174
|
+
## License
|
|
175
|
+
|
|
176
|
+
[MIT](LICENSE)
|