premiere-pro-mcp 1.14.7 → 1.14.8

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 (51) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +84 -24
  3. package/after-effects-cep-plugin/CSInterface.js +9 -0
  4. package/after-effects-cep-plugin/CSXS/manifest.xml +38 -0
  5. package/after-effects-cep-plugin/host.jsx +5 -0
  6. package/after-effects-cep-plugin/index.html +27 -0
  7. package/after-effects-cep-plugin/main.js +129 -0
  8. package/artifacts/MCPBridgeCEP.zxp +0 -0
  9. package/cep-plugin/CSXS/manifest.xml +3 -3
  10. package/cep-plugin/index.html +4 -4
  11. package/cep-plugin/main.js +215 -41
  12. package/cep-plugin/updater.cjs +131 -1
  13. package/dist/ai/caption-timing.d.ts +60 -0
  14. package/dist/ai/caption-timing.js +205 -0
  15. package/dist/bridge/after-effects-bridge.d.ts +11 -0
  16. package/dist/bridge/after-effects-bridge.js +30 -0
  17. package/dist/bridge/after-effects-script-builder.d.ts +7 -0
  18. package/dist/bridge/after-effects-script-builder.js +57 -0
  19. package/dist/bridge/file-bridge.d.ts +10 -0
  20. package/dist/bridge/file-bridge.js +74 -25
  21. package/dist/diagnostics.d.ts +29 -1
  22. package/dist/diagnostics.js +103 -1
  23. package/dist/doctor-repairs.d.ts +31 -0
  24. package/dist/doctor-repairs.js +121 -0
  25. package/dist/index.js +66 -15
  26. package/dist/platform-capabilities.d.ts +1 -1
  27. package/dist/resources/premiere-doc-inventory.json +46 -31
  28. package/dist/security/capabilities.js +16 -1
  29. package/dist/server.js +67 -89
  30. package/dist/tool-capability-report.js +48 -0
  31. package/dist/tools/captions.d.ts +51 -2
  32. package/dist/tools/captions.js +152 -21
  33. package/dist/tools/health.d.ts +1 -1
  34. package/dist/tools/mogrt-authoring.d.ts +192 -0
  35. package/dist/tools/mogrt-authoring.js +419 -0
  36. package/dist/tools/project-context.d.ts +123 -1
  37. package/dist/tools/project-context.js +177 -4
  38. package/dist/workflows/tool-metadata.js +2 -0
  39. package/docs/mogrt-authoring.md +63 -0
  40. package/docs/project-context-engine.md +10 -0
  41. package/docs/supported-actions.md +10 -6
  42. package/package.json +11 -4
  43. package/public-product-manifest.json +101 -0
  44. package/scripts/generate-premiere-doc-inventory.mjs +84 -41
  45. package/scripts/generate-public-product-manifest.mjs +130 -0
  46. package/scripts/install-cep.ps1 +17 -14
  47. package/scripts/install-cep.sh +26 -9
  48. package/scripts/uninstall-cep.ps1 +12 -9
  49. package/scripts/uninstall-cep.sh +22 -6
  50. package/scripts/verify-npm-package.mjs +4 -0
  51. package/uxp-plugin/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,49 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.14.8] - 2026-09-04
10
+
11
+ ### Added
12
+
13
+ - Added a separate After Effects CEP bridge and four approval-gated MOGRT
14
+ authoring tools. The initial `lower_third` recipe only runs in an already
15
+ saved, workspace-contained AE project and exports to an existing approved
16
+ directory.
17
+ - Added one-time preview tokens, explicit export confirmation, isolated AE
18
+ bridge helpers/temp directory, and local ZIP-header artifact verification.
19
+ - Added a local SRT/VTT timing-review plan for lecture and interview captions,
20
+ including bounded correction previews and a separate structural/playback/
21
+ rendered-output verification checklist.
22
+ - Added revision-bound, opt-in editorial evidence import for caller-supplied
23
+ transcript, shot, audio, note, and opaque frame-reference data; it remains
24
+ local and rejects stale source or timeline revisions.
25
+ - Added no-write `premiere-pro-mcp --doctor --plan-fixes` repair guidance and a
26
+ narrowly scoped, confirmation-gated local connector recovery path.
27
+ - Added a generated public workflow manifest, workflow-proof receipt/runbook,
28
+ and a universal client setup guide with explicit distribution boundaries.
29
+
30
+ ### Changed
31
+
32
+ - Added an in-panel global npm/CEP connector update handoff for Windows. It
33
+ requires confirmation, waits for Premiere to close without forcing it, and
34
+ uses the published-package update path.
35
+ - Reused immutable MCP registration descriptors and JSON Schema adapters across
36
+ stateless server construction, while retaining per-request context, telemetry,
37
+ and UXP state. Concurrent CEP commands now share a response-directory watcher
38
+ with polling retained as the correctness fallback.
39
+ - Refined the public landing for mobile and reduced motion, removed the deferred
40
+ 3D dependency path, and refreshed its facts, structured data, sitemap, public
41
+ crawl policy, and machine-readable reference files.
42
+
43
+ ### Safety
44
+
45
+ - MOGRT authoring never accepts arbitrary script text, creates or switches AE
46
+ projects, creates output directories, overwrites artifacts, or treats host
47
+ acceptance/a ZIP header as import, rendered-frame, or visual proof.
48
+ - Caption timing plans, editorial evidence import, doctor repair plans, and
49
+ public workflow materials remain distinct from licensed-host, playback,
50
+ rendered-output, provider, or marketplace verification.
51
+
9
52
  ## [1.14.7] - 2026-09-02
10
53
 
11
54
  ### Added
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  **Give compatible AI assistants structured control over supported Adobe Premiere Pro workflows.**
10
10
 
11
- 328 core tools across 37 modules, 4 resources, and 11 guided workflows. A connected UXP host adds 91 capability-gated tools.
11
+ 332 core tools across 39 modules, 4 resources, and 11 guided workflows. A connected UXP host adds 91 capability-gated tools.
12
12
 
13
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
14
14
  [![Node.js](https://img.shields.io/badge/Node.js-20.19%2B-green.svg)](https://nodejs.org)
@@ -31,22 +31,36 @@ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that l
31
31
  "Add the B-roll clips to V2, apply a cross dissolve between each, color correct them to match the A-roll, and export a 1080p ProRes."
32
32
  ```
33
33
 
34
- The AI handles the entire workflow through 328 core tools spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, and connection-verification surfaces. A compatible, authenticated UXP panel adds 91 documented, capability-gated tools without replacing the production CEP bridge.
35
-
36
- ### Latest release: 1.14.7
37
-
38
- - **Guarded UXP editing:** compatible hosts can use verified sequence ranges,
39
- display formats, playhead, marker, transition, caption, silence-cut, and split-edit workflows.
40
- - **Review-first evidence:** local delivery checks, sampled media analysis, and
41
- editorial context packs remain bounded and avoid unapproved provider writes.
42
- - **Narrowed host behavior:** unsupported sequence pixel-aspect ratios and
43
- partial UXP transition writes fail closed; other mutations retain their
44
- documented verified or explicitly `committed_unverified` outcome.
34
+ The AI handles the entire workflow through 332 core tools 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. A compatible, authenticated UXP panel adds 91 documented, capability-gated tools without replacing the production CEP bridge.
35
+
36
+ ### Latest release: 1.14.8
37
+
38
+ - **MOGRT authoring:** an optional, separate After Effects CEP connector can
39
+ create one approval-gated lower-third recipe in an already saved workspace
40
+ project, then report local artifact evidence without claiming visual proof.
41
+ - **Global-update handoff:** a global npm installation can show its server and
42
+ connector update state in the Windows CEP panel and, after explicit
43
+ confirmation, update only after Premiere has been quit; it never changes a
44
+ project, client configuration, source checkout, or custom npm prefix.
45
+ - **Local review planning:** caption timing previews parse caller-supplied
46
+ SRT/VTT without writing or importing it, while revision-bound editorial
47
+ evidence stays in the opt-in local context index without provider calls.
48
+ - **Repair preview:** `premiere-pro-mcp --doctor --plan-fixes` produces a
49
+ privacy-safe, no-write repair plan; the narrowly eligible connector repair
50
+ still requires an explicit confirmation that Premiere is closed.
51
+ - **Auditable guidance:** the universal setup guide, generated public workflow
52
+ manifest, and proof runbook make workflow and verification boundaries
53
+ inspectable without claiming a licensed-host walkthrough occurred.
54
+ - **Faster, clearer delivery:** immutable MCP registration work is reused
55
+ safely across stateless requests, and the landing now has a lighter,
56
+ mobile-first workflow view plus current machine-readable facts and crawl
57
+ guidance for its public pages.
45
58
  - **Explicit boundary:** the hosted endpoint remains an operator-managed MCP
46
- service; unauthenticated callers are rejected and it does not pair users to
47
- local Premiere processes.
59
+ service; unauthenticated callers are rejected and it does not pair users to
60
+ local Premiere processes. See the generated [supported action catalog](docs/supported-actions.md)
61
+ for individual capability and verification contracts.
48
62
 
49
- See the [v1.14.7 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.14.7)
63
+ See the [v1.14.8 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.14.8)
50
64
  for complete details. Live installation in Premiere Pro still requires host verification.
51
65
 
52
66
  ### Current MCP protocol support
@@ -93,9 +107,9 @@ their bins, media rules, and organization rules before a facility uses one.
93
107
 
94
108
  ### Easiest supported path: Claude Desktop
95
109
 
96
- 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.7/premiere-pro-mcp-1.14.7.mcpb).
110
+ 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.8/premiere-pro-mcp-1.14.8.mcpb).
97
111
  2. In Claude Desktop, open **Settings > Extensions > Advanced settings > Install Extension**, select the downloaded bundle, and restart Claude Desktop.
98
- 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.7/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.
112
+ 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.8/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.
99
113
  4. Restart Premiere, open a project, then open **Window > Extensions > MCP for Adobe Premiere Pro**.
100
114
  5. In Claude, enter: `Safely check my Premiere connection with verify_premiere_connection. Make no changes.`
101
115
 
@@ -118,6 +132,11 @@ If a bridge, project, or active sequence is missing, fix that setup state before
118
132
 
119
133
  Cursor, VS Code/Copilot, Windsurf, and other MCP clients do not currently have a project-provided one-click installer. Use their MCP settings with the advanced npm route below. Keep the assistant, server, connector, and Premiere on the same computer.
120
134
 
135
+ For a portable reference users can download and attach to any AI assistant, see
136
+ the [MCP for Adobe Premiere Pro setup guide for AI assistants](premiere-mcp-setup-guide.md).
137
+ Attaching the guide provides assistant context; the local server and Premiere
138
+ connector still need to be installed separately.
139
+
121
140
  <details>
122
141
  <summary><strong>Advanced setup: npm or source</strong></summary>
123
142
 
@@ -188,6 +207,19 @@ premiere-pro-mcp --update
188
207
  client configuration and projects untouched. Restart Premiere and your MCP
189
208
  client afterward, then run `verify_premiere_connection` before editing.
190
209
 
210
+ **From the MCP for Adobe Premiere Pro panel (Windows global npm install):**
211
+
212
+ The **MCP updates** card compares the installed global server and connector
213
+ with npm `latest`. Choose **Update after quit**, review the confirmation, then
214
+ quit Premiere normally. A per-user helper waits for Premiere to exit; it never
215
+ force-quits the app, then installs the published npm package and refreshes its
216
+ matching connector. This also supports older global installs that predate the
217
+ `--update` command.
218
+ When you reopen Premiere, the panel reports the result and reminds you to
219
+ restart your MCP client and verify the connection. This flow never changes a
220
+ project or MCP client configuration. It deliberately will not update a Git
221
+ checkout, a custom npm prefix, or a Claude Desktop `.mcpb` bundle.
222
+
191
223
  **Installed from a Git clone:**
192
224
 
193
225
  ```bash
@@ -374,11 +406,11 @@ From a clone of this repository:
374
406
  ```bash
375
407
  codex plugin marketplace add .
376
408
  codex plugin add premiere-pro@premiere-pro-mcp
377
- npx -y premiere-pro-mcp@1.14.7 --install-cep
409
+ npx -y premiere-pro-mcp@1.14.8 --install-cep
378
410
  ```
379
411
 
380
412
  Restart Premiere Pro and start a new Codex session after installation. The plugin
381
- launches `premiere-pro-mcp@1.14.7` through `npx`; the separate CEP installation is
413
+ launches `premiere-pro-mcp@1.14.8` through `npx`; the separate CEP installation is
382
414
  required because the MCP server communicates with the running Premiere host through
383
415
  the local bridge.
384
416
 
@@ -398,7 +430,7 @@ For Claude Code, add this repository as a marketplace and install the plugin:
398
430
  Then install the Premiere bridge and start a new Claude Code session:
399
431
 
400
432
  ```bash
401
- npx -y premiere-pro-mcp@1.14.7 --install-cep
433
+ npx -y premiere-pro-mcp@1.14.8 --install-cep
402
434
  ```
403
435
 
404
436
  The Claude Code package lives in
@@ -423,6 +455,7 @@ installed separately.
423
455
  | CEP production bridge | Premiere Pro 2020–2026 | Premiere Pro 2020–2026 | Run `get_capabilities`, then `ping` with Premiere open |
424
456
  | UXP preview bridge | Premiere Pro 25.6+ | Premiere Pro 25.6+ | Live loopback WebSocket and host API verification required |
425
457
  | npm CEP installer | Copies plugin and verifies `REG_SZ` debug keys | Copies plugin and verifies the installed manifest/debug settings | Restart Premiere after installation |
458
+ | AE MOGRT authoring CEP bridge | After Effects 2018+ | After Effects 2018+ | Opens only a saved, workspace-contained AE project; a local ZIP check is not import, playback, or visual verification |
426
459
  | CI build and unit tests | Node 20, 22, and 24 | Node 20, 22, and 24 | GitHub-hosted OS runners; no Adobe host is available in CI |
427
460
 
428
461
  `get_capabilities` reports the current operating system, temp directory, CEP/UXP coverage, enabled authority profile, and any live-host verification still required. It also includes the full `tools` catalog generated from the tools registered by the server, including tools disabled by the active profile. Every entry identifies:
@@ -437,7 +470,7 @@ installed separately.
437
470
  QE-backed tools are reported as `experimental` because QE is undocumented and can vary between Premiere builds. Authority availability is reported separately from implementation support, so disabling `edit`, for example, does not incorrectly label editing tools as unsupported. Static metadata never claims that a Premiere operation succeeded; use `ping` and inspect each tool result for runtime evidence.
438
471
 
439
472
  MCP `tools/list` is filtered to the active authority profile. The default
440
- `inspect,edit,export,filesystem` profile advertises 326 of the 328 registered
473
+ `inspect,edit,export,filesystem` profile advertises 330 of the 332 registered
441
474
  tools and omits `execute_extendscript` and `evaluate_expression`, which require
442
475
  explicit `unsafe-script` authority. `ping` and `get_capabilities` remain visible
443
476
  under every profile so a restricted or misconfigured server can still explain
@@ -460,6 +493,32 @@ The tool-specific `data` shape remains versioned by the individual tool result,
460
493
  so clients can reliably distinguish transport success from a Premiere or local
461
494
  operation failure without parsing the text block.
462
495
 
496
+ ### After Effects MOGRT authoring
497
+
498
+ This is a narrow authoring path, not an arbitrary After Effects script runner.
499
+ Install the separate local connector, fully restart After Effects, and open
500
+ **Window > Extensions > MCP for Adobe After Effects**:
501
+
502
+ ```bash
503
+ premiere-pro-mcp --install-after-effects-cep
504
+ ```
505
+
506
+ Then open a saved `.aep` project inside an approved workspace and use this order:
507
+
508
+ 1. `verify_after_effects_connection` — read-only connector and saved-project check.
509
+ 2. `preview_mogrt_recipe` — produces an expiring, one-time plan for the supported
510
+ `lower_third` recipe; it never creates directories or contacts Adobe.
511
+ 3. `create_mogrt_recipe` with that token and `confirm_export: true` — creates one
512
+ composition, saves the open project, and requests one `.mogrt` export.
513
+ 4. `verify_mogrt_artifact` — checks only local file existence and its ZIP header.
514
+
515
+ The authoring connector uses `AFTER_EFFECTS_MCP_TEMP_DIR` (default: the OS temp
516
+ directory plus `after-effects-mcp-bridge`), completely separate from
517
+ `PREMIERE_TEMP_DIR`. The tool will not create, replace, or switch projects; it
518
+ requires the already-open AE project and output directory to be contained by the
519
+ same approved workspace. A valid local artifact still needs import into a
520
+ disposable Premiere sequence and rendered-frame review before delivery.
521
+
463
522
  `inspect_sequence_review_report` creates one read-only handoff report from
464
523
  Premiere timeline readback: sequence structure, primary-track gaps, disabled
465
524
  clips, muted tracks, marker timing, and offline-source evidence. It never
@@ -637,7 +696,7 @@ opaque `UniqueSerializeable` identity twice, and rejects drift without retaining
637
696
  the value or treating it as edit authority. See the [unique-identity workflow
638
697
  notes](docs/uxp-unique-identity-workflows.md) for its bounds and proof boundary.
639
698
 
640
- ## Tools (328 core total; 326 under the default profile; 417 with a connected UXP bridge)
699
+ ## Tools (332 core total; 330 under the default profile; 421 with a connected UXP bridge)
641
700
 
642
701
  The [complete supported-actions catalog](docs/supported-actions.md) lists every
643
702
  registered core tool, the two tools restricted behind explicit `unsafe-script`
@@ -1013,11 +1072,11 @@ premiere-pro-mcp/
1013
1072
  ├── src/
1014
1073
  │ ├── index.ts # Entry point — stdio transport setup
1015
1074
  │ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
1016
- │ ├── server.ts # MCP server — registers 328 tools, filtered by authority profile
1075
+ │ ├── server.ts # MCP server — registers 332 tools, filtered by authority profile
1017
1076
  │ ├── bridge/
1018
1077
  │ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
1019
1078
  │ │ └── script-builder.ts # ExtendScript generator with ES3 helpers
1020
- │ ├── tools/ # 31 tool modules
1079
+ │ ├── tools/ # 39 tool modules
1021
1080
  │ │ ├── discovery.ts # Project discovery and queries
1022
1081
  │ │ ├── recovery.ts # Read-only autosave discovery and private bridge telemetry
1023
1082
  │ │ ├── project.ts # Project management and import
@@ -1056,6 +1115,7 @@ premiere-pro-mcp/
1056
1115
  │ ├── main.js # Bridge polling and script execution
1057
1116
  │ ├── host.jsx # ExtendScript entry point
1058
1117
  │ └── CSInterface.js # Adobe CEP interface library
1118
+ ├── after-effects-cep-plugin/ # Separate AE CEP bridge for guarded MOGRT recipes
1059
1119
  ├── scripts/
1060
1120
  │ ├── install-cep.sh # macOS CEP installer (symlink + debug mode)
1061
1121
  │ └── install-cep.ps1 # Windows CEP installer (copy + REG_SZ debug mode)
@@ -0,0 +1,9 @@
1
+ /* Minimal CEP bridge API used by the local After Effects connector. */
2
+ function CSInterface() {}
3
+ CSInterface.prototype.evalScript = function (script, callback) {
4
+ if (typeof __adobe_cep__ !== "undefined") {
5
+ __adobe_cep__.evalScript(script, callback || function () {});
6
+ } else if (callback) {
7
+ callback("EvalScript Error: Not in CEP environment");
8
+ }
9
+ };
@@ -0,0 +1,38 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.aftereffects.bridge" ExtensionBundleVersion="1.14.8" ExtensionBundleName="MCP for Adobe After Effects">
3
+ <ExtensionList>
4
+ <Extension Id="com.mcp.aftereffects.bridge.panel" Version="1.14.8"/>
5
+ </ExtensionList>
6
+ <ExecutionEnvironment>
7
+ <HostList>
8
+ <Host Name="AEFT" Version="15.0"/>
9
+ </HostList>
10
+ <LocaleList>
11
+ <Locale Code="All"/>
12
+ </LocaleList>
13
+ <RequiredRuntimeList>
14
+ <RequiredRuntime Name="CSXS" Version="9.0"/>
15
+ </RequiredRuntimeList>
16
+ </ExecutionEnvironment>
17
+ <DispatchInfoList>
18
+ <Extension Id="com.mcp.aftereffects.bridge.panel">
19
+ <DispatchInfo>
20
+ <Resources>
21
+ <MainPath>./index.html</MainPath>
22
+ <ScriptPath>./host.jsx</ScriptPath>
23
+ <CEFCommandLine>
24
+ <Parameter>--allow-file-access-from-files</Parameter>
25
+ <Parameter>--enable-nodejs</Parameter>
26
+ </CEFCommandLine>
27
+ </Resources>
28
+ <Lifecycle><AutoVisible>true</AutoVisible></Lifecycle>
29
+ <UI>
30
+ <Type>Panel</Type>
31
+ <Menu>MCP for Adobe After Effects</Menu>
32
+ <Geometry><Size><Height>250</Height><Width>390</Width></Size><MinSize><Height>200</Height><Width>320</Width></MinSize></Geometry>
33
+ <Icons/>
34
+ </UI>
35
+ </DispatchInfo>
36
+ </Extension>
37
+ </DispatchInfoList>
38
+ </ExtensionManifest>
@@ -0,0 +1,5 @@
1
+ // The command body is supplied through the local bridge. Keeping this host
2
+ // script minimal prevents unreviewed global helpers from persisting in AE.
3
+ function mcpAfterEffectsBridgePing() {
4
+ return "pong";
5
+ }
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>MCP for Adobe After Effects</title>
7
+ <style>
8
+ body { margin: 0; background: #202124; color: #f3f4f6; font: 13px/1.45 Arial, sans-serif; }
9
+ main { padding: 18px; } h1 { margin: 0 0 5px; font-size: 16px; } p { color: #c7cbd1; }
10
+ label { display: block; margin: 16px 0 6px; font-weight: bold; } input { box-sizing: border-box; width: 100%; padding: 8px; border: 1px solid #555; border-radius: 4px; background: #111827; color: white; }
11
+ button { margin-top: 12px; padding: 8px 12px; border: 0; border-radius: 4px; background: #2563eb; color: white; cursor: pointer; } #status { display: inline-block; margin-left: 9px; color: #86efac; }
12
+ small { display: block; margin-top: 8px; color: #9ca3af; }
13
+ </style>
14
+ </head>
15
+ <body>
16
+ <main>
17
+ <h1>MCP for Adobe After Effects</h1>
18
+ <p>Local authoring connector for approval-gated MOGRT recipes.</p>
19
+ <label for="tempDir">After Effects bridge directory</label>
20
+ <input id="tempDir" spellcheck="false" autocomplete="off" aria-describedby="bridgeHelp">
21
+ <button id="toggle" type="button">Start connector</button><strong id="status" role="status">Stopped</strong>
22
+ <small id="bridgeHelp">This must match AFTER_EFFECTS_MCP_TEMP_DIR when that environment variable is set for your MCP client.</small>
23
+ </main>
24
+ <script src="CSInterface.js"></script>
25
+ <script src="main.js"></script>
26
+ </body>
27
+ </html>
@@ -0,0 +1,129 @@
1
+ /* Dedicated AE CEP file bridge. It deliberately uses a different directory
2
+ * from the Premiere connector so simultaneous Adobe hosts cannot claim each
3
+ * other's ExtendScript commands. */
4
+ (function () {
5
+ var cs = new CSInterface();
6
+ var fs = nodeRequire("fs");
7
+ var path = nodeRequire("path");
8
+ var os = nodeRequire("os");
9
+ var pollTimer = null;
10
+ var heartbeatTimer = null;
11
+ var running = false;
12
+ var tempDir = defaultBridgeDirectory();
13
+ var engineId = Math.random().toString(36).slice(2, 8);
14
+
15
+ function nodeRequire(moduleName) {
16
+ if (typeof require !== "undefined") return require(moduleName);
17
+ var node = typeof cep_node !== "undefined" ? cep_node : window.cep_node;
18
+ if (node && typeof node.require === "function") return node.require(moduleName);
19
+ throw new Error("Node.js is unavailable. Confirm --enable-nodejs in the CEP manifest, then fully restart After Effects.");
20
+ }
21
+
22
+ function defaultBridgeDirectory() {
23
+ try {
24
+ var process = nodeRequire("process");
25
+ var configured = process && process.env && process.env.AFTER_EFFECTS_MCP_TEMP_DIR;
26
+ if (typeof configured === "string" && configured.trim()) return configured.trim();
27
+ } catch (ignored) {}
28
+ return path.join(os.tmpdir(), "after-effects-mcp-bridge");
29
+ }
30
+
31
+ function setStatus(value, active) {
32
+ document.getElementById("status").textContent = value;
33
+ document.getElementById("status").style.color = active ? "#86efac" : "#fca5a5";
34
+ document.getElementById("toggle").textContent = active ? "Stop connector" : "Start connector";
35
+ }
36
+
37
+ function writeFileAtomic(filePath, text) {
38
+ var staged = filePath + "." + engineId + ".staged";
39
+ try {
40
+ fs.writeFileSync(staged, text, "utf8");
41
+ fs.renameSync(staged, filePath);
42
+ return true;
43
+ } catch (error) {
44
+ try { if (fs.existsSync(staged)) fs.unlinkSync(staged); } catch (ignored) {}
45
+ setStatus("Connector needs attention", false);
46
+ return false;
47
+ }
48
+ }
49
+
50
+ function heartbeat() {
51
+ if (!tempDir) return;
52
+ writeFileAtomic(path.join(tempDir, "bridge-heartbeat.json"), JSON.stringify({ protocolVersion: 1, state: running ? "running" : "waiting" }));
53
+ }
54
+
55
+ function readCommandFiles() {
56
+ try {
57
+ return fs.readdirSync(tempDir).filter(function (entry) {
58
+ return entry.indexOf("cmd_") === 0 && entry.slice(-4) === ".jsx";
59
+ }).sort();
60
+ } catch (ignored) { return []; }
61
+ }
62
+
63
+ function replyFor(result) {
64
+ if (!result || result === "undefined" || result === "null") {
65
+ return JSON.stringify({ success: false, error: "The After Effects connector received an empty evalScript result. Reopen the panel and retry once." });
66
+ }
67
+ try { return JSON.stringify(JSON.parse(result)); }
68
+ catch (ignored) {
69
+ return result.indexOf("Error") === 0
70
+ ? JSON.stringify({ success: false, error: result })
71
+ : JSON.stringify({ success: true, data: result });
72
+ }
73
+ }
74
+
75
+ function processOne(fileName) {
76
+ var source = path.join(tempDir, fileName);
77
+ var claim = source + "." + engineId + ".claimed";
78
+ try { fs.renameSync(source, claim); } catch (ignored) { return; }
79
+ var script;
80
+ try { script = fs.readFileSync(claim, "utf8"); } catch (error) { script = null; }
81
+ try { if (fs.existsSync(claim)) fs.unlinkSync(claim); } catch (ignored) {}
82
+ if (!script) return;
83
+ var id = fileName.replace("cmd_", "").replace(".jsx", "");
84
+ var busy = path.join(tempDir, "busy_" + id + ".json");
85
+ var started = Date.now();
86
+ var busyTimer = setInterval(function () {
87
+ try { fs.writeFileSync(busy, JSON.stringify({ id: id, elapsedMs: Date.now() - started }), "utf8"); } catch (ignored) {}
88
+ }, 2000);
89
+ cs.evalScript(script, function (result) {
90
+ clearInterval(busyTimer);
91
+ try { if (fs.existsSync(busy)) fs.unlinkSync(busy); } catch (ignored) {}
92
+ writeFileAtomic(path.join(tempDir, "res_" + id + ".json"), replyFor(String(result || "")));
93
+ });
94
+ }
95
+
96
+ function processCommands() {
97
+ var files = readCommandFiles();
98
+ for (var index = 0; index < files.length; index++) processOne(files[index]);
99
+ }
100
+
101
+ function start() {
102
+ tempDir = document.getElementById("tempDir").value.trim();
103
+ if (!tempDir) { setStatus("Set a bridge directory", false); return; }
104
+ try { fs.mkdirSync(tempDir, { recursive: true, mode: 0o700 }); }
105
+ catch (error) { setStatus("Cannot create bridge directory", false); return; }
106
+ running = true;
107
+ heartbeat();
108
+ if (pollTimer) clearInterval(pollTimer);
109
+ if (heartbeatTimer) clearInterval(heartbeatTimer);
110
+ pollTimer = setInterval(processCommands, 200);
111
+ heartbeatTimer = setInterval(heartbeat, 1000);
112
+ try { localStorage.setItem("after_effects_mcp_temp_dir", tempDir); } catch (ignored) {}
113
+ setStatus("Connector running", true);
114
+ }
115
+
116
+ function stop() {
117
+ running = false;
118
+ heartbeat();
119
+ if (pollTimer) clearInterval(pollTimer);
120
+ if (heartbeatTimer) clearInterval(heartbeatTimer);
121
+ pollTimer = null;
122
+ heartbeatTimer = null;
123
+ setStatus("Stopped", false);
124
+ }
125
+
126
+ var field = document.getElementById("tempDir");
127
+ try { field.value = localStorage.getItem("after_effects_mcp_temp_dir") || tempDir; } catch (ignored) { field.value = tempDir; }
128
+ document.getElementById("toggle").onclick = function () { if (running) stop(); else start(); };
129
+ }());
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.14.7" ExtensionBundleName="MCP for Adobe Premiere Pro">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.14.8" ExtensionBundleName="MCP for Adobe Premiere Pro">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.premiere.bridge.panel" Version="1.14.7"/>
5
- <Extension Id="com.mcp.premiere.bridge.headless" Version="1.14.7"/>
4
+ <Extension Id="com.mcp.premiere.bridge.panel" Version="1.14.8"/>
5
+ <Extension Id="com.mcp.premiere.bridge.headless" Version="1.14.8"/>
6
6
  </ExtensionList>
7
7
  <ExecutionEnvironment>
8
8
  <HostList>
@@ -80,11 +80,11 @@
80
80
 
81
81
  <section class="update-section" aria-live="polite">
82
82
  <div class="update-copy">
83
- <span class="section-label">Connector updates</span>
84
- <strong id="updateTitle">Version 1.14.7</strong>
85
- <span id="updateDetail">Checking for updates…</span>
83
+ <span class="section-label">MCP updates</span>
84
+ <strong id="updateTitle">Version 1.14.8</strong>
85
+ <span id="updateDetail">Checking the global MCP server and connector release…</span>
86
86
  </div>
87
- <button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" disabled>
87
+ <button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" aria-describedby="updateDetail" disabled>
88
88
  Check again
89
89
  </button>
90
90
  </section>