Skip to main content
Glama

OpenShowreel

An open-source Model Context Protocol (MCP) server for Adobe After Effects — built so an AI assistant can drive After Effects the way a senior motion designer does: not just dropping keyframes, but applying the mechanics that make a showreel feel premium.

The goal is simple: let an agent take a brief ("animate this UI walkthrough as a 60fps showreel") and produce buttery-smooth, organically-timed motion using the same techniques pros reach for by hand.


Why this exists

Most automated AE tooling produces stiff, robotic motion — linear paths, simultaneous movement, hard fades. The difference between "a computer animated this" and "a designer animated this" comes down to a handful of repeatable mechanics. OpenShowreel encodes those mechanics as MCP tools so they can be composed programmatically.


Related MCP server: After Effects MCP

Core After Effects mechanics the server models

1. 60 FPS + Motion Blur (the baseline for "premium")

Before anything is animated, the composition is set to 60 frames per second and motion blur is enabled. This is the single biggest lever for a "buttery smooth" look — every other technique builds on top of it.

2. Morphing shapes

Basic shape layers become expressive when you uncheck "Constrain Proportions" on the Size property. That lets the X and Y axes scale independently — e.g. a moving button can appear to physically push and stretch a background frame as it travels.

3. Expressions over manual keyframes

Instead of hand-animating physics, the server pastes bounce expressions (small code snippets) into the stopwatch of properties like Scale or Position. Physics for free, tweakable by parameter.

4. Timing offsets — the secret to organic motion

Nested elements should never move with their parent — they lag, just slightly. By appending .valueAtTime(time - 0.1) to an expression, child elements (an arrow inside a button, an icon inside a card) are mathematically forced to animate a fraction of a second behind their container. This kills the stiff, "everything moves at once" feel.

5. Simulated micro-interactions

To make a digital interface feel tactile, the server adds a quick scale-down "button press" keyframe right before a major on-screen movement begins — the same anticipation beat a real tap would produce.


Essential tools the server wraps

Parenting & the Pick Whip

Linking properties together: pick-whip an icon's Scale to its container's Scale, or parent text to a moving shape so it tracks along automatically.

Text Animators + Expression Selectors

Premium text reveals don't just fade in. A Text Animator pushes the starting Position off-screen (e.g. Y → -100) with Opacity at 0%, then an Expression Selector pulls the text into place per-word or per-character — staggered, not all at once.

Null Objects for curved paths

Straight linear motion looks unnatural, so paths are drawn with the pen tool and curved. But curve data can make an object drift when it's meant to be stationary. The fix: snap an invisible Null Object's anchor point to the shape's center, parent the shape to the Null, and animate the Null instead — clean movement, no drift.

The master "camera" finisher

The ultimate polish: create one final master Null Object, attach every otherwise-unlinked element to it, apply an expression, and add a very slight rotation (a small positive tilt followed by a negative one). Moving the whole composition together "stitches it all" into a single cinematic move.



How it works

OpenShowreel is a Node MCP server. Each tool generates a small ExtendScript snippet and runs it inside a running After Effects via macOS AppleScript (osascript → DoScript), wrapped in an undo group, with the result handed back through a temp file. No After Effects panel/extension to install — just the CLI server.

MCP client (Claude, etc.)  ──stdio──►  openshowreel server  ──osascript/DoScript──►  After Effects

Requirements

  • macOS with Adobe After Effects installed (auto-detects the newest Adobe After Effects <year> under /Applications; override with AE_APP_NAME).

  • After Effects must be running, with Preferences ▸ Scripting & Expressions ▸ "Allow Scripts to Write Files and Access Network" enabled.

  • Node.js ≥ 18.

Build & run

npm install
npm run build
npm start          # or: npm run dev   (runs from source via tsx)
npm test           # tool-builder + dry-run tests — no After Effects needed

Set OPENSHOWREEL_DRY_RUN=1 to make every tool report what it would run instead of touching After Effects — handy for testing the wiring.

