premiere-pro-mcp 1.2.2 → 1.3.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,36 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.3.0] - 2026-07-25
10
+
11
+ ### Added
12
+
13
+ - Added a Windows release workflow that builds and verifies a signed CEP ZXP with Adobe's pinned
14
+ `ZXPSignCmd`, includes it in the npm package, and installs it ahead of the unsigned development
15
+ bundle.
16
+ - Added `--diagnose-cep` to verify installation metadata, debug-key types, and recent Premiere
17
+ signature failures.
18
+
19
+ ### Changed
20
+
21
+ - Upgraded the toolchain to TypeScript 7, Vitest 4, Zod 4, `@types/node` 26, and
22
+ `@modelcontextprotocol/sdk` 1.29.
23
+ - Updated the landing app to Next.js 16.2.12 and patched production transitive dependencies.
24
+ - Raised the supported Node.js floor to 20.19 and expanded CI through Node.js 24.
25
+
26
+ ### Fixed
27
+
28
+ - Added explicit Node types for TypeScript 7 and updated Zod 4 JSON-schema conversion.
29
+ - Fixed Windows installations that require a signed CEP extension instead of the debug-mode raw
30
+ folder used by development builds. ([#36](https://github.com/leancoderkavy/premiere-pro-mcp/issues/36))
31
+
32
+ ## [1.2.3] - 2026-07-23
33
+
34
+ ### Changed
35
+
36
+ - Improved npm and GitHub discovery metadata, added explicit TypeScript and public-registry package
37
+ configuration, and added automated dependency update configuration.
38
+
9
39
  ## [1.2.2] - 2026-07-23
10
40
 
11
41
  ### Fixed
package/README.md CHANGED
@@ -7,8 +7,8 @@
7
7
  269 tools across 29 modules, 3 resources, and 4 guided workflows.
8
8
 
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
10
- [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green.svg)](https://nodejs.org)
11
- [![MCP](https://img.shields.io/badge/MCP-1.27-purple.svg)](https://modelcontextprotocol.io)
10
+ [![Node.js](https://img.shields.io/badge/Node.js-20.19%2B-green.svg)](https://nodejs.org)
11
+ [![MCP](https://img.shields.io/badge/MCP-1.29-purple.svg)](https://modelcontextprotocol.io)
12
12
  [![npm](https://img.shields.io/npm/v/premiere-pro-mcp.svg)](https://www.npmjs.com/package/premiere-pro-mcp)
13
13
  [![Fly.io](https://img.shields.io/badge/Fly.io-deployed-7C3AED.svg)](https://premiere-pro-mcp.fly.dev)
14
14
  [![Premiere Pro](https://img.shields.io/badge/Premiere%20Pro-2020--2026-9999FF.svg)](https://www.adobe.com/products/premiere.html)
@@ -19,21 +19,22 @@
19
19
 
20
20
  ## What is this?
21
21
 
22
- An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that lets AI assistants like **Claude**, **Windsurf**, **Cursor**, or any MCP-compatible client directly control Adobe Premiere Pro — importing media, editing timelines, applying effects, managing keyframes, exporting, and more.
22
+ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that lets AI assistants like **Claude**, **Windsurf**, **Cursor**, **GitHub Copilot**, or any MCP-compatible client directly control Adobe Premiere Pro — importing media, editing timelines, applying effects, managing keyframes, exporting, and more.
23
23
 
24
- ```
24
+ ```text
25
25
  "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."
26
26
  ```
27
27
 
28
28
  The AI handles the entire workflow through 269 tools spanning the supported ExtendScript, QE DOM, and safe edit-planning surfaces.
29
29
 
30
- ### What's new in 1.2.2
30
+ ### What's new in 1.3.0
31
31
 
32
- - npm repository, homepage, issue, and clone links now point to the maintained project.
33
- - Mutation tools now verify Premiere state, audio dB is converted to amplitude correctly, and
34
- affected Premiere Pro 26.3 hosts return actionable errors instead of false success.
35
- - npm publishing now has a guided local helper and a GitHub Actions workflow so releases can be
36
- published without repeating manual auth and validation steps.
32
+ - Windows npm releases now include a verified, signed CEP ZXP and install it automatically, covering
33
+ hosts that reject the raw development bundle even when `PlayerDebugMode` is enabled.
34
+ - `premiere-pro-mcp --diagnose-cep` checks the installed manifest, debug-key types, and recent
35
+ Premiere signature failures.
36
+ - TypeScript 7, Vitest 4, Zod 4, MCP SDK 1.29, Next.js 16.2, and patched transitive dependencies
37
+ modernize the toolchain and remove production audit findings.
37
38
 
38
39
  ### Added in 1.2.0
39
40
 
@@ -187,6 +188,24 @@ Add to `.cursor/mcp.json` in your project or global config:
187
188
 
188
189
  </details>
189
190
 
191
+ <details>
192
+ <summary><strong>GitHub Copilot (VS Code)</strong></summary>
193
+
194
+ Add to your VS Code MCP server configuration:
195
+
196
+ ```json
197
+ {
198
+ "mcpServers": {
199
+ "premiere-pro": {
200
+ "command": "node",
201
+ "args": ["/absolute/path/to/premiere-pro-mcp/dist/index.js"]
202
+ }
203
+ }
204
+ }
205
+ ```
206
+
207
+ </details>
208
+
190
209
  ### 4. Verify the bridge in Premiere Pro
191
210
 
192
211
  1. Open (or restart) Premiere Pro
@@ -199,7 +218,7 @@ The default bridge directory is derived from the operating system on both sides,
199
218
  ### Windows and macOS capability coverage
200
219
 
201
220
  | Surface | Windows | macOS | Verification boundary |
202
- |---|---|---|---|
221
+ | :------ | :------ | :---- | :-------------------- |
203
222
  | CEP production bridge | Premiere Pro 2020–2026 | Premiere Pro 2020–2026 | Run `get_capabilities`, then `ping` with Premiere open |
204
223
  | UXP preview bridge | Premiere Pro 25.6+ | Premiere Pro 25.6+ | Live loopback WebSocket and host API verification required |
205
224
  | npm CEP installer | Copies plugin and verifies `REG_SZ` debug keys | Copies plugin and verifies the installed manifest/debug settings | Restart Premiere after installation |
@@ -212,28 +231,31 @@ The default bridge directory is derived from the operating system on both sides,
212
231
  ## Architecture
213
232
 
214
233
  **Local (stdio):**
215
- ```
216
- ┌───────────────┐ stdio (MCP) ┌──────────────┐ File-based IPC ┌──────────────┐
217
- │ AI Client ◄──────────────► │ MCP Server │ ◄────────────────► │ CEP Plugin │
234
+
235
+ ```text
236
+ ┌───────────────┐ stdio (MCP) ┌──────────────┐ File-based IPC ┌───────────────┐
237
+ │ AI Client │ ◄──────────────► │ MCP Server │ ◄────────────────► │ CEP Plugin │
218
238
  │ (Claude, │ │ (Node.js / │ .jsx commands │ (runs inside │
219
- │ Windsurf, │ │ TypeScript) │ .json responses │ Premiere)
220
- │ Cursor) │ └──────────────┘ └──────┬────────┘
239
+ │ Windsurf, │ │ TypeScript) │ .json responses │ Premiere)
240
+ │ Cursor, │ └──────────────┘ └──────┬────────┘
241
+ │ Copilot) │ │
221
242
  └───────────────┘ │ evalScript()
222
243
 
223
- ┌──────────────┐
244
+ ┌───────────────┐
224
245
  │ Premiere Pro │
225
246
  │ ExtendScript │
226
247
  │ + QE DOM │
227
- └──────────────┘
248
+ └───────────────┘
228
249
  ```
229
250
 
230
251
  **Remote (HTTP/SSE — Fly.io):**
231
- ```
252
+
253
+ ```text
232
254
  ┌───────────────┐ HTTP+SSE (MCP) ┌─────────────────────┐ File-based IPC ┌──────────────┐
233
- │ AI Client │ ◄───────────────► │ MCP Server │ ◄────────────────► │ CEP Plugin │
234
- │ (any MCP │ │ premiere-pro-mcp │ .jsx / .json │ (Premiere) │
235
- │ client) │ │ .fly.dev │ shared volume └──────────────┘
236
- └───────────────┘ └─────────────────────┘
255
+ │ AI Client │ ◄──────────────► │ MCP Server │ ◄────────────────► │ CEP Plugin │
256
+ │ (any MCP │ │ premiere-pro-mcp │ .jsx / .json │ (Premiere) │
257
+ │ client) │ │ .fly.dev │ shared volume └──────────────┘
258
+ └───────────────┘ └─────────────────────┘
237
259
  ```
238
260
 
239
261
  1. AI client invokes an MCP tool (e.g., `add_to_timeline`)
@@ -246,12 +268,12 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
246
268
 
247
269
  ---
248
270
 
249
- ## Tools (268)
271
+ ## Tools (269)
250
272
 
251
273
  ### Discovery & Inspection (10 + 10)
252
274
 
253
275
  | Tool | Description |
254
- |------|-------------|
276
+ | :--- | :---------- |
255
277
  | `get_project_info` | Current project name, path, sequences, items |
256
278
  | `get_active_sequence` | Detailed active sequence with all clips |
257
279
  | `list_project_items` | All items in the project panel |
@@ -266,7 +288,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
266
288
  ### Project Management (26)
267
289
 
268
290
  | Tool | Description |
269
- |------|-------------|
291
+ | :--- | :---------- |
270
292
  | `save_project` / `save_project_as` / `open_project` | File operations |
271
293
  | `create_project` / `close_project` | Project lifecycle |
272
294
  | `import_media` / `import_folder` / `import_ae_comps` | Import media and AE comps |
@@ -279,7 +301,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
279
301
  ### Timeline & Editing (10 + 27 advanced)
280
302
 
281
303
  | Tool | Description |
282
- |------|-------------|
304
+ | :--- | :---------- |
283
305
  | `add_to_timeline` / `overwrite_clip` | Insert and overwrite edits |
284
306
  | `ripple_delete` | Remove clip and close gap (QE) |
285
307
  | `roll_edit` / `slide_edit` / `slip_edit` | Professional trim modes (QE) |
@@ -300,7 +322,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
300
322
  ### Effects & Color (8)
301
323
 
302
324
  | Tool | Description |
303
- |------|-------------|
325
+ | :--- | :---------- |
304
326
  | `apply_effect` / `apply_audio_effect` | Apply by name (QE) |
305
327
  | `remove_effect` / `remove_all_effects` | Remove effects |
306
328
  | `color_correct` | Lumetri: exposure, contrast, temperature, etc. |
@@ -310,7 +332,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
310
332
  ### Keyframes (8)
311
333
 
312
334
  | Tool | Description |
313
- |------|-------------|
335
+ | :--- | :---------- |
314
336
  | `add_keyframe` / `get_keyframes` | Create and read keyframes |
315
337
  | `remove_keyframe` / `remove_keyframe_range` | Delete keyframes |
316
338
  | `set_keyframe_interpolation` | Linear / Hold / Bezier |
@@ -320,7 +342,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
320
342
  ### Export & Encoding (14)
321
343
 
322
344
  | Tool | Description |
323
- |------|-------------|
345
+ | :--- | :---------- |
324
346
  | `export_sequence` | Export via Adobe Media Encoder |
325
347
  | `capture_frame` | Export frame as PNG, return as base64 image |
326
348
  | `export_as_fcp_xml` / `export_aaf` / `export_omf` | Interchange formats |
@@ -330,7 +352,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
330
352
  ### Source Monitor & Playback (7 + 4)
331
353
 
332
354
  | Tool | Description |
333
- |------|-------------|
355
+ | :--- | :---------- |
334
356
  | `open_in_source` / `close_source_monitor` | Source monitor control |
335
357
  | `insert_from_source` / `overwrite_from_source` | 3-point editing |
336
358
  | `play_timeline` / `stop_playback` | Playback control (QE) |
@@ -339,7 +361,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
339
361
  ### Selection & Clipboard (7 + 6)
340
362
 
341
363
  | Tool | Description |
342
- |------|-------------|
364
+ | :--- | :---------- |
343
365
  | `select_clips_by_name` / `select_clips_in_range` | Smart selection |
344
366
  | `copy_effects_between_clips` | Copy effects via QE |
345
367
  | `batch_apply_effect` | Apply effect to multiple clips |
@@ -348,7 +370,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
348
370
  ### Media Properties (16)
349
371
 
350
372
  | Tool | Description |
351
- |------|-------------|
373
+ | :--- | :---------- |
352
374
  | `set_offline` / `has_proxy` / `detach_proxy` | Offline/proxy management |
353
375
  | `set_override_frame_rate` | Override FPS |
354
376
  | `set_scale_to_frame_size` | Auto-scale to sequence frame |
@@ -358,7 +380,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
358
380
  ### Sequence Management (11)
359
381
 
360
382
  | Tool | Description |
361
- |------|-------------|
383
+ | :--- | :---------- |
362
384
  | `create_sequence` / `create_sequence_from_preset` | Create sequences from `.sqpreset` files without opening Premiere's modal dialog |
363
385
  | `duplicate_sequence` / `delete_sequence` | Manage sequences |
364
386
  | `auto_reframe_sequence` | Auto-reframe for social media |
@@ -368,14 +390,14 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
368
390
  ### Workspace & Captions (2 + 1)
369
391
 
370
392
  | Tool | Description |
371
- |------|-------------|
393
+ | :--- | :---------- |
372
394
  | `get_workspaces` / `set_workspace` | Switch workspace layouts |
373
395
  | `create_caption_track` | Create caption/subtitle tracks |
374
396
 
375
397
  ### Scripting (6)
376
398
 
377
399
  | Tool | Description |
378
- |------|-------------|
400
+ | :--- | :----------- |
379
401
  | `execute_extendscript` | Run arbitrary ExtendScript (ES3) |
380
402
  | `evaluate_expression` | Quick one-line eval |
381
403
  | `send_raw_script` | Bypass security validation (advanced) |
@@ -391,7 +413,7 @@ Track targeting, batch operations, markers, audio levels, motion/transform, meta
391
413
  The server exposes three LLM context resources and four workflow prompts:
392
414
 
393
415
  | Resource URI | Description |
394
- |-------------|-------------|
416
+ | :----------- | :---------- |
395
417
  | `config://premiere-instructions` | Best practices: workflow order, timeline rules, effect tips, error handling |
396
418
  | `config://extendscript-reference` | Complete ExtendScript API reference for writing custom scripts |
397
419
  | `config://premiere-workflows` | Machine-readable catalog for rough cuts, dialogue cleanup, captions, and delivery |
@@ -432,6 +454,7 @@ fly deploy --remote-only
432
454
  ```
433
455
 
434
456
  Then connect with:
457
+
435
458
  ```json
436
459
  {
437
460
  "mcpServers": {
@@ -451,11 +474,12 @@ Then connect with:
451
474
  ## Environment Variables
452
475
 
453
476
  | Variable | Description | Default |
454
- |----------|-------------|--------|
477
+ | :------- | :---------- | :------ |
455
478
  | `PREMIERE_TEMP_DIR` | Shared temp directory for MCP ↔ CEP communication | OS temp dir + `/premiere-mcp-bridge` |
456
479
  | `PREMIERE_TIMEOUT_MS` | Command timeout in milliseconds | `30000` |
457
480
  | `PREMIERE_DEFAULT_SEQUENCE_PRESET` | Override the auto-discovered `.sqpreset` used by `create_sequence` | auto-discovered |
458
481
  | `PREMIERE_MCP_CAPABILITIES` | Comma-separated authority profile; add `unsafe-script` only when raw scripting is required | `inspect,edit,export,filesystem` |
482
+ | `PREMIERE_MCP_DEBUG` | Set to `1` (or `true`) to emit verbose server diagnostics to stderr | unset |
459
483
  | `PORT` | HTTP port (HTTP/SSE transport only) | `3000` |
460
484
  | `MCP_AUTH_TOKEN` | Bearer token required by the HTTP transport | unset |
461
485
  | `ALLOW_UNAUTHENTICATED` | Set to `1` to run HTTP without auth (unsafe; throwaway instances only) | unset |
@@ -464,16 +488,16 @@ Then connect with:
464
488
 
465
489
  ## Project Structure
466
490
 
467
- ```
491
+ ```text
468
492
  premiere-pro-mcp/
469
493
  ├── src/
470
494
  │ ├── index.ts # Entry point — stdio transport setup
471
495
  │ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
472
- │ ├── server.ts # MCP server — registers 268 tools + 3 resources + 4 prompts
496
+ │ ├── server.ts # MCP server — registers 269 tools + 3 resources + 4 prompts
473
497
  │ ├── bridge/
474
498
  │ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
475
499
  │ │ └── script-builder.ts # ExtendScript generator with ES3 helpers
476
- │ ├── tools/ # 28 tool modules
500
+ │ ├── tools/ # 29 tool modules
477
501
  │ │ ├── discovery.ts # Project discovery and queries
478
502
  │ │ ├── project.ts # Project management and import
479
503
  │ │ ├── media.ts # Media and proxy management
@@ -577,6 +601,11 @@ Many tools use the undocumented QE DOM (enabled via `app.enableQE()`). These too
577
601
  - Windows: `dir "%APPDATA%\Adobe\CEP\extensions\MCPBridgeCEP"`
578
602
  3. Completely restart Premiere Pro (not just close/reopen the project)
579
603
  4. Check the CSXS version matches your Premiere Pro version
604
+ 5. Run `premiere-pro-mcp --diagnose-cep` to check installation metadata and recent Premiere logs.
605
+
606
+ Version 1.3.0 and newer installs the signed `artifacts/MCPBridgeCEP.zxp` included in the npm
607
+ package on Windows. If diagnostics report `Signature verification failed`, reinstall the latest
608
+ npm version, fully quit every Premiere process, run `premiere-pro-mcp --install-cep`, and relaunch.
580
609
 
581
610
  </details>
582
611
 
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.2.2" ExtensionBundleName="MCP Bridge">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.3.0" ExtensionBundleName="MCP Bridge">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.premiere.bridge.panel" Version="1.2.2"/>
5
- <Extension Id="com.mcp.premiere.bridge.headless" Version="1.2.2"/>
4
+ <Extension Id="com.mcp.premiere.bridge.panel" Version="1.3.0"/>
5
+ <Extension Id="com.mcp.premiere.bridge.headless" Version="1.3.0"/>
6
6
  </ExtensionList>
7
7
  <ExecutionEnvironment>
8
8
  <HostList>
package/dist/index.js CHANGED
@@ -8,6 +8,12 @@ import path from "path";
8
8
  const __filename = fileURLToPath(import.meta.url);
9
9
  const __dirname = path.dirname(__filename);
10
10
  const projectRoot = path.resolve(__dirname, "..");
11
+ const debugEnabled = /^(1|true|yes|on|debug)$/i.test(process.env.PREMIERE_MCP_DEBUG ?? "");
12
+ function debugLog(message) {
13
+ if (debugEnabled) {
14
+ console.error(`[premiere-pro-mcp] ${message}`);
15
+ }
16
+ }
11
17
  // Handle CLI flags
12
18
  const args = process.argv.slice(2);
13
19
  if (args.includes("--help") || args.includes("-h")) {
@@ -17,6 +23,7 @@ premiere-pro-mcp — MCP server for Adobe Premiere Pro (269 tools)
17
23
  Usage:
18
24
  premiere-pro-mcp Start the MCP server (stdio transport)
19
25
  premiere-pro-mcp --install-cep Install the CEP plugin into Premiere Pro
26
+ premiere-pro-mcp --diagnose-cep Check the CEP install, debug keys, and Premiere signature logs
20
27
  premiere-pro-mcp --help Show this help message
21
28
  premiere-pro-mcp --version Show version
22
29
 
@@ -24,8 +31,9 @@ Environment variables:
24
31
  PREMIERE_TEMP_DIR Shared temp directory (default: OS temp + /premiere-mcp-bridge)
25
32
  PREMIERE_TIMEOUT_MS Command timeout in ms (default: 30000)
26
33
  PREMIERE_MCP_CAPABILITIES Comma-separated authority profile
34
+ PREMIERE_MCP_DEBUG Set to 1/true to enable verbose stderr diagnostics
27
35
 
28
- More info: https://github.com/ppmcp/premiere-pro-mcp
36
+ More info: https://github.com/leancoderkavy/premiere-pro-mcp
29
37
  `);
30
38
  process.exit(0);
31
39
  }
@@ -34,8 +42,9 @@ if (args.includes("--version") || args.includes("-v")) {
34
42
  console.log(pkg.default.version);
35
43
  process.exit(0);
36
44
  }
37
- if (args.includes("--install-cep")) {
38
- console.log("Installing CEP plugin...\n");
45
+ if (args.includes("--install-cep") || args.includes("--diagnose-cep")) {
46
+ const diagnose = args.includes("--diagnose-cep");
47
+ console.log(diagnose ? "Diagnosing CEP plugin...\n" : "Installing CEP plugin...\n");
39
48
  const isWindows = process.platform === "win32";
40
49
  const isMacOS = process.platform === "darwin";
41
50
  if (!isWindows && !isMacOS) {
@@ -45,17 +54,23 @@ if (args.includes("--install-cep")) {
45
54
  const scriptPath = path.join(projectRoot, "scripts", isWindows ? "install-cep.ps1" : "install-cep.sh");
46
55
  try {
47
56
  if (isWindows) {
48
- execFileSync("powershell.exe", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", scriptPath], { stdio: "inherit", cwd: projectRoot });
57
+ const powershellArgs = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", scriptPath];
58
+ if (diagnose)
59
+ powershellArgs.push("-Diagnose");
60
+ execFileSync("powershell.exe", powershellArgs, { stdio: "inherit", cwd: projectRoot });
49
61
  }
50
62
  else {
51
- execFileSync("bash", [scriptPath, "--copy"], { stdio: "inherit", cwd: projectRoot });
63
+ execFileSync("bash", [scriptPath, diagnose ? "--diagnose" : "--copy"], {
64
+ stdio: "inherit",
65
+ cwd: projectRoot,
66
+ });
52
67
  }
53
68
  }
54
69
  catch {
55
- console.error("CEP installation failed. Try running manually:");
70
+ console.error(`CEP ${diagnose ? "diagnostics" : "installation"} failed. Try running manually:`);
56
71
  console.error(isWindows
57
- ? ` powershell -ExecutionPolicy Bypass -File "${scriptPath}"`
58
- : ` bash "${scriptPath}"`);
72
+ ? ` powershell -ExecutionPolicy Bypass -File "${scriptPath}"${diagnose ? " -Diagnose" : ""}`
73
+ : ` bash "${scriptPath}" ${diagnose ? "--diagnose" : "--copy"}`);
59
74
  process.exit(1);
60
75
  }
61
76
  process.exit(0);
@@ -68,14 +83,14 @@ async function main() {
68
83
  : undefined,
69
84
  };
70
85
  const tempDir = getTempDir(bridgeOptions);
71
- console.error(`[premiere-pro-mcp] Starting MCP server...`);
72
- console.error(`[premiere-pro-mcp] Temp directory: ${tempDir}`);
86
+ debugLog("Starting MCP server...");
87
+ debugLog(`Temp directory: ${tempDir}`);
73
88
  // Clean up any stale files from previous sessions
74
89
  cleanupTempDir(bridgeOptions);
75
90
  const server = createServer(bridgeOptions);
76
91
  const transport = new StdioServerTransport();
77
92
  await server.connect(transport);
78
- console.error(`[premiere-pro-mcp] Server connected and ready`);
93
+ debugLog("Server connected and ready");
79
94
  }
80
95
  main().catch((err) => {
81
96
  console.error("[premiere-pro-mcp] Fatal error:", err);
@@ -22,7 +22,7 @@ export declare function buildPlatformCapabilityReport(capabilities: CapabilityCo
22
22
  platforms: string[];
23
23
  premiereVersions: string;
24
24
  transport: string;
25
- capabilities: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
25
+ capabilities: ("edit" | "export" | "filesystem" | "inspect" | "unsafe-script")[];
26
26
  };
27
27
  uxp: {
28
28
  status: string;
@@ -35,8 +35,8 @@ export declare function buildPlatformCapabilityReport(capabilities: CapabilityCo
35
35
  };
36
36
  authority: {
37
37
  source: "default" | "environment" | "explicit";
38
- enabled: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
39
- disabled: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
38
+ enabled: ("edit" | "export" | "filesystem" | "inspect" | "unsafe-script")[];
39
+ disabled: ("edit" | "export" | "filesystem" | "inspect" | "unsafe-script")[];
40
40
  };
41
41
  };
42
42
  //# sourceMappingURL=platform-capabilities.d.ts.map
package/dist/server.js CHANGED
@@ -31,7 +31,7 @@ import { getEditPlanTools } from "./tools/edit-plans.js";
31
31
  import { guardToolHandler, resolveCapabilities } from "./security/index.js";
32
32
  import { EXTENDSCRIPT_REFERENCE } from "./resources/extendscript-reference.js";
33
33
  import { WORKFLOW_PROMPTS, WORKFLOW_RESOURCE } from "./workflows/catalog.js";
34
- import { annotationsForTool, structuredToolResult } from "./workflows/tool-metadata.js";
34
+ import { annotationsForTool, structuredToolResult, } from "./workflows/tool-metadata.js";
35
35
  import { z } from "zod";
36
36
  const PREMIERE_INSTRUCTIONS = `You are controlling Adobe Premiere Pro through MCP tools. Follow these best practices:
37
37
 
@@ -96,6 +96,56 @@ CUSTOM SCRIPTING:
96
96
  `;
97
97
  const toolCatalogCache = new Map();
98
98
  const schemaCache = new WeakMap();
99
+ const debugEnabled = /^(1|true|yes|on|debug)$/i.test(process.env.PREMIERE_MCP_DEBUG ?? "");
100
+ function debugLog(message) {
101
+ if (debugEnabled) {
102
+ console.error(`[premiere-pro-mcp] ${message}`);
103
+ }
104
+ }
105
+ function jsonSchemaPropToZod(prop) {
106
+ const propType = prop.type;
107
+ if (propType === "string") {
108
+ if (prop.enum && Array.isArray(prop.enum) && prop.enum.length > 0) {
109
+ const enumValues = prop.enum;
110
+ return z.enum(enumValues);
111
+ }
112
+ return z.string();
113
+ }
114
+ if (propType === "number") {
115
+ return z.number();
116
+ }
117
+ if (propType === "boolean") {
118
+ return z.boolean();
119
+ }
120
+ if (propType === "array") {
121
+ const itemSchema = (prop.items ?? {});
122
+ // Use unknown as a safe fallback while still emitting a concrete items schema.
123
+ const itemZod = Object.keys(itemSchema).length > 0
124
+ ? jsonSchemaPropToZod(itemSchema)
125
+ : z.unknown();
126
+ return z.array(itemZod);
127
+ }
128
+ if (propType === "object") {
129
+ const nestedProperties = (prop.properties ?? {});
130
+ const nestedRequired = new Set((prop.required ?? []));
131
+ if (Object.keys(nestedProperties).length === 0) {
132
+ return z.record(z.string(), z.unknown());
133
+ }
134
+ const nestedShape = {};
135
+ for (const [nestedKey, nestedProp] of Object.entries(nestedProperties)) {
136
+ let nestedZod = jsonSchemaPropToZod(nestedProp);
137
+ if (nestedProp.description) {
138
+ nestedZod = nestedZod.describe(nestedProp.description);
139
+ }
140
+ if (!nestedRequired.has(nestedKey)) {
141
+ nestedZod = nestedZod.optional();
142
+ }
143
+ nestedShape[nestedKey] = nestedZod;
144
+ }
145
+ return z.object(nestedShape).passthrough();
146
+ }
147
+ return z.unknown();
148
+ }
99
149
  /**
100
150
  * Convert a JSON Schema-style parameters object to a Zod shape for MCP SDK registration.
101
151
  */
@@ -107,33 +157,7 @@ function jsonSchemaToZodShape(params) {
107
157
  const properties = (params.properties ?? {});
108
158
  const required = (params.required ?? []);
109
159
  for (const [key, prop] of Object.entries(properties)) {
110
- let zodType;
111
- const propType = prop.type;
112
- switch (propType) {
113
- case "string":
114
- if (prop.enum) {
115
- const enumValues = prop.enum;
116
- zodType = z.enum(enumValues);
117
- }
118
- else {
119
- zodType = z.string();
120
- }
121
- break;
122
- case "number":
123
- zodType = z.number();
124
- break;
125
- case "boolean":
126
- zodType = z.boolean();
127
- break;
128
- case "array":
129
- zodType = z.array(z.any());
130
- break;
131
- case "object":
132
- zodType = z.record(z.any());
133
- break;
134
- default:
135
- zodType = z.any();
136
- }
160
+ let zodType = jsonSchemaPropToZod(prop);
137
161
  if (prop.description) {
138
162
  zodType = zodType.describe(prop.description);
139
163
  }
@@ -206,9 +230,13 @@ export function createServer(bridgeOptions) {
206
230
  if (result.success) {
207
231
  // Special handling for capture_frame: return image content block
208
232
  const data = result.data;
209
- if (data && data.mimeType === "image/png" && typeof data.base64 === "string") {
233
+ if (data &&
234
+ data.mimeType === "image/png" &&
235
+ typeof data.base64 === "string") {
210
236
  return {
211
- structuredContent: structuredToolResult(name, true, { mimeType: data.mimeType }),
237
+ structuredContent: structuredToolResult(name, true, {
238
+ mimeType: data.mimeType,
239
+ }),
212
240
  content: [
213
241
  {
214
242
  type: "image",
@@ -275,10 +303,20 @@ export function createServer(bridgeOptions) {
275
303
  description: "High-level, safety-oriented Premiere Pro workflow catalog",
276
304
  mimeType: "application/json",
277
305
  }, async (uri) => ({
278
- contents: [{ uri: uri.href, mimeType: "application/json", text: WORKFLOW_RESOURCE }],
306
+ contents: [
307
+ {
308
+ uri: uri.href,
309
+ mimeType: "application/json",
310
+ text: WORKFLOW_RESOURCE,
311
+ },
312
+ ],
279
313
  }));
280
314
  for (const prompt of WORKFLOW_PROMPTS) {
281
- server.registerPrompt(prompt.name, { title: prompt.title, description: prompt.description, argsSchema: prompt.argsSchema }, prompt.render);
315
+ server.registerPrompt(prompt.name, {
316
+ title: prompt.title,
317
+ description: prompt.description,
318
+ argsSchema: prompt.argsSchema,
319
+ }, prompt.render);
282
320
  }
283
321
  // Register ExtendScript API reference resource
284
322
  server.resource("extendscript-reference", "config://extendscript-reference", {
@@ -293,7 +331,7 @@ export function createServer(bridgeOptions) {
293
331
  ],
294
332
  }));
295
333
  const toolCount = Object.keys(toolModules).length;
296
- console.error(`[premiere-pro-mcp] Registered ${toolCount} tools + 3 resources + ${WORKFLOW_PROMPTS.length} prompts`);
334
+ debugLog(`Registered ${toolCount} tools + 3 resources + ${WORKFLOW_PROMPTS.length} prompts`);
297
335
  return server;
298
336
  }
299
337
  //# sourceMappingURL=server.js.map
@@ -315,6 +315,9 @@ export declare function getAdvancedTools(bridgeOptions: BridgeOptions): {
315
315
  };
316
316
  item_ids: {
317
317
  type: string;
318
+ items: {
319
+ type: string;
320
+ };
318
321
  description: string;
319
322
  };
320
323
  };
@@ -1,4 +1,4 @@
1
- import { buildToolScript, escapeForExtendScript } from "../bridge/script-builder.js";
1
+ import { buildToolScript, escapeForExtendScript, } from "../bridge/script-builder.js";
2
2
  import { sendCommand } from "../bridge/file-bridge.js";
3
3
  export function getAdvancedTools(bridgeOptions) {
4
4
  return {
@@ -573,6 +573,7 @@ export function getAdvancedTools(bridgeOptions) {
573
573
  },
574
574
  item_ids: {
575
575
  type: "array",
576
+ items: { type: "string" },
576
577
  description: "Array of project item names or node IDs to include in order",
577
578
  },
578
579
  },
@@ -792,7 +793,15 @@ export function getAdvancedTools(bridgeOptions) {
792
793
  description: "Blue (0-255)",
793
794
  },
794
795
  },
795
- required: ["node_id", "component_name", "property_name", "alpha", "red", "green", "blue"],
796
+ required: [
797
+ "node_id",
798
+ "component_name",
799
+ "property_name",
800
+ "alpha",
801
+ "red",
802
+ "green",
803
+ "blue",
804
+ ],
796
805
  },
797
806
  handler: async (args) => {
798
807
  const script = buildToolScript(`
@@ -74,15 +74,15 @@ export declare function getEditPlanTools(bridgeOptions: BridgeOptions, dependenc
74
74
  plan: unknown;
75
75
  confirmation_token: string;
76
76
  }) => Promise<{
77
+ success: boolean;
78
+ error?: string;
77
79
  data: {
78
80
  operationId: string;
79
81
  };
80
- success: boolean;
81
- error?: string;
82
82
  } | {
83
- error: string;
84
83
  success: boolean;
85
84
  data?: unknown;
85
+ error: string;
86
86
  }>;
87
87
  };
88
88
  };
@@ -26,7 +26,7 @@ export declare function getHealthTools(bridgeOptions: BridgeOptions, capabilitie
26
26
  platforms: string[];
27
27
  premiereVersions: string;
28
28
  transport: string;
29
- capabilities: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
29
+ capabilities: ("edit" | "export" | "filesystem" | "inspect" | "unsafe-script")[];
30
30
  };
31
31
  uxp: {
32
32
  status: string;
@@ -39,8 +39,8 @@ export declare function getHealthTools(bridgeOptions: BridgeOptions, capabilitie
39
39
  };
40
40
  authority: {
41
41
  source: "default" | "environment" | "explicit";
42
- enabled: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
43
- disabled: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
42
+ enabled: ("edit" | "export" | "filesystem" | "inspect" | "unsafe-script")[];
43
+ disabled: ("edit" | "export" | "filesystem" | "inspect" | "unsafe-script")[];
44
44
  };
45
45
  };
46
46
  }>;
@@ -115,6 +115,9 @@ export declare function getProjectTools(bridgeOptions: BridgeOptions): {
115
115
  };
116
116
  comp_names: {
117
117
  type: string;
118
+ items: {
119
+ type: string;
120
+ };
118
121
  description: string;
119
122
  };
120
123
  target_bin: {
@@ -246,6 +249,9 @@ export declare function getProjectTools(bridgeOptions: BridgeOptions): {
246
249
  };
247
250
  sequence_ids: {
248
251
  type: string;
252
+ items: {
253
+ type: string;
254
+ };
249
255
  description: string;
250
256
  };
251
257
  };
@@ -1,4 +1,4 @@
1
- import { buildToolScript, escapeForExtendScript } from "../bridge/script-builder.js";
1
+ import { buildToolScript, escapeForExtendScript, } from "../bridge/script-builder.js";
2
2
  import { sendCommand } from "../bridge/file-bridge.js";
3
3
  export function getProjectTools(bridgeOptions) {
4
4
  return {
@@ -169,6 +169,7 @@ export function getProjectTools(bridgeOptions) {
169
169
  },
170
170
  comp_names: {
171
171
  type: "array",
172
+ items: { type: "string" },
172
173
  description: "Array of composition names to import. If omitted, imports all comps.",
173
174
  },
174
175
  target_bin: {
@@ -183,7 +184,9 @@ export function getProjectTools(bridgeOptions) {
183
184
  ? `var targetBin = __findProjectItem("${escapeForExtendScript(args.target_bin)}"); if (!targetBin) return __error("Bin not found");`
184
185
  : `var targetBin = app.project.rootItem;`;
185
186
  if (args.comp_names && args.comp_names.length > 0) {
186
- const comps = args.comp_names.map(c => `"${escapeForExtendScript(c)}"`).join(", ");
187
+ const comps = args.comp_names
188
+ .map((c) => `"${escapeForExtendScript(c)}"`)
189
+ .join(", ");
187
190
  const script = buildToolScript(`
188
191
  ${binLookup}
189
192
  app.project.importAEComps("${escapeForExtendScript(args.ae_project_path)}", [${comps}], targetBin);
@@ -358,6 +361,7 @@ export function getProjectTools(bridgeOptions) {
358
361
  },
359
362
  sequence_ids: {
360
363
  type: "array",
364
+ items: { type: "string" },
361
365
  description: "Array of sequence IDs to import from the source project. If omitted, all sequences are imported.",
362
366
  },
363
367
  },
@@ -365,7 +369,9 @@ export function getProjectTools(bridgeOptions) {
365
369
  },
366
370
  handler: async (args) => {
367
371
  if (args.sequence_ids && args.sequence_ids.length > 0) {
368
- const ids = args.sequence_ids.map(id => `"${escapeForExtendScript(id)}"`).join(", ");
372
+ const ids = args.sequence_ids
373
+ .map((id) => `"${escapeForExtendScript(id)}"`)
374
+ .join(", ");
369
375
  const script = buildToolScript(`
370
376
  app.project.importSequences("${escapeForExtendScript(args.project_path)}", [${ids}]);
371
377
  return __result({ imported: true, sequenceIds: [${ids}] });
@@ -580,6 +580,9 @@ export declare function getTrackTargetingTools(bridgeOptions: BridgeOptions): {
580
580
  properties: {
581
581
  item_ids: {
582
582
  type: string;
583
+ items: {
584
+ type: string;
585
+ };
583
586
  description: string;
584
587
  };
585
588
  target_bin: {
@@ -1,4 +1,4 @@
1
- import { buildToolScript, escapeForExtendScript } from "../bridge/script-builder.js";
1
+ import { buildToolScript, escapeForExtendScript, } from "../bridge/script-builder.js";
2
2
  import { sendCommand } from "../bridge/file-bridge.js";
3
3
  export function getTrackTargetingTools(bridgeOptions) {
4
4
  return {
@@ -367,17 +367,21 @@ export function getTrackTargetingTools(bridgeOptions) {
367
367
  var item = __findProjectItem("${escapeForExtendScript(args.item_id)}");
368
368
  if (!item) return __error("Item not found");
369
369
 
370
- ${args.in_seconds !== undefined ? `
370
+ ${args.in_seconds !== undefined
371
+ ? `
371
372
  var inTime = new Time();
372
373
  inTime.seconds = ${args.in_seconds};
373
374
  item.setInPoint(inTime.ticks, ${mediaType});
374
- ` : ""}
375
+ `
376
+ : ""}
375
377
 
376
- ${args.out_seconds !== undefined ? `
378
+ ${args.out_seconds !== undefined
379
+ ? `
377
380
  var outTime = new Time();
378
381
  outTime.seconds = ${args.out_seconds};
379
382
  item.setOutPoint(outTime.ticks, ${mediaType});
380
- ` : ""}
383
+ `
384
+ : ""}
381
385
 
382
386
  return __result({ item: item.name, inSet: ${args.in_seconds !== undefined}, outSet: ${args.out_seconds !== undefined} });
383
387
  `);
@@ -403,10 +407,12 @@ export function getTrackTargetingTools(bridgeOptions) {
403
407
  handler: async (args) => {
404
408
  const script = buildToolScript(`
405
409
  var targetBin = app.project.rootItem;
406
- ${args.target_bin ? `
410
+ ${args.target_bin
411
+ ? `
407
412
  var found = __findProjectItem("${escapeForExtendScript(args.target_bin)}");
408
413
  if (found && found.type === 2) targetBin = found;
409
- ` : ""}
414
+ `
415
+ : ""}
410
416
 
411
417
  app.project.importFiles(["${escapeForExtendScript(args.first_file_path)}"], true, targetBin, true);
412
418
 
@@ -1115,6 +1121,7 @@ export function getTrackTargetingTools(bridgeOptions) {
1115
1121
  properties: {
1116
1122
  item_ids: {
1117
1123
  type: "array",
1124
+ items: { type: "string" },
1118
1125
  description: "Array of node IDs or names of items to move",
1119
1126
  },
1120
1127
  target_bin: {
@@ -23,6 +23,9 @@ export declare function getUtilityTools(bridgeOptions: BridgeOptions): {
23
23
  properties: {
24
24
  item_ids: {
25
25
  type: string;
26
+ items: {
27
+ type: string;
28
+ };
26
29
  description: string;
27
30
  };
28
31
  };
@@ -1,4 +1,4 @@
1
- import { buildToolScript, escapeForExtendScript } from "../bridge/script-builder.js";
1
+ import { buildToolScript, escapeForExtendScript, } from "../bridge/script-builder.js";
2
2
  import { sendCommand } from "../bridge/file-bridge.js";
3
3
  export function getUtilityTools(bridgeOptions) {
4
4
  return {
@@ -33,6 +33,7 @@ export function getUtilityTools(bridgeOptions) {
33
33
  properties: {
34
34
  item_ids: {
35
35
  type: "array",
36
+ items: { type: "string" },
36
37
  description: "Array of node IDs or names of items to delete",
37
38
  },
38
39
  },
@@ -582,7 +583,13 @@ export function getUtilityTools(bridgeOptions) {
582
583
  properties: {
583
584
  marker_type: {
584
585
  type: "string",
585
- enum: ["Comment", "Chapter", "Segmentation", "WebLink", "FlashCuePoint"],
586
+ enum: [
587
+ "Comment",
588
+ "Chapter",
589
+ "Segmentation",
590
+ "WebLink",
591
+ "FlashCuePoint",
592
+ ],
586
593
  description: "Type of marker to filter",
587
594
  },
588
595
  sequence_id: {
@@ -706,11 +713,13 @@ export function getUtilityTools(bridgeOptions) {
706
713
  ${args.name ? `marker.name = "${escapeForExtendScript(args.name)}";` : ""}
707
714
  ${args.comments ? `marker.comments = "${escapeForExtendScript(args.comments)}";` : ""}
708
715
  ${args.type ? `marker.type = "${escapeForExtendScript(args.type)}";` : ""}
709
- ${args.duration_seconds !== undefined ? `
716
+ ${args.duration_seconds !== undefined
717
+ ? `
710
718
  var endTime = new Time();
711
719
  endTime.seconds = ${args.time_seconds + args.duration_seconds};
712
720
  marker.end = endTime;
713
- ` : ""}
721
+ `
722
+ : ""}
714
723
  ${args.color_index !== undefined ? `marker.setColorByIndex(${args.color_index});` : ""}
715
724
 
716
725
  return __result({ added: true, item: item.name, timeSeconds: ${args.time_seconds} });
@@ -967,14 +976,22 @@ export function getUtilityTools(bridgeOptions) {
967
976
  if (!project) return __error("No project open");
968
977
 
969
978
  var set = {};
970
- ${args.captured_video ? `
971
- try { project.setScratchDiskPath("${escapeForExtendScript(args.captured_video)}", 0); set.capturedVideo = "${escapeForExtendScript(args.captured_video)}"; } catch(e) {}` : ""}
972
- ${args.captured_audio ? `
973
- try { project.setScratchDiskPath("${escapeForExtendScript(args.captured_audio)}", 1); set.capturedAudio = "${escapeForExtendScript(args.captured_audio)}"; } catch(e) {}` : ""}
974
- ${args.video_previews ? `
975
- try { project.setScratchDiskPath("${escapeForExtendScript(args.video_previews)}", 2); set.videoPreviews = "${escapeForExtendScript(args.video_previews)}"; } catch(e) {}` : ""}
976
- ${args.audio_previews ? `
977
- try { project.setScratchDiskPath("${escapeForExtendScript(args.audio_previews)}", 3); set.audioPreviews = "${escapeForExtendScript(args.audio_previews)}"; } catch(e) {}` : ""}
979
+ ${args.captured_video
980
+ ? `
981
+ try { project.setScratchDiskPath("${escapeForExtendScript(args.captured_video)}", 0); set.capturedVideo = "${escapeForExtendScript(args.captured_video)}"; } catch(e) {}`
982
+ : ""}
983
+ ${args.captured_audio
984
+ ? `
985
+ try { project.setScratchDiskPath("${escapeForExtendScript(args.captured_audio)}", 1); set.capturedAudio = "${escapeForExtendScript(args.captured_audio)}"; } catch(e) {}`
986
+ : ""}
987
+ ${args.video_previews
988
+ ? `
989
+ try { project.setScratchDiskPath("${escapeForExtendScript(args.video_previews)}", 2); set.videoPreviews = "${escapeForExtendScript(args.video_previews)}"; } catch(e) {}`
990
+ : ""}
991
+ ${args.audio_previews
992
+ ? `
993
+ try { project.setScratchDiskPath("${escapeForExtendScript(args.audio_previews)}", 3); set.audioPreviews = "${escapeForExtendScript(args.audio_previews)}"; } catch(e) {}`
994
+ : ""}
978
995
 
979
996
  return __result(set);
980
997
  `);
@@ -23,8 +23,8 @@ export declare const WORKFLOW_CATALOG: readonly [{
23
23
  export declare const WORKFLOW_RESOURCE: string;
24
24
  export declare const WORKFLOW_PROMPTS: {
25
25
  name: string;
26
- title: "Assemble a rough cut" | "Clean up dialogue" | "Caption and style a sequence" | "Prepare a delivery export";
27
- description: "Inspect the project, import media, create or select a sequence, assemble clips, then verify and save." | "Inspect audio tracks, normalize dialogue, apply conservative cleanup, and verify levels before saving." | "Inspect the active sequence, create captions, apply styling, verify timing, and save." | "Validate the sequence and destination, export with an explicit preset, then report the produced artifact.";
26
+ title: "Assemble a rough cut" | "Caption and style a sequence" | "Clean up dialogue" | "Prepare a delivery export";
27
+ description: "Inspect audio tracks, normalize dialogue, apply conservative cleanup, and verify levels before saving." | "Inspect the active sequence, create captions, apply styling, verify timing, and save." | "Inspect the project, import media, create or select a sequence, assemble clips, then verify and save." | "Validate the sequence and destination, export with an explicit preset, then report the produced artifact.";
28
28
  argsSchema: {
29
29
  goal: z.ZodString;
30
30
  constraints: z.ZodOptional<z.ZodString>;
@@ -2,12 +2,12 @@ import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
2
2
  /** Conservative MCP hints. They describe expected behavior, never authorization. */
3
3
  export declare function annotationsForTool(name: string): ToolAnnotations;
4
4
  export declare function structuredToolResult(tool: string, success: boolean, data?: unknown, error?: string): {
5
- data: {} | null;
6
5
  ok: boolean;
7
6
  tool: string;
7
+ data: {} | null;
8
8
  } | {
9
- error: string;
10
9
  ok: boolean;
11
10
  tool: string;
11
+ error: string;
12
12
  };
13
13
  //# sourceMappingURL=tool-metadata.d.ts.map
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "premiere-pro-mcp",
3
- "version": "1.2.2",
4
- "description": "Open-source MCP server with 269 tools for AI-assisted Adobe Premiere Pro editing, automation, effects, media management, and export.",
3
+ "version": "1.3.0",
4
+ "description": "Adobe Premiere Pro MCP server with 269 AI video editing tools for timeline automation, effects, media management, and export.",
5
5
  "main": "dist/index.js",
6
+ "types": "./dist/index.d.ts",
6
7
  "type": "module",
7
8
  "bin": {
8
9
  "premiere-pro-mcp": "dist/index.js"
@@ -11,6 +12,7 @@
11
12
  "dist/**/*.js",
12
13
  "dist/**/*.d.ts",
13
14
  "cep-plugin",
15
+ "artifacts/MCPBridgeCEP.zxp",
14
16
  "uxp-plugin",
15
17
  "scripts",
16
18
  "README.md",
@@ -53,19 +55,35 @@
53
55
  "automation",
54
56
  "ai-video-editing",
55
57
  "premiere-automation",
56
- "claude-desktop"
58
+ "claude-desktop",
59
+ "adobe-premiere-pro",
60
+ "video-editing-automation",
61
+ "ai-video-editor",
62
+ "mcp-server",
63
+ "mcp-tools",
64
+ "creative-cloud",
65
+ "premiere-pro-plugin",
66
+ "claude-code"
57
67
  ],
58
68
  "license": "MIT",
69
+ "publishConfig": {
70
+ "access": "public",
71
+ "registry": "https://registry.npmjs.org/"
72
+ },
59
73
  "engines": {
60
- "node": ">=18.0.0"
74
+ "node": ">=20.19.0"
61
75
  },
62
76
  "dependencies": {
63
- "@modelcontextprotocol/sdk": "^1.12.1",
64
- "zod": "^3.23.0"
77
+ "@modelcontextprotocol/sdk": "^1.29.0",
78
+ "zod": "^4.4.3"
65
79
  },
66
80
  "devDependencies": {
67
- "@types/node": "^22.10.0",
68
- "typescript": "^5.7.0",
69
- "vitest": "^3.2.7"
81
+ "@types/node": "^26.1.1",
82
+ "typescript": "^7.0.2",
83
+ "vitest": "^4.1.10"
84
+ },
85
+ "overrides": {
86
+ "@hono/node-server": "^2.0.5",
87
+ "body-parser": "^2.3.0"
70
88
  }
71
89
  }
@@ -138,8 +138,8 @@ REQUIREMENTS
138
138
  SUPPORT
139
139
  =======
140
140
 
141
- GitHub: https://github.com/ppmcp/premiere-pro-mcp
142
- Issues: https://github.com/ppmcp/premiere-pro-mcp/issues
141
+ GitHub: https://github.com/leancoderkavy/premiere-pro-mcp
142
+ Issues: https://github.com/leancoderkavy/premiere-pro-mcp/issues
143
143
  README_EOF
144
144
 
145
145
  echo "✓ README created"
@@ -260,8 +260,8 @@ REQUIREMENTS
260
260
  SUPPORT
261
261
  =======
262
262
 
263
- GitHub: https://github.com/ppmcp/premiere-pro-mcp
264
- Issues: https://github.com/ppmcp/premiere-pro-mcp/issues
263
+ GitHub: https://github.com/leancoderkavy/premiere-pro-mcp
264
+ Issues: https://github.com/leancoderkavy/premiere-pro-mcp/issues
265
265
  README_EOF
266
266
 
267
267
  echo "✓ README created"
@@ -0,0 +1,66 @@
1
+ param(
2
+ [string]$OutputPath = "",
3
+ [string]$ZxpSignCmdPath = "",
4
+ [string]$CertificatePath = "",
5
+ [string]$CertificatePassword = ""
6
+ )
7
+
8
+ $ErrorActionPreference = "Stop"
9
+
10
+ $projectDir = Split-Path -Parent $PSScriptRoot
11
+ $pluginSource = Join-Path $projectDir "cep-plugin"
12
+ if (-not $OutputPath) {
13
+ $OutputPath = Join-Path $projectDir "artifacts\MCPBridgeCEP.zxp"
14
+ }
15
+ $OutputPath = [System.IO.Path]::GetFullPath($OutputPath)
16
+ $outputDir = Split-Path -Parent $OutputPath
17
+ New-Item -ItemType Directory -Force -Path $outputDir | Out-Null
18
+
19
+ $temporaryRoot = Join-Path ([System.IO.Path]::GetTempPath()) ("premiere-pro-mcp-zxp-" + [guid]::NewGuid().ToString("N"))
20
+ New-Item -ItemType Directory -Path $temporaryRoot | Out-Null
21
+
22
+ try {
23
+ if (-not $ZxpSignCmdPath) {
24
+ $ZxpSignCmdPath = Join-Path $temporaryRoot "ZXPSignCmd.exe"
25
+ $downloadUrl = "https://raw.githubusercontent.com/Adobe-CEP/CEP-Resources/ab5e4e3e53a42fad08e1225a22a991bb1ffe73f6/ZXPSignCMD/4.1.103/win64/ZXPSignCmd.exe"
26
+ Invoke-WebRequest -Uri $downloadUrl -OutFile $ZxpSignCmdPath
27
+ }
28
+
29
+ if (-not (Test-Path -LiteralPath $ZxpSignCmdPath)) {
30
+ throw "ZXPSignCmd was not found at $ZxpSignCmdPath"
31
+ }
32
+ if (-not (Test-Path -LiteralPath (Join-Path $pluginSource "CSXS\manifest.xml"))) {
33
+ throw "CEP plugin manifest not found at $pluginSource"
34
+ }
35
+
36
+ if (-not $CertificatePassword) {
37
+ $CertificatePassword = [guid]::NewGuid().ToString("N")
38
+ }
39
+ if (-not $CertificatePath) {
40
+ $CertificatePath = Join-Path $temporaryRoot "premiere-pro-mcp-release.p12"
41
+ & $ZxpSignCmdPath -selfSignedCert US California "Premiere Pro MCP" "Premiere Pro MCP" $CertificatePassword $CertificatePath
42
+ if ($LASTEXITCODE -ne 0) {
43
+ throw "ZXPSignCmd failed to create the release certificate."
44
+ }
45
+ }
46
+
47
+ if (Test-Path -LiteralPath $OutputPath) {
48
+ Remove-Item -LiteralPath $OutputPath -Force
49
+ }
50
+ & $ZxpSignCmdPath -sign $pluginSource $OutputPath $CertificatePath $CertificatePassword
51
+ if ($LASTEXITCODE -ne 0 -or -not (Test-Path -LiteralPath $OutputPath)) {
52
+ throw "ZXPSignCmd failed to create $OutputPath"
53
+ }
54
+
55
+ & $ZxpSignCmdPath -verify $OutputPath
56
+ if ($LASTEXITCODE -ne 0) {
57
+ throw "ZXPSignCmd could not verify $OutputPath"
58
+ }
59
+
60
+ Write-Host "Signed CEP package verified: $OutputPath"
61
+ }
62
+ finally {
63
+ if (Test-Path -LiteralPath $temporaryRoot) {
64
+ Remove-Item -LiteralPath $temporaryRoot -Recurse -Force
65
+ }
66
+ }
@@ -6,6 +6,7 @@ $ErrorActionPreference = "Stop"
6
6
 
7
7
  $projectDir = Split-Path -Parent $PSScriptRoot
8
8
  $pluginSource = Join-Path $projectDir "cep-plugin"
9
+ $signedPackage = Join-Path $projectDir "artifacts\MCPBridgeCEP.zxp"
9
10
  $cepRoot = Join-Path $env:APPDATA "Adobe\CEP\extensions"
10
11
  $pluginDestination = Join-Path $cepRoot "MCPBridgeCEP"
11
12
  $resolvedCepRoot = [System.IO.Path]::GetFullPath($cepRoot).TrimEnd([System.IO.Path]::DirectorySeparatorChar)
@@ -29,7 +30,23 @@ if (-not $Diagnose) {
29
30
  if (Test-Path -LiteralPath $pluginDestination) {
30
31
  Remove-Item -LiteralPath $resolvedDestination -Recurse -Force
31
32
  }
32
- Copy-Item -LiteralPath $pluginSource -Destination $pluginDestination -Recurse
33
+ if (Test-Path -LiteralPath $signedPackage) {
34
+ $temporaryZip = Join-Path ([System.IO.Path]::GetTempPath()) ("MCPBridgeCEP-" + [guid]::NewGuid().ToString("N") + ".zip")
35
+ try {
36
+ Copy-Item -LiteralPath $signedPackage -Destination $temporaryZip
37
+ Expand-Archive -LiteralPath $temporaryZip -DestinationPath $pluginDestination
38
+ Write-Host "Installed signed CEP package: $signedPackage"
39
+ }
40
+ finally {
41
+ if (Test-Path -LiteralPath $temporaryZip) {
42
+ Remove-Item -LiteralPath $temporaryZip -Force
43
+ }
44
+ }
45
+ }
46
+ else {
47
+ Copy-Item -LiteralPath $pluginSource -Destination $pluginDestination -Recurse
48
+ Write-Warning "No signed CEP package is present; installed the development bundle and enabled PlayerDebugMode."
49
+ }
33
50
 
34
51
  # Adobe requires PlayerDebugMode to be a String value. A DWORD that happens
35
52
  # to contain 1 is ignored by CEP and the unsigned extension is not discovered.
@@ -59,10 +76,24 @@ foreach ($version in 9..14) {
59
76
  }
60
77
  }
61
78
 
79
+ $signatureFailures = Get-ChildItem -Path $env:TEMP -Filter "CEP*-PPRO.log" -File -ErrorAction SilentlyContinue |
80
+ Sort-Object LastWriteTime -Descending |
81
+ Select-Object -First 5 |
82
+ Select-String -Pattern "Signature verification failed for extension com\.mcp\.premiere\.bridge" -ErrorAction SilentlyContinue
83
+ if ($signatureFailures) {
84
+ $latestFailure = $signatureFailures | Select-Object -First 1
85
+ $problems += "Premiere logged a signature failure in $($latestFailure.Path). Reinstall from a release containing artifacts\MCPBridgeCEP.zxp, fully quit Premiere, and relaunch it."
86
+ }
87
+
62
88
  if ($problems.Count -gt 0) {
63
89
  Write-Error ($problems -join [Environment]::NewLine)
64
90
  exit 1
65
91
  }
66
92
 
67
93
  Write-Host ""
68
- Write-Host "Installation verified. Restart Premiere Pro, then open Window > Extensions > MCP Bridge."
94
+ if ($Diagnose) {
95
+ Write-Host "CEP diagnostics passed."
96
+ }
97
+ else {
98
+ Write-Host "Installation verified. Restart Premiere Pro, then open Window > Extensions > MCP Bridge."
99
+ }
@@ -2,7 +2,7 @@
2
2
  "manifestVersion": 5,
3
3
  "id": "com.ppmcp.premiere.uxp",
4
4
  "name": "Premiere Pro MCP Bridge",
5
- "version": "1.2.2",
5
+ "version": "1.3.0",
6
6
  "main": "index.html",
7
7
  "host": { "app": "premierepro", "minVersion": "25.6.0" },
8
8
  "entrypoints": [