premiere-pro-mcp 1.16.3 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +72 -25
  3. package/after-effects-cep-plugin/CSXS/manifest.xml +2 -2
  4. package/after-effects-cep-plugin/bridge-directory-security.cjs +18 -9
  5. package/artifacts/MCPBridgeCEP.zxp +0 -0
  6. package/cep-plugin/CSXS/manifest.xml +3 -3
  7. package/cep-plugin/bridge-directory-security.cjs +18 -9
  8. package/cep-plugin/index.html +1 -1
  9. package/cep-plugin/updater.cjs +1 -1
  10. package/dist/ai/mask-fit.d.ts +125 -0
  11. package/dist/ai/mask-fit.js +308 -0
  12. package/dist/ai/timeline-qa.js +1 -1
  13. package/dist/bridge/file-bridge.d.ts +7 -0
  14. package/dist/bridge/file-bridge.js +21 -8
  15. package/dist/bridge/script-builder.js +180 -20
  16. package/dist/index.js +1 -1
  17. package/dist/resources/adobe-uxp-coverage.json +52 -0
  18. package/dist/resources/extendscript-reference.js +3 -3
  19. package/dist/resources/live-context-resources.js +1 -1
  20. package/dist/resources/uxp-js-api-inventory.json +10 -10
  21. package/dist/security/capabilities.js +3 -0
  22. package/dist/server.js +2 -0
  23. package/dist/tools/advanced.js +33 -8
  24. package/dist/tools/clipboard.d.ts +58 -0
  25. package/dist/tools/clipboard.js +495 -0
  26. package/dist/tools/inspection.js +21 -60
  27. package/dist/tools/mask-fit.d.ts +182 -0
  28. package/dist/tools/mask-fit.js +357 -0
  29. package/dist/tools/media.d.ts +5 -0
  30. package/dist/tools/media.js +109 -8
  31. package/dist/tools/metadata.d.ts +26 -0
  32. package/dist/tools/metadata.js +212 -17
  33. package/dist/tools/project.js +27 -9
  34. package/dist/tools/sequence.js +3 -3
  35. package/dist/tools/source-monitor.d.ts +5 -0
  36. package/dist/tools/source-monitor.js +66 -5
  37. package/dist/tools/timeline-qa.js +1 -1
  38. package/dist/tools/timeline.d.ts +42 -0
  39. package/dist/tools/timeline.js +298 -56
  40. package/dist/tools/track-targeting.d.ts +5 -0
  41. package/dist/tools/track-targeting.js +168 -38
  42. package/dist/tools/uxp-timeline-source-label-workflows.d.ts +8 -1
  43. package/dist/tools/uxp-timeline-source-label-workflows.js +14 -5
  44. package/dist/tools/uxp-workflows.d.ts +59 -0
  45. package/dist/tools/uxp-workflows.js +36 -3
  46. package/dist/tools/uxp.d.ts +157 -0
  47. package/dist/workflows/agent-instructions.js +14 -0
  48. package/dist/workflows/catalog.d.ts +8 -2
  49. package/dist/workflows/catalog.js +9 -0
  50. package/dist/workflows/tool-metadata.js +1 -0
  51. package/dist/workflows/tool-packs.js +5 -1
  52. package/docs/supported-actions.md +23 -20
  53. package/package.json +2 -2
  54. package/public-product-manifest.json +6 -6
  55. package/scripts/generate-marketing-reference.mjs +1 -0
  56. package/uxp-plugin/commands.cjs +1 -1
  57. package/uxp-plugin/index.cjs +5 -1
  58. package/uxp-plugin/manifest.json +1 -1
  59. package/uxp-plugin/timeline-source-label-workflows.cjs +46 -9
  60. package/uxp-plugin/workflows.cjs +255 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,79 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.17.0] - 2026-09-21
