Skip to main content
Glama
README.md
# 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.

---

## 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

```bash
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

```jsonc
{
  "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`](docs/SHOWREEL_PLAYBOOK.md)** for how to sequence these into a polished reel, and [`examples/demo-showreel.mjs`](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](LICENSE).

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 issues