davinci-resolve-mcp 2.26.0 → 2.26.1

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/AGENTS.md CHANGED
@@ -93,7 +93,9 @@ venv/bin/python tests/test_import.py
93
93
  venv/bin/python scripts/audit_api_parity.py
94
94
  ```
95
95
 
96
- Python 3.10-3.12 is recommended for Resolve scripting compatibility.
96
+ Python 3.10+ is required (the MCP SDK floor). 3.10-3.12 is the lowest-risk range
97
+ for Resolve scripting; 3.13/3.14 are accepted and verified on Resolve Studio
98
+ 20.3.2, but older Resolve builds may fail to connect on 3.13+.
97
99
 
98
100
  ## Development Notes
99
101
 
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
4
4
 
5
+ ## What's New in v2.26.1
6
+
7
+ **Python 3.13 / 3.14 support (issue #45)** — `npx davinci-resolve-mcp setup`
8
+ previously hard-refused any interpreter outside 3.10–3.12, so it failed outright
9
+ on Python 3.14. The 3.12 ceiling was based on a stale assumption that Resolve's
10
+ scripting bridge has ABI incompatibilities on 3.13+. Verified empirically against
11
+ DaVinci Resolve Studio 20.3.2.9: Python 3.14.4 connects and exercises the
12
+ dict/list marshalling paths cleanly. The launcher and installer now enforce only
13
+ the 3.10 floor (the `mcp[cli]` SDK requirement) with no upper cap. Python 3.13/3.14
14
+ are accepted with a soft heads-up; `setup`/`doctor` surface a precise,
15
+ connection-aware hint only when Resolve is running but the bridge returns no
16
+ connection on 3.13+. Sub-3.10 interpreters get an actionable error instead of a
17
+ dead end. `server.py` warns (never exits) on 3.13+. Adds 6 version-gate unit tests.
18
+
5
19
  ## What's New in v2.26.0
6
20
 
7
21
  **Fusion group-settings helpers** — Three new `fusion_comp` actions for
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # DaVinci Resolve MCP Server
2
2
 
3
- [![Version](https://img.shields.io/badge/version-2.26.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.26.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
4
4
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
5
5
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
6
6
  [![Tools](https://img.shields.io/badge/MCP%20Tools-32%20(329%20full)-blue.svg)](#server-modes)
7
7
  [![Tested](https://img.shields.io/badge/Live%20Tested-98.5%25-green.svg)](docs/reference/api-coverage.md#test-results)
8
8
  [![DaVinci Resolve](https://img.shields.io/badge/DaVinci%20Resolve-18.5+-darkred.svg)](https://www.blackmagicdesign.com/products/davinciresolve)
9
- [![Python](https://img.shields.io/badge/python-3.10--3.12-green.svg)](https://www.python.org/downloads/)
9
+ [![Python](https://img.shields.io/badge/python-3.10+-green.svg)](https://www.python.org/downloads/)
10
10
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
11
11
 
12
12
  A Model Context Protocol (MCP) server that lets AI assistants control DaVinci Resolve Studio through the official Scripting API. It provides full API coverage plus guarded workflow helpers for editing, media pool organization, render setup, review markers, grading, Fusion, Fairlight, project lifecycle tasks, extension authoring, and source-safe media analysis.
@@ -133,7 +133,7 @@ Extension authoring references live in [docs/authoring](docs/authoring/). Resolv
133
133
  ## Requirements
134
134
 
135
135
  - DaVinci Resolve Studio 18.5+ on macOS, Windows, or Linux. The free edition does not support external scripting.
136
- - Python 3.10-3.12 recommended. Python 3.13+ may have ABI incompatibilities with Resolve's scripting library.
136
+ - Python 3.10+ (3.10-3.12 is the lowest-risk range). Python 3.13/3.14 also work on recent Resolve builds (verified on Studio 20.3.2); older builds may fail to connect on 3.13+, in which case use 3.10-3.12.
137
137
  - Resolve external scripting set to **Local**.
138
138
 
139
139
  Resolve 19.1.3 remains the compatibility baseline. Resolve 20.x scripting calls are additive, version-guarded, and live-tested on 20.3.2. Resolve 21 beta APIs are intentionally deferred until stable.
@@ -11,6 +11,16 @@ const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)),
11
11
  const VERSION = readPackageVersion();
12
12
  const MANAGED_MARKER = ".davinci-resolve-mcp-managed.json";
13
13
 
14
+ // The only hard Python floor is the MCP SDK: mcp[cli] requires 3.10+.
15
+ // We do NOT cap the upper bound. Resolve's scripting bridge (fusionscript)
16
+ // loads cleanly into newer interpreters on recent builds — Python 3.14 is
17
+ // verified working against Resolve Studio 20.3.2. Older Resolve builds may
18
+ // fail to connect on 3.13+, but the version number is a poor proxy for that;
19
+ // the connection check in `setup`/`doctor` is the real signal, so we proceed
20
+ // with a soft heads-up rather than refusing to run.
21
+ const PY_MIN_MINOR = 10;
22
+ const PY_ABI_RISK_MINOR = 13;
23
+
14
24
  const SYNC_ITEMS = [
15
25
  "bin",
16
26
  "src",
@@ -54,7 +64,8 @@ Examples:
54
64
 
55
65
  Environment:
56
66
  DAVINCI_RESOLVE_MCP_INSTALL_ROOT Override the managed install directory.
57
- DAVINCI_RESOLVE_MCP_PYTHON Python executable to use.
67
+ DAVINCI_RESOLVE_MCP_PYTHON Python executable to use (3.10+). Set this to
68
+ pin a specific interpreter, e.g. python3.12.
58
69
  PYTHON Fallback Python executable to use.
59
70
  `;
