@synthetic-ai/premiere-mcp 2.0.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 (104) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +21 -0
  3. package/README.md +242 -0
  4. package/cep-plugin/.debug +8 -0
  5. package/cep-plugin/CSInterface.js +70 -0
  6. package/cep-plugin/CSXS/manifest.xml +49 -0
  7. package/cep-plugin/host.jsx +7 -0
  8. package/cep-plugin/index.html +419 -0
  9. package/cep-plugin/main.js +327 -0
  10. package/cep-plugin/premiere.jsx +24947 -0
  11. package/cep-plugin/synthetic-logo.png +0 -0
  12. package/dist/bridge/file-bridge.d.ts +29 -0
  13. package/dist/bridge/file-bridge.js +145 -0
  14. package/dist/bridge/script-builder.d.ts +19 -0
  15. package/dist/bridge/script-builder.js +408 -0
  16. package/dist/http-server.d.ts +21 -0
  17. package/dist/http-server.js +140 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.js +70 -0
  20. package/dist/resources/extendscript-reference.d.ts +2 -0
  21. package/dist/resources/extendscript-reference.js +219 -0
  22. package/dist/server.d.ts +4 -0
  23. package/dist/server.js +276 -0
  24. package/dist/tools/advanced.d.ts +530 -0
  25. package/dist/tools/advanced.js +923 -0
  26. package/dist/tools/audio-advanced.d.ts +847 -0
  27. package/dist/tools/audio-advanced.js +1653 -0
  28. package/dist/tools/audio.d.ts +84 -0
  29. package/dist/tools/audio.js +123 -0
  30. package/dist/tools/captions.d.ts +30 -0
  31. package/dist/tools/captions.js +73 -0
  32. package/dist/tools/clipboard.d.ts +153 -0
  33. package/dist/tools/clipboard.js +381 -0
  34. package/dist/tools/color-advanced.d.ts +821 -0
  35. package/dist/tools/color-advanced.js +772 -0
  36. package/dist/tools/discovery.d.ts +128 -0
  37. package/dist/tools/discovery.js +445 -0
  38. package/dist/tools/effects.d.ts +211 -0
  39. package/dist/tools/effects.js +554 -0
  40. package/dist/tools/export-presets.d.ts +333 -0
  41. package/dist/tools/export-presets.js +490 -0
  42. package/dist/tools/export.d.ts +320 -0
  43. package/dist/tools/export.js +618 -0
  44. package/dist/tools/health.d.ts +9 -0
  45. package/dist/tools/health.js +25 -0
  46. package/dist/tools/inspection.d.ts +179 -0
  47. package/dist/tools/inspection.js +1089 -0
  48. package/dist/tools/keyframes.d.ts +253 -0
  49. package/dist/tools/keyframes.js +611 -0
  50. package/dist/tools/markers.d.ts +117 -0
  51. package/dist/tools/markers.js +206 -0
  52. package/dist/tools/media.d.ts +297 -0
  53. package/dist/tools/media.js +493 -0
  54. package/dist/tools/metadata.d.ts +178 -0
  55. package/dist/tools/metadata.js +278 -0
  56. package/dist/tools/multicam.d.ts +199 -0
  57. package/dist/tools/multicam.js +212 -0
  58. package/dist/tools/playback.d.ts +34 -0
  59. package/dist/tools/playback.js +63 -0
  60. package/dist/tools/playhead.d.ts +77 -0
  61. package/dist/tools/playhead.js +185 -0
  62. package/dist/tools/project-manager.d.ts +65 -0
  63. package/dist/tools/project-manager.js +81 -0
  64. package/dist/tools/project.d.ts +390 -0
  65. package/dist/tools/project.js +596 -0
  66. package/dist/tools/scripting.d.ts +98 -0
  67. package/dist/tools/scripting.js +434 -0
  68. package/dist/tools/selection.d.ts +120 -0
  69. package/dist/tools/selection.js +334 -0
  70. package/dist/tools/sequence-advanced.d.ts +84 -0
  71. package/dist/tools/sequence-advanced.js +471 -0
  72. package/dist/tools/sequence-settings.d.ts +397 -0
  73. package/dist/tools/sequence-settings.js +967 -0
  74. package/dist/tools/sequence.d.ts +211 -0
  75. package/dist/tools/sequence.js +378 -0
  76. package/dist/tools/source-monitor.d.ts +95 -0
  77. package/dist/tools/source-monitor.js +180 -0
  78. package/dist/tools/text.d.ts +97 -0
  79. package/dist/tools/text.js +159 -0
  80. package/dist/tools/timeline.d.ts +265 -0
  81. package/dist/tools/timeline.js +575 -0
  82. package/dist/tools/track-management.d.ts +482 -0
  83. package/dist/tools/track-management.js +787 -0
  84. package/dist/tools/track-targeting.d.ts +666 -0
  85. package/dist/tools/track-targeting.js +1318 -0
  86. package/dist/tools/tracks.d.ts +90 -0
  87. package/dist/tools/tracks.js +183 -0
  88. package/dist/tools/transitions-motion.d.ts +788 -0
  89. package/dist/tools/transitions-motion.js +680 -0
  90. package/dist/tools/transitions.d.ts +124 -0
  91. package/dist/tools/transitions.js +267 -0
  92. package/dist/tools/utility.d.ts +469 -0
  93. package/dist/tools/utility.js +1118 -0
  94. package/dist/tools/workspace.d.ts +25 -0
  95. package/dist/tools/workspace.js +61 -0
  96. package/package.json +66 -0
  97. package/scripts/build-chat-dmg.sh +210 -0
  98. package/scripts/build-chat-zip.sh +291 -0
  99. package/scripts/install-cep-windows.ps1 +99 -0
  100. package/scripts/install-cep.sh +66 -0
  101. package/scripts/install-chat-plugin.bat +67 -0
  102. package/scripts/install-chat-plugin.sh +85 -0
  103. package/scripts/install-windows.bat +95 -0
  104. package/scripts/package.mjs +218 -0
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HTTP/SSE transport entry point for remote deployment (e.g. Fly.io).
4
+ *
5
+ * The MCP server is identical to the stdio version — only the transport differs.
6
+ * Clients connect via the MCP Streamable HTTP transport:
7
+ * POST /mcp — send JSON-RPC messages
8
+ * GET /mcp — open SSE stream
9
+ *
10
+ * The bridge still uses the local filesystem temp directory, so the CEP plugin
11
+ * must be reachable from the same machine OR you must set PREMIERE_TEMP_DIR to
12
+ * a shared volume mount that the CEP plugin also writes to.
13
+ *
14
+ * Environment variables:
15
+ * PORT HTTP port to listen on (default: 3000)
16
+ * PREMIERE_TEMP_DIR Shared temp directory for the file bridge
17
+ * PREMIERE_TIMEOUT_MS Command timeout in ms (default: 30000)
18
+ * MCP_AUTH_TOKEN Optional bearer token to require on all requests
19
+ */
20
+ import http from "node:http";
21
+ import fs from "node:fs";
22
+ import path from "node:path";
23
+ import { fileURLToPath } from "node:url";
24
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
25
+ import { createServer } from "./server.js";
26
+ import { cleanupTempDir, getTempDir } from "./bridge/file-bridge.js";
27
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
28
+ const LANDING_DIR = path.resolve(__dirname, "../landing-dist");
29
+ const MIME = {
30
+ ".html": "text/html; charset=utf-8",
31
+ ".js": "application/javascript; charset=utf-8",
32
+ ".css": "text/css; charset=utf-8",
33
+ ".json": "application/json",
34
+ ".png": "image/png",
35
+ ".svg": "image/svg+xml",
36
+ ".ico": "image/x-icon",
37
+ ".woff2": "font/woff2",
38
+ ".woff": "font/woff",
39
+ ".ttf": "font/ttf",
40
+ ".txt": "text/plain",
41
+ ".xml": "application/xml",
42
+ };
43
+ function serveLanding(req, res) {
44
+ if (!fs.existsSync(LANDING_DIR))
45
+ return false;
46
+ let urlPath = req.url?.split("?")[0] ?? "/";
47
+ if (urlPath === "/" || urlPath === "")
48
+ urlPath = "/index.html";
49
+ // Next.js trailingSlash: /about/ -> /about/index.html
50
+ if (urlPath.endsWith("/"))
51
+ urlPath += "index.html";
52
+ const filePath = path.join(LANDING_DIR, urlPath);
53
+ // Security: ensure we stay within LANDING_DIR
54
+ if (!filePath.startsWith(LANDING_DIR))
55
+ return false;
56
+ if (!fs.existsSync(filePath))
57
+ return false;
58
+ const ext = path.extname(filePath);
59
+ const contentType = MIME[ext] ?? "application/octet-stream";
60
+ res.writeHead(200, { "Content-Type": contentType });
61
+ fs.createReadStream(filePath).pipe(res);
62
+ return true;
63
+ }
64
+ const PORT = parseInt(process.env.PORT ?? "3000", 10);
65
+ const AUTH_TOKEN = process.env.MCP_AUTH_TOKEN;
66
+ const bridgeOptions = {
67
+ tempDir: process.env.PREMIERE_TEMP_DIR,
68
+ timeoutMs: process.env.PREMIERE_TIMEOUT_MS
69
+ ? parseInt(process.env.PREMIERE_TIMEOUT_MS, 10)
70
+ : undefined,
71
+ };
72
+ const tempDir = getTempDir(bridgeOptions);
73
+ console.error(`[premiere-pro-mcp] Starting HTTP server on port ${PORT}...`);
74
+ console.error(`[premiere-pro-mcp] Temp directory: ${tempDir}`);
75
+ cleanupTempDir(bridgeOptions);
76
+ // Each request gets its own transport+server instance (stateless per-request model)
77
+ const httpServer = http.createServer(async (req, res) => {
78
+ // Health check
79
+ if (req.method === "GET" && req.url === "/health") {
80
+ res.writeHead(200, { "Content-Type": "application/json" });
81
+ res.end(JSON.stringify({ status: "ok", service: "premiere-pro-mcp" }));
82
+ return;
83
+ }
84
+ // Only handle /mcp endpoint; everything else goes to the landing page
85
+ if (!req.url?.startsWith("/mcp")) {
86
+ if (serveLanding(req, res))
87
+ return;
88
+ res.writeHead(404);
89
+ res.end("Not found");
90
+ return;
91
+ }
92
+ // Optional bearer token auth
93
+ if (AUTH_TOKEN) {
94
+ const authHeader = req.headers["authorization"] ?? "";
95
+ const provided = authHeader.startsWith("Bearer ") ? authHeader.slice(7) : "";
96
+ if (provided !== AUTH_TOKEN) {
97
+ res.writeHead(401, { "Content-Type": "application/json" });
98
+ res.end(JSON.stringify({ error: "Unauthorized" }));
99
+ return;
100
+ }
101
+ }
102
+ const mcpServer = createServer(bridgeOptions);
103
+ const transport = new StreamableHTTPServerTransport({
104
+ sessionIdGenerator: undefined, // stateless
105
+ });
106
+ res.on("close", () => {
107
+ transport.close().catch(() => { });
108
+ mcpServer.close().catch(() => { });
109
+ });
110
+ try {
111
+ await mcpServer.connect(transport);
112
+ await transport.handleRequest(req, res);
113
+ }
114
+ catch (err) {
115
+ console.error("[premiere-pro-mcp] Request error:", err);
116
+ if (!res.headersSent) {
117
+ res.writeHead(500, { "Content-Type": "application/json" });
118
+ res.end(JSON.stringify({ error: "Internal server error" }));
119
+ }
120
+ }
121
+ });
122
+ httpServer.listen(PORT, "0.0.0.0", () => {
123
+ console.error(`[premiere-pro-mcp] HTTP server listening on 0.0.0.0:${PORT}`);
124
+ console.error(`[premiere-pro-mcp] MCP endpoint: http://0.0.0.0:${PORT}/mcp`);
125
+ if (AUTH_TOKEN) {
126
+ console.error(`[premiere-pro-mcp] Auth: Bearer token required`);
127
+ }
128
+ else {
129
+ console.error(`[premiere-pro-mcp] Auth: none (set MCP_AUTH_TOKEN to enable)`);
130
+ }
131
+ });
132
+ process.on("SIGTERM", () => {
133
+ console.error("[premiere-pro-mcp] SIGTERM received, shutting down...");
134
+ httpServer.close(() => process.exit(0));
135
+ });
136
+ process.on("SIGINT", () => {
137
+ console.error("[premiere-pro-mcp] SIGINT received, shutting down...");
138
+ httpServer.close(() => process.exit(0));
139
+ });
140
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ import { cleanupTempDir, getTempDir } from "./bridge/file-bridge.js";
5
+ import { execSync } from "child_process";
6
+ import { fileURLToPath } from "url";
7
+ import path from "path";
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ const projectRoot = path.resolve(__dirname, "..");
11
+ // Handle CLI flags
12
+ const args = process.argv.slice(2);
13
+ if (args.includes("--help") || args.includes("-h")) {
14
+ console.log(`
15
+ premiere-pro-mcp — MCP server for Adobe Premiere Pro (437 tools)
16
+
17
+ Usage:
18
+ premiere-pro-mcp Start the MCP server (stdio transport)
19
+ premiere-pro-mcp --install-cep Install the CEP plugin into Premiere Pro
20
+ premiere-pro-mcp --help Show this help message
21
+ premiere-pro-mcp --version Show version
22
+
23
+ Environment variables:
24
+ PREMIERE_TEMP_DIR Shared temp directory (default: OS temp + /premiere-mcp-bridge)
25
+ PREMIERE_TIMEOUT_MS Command timeout in ms (default: 30000)
26
+
27
+ More info: https://synthetic.com.ar
28
+ `);
29
+ process.exit(0);
30
+ }
31
+ if (args.includes("--version") || args.includes("-v")) {
32
+ const pkg = await import("../package.json", { with: { type: "json" } }).catch(() => ({ default: { version: "unknown" } }));
33
+ console.log(pkg.default.version);
34
+ process.exit(0);
35
+ }
36
+ if (args.includes("--install-cep")) {
37
+ const scriptPath = path.join(projectRoot, "scripts", "install-cep.sh");
38
+ console.log("Installing CEP plugin...\n");
39
+ try {
40
+ execSync(`bash "${scriptPath}"`, { stdio: "inherit", cwd: projectRoot });
41
+ }
42
+ catch {
43
+ console.error("CEP installation failed. Try running manually:");
44
+ console.error(` bash "${scriptPath}"`);
45
+ process.exit(1);
46
+ }
47
+ process.exit(0);
48
+ }
49
+ async function main() {
50
+ const bridgeOptions = {
51
+ tempDir: process.env.PREMIERE_TEMP_DIR,
52
+ timeoutMs: process.env.PREMIERE_TIMEOUT_MS
53
+ ? parseInt(process.env.PREMIERE_TIMEOUT_MS, 10)
54
+ : undefined,
55
+ };
56
+ const tempDir = getTempDir(bridgeOptions);
57
+ console.error(`[premiere-pro-mcp] Starting MCP server...`);
58
+ console.error(`[premiere-pro-mcp] Temp directory: ${tempDir}`);
59
+ // Clean up any stale files from previous sessions
60
+ cleanupTempDir(bridgeOptions);
61
+ const server = createServer(bridgeOptions);
62
+ const transport = new StdioServerTransport();
63
+ await server.connect(transport);
64
+ console.error(`[premiere-pro-mcp] Server connected and ready`);
65
+ }
66
+ main().catch((err) => {
67
+ console.error("[premiere-pro-mcp] Fatal error:", err);
68
+ process.exit(1);
69
+ });
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export declare const EXTENDSCRIPT_REFERENCE: string;
2
+ //# sourceMappingURL=extendscript-reference.d.ts.map
@@ -0,0 +1,219 @@
1
+ // Premiere Pro ExtendScript API Reference for LLM consumption
2
+ // Exported as a plain string constant
3
+ export const EXTENDSCRIPT_REFERENCE = [
4
+ "# Premiere Pro ExtendScript API Reference (ES3 Syntax)",
5
+ "",
6
+ "## CRITICAL: ES3 Rules",
7
+ "- Use \"var\" not \"let/const\"",
8
+ "- No arrow functions: use \"function(x) { return x; }\"",
9
+ "- No template literals: use string concatenation \"a\" + \"b\"",
10
+ "- No destructuring: use obj.prop instead of {prop} = obj",
11
+ "- No for...of: use indexed for loops",
12
+ "",
13
+ "## Core Objects",
14
+ "app.project - ProjectBase (the current project)",
15
+ "app.project.activeSequence - Sequence (currently active)",
16
+ "app.project.rootItem - ProjectItem (root bin)",
17
+ "app.project.sequences - SequenceCollection (.numSequences, [i])",
18
+ "app.version - String (Premiere version)",
19
+ "app.sourceMonitor - SourceMonitor",
20
+ "app.encoder - Encoder",
21
+ "",
22
+ "## Project Methods",
23
+ "app.project.save()",
24
+ "app.project.saveAs(path)",
25
+ "app.project.importFiles(pathsArray, suppressUI, targetBin, asNumberedStills)",
26
+ "app.project.importAEComps(aepPath, compNamesArray, targetBin)",
27
+ "app.project.importAllAEComps(aepPath, targetBin)",
28
+ "app.project.createNewSequence(name, placeholderID)",
29
+ "app.project.createNewSequenceFromClips(name, clipItemsArray)",
30
+ "app.project.consolidateDuplicates()",
31
+ "app.project.addPropertyToProjectMetadataSchema(name, label, type)",
32
+ "app.project.undo()",
33
+ "app.newProject(path)",
34
+ "app.openDocument(path)",
35
+ "",
36
+ "## ProjectItem (clips/bins in project panel)",
37
+ "item.nodeId - String (unique identifier)",
38
+ "item.name - String",
39
+ "item.type - Number (1=clip/file, 2=bin, 3=root, 4=file)",
40
+ "item.treePath - String",
41
+ "item.children - ProjectItemCollection (.numItems, [i])",
42
+ "item.getMediaPath() - String (file path on disk)",
43
+ "item.changeMediaPath(newPath, overrideChecks)",
44
+ "item.refreshMedia()",
45
+ "item.moveBin(targetBin)",
46
+ "item.deleteBin()",
47
+ "item.renameBin(newName)",
48
+ "item.createBin(name) - ProjectItem (new bin)",
49
+ "item.createSmartBin(name, query)",
50
+ "item.createSubClip(name, startTicks, endTicks, hasHardBoundaries, takeVideo, takeAudio)",
51
+ "item.setInPoint(ticks, mediaType)",
52
+ "item.setOutPoint(ticks, mediaType)",
53
+ "item.getInPoint(mediaType) - Time",
54
+ "item.getOutPoint(mediaType) - Time",
55
+ "item.setOverridePixelAspectRatio(num, den)",
56
+ "item.setOverrideFrameRate(fps)",
57
+ "item.attachProxy(mediaPath, isHiRes)",
58
+ "item.findItemsMatchingMediaPath(pathQuery) - Array",
59
+ "item.canChangeMediaPath() - Boolean",
60
+ "item.isOffline() - Boolean",
61
+ "item.setStartTime(ticks)",
62
+ "item.setColorLabel(colorIndex) - 0-15",
63
+ "item.getColorLabel() - Number",
64
+ "item.getProjectMetadata() - String (XML)",
65
+ "item.setProjectMetadata(xmlStr, fieldPath)",
66
+ "",
67
+ "## Sequence",
68
+ "seq.name - String",
69
+ "seq.sequenceID - String",
70
+ "seq.videoTracks - TrackCollection (.numTracks, [i])",
71
+ "seq.audioTracks - TrackCollection (.numTracks, [i])",
72
+ "seq.markers - MarkerCollection",
73
+ "seq.end - String (ticks)",
74
+ "seq.frameSizeHorizontal - Number",
75
+ "seq.frameSizeVertical - Number",
76
+ "",
77
+ "seq.insertClip(projectItem, startTicks, vidTrackIdx, audioTrackIdx)",
78
+ "seq.overwriteClip(projectItem, startTicks, vidTrackIdx, audioTrackIdx)",
79
+ "seq.getPlayerPosition() - Time",
80
+ "seq.setPlayerPosition(ticks)",
81
+ "seq.setInPoint(ticks)",
82
+ "seq.setOutPoint(ticks)",
83
+ "seq.getInPoint() - String (ticks)",
84
+ "seq.getOutPoint() - String (ticks)",
85
+ "seq.setWorkAreaInPoint(ticks)",
86
+ "seq.setWorkAreaOutPoint(ticks)",
87
+ "seq.setZeroPoint(ticks)",
88
+ "seq.close()",
89
+ "seq.clone() - Sequence",
90
+ "seq.linkSelection()",
91
+ "seq.unlinkSelection()",
92
+ "seq.getSelection() - Array of TrackItems",
93
+ "seq.exportAsProject(path)",
94
+ "seq.exportAsFinalCutProXML(path, suppressUI)",
95
+ "seq.exportAsMediaDirect(outputPath, presetPath, workAreaType)",
96
+ "seq.getExportFileExtension(presetPath)",
97
+ "seq.autoReframeSequence(numerator, denominator, motionPreset, newName, useNestedSequences)",
98
+ "seq.performSceneEditDetectionOnSelection()",
99
+ "seq.createSubsequence(selectionOnly)",
100
+ "seq.addTracks(videoTracksToAdd, audioTracksToAdd)",
101
+ "",
102
+ "## Track",
103
+ "track.name - String",
104
+ "track.clips - ClipCollection (.numItems, [i])",
105
+ "track.transitions - TransitionCollection (.numItems, [i])",
106
+ "track.isMuted() - Boolean",
107
+ "track.setMute(muted)",
108
+ "track.isLocked() - Boolean",
109
+ "track.setLocked(locked)",
110
+ "track.isTargeted() - Boolean",
111
+ "track.setTargeted(targeted, isVideo)",
112
+ "track.overwriteClip(projectItem, position)",
113
+ "track.insertClip(projectItem, position)",
114
+ "",
115
+ "## TrackItem (clip on timeline)",
116
+ "clip.nodeId - String",
117
+ "clip.name - String",
118
+ "clip.start - Time (.ticks, .seconds)",
119
+ "clip.end - Time",
120
+ "clip.duration - Time",
121
+ "clip.inPoint - Time (source in)",
122
+ "clip.outPoint - Time (source out)",
123
+ "clip.mediaType - String (\"Video\"/\"Audio\")",
124
+ "clip.type - Number (1=clip, 2=transition)",
125
+ "clip.projectItem - ProjectItem (source)",
126
+ "clip.components - ComponentCollection (.numItems, [i])",
127
+ "",
128
+ "clip.remove(ripple, alignToVideo)",
129
+ "clip.setSelected(selected, updateUI)",
130
+ "clip.isSelected() - Boolean",
131
+ "clip.setDisabled(disabled)",
132
+ "clip.isDisabled() - Boolean",
133
+ "clip.getSpeed() - Number",
134
+ "clip.isSpeedReversed() - Boolean",
135
+ "clip.isAdjustmentLayer() - Boolean",
136
+ "",
137
+ "## Component (effects on clips)",
138
+ "comp.displayName - String",
139
+ "comp.matchName - String",
140
+ "comp.properties - PropertyCollection (.numItems, [i])",
141
+ "comp.remove()",
142
+ "",
143
+ "## Property (effect parameters)",
144
+ "prop.displayName - String",
145
+ "prop.matchName - String",
146
+ "prop.getValue(updateUI, time)",
147
+ "prop.setValue(value, updateUI)",
148
+ "prop.isTimeVarying() - Boolean",
149
+ "prop.setTimeVarying(enabled)",
150
+ "prop.areKeyframesSupported() - Boolean",
151
+ "prop.getKeys() - Array of Time",
152
+ "prop.addKey(time)",
153
+ "prop.removeKey(time)",
154
+ "prop.removeKeyRange(startTime, endTime)",
155
+ "prop.getValueAtKey(time)",
156
+ "prop.setValueAtKey(time, value, updateUI)",
157
+ "prop.setInterpolationTypeAtKey(time, interpType, updateUI)",
158
+ "prop.getValueAtTime(time)",
159
+ "",
160
+ "## Marker",
161
+ "marker.name - String",
162
+ "marker.comments - String",
163
+ "marker.start - Time",
164
+ "marker.end - Time",
165
+ "marker.type - String",
166
+ "marker.createMarker(seconds) - Marker",
167
+ "marker.deleteMarker(marker)",
168
+ "",
169
+ "## Time Object",
170
+ "var t = new Time();",
171
+ "t.ticks = \"254016000000\"; - set time in ticks (string)",
172
+ "t.seconds = 1.0; - set time in seconds",
173
+ "t.ticks - get ticks (string)",
174
+ "",
175
+ "## QE DOM (call app.enableQE() first!)",
176
+ "qe.project.getActiveSequence()",
177
+ "qe.project.getVideoEffectList() - .numItems, [i].name",
178
+ "qe.project.getAudioEffectList() - .numItems, [i].name",
179
+ "qe.project.getVideoTransitionList() - .numItems, [i].name",
180
+ "qe.project.getAudioTransitionList() - .numItems, [i].name",
181
+ "qe.project.getVideoEffectByName(name) - QEEffect",
182
+ "",
183
+ "qeSeq.getVideoTrackAt(index) - QETrack",
184
+ "qeSeq.getAudioTrackAt(index) - QETrack",
185
+ "qeTrack.getItemAt(index) - QEClip",
186
+ "qeTrack.razor(tickString) - split at position",
187
+ "",
188
+ "qeClip.addVideoEffect(qeEffect)",
189
+ "qeClip.addAudioEffect(qeEffect)",
190
+ "qeClip.addTransition(qeTransition, forceSingle, durationTicks, endPercent, alignment)",
191
+ "qeClip.removeEffects()",
192
+ "qeClip.rippleDelete()",
193
+ "qeClip.roll(offsetTicks)",
194
+ "qeClip.slide(offsetTicks)",
195
+ "qeClip.slip(offsetTicks)",
196
+ "qeClip.setSpeed(percent) - e.g., 200 for 2x",
197
+ "qeClip.setReverse(bool)",
198
+ "qeClip.setFrameBlend(bool)",
199
+ "qeClip.setTimeInterpolationType(type) - 0=sampling, 1=blending, 2=optical flow",
200
+ "qeClip.setName(name)",
201
+ "qeClip.moveToTrack(trackIndex)",
202
+ "",
203
+ "## Constants",
204
+ "TICKS_PER_SECOND = 254016000000",
205
+ "",
206
+ "## Common Effect Match Names",
207
+ "\"AE.ADBE Motion\" - Motion (Position, Scale, Rotation)",
208
+ "\"AE.ADBE Opacity\" - Opacity",
209
+ "\"AE.ADBE Gaussian Blur 2\" - Gaussian Blur",
210
+ "\"AE.ADBE Black & White\" - Black & White",
211
+ "\"AE.ADBE Tint\" - Tint",
212
+ "\"AE.ADBE Motion Blur\" - Motion Blur",
213
+ "",
214
+ "## Keyframe Interpolation Types",
215
+ "KF_Interp_Mode_Linear = 0",
216
+ "KF_Interp_Mode_Hold = 4",
217
+ "KF_Interp_Mode_Bezier = 5",
218
+ ].join("\n");
219
+ //# sourceMappingURL=extendscript-reference.js.map
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { BridgeOptions } from "./bridge/file-bridge.js";
3
+ export declare function createServer(bridgeOptions: BridgeOptions): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map