Register with an MCP client

{
  "mcpServers": {
    "openshowreel": {
      "command": "node",
      "args": ["/absolute/path/to/openshowreel/dist/index.js"]
      // optional: "env": { "AE_APP_NAME": "Adobe After Effects 2025" }
    }
  }
}

Tools

Composition & inspection

Tool

What it does

ae_scene_info

Inspect comps, layers, fps, motion-blur state

ae_setup_comp

New comp at 60 fps + motion blur — the premium baseline

ae_save_project

Save / save-as the .aep

Layers

Tool

What it does

ae_create_shape

Rounded-rect / ellipse shape layer with a fill (button, frame…)

ae_create_solid

Solid-colour layer (background / colour wash)

ae_create_text

Plain text layer

ae_import_media

Import an image / video / audio file, optionally place it in a comp

ae_parent_layer

Layer-level pick-whip / parenting

ae_link_property

Pick-whip one property to another via expression

Motion mechanics

Tool

Maps to the mechanic

ae_animate_transform

Keyframe position / scale / rotation / opacity A→B with an easing preset

ae_set_easing

Re-ease existing keyframes (linear / easeIn / easeOut / easeInOut / hold)

ae_add_fade

Opacity fade-in / fade-out at the layer in/out points

ae_morph_size

Animate Size on one axis only — the "constrain proportions OFF" stretch

ae_add_bounce_expression

Paste a physics bounce/overshoot expression onto scale / position / rotation

ae_add_timing_offset

.valueAtTime(time − delay) — make a child trail its parent for organic motion

ae_add_button_press

Tactile scale-down dip just before a major move

ae_add_text_reveal

Text Animator + Expression Selector staggered reveal (per char / word / line)

ae_create_null_path

Pin a layer to an invisible Null, keyframe a curved, drift-free path

ae_add_master_camera

One master Null over everything + slight tilt expression — the cinematic stitch

Effects, masks, mattes, camera

Tool

What it does

ae_add_effect / ae_set_effect_param

Add any effect; set or keyframe any parameter

ae_add_drop_shadow / ae_add_glow / ae_add_gaussian_blur

One-call effect presets

ae_add_adjustment_layer

Full-frame adjustment layer for a global grade/treatment

ae_set_blend_mode

Layer blending modes (screen, add, multiply, …)

ae_add_mask / ae_animate_mask

Rect/ellipse masks; keyframe expansion or feather for wipes

ae_add_trim_path

Trim Paths line draw-on (adds a stroke if needed)

ae_set_track_matte

Use the layer above as an alpha/luma matte

ae_set_layer_3d

Toggle the 3D switch on a layer (or all of them)

ae_add_camera / ae_animate_camera

Add a camera; keyframe a dolly / push-in / pan

Scenes, timing, output, escape hatch

Tool

What it does

ae_create_precomp

Precompose layers into a scene

ae_add_layer_to_comp

Drop a precomp / footage item into another comp

ae_add_markers

Comp or layer markers (beat / section sync)

ae_enable_time_remap / ae_animate_time_remap

Speed ramps / freezes / reverse on footage & precomps

ae_add_device_frame

Wrap a layer in a card / browser / phone mockup

ae_render_frame / ae_render_frames

Render frame(s) to PNG and return the path(s) — the agent's review loop

ae_render_comp

Render a comp to a video file via the Render Queue

ae_save_project

Save / save-as the .aep

ae_eval

Run arbitrary ExtendScript

See docs/SHOWREEL_PLAYBOOK.md for how to sequence these into a polished reel, and examples/demo-showreel.mjs for a runnable mini-build.

Notes: ExtendScript match-names target current After Effects builds — if a tool errors on another version, ae_eval lets you patch around it (PRs welcome). Under the Advanced 3D renderer the .value getter on shape-layer spatial properties can throw, so OpenShowreel never reads it: pass from explicitly to ae_animate_transform if you need a non-default start value.


Status

🚧 Active development — the bridge and ~40 tools (composition, layers, motion mechanics, effects, masks/mattes, 3D camera, precomps, time remap, device mockups, rendering) are in place and verified live against After Effects 2026. Live behaviour depends on your After Effects version; expect to file/fix the odd match-name. The remaining gap toward fully autonomous reels is mostly direction + assets, not capability — see the playbook.

License

MIT — see LICENSE.

Available Tools

43 tools
ae_add_adjustment_layerA

Add a full-frame adjustment layer at the top of the stack — apply effects to it (e.g. via ae_add_effect / ae_add_glow) to grade or treat the whole comp at once.

Inputs: comp, name.

ae_add_bounce_expressionA

Apply a physics 'bounce' (overshoot) expression to a property (scale, position, or rotation) instead of hand-keying springiness. Once applied, any keyframe you set on that property will overshoot and settle naturally. Based on the well-worn Dan Ebberts overshoot — robust against overflow.

Inputs: layer (required), comp, property, amplitude, +2 more.

ae_add_button_pressA

Add a tactile 'button press' micro-interaction: a quick scale-down dip and release just before a major on-screen movement begins. Inserts three Scale keyframes around atTime (assumes the layer rests at 100% scale).

Inputs: layer (required), atTime (required), comp, depth, +1 more.

ae_add_cameraB

Add a Camera layer to the comp (becomes the active camera). Animate it with ae_animate_camera — remember 2D layers need their 3D switch on (ae_set_layer_3d) to be affected.

Inputs: comp, name, enableDepthOfField, focusDistance, +1 more.

ae_add_device_frameA

Wrap a layer in a mockup frame — 'card' (rounded panel + shadow), 'browser' (panel + a top chrome bar with traffic-light dots), or 'phone' (tall rounded panel). The content layer is parented to the frame so they move together. Best on footage/precomp layers (a screenshot or UI scene).

Inputs: layer (required), comp, style, contentSize, +4 more.

ae_add_drop_shadowA

Convenience: add a soft Drop Shadow to a layer with sensible defaults (you can fine-tune via ae_set_effect_param afterwards).

Inputs: layer (required), comp, opacity, softness, +3 more.

ae_add_effectA

Add an effect to a layer by name or match-name (e.g. 'Drop Shadow', 'Gaussian Blur', 'CC Light Sweep', or a match-name like 'ADBE Drop Shadow'). Returns the effect's parameter names so you know what ae_set_effect_param can target.

Inputs: layer (required), effect (required), comp.

ae_add_fadeC

Add an opacity fade-in and/or fade-out at the layer's in/out points, eased.

Inputs: layer (required), comp, fadeIn, fadeOut, +1 more.

ae_add_gaussian_blurC

Convenience: add Gaussian Blur to a layer (use a small amount for depth, or keyframe it for a focus pull / transition).

Inputs: layer (required), comp, blurriness, repeatEdgePixels, +1 more.

ae_add_glowA

Convenience: add a Glow effect to a layer (great for UI highlights / logos). Tune further with ae_set_effect_param.

Inputs: layer (required), comp, threshold, radius, +1 more.

ae_add_layer_to_compB

Add an existing composition (a precomp/scene) or imported footage item into another composition as a layer.

Inputs: source (required), targetComp, position.

ae_add_markersA

Add markers at the given times — on the composition timeline (for beat/section sync) or on a specific layer. Optional labels.

Inputs: times (required), comp, labels, layer.

ae_add_maskA

Add a rectangular or elliptical mask to a layer. Bounds are in the layer's own pixel space ([left, top, right, bottom]); omit them to mask the whole layer. Combine with ae_animate_mask for wipe-style reveals.

Inputs: layer (required), comp, shape, bounds, +5 more.

ae_add_master_cameraA