60
71
  }
@@ -193,17 +204,24 @@ function pythonCandidates() {
193
204
  if (explicit) {
194
205
  candidates.push(explicit);
195
206
  }
207
+ // Prefer the lowest-ABI-risk interpreters first, then newer ones, then the
208
+ // generic launchers. All 3.10+ are accepted; ordering just picks the safest
209
+ // when several are installed.
196
210
  if (process.platform === "win32" && commandExists("py")) {
197
211
  candidates.push(
198
212
  { command: "py", args: ["-3.12"] },
199
213
  { command: "py", args: ["-3.11"] },
200
- { command: "py", args: ["-3.10"] }
214
+ { command: "py", args: ["-3.10"] },
215
+ { command: "py", args: ["-3.13"] },
216
+ { command: "py", args: ["-3.14"] }
201
217
  );
202
218
  }
203
219
  candidates.push(
204
220
  { command: "python3.12", args: [] },
205
221
  { command: "python3.11", args: [] },
206
222
  { command: "python3.10", args: [] },
223
+ { command: "python3.13", args: [] },
224
+ { command: "python3.14", args: [] },
207
225
  { command: "python3", args: [] },
208
226
  { command: "python", args: [] }
209
227
  );
@@ -224,8 +242,9 @@ function checkPython(candidate) {
224
242
  }
225
243
  try {
226
244
  const info = JSON.parse(result.stdout.trim());
227
- const supported = info.major === 3 && info.minor >= 10 && info.minor <= 12;
228
- return { ...candidate, ...info, supported };
245
+ const supported = info.major === 3 && info.minor >= PY_MIN_MINOR;
246
+ const abiRisk = info.major === 3 && info.minor >= PY_ABI_RISK_MINOR;
247
+ return { ...candidate, ...info, supported, abiRisk };
229
248
  } catch {
230
249
  return null;
231
250
  }
@@ -244,8 +263,40 @@ function findSupportedPython() {
244
263
  }
245
264
  }
246
265
 
