Adobe Premiere Pro CLI, Python library, and MCP server. Automate editing, sequencing, and export with LLM-friendly tools for AI agents. Declarative, scriptable, structured JSON output.
Project description
prpr
The missing CLI, Python library, and MCP server for Adobe Premiere Pro.
Declarative. Scriptable. LLM-friendly. Structural sibling of dvr (the same project for DaVinci Resolve) — same namespaces, same routing, same error model.
prpr is a command-line tool, a typed Python library, and a Model Context Protocol (MCP) server for automating Adobe Premiere Pro — editing, sequencing, effects, and export. It drives Premiere's UXP API through a bundled bridge plugin, wraps it in clean idempotent operations with structured JSON output, and makes it usable by humans, scripts, and AI agents (Claude, Cursor, and any MCP-compatible client).
pip install prpr
$ prpr timeline inspect
{
"name": "Edit_v1",
"fps": 23.976,
"duration_frames": 4274,
"frame_size": {"width": 1920, "height": 1080},
"tracks": {
"video": [{"index": 0, "name": "Video 1", "clips": 2, "items": [...]}],
"audio": [{"index": 0, "name": "Audio 1", "clips": 2, "items": [...]}]
},
"markers": [{"name": "start", "start": {"seconds": 1.0}, ...}]
}
How it connects
Premiere has no external scripting socket — its UXP API runs inside the app, and UXP plugins can only dial out. So prpr inverts the connection:
prpr CLI / library / MCP ──hosts──▶ ws://127.0.0.1:8855 ◀──dials in── prpr bridge panel (UXP, inside Premiere)
One-time setup:
prpr plugin install # installs the headless bridge via Adobe's installer
# restart Premiere once so it registers the plugin
prpr doctor --probe # verify the whole chain
The bridge is headless — a command-entrypoint UXP plugin that starts with Premiere automatically. There's no panel to open or keep open.
Why prpr exists
Premiere's UXP API is powerful but locked inside the app:
- No external process access. Resolve ships a Python API; Premiere gives you a JavaScript sandbox in a panel.
- Action/transaction ceremony. Every mutation needs
lockedAccess+executeTransaction+ action objects. - Ticks. Time is measured in 254,016,000,000ths of a second.
- Silent failures.
importFiles()returnsfalseand moves on with its day. - No batch operators, no inspection. You loop
getVideoTrack(i)→getTrackItems(...)→ six async getters per clip.
prpr wraps all of it: one inspect() call returns full structured state, mutations are single undoable transactions, every failure decodes into an error with a cause, a fix, and a state snapshot.
Three ways to use it
1. Python library
from prpr import Premiere
p = Premiere() # hosts the bridge, launches Premiere if needed
p.project.ensure("MyShow") # open-or-create ~/Documents/prpr Projects/MyShow.prproj
p.media.import_(["/footage/a.mp4"], bin="Footage")
tl = p.timeline.ensure("Edit_v1")
tl.append("a.mp4")
tl.add_marker(1.0, name="start", note="first pass", color_index=1)
p.effects.set_param("Motion", "Scale", 50, clip_name="a.mp4") # transforms
p.effects.add_transition("ADBE Film Dissolve", clip_name="a.mp4")
job = p.render.submit(target_dir="/exports", preset="prores-422", wait=True)
print(job.output_path)
2. CLI
$ prpr project ensure MyShow
$ prpr media import /footage/*.mp4 --bin Footage
$ prpr timeline inspect | jq '.tracks.video[].items'
$ prpr render submit --target-dir /exports --preset prores-422 --wait
$ prpr apply spec.yaml # terraform-style declarative reconcile
3. MCP server (for LLM agents)
$ prpr mcp install-claude # one-shot Claude Desktop setup
$ prpr mcp serve # or run the stdio server yourself
$ prpr mcp tools # introspect the typed tools
dvr ↔ prpr: one convention, two apps
prpr and dvr share naming, routing, output envelopes, and the error model. An agent (or human) that knows one knows the other:
| dvr (Resolve) | prpr (Premiere) | |
|---|---|---|
timeline inspect |
✅ | ✅ |
media import --bin |
✅ | ✅ |
render submit --preset |
render presets | .epr presets |
render queue |
✅ | ❌ fails: NotSupportedError + fix |
page edit |
✅ | ❌ fails: NotSupportedError + fix |
effects apply |
❌ fails with pointer to Resolve alternative | ✅ |
Operations one app can't perform fail loudly with a structured NotSupportedError explaining why and what to use instead — never silent degradation. The machine-readable support matrix ships in both packages:
$ prpr schema show parity | jq '.operations["render.queue"]'
{"status": "dvr-only", "reason": "no enumerable render queue in UXP"}
Requirements
- Adobe Premiere Pro 25.6+ (26.x recommended; built and tested against 26.5)
- Python 3.10+
- macOS or Windows (daemon mode is macOS/Linux-style Unix sockets; Windows uses direct mode)
Documentation
- Getting started
- Library guide · CLI reference · MCP server
- Declarative specs · Daemon mode
- dvr ↔ prpr parity
License
MIT © M Hadi
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prpr-1.0.0.tar.gz.
File metadata
- Download URL: prpr-1.0.0.tar.gz
- Upload date:
- Size: 122.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e0918eb0488387465c91dcf770afde72011be54282cb82afa05ce7c5decc15b
|
|
| MD5 |
19758f52a666cfa661a10b23c83c1495
|
|
| BLAKE2b-256 |
007784c388f2c580a2a6e3064911ea02f0a413e2cb4435930040ce40daa2b712
|
Provenance
The following attestation bundles were made for prpr-1.0.0.tar.gz:
Publisher:
release.yml on mhadifilms/prpr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
prpr-1.0.0.tar.gz -
Subject digest:
6e0918eb0488387465c91dcf770afde72011be54282cb82afa05ce7c5decc15b - Sigstore transparency entry: 2139837248
- Sigstore integration time:
-
Permalink:
mhadifilms/prpr@83c470b0c3fec4fc947d2731a67c8225c6409e51 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/mhadifilms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@83c470b0c3fec4fc947d2731a67c8225c6409e51 -
Trigger Event:
release
-
Statement type:
File details
Details for the file prpr-1.0.0-py3-none-any.whl.
File metadata
- Download URL: prpr-1.0.0-py3-none-any.whl
- Upload date:
- Size: 131.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e77a0be9677bf07d7aa37204a7695b546a9a757288920294941abc4fbfe15159
|
|
| MD5 |
57484b17022fc1ae82268969557ea5bd
|
|
| BLAKE2b-256 |
e14a1ad2fa97db8ca0ef55af440d27966ea7fb3e6a31205b53ab112a3d87c1ab
|
Provenance
The following attestation bundles were made for prpr-1.0.0-py3-none-any.whl:
Publisher:
release.yml on mhadifilms/prpr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
prpr-1.0.0-py3-none-any.whl -
Subject digest:
e77a0be9677bf07d7aa37204a7695b546a9a757288920294941abc4fbfe15159 - Sigstore transparency entry: 2139837291
- Sigstore integration time:
-
Permalink:
mhadifilms/prpr@83c470b0c3fec4fc947d2731a67c8225c6409e51 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/mhadifilms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@83c470b0c3fec4fc947d2731a67c8225c6409e51 -
Trigger Event:
release
-
Statement type: