Skip to main content
Glama

After Effects MCP - Enhanced Multilingual Edition

CI License: MIT Node.js MCP العربية

Control Adobe After Effects from any MCP client (Claude Code / Claude Desktop) using natural language: create and inspect comps and layers, animate, apply effects and presets, manage masks/cameras, render in the background, and run arbitrary ExtendScript - with first‑class Arabic / RTL support and tools that work on After Effects in any UI language.

This is an enhanced edition built on the original work of Dakkshin/after-effects-mcp. See CREDITS.md.

https://github.com/user-attachments/assets/af6419bd-5854-46f7-a0ba-49231697eb18

Built and rendered end to end from a single prompt, no manual keyframing.


✨ Why this edition

Area

This edition

Works in any AE language

All standard property lookups use locale‑independent matchNames → no breakage on Arabic/French/German/Japanese AE

Arabic / RTL text

create-text-layer auto‑detects Arabic, sets right‑to‑left direction and right alignment

Arbitrary scripting

execute-script runs any ExtendScript → reach every AE feature

Visual feedback

see-frame renders a frame back as an image so the AI can SEE its work and self-correct (no other AE MCP does this)

Deep inspection

inspect-comp / inspect-layer - see exact state before editing

Rendering

In‑app render queue and background aerender (no UI freeze)

Reliability

Per‑command IDs (no stale results), one undo group per command, faster polling, OneDrive‑proof shared folder, check-bridge health/version check

Layer management

Cameras, duplicate, delete, masks, batch transform, comp settings - as dedicated tools

48 tools total. Full details in ENHANCEMENTS.md.


Related MCP server: after-effects-mcp

📋 Prerequisites

  • Adobe After Effects 2022 or later

  • Windows or macOS. After Effects itself only runs on these two platforms, so the server is meant to run on the same machine as After Effects. The Node process starts on Linux and the CI builds and tests there, but there is no After Effects for it to drive.

  • Node.js 18+ - https://nodejs.org

  • An MCP client (e.g. Claude Code: npm install -g @anthropic-ai/claude-code)

🚀 Setup

git clone https://github.com/a-y-ibrahim/after-effects-mcp.git
cd after-effects-mcp
npm install              # installs + builds
npm run install-bridge   # copies the panel into AE's ScriptUI Panels

Then in After Effects:

  1. Enable scripting - Windows: Edit > Preferences > Scripting & Expressions; macOS: After Effects > Settings > Scripting & Expressions → enable “Allow Scripts to Write Files and Access Network”.

  2. Restart After Effects.

  3. Window > mcp-bridge-auto.jsx - keep this panel open.

Register the server with your MCP client:

claude mcp add AfterEffectsMCP node /absolute/path/to/after-effects-mcp/build/index.js

First test: ask your client to “check the After Effects bridge”. It should report bridgeVersion: 1.10.0-mcp-enhanced and versionMatch: true.

💡 If you edit the server, re‑run npm run build, then restart the MCP client. If you edit the bridge, also re‑run npm run install-bridge and restart After Effects.


🧰 Tools at a glance

Inspection & diagnostics - see-frame, contact-sheet, match-reference, inspect-comp, inspect-layer, get-results, check-bridge, run-bridge-test, get-help Composition & layers - create-composition, set-composition-properties, create-text-layer, localize-comp, create-camera, create-adjustment-layer, duplicate-layer, delete-layer, center-layers, set-layer-mask, batch-set-layer-properties Animation - setLayerKeyframe, setLayerExpression, get-layer-clip-frames Effects - apply-effect, add-any-effect, apply-effect-template, list-layer-effects, list-available-effects, set-effect-property, set-effect-keyframe, remove-effect, mcp_aftereffects_get_effects_help Presets - list-presets, search-presets, apply-preset Audio & markers - get-audio-info, set-audio-levels, analyze-audio-waveform, add-marker, add-markers-bulk Rendering - add-to-render-queue, render-queue, start-render, render-aerender, render-status Power - execute-script (arbitrary ExtendScript), run-script, test-animation

For project/comp overview you can also use run-script with getProjectInfo / listCompositions.

📖 Full reference: docs/TOOLS.md (all 48 tools) · docs/ARCHITECTURE.md (how the bridge works).


🌙 Arabic / RTL example

“Create a text layer that says ‘مرحبا بالعالم’”

create-text-layer detects the Arabic text and automatically sets right‑to‑left direction and right alignment. Use a font that supports Arabic (e.g. Tahoma, Cairo). For full Arabic shaping, enable the Middle‑Eastern text engine in After Effects (Windows: Preferences > Type; macOS: Settings > Type).


🩺 Troubleshooting

  • Anything times out / odd behavior → ask “check the After Effects bridge” first.

  • Version mismatch warning → re‑run npm run install-bridge, restart After Effects.

  • “Result file appears stale” → the panel isn’t running or can’t write files; reopen it and confirm scripting permission.

  • Windows + OneDrive → the shared folder is %LOCALAPPDATA%\ae-mcp-bridge (OneDrive‑proof). Override both sides with the AE_MCP_BRIDGE_DIR env var if needed.


🧪 Development

npm run build       # compile + copy the bridge script
npm run typecheck   # tsc --noEmit
npm test            # Vitest unit suite

Pure logic lives in src/lib/bridge-core.ts and is unit tested in tests/bridge-core.test.ts. CI type-checks and builds on Linux, macOS, and Windows across Node 18, 20, and 22, and runs the test suite on Node 20 and 22 (Vitest 4 requires Node 20+). See CONTRIBUTING.md for the architecture and how to add a tool.


📄 Credits & License

Licensed under the MIT License. Original work © 2025 Dakkshin; enhanced multilingual edition © 2026 Abdelrahman Youssef. See LICENSE and CREDITS.md.

Available Tools

50 tools
add-any-effectB

Add any After Effects effect to a layer by matchName or display name.

Inputs: effect (required), compIndex (required), layerIndex (required), effectSettings.

add-markerC

Add a marker to a layer or composition at a specified time. Markers can include a comment, label color, chapter name, URL and duration.

Inputs: compIndex (required), url, label, chapter, +6 more.

add-markers-bulkA

Add multiple layer or composition markers at once. Use this after analyze-audio-waveform to place markers at detected peaks, or to add any set of markers in a single call.

Inputs: markers (required), compIndex (required), layerName, layerIndex, +1 more.

add-to-render-queueA

Add a composition to the After Effects render queue and configure its output. Select the comp by compName (most reliable), compIndex (1-based among compositions), or leave both empty to use the active comp. Templates must already exist in this AE installation.

Inputs: endTime, compName, compIndex, startTime, +3 more.

analyze-audio-waveformA

Analyze an audio file to extract waveform amplitude data and detect peaks/transients. First call get-audio-info to retrieve the sourceFilePath, then pass it here. Returns normalized amplitude values (0-1) at evenly spaced time intervals plus an array of peak times where transients are detected. Uncompressed PCM WAV is read natively; any other format (mp3, m4a/aac, ogg, flac, a video file's audio track, ...) is transcoded on the fly via ffmpeg if it is installed and on PATH (override its location with the AE_FFMPEG_PATH env var).

Inputs: filePath (required), numPoints.

animate-from-dataA

Generate After Effects keyframes for a layer property directly from an arbitrary numeric data series - stock prices, sensor readings, scores, survey results, or any other time-ordered numbers (not audio; see animate-to-audio for that). Provide either data (explicit {time, value} points) or values + interval (an evenly-spaced series with an implied time step) - not both. Each raw value is normalized using [inputMin, inputMax] (auto-detected from the series when not given, so an unknown-range series still maps cleanly) and mapped to [outputMin, outputMax], with the same optional response curve and smoothing animate-to-audio uses. Targets a plain layer property (e.g. 'ADBE Opacity') by default, or an effect's property when effectIndex/effectName/effectMatchName is given.

Inputs: outputMax (required), outputMin (required), data, curve, +18 more.

animate-to-audioA

Generate After Effects keyframes for a layer property directly from an audio file's waveform, in one call - no need to call analyze-audio-waveform and compute keyframes by hand first. Two modes: 'waveform' follows the amplitude envelope continuously (a VU-meter style effect - glow intensity, scale, or opacity riding the music), one keyframe per analyzed sample. 'peaks' pulses the property at each detected transient/beat and decays back to baseline (a beat-pop style effect - e.g. a logo scaling up on every kick). Accepts any audio format ffmpeg supports (mp3, m4a/aac, ogg, flac, ...) the same way analyze-audio-waveform does; uncompressed WAV needs no extra dependency. Targets a plain layer property (e.g. 'ADBE Opacity') by default, or an effect's property when effectIndex/effectName/effectMatchName is given.

Inputs: filePath (required), outputMax (required), outputMin (required), mode, +18 more.

apply-effectC

Apply an effect to a layer in After Effects

Inputs: compIndex (required), layerIndex (required), effect, effectName, +5 more.

apply-effect-templateB

Apply a predefined effect template to a layer in After Effects

Inputs: compIndex (required), layerIndex (required), templateName (required), customSettings.

apply-presetB

Apply an After Effects .ffx preset file to a layer.

Inputs: compIndex (required), layerIndex (required), presetPath (required).

batch-set-layer-propertiesA

Set transform/visibility properties on MANY layers in one call. Each operation targets a layer by layerIndex or layerName and may set any of: threeDLayer, position, scale, rotation, opacity, blendMode, startTime, outPoint. Setting position clears its existing keyframes first.

Inputs: operations (required), compName, compIndex.

center-layersA

Center one layer, selected layers, or all layers in a composition.

Inputs: compIndex (required), allLayers, layerName, layerIndex, +1 more.

check-bridgeA

Health check: verify the After Effects MCP Bridge panel is open and responding, report its version, the AE version, the shared bridge folder, and the open project/active comp. Run this FIRST when anything times out or behaves oddly. If it reports a version mismatch, re-run npm run install-bridge and restart After Effects.

Inputs: no named parameters.

contact-sheetA

See a composition's whole timeline at a glance: render N frames sampled across the duration and composite them into ONE labeled thumbnail grid, returned as a single image. Use this to perceive motion, timing, and easing cheaply (one image instead of many). Select the comp by name or 1-based index, or leave empty for the active comp.

Inputs: comp, count, maxWidth, timeoutMs.

create-adjustment-layerA

Create an adjustment layer in the specified composition (or active comp).

Inputs: name, size, compName, duration, +2 more.

create-cameraA

Create a camera layer in a composition. Select the comp by compName/compIndex (or active comp).

Inputs: name, zoom, oneNode, compName, +3 more.

create-compositionA

Create a new composition in After Effects with specified parameters

Inputs: name (required), width (required), height (required), duration, +3 more.

create-text-layerA

Create a text layer with full Arabic / RTL support. Direction is auto-detected from the text by default (Arabic -> right-to-left, right-aligned), or force it with direction. Works on After Effects in any language.

Inputs: text (required), color, compName, duration, +6 more.

delete-layerB

Delete a layer from a composition. Target the layer by layerIndex or layerName.

Inputs: compName, compIndex, layerName, layerIndex.

duplicate-layerA

Duplicate a layer in a composition, optionally renaming the copy. Target the layer by layerIndex or layerName.

Inputs: newName, compName, compIndex, layerName, +1 more.

execute-scriptA

Run ARBITRARY ExtendScript (the After Effects scripting DOM) inside After Effects and return the result. This is the most powerful tool: use it for anything the dedicated tools do not cover - masks, track mattes, parenting, 3D layers/cameras/lights, blending modes, precomposing, time remapping, layer styles, text animators, puppet pins, importing/replacing footage, batch edits across many layers, project-wide changes, etc. Your code runs as the body of a function, so use return <value>; to send data back, and return only JSON-serializable values (numbers, strings, arrays, plain objects). The whole script already runs inside one undo group, so do NOT call app.beginUndoGroup yourself. Use app and app.project to reach everything. On error you get back the message and line number. Example script: "var c = app.project.activeItem; return { name: c.name, layers: c.numLayers };"

Inputs: script (required), timeoutMs.

get-audio-infoA

Get audio metadata, source file path, existing markers, and audio level keyframes for a layer in After Effects.

Inputs: compIndex (required), layerName, layerIndex.

get-helpB

Get help on using the After Effects MCP integration

Inputs: no named parameters.

get-layer-clip-framesB

Get a layer's clip start/end frames, source frame range, and duration in frames.

Inputs: compIndex (required), layerName, layerIndex.

get-resultsA

Get results from the last script executed in After Effects

Inputs: no named parameters.

inspect-compA

Map a whole composition: its settings (size, fps, duration, work area) plus every layer with a useful summary - index, id, name, type, enabled/locked/shy/solo, 3D/adjustment/null flags, in/out/start, parent, blend mode, effect count, mask count, has-audio. Use this to navigate a comp and decide what to edit, then call inspect-layer for one layer's full detail. Select the comp by compName/compIndex, or leave both empty for the active comp.

Inputs: compName, compIndex.

inspect-layerA

Deeply inspect ONE layer so you can SEE its exact state before making precise edits: type, enabled/locked/shy/solo, in/out points, parent, blend mode, 3D flag; the full Transform group (each property's value + expression + keyframes with times/values/interpolation); all effects with their property values; masks (mode/inverted/opacity/feather/expansion); markers; source file/dimensions; and text (font/size/fill) for text layers. Select the comp by compName/compIndex (or active comp) and the layer by layerIndex or layerName.

Inputs: compName, compIndex, layerName, layerIndex, +2 more.

list-available-effectsA

List all effects available in this After Effects installation, with optional text filter.

Inputs: query, maxResults, includeObsolete.

list-layer-effectsC

List effects on a layer, with optional recursive property details.

Inputs: compIndex (required), layerIndex (required), maxDepth, includeValues, +1 more.

list-presetsA

List available After Effects .ffx presets from common or provided folders.

Inputs: maxDepth, recursive, maxResults, presetRoots.

localize-compA

Create a localized duplicate of a composition: swap in translated text for one or more text layers, auto-detecting Arabic and applying right-to-left direction/alignment (same logic as create-text-layer). Every other layer, effect, and animation is preserved unchanged because the whole composition is duplicated first. Text layers nested inside precompositions are reachable too via path: every precomposition on the path is safely duplicated the first time it's encountered (and reused if referenced again from another path), so the original precomps are never modified. Translation itself is the caller's job; pass the already-translated strings in translations.

Inputs: translations (required), compName, compIndex, newCompName.

match-referenceA

Compare a composition against a reference image: renders the current frame, then returns a side-by-side (reference vs current) AND a difference map (bright where they differ) so you can see exactly WHERE the render deviates and converge on a match. Provide the reference as an on-disk image path. Select the comp by name or 1-based index, or leave empty for the active comp.

Inputs: referencePath (required), comp, time, timeoutMs.

mcp_aftereffects_get_effects_helpB

Get help on using After Effects effects

Inputs: no named parameters.

remove-effectB

Remove one specific effect (or all effects) from a layer.

Inputs: compIndex (required), layerIndex (required), removeAll, effectName, +2 more.

render-aerenderA

Render a composition to a file in the BACKGROUND using aerender (a separate headless After Effects process). Unlike start-render, this does NOT freeze your After Effects UI - you can keep working. REQUIREMENT: the project must be saved to disk (aerender renders the saved .aep). By default it saves the open project first and renders it; pass projectPath to render a specific .aep instead. Returns immediately after starting unless you pass waitMs. Check progress with render-status.

Inputs: compName (required), outputPath (required), waitMs, endFrame, +5 more.

render-queueA

Inspect or manage the After Effects render queue: list items with their status and output path, clear the whole queue, or remove a single item by index.

Inputs: index, action.

render-statusA

Check background aerender renders started with render-aerender: which are still running, which finished, and the tail of each render log.

Inputs: pid.

run-bridge-testA

Run the bridge test effects script to verify communication and apply test effects

Inputs: no named parameters.

run-scriptA

Run a read-only script in After Effects

Inputs: script (required), parameters.

search-presetsB

Search After Effects .ffx presets by name or path.

Inputs: query (required), maxDepth, recursive, maxResults, +1 more.

see-frameA

SEE what a composition actually looks like: render one or more frames to images and return them so you can visually verify and self-correct (make a change, look, fix). Use this after edits to catch problems the DOM does not reveal - clipped or empty text, blown-out glow, off-frame layers, wrong colors, or Arabic/RTL text that did not shape correctly. Select the comp by name or 1-based index, or leave empty for the active comp. Returns downscaled preview images by default (maxWidth 512) to keep it fast and cheap; pass maxWidth 0 for a native-resolution still. Note: a still is a still - time-based effects like motion blur may look different from playback.

Inputs: comp, times, maxWidth, timeoutMs, +2 more.

set-audio-levelsA

Set the audio levels (in dB) for an audio or AV layer. Supports per-channel control and optional keyframing.

Inputs: compIndex (required), layerIndex (required), level, leftLevel, +2 more.

set-composition-propertiesA

Change a composition's settings: duration, frameRate, and/or width+height. Select the comp by compName/compIndex (or active comp).

Inputs: width, height, compName, duration, +2 more.

set-effect-keyframeB

Set an effect property keyframe with optional graph interpolation and easy-ease controls.

Inputs: compIndex (required), layerIndex (required), value, effectName, +8 more.

set-effect-propertyB

Set or keyframe any property on an existing layer effect using name/index/path.

Inputs: compIndex (required), layerIndex (required), value, effectName, +9 more.

setLayerExpressionB

Set or remove an expression for a specific layer property.

Inputs: compIndex (required), layerIndex (required), propertyName (required), expressionString (required).

setLayerKeyframeB

Set a keyframe for a specific layer property at a given time.

Inputs: compIndex (required), layerIndex (required), propertyName (required), timeInSeconds (required), +1 more.

set-layer-maskA

Create or modify a mask on a layer. Provide the shape as maskRect (rectangle shorthand) OR maskPath (array of [x,y] vertices, >= 3). Omit maskIndex to add a new mask, or pass it to modify an existing one.

Inputs: compName, maskMode, maskName, maskPath, +8 more.

start-renderA

Render all QUEUED items in the After Effects render queue. IMPORTANT: this BLOCKS After Effects until the render finishes - the AE UI is unresponsive during the render. Add items first with add-to-render-queue. For long renders, raise timeoutMs; if the wait times out the render still continues in AE and you can check status later with render-queue.

Inputs: timeoutMs.

test-animationD

Test animation functionality in After Effects

Inputs: compIndex (required), operation (required), layerIndex (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 50 tools

    Disambiguation2/5

    Several tools have overlapping or unclear boundaries, such as run-script vs execute-script, apply-effect vs add-any-effect, and check-bridge vs run-bridge-test. Multiple help tools (get-help, mcp_aftereffects_get_effects_help) and rendering tools (start-render, render-aerender) could confuse an agent. The descriptions help but the overlaps are significant enough to cause misselection.

    Naming Consistency3/5

    Most tool names follow a kebab-case verb-noun pattern (e.g., create-composition, list-layer-effects), but there are notable inconsistencies: setLayerKeyframe and setLayerExpression use camelCase, and mcp_aftereffects_get_effects_help uses snake_case with a prefix. While still readable, the mixed conventions are more than minor deviations.

    Tool Count2/5

    With 50 tools, the set is very large and exceeds the 25+ threshold for 'too many'. While After Effects is complex, many tools overlap (e.g., three ways to apply effects, two script runners, two render methods), inflating the count. A more focused set of ~20-30 tools would likely cover the same functionality with less redundancy.

    Completeness4/5

    The tool set covers a broad range of After Effects operations: compositions, layers, effects, presets, text, audio, animation, inspection, and rendering. Minor gaps exist, such as no direct tool for listing all compositions or deleting a composition, but these can be worked around via execute-script, and the overall lifecycle is well covered.

    Related MCP Connectors

    Related MCP Servers