10
+
11
+ ### Added
12
+
13
+ - `paste_clip_attributes` copies a source clip's effect stack, values, and
14
+ keyframes onto a target clip with per-property readback. Masks and a differing
15
+ Blend Mode are reported as not copied because no documented scripting surface
16
+ exposes them. (#595)
17
+ - `compute_mask_fit_motion` computes Motion Scale/Position that place a still's
18
+ subject inside an existing Rounded Crop, Crop, or similar mask. Inspect only.
19
+ (#594)
20
+ - `set_clip_duration` sets a placed timeline clip's duration or absolute end by
21
+ moving only `TrackItem.end`, so still images can be extended past their import
22
+ length. It refuses overlaps with the next clip, guards effect keyframes when
23
+ shortening, reads start/end back, and restores the original end when Premiere
24
+ clamps the write. (#592)
25
+
26
+ ### Changed
27
+
28
+ - Clip speed messaging is consistent across `speed_change`, `set_clip_speed_qe`,
29
+ `set_clip_properties`, agent instructions, docs, and skills: documented
30
+ ExtendScript and UXP (through 26.3) expose only speed getters, the QE setter
31
+ stays unused, and `set_clip_duration` is the supported timing alternative. (#593)
32
+
33
+ ### Fixed
34
+
35
+ - `set_target_track` targets exclusively by default (`exclusive: false` keeps
36
+ other tracks targeted) and reads every track back; `get_target_tracks` lists
37
+ every targeted track and unreadable tracks. (#587)
38
+ - `create_bars_and_tone` returns the created item's name, node ID, and tree path.
39
+ (#588)
40
+ - `get_bin_contents` resolves nested bins by node ID with guarded child access and
41
+ clean errors instead of a raw TypeError. (#589)
42
+ - `manage_timeline_source_label_uxp` accepts `sequence_id` and resolves it by GUID,
43
+ failing closed instead of targeting the active sequence. (#590)
44
+ - `create_bin` honors `parent_bin_id` and reads back the new bin's parent. (#591)
45
+ - Windows bridge-directory ACL checks ignore capability and app-container SIDs
46
+ (`S-1-15-*`), so the default location under `%LOCALAPPDATA%` no longer fails at
47
+ startup; the ancestry error names each offending path and SID. (#581)
48
+
49
+ ## [1.16.4] - 2026-09-20
50
+
51
+ ### Added
52
+
53
+ - Claude Fable 5.1 client workflow guidance for Cursor and other compatible MCP
54
+ clients, covering model selection, data-retention opt-in, tool discovery, and
55
+ serialized Premiere verification. (#576)
56
+ - Named Premiere metadata field inspect and update through existing CEP and UXP
57
+ tools, with field readback instead of requiring complete packet dumps. (#577)
58
+
59
+ ### Changed
60
+
61
+ - Shared `AGENTS.md` as the canonical repo map for IDE and coding-agent stubs,
62
+ and pin client CEP install commands to the published package. (#582)
63
+
64
+ ### Fixed
65
+
66
+ - `set_item_in_out` and `set_source_in_out` pass seconds, not ticks, to
67
+ `ProjectItem.setInPoint`/`setOutPoint` and verify tick readback. A Source
68
+ Monitor readback mismatch restores original marks when possible and otherwise
69
+ reports a partial state. The ExtendScript reference documents those setter
70
+ arguments as seconds. (#579)
71
+ - CEP `create_subsequence` verifies the new sequence without ES5
72
+ `Array.indexOf`, which ExtendScript does not provide. (#579)
73
+ - `ripple_delete` now fails closed when QE sync-lock state cannot be read,
74
+ instead of omitting neighbours and reporting a verified ripple. (#578)
75
+ - Still-image `capture_frame` / `export_frame` AME fallback restores sequence
76
+ in/out only after those marks can be read, so a failed restore cannot leave
77
+ the sequence pinned to one frame. (#580)
78
+
79
+ Automated checks do not establish licensed Premiere or After Effects playback or
80
+ rendered-output verification.
81
+
9
82
  ## [1.16.3] - 2026-09-18
10
83
 
11
84
  ### Changed
package/README.md CHANGED
@@ -12,7 +12,7 @@ Free, MIT licensed, local-first, and published to npm as [`premiere-pro-mcp`](ht
12
12
 
13
13
  [Website](https://premiere-pro-mcp.com/) · [Recorded demo](https://premiere-pro-mcp.com/demo/) · [Compare servers](https://premiere-pro-mcp.com/compare/) · [Setup guides](https://premiere-pro-mcp.com/blog/how-to-set-up-premiere-pro-mcp/) · [Search tools](https://premiere-pro-mcp.com/tools/) · [Troubleshooting](https://premiere-pro-mcp.com/docs/troubleshooting/) · [Release facts](https://premiere-pro-mcp.com/facts/)
14
14
 
15
- Development source: 381 core tools across 56 modules, 4 resources, and 18 guided workflows. A connected UXP host adds 95 capability-gated tools.
15
+ Development source: 384 core tools across 57 modules, 4 resources, and 19 guided workflows. A connected UXP host adds 95 capability-gated tools.
16
16
 
17
17
  The [completed AE render handoff](docs/after-effects-render-handoff.md) previews and confirms importing one finished render into an existing Premiere bin, with host and file rechecks and an import receipt.
18
18
 
@@ -50,7 +50,7 @@ The [completed AE render handoff](docs/after-effects-render-handoff.md) previews
50
50
  - [Configure your MCP client](#3-configure-your-mcp-client)
51
51
  - [Verify the bridge in Premiere Pro](#4-verify-the-bridge-in-premiere-pro)
52
52
  - [Clients and capability coverage](#codex-plugin)
53
- - [Codex plugin](#codex-plugin) · [Claude](#claude) · [GPT-6 Astra tool discovery](#gpt-6-astra-and-agent-tool-discovery)
53
+ - [Codex plugin](#codex-plugin) · [Claude](#claude) · [GPT-6 Astra tool discovery](#gpt-6-astra-and-agent-tool-discovery) · [Claude Fable 5.1](#claude-fable-51)
54
54
  - [Windows and macOS capability coverage](#windows-and-macos-capability-coverage)
55
55
  - [After Effects MOGRT studio](#after-effects-mogrt-studio)
56
56
  - [Collaboration and AI feature boundaries](#collaboration-and-ai-feature-boundaries)
@@ -104,13 +104,13 @@ and repository before configuring a client. The new
104
104
  VS Code, or Codex settings that point directly to this installation. It is a
105
105
  feature included in v1.15.1 and later.
106
106
 
107
- The current source exposes 381 core tools for supported workflow steps spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, connection verification, and guarded After Effects MOGRT authoring, batch, library, render-queue, inspection, and Premiere-handoff workflows. A compatible, authenticated UXP panel adds 95 documented, capability-gated tools without replacing the production CEP bridge.
107
+ The current source exposes 384 core tools for supported workflow steps spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, connection verification, and guarded After Effects MOGRT authoring, batch, library, render-queue, inspection, and Premiere-handoff workflows. A compatible, authenticated UXP panel adds 95 documented, capability-gated tools without replacing the production CEP bridge.
108
108
 
109
109
  <a id="latest-release"></a>
110
110
 
111
- ### Latest release: 1.16.3
111
+ ### Latest release: 1.17.0
112
112
 
113
- The published v1.16.2 npm artifact contains **381 core tools**, 379 in its default profile,
113
+ The published v1.16.4 npm artifact contains **381 core tools**, 379 in its default profile,
114
114
  and 474 with a compatible UXP connection. The development catalog above can include
115
115
  unreleased work. See the [versioned facts and package provenance](https://premiere-pro-mcp.com/facts/).
116
116
 
@@ -160,7 +160,7 @@ if the connection is unavailable.
160
160
  local Premiere processes. See the generated [supported action catalog](docs/supported-actions.md)
161
161
  for individual capability and verification contracts.
162
162
 
163
- See the [v1.16.3 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.16.3)
163
+ See the [v1.17.0 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.17.0)
164
164
  for complete details. Live installation in Premiere Pro still requires host verification.
165
165
 
166
166
  ### Current MCP protocol support
@@ -208,7 +208,7 @@ their bins, media rules, and organization rules before a facility uses one.
208
208
  > ### Install the published package (verify the name)
209
209
  >
210
210
  > ```bash
211
- > npm i -g premiere-pro-mcp@1.16.3
211
+ > npm i -g premiere-pro-mcp@1.17.0
212
212
  > ```
213
213
  >
214
214
  > This repository publishes only **`premiere-pro-mcp`**. A differently named package (`adobe-premiere-pro-mcp`) may also declare a `premiere-pro-mcp` executable. Before configuring a client, confirm:
@@ -216,7 +216,7 @@ their bins, media rules, and organization rules before a facility uses one.
216
216
  > | Check | Expected |
217
217
  > | --- | --- |
218
218
  > | Package name | `premiere-pro-mcp` (not `adobe-premiere-pro-mcp`) |
219
- > | Version | `1.16.3` |
219
+ > | Version | `1.17.0` |
220
220
  > | Homepage / repo | https://premiere-pro-mcp.com/ · https://github.com/leancoderkavy/premiere-pro-mcp |
221
221
  >
222
222
  > ```bash
@@ -229,9 +229,9 @@ their bins, media rules, and organization rules before a facility uses one.
229
229
 
230
230
  ### Easiest supported path: Claude Desktop
231
231
 
232
- 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.16.3/premiere-pro-mcp-1.16.3.mcpb).
232
+ 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.17.0/premiere-pro-mcp-1.17.0.mcpb).
233
233
  2. In Claude Desktop, open **Settings > Extensions > Advanced settings > Install Extension**, select the downloaded bundle, and restart Claude Desktop.
234
- 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.16.3/MCPBridgeCEP.zxp). Open it with your trusted ZXP installer. If your computer has no ZXP installer, use the npm connector installer in **Advanced setup** below.
234
+ 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.17.0/MCPBridgeCEP.zxp). Open it with your trusted ZXP installer. If your computer has no ZXP installer, use the npm connector installer in **Advanced setup** below.
235
235
  4. Restart Premiere, open a project, then open **Window > Extensions > MCP for Adobe Premiere Pro**.
236
236
  5. In Claude, enter: `Safely check my Premiere connection with verify_premiere_connection. Make no changes.`
237
237
 
@@ -488,6 +488,9 @@ Add to `.cursor/mcp.json` in your project or global config:
488
488
  }
489
489
  ```
490
490
 
491
+ After the server is enabled, select Claude Fable 5.1 in Cursor when you want a
492
+ longer-horizon session. See [Claude Fable 5.1 workflows](docs/claude-fable-5-1.md).
493
+
491
494
  </details>
492
495
 
493
496
  <details>
@@ -528,11 +531,11 @@ From a clone of this repository:
528
531
  ```bash
529
532
  codex plugin marketplace add .
530
533
  codex plugin add premiere-pro@premiere-pro-mcp
531
- npx -y premiere-pro-mcp@1.15.1 --install-cep
534
+ npx -y premiere-pro-mcp@1.16.4 --install-cep
532
535
  ```
533
536
 
534
537
  Restart Premiere Pro and start a new Codex session after installation. The plugin
535
- launches `premiere-pro-mcp@1.15.1` through `npx`; the separate CEP installation is
538
+ launches `premiere-pro-mcp@1.16.4` through `npx`; the separate CEP installation is
536
539
  required because the MCP server communicates with the running Premiere host through
537
540
  the local bridge.
538
541
 
@@ -563,7 +566,7 @@ For Claude Code, add this repository as a marketplace and install the plugin:
563
566
  Then install the Premiere bridge and start a new Claude Code session:
564
567
 
565
568
  ```bash
566
- npx -y premiere-pro-mcp@1.15.1 --install-cep
569
+ npx -y premiere-pro-mcp@1.16.4 --install-cep
567
570
  ```
568
571
 
569
572
  The Claude Code package lives in
@@ -581,6 +584,26 @@ Install the resulting file from `artifacts/` through **Settings > Extensions >
581
584
  Advanced settings > Install Extension**. The Premiere CEP bridge must still be
582
585
  installed separately.
583
586
 
587
+ ### Claude Fable 5.1
588
+
589
+ Use Cursor, Claude Desktop, or Claude Code with Claude Fable 5.1
590
+ (`claude-fable-5-1`) when your account has access. Model selection belongs to the
591
+ client; this server does not run an Anthropic model. Fable 5.1 is optional:
592
+ other Claude models can call the same MCP tools. If Cursor Privacy Mode or an
593
+ Enterprise plan is enabled, an admin must approve Anthropic's Fable data-retention
594
+ policy before the model is available.
595
+
596
+ The server supplies session-aware workflow instructions and bounded tool discovery:
597
+ call `get_capabilities` with `{"tool_query":"transcript","tool_limit":10}` to
598
+ find relevant operations, their descriptions, and backend requirements. Keep
599
+ Premiere mutations serialized even in a long Fable 5.1 session. Image review of
600
+ returned frames is not playback or delivery proof.
601
+
602
+ See [Claude Fable 5.1 workflows](docs/claude-fable-5-1.md) for connection order,
603
+ privacy boundaries, evidence retrieval, Cursor's Opus fallback, and the division
604
+ between MCP and client capabilities. The public walkthrough is
605
+ [How to Use Claude Fable 5.1 with MCP for Adobe Premiere Pro](https://premiere-pro-mcp.com/blog/claude-fable-5-1-premiere-pro-mcp/).
606
+
584
607
  ### Windows and macOS capability coverage
585
608
 
586
609
  | Surface | Windows | macOS | Verification boundary |
@@ -859,7 +882,7 @@ reports revision-bound notes, VFX state, change impact and turnover exceptions.
859
882
  It performs local inspection; host edits and exports use separate guarded tools.
860
883
  See [usage, example and remaining execution adapters](docs/film-editorial-workflows.md).
861
884
 
862
- ## Tools (381 core total; 379 under the default profile; 474 with a connected UXP bridge)
885
+ ## Tools (384 core total; 382 under the default profile; 477 with a connected UXP bridge)
863
886
 
864
887
  The [complete supported-actions catalog](docs/supported-actions.md) lists every
865
888
  registered core tool, the two tools restricted behind explicit `unsafe-script`
@@ -899,7 +922,7 @@ the tables below are a shorter workflow-oriented overview.
899
922
  | `set_scratch_disk_path` | Configure scratch disks |
900
923
  | `consolidate_and_transfer` | Project Manager consolidation |
901
924
 
902
- ### Timeline & Editing (10 + 27 advanced)
925
+ ### Timeline & Editing (11 + 27 advanced)
903
926
 
904
927
  | Tool | Description |
905
928
  | :--- | :---------- |
@@ -907,8 +930,9 @@ the tables below are a shorter workflow-oriented overview.
907
930
  | `ripple_delete` | Remove clip and close gap (QE) |
908
931
  | `roll_edit` / `slide_edit` / `slip_edit` | Professional trim modes (QE) |
909
932
  | `move_clip_to_track` | Move between tracks (QE) |
910
- | `reverse_clip` / `speed_change` / `set_clip_speed_qe` | Unavailable: Premiere has no supported scripting API for changing a timeline clip's speed or direction |
933
+ | `reverse_clip` / `speed_change` / `set_clip_speed_qe` | Unavailable: Premiere's documented ExtendScript and UXP APIs have no setter for a timeline clip's speed or direction; use `set_clip_duration` for timeline length |
911
934
  | `split_clip` / `trim_clip` / `move_clip` | Basic edits; trim verifies source points and visible timeline edges |
935
+ | `set_clip_duration` | Set a clip's timeline duration or absolute end (extends still images); refuses next-clip overlaps and restores the original end if Premiere clamps |
912
936
  | `set_clip_properties` | Opacity, scale, rotation, position (speed requests fail before mutation) |
913
937
  | `link_selection` / `unlink_selection` | Link/unlink A/V |
914
938
 
@@ -923,9 +947,10 @@ the tables below are a shorter workflow-oriented overview.
923
947
 
924
948
  > **Speed, caption, and visual-keyframe boundaries:** Premiere Pro 26.3 may reflect legacy QE
925
949
  > speed/direction methods, but exposes no supported scripting setter or Time Remapping component
926
- > for timeline-clip speed or direction. `reverse_clip`,
950
+ > for timeline-clip speed or direction (documented UXP through 26.3 has only `getSpeed` /
951
+ > `isSpeedReversed`). `reverse_clip`,
927
952
  > `speed_change`, `set_clip_speed_qe`, and `set_clip_properties` with `speed` now stop before host mutation;
928
- > use the Speed/Duration UI or pre-render retimed media. `add_text_overlay` likewise stops
953
+ > use `set_clip_duration` to change timeline length, or the Speed/Duration UI or pre-rendered media to retime. `add_text_overlay` likewise stops
929
954
  > before mutation because a raw-text-to-caption API is not exposed; import an `.srt`/`.vtt`
930
955
  > and use `create_caption_track`, or use a MOGRT/PNG overlay. Keyframe and caption-track
931
956
  > responses can prove parameter/structure readback only—not rendered pixels—so verify playback
@@ -950,6 +975,15 @@ cut boundaries. Its QE path cannot prove effect-keyframe redistribution, so a su
950
975
  labels those semantics `unverified`. These are CEP contract checks, not validation in a licensed
951
976
  Premiere Pro 26.x host.
952
977
 
978
+ `set_clip_duration` changes a placed clip's timeline length without touching source in/out
979
+ directly: pass exactly one of `duration_seconds` (from the current start) or `end_seconds`
980
+ (absolute timeline end). It writes the documented `TrackItem.end` as a tick-based `Time`, refuses
981
+ an end that would overlap the next clip on the same track, applies the same `keyframe_policy`
982
+ guard as `trim_clip` when shortening, and reads start/end back. If Premiere clamps the end (for
983
+ example, video media with no remaining handle, or a still whose project item has in/out points),
984
+ the original end is restored and the tool returns an error. Linked audio/video partners are not
985
+ adjusted. This is a CEP contract check, not validation in a licensed Premiere Pro host.
986
+
953
987
  ### Effects & Color (8)
954
988
 
955
989
  | Tool | Description |
@@ -1013,12 +1047,13 @@ presenting UI-only operations as available tools.
1013
1047
  | `play_timeline` / `stop_playback` | Playback control (QE) |
1014
1048
  | `play_source_monitor` | Play in source monitor |
1015
1049
 
1016
- ### Selection & Clipboard (7 + 6)
1050
+ ### Selection & Clipboard (7 + 7)
1017
1051
 
1018
1052
  | Tool | Description |
1019
1053
  | :--- | :---------- |
1020
1054
  | `select_clips_by_name` / `select_clips_in_range` | Smart selection |
1021
1055
  | `copy_effects_between_clips` | Copy effects via QE |
1056
+ | `paste_clip_attributes` | Paste Attributes: effect stack, values, and keyframes with per-property readback; masks and differing Blend Mode are reported, not copied |
1022
1057
  | `batch_apply_effect` | Apply effect to multiple clips |
1023
1058
  | `set_blend_mode` | 27 blend modes |
1024
1059
 
@@ -1087,6 +1122,12 @@ evidence behind these tools and their verification boundaries.
1087
1122
  | `plan_speaker_checkerboard` | Per-speaker segments, split points, and track assignments for checkerboarded dialogue |
1088
1123
  | `plan_active_speaker_reframe` | Active-speaker vertical reframe keyframes, or static stacked / side-by-side two-speaker layouts |
1089
1124
 
1125
+ ### Mask Fit (1)
1126
+
1127
+ | Tool | Description |
1128
+ | :--- | :---------- |
1129
+ | `compute_mask_fit_motion` | Inspect only: Motion Scale and Position that place a still's subject box (source-image fractions) inside an existing Rounded Crop, Crop, or similar mask, with the math inputs and warnings. Apply with `set_clip_scale` / `set_clip_position`, then check with `capture_frame`. No image analysis. |
1130
+
1090
1131
  ### Rhythm Plans (2)
1091
1132
 
1092
1133
  | Tool | Description |
@@ -1147,13 +1188,13 @@ Track targeting, batch operations, markers, audio levels, motion/transform, meta
1147
1188
 
1148
1189
  ## MCP Resources
1149
1190
 
1150
- The server exposes fourteen LLM context resources and eleven workflow prompts:
1191
+ The server exposes fourteen LLM context resources and nineteen workflow prompts:
1151
1192
 
1152
1193
  | Resource URI | Description |
1153
1194
  | :----------- | :---------- |
1154
- | `config://premiere-instructions` | Best practices: workflow order, timeline rules, effect tips, error handling |
1195
+ | `config://premiere-instructions` | Best practices: workflow order, metadata layers, timeline rules, error handling |
1155
1196
  | `config://extendscript-reference` | Complete ExtendScript API reference for writing custom scripts |
1156
- | `config://premiere-workflows` | Machine-readable catalog for rough cuts, dialogue cleanup, captions, and delivery |
1197
+ | `config://premiere-workflows` | Machine-readable catalog for rough cuts, metadata review, dialogue cleanup, captions, and delivery |
1157
1198
  | `config://premiere-project-context` | Revisioned local project-context indexing and retrieval workflow |
1158
1199
  | `premiere://project/info` | Fresh, path-redacted current-project and active-sequence summary |
1159
1200
  | `premiere://project/sequences` | Bounded sequence inventory with stable Premiere IDs |
@@ -1164,7 +1205,7 @@ The server exposes fourteen LLM context resources and eleven workflow prompts:
1164
1205
  | `premiere://effects/applied` | Bounded active-timeline component inventory |
1165
1206
  | `premiere://transitions/available` | Bounded video/audio transition catalog for planning |
1166
1207
  | `premiere://export/presets` | Bounded export-preset names and formats, without native paths |
1167
- | `premiere://project/metadata` | Read-only project and active-timeline summary, without paths or timestamps |
1208
+ | `premiere://project/metadata` | Path-redacted project and active-timeline summary — not XMP or Project Metadata XML |
1168
1209
 
1169
1210
  The ten `premiere://` snapshots are read-only CEP bridge requests. They include a
1170
1211
  revision token for stale-state detection and omit native media, project-tree, preset,
@@ -1327,7 +1368,7 @@ premiere-pro-mcp/
1327
1368
  ├── src/
1328
1369
  │ ├── index.ts # Entry point — stdio transport setup
1329
1370
  │ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
1330
- │ ├── server.ts # MCP server — registers 381 tools, filtered by authority profile
1371
+ │ ├── server.ts # MCP server — registers 384 tools, filtered by authority profile
1331
1372
  │ ├── bridge/
1332
1373
  │ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
1333
1374
  │ │ └── script-builder.ts # ExtendScript generator with ES3 helpers
@@ -1377,6 +1418,7 @@ premiere-pro-mcp/
1377
1418
  ├── Dockerfile # Multi-stage Docker build for Fly.io
1378
1419
  ├── fly.toml # Fly.io deployment config
1379
1420
  ├── RESEARCH.md # API research and implementation status
1421
+ ├── AGENTS.md # IDE / coding-agent map
1380
1422
  ├── CONTRIBUTING.md # Contribution guidelines
1381
1423
  ├── CHANGELOG.md # Version history
1382
1424
  └── LICENSE # MIT License
@@ -1433,7 +1475,9 @@ by default. Enable them only by setting
1433
1475
  directories writable by group/other users are refused by both the server and panels;
1434
1476
  tightening permissions alone cannot make previously staged commands trustworthy.
1435
1477
  On Windows, only the current user, SYSTEM and Administrators may have write access,
1436
- including inherited grants. ACL inspection failures also stop startup. Ancestors must
1478
+ including inherited grants. Windows capability and app-container SIDs (`S-1-15-*`)
1479
+ are ignored: they are not logon principals and appear as inherited FullControl on
1480
+ stock `%LOCALAPPDATA%` paths. ACL inspection failures also stop startup. Ancestors must
1437
1481
  also prevent other users from replacing the bridge path; a private child inside a
1438
1482
  broadly writable parent is insufficient (POSIX sticky temp directories are supported).
1439
1483
  Choose a new directory under a private user-owned location if the connector rejects
@@ -1471,6 +1515,8 @@ Premiere Pro; its npm package is `premiere-pro-mcp`.
1471
1515
  Install the [Claude Desktop bundle](#easiest-supported-path-claude-desktop), install
1472
1516
  the separate signed Premiere connector, restart Premiere, then ask Claude to run
1473
1517
  `verify_premiere_connection` with no changes. That first prompt is read-only.
1518
+ Claude Fable 5.1 is an optional client model for Cursor, Claude Desktop, or Claude
1519
+ Code; see [Claude Fable 5.1 workflows](docs/claude-fable-5-1.md).
1474
1520
 
1475
1521
  **Where is the GitHub repository?**
1476
1522
  <https://github.com/leancoderkavy/premiere-pro-mcp>. Releases, the signed `.zxp`
@@ -1596,6 +1642,7 @@ buy prioritized support, roadmap influence, or any claim about unverified host b
1596
1642
  ## Contributing
1597
1643
 
1598
1644
  Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
1645
+ AI agents and IDE assistants should read [AGENTS.md](AGENTS.md).
1599
1646
 
1600
1647
  The evidence-backed [next improvement pull-request roadmap](docs/next-improvement-pr-roadmap.md)
1601
1648
  breaks the proposed feature, protocol, reliability, and performance work into ten
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.aftereffects.bridge" ExtensionBundleVersion="1.16.3" ExtensionBundleName="MCP for Adobe After Effects">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.aftereffects.bridge" ExtensionBundleVersion="1.17.0" ExtensionBundleName="MCP for Adobe After Effects">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.aftereffects.bridge.panel" Version="1.16.3"/>
4
+ <Extension Id="com.mcp.aftereffects.bridge.panel" Version="1.17.0"/>
5
5
  </ExtensionList>
6
6
  <ExecutionEnvironment>
7
7
  <HostList>
@@ -23,12 +23,12 @@
23
23
  ' $ancestorOwner = $ancestorAcl.GetOwner([System.Security.Principal.SecurityIdentifier]).Value',
24
24
  ' if ($ancestorOwner -notin $trustedAncestors) { $unsafeAncestors += [pscustomobject]@{ sid = $ancestorOwner; path = $ancestor.FullName; reason = "owner" } }',
25
25
  ' $unsafeAncestors += @($ancestorAcl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]) | Where-Object {',
26
- ' $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and (($_.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0) -and (($_.FileSystemRights -band $replacement) -ne 0) -and $_.IdentityReference.Value -notin $trustedAncestors',
26
+ ' $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and (($_.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0) -and (($_.FileSystemRights -band $replacement) -ne 0) -and $_.IdentityReference.Value -notin $trustedAncestors -and $_.IdentityReference.Value -notlike "S-1-15-*"',
27
27
  ' } | ForEach-Object { [pscustomobject]@{ sid = $_.IdentityReference.Value; path = $ancestor.FullName; reason = "replacement_rights" } })',
28
28
  ' $ancestor = $ancestor.Parent',
29
29
  '}',
30
30
  'if ($initialize) {',
31
- ' if ($unsafeAncestors.Count -ne 0) { throw "Bridge directory ancestry is unsafe" }',
31
+ ' if ($unsafeAncestors.Count -ne 0) { throw ("Bridge directory ancestry is unsafe: " + (($unsafeAncestors | ForEach-Object { "{0} ({1}: {2})" -f $_.path, $_.reason, $_.sid }) -join "; ")) }',
32
32
  ' $acl.SetAccessRuleProtection($true, $false)',
33
33
  ' $inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit',
34
34
  ' $propagation = [System.Security.AccessControl.PropagationFlags]::None',
@@ -46,11 +46,17 @@
46
46
  '$unsafe = @($acl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]) | Where-Object {',
47
47
  ' $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and (($_.FileSystemRights -band $mutating) -ne 0)',
48
48
  '} | ForEach-Object {',
49
- ' if ($_.IdentityReference.Value -notin $trusted) { [pscustomobject]@{ sid = $_.IdentityReference.Value; isInherited = [bool]$_.IsInherited } }',
49
+ ' if ($_.IdentityReference.Value -notin $trusted -and $_.IdentityReference.Value -notlike "S-1-15-*") { [pscustomobject]@{ sid = $_.IdentityReference.Value; isInherited = [bool]$_.IsInherited } }',
50
50
  '})',
51
51
  '[pscustomobject]@{ ownerSid = $owner; currentUserSid = $current; unsafeWriteAces = $unsafe; unsafeAncestorEntries = $unsafeAncestors } | ConvertTo-Json -Compress',
52
52
  ].join("\n");
53
53
 
54
+ // Capability (S-1-15-3-*) and app-container package (S-1-15-2-*) SIDs are not
55
+ // logon principals; stock profiles inherit one with FullControl on AppData (#581).
56
+ function isWindowsCapabilitySid(sid) {
57
+ return typeof sid === "string" && sid.toUpperCase().indexOf("S-1-15-") === 0;
58
+ }
59
+
54
60
  function createBridgeDirectorySecurity(runtime) {
55
61
  if (!runtime || !runtime.fs || !runtime.path) {
56
62
  throw new Error("Bridge directory security requires filesystem and path runtimes");
@@ -170,26 +176,29 @@
170
176
  if (!acl || !acl.ownerSid || !acl.currentUserSid || acl.ownerSid !== acl.currentUserSid) {
171
177
  throw new Error("Bridge directory is not owned by the current Windows user: " + resolved);
172
178
  }
173
- var unsafe = Array.isArray(acl.unsafeWriteAces)
179
+ var unsafe = (Array.isArray(acl.unsafeWriteAces)
174
180
  ? acl.unsafeWriteAces
175
181
  : acl.unsafeWriteAces
176
182
  ? [acl.unsafeWriteAces]
177
- : [];
183
+ : []).filter(function (ace) { return !isWindowsCapabilitySid(ace && ace.sid); });
178
184
  if (unsafe.length > 0) {
179
185
  var unsafeSids = unsafe.map(function (ace) { return ace && ace.sid ? ace.sid : "unknown"; });
180
186
  throw new Error(
181
187
  "Bridge directory grants write access to untrusted identities (" + unsafeSids.join(", ") + "): " + resolved
182
188
  );
183
189
  }
184
- var unsafeAncestors = Array.isArray(acl.unsafeAncestorEntries)
190
+ var unsafeAncestors = (Array.isArray(acl.unsafeAncestorEntries)
185
191
  ? acl.unsafeAncestorEntries
186
192
  : acl.unsafeAncestorEntries
187
193
  ? [acl.unsafeAncestorEntries]
188
- : [];
194
+ : []).filter(function (entry) {
195
+ return !entry || entry.reason !== "replacement_rights" || !isWindowsCapabilitySid(entry.sid);
196
+ });
189
197
  if (unsafeAncestors.length > 0) {
190
198
  throw new Error(
191
- "Bridge path has a replaceable ancestor " + unsafeAncestors[0].path +
192
- " (" + unsafeAncestors[0].sid + ")"
199
+ "Bridge path has a replaceable ancestor " + unsafeAncestors.map(function (entry) {
200
+ return (entry && entry.path) + " (" + (entry && entry.reason) + ": " + (entry && entry.sid ? entry.sid : "none") + ")";
201
+ }).join("; ")
193
202
  );
194
203
  }
195
204
  if (newlyCreated && fs.readdirSync(resolved).length > 0) {
Binary file
@@ -1,8 +1,8 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.16.3" ExtensionBundleName="MCP for Adobe Premiere Pro">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.17.0" ExtensionBundleName="MCP for Adobe Premiere Pro">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.premiere.bridge.panel" Version="1.16.3"/>
5
- <Extension Id="com.mcp.premiere.bridge.headless" Version="1.16.3"/>
4
+ <Extension Id="com.mcp.premiere.bridge.panel" Version="1.17.0"/>
5
+ <Extension Id="com.mcp.premiere.bridge.headless" Version="1.17.0"/>
6
6
  </ExtensionList>
7
7
  <ExecutionEnvironment>
8
8
  <HostList>
@@ -23,12 +23,12 @@
23
23
  ' $ancestorOwner = $ancestorAcl.GetOwner([System.Security.Principal.SecurityIdentifier]).Value',
24
24
  ' if ($ancestorOwner -notin $trustedAncestors) { $unsafeAncestors += [pscustomobject]@{ sid = $ancestorOwner; path = $ancestor.FullName; reason = "owner" } }',
25
25
  ' $unsafeAncestors += @($ancestorAcl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]) | Where-Object {',
26
- ' $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and (($_.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0) -and (($_.FileSystemRights -band $replacement) -ne 0) -and $_.IdentityReference.Value -notin $trustedAncestors',
26
+ ' $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and (($_.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0) -and (($_.FileSystemRights -band $replacement) -ne 0) -and $_.IdentityReference.Value -notin $trustedAncestors -and $_.IdentityReference.Value -notlike "S-1-15-*"',
27
27
  ' } | ForEach-Object { [pscustomobject]@{ sid = $_.IdentityReference.Value; path = $ancestor.FullName; reason = "replacement_rights" } })',
28
28
  ' $ancestor = $ancestor.Parent',
29
29
  '}',
30
30
  'if ($initialize) {',
31
- ' if ($unsafeAncestors.Count -ne 0) { throw "Bridge directory ancestry is unsafe" }',
31
+ ' if ($unsafeAncestors.Count -ne 0) { throw ("Bridge directory ancestry is unsafe: " + (($unsafeAncestors | ForEach-Object { "{0} ({1}: {2})" -f $_.path, $_.reason, $_.sid }) -join "; ")) }',
32
32
  ' $acl.SetAccessRuleProtection($true, $false)',
33
33
  ' $inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit',
34
34
  ' $propagation = [System.Security.AccessControl.PropagationFlags]::None',
@@ -46,11 +46,17 @@
46
46
  '$unsafe = @($acl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]) | Where-Object {',
47
47
  ' $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow -and (($_.FileSystemRights -band $mutating) -ne 0)',
48
48
  '} | ForEach-Object {',
49
- ' if ($_.IdentityReference.Value -notin $trusted) { [pscustomobject]@{ sid = $_.IdentityReference.Value; isInherited = [bool]$_.IsInherited } }',
49
+ ' if ($_.IdentityReference.Value -notin $trusted -and $_.IdentityReference.Value -notlike "S-1-15-*") { [pscustomobject]@{ sid = $_.IdentityReference.Value; isInherited = [bool]$_.IsInherited } }',
50
50
  '})',
51
51
  '[pscustomobject]@{ ownerSid = $owner; currentUserSid = $current; unsafeWriteAces = $unsafe; unsafeAncestorEntries = $unsafeAncestors } | ConvertTo-Json -Compress',
52
52
  ].join("\n");
53
53
 
54
+ // Capability (S-1-15-3-*) and app-container package (S-1-15-2-*) SIDs are not
55
+ // logon principals; stock profiles inherit one with FullControl on AppData (#581).
56
+ function isWindowsCapabilitySid(sid) {
57
+ return typeof sid === "string" && sid.toUpperCase().indexOf("S-1-15-") === 0;
58
+ }
59
+
54
60
  function createBridgeDirectorySecurity(runtime) {
55
61
  if (!runtime || !runtime.fs || !runtime.path) {
56
62
  throw new Error("Bridge directory security requires filesystem and path runtimes");
@@ -170,26 +176,29 @@
170
176
  if (!acl || !acl.ownerSid || !acl.currentUserSid || acl.ownerSid !== acl.currentUserSid) {
171
177
  throw new Error("Bridge directory is not owned by the current Windows user: " + resolved);
172
178
  }
173
- var unsafe = Array.isArray(acl.unsafeWriteAces)
179
+ var unsafe = (Array.isArray(acl.unsafeWriteAces)
174
180
  ? acl.unsafeWriteAces
175
181
  : acl.unsafeWriteAces
176
182
  ? [acl.unsafeWriteAces]
177
- : [];
183
+ : []).filter(function (ace) { return !isWindowsCapabilitySid(ace && ace.sid); });
178
184
  if (unsafe.length > 0) {
179
185
  var unsafeSids = unsafe.map(function (ace) { return ace && ace.sid ? ace.sid : "unknown"; });
180
186
  throw new Error(
181
187
  "Bridge directory grants write access to untrusted identities (" + unsafeSids.join(", ") + "): " + resolved
182
188
  );
183
189
  }
184
- var unsafeAncestors = Array.isArray(acl.unsafeAncestorEntries)
190
+ var unsafeAncestors = (Array.isArray(acl.unsafeAncestorEntries)
185
191
  ? acl.unsafeAncestorEntries
186
192
  : acl.unsafeAncestorEntries
187
193
  ? [acl.unsafeAncestorEntries]
188
- : [];
194
+ : []).filter(function (entry) {
195
+ return !entry || entry.reason !== "replacement_rights" || !isWindowsCapabilitySid(entry.sid);
196
+ });
189
197
  if (unsafeAncestors.length > 0) {
190
198
  throw new Error(
191
- "Bridge path has a replaceable ancestor " + unsafeAncestors[0].path +
192
- " (" + unsafeAncestors[0].sid + ")"
199
+ "Bridge path has a replaceable ancestor " + unsafeAncestors.map(function (entry) {
200
+ return (entry && entry.path) + " (" + (entry && entry.reason) + ": " + (entry && entry.sid ? entry.sid : "none") + ")";
201
+ }).join("; ")
193
202
  );
194
203
  }
195
204
  if (newlyCreated && fs.readdirSync(resolved).length > 0) {
@@ -81,7 +81,7 @@
81
81
  <section class="update-section" aria-live="polite">
82
82
  <div class="update-copy">
83
83
  <span class="section-label">MCP updates</span>
84
- <strong id="updateTitle">Version 1.16.3</strong>
84
+ <strong id="updateTitle">Version 1.17.0</strong>
85
85
  <span id="updateDetail">Checking the global MCP server and connector release…</span>
86
86
  </div>
87
87
  <button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" aria-describedby="updateDetail" disabled>
@@ -7,7 +7,7 @@
7
7
  })(this, function () {
8
8
  "use strict";
9
9
 
10
- var CURRENT_VERSION = "1.16.3";
10
+ var CURRENT_VERSION = "1.17.0";
11
11
  var PACKAGE_NAME = "premiere-pro-mcp";
12
12
  var LATEST_PACKAGE_API = "https://registry.npmjs.org/" + PACKAGE_NAME;
13
13
  var LATEST_RELEASE_API =