Skip to main content

prpr logo

prpr

License: MIT

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() returns false and 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

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)

Source distribution for prpr 1.0.0
File Size Uploaded
prpr-1.0.0.tar.gz 122.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for prpr 1.0.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page