davinci-resolve-mcp 2.123.0 → 2.124.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.
@@ -54,8 +54,9 @@ window. `render.verify_output` covers the container-level checks.
54
54
  | Fusion titles | `elements: [{type:'title', text}]` — **21-gen hosts only** | v2.108 |
55
55
 
56
56
  `assemble_from_interchange` drives the same engine from an EDL / OTIO /
57
- FCP7-XML / AAF plus a `sourceMap` all four formats are route-proven
58
- end-to-end (parse assemble import measured frames and RMS) — and
57
+ FCP7-XML / AAF / **.prproj** (Premiere, read offline no Premiere needed)
58
+ plus a `sourceMap` all five formats are route-proven end-to-end
59
+ (parse → assemble → import → measured frames and RMS) — and
59
60
  returns an honesty ledger
60
61
  (`authoredTransitions`, `droppedTransitions` with reasons, `authoredRetimes`,
61
62
  `flattenedRetimes`, `authoredAudioEvents`, `upperTrackCutsVideoOnly`).
package/install.py CHANGED
@@ -37,7 +37,7 @@ from src.utils.update_check import (
37
37
 
38
38
  # ─── Version ──────────────────────────────────────────────────────────────────
39
39
 
40
- VERSION = "2.123.0"
40
+ VERSION = "2.124.0"
41
41
  # Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
42
42
  # Resolve's scripting bridge loads into newer interpreters on recent builds
43
43
  # (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.123.0",
3
+ "version": "2.124.0",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -30,7 +30,7 @@ const authorSchema = z.object({
30
30
  });
31
31
  const validateSchema = z.object({ drtPath: z.string().describe('Absolute path to a .drt file') });
32
32
  const assembleFromInterchangeSchema = z.object({
33
- format: z.enum(['edl', 'otio', 'xml', 'aaf']).describe('Interchange format of the input'),
33
+ format: z.enum(['edl', 'otio', 'xml', 'aaf', 'prproj']).describe('Interchange format of the input'),
34
34
  path: z.string().optional().describe('Path to the interchange file (aaf REQUIRES a path)'),
35
35
  content: z.string().optional().describe('Inline interchange text (edl/otio/xml)'),
36
36
  fps: z.number().optional().describe('Event frame rate for parsing (default 24; use e.g. 29.97 for NTSC EDLs)'),
@@ -211,14 +211,23 @@ export const drtTool = {
211
211
  const { parseInterchange } = await import('../editorial.mjs');
212
212
  const { eventsToAssembleSpec } = await import('../author-interchange.mjs');
213
213
  let content = p.content;
214
+ let events;
214
215
  if (p.format === 'aaf') {
215
216
  if (!p.path) return { error: 'aaf input requires path' };
216
217
  content = p.path;
218
+ } else if (p.format === 'prproj') {
219
+ // Premiere: offline gunzip+graph read (no Premiere, no Resolve import
220
+ // path). parsePrproj flattens EVERY sequence's events; a multi-sequence
221
+ // .prproj with overlapping record ranges refuses naturally in the
222
+ // overlap check — pre-split via editorial.list_sequences if needed.
223
+ if (!p.path) return { error: 'prproj input requires path' };
224
+ const { parsePrproj } = await import('../prproj.mjs');
225
+ events = parsePrproj(p.path);
217
226
  } else if (!content) {
218
227
  if (!p.path) return { error: 'provide content or path' };
219
228
  content = await fs.readFile(p.path, 'utf8');
220
229
  }
221
- const events = parseInterchange(p.format, content, { fps: p.fps ?? 24 });
230
+ if (!events) events = parseInterchange(p.format, content, { fps: p.fps ?? 24 });
222
231
  if (!events || !events.length) return { error: 'no events parsed from the interchange input' };
223
232
  const { spec, report } = eventsToAssembleSpec(events, {
224
233
  sourceMap: p.sourceMap, timelineName: p.timelineName,
@@ -248,7 +257,7 @@ export const drtTool = {
248
257
  stamped,
249
258
  conform: report,
250
259
  note:
251
- 'Import with timeline.import_timeline_checked (timeline is named after the FILE). ' +
260
+ 'Import with timeline.import_timeline_checked (timeline is named after the FILE). Dissolves/cross-fades, forward+reverse retimes, multi-track video, audio events and markers are AUTHORED when geometry allows; everything else drops WITH a reason — see `conform` for the ledger.' +
252
261
  'Retimes are flattened and transitions become cuts — see `conform` for the ledger.',
253
262
  };
254
263
  }
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
87
87
  handlers=[logging.StreamHandler()],
88
88
  )
89
89
 
90
- VERSION = "2.123.0"
90
+ VERSION = "2.124.0"
91
91
  logger = logging.getLogger("davinci-resolve-mcp")
92
92
  logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
93
93
  logger.info(f"Detected platform: {get_platform()}")
package/src/server.py CHANGED
@@ -11,7 +11,7 @@ Usage:
11
11
  python src/server.py --full # Start the 353-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.123.0"
14
+ VERSION = "2.124.0"
15
15
 
16
16
  import base64
17
17
  import os