AE MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AE MCP Server create a new 1920x1080 composition named 'Logo Animation'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AE MCP Server - Adobe After Effects Model Context Protocol Server
A Model Context Protocol (MCP) server that enables AI assistants to interact with Adobe After Effects through a file-based communication bridge.
Background
I signed up for https://schoolofmotion.com/ again on my vacation. And started to go through Joey's very first lesson (Desk Unmessed) to take an inventory of where I'm at. I animated one item, and then got to thinking... it'd be nice to use MCP here and connect Amazon Q or Claude Code and "repeat the animation" for the other shapes I just did.
I explored what was out there and mostly found: https://github.com/Dakkshin/after-effects-mcp. But it was originally focused on Windows. I was able to use Claude Code to get it to run on macOS but I couldn't get it to take commands.
So I used Claude Code to create a BRD and design doc (pretty basic 1-2 sentence prompt: "Can you plan out how you’d create an MCP server for Adobe after effects? Maybe create a requirements doc and then technical design doc with instructions on how to implement?"). Then I copied the markdown files into a new folder and prompted to create an app. I asked why not "rust" but Adobe CEP is more JavaScript oriented so it made sense to stick with TypeScript. Original prompts were focused around just doing a script because CEP didn't work at first. So again I went back to Claude Desktop (Opus) and prompted with "Can we research how to create CEP plugins for adobe after effects? Currently not able to get them to load - maybe not signed? Can we create detailed steps on how to get this to work for running locally with Adobe After Effects 2025?". And used that markdown file as input to help with creating a more robust system.
That worked, was able to finally load a CEP plugin. Btw earlier when I had to run a script I could not get sockets to work so Claude synthesized a file-based way to communicate. That seemed more reliable. So when switching over to CEP we went with that. There was a lot of copying of errors and prompting for guidance but fairly minimal human-based engineering. Mostly guidance. I used Amazon Q to power the client using just this in ~/.aws/amazonq/mcp.json:
"ae-mcp": {
"command": "node",
"args": ["<path to>/ae-mcp/dist/stdio-server.js"],
"env": {
"AE_USE_FILE_BRIDGE": "true"
}
}And it worked. My wife thinks I should try to sell this (did interrupt one vacation day to be fair). Maybe in the future.
You can use tail
ae-mcp-server.logto check for logs. Haven't explored what it can do too much - maybe this weekend more...
Overview
This project provides an MCP server that allows AI assistants (like Claude) to control Adobe After Effects by:
Creating and managing projects
Creating and modifying compositions
Managing layers and keyframes
Rendering compositions
Batch processing operations
Architecture
The system uses a file-based communication approach for reliability:
AI Assistant <-> MCP Server <-> File System <-> CEP Extension <-> After EffectsMCP Server - Receives commands from AI assistants via the MCP protocol
File Bridge - Writes commands as JSON files to a watched directory
CEP Extension - Monitors the directory and executes commands in After Effects
Response System - Returns results via response files
Requirements
Adobe After Effects 2022 or later
Node.js 16+ and npm
macOS or Windows
Quick Start
1. Install and Build
git clone <repository-url>
cd ae-mcp
npm install
npm run build2. Install the CEP Extension
cd cep-extension
./install.sh # macOS
# or manually copy to CEP extensions folder on Windows3. Enable the Extension in After Effects
Open After Effects
Go to Window > Extensions > AE MCP Bridge
Ensure "Auto Process: ON" is enabled
4. Configure Your MCP Client
For Claude Desktop, add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"ae-mcp": {
"command": "node",
"args": ["/path/to/ae-mcp/dist/stdio-server-hybrid.js"],
"env": {
"AE_USE_FILE_BRIDGE": "true"
}
}
}
}Available Tools
Project Tools
create_project- Create a new After Effects projectopen_project- Open an existing projectsave_project- Save the current projectget_project_info- Get information about the current project
Composition Tools
create_composition- Create a new composition with custom settingsget_composition- Get composition detailslist_compositions- List all compositions in the projectupdate_composition- Update composition settings
Layer Tools
create_solid_layer- Create a solid color layercreate_text_layer- Create a text layercreate_adjustment_layer- Create an adjustment layercreate_null_layer- Create a null object layercreate_shape_layer- Create a shape layerget_layer- Get layer informationlist_layers- List all layers in a compositionupdate_layer_property- Update layer transform propertiesadd_keyframe- Add keyframes to animate propertiesset_layer_parent- Set layer parenting
Render Tools
add_to_render_queue- Add composition to render queuestart_render- Start rendering the queueget_render_status- Check render progressset_render_settings- Configure render settings
Expression Tools
set_expression- Set an expression on a layer property (NOT add_expression)get_expression- Get the expression from a layer propertyremove_expression- Remove an expression from a propertyenable_expression- Enable or disable an expressionbatch_set_expressions- Set multiple expressions at onceadd_wiggle_expression- Add a wiggle expression to a propertyadd_loop_expression- Add a loop expression to a propertylink_properties_with_expression- Link two properties togetheradd_expression_control- Add expression control effects (slider, checkbox, etc.)
Batch Tools
batch_create_comps- Create multiple compositions at oncebatch_import- Import multiple filesbatch_replace- Replace multiple itemsbatch_process- Process multiple items with a script
How It Works
File-Based Communication
The system uses a simple file-based approach for maximum reliability:
Commands Directory:
~/Documents/ae-mcp-commands/Command Format: JSON files with unique IDs
Response Format: Matching
.responsefilesAuto-Processing: CEP extension polls every 200ms
Example Command Flow
MCP server receives: "Create a 1080p composition"
Writes to:
~/Documents/ae-mcp-commands/cmd_123.json{ "id": "cmd_123", "script": "app.project.items.addComp('New Comp', 1920, 1080, 1, 10, 30);" }CEP extension executes the script
Writes response:
cmd_123.json.responseMCP server reads response and returns to client
CEP Extension
The CEP (Common Extensibility Platform) extension runs inside After Effects:
Auto Process Mode: Continuously monitors for new commands
Manual Process: Click to process commands on demand
Activity Log: Shows all processed commands and errors
Status Display: Real-time connection and processing status
Extension Features
Command processing with 200ms polling interval
Automatic error handling and recovery
Command history and logging
Visual status indicators
Manual command folder access
Troubleshooting
Extension Not Showing
Enable debug mode:
cd cep-extension ./enable-debug-mode.shRestart After Effects
Check Window > Extensions > AE MCP Bridge
Commands Not Processing
Verify "Auto Process: ON" in the extension panel
Check
~/Documents/ae-mcp-commands/for command filesLook for errors in the extension's activity log
Ensure After Effects has a project open
Common Issues
"Script access denied": Enable "Allow Scripts to Write Files" in AE Preferences
Extension won't load: Run the debug mode enabler and restart
Commands timeout: Check if After Effects is responding
Development
Project Structure
ae-mcp/
├── src/ # TypeScript source
│ ├── server/ # MCP server implementation
│ │ └── tools/ # Tool definitions
│ ├── ae-integration/ # After Effects communication
│ └── types/ # Type definitions
├── cep-extension/ # CEP extension
│ ├── CSXS/ # Extension manifest
│ ├── jsx/ # ExtendScript code
│ ├── js/ # Panel JavaScript
│ └── css/ # Panel styles
└── dist/ # Compiled outputAdding New Tools
Create tool definition in
src/server/tools/Implement ExtendScript generation
Add to appropriate tool category
Build and test
Testing
# Run tests
npm test
# Test individual commands
node dist/stdio-server-hybrid.jsExamples
See the examples/ directory for usage examples.
Additional Guides
Expression Tools Guide - Comprehensive guide for using expressions (IMPORTANT: use
set_expression, notadd_expression)Layer Ordering Guide - Understanding After Effects layer stacking
License
MIT License - see LICENSE file for details
Available Tools
92 toolsadd_adjustment_layerC
Add an adjustment layer to a composition
Inputs: compId (required), name.
add_camera_layerC
Add a camera layer to a composition
Inputs: compId (required), name, preset, focalLength.
add_elliptical_maskC
Add an elliptical mask to a layer
Inputs: compId (required), layerIndex (required), center (required), radius (required), +1 more.
add_expression_controlC
Add an expression control effect to a layer
Inputs: compId (required), layerIndex (required), controlType (required), name (required), +1 more.
add_light_layerC
Add a light layer to a composition
Inputs: compId (required), name, lightType, color, +1 more.
add_loop_expressionC
Add a loop expression to a property
Inputs: compId (required), layerIndex (required), propertyPath (required), loopType, +1 more.
add_maskC
Add a mask to a layer
Inputs: compId (required), layerIndex (required), name, maskShape.
add_null_layerC
Add a null object layer to a composition
Inputs: compId (required), name, is3D.
add_rectangular_maskC
Add a rectangular mask to a layer
Inputs: compId (required), layerIndex (required), bounds (required), name, +1 more.
add_shape_layerC
Add a shape layer to a composition with customizable properties
Inputs: compId (required), name, shapeType, properties.
add_shape_pathC
Add a path to a shape layer
Inputs: compId (required), layerIndex (required), path (required), groupName, +3 more.
add_solid_layerA
Add a solid color layer to a composition. Note: New layers are added on TOP (Layer 1). For backgrounds, create them last or use reorder_layers.
Inputs: compId (required), name, color, width, +1 more.
add_text_animatorC
Add a text animator to animate individual characters
Inputs: compId (required), layerIndex (required), properties (required), animatorName, +1 more.
add_text_layerC
Add a text layer to a composition
Inputs: compId (required), text (required), name.
add_text_layer_advancedC
Add a text layer with advanced formatting options
Inputs: compId (required), text (required), name, sourceText, +2 more.
add_to_render_queueC
Add a composition to the render queue
Inputs: compId (required), outputPath (required), outputModule, renderSettings.
add_wiggle_expressionC
Add a wiggle expression to a property
Inputs: compId (required), layerIndex (required), propertyPath (required), frequency, +4 more.
animate_mask_pathC
Animate a mask path with keyframes
Inputs: compId (required), layerIndex (required), maskIndex (required), keyframes (required).
animate_time_remapC
Set time remap keyframes for a layer (automatically enables time remapping)
Inputs: compId (required), layerIndex (required), keyframes (required), clearExisting.
apply_animation_presetC
Apply predefined animation presets
Inputs: compId (required), layerIndex (required), preset (required), duration, +2 more.
apply_easy_easeC
Apply Easy Ease to selected keyframes
Inputs: compId (required), layerIndex (required), propertyPath (required), keyframeIndices, +1 more.
apply_effectC
Apply an effect to a layer
Inputs: compId (required), layerIndex (required), effectName (required).
apply_expression_presetC
Apply a saved expression preset to a property
Inputs: compId (required), layerIndex (required), propertyPath (required), presetName (required), +1 more.
batch_create_layersA
Create multiple layers at once. IMPORTANT: Layers are created in order - first item becomes Layer 1 (top), last item becomes bottom layer. Create backgrounds LAST!
Inputs: compId (required), layers (required).
batch_executeA
Execute multiple commands in parallel. Commands are sent to After Effects simultaneously for faster processing.
Inputs: commands (required), sequential.
batch_keyframesB
Set multiple keyframes at once for better performance
Inputs: compId (required), keyframes (required).
batch_modify_layer_propertiesC
Modify properties of multiple layers at once for better performance
Inputs: compId (required), modifications (required).
batch_renderB
Add multiple compositions to render queue with same settings
Inputs: compIds (required), outputDirectory (required), outputFormat, outputModule.
batch_set_expressionsC
Set multiple expressions at once for better performance
Inputs: compId (required), expressions (required).
clear_render_queueC
Remove all items from the render queue
Inputs: confirmClear (required).
close_projectC
Close the current After Effects project
Inputs: saveChanges.
convert_keyframes_to_expressionC
Convert keyframed animation to an expression
Inputs: compId (required), layerIndex (required), propertyPath (required), expressionType, +1 more.
convert_mask_to_shapeC
Convert a mask to a shape layer path
Inputs: compId (required), layerIndex (required), maskIndex (required), createNewLayer, +1 more.
convert_text_to_shapeB
Convert text layer to shape layer (create outlines)
Inputs: compId (required), layerIndex (required), keepOriginal.
copy_keyframesC
Copy keyframes from one property to another
Inputs: compId (required), sourceLayer (required), sourceProperty (required), targetLayer (required), +3 more.
create_animation_curveC
Create an animation with custom curve
Inputs: compId (required), layerIndex (required), propertyPath (required), keyframes (required), +1 more.
create_compositionB
Create a new composition in the current project
Inputs: name (required), width, height, duration, +1 more.
create_projectC
Create a new After Effects project
Inputs: name (required), settings.
create_shape_from_pathC
Create a shape layer from a custom path
Inputs: compId (required), paths (required), name.
create_text_on_pathC
Create text that follows a path
Inputs: compId (required), text (required), path (required), textProperties.
delete_compositionC
Delete a composition from the project
Inputs: compId (required), confirmDelete (required).
delete_layerC
Delete a layer from a composition
Inputs: compId (required), layerIndex (required).
delete_maskC
Delete a mask from a layer
Inputs: compId (required), layerIndex (required), maskIndex (required).
duplicate_compositionC
Duplicate an existing composition
Inputs: compId (required), newName (required).
duplicate_layerC
Duplicate a layer within a composition
Inputs: compId (required), layerIndex (required).
enable_expressionC
Enable or disable an expression on a property
Inputs: compId (required), layerIndex (required), propertyPath (required), enabled (required).
execute_scriptC
Execute a custom ExtendScript in After Effects
Inputs: script (required), wrapInTransaction, undoGroupName.
export_frameC
Export a single frame from a composition
Inputs: compId (required), time (required), outputPath (required).
get_ae_versionB
Get After Effects version information
Inputs: no named parameters.
get_composition_infoC
Get detailed information about a specific composition
Inputs: compId (required).
get_expressionC
Get the expression from a layer property
Inputs: compId (required), layerIndex (required), propertyPath (required).
get_layer_infoC
Get detailed information about a layer
Inputs: compId (required), layerIndex (required).
get_mask_infoC
Get information about masks on a layer
Inputs: compId (required), layerIndex (required), maskIndex.
get_project_infoB
Get information about the current After Effects project
Inputs: no named parameters.
get_render_queueB
Get the status of all items in the render queue
Inputs: no named parameters.
import_footageC
Import footage (video, image, or audio) into the project
Inputs: filePath (required), folderName.
link_properties_with_expressionC
Link two properties together using an expression
Inputs: compId (required), sourceLayer (required), sourceProperty (required), targetLayer (required), +5 more.
list_compositionsB
List all compositions in the current project
Inputs: no named parameters.
modify_compositionC
Modify properties of an existing composition
Inputs: compId (required), properties (required).
modify_layer_3d_propertiesC
Modify 3D properties of a layer
Inputs: compId (required), layerIndex (required), properties (required).
modify_layer_propertiesC
Modify transform properties of a layer
Inputs: compId (required), layerIndex (required), properties (required).
modify_mask_pathC
Modify the path of an existing mask
Inputs: compId (required), layerIndex (required), maskIndex (required), maskShape (required), +1 more.
modify_shape_pathC
Modify an existing shape path
Inputs: compId (required), layerIndex (required), pathPropertyPath (required), path (required), +1 more.
modify_text_propertiesC
Modify text formatting properties
Inputs: compId (required), layerIndex (required), properties (required).
offset_keyframesC
Offset keyframes in time
Inputs: compId (required), layerIndex (required), propertyPath (required), offset (required), +1 more.
open_projectC
Open an existing After Effects project file
Inputs: filePath (required).
pause_renderB
Pause the current render process
Inputs: no named parameters.
pingA
Test connectivity with After Effects CEP extension
Inputs: no named parameters.
remove_expressionC
Remove an expression from a layer property
Inputs: compId (required), layerIndex (required), propertyPath (required).
reorder_layersC
Change the order of layers in a composition
Inputs: compId (required), layerIndex (required), newIndex (required).
reverse_keyframesC
Reverse the order of keyframes
Inputs: compId (required), layerIndex (required), propertyPath (required).
save_expression_presetC
Save an expression as a preset for reuse
Inputs: name (required), expression (required), category, description, +1 more.
save_projectC
Save the current After Effects project
Inputs: filePath.
scale_keyframe_timingC
Scale the timing of keyframes (stretch or compress animation)
Inputs: compId (required), layerIndex (required), propertyPath (required), scaleFactor (required), +1 more.
set_expressionC
Set an expression on a layer property
Inputs: compId (required), layerIndex (required), propertyPath (required), expression (required), +1 more.
set_keyframeC
Set a keyframe for a layer property
Inputs: compId (required), layerIndex (required), property (required), time (required), +1 more.
set_keyframe_advancedC
Set a keyframe with interpolation options
Inputs: compId (required), layerIndex (required), propertyPath (required), time (required), +2 more.
set_keyframe_interpolation_typeC
Set interpolation type for keyframes
Inputs: compId (required), layerIndex (required), propertyPath (required), keyframeIndex (required), +2 more.
set_keyframe_velocityC
Set velocity (speed graph) for keyframes
Inputs: compId (required), layerIndex (required), propertyPath (required), keyframeIndex (required), +2 more.
set_layer_3dC
Enable or disable 3D for a layer
Inputs: compId (required), layerIndex (required), is3D (required).
set_layer_blend_modeC
Set the blending mode of a layer
Inputs: compId (required), layerIndex (required), blendMode (required).
set_layer_parentC
Set parent-child relationship between layers
Inputs: compId (required), childLayerIndex (required), parentLayerIndex.
set_layer_qualityC
Set the quality/sampling of a layer
Inputs: compId (required), layerIndex (required), quality (required).
set_layer_visibilityC
Control layer visibility settings
Inputs: compId (required), layerIndex (required), visible, solo, +2 more.
set_mask_propertiesC
Set properties of a mask
Inputs: compId (required), layerIndex (required), maskIndex (required), properties (required).
set_motion_blurC
Configure motion blur for a layer
Inputs: compId (required), layerIndex (required), enabled (required), adjustmentLayer.
set_spatial_tangentC
Set spatial tangents for position keyframes (motion path)
Inputs: compId (required), layerIndex (required), keyframeIndex (required), inTangent, +1 more.
set_temporal_easeC
Set temporal ease (bezier handles) for keyframes
Inputs: compId (required), layerIndex (required), propertyPath (required), keyframeIndex (required), +2 more.
set_time_remappingC
Enable time remapping for a layer
Inputs: compId (required), layerIndex (required), enabled (required).
set_track_matteC
Set track matte for a layer
Inputs: compId (required), layerIndex (required), matteType (required).
start_renderB
Start rendering all items in the render queue
Inputs: no named parameters.
stop_renderB
Stop the current render process
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 92 tools
Most tools have distinct purposes, but some overlap exists, such as 'add_text_layer' and 'add_text_layer_advanced' or 'set_keyframe' and 'set_keyframe_advanced', which could cause confusion. However, descriptions help clarify differences, and the majority target specific actions on distinct resources like layers, masks, or compositions.
Tool names follow a highly consistent verb_noun pattern throughout, such as 'add_adjustment_layer', 'create_composition', and 'modify_layer_properties'. There are no deviations in style, making it easy to predict and understand the purpose of each tool.
With 92 tools, the count is excessive for an MCP server, making it overwhelming and difficult to navigate. While After Effects is a complex application, this many tools suggests poor scoping and could lead to inefficiency in tool selection and usage.
The tool set provides comprehensive coverage for After Effects operations, including creation, modification, animation, rendering, and project management. There are no obvious gaps; it supports full CRUD/lifecycle workflows for compositions, layers, masks, and effects, ensuring agents can handle complex tasks without dead ends.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
MCP server for Hailuo (MiniMax) AI video generation
MCP server for Wan AI video generation