@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.
- package/CHANGELOG.md +73 -0
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/cep-plugin/.debug +8 -0
- package/cep-plugin/CSInterface.js +70 -0
- package/cep-plugin/CSXS/manifest.xml +49 -0
- package/cep-plugin/host.jsx +7 -0
- package/cep-plugin/index.html +419 -0
- package/cep-plugin/main.js +327 -0
- package/cep-plugin/premiere.jsx +24947 -0
- package/cep-plugin/synthetic-logo.png +0 -0
- package/dist/bridge/file-bridge.d.ts +29 -0
- package/dist/bridge/file-bridge.js +145 -0
- package/dist/bridge/script-builder.d.ts +19 -0
- package/dist/bridge/script-builder.js +408 -0
- package/dist/http-server.d.ts +21 -0
- package/dist/http-server.js +140 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +70 -0
- package/dist/resources/extendscript-reference.d.ts +2 -0
- package/dist/resources/extendscript-reference.js +219 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +276 -0
- package/dist/tools/advanced.d.ts +530 -0
- package/dist/tools/advanced.js +923 -0
- package/dist/tools/audio-advanced.d.ts +847 -0
- package/dist/tools/audio-advanced.js +1653 -0
- package/dist/tools/audio.d.ts +84 -0
- package/dist/tools/audio.js +123 -0
- package/dist/tools/captions.d.ts +30 -0
- package/dist/tools/captions.js +73 -0
- package/dist/tools/clipboard.d.ts +153 -0
- package/dist/tools/clipboard.js +381 -0
- package/dist/tools/color-advanced.d.ts +821 -0
- package/dist/tools/color-advanced.js +772 -0
- package/dist/tools/discovery.d.ts +128 -0
- package/dist/tools/discovery.js +445 -0
- package/dist/tools/effects.d.ts +211 -0
- package/dist/tools/effects.js +554 -0
- package/dist/tools/export-presets.d.ts +333 -0
- package/dist/tools/export-presets.js +490 -0
- package/dist/tools/export.d.ts +320 -0
- package/dist/tools/export.js +618 -0
- package/dist/tools/health.d.ts +9 -0
- package/dist/tools/health.js +25 -0
- package/dist/tools/inspection.d.ts +179 -0
- package/dist/tools/inspection.js +1089 -0
- package/dist/tools/keyframes.d.ts +253 -0
- package/dist/tools/keyframes.js +611 -0
- package/dist/tools/markers.d.ts +117 -0
- package/dist/tools/markers.js +206 -0
- package/dist/tools/media.d.ts +297 -0
- package/dist/tools/media.js +493 -0
- package/dist/tools/metadata.d.ts +178 -0
- package/dist/tools/metadata.js +278 -0
- package/dist/tools/multicam.d.ts +199 -0
- package/dist/tools/multicam.js +212 -0
- package/dist/tools/playback.d.ts +34 -0
- package/dist/tools/playback.js +63 -0
- package/dist/tools/playhead.d.ts +77 -0
- package/dist/tools/playhead.js +185 -0
- package/dist/tools/project-manager.d.ts +65 -0
- package/dist/tools/project-manager.js +81 -0
- package/dist/tools/project.d.ts +390 -0
- package/dist/tools/project.js +596 -0
- package/dist/tools/scripting.d.ts +98 -0
- package/dist/tools/scripting.js +434 -0
- package/dist/tools/selection.d.ts +120 -0
- package/dist/tools/selection.js +334 -0
- package/dist/tools/sequence-advanced.d.ts +84 -0
- package/dist/tools/sequence-advanced.js +471 -0
- package/dist/tools/sequence-settings.d.ts +397 -0
- package/dist/tools/sequence-settings.js +967 -0
- package/dist/tools/sequence.d.ts +211 -0
- package/dist/tools/sequence.js +378 -0
- package/dist/tools/source-monitor.d.ts +95 -0
- package/dist/tools/source-monitor.js +180 -0
- package/dist/tools/text.d.ts +97 -0
- package/dist/tools/text.js +159 -0
- package/dist/tools/timeline.d.ts +265 -0
- package/dist/tools/timeline.js +575 -0
- package/dist/tools/track-management.d.ts +482 -0
- package/dist/tools/track-management.js +787 -0
- package/dist/tools/track-targeting.d.ts +666 -0
- package/dist/tools/track-targeting.js +1318 -0
- package/dist/tools/tracks.d.ts +90 -0
- package/dist/tools/tracks.js +183 -0
- package/dist/tools/transitions-motion.d.ts +788 -0
- package/dist/tools/transitions-motion.js +680 -0
- package/dist/tools/transitions.d.ts +124 -0
- package/dist/tools/transitions.js +267 -0
- package/dist/tools/utility.d.ts +469 -0
- package/dist/tools/utility.js +1118 -0
- package/dist/tools/workspace.d.ts +25 -0
- package/dist/tools/workspace.js +61 -0
- package/package.json +66 -0
- package/scripts/build-chat-dmg.sh +210 -0
- package/scripts/build-chat-zip.sh +291 -0
- package/scripts/install-cep-windows.ps1 +99 -0
- package/scripts/install-cep.sh +66 -0
- package/scripts/install-chat-plugin.bat +67 -0
- package/scripts/install-chat-plugin.sh +85 -0
- package/scripts/install-windows.bat +95 -0
- package/scripts/package.mjs +218 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { getDiscoveryTools } from "./tools/discovery.js";
|
|
3
|
+
import { getProjectTools } from "./tools/project.js";
|
|
4
|
+
import { getMediaTools } from "./tools/media.js";
|
|
5
|
+
import { getSequenceTools } from "./tools/sequence.js";
|
|
6
|
+
import { getTimelineTools } from "./tools/timeline.js";
|
|
7
|
+
import { getEffectsTools } from "./tools/effects.js";
|
|
8
|
+
import { getTransitionsTools } from "./tools/transitions.js";
|
|
9
|
+
import { getAudioTools } from "./tools/audio.js";
|
|
10
|
+
import { getTextTools } from "./tools/text.js";
|
|
11
|
+
import { getMarkerTools } from "./tools/markers.js";
|
|
12
|
+
import { getTrackTools } from "./tools/tracks.js";
|
|
13
|
+
import { getPlayheadTools } from "./tools/playhead.js";
|
|
14
|
+
import { getMetadataTools } from "./tools/metadata.js";
|
|
15
|
+
import { getExportTools } from "./tools/export.js";
|
|
16
|
+
import { getAdvancedTools } from "./tools/advanced.js";
|
|
17
|
+
import { getKeyframeTools } from "./tools/keyframes.js";
|
|
18
|
+
import { getScriptingTools } from "./tools/scripting.js";
|
|
19
|
+
import { getInspectionTools } from "./tools/inspection.js";
|
|
20
|
+
import { getSelectionTools } from "./tools/selection.js";
|
|
21
|
+
import { getClipboardTools } from "./tools/clipboard.js";
|
|
22
|
+
import { getSourceMonitorTools } from "./tools/source-monitor.js";
|
|
23
|
+
import { getTrackTargetingTools } from "./tools/track-targeting.js";
|
|
24
|
+
import { getUtilityTools } from "./tools/utility.js";
|
|
25
|
+
import { getHealthTools } from "./tools/health.js";
|
|
26
|
+
import { getWorkspaceTools } from "./tools/workspace.js";
|
|
27
|
+
import { getCaptionTools } from "./tools/captions.js";
|
|
28
|
+
import { getPlaybackTools } from "./tools/playback.js";
|
|
29
|
+
import { getProjectManagerTools } from "./tools/project-manager.js";
|
|
30
|
+
import { getSequenceAdvancedTools } from "./tools/sequence-advanced.js";
|
|
31
|
+
import { getColorAdvancedTools } from "./tools/color-advanced.js";
|
|
32
|
+
import { getAudioAdvancedTools } from "./tools/audio-advanced.js";
|
|
33
|
+
import { getTrackManagementTools } from "./tools/track-management.js";
|
|
34
|
+
import { getTransitionsMotionTools } from "./tools/transitions-motion.js";
|
|
35
|
+
import { getMulticamTools } from "./tools/multicam.js";
|
|
36
|
+
import { getExportPresetsTools } from "./tools/export-presets.js";
|
|
37
|
+
import { getSequenceSettingsTools } from "./tools/sequence-settings.js";
|
|
38
|
+
import { EXTENDSCRIPT_REFERENCE } from "./resources/extendscript-reference.js";
|
|
39
|
+
import { z } from "zod";
|
|
40
|
+
const PREMIERE_INSTRUCTIONS = `You are controlling Adobe Premiere Pro through MCP tools. Follow these best practices:
|
|
41
|
+
|
|
42
|
+
WORKFLOW ORDER:
|
|
43
|
+
1. Always call get_project_info first to understand the current state.
|
|
44
|
+
2. Import media before adding to timeline.
|
|
45
|
+
3. Create/select a sequence before timeline operations.
|
|
46
|
+
4. Add clips first, then effects, then transitions.
|
|
47
|
+
5. Save the project after making significant changes.
|
|
48
|
+
|
|
49
|
+
TIMELINE RULES:
|
|
50
|
+
- Clips are identified by node_id. Use get_active_sequence or list_sequence_tracks to discover node IDs.
|
|
51
|
+
- Video clips on higher track indices appear on top of lower ones (compositing order).
|
|
52
|
+
- Images default to ~5 seconds duration when added to timeline.
|
|
53
|
+
- The first clip added to a new sequence determines its resolution and frame rate.
|
|
54
|
+
- Time values are in seconds (the tools handle tick conversion internally).
|
|
55
|
+
|
|
56
|
+
EFFECTS & TRANSITIONS:
|
|
57
|
+
- Apply effects by name using apply_effect (e.g., "Gaussian Blur", "Lumetri Color").
|
|
58
|
+
- Use list_available_effects to find exact effect names.
|
|
59
|
+
- Transitions require clips to be adjacent (no gap between them).
|
|
60
|
+
- Keep transitions short (0.5-2 seconds typically).
|
|
61
|
+
- Use color_correct for Lumetri Color adjustments rather than manual property setting.
|
|
62
|
+
|
|
63
|
+
KEYFRAMES:
|
|
64
|
+
- Use get_effect_properties to discover property names before setting values.
|
|
65
|
+
- Enable keyframes with add_keyframe; the property auto-enables time-varying.
|
|
66
|
+
- Interpolation types: "linear" (smooth), "hold" (instant jump), "bezier" (custom easing).
|
|
67
|
+
|
|
68
|
+
QE DOM TOOLS:
|
|
69
|
+
- Tools marked "Uses QE DOM" use an undocumented API. They are powerful but may behave unexpectedly.
|
|
70
|
+
- ripple_delete, roll_edit, slide_edit, slip_edit are QE-based advanced trim tools.
|
|
71
|
+
- set_clip_speed_qe is more reliable than the ExtendScript speed method.
|
|
72
|
+
|
|
73
|
+
CLIPS & SELECTION:
|
|
74
|
+
- Use set_clip_selection to select clips before operations that work on selection (link, unlink, scene_edit_detection).
|
|
75
|
+
- Use overwrite_clip for 3-point editing (overwrites existing content).
|
|
76
|
+
- Use add_to_timeline for insert editing (ripples content forward).
|
|
77
|
+
|
|
78
|
+
BINS & ORGANIZATION:
|
|
79
|
+
- Bins are folders in the project panel. Use create_bin, delete_bin, rename_bin.
|
|
80
|
+
- Use move_item_to_bin to organize imported media.
|
|
81
|
+
- create_smart_bin creates auto-populating search bins.
|
|
82
|
+
|
|
83
|
+
EXPORT:
|
|
84
|
+
- Use export_sequence for AME-based encoding with presets.
|
|
85
|
+
- Use export_frame to capture a single frame as an image.
|
|
86
|
+
- Use start_batch_encode to begin rendering all queued items.
|
|
87
|
+
|
|
88
|
+
ERROR HANDLING:
|
|
89
|
+
- If a tool returns "No active sequence", call set_active_sequence first.
|
|
90
|
+
- If a tool returns "Clip not found", the node_id may have changed after timeline edits. Re-query the sequence.
|
|
91
|
+
- If "QE clip not found", the clip index may differ between DOM and QE. Try re-querying.
|
|
92
|
+
|
|
93
|
+
CUSTOM SCRIPTING:
|
|
94
|
+
- Use execute_extendscript to write and run any ExtendScript code for tasks not covered by existing tools.
|
|
95
|
+
- Use evaluate_expression for quick one-line queries.
|
|
96
|
+
- Use inspect_dom_object to explore unfamiliar objects.
|
|
97
|
+
- Use get_premiere_state as your first call to understand the full current context.
|
|
98
|
+
- Use get_sequence_structure for detailed timeline layout before edits.
|
|
99
|
+
- Read the "extendscript-reference" resource for the complete API cheat sheet.
|
|
100
|
+
`;
|
|
101
|
+
/**
|
|
102
|
+
* Convert a JSON Schema-style parameters object to a Zod shape for MCP SDK registration.
|
|
103
|
+
*/
|
|
104
|
+
function jsonSchemaToZodShape(params) {
|
|
105
|
+
const shape = {};
|
|
106
|
+
const properties = (params.properties ?? {});
|
|
107
|
+
const required = (params.required ?? []);
|
|
108
|
+
for (const [key, prop] of Object.entries(properties)) {
|
|
109
|
+
let zodType;
|
|
110
|
+
const propType = prop.type;
|
|
111
|
+
switch (propType) {
|
|
112
|
+
case "string":
|
|
113
|
+
if (prop.enum) {
|
|
114
|
+
const enumValues = prop.enum;
|
|
115
|
+
zodType = z.enum(enumValues);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
zodType = z.string();
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
121
|
+
case "number":
|
|
122
|
+
zodType = z.number();
|
|
123
|
+
break;
|
|
124
|
+
case "boolean":
|
|
125
|
+
zodType = z.boolean();
|
|
126
|
+
break;
|
|
127
|
+
case "array":
|
|
128
|
+
zodType = z.array(z.any());
|
|
129
|
+
break;
|
|
130
|
+
case "object":
|
|
131
|
+
zodType = z.record(z.any());
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
zodType = z.any();
|
|
135
|
+
}
|
|
136
|
+
if (prop.description) {
|
|
137
|
+
zodType = zodType.describe(prop.description);
|
|
138
|
+
}
|
|
139
|
+
if (!required.includes(key)) {
|
|
140
|
+
zodType = zodType.optional();
|
|
141
|
+
}
|
|
142
|
+
shape[key] = zodType;
|
|
143
|
+
}
|
|
144
|
+
return shape;
|
|
145
|
+
}
|
|
146
|
+
export function createServer(bridgeOptions) {
|
|
147
|
+
const server = new McpServer({
|
|
148
|
+
name: "premiere-pro-mcp",
|
|
149
|
+
version: "1.1.1",
|
|
150
|
+
});
|
|
151
|
+
// Collect all tools from each module
|
|
152
|
+
const toolModules = {
|
|
153
|
+
...getDiscoveryTools(bridgeOptions),
|
|
154
|
+
...getProjectTools(bridgeOptions),
|
|
155
|
+
...getMediaTools(bridgeOptions),
|
|
156
|
+
...getSequenceTools(bridgeOptions),
|
|
157
|
+
...getTimelineTools(bridgeOptions),
|
|
158
|
+
...getEffectsTools(bridgeOptions),
|
|
159
|
+
...getTransitionsTools(bridgeOptions),
|
|
160
|
+
...getAudioTools(bridgeOptions),
|
|
161
|
+
...getTextTools(bridgeOptions),
|
|
162
|
+
...getMarkerTools(bridgeOptions),
|
|
163
|
+
...getTrackTools(bridgeOptions),
|
|
164
|
+
...getPlayheadTools(bridgeOptions),
|
|
165
|
+
...getMetadataTools(bridgeOptions),
|
|
166
|
+
...getExportTools(bridgeOptions),
|
|
167
|
+
...getAdvancedTools(bridgeOptions),
|
|
168
|
+
...getKeyframeTools(bridgeOptions),
|
|
169
|
+
...getScriptingTools(bridgeOptions),
|
|
170
|
+
...getInspectionTools(bridgeOptions),
|
|
171
|
+
...getSelectionTools(bridgeOptions),
|
|
172
|
+
...getClipboardTools(bridgeOptions),
|
|
173
|
+
...getSourceMonitorTools(bridgeOptions),
|
|
174
|
+
...getTrackTargetingTools(bridgeOptions),
|
|
175
|
+
...getUtilityTools(bridgeOptions),
|
|
176
|
+
...getHealthTools(bridgeOptions),
|
|
177
|
+
...getWorkspaceTools(bridgeOptions),
|
|
178
|
+
...getCaptionTools(bridgeOptions),
|
|
179
|
+
...getPlaybackTools(bridgeOptions),
|
|
180
|
+
...getProjectManagerTools(bridgeOptions),
|
|
181
|
+
...getSequenceAdvancedTools(bridgeOptions),
|
|
182
|
+
...getColorAdvancedTools(bridgeOptions),
|
|
183
|
+
...getAudioAdvancedTools(bridgeOptions),
|
|
184
|
+
...getTrackManagementTools(bridgeOptions),
|
|
185
|
+
...getTransitionsMotionTools(bridgeOptions),
|
|
186
|
+
...getMulticamTools(bridgeOptions),
|
|
187
|
+
...getExportPresetsTools(bridgeOptions),
|
|
188
|
+
...getSequenceSettingsTools(bridgeOptions),
|
|
189
|
+
};
|
|
190
|
+
// Register each tool with the MCP server
|
|
191
|
+
for (const [name, tool] of Object.entries(toolModules)) {
|
|
192
|
+
const zodShape = jsonSchemaToZodShape(tool.parameters);
|
|
193
|
+
server.tool(name, tool.description, zodShape, async (args) => {
|
|
194
|
+
try {
|
|
195
|
+
const result = await tool.handler(args);
|
|
196
|
+
if (result.success) {
|
|
197
|
+
// Special handling for capture_frame: return image content block
|
|
198
|
+
const data = result.data;
|
|
199
|
+
if (data && data.mimeType === "image/png" && typeof data.base64 === "string") {
|
|
200
|
+
return {
|
|
201
|
+
content: [
|
|
202
|
+
{
|
|
203
|
+
type: "image",
|
|
204
|
+
data: data.base64,
|
|
205
|
+
mimeType: "image/png",
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
type: "text",
|
|
209
|
+
text: "Frame captured successfully.",
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: JSON.stringify(result.data, null, 2),
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
return {
|
|
225
|
+
content: [
|
|
226
|
+
{
|
|
227
|
+
type: "text",
|
|
228
|
+
text: `Error: ${result.error}`,
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
isError: true,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
return {
|
|
237
|
+
content: [
|
|
238
|
+
{
|
|
239
|
+
type: "text",
|
|
240
|
+
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
isError: true,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
// Register LLM instructions resource
|
|
249
|
+
server.resource("premiere-instructions", "config://premiere-instructions", {
|
|
250
|
+
description: "Instructions and best practices for using Premiere Pro via MCP tools",
|
|
251
|
+
mimeType: "text/plain",
|
|
252
|
+
}, async (uri) => ({
|
|
253
|
+
contents: [
|
|
254
|
+
{
|
|
255
|
+
uri: uri.href,
|
|
256
|
+
text: PREMIERE_INSTRUCTIONS,
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
}));
|
|
260
|
+
// Register ExtendScript API reference resource
|
|
261
|
+
server.resource("extendscript-reference", "config://extendscript-reference", {
|
|
262
|
+
description: "Complete Premiere Pro ExtendScript API reference for writing custom scripts via execute_extendscript",
|
|
263
|
+
mimeType: "text/plain",
|
|
264
|
+
}, async (uri) => ({
|
|
265
|
+
contents: [
|
|
266
|
+
{
|
|
267
|
+
uri: uri.href,
|
|
268
|
+
text: EXTENDSCRIPT_REFERENCE,
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
}));
|
|
272
|
+
const toolCount = Object.keys(toolModules).length;
|
|
273
|
+
console.error(`[premiere-pro-mcp] Registered ${toolCount} tools + 2 resources`);
|
|
274
|
+
return server;
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=server.js.map
|