Skip to main content
Glama
nguyenph88
by nguyenph88

Premiere-Pro-MCP

Control Adobe Premiere Pro with Claude. Started as "apply a Cross Dissolve at every cut in one sentence" — now a full beat-synced auto-edit toolchain:

You: here's a 60s music track and a folder of clips — build me a reel cut on the beat

Claude: detects 142.86 BPM → drops 34 bar markers → shuffles 12 clips into 35 beat slots, each sliced from a different part of its source → exactly 60.000s, zero gaps, every cut within half a frame of a downbeat → cross dissolves on all 34 cuts

Architecture — two MCP servers

            ┌─ premiere-pro (Node) ── stdio ⇄ WS bridge :3001 ⇄ UXP plugin in Premiere
Claude ─────┤
            └─ media-analysis (Python) ── stdio; beat detection, whisper, SRT, text-PNGs

Claude orchestrates between them: analysis tools return data (beats, transcripts) into the conversation; Claude makes the creative decisions (which clip in which slot); editing primitives execute them in Premiere.

Package

What

packages/protocol

Shared wire types for the bridge

packages/server

Node MCP server + embedded WebSocket bridge

packages/uxp-plugin

UXP panel inside Premiere (executes all timeline commands)

packages/analysis-server

Python MCP server (beat_this, faster-whisper, Pillow) — models lazy-load once and stay resident

Requirements

  • Windows (verified) or macOS, Node.js ≥ 20, uv

  • Adobe Premiere Pro 25.6+ (verified on 26.2.2)

  • Adobe UXP Developer Tools (UDT) from the Creative Cloud app

  • Claude Code or Claude Desktop

Install (one time)

git clone https://github.com/nguyenph88/Premiere-Pro-MCP.git
cd Premiere-Pro-MCP
npm install && npm run build
cd packages\analysis-server && uv sync && cd ..\..

Enable developer mode in Premiere: Edit ▸ Preferences ▸ Plug-ins ▸ check "Enable developer mode", restart Premiere. (Without it UDT can't see Premiere.)

Load the plugin: UDT ▸ Add Plugin ▸ packages/uxp-plugin/manifest.json ▸ Load & Watch. The "MCP Bridge" panel appears in Premiere.

Register both servers (Claude Code):

claude mcp add premiere-pro -- node "<repo>\packages\server\dist\index.js"
claude mcp add media-analysis -- uv run --directory "<repo>\packages\analysis-server" ppmcp-analysis

(Run claude mcp add from the folder you'll start Claude sessions in — registration is per-project-directory.)

Daily use

Launch Premiere → load plugin in UDT (once per Premiere launch) → start Claude → the panel dot goes 🟢.

Things to say

  • "apply a 1 second cross dissolve to every cut on V1" — the original classic; warns before overwriting existing transitions

  • "detect the beats of the music on A1 and mark them on the timeline"

  • "build a 60s beat-synced edit from the clips in D:\footage using song.mp3" — the full pipeline

  • "add a title that says MUI NE 2026 over the first 3 seconds" — rendered as transparent PNG, imported, placed on V2

  • "transcribe the voiceover and make subtitles" — produces an .srt; drag it into Premiere for native captions (the one manual step — Premiere's plugin API can't create caption tracks)

  • "show me the clips on V1", "what's in my project bin?"

Slash commands (project skills)

Repo-bundled skills in .claude/skills/ — all prefixed pp-. They wrap the tools below with the verified recipes and gotchas baked in:

Command

What it does

/pp-create-reel <music> <footage folder> [duration] [title]

Full beat-synced reel: cuts on downbeats, music on A1, dissolves on every cut, optional PNG title on V2. Ends at 59s by default, never 60 — YouTube rounds 60s+ past a minute.

/pp-mark-beats [beats|downbeats]

Detect the music on A1 and drop a marker per downbeat (or every beat) on the timeline ruler. Any length; markers chunked at 500/call.

/pp-add-cross-dissolve [duration]

Cross Dissolve at every cut on V1 in one bulk pass, default 1s centered.

Re-run semantics (the API has no per-marker/per-transition identity, so re-running a skill is wipe-and-replace): /pp-mark-beats clears ALL ruler markers and re-marks; /pp-add-cross-dissolve replaces ALL V1 transitions with a fresh uniform set (use its skip mode to keep hand-placed ones). Idempotent — running twice never duplicates.

Tools

premiere-pro (15): premiere_health, premiere_ping, get_project_info, list_sequences, get_sequence_clips, get_audio_clips (incl. media file paths), list_project_items, import_files, create_sequence, place_clip (slice via in/out + place at exact time — the beat-edit primitive), remove_clips, add_markers (batched, colored), list_available_transitions, apply_transition_to_all_cuts, apply_transition_to_clip.

media-analysis (6): analysis_health, detect_beats (beats + downbeats + BPM, any media format), find_best_moments (ranked most-interesting windows per clip — motion/sharpness/exposure scoring, ffmpeg+numpy, ~1s per clip), transcribe (faster-whisper, word timestamps), generate_srt, render_text_png (text overlays).

The beat-edit recipe (what /pp-create-reel does internally)

  1. detect_beats on the music → downbeat list; slot boundaries = [0] + downbeats under target + [target] (target 59s by default)

  2. Probe candidates (packages/analysis-server/tests/probe_media.py — duration/resolution/fps) and reject any footage with an audio stream — placed audio would land over the music and there is no audio-remove tool; then find_best_moments on each survivor — slices come from its ranked windows, and the single best window across all clips opens the reel (the hook)

  3. create_sequence from a clip (settings match media; prefer a 60fps seed for cut precision), clear the seed clip

  4. Place music sliced in=0, out=target in this one placement (audio on A1 can never be shortened later), then remove_clips its video item — the linked audio stays on A1

  5. Per downbeat slot: place_clip with a varying source slice, overshooting ~3 frames — the next overwrite trims it frame-tight (this defeats mp4 start-offset quirks). Strictly chronological; last slot gets an exact out, no overshoot

  6. add_markers at downbeats, apply_transition_to_all_cuts (0.5s reads better than 1s at 140+ BPM) to finish

Known limitations (Premiere 26.x UXP API)

  • No native text/titles → text is rendered to transparent PNGs (Pillow) and placed as overlays; re-render to change wording

  • No caption-track creation.srt is generated, you drag it in (5 seconds)

  • Existing transitions are count-only → bulk-apply warns and asks before overwriting; selective skip activates automatically if Adobe fixes the API

  • No clip speed changes, no razor (razor is emulated via slice-and-place)

  • MOGRT text is API-blocked — a prototype (see commit d7ced57, since removed) verified that SequenceEditor.insertMogrtFromPath inserts Essential Graphics fine and numeric/boolean params are settable via param.createKeyframe(value)createSetValueAction, but "Source Text" can be neither read nor written (Adobe-confirmed UXP gap, Feb 2026). Revisit when Adobe ships ExtendScript parity.

Troubleshooting (learned the hard way)

  • UDT "No applications are connected": enable developer mode in Premiere (above), restart Premiere.

  • Panel log Permission denied to the url ws://...: manifest must use "network": { "domains": "all" } (already set); UXP rejects per-URL localhost entries.

  • Manifest changes ignored on Reload: Unload → Load & Watch (UDT caches manifests).

  • PREMIERE_API_ERROR with own:{...} proto:{...} dumps: that's the built-in API-discovery reflection — the error shows the real object shape; fix the accessor in packages/uxp-plugin/src/handlers/, rebuild, UDT hot-reloads.

  • Tools say plugin not connected: the MCP Bridge panel must be open with a green dot; reload via UDT after every Premiere restart.

  • First detect_beats/transcribe call is slow: model download + load (one-time per process); subsequent calls are fast.

Dev

npm run build            # protocol + server + plugin
npm run watch:plugin     # pair with UDT Watch for hot reload
node scripts/smoke.mjs   # protocol round-trip without Premiere (isolated port 3199)
cd packages\analysis-server; uv run python tests/smoke.py   # synthesized 120BPM click-track test

Adding a Premiere tool: command in packages/protocol/src/commands.ts → handler in packages/uxp-plugin/src/handlers/ → register in dispatcher.ts → tool in packages/server/src/mcp/registerTools.ts. Adding an analysis tool: one decorated function in packages/analysis-server/src/ppmcp_analysis/server.py.

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
<1hResponse time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nguyenph88/Premiere-Pro-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server