Puppeteer for After Effects. Use AE with Claude Code to make production-ready videos. MCP server for controlling After Effects via WebSocket, REST, and stdio transports.
Descriptions vary wildly: ae_status, ae_list_commands, ae_command, ae_media_info, ae_upload_video, ae_media_list, ae_render_and_download, ae_render_result are well-written (50-200 chars, actionable); ae_ping and ae_getProjectInfo have trivial descriptions (10-30 chars). No output schemas documented. Error handling absent. Naming is consistent (ae_* prefix) but many tools combine multiple concerns (e.g., ae_upload_video both uploads AND creates comp if makeComp:true).
Add an adjustment layer to a composition.
Add an effect to a layer.
Add imported footage as a layer to a composition.
Add a null object layer to a composition.
Add a shape layer to a composition.
Add a solid color layer to a composition.
Add a text layer to a composition.
Apply Lumetri color correction to a layer.
Apply a specification to a composition or layer.
24 tools (63%) have schemas with only additionalProperties:true and NO documented parameters. LLMs cannot infer parameter names, types, or constraints.
Descriptions for 24 tools are trivial (10-30 chars): 'Get information about the current After Effects project.' LLMs cannot determine when to call ae_getProjectInfo vs ae_listComps vs ae_getLayerDetails.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | 2026-07-28+ | v2 |
Apply a text preset to a text layer.
Apply a text style to a text layer.
Execute ANY aftr command by name (universal escape hatch). Params follow each command's documented shape; see ae_list_commands.
Create a new composition in After Effects.
Apply deep glow effect to a layer.
Get detailed information about a layer.
Get all layers in a composition.
Get information about the current After Effects project.
Import footage into the project.
Get detailed information about an effect.
List all compositions in the current After Effects project.
List all available fonts.
List all installed effects.
List every aftr command with its description and required params. Use to discover what ae_command can run.
How to send a video TO the host and get rendered video back: upload URL + curl, the browser studio page, list/download URLs.
List uploaded (incoming) videos and rendered (output) videos, each with a download URL.
Ping the After Effects panel to verify connectivity and get version info.
Render a composition.
Render a comp to a web-friendly H.264 .mp4 and return a download URL. Waits up to ~150s; for LONGER renders it returns { pending, jobId } — then call ae_render_result with that jobId to get the link. { compId, name?, startFrame?, endFrame?, timeoutMs? }
Poll a render started by ae_render_and_download. Returns status (rendering|transcoding|done|failed) and, when done, the download URL. { jobId }
Save the current After Effects project.
Set a parameter on an effect.
Set an expression on a layer property.
Set keyframes on a layer property.
Set a property on a layer.
Apply shadow studio effect to a layer.
aftr health: is the After Effects panel connected? Returns { status, agents, config }. Call this first if other tools report NO_PANEL.
Trim a layer to a specified duration.
Send a video to the host so AE can use it — the EASY way for remote callers: pass a public { url } (host downloads it) or small { dataBase64 }. With makeComp:true it also imports the footage and builds a comp sized to it, returning { comp:{ compId } } ready to render — so it is URL -> renderable comp in ONE call.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., compId returned by ae_createComp). Baseline: 100% of A+ tools document return types.
ae_upload_video combines two concerns: upload AND optionally create comp. Per pattern:tool, each tool should do exactly one thing. Split into ae_upload_video (upload only) and ae_create_comp_from_footage (import + comp creation).
No error handling guidance. Tools return no recovery hints (e.g., 'If NO_PANEL, call ae_status first'). Per pattern:recovery-guide, errors must tell LLMs what to do next. ae_status mentions this in description but no other tools do.