The cinematic finisher: create one master Null at the comp's centre, parent every otherwise-unparented layer to it, and add a Rotation expression with a very slight tilt (positive easing to negative) so the whole composition moves together as one — 'stitching it all'.

Inputs: comp, layers, tiltDegrees, driftPx, +1 more.

ae_add_text_revealA

Word-by-word staggered text reveal — not a flat fade. A Text Animator pushes each unit off-screen (Position offset) at 0% opacity; an Expression Selector pulls one chunk into place at a time. Defaults to words; set chunkSize=2 to reveal two words at a time, or basedOn=characters for a typewriter feel.

Inputs: text (required), comp, name, position, +9 more.

ae_add_timing_offsetA

The 'organic motion' trick: make a nested element trail its parent/leader by a fraction of a second using .valueAtTime(time - delay), so things don't move in stiff unison (e.g. an arrow inside a button arrives just after the button).

Inputs: layer (required), leaderLayer (required), comp, property, +1 more.

ae_add_trim_pathA

Add Trim Paths to a shape layer and (by default) animate it so the stroke draws on. Adds a stroke first if the shape has none. Best on shapes made by ae_create_shape.

Inputs: layer (required), comp, drawOn, startTime, +4 more.

ae_animate_cameraA

Keyframe a camera's position and/or point of interest between two 3D points — a dolly / push-in / pan. If no camera name is given, the first camera in the comp is used.

Inputs: comp, camera, positionFrom, positionTo, +5 more.

ae_animate_maskA

Keyframe a mask's expansion or feather between two values — e.g. animate expansion from a small value to large to wipe a layer on/off.

Inputs: layer (required), from (required), to (required), comp, +5 more.

ae_animate_time_remapA

Keyframe Time Remapping on a layer — each key maps a comp time to a source time (slow-mo, speed-up, freeze, reverse). Enables time remapping first if needed.

Inputs: layer (required), keys (required), comp, easing.

ae_animate_transformA

Keyframe a transform property (position / scale / rotation / opacity) from one value to another between two times, with an easing preset. The general-purpose 'move this from A to B smoothly' tool. If from is omitted it defaults to a sensible rest value (position→comp centre, scale→100%, rotation→0°, opacity→0%) — pass it explicitly to start somewhere else.

Inputs: layer (required), property (required), to (required), comp, +5 more.

ae_create_null_pathA

Move a layer along a (optionally curved) path the safe way: create an invisible Null whose pivot the layer is pinned to, parent the layer to the Null, and keyframe the Null's position through your points. When the Null is stationary the layer can't drift — which raw curved keyframes on the layer itself would cause. NOTE: the layer is repositioned to ride the Null, so make points[0] its desired start.

Inputs: layer (required), points (required), comp, startTime, +3 more.

ae_create_precompA

Precompose layers into a new composition (a 'scene') — keeps things organised and lets you apply effects/transforms to a whole group at once.

Inputs: layers (required), comp, name, moveAllAttributes.

ae_create_shapeB

Add a shape layer (rounded rectangle or ellipse) with a solid fill — e.g. a UI button or a background frame. Position is the layer's transform position; the shape geometry is drawn around it.

Inputs: comp, name, kind, size, +3 more.

ae_create_solidB

Add a solid-colour layer — handy as a background or a colour wash. Defaults to comp size.

Inputs: comp, name, color, width, +3 more.

ae_create_textA

Add a plain text layer (no animator). For an animated reveal use ae_add_text_reveal instead.

Inputs: text (required), comp, name, position, +4 more.

ae_enable_time_remapA

Enable Time Remapping on a layer whose source has a duration (footage, comp/precomp). Then keyframe it with ae_animate_time_remap for speed ramps / freeze frames.

Inputs: layer (required), comp.

ae_evalA

Escape hatch: run arbitrary ExtendScript inside After Effects. The code may return a value. Helpers under OSR are available (OSR.comp, OSR.layer, OSR.tprop, ...). Prefer the specific tools when one fits.

Inputs: code (required).

