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
Release files for prpr 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| prpr-1.0.0.tar.gz | 122.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| prpr-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 254.5 kB
Release files / prpr-1.0.0.tar.gz
| Download URL | prpr-1.0.0.tar.gz |
|---|---|
| Size | 122.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6e0918eb0488387465c91dcf770afde72011be54282cb82afa05ce7c5decc15b
|
|
BLAKE2b-256 checksum How to use checksums |
007784c388f2c580a2a6e3064911ea02f0a413e2cb4435930040ce40daa2b712
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 10, 2026.
Transparency logRelease files / prpr-1.0.0-py3-none-any.whl
| Download URL | prpr-1.0.0-py3-none-any.whl |
|---|---|
| Size | 131.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e77a0be9677bf07d7aa37204a7695b546a9a757288920294941abc4fbfe15159
|
|
BLAKE2b-256 checksum How to use checksums |
e14a1ad2fa97db8ca0ef55af440d27966ea7fb3e6a31205b53ab112a3d87c1ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 10, 2026.
Transparency log