247
- const suffix = checked.length ? ` Found: ${checked.join(", ")}.` : "";
248
- throw new Error(`Python 3.10-3.12 is required for Resolve scripting compatibility.${suffix}`);
266
+ throw new Error(unsupportedPythonMessage(checked));
267
+ }
268
+
269
+ // Print the 3.13+ heads-up for run modes that never invoke install.py
270
+ // (server/control-panel/batch). setup/doctor stay quiet here because
271
+ // install.py emits a richer, connection-aware note of its own.
272
+ function maybeWarnAbiRisk(info) {
273
+ if (info && info.abiRisk) {
274
+ console.warn(abiRiskNote(info));
275
+ }
276
+ }
277
+
278
+ function abiRiskNote(info) {
279
+ return (
280
+ `Note: using Python ${info.major}.${info.minor}.${info.micro}. ` +
281
+ `This is verified working on recent Resolve builds (Studio 20.3.2). ` +
282
+ `If Resolve fails to connect (scriptapp("Resolve") returns None), install ` +
283
+ `Python 3.10-3.12 and pin it with DAVINCI_RESOLVE_MCP_PYTHON=/path/to/python3.12.`
284
+ );
285
+ }
286
+
287
+ function unsupportedPythonMessage(checked) {
288
+ const found = checked.length ? ` Found: ${checked.join(", ")}.` : "";
289
+ const lines = [
290
+ `Python 3.${PY_MIN_MINOR} or newer is required (the MCP SDK needs Python 3.${PY_MIN_MINOR}+).${found}`,
291
+ "",
292
+ "How to fix:",
293
+ " - Install Python 3.12 (the lowest-risk version for Resolve), e.g.:",
294
+ " macOS: brew install python@3.12 (or: pyenv install 3.12)",
295
+ " Linux: pyenv install 3.12 (or your distro's python3.12 package)",
296
+ " Windows: install Python 3.12 from python.org",
297
+ ` - Point the launcher at it: DAVINCI_RESOLVE_MCP_PYTHON=/path/to/python3.12 npx ${APP_NAME} setup`,
298
+ ];
299
+ return lines.join("\n");
249
300
  }
250
301
 
251
302
  function venvPython(root) {
@@ -258,7 +309,10 @@ function venvPython(root) {
258
309
  }
259
310
  const info = checkPython({ command: executable, args: [] });
260
311
  if (!info || !info.supported) {
261
- throw new Error(`Managed venv Python must be 3.10-3.12. Re-run setup to recreate it: ${executable}`);
312
+ throw new Error(
313
+ `Managed venv Python must be 3.${PY_MIN_MINOR} or newer. ` +
314
+ `Re-run setup to recreate it: ${executable}`
315
+ );
262
316
  }
263
317
  return info;
264
318
  }