ae_import_mediaC

Import an image / video / audio file into the project, and optionally place it in a composition.

Inputs: filePath (required), addToComp, comp, position, +1 more.

ae_morph_sizeA

Animate a shape's Size on one axis independently (the 'constrain proportions OFF' trick) — so a moving button can look like it physically stretches a background frame. Keyframes the layer's first rectangle/ellipse Size between two times.

Inputs: layer (required), to (required), comp, from, +3 more.

ae_parent_layerA

Parent one layer to another (the layer-level 'pick whip'): the child then inherits the parent's transforms. Pass parent=null to unparent. Visual position is preserved.

Inputs: child (required), comp, parent.

ae_render_compA

Render a composition to a video file via the Render Queue. Blocking — can take a while. Returns the output path on success.

Inputs: outputPath (required), comp, template, renderSettingsTemplate.

ae_render_frameA

Render a single frame of a composition to a PNG and return its file path — use it to actually look at what you've built. Fast (no Render Queue).

Inputs: comp, time, outputPath.

ae_render_framesA

Render several frames of a composition to PNGs at once — use it to review motion across a range of times. Returns the saved file paths.

Inputs: times (required), comp, outputDir, prefix.

ae_save_projectA

Save the After Effects project (.aep). Pass a path to save-as / create the file; omit it to save in place (requires the project to already have a file).

Inputs: path.

ae_scene_infoA

Inspect the After Effects project: lists every composition with its size, frame rate, duration, motion-blur state, and layers (with parents). Use this first to see what exists.

Inputs: no named parameters.

ae_set_blend_modeC

Set a layer's blending mode (normal, multiply, screen, overlay, add, lighten, darken, soft-light, hard-light, color-dodge, color-burn, difference, luminosity).

Inputs: layer (required), comp, mode.

ae_set_easingA

Re-ease the existing keyframes of a transform property with a preset (linear / easeIn / easeOut / easeInOut / hold). Use after manual keyframing, or to dial in the feel of an already-animated property.

Inputs: layer (required), property (required), comp, easing, +1 more.

ae_set_effect_paramB

Set a parameter of an effect on a layer (or keyframe it at a time). Reference the effect and parameter by name or 1-based index.

Inputs: layer (required), effect (required), param (required), value (required), +2 more.

ae_set_layer_3dA

Toggle a layer's 3D switch (or every layer in the comp). Required before a camera move affects 2D layers.

Inputs: comp, layer, allLayers, enabled.

ae_set_track_matteA

Use the layer directly above as a track matte for this layer (alpha or luma, normal or inverted). Pass 'none' to clear it. The matte layer should be just above the target in the layer stack.

Inputs: layer (required), comp, type.

ae_setup_compB

Create a composition configured for premium motion: 60 fps and motion blur ON by default — the baseline 'buttery smooth' look. Returns the comp name.

Inputs: name, width, height, fps, +4 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 43 tools

    Disambiguation5/5

    Each tool targets a distinct After Effects operation with clear, detailed descriptions that prevent confusion. Even tools like ae_add_effect and ae_add_gaussian_blur are differentiated by generality vs. specificity, and ae_animate_transform vs. ae_morph_size have well-defined boundaries.

    Naming Consistency5/5

    All tools follow the consistent pattern 'ae_<verb>_<noun>', such as ae_add_adjustment_layer, ae_animate_camera, and ae_setup_comp. No mixing of conventions, making the tool set highly predictable.

    Tool Count2/5

    With 43 tools, the server exceeds the 'too many' threshold (25+) defined in the rubric. While the domain of After Effects is complex, the tool count is heavy and could overwhelm an agent, reducing focus on core workflows.

    Completeness4/5

    The tool set covers a wide range of After Effects tasks: adding layers, effects, animations, masks, cameras, rendering, and project management. Minor gaps exist (e.g., no direct text style manipulation or advanced expression editing), but core motion graphics workflows are well-supported.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers