Files
jhonny-editor/bm/premiere-pro-mcp-main/docs/uxp-stable-workflows.md
T
João Henrique b541f502ba feat: initial commit - Jhonny Editor
- Adicionado estrutura completa do projeto
- Configurado MCP server para Premiere Pro
- Adicionado documentação e skills
- Configurado Gitignore para o projeto
2026-09-08 09:59:31 -04:00

345 lines
25 KiB
Markdown
Executable File

# Stable Premiere UXP workflow expansion
- **Research refresh:** 2026-08-15
- **Research method:** Tavily discovery restricted to official Adobe sources, then
checked against the installed stable declaration package
- **Declaration baseline:** `@adobe/premierepro@26.3.0`
- **Runtime policy:** method probes from the connected host are authoritative
- **Evidence:** automated contract tests complete; live Premiere verification not run
## Why these workflows
The existing MCP catalog already covers broad CEP and QE automation. This expansion
uses Adobe's documented stable UXP surface where it can improve transaction
discipline, selection performance, readback evidence, and filesystem authority.
It does not remove or silently replace the production CEP path. A failed UXP
mutation is returned to the caller and is never replayed automatically through CEP.
The public MCP surface adds consolidated tools. Each maps to smaller protocol
commands so `capabilities.get` can report the exact methods available in the running
Premiere build.
| Improvement | Public MCP tool | UXP commands | Host evidence |
| --- | --- | --- | --- |
| Native effects pipeline | `manage_clip_effects_uxp` | `effects.catalog`, `effects.chain.get`, `effects.chain.add`, `effects.chain.remove` | Effect catalog allowlist; component-chain count and component readback after an action transaction |
| Bounded effect-parameter catalog | `inspect_effect_parameter_catalog_uxp` | `parameters.catalog.inspect` | One active audio/video coordinate resolves at most 64 component-parameter index/name/animation descriptors twice; no raw Color, PointF, or other parameter values are read |
| Native track-item identity | `inspect_track_item_identity_uxp` | `trackItem.identity.inspect` | One bounded audio/video coordinate resolves documented match name, item/media type, track index, and selected state only after the active sequence identity is re-read |
| Native TickTime arithmetic | `calculate_tick_time_uxp` | `time.tickArithmetic.inspect` | Canonical caller-supplied ticks use documented native add/subtract/multiply/divide and return only ticks/seconds; no frame alignment, timecode, sequence/project access, rendering, playback, or licensed-host claim |
| Guarded timeline source label | `manage_timeline_source_label_uxp` | `timeline.sourceLabel.inspect`, `timeline.sourceLabel.update` | A bounded active audio/video coordinate resolves its source `ClipProjectItem`; update requires the complete snapshot, confirmation, operation ID, per-source serialization, one transaction, and source-label readback. The label is project-global rather than timeline-instance state. |
| Guarded sequence preview frame | `manage_sequence_preview_frame_uxp` | `sequence.previewFrame.inspect`, `sequence.previewFrame.update` | One explicit sequence GUID returns its documented native preview-frame width/height twice; update requires that full snapshot, confirmation, and operation ID, serializes bridge updates by project/sequence, commits one settings transaction, then reads the same sequence back. It does not set video dimensions or prove preview rendering. |
| Bounded source-media provenance | `inspect_source_media_provenance_uxp` | `source.provenance.inspect` | One exact media-backed Project-item ID plus at least one explicit path-disclosure flag returns only the selected documented media-file and/or originating-project path. It resolves the item through a capped tree twice and rejects a changed project, target, or selected path; it never returns a project tree, reads a file, validates a path, establishes source lineage or rights, or proves licensed-host behavior. |
| Bounded source-proxy readiness | `inspect_source_proxy_uxp` | `source.proxy.inspect` | One exact media-backed Project-item ID returns documented proxy availability, attachment, offline, and path-change capability state twice. A native proxy path is read only with explicit opt-in and only when a proxy is attached; it never accesses the filesystem, attaches/relinks proxy media, proves proxy compatibility, or proves licensed-host behavior. |
| Selection compound batch | `batch_selected_clips_uxp` | `selection.inspect`, `effects.selection.add`, `effects.selection.remove` | Preflight all selected items, then commit one action group and read every chain count back |
| Deterministic timeline selection | `manage_timeline_selection_uxp` | `selection.fingerprints.inspect`, `selection.targets.inspect`, `selection.update` | Current or coordinate-resolved clips return active-sequence GUID and project-item/time fingerprints; mutations check them before one native selection update and exact readback |
| Scene-edit detection | `detect_scene_edits_uxp` | `sceneEdit.detect` | `createMarkers` requires selected project-item marker-GUID growth; cut/subclip modes return only Adobe's host result and selected-item count |
| Proxy and ingest controller | `manage_proxy_ingest_uxp` | `proxy.inspect`, `proxy.attach`, `ingest.get`, `ingest.configure` | Proxy path/attachment readback; ingest state readback after transaction |
| Offline relink repair | `relink_offline_media_uxp` | `media.relink` | Expected old path, offline default, capability check, then media-path and online-state readback |
| Transactional metadata | `manage_metadata_uxp` | `metadata.get`, `metadata.update` | Project metadata and XMP are committed together and read back; each payload is size bounded |
| Project-panel metadata inspection | `inspect_project_panel_metadata_uxp` | `metadata.columns.get`, `metadata.projectPanel.get` | Read one native item-column or active-project panel-metadata string, bounded to 350,000 characters and a 900,000-byte serialized result; no schema or metadata writes are exposed |
| Guarded Project-panel metadata replacement | `manage_project_panel_metadata_uxp` | `metadata.projectPanel.get`, `metadata.projectPanel.update` | Require the exact inspected project GUID and XML, confirmation, operation ID, local per-project serialization, then exact native readback; the direct setter is non-undoable and no atomic compare-and-set is claimed |
| Guarded Project metadata schema field creation | `create_project_metadata_field_uxp` | `metadata.projectSchema.inspect`, `metadata.projectSchema.create` | Require the exact inspected project GUID and bounded panel XML, typed name/label, confirmation, operation ID, and shared per-project serialization; native acceptance and panel-XML change are observable but Adobe exposes no atomic compare-and-set or field-level getter, so creation is always `committed_unverified` |
| Guarded app preferences | `manage_app_preferences_uxp` | `preferences.inspect`, `preferences.set` | Inspect only Adobe's three named application preferences; direct string writes require stale value, persistence, confirmation, operation ID, per-key serialization, and exact native-string readback; no transaction or Undo claim |
| Installed MOGRT-directory inspection | `inspect_installed_mogrt_directory_uxp` | `graphics.mogrtPath.inspect` | Return only documented installed-directory availability by default. A caller must explicitly request the bounded native path; the bridge does not enumerate it, read templates, or import MOGRTs. |
| Bounded Object Mask audit | `audit_object_masks_uxp` | `objectMask.audit` | Up to 64 exact sequences (or an entire project under that cap) are re-resolved with the active-project identity and every yes/no Object Mask result double-read before a response is returned. |
| Color and conformance | `manage_color_conformance_uxp` | `color.preflight`, `footage.conform` | Project graphics-white values, embedded/input LUT IDs, and requested footage fields read back |
| Source Monitor audition | `audition_source_monitor_uxp` | `sourceMonitor.state`, `sourceMonitor.open`, `sourceMonitor.position.set`, `sourceMonitor.play`, `sourceMonitor.close` | Project-item and position readback where Adobe exposes it; file open/play rely on explicit host returns |
| Productions and storage | `preflight_production_storage_uxp` | `storage.preflight`, `scratch.configure` | Project/Production scratch snapshots and project action-transaction result |
| Least-privilege workspace | `get_uxp_workspace_access` | `workspace.status` | Redacted persistent capability state; native path and token never cross the bridge |
## Performance and transaction design
- Selection batches use `Sequence.getSelection()` and `TrackItemSelection` instead
of traversing the project tree. Classification reads only each selected item's
reported track and caches repeated track lookups. Batches are capped at 64 clips
and reject mixed or unclassified media types before creating any action.
- Selection management resolves every requested video/audio clip before changing
host state, caps the resulting set at 64 clips, and rejects changed sequence,
project-item, or timeline-time fingerprints. It accepts both the Promise form of
`Sequence.setSelection()` in 25.6-26.2 and the synchronous boolean form in 26.3.
- Effect factories run during preflight. All component-chain actions are created
synchronously inside `Project.lockedAccess()` and consumed by one
`Project.executeTransaction()` call.
- Metadata project/XMP changes share one transaction. Footage interpretation and
input-LUT actions also share one transaction.
- Proxy attachment, relink, scene detection, Source Monitor calls, and other direct
host APIs are not described as atomic action transactions. Their result envelopes
identify the narrower verification boundary.
- Completed mutating protocol calls may use `operation_id` replay protection for
the current panel session. Inputs remain bounded before a host call.
These choices reduce redundant project traversal and transaction overhead by
construction. They are not a measured latency claim. A real Premiere benchmark is
still required before publishing p50 or p95 improvements.
## Non-undoable confirmations
`ClipProjectItem.attachProxy()` and `ClipProjectItem.changeMediaFilePath()` are
documented as non-undoable. Their MCP workflows require
`confirm_non_undoable: true`. Relink additionally defaults to
`require_offline: true` and supports `expected_current_path` as a stale-state guard.
Setting `override_compatibility_check` remains opt-in.
`SequenceUtils.performSceneEditDetectionOnSelection()` is also kept outside the
action-transaction claim. For `createMarkers`, the workflow snapshots each selected
item's project-item marker GUIDs and returns `verified` only when at least one GUID
is added. Cut and subclip modes return `committed_unverified` after Adobe's positive
host result because the API does not return the number or identities of created cuts
or subclips.
## Filesystem authority
The UXP manifest now declares `localFileSystem: "request"`, replacing
`"fullAccess"`. The operator chooses one root in the panel. The panel persists
Adobe's opaque folder token in plugin data and restores it with
`getEntryForPersistentToken()`.
The workspace broker applies these rules:
1. A file path must be absolute, at most 4096 characters, and free of NUL bytes.
2. `.` and `..` segments are normalized before containment is checked.
3. Windows drive and UNC paths compare case-insensitively; prefix-only siblings such
as `Filmography` do not match an approved `Film` folder.
4. Windows device names, alternate-data-stream colons, and trailing dot/space
aliases are rejected before containment checks.
5. Proxy, relink, Source Monitor file, frame, interchange, AAF, and preset paths are
rejected outside the approved root.
6. The status command returns only folder display name, access mode, and persistence
state. It never returns the native root or persistent token.
Containment is a bridge policy, not an operating-system sandbox. The broker does
not recursively enumerate the selected folder, so the live-host gate must confirm
how Premiere resolves symlinks and Windows reparse points. Operators should not put
links to unrelated data inside an approved workspace.
The panel's bridge URL is separately restricted to `ws://127.0.0.1:<port>/uxp` or
`ws://localhost:<port>/uxp`. The manifest uses Adobe's compatible `domains: "all"` declaration
because Premiere 26.3 rejects the narrower WebSocket list; the panel's runtime validator is the
loopback-only authority and rejects remote hosts, credentials, fragments, and non-`/uxp` paths.
## Public action contracts
### `manage_clip_effects_uxp`
- `catalog`: list video match names and display names or audio display names.
- `inspect`: require `media_type`, `track_index`, and `clip_index`.
- `add`: additionally require `effect_id`; optional `insertion_index`.
- `remove`: additionally require `component_index` and `expected_effect_id` from a
recent inspection. The command rejects a stale or changed component chain.
Video additions accept only a match name returned by `VideoFilterFactory`.
Audio additions accept only a display name returned by `AudioFilterFactory`.
### `inspect_effect_parameter_catalog_uxp`
Require one `media_type`, `track_index`, `clip_index`, and `component_index`.
The panel resolves that active-sequence coordinate and returns no more than 64
parameter descriptors: the zero-based index, native display name, whether
keyframes are supported, and whether the parameter is currently time-varying.
It never reads a parameter value, including PointF or Color data. Optional
`expected_sequence_guid` and `expected_component_id` reject a changed target
before the final result. The complete catalog is read twice, so a changed active
project, sequence, component identity, or descriptor set rejects rather than
returning a mixed result. This remains a read-only contract check, not evidence
of parameter editability, rendered output, playback, persistence, Undo, or a
licensed Premiere host.
### `inspect_track_item_identity_uxp`
Require one `media_type`, `track_index`, and `clip_index`; callers may provide
`expected_sequence_guid` from a recent result. The read returns only the host's
track-item match name, numeric item type, media UUID, reported track index, and
selected state. It rejects a changed active sequence before returning. It neither
reads source paths nor effect values and is not visual, playback, persistence, or
licensed-host proof.
### `audit_object_masks_uxp`
This is a read-only bounded audit over documented `ObjectMaskUtils.hasObjectMask()`
calls. It accepts an optional active-project GUID and either one to 64 exact sequence
GUIDs or, if no selectors are supplied, audits the whole active project only when it
has at most 64 sequences. The bridge sorts stable sequence identities, reads the
project aggregate and every selected sequence boolean, resolves the same targets a
second time, and rejects any changed active project, sequence identity/name, aggregate
boolean, or per-sequence boolean rather than returning a mixed result.
Adobe's API exposes only presence. The audit does not return mask counts, locations,
selection, tracking state, editability, source items, render output, playback results,
or licensed-host evidence. The double read is not an atomic host snapshot: a change
that occurs and returns to the identical values between reads is outside this boundary.
### `inspect_installed_mogrt_directory_uxp`
The documented `SequenceEditor.getInstalledMogrtPath()` getter is called only
through the authenticated bridge. The result is a bounded string and stays
redacted unless `include_path: true`. The command never enumerates, reads, or
imports from that directory, so a returned path is not evidence of installed
templates, compatibility, successful insertion, rendering, or licensed-host
behavior.
### `batch_selected_clips_uxp`
- `inspect`: return up to 64 current selection entries.
- `add_effect`: require one media type and effect ID.
- `remove_effect`: require one media type, component index, and expected effect ID.
Every selection entry must resolve to the requested media type. Validation and
component creation complete before the single mutation transaction begins.
### `manage_timeline_selection_uxp`
- `inspect`: return the active sequence GUID and zero to 64 current video/audio
selection entries, including track/clip coordinates, project-item ID, and start/end
seconds.
- `inspect_targets`: resolve one to 64 unselected or selected video/audio
`selection_targets` by track/clip coordinate and return the same mutation-ready
fingerprints without changing selection.
- `replace`, `add`, and `remove`: require `expected_sequence_guid` plus one to 64
`selection_items` copied from a recent `inspect` or `inspect_targets` result.
- `clear`: require `expected_sequence_guid` and omit `selection_items`.
All mutation targets are resolved and fingerprinted before the single native
selection call. The command rebuilds the desired selection with
`TrackItemSelection.createEmptySelection()` and `addItem()`, or calls
`Sequence.clearSelection()` for an empty result. It then reads the selected set back
and rejects mismatches. Timeline selection changes are not project mutations and do
not claim Premiere Undo support; mutation actions still require MCP `edit` authority
and may use `operation_id` replay protection.
### `detect_scene_edits_uxp`
`mode` is `apply_cuts`, `create_markers`, or `create_subclips`. The command passes
Adobe's corresponding `SequenceUtils` constant and the current native selection.
### `manage_proxy_ingest_uxp`
Actions are `inspect_proxy`, `attach_proxy`, `get_ingest`, and `set_ingest`.
Attaching media requires an approved path and explicit non-undoable confirmation.
Replacing a different existing proxy additionally requires
`replace_existing_proxy: true`.
Ingest updates use `ProjectSettings.createSetIngestSettingsAction()`.
### `manage_metadata_uxp`
Actions are `get` and `update`. Project metadata requires 1-128 exact
`updated_fields`. Project and XMP strings are each capped at 350,000 characters,
and their combined serialized UTF-8 readback is capped at 900,000 bytes so the
complete response remains below the bridge's 1 MiB frame limit.
### `inspect_project_panel_metadata_uxp`
Actions are `panel` and `item_columns`. `panel` returns the active project's
native Project-panel metadata; `item_columns` uses the established exact
project-item ID, name, or singleton-selection resolution rules, then returns that
item's native column metadata. Both strings may be empty but are capped at 350,000
characters and a 900,000-byte serialized result. This tool is read-only: it does
not create metadata schema fields or invoke `setProjectPanelMetadata()`, whose
documented setter has no project-targeted action or transaction boundary that
could truthfully guard it across an awaited call. The result is a current-host
read, not an atomic project revision, persistence, or licensed-host proof.
### `manage_project_panel_metadata_uxp`
`inspect` returns the same active-project panel metadata as the read-only tool.
`update` requires the exact `expected_project_guid` and
`expected_project_panel_metadata` returned by inspection, the complete replacement
`project_panel_metadata`, `confirm_update: true`, and a bounded `operation_id`.
Both XML strings are limited to 12 KiB UTF-8 at the host boundary because two exact
XML values can expand when serialized in the bridge request. The panel serializes
this bridge's updates per project and performs the final async snapshot/stale check
immediately before it starts the documented direct setter under `lockedAccess()`.
Premiere exposes no atomic compare-and-set and another extension or the user
interface may still race that direct call. The setter is non-undoable and has no
cancellation claim. The result is verified only if an active-project exact XML
readback matches; a completed call with another project or XML is
`committed_unverified`. Operation-ID replay is scoped to the connected panel
session. Automated contracts do not prove host acceptance, persistence, UI effects,
Undo, or licensed-host behavior.
### `manage_app_preferences_uxp`
`inspect` returns just the native string values of the documented
`auto_peak_generation`, `import_workspace`, and `show_quickstart_dialog` keys.
`set` accepts one allow-listed key plus the exact inspected string, a requested
string value (each capped at 1024 characters), explicit persistence, confirmation,
and an operation ID. The panel keeps all snapshot/stale-check/set/readback work for
that key within its per-key exclusion boundary. `AppPreference.setValue()` is a
direct application-state call rather than a project action, so this tool makes no
claim of a project transaction, cancellation, Undo, durable persistence, or
licensed-host validation.
### `manage_color_conformance_uxp`
`preflight` returns graphics-white support, LUT IDs, and footage interpretation.
`update` allowlists frame rate, pixel aspect ratio, field/alpha flags, VR layout and
view fields, and input LUT ID. Numeric values are finite and range bounded.
### `audition_source_monitor_uxp`
Actions are `state`, `open_project_item`, `open_file`, `set_position`, `play`,
`close`, and `close_all`. File open is workspace-contained. Playback speed is
bounded from -16 through 16.
### `preflight_production_storage_uxp`
`preflight` reads project scratch/ingest state and, on Premiere 26.2+, active
Production scratch state. `configure_project` changes only the active project's
documented scratch categories to `same_as_project` or `my_documents`; there is no
claim that UXP exposes an equivalent Production mutation API.
## Automated evidence
- `tests/uxp/stable-workflows.test.ts` exercises the workflow-module host paths against a
deterministic mock Premiere surface, including transaction and readback behavior.
- `tests/uxp/workspace.test.ts` exercises token persistence, path normalization,
containment, redaction, restore, and revoke behavior.
- `tests/tools/uxp-workflows.test.ts` checks the workflow-module public schemas and snake-case to
protocol argument translation.
- `tests/uxp/commands.test.ts` exercises the command-registry AppPreference contract,
including allowlisted keys, stale reads, direct-set rejection, exact readback,
replay, and competing operation IDs.
- `tests/adobe-uxp-coverage.test.ts` keeps the official-source coverage manifest
machine validated.
These tests do not prove that Premiere loaded the panel or performed a real edit.
All added coverage entries therefore retain `liveHostVerificationStatus: not_run`.
## Live-host gate
Before release promotion, run the packaged panel in exact Windows and macOS stable
Premiere versions and record the host version and artifact hash. At minimum:
1. Add, insert, and remove representative video and audio effects; inspect results
and verify one Undo removes the whole selection batch.
2. Inspect an empty selection, then replace, add, remove, and clear mixed video/audio
clip selections. Repeat on 25.6 and 26.3 to cover both `setSelection` return forms,
and confirm stale sequence and clip fingerprints fail before changing selection.
3. Run every scene-detection mode on known footage and record created objects.
4. Attach proxy and high-resolution media, toggle ingest, and validate persistence
across save/reopen.
5. Relink an intentionally offline item with and without compatibility override.
6. Round-trip representative project metadata and XMP, including Unicode and an
unchanged-field case; verify Undo.
7. Conform frame rate, PAR, alpha/field settings, and input LUT; verify both
readback and Undo.
8. Open project items and workspace files in Source Monitor, seek, play forward and
reverse, and close them.
9. Exercise project scratch settings both inside and outside a Production and
verify Undo and saved state.
10. Revoke the workspace token and confirm every path-based call fails before a host
mutation; re-grant after restart and confirm restoration.
## Primary Adobe references
- [Premiere UXP changelog](https://developer.adobe.com/premiere-pro/uxp/changelog/)
- [Component and effect APIs](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/videocomponentchain/)
- [Sequence selection controls](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/sequence/)
- [TrackItemSelection](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/trackitemselection/)
- [SequenceUtils scene detection](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/sequenceutils/)
- [ClipProjectItem proxy, relink, LUT, and footage APIs](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/clipprojectitem/)
- [ProjectSettings](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/projectsettings/)
- [Metadata](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/metadata/)
- [ProjectColorSettings](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/projectcolorsettings/)
- [SourceMonitor](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/sourcemonitor/)
- [PRProduction](https://developer.adobe.com/premiere-pro/uxp/ppro-reference/classes/prproduction/)
- [UXP filesystem operations](https://developer.adobe.com/premiere-pro/uxp/resources/recipes/filesystem-operations/)