@@ -326,6 +380,7 @@ function commandDoctor(args) {
326
380
  function commandServer(args) {
327
381
  const root = syncManagedInstall(installRoot());
328
382
  const python = venvPython(root) || findSupportedPython();
383
+ maybeWarnAbiRisk(python);
329
384
  const serverScript = path.join(root, "src", "server.py");
330
385
  const [command, ...commandArgs] = pythonCommandLine(python, [serverScript, ...args]);
331
386
  run(command, commandArgs, { cwd: root });
@@ -334,6 +389,7 @@ function commandServer(args) {
334
389
  function commandControlPanel(args) {
335
390
  const root = syncManagedInstall(installRoot());
336
391
  const python = venvPython(root) || findSupportedPython();
392
+ maybeWarnAbiRisk(python);
337
393
  const [command, ...commandArgs] = pythonCommandLine(python, ["-m", "src.control_panel", ...args]);
338
394
  run(command, commandArgs, { cwd: root });
339
395
  }
@@ -341,6 +397,7 @@ function commandControlPanel(args) {
341
397
  function commandBatch(args) {
342
398
  const root = syncManagedInstall(installRoot());
343
399
  const python = venvPython(root) || findSupportedPython();
400
+ maybeWarnAbiRisk(python);
344
401
  const [command, ...commandArgs] = pythonCommandLine(python, ["-m", "src.batch_cli", ...args]);
345
402
  run(command, commandArgs, { cwd: root });
346
403
  }
package/docs/SKILL.md CHANGED
@@ -1247,9 +1247,13 @@ timeline item returns `False` in Resolve. Use `get_node_graph` without a
1247
1247
  if the Gallery panel is open in the Resolve UI on the Color page. Instruct the
1248
1248
  user to open it via Workspace menu if export fails.
1249
1249
 
1250
- **Python version** — Resolve's scripting library works best with Python 3.10–3.12.
1251
- Python 3.13+ may cause `scriptapp("Resolve")` to return `None` due to ABI
1252
- incompatibilities.
1250
+ **Python version** — the only hard requirement is Python **3.10+** (the MCP SDK
1251
+ floor). There is no upper cap: 3.13/3.14 are accepted, and Python 3.14 is verified
1252
+ working against Resolve Studio 20.3.2. On *older* Resolve builds the scripting
1253
+ bridge may still fail to load on 3.13+ (`scriptapp("Resolve")` returns `None`);
1254
+ `setup`/`doctor` warn on 3.13+ and their connection check surfaces a real failure.
1255
+ If that happens, recreate the venv with Python 3.10–3.12 (the lowest-risk range).
1256
+ The running server only warns on 3.13+ rather than exiting.
1253
1257
 
1254
1258
  **Resolve version guards** — Resolve 20-specific actions return a clear
1255
1259
  `requires DaVinci Resolve 20.x+` error when called against older builds. Resolve
package/docs/install.md CHANGED
@@ -5,9 +5,18 @@ This guide covers Resolve requirements, the universal installer, supported MCP c
5
5
  ## Requirements
6
6
 
7
7
  - **DaVinci Resolve Studio** 18.5+ (macOS, Windows, or Linux) — the free edition does not support external scripting
8
- - **Python 3.10–3.12** recommended (3.13+ may have ABI incompatibilities with Resolve's scripting library)
8
+ - **Python 3.10+** (the MCP SDK requires 3.10). **3.10–3.12 is the lowest-risk
9
+ choice**; 3.13/3.14 also work on recent Resolve builds — see below
9
10
  - DaVinci Resolve running with **Preferences > General > "External scripting using"** set to **Local**
10
11
 
12
+ > **Python 3.13 / 3.14:** these are **allowed** — setup will use them and warn.
13
+ > Python 3.14 is verified working against DaVinci Resolve Studio 20.3.2. On
14
+ > *older* Resolve builds the scripting bridge may fail to load on 3.13+
15
+ > (`scriptapp("Resolve")` returns `None`); setup's connection check will tell you
16
+ > if that happens. If it does, install a 3.10–3.12 interpreter
17
+ > (`brew install python@3.12`, `pyenv install 3.12`, or python.org on Windows) and
18
+ > point the launcher at it with `DAVINCI_RESOLVE_MCP_PYTHON=/path/to/python3.12`.
19
+
11
20
  Validated live coverage is based on **DaVinci Resolve 19.1.3 Studio** for the original API surface, plus **DaVinci Resolve 20.3.2 Studio** for the Resolve 20.0-20.2.2 scripting additions. Resolve 21 beta APIs are intentionally deferred until a stable release.
12
21
 
13
22
  ## Quick Start
package/install.py CHANGED
@@ -35,9 +35,14 @@ from src.utils.update_check import (
35
35
 
36
36
  # ─── Version ──────────────────────────────────────────────────────────────────
37
37
 
38
- VERSION = "2.26.0"
38
+ VERSION = "2.26.1"
39
+ # Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
40
+ # Resolve's scripting bridge loads into newer interpreters on recent builds
41
+ # (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
42
+ # may fail to connect on 3.13+, but the connection check is the real signal,
43
+ # so we proceed with a heads-up rather than refusing to run.
39
44
  SUPPORTED_PYTHON_MIN = (3, 10)
40
- SUPPORTED_PYTHON_MAX = (3, 12)
45
+ PYTHON_ABI_RISK_MIN = (3, 13)
41
46
 
42
47
  # ─── Colors (disabled on Windows cmd without ANSI support) ────────────────────
43
48
 
@@ -77,7 +82,12 @@ def platform_name():
77
82
 
78
83
  def is_supported_python_version(version):
79
84
  major, minor = version[:2]
80
- return major == 3 and SUPPORTED_PYTHON_MIN[1] <= minor <= SUPPORTED_PYTHON_MAX[1]
85
+ return major == 3 and minor >= SUPPORTED_PYTHON_MIN[1]
86
+
87
+
88
+ def is_abi_risk_python_version(version):
89
+ major, minor = version[:2]
90
+ return major == 3 and minor >= PYTHON_ABI_RISK_MIN[1]
81
91
 
82
92
 
83
93
  def format_python_version(version):
@@ -85,9 +95,38 @@ def format_python_version(version):
85
95
 
86
96
 
87
97
  def python_requirement_text():
98
+ return f"Python {SUPPORTED_PYTHON_MIN[0]}.{SUPPORTED_PYTHON_MIN[1]} or newer"
99
+
100
+
101
+ _ABI_NOTE_PRINTED = False
102
+
103
+
104
+ def print_abi_risk_note_once(version, label="Python"):
105
+ """Emit the 3.13+ heads-up at most once per installer run."""
106
+ global _ABI_NOTE_PRINTED
107
+ if _ABI_NOTE_PRINTED:
108
+ return
109
+ _ABI_NOTE_PRINTED = True
110
+ print(f" {yellow(label + ':')} {python_abi_risk_note(version)}")
111
+
112
+
113
+ def python_abi_risk_note(version):
114
+ return (
115
+ f"Using Python {format_python_version(version)}. Verified working on recent "
116
+ f"Resolve builds (Studio 20.3.2). If Resolve fails to connect "
117
+ f"(scriptapp(\"Resolve\") returns None), install Python 3.10-3.12 and re-run "
118
+ f"with it, e.g.: python3.12 install.py"
119
+ )
120
+
121
+
122
+ def python_fix_hint():
88
123
  return (
89
- f"Python {SUPPORTED_PYTHON_MIN[0]}.{SUPPORTED_PYTHON_MIN[1]}-"
90
- f"{SUPPORTED_PYTHON_MAX[0]}.{SUPPORTED_PYTHON_MAX[1]}"
124
+ " How to fix:\n"
125
+ " - Install Python 3.12 (the lowest-risk version for Resolve), e.g.:\n"
126
+ " macOS: brew install python@3.12 (or: pyenv install 3.12)\n"
127
+ " Linux: pyenv install 3.12 (or your distro's python3.12 package)\n"
128
+ " Windows: install Python 3.12 from python.org\n"
129
+ " - Re-run with that interpreter, e.g.: python3.12 install.py"
91
130
  )
92
131
 
93
132
 
@@ -120,10 +159,13 @@ def require_supported_python(python_path, label="Python"):
120
159
  if not is_supported_python_version(version):
121
160
  print(
122
161
  f" {red(label + ':')} {python_requirement_text()} is required "
123
- f"for Resolve scripting compatibility; found {format_python_version(version)} "
162
+ f"(the MCP SDK needs 3.10+); found {format_python_version(version)} "
124
163
  f"at {python_path}"
125
164
  )
165
+ print(python_fix_hint())
126
166
  sys.exit(1)
167
+ if is_abi_risk_python_version(version):
168
+ print_abi_risk_note_once(version, label)
127
169
  return version
128
170
 
129
171
 
@@ -132,10 +174,13 @@ def require_current_python(label="Python"):
132
174
  if not is_supported_python_version(version):
133
175
  print(
134
176
  f" {red(label + ':')} {python_requirement_text()} is required "
135
- f"for Resolve scripting compatibility; current interpreter is "
177
+ f"(the MCP SDK needs 3.10+); current interpreter is "
136
178
  f"{format_python_version(version)} at {sys.executable}"
137
179
  )
180
+ print(python_fix_hint())
138
181
  sys.exit(1)
182
+ if is_abi_risk_python_version(version):
183
+ print_abi_risk_note_once(version, label)
139
184
  return version
140
185
 
141
186
  # ─── Resolve Path Detection ──────────────────────────────────────────────────
@@ -1411,14 +1456,34 @@ def main():
1411
1456
 
1412
1457
  if api_path:
1413
1458
  success, message = verify_resolve_connection(python_path, api_path, lib_path)
1459
+ try:
1460
+ py_abi_risk = is_abi_risk_python_version(_version_for_python(python_path))
1461
+ except Exception:
1462
+ py_abi_risk = False
1414
1463
  if success:
1415
1464
  if "not running" in message.lower():
1416
1465
  print(f" API: {green('Module loads OK')}")
1417
- print(f" Resolve: {yellow('Not running')} start Resolve to use MCP tools")
1466
+ # If Resolve IS running but the bridge still reported no connection
1467
+ # on a 3.13+ interpreter, that is the ABI-mismatch signature.
1468
+ if resolve_running and py_abi_risk:
1469
+ print(
1470
+ f" Resolve: {yellow('Running, but the scripting bridge returned no connection')}"
1471
+ )
1472
+ print(
1473
+ f" This can happen on Python 3.13+ with older Resolve builds. "
1474
+ f"If MCP tools fail, recreate the venv with Python 3.10-3.12."
1475
+ )
1476
+ else:
1477
+ print(f" Resolve: {yellow('Not running')} — start Resolve to use MCP tools")
1418
1478
  else:
1419
1479
  print(f" Connected: {green(message)}")
1420
1480
  else:
1421
1481
  print(f" Verify: {yellow(message)}")
1482
+ if py_abi_risk:
1483
+ print(
1484
+ f" On Python 3.13+ this may be an ABI mismatch with Resolve's "
1485
+ f"scripting library — try Python 3.10-3.12 if it persists."
1486
+ )
1422
1487
  else:
1423
1488
  print(f" {yellow('Skipped')} — Resolve API path not detected")
1424
1489
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.26.0",
3
+ "version": "2.26.1",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
80
80
  handlers=[logging.StreamHandler()],
81
81
  )
82
82
 
83
- VERSION = "2.26.0"
83
+ VERSION = "2.26.1"
84
84
  logger = logging.getLogger("davinci-resolve-mcp")
85
85
  logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
86
86
  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 329-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.26.0"
14
+ VERSION = "2.26.1"
15
15
 
16
16
  import base64
17
17
  import os
@@ -498,9 +498,10 @@ def prep_color_handoff(output_dir: str = "") -> str:
498
498
  _py_ver = sys.version_info[:2]
499
499
  if _py_ver >= (3, 13):
500
500
  logger.warning(
501
- f"Python {_py_ver[0]}.{_py_ver[1]} detected. DaVinci Resolve's scripting API "
502
- f"may not work with Python 3.13+. If scriptapp('Resolve') returns None, "
503
- f"recreate the venv with Python 3.10-3.12."
501
+ f"Python {_py_ver[0]}.{_py_ver[1]} detected. This is verified working on recent "
502
+ f"Resolve builds (Studio 20.3.2), but older builds may not load the scripting "
503
+ f"bridge on 3.13+. If scriptapp('Resolve') returns None, recreate the venv with "
504
+ f"Python 3.10-3.12."
504
505
  )
505
506
 
506
507
  # ─── Resolve Connection (lazy) ───────────────────────────────────────────────