davinci-resolve-mcp 2.224.0 → 2.224.2

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
@@ -2,6 +2,108 @@
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.224.2 — offline authoring works on Windows
6
+
7
+ Contributed by @Dev-next-gen (#221), found and verified on Windows.
8
+
9
+ ### Fixed
10
+
11
+ - **`timeline(action="author_offline")` failed for every target on Windows
12
+ before writing anything.** The authoring bridge,
13
+ `scripts/author_interchange.mjs`, handed a filesystem path straight to a
14
+ dynamic `import()`. On macOS and Linux that is harmless; on Windows the path
15
+ is `C:\...`, and Node's ESM loader reads the drive letter as a URL scheme
16
+ `c:` and refuses it with `ERR_UNSUPPORTED_ESM_URL_SCHEME`. Because the import
17
+ runs before target validation, even the bridge's own error for an unknown
18
+ target never appeared. The path is now wrapped in `pathToFileURL(...).href`.
19
+ Nothing changes on macOS or Linux.
20
+ - This is the second time the same bug has shipped: the launcher hit it first
21
+ and was fixed the same way in 06d5bd6 (2026-07-15), and the authoring bridge,
22
+ added later, repeated it. CI runs only on Linux, which cannot see it, so it
23
+ stayed green both times.
24
+
25
+ ### Added
26
+
27
+ - **A static guard so it cannot ship a third time.** A new test fails if any
28
+ dynamic `import()` in `scripts/*.mjs` or `bin/*.mjs` is given anything other
29
+ than a string literal or `pathToFileURL(...)`. Checked statically precisely
30
+ because no Linux run can observe the failure. Verified here that it earns its
31
+ place: run against the unfixed bridge it fails naming exactly
32
+ `scripts/author_interchange.mjs:45`, and passes with the fix.
33
+
34
+ ### Validation
35
+
36
+ - Full suite green: 3,485 passed, 1 skipped.
37
+ - A repo-wide scan for non-literal dynamic imports, including
38
+ `resolve-advanced/server/` which the new guard does not cover, found only the
39
+ two launcher imports already fixed in 06d5bd6 and the one fixed here — so the
40
+ fix is complete, not a first instance of several.
41
+ - **Not verified on Windows hardware by this project — there is none here.**
42
+ The Windows failure and the fix were measured by @Dev-next-gen on Python 3.12
43
+ and Node 25: two failures and four errors on main, all eight passing with the
44
+ change. The `.drt` authoring cases additionally need `jszip` from the
45
+ `resolve-advanced` install, which that machine did not have; they now get
46
+ past the import — the only part this touches — and stop at the missing
47
+ module instead.
48
+
49
+ ## What's New in v2.224.1 — the bridge installer explains the outcome it was built to detect
50
+
51
+ Reported by @hemna (#219). No behaviour changed; the installer writes exactly
52
+ what it wrote before and says considerably more about it.
53
+
54
+ ### Fixed
55
+
56
+ - **The canary-only outcome had no printed guidance at all.** Seeing
57
+ `resolve_bridge_canary` in Workspace ▸ Scripts while `resolve_bridge_probe`
58
+ is absent is not a failed install — it is the single most informative thing
59
+ the installer can tell you, and the exact signal the Lua canary exists to
60
+ produce. But the printed steps were a fixed four-line list that assumed the
61
+ Python probe had listed, so a user in this case followed step 3 to a menu
62
+ entry that cannot exist. The explanation was written down the whole time —
63
+ inside the canary's own Lua comments, which nobody has any reason to open.
64
+ There is now a real branch for it that says the install worked, says not to
65
+ re-run it, and explains what the missing probe means.
66
+ - **Duplicate canary entries are now expected rather than alarming.** The
67
+ installer writes into every Scripts/Utility folder Resolve scans, giving the
68
+ canary the same filename in each, so Resolve lists it once per folder with no
69
+ way to tell them apart. The reporter saw two and reasonably read it as a
70
+ broken install; a real run on the maintainer's machine produces **four**. The
71
+ guidance now names the number and says running any one of them is the same as
72
+ running any other. The count is derived from what was actually installed, and
73
+ the filename now has a single definition shared by the writer and the
74
+ counter — those two disagreeing would produce guidance promising entries that
75
+ are not there.
76
+ - **The Console is named.** The canary reports through `print()`, which lands in
77
+ Workspace ▸ Console and nowhere else. The installer had never mentioned the
78
+ Console — the string does not appear in it — so running the canary with no
79
+ Console open looks exactly like nothing happening, which is what was
80
+ reported.
81
+
82
+ ### Changed
83
+
84
+ - The canary-only explanation is **split by edition instead of asserting a
85
+ single cause**. The canary's own text predates Resolve 21.1 and blames Python
86
+ discovery — `PYTHON3HOME`, then `/usr/local/bin/python3`, and nowhere else.
87
+ That is still right on Studio and on 21.0.x and earlier, but on **free 21.1
88
+ it is wrong**: Python scripting moved to the Studio edition (#203), so `.py`
89
+ files do not list there whatever Python is installed, and the older advice
90
+ would send a user chasing a setting that cannot fix their problem. Both
91
+ branches are now stated, newer cause first.
92
+
93
+ ### Validation
94
+
95
+ - Full suite green: 3,484 passed, 1 skipped. Six new tests cover the duplicate
96
+ count and its wording, the absence of that wording for a single canary, the
97
+ canary-only branch, the Console pointer, both edition branches with the
98
+ newer one ordered first, and the single-definition guarantee on the canary
99
+ filename.
100
+ - Verified by running the installer for real on this machine, which is where
101
+ the four-entry figure comes from.
102
+ - **Still open in #219**: the canary's own embedded remediation text carries
103
+ the pre-21.1 single-cause diagnosis. Correcting what it says to a specific
104
+ user needs their edition, which has been asked for; the printed guidance
105
+ above no longer depends on that answer.
106
+
5
107
  ## What's New in v2.224.0 — native Resolve 21.1 DCTL encryption
6
108
 
7
109
  Contributed by @legionsound (#216), live-validated on Studio 21.1.0.14.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  English | [简体中文](README.zh-CN.md)
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.224.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.224.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-36%20(377%20full)-blue.svg)](#server-modes)
package/README.zh-CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | 简体中文
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.224.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.224.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-36%20(377%20full)-blue.svg)](#服务器模式)
@@ -12,7 +12,7 @@
12
12
  [![Python](https://img.shields.io/badge/python-3.10+-green.svg)](https://www.python.org/downloads/)
13
13
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
14
14
 
15
- > 本翻译对应 v2.224.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
15
+ > 本翻译对应 v2.224.2 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
16
16
 
17
17
  一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
18
18
 
package/install.py CHANGED
@@ -37,7 +37,7 @@ from src.utils.update_check import (
37
37
 
38
38
  # ─── Version ──────────────────────────────────────────────────────────────────
39
39
 
40
- VERSION = "2.224.0"
40
+ VERSION = "2.224.2"
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.224.0",
3
+ "version": "2.224.2",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -281,6 +281,11 @@ _FRAMEWORK_PYTHON_ROOTS = (
281
281
  #: PYTHON3HOME is unset. This is the one python.org's installer creates.
282
282
  _FALLBACK_PYTHON3 = Path("/usr/local/bin/python3")
283
283
 
284
+ #: Filename of the Lua enumeration canary. Named once: the installer writes it
285
+ #: and the post-install guidance counts it, and those two disagreeing is how a
286
+ #: user ends up told to expect entries that are not there.
287
+ _CANARY_NAME = "resolve_bridge_canary.lua"
288
+
284
289
  _LUA_CANARY = """-- Installed by davinci-resolve-mcp as an enumeration canary.
285
290
  -- If THIS appears under Workspace > Scripts but resolve_bridge_probe does not,
286
291
  -- Resolve is listing Lua and silently skipping Python: it cannot find a Python 3.
@@ -650,7 +655,7 @@ def _install_to(target: Path, *, probe_only: bool, installed: list[str]) -> None
650
655
  installed.append(str(target / probe))
651
656
  # Lua always enumerates; Python only with a framework install. The canary
652
657
  # makes "Python not detected" distinguishable from "wrong folder".
653
- canary = target / "resolve_bridge_canary.lua"
658
+ canary = target / _CANARY_NAME
654
659
  canary.write_text(_LUA_CANARY, encoding="utf-8")
655
660
  installed.append(str(canary))
656
661
  if probe_only:
@@ -686,6 +691,65 @@ def _install_to(target: Path, *, probe_only: bool, installed: list[str]) -> None
686
691
  installed.append(str(launcher_path))
687
692
 
688
693
 
694
+ def canary_count(result: dict) -> int:
695
+ """How many identical `resolve_bridge_canary` entries Resolve will list.
696
+
697
+ One per Scripts/Utility folder installed into, all with the same filename,
698
+ so they are indistinguishable in the menu. Reported in issue #219 by a user
699
+ who reasonably read two identical entries as a broken install.
700
+ """
701
+ return sum(1 for path in result.get("installed", [])
702
+ if str(path).endswith(_CANARY_NAME))
703
+
704
+
705
+ def next_steps(result: dict) -> list:
706
+ """The post-install instructions, as lines.
707
+
708
+ Built rather than printed inline so the canary-only branch is testable: it
709
+ is the single most likely outcome on macOS and, until issue #219, the only
710
+ one the installer had no words for. The user followed step 3 to a menu
711
+ entry that cannot exist, and the explanation was sitting in a Lua comment
712
+ they had no reason to open.
713
+ """
714
+ lines = [
715
+ "Next:",
716
+ " 1. Restart DaVinci Resolve so it re-scans the Scripts folders.",
717
+ " 2. Open a saved project (the Scripts menu is empty in Project Manager).",
718
+ " 3. Workspace > Scripts > resolve_bridge_probe — run it TWICE.",
719
+ # The probe runs INSIDE Resolve, which never sees the shell's
720
+ # DAVINCI_RESOLVE_BRIDGE_CONFIG — it always writes to the fixed default
721
+ # directory, so the guidance must not follow the override.
722
+ " 4. Read ~/.config/davinci-resolve-mcp/host-model-probe.json",
723
+ ]
724
+ count = canary_count(result)
725
+ if count > 1:
726
+ lines += [
727
+ "",
728
+ f"Expect {count} identical 'resolve_bridge_canary' entries — one per Scripts",
729
+ "folder this installed into. That is normal, not a double install; running",
730
+ "any one of them is the same as running any other.",
731
+ ]
732
+ lines += [
733
+ "",
734
+ "If step 3 shows no 'resolve_bridge_probe' and you can only see",
735
+ "'resolve_bridge_canary':",
736
+ " - The install worked. Do not re-run it. That is the canary doing its job:",
737
+ " Resolve is enumerating scripts, listing Lua, and skipping Python.",
738
+ " - Run 'resolve_bridge_canary' and read its output in Workspace > Console.",
739
+ " It reports with print(), not a dialog, so with no Console open it looks",
740
+ " like nothing happened.",
741
+ " - What it means depends on your edition:",
742
+ " * Resolve 21.1+ FREE — Python scripting moved to the Studio edition,",
743
+ " so .py files no longer list there at all and no Python setting will",
744
+ " change that. See issue #203.",
745
+ " * Studio, or 21.0.x and earlier — Resolve cannot find a Python 3. It",
746
+ " looks at PYTHON3HOME and then /usr/local/bin/python3 and nowhere",
747
+ " else, which is why Homebrew, pyenv, uv and conda builds go unseen.",
748
+ " The canary's own output carries the fix.",
749
+ ]
750
+ return lines
751
+
752
+
689
753
  def main() -> int:
690
754
  parser = argparse.ArgumentParser(description=__doc__)
691
755
  parser.add_argument("--probe-only", action="store_true",
@@ -709,14 +773,8 @@ def main() -> int:
709
773
  print("WARNING: " + warning)
710
774
  print("!" * 72)
711
775
  print()
712
- print("Next:")
713
- print(" 1. Restart DaVinci Resolve so it re-scans the Scripts folders.")
714
- print(" 2. Open a saved project (the Scripts menu is empty in Project Manager).")
715
- print(" 3. Workspace > Scripts > resolve_bridge_probe — run it TWICE.")
716
- # The probe runs INSIDE Resolve, which never sees the shell's
717
- # DAVINCI_RESOLVE_BRIDGE_CONFIG — it always writes to the fixed default
718
- # directory, so the guidance must not follow the override.
719
- print(" 4. Read ~/.config/davinci-resolve-mcp/host-model-probe.json")
776
+ for line in next_steps(result):
777
+ print(line)
720
778
  return 0
721
779
 
722
780
 
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
87
87
  handlers=[logging.StreamHandler()],
88
88
  )
89
89
 
90
- VERSION = "2.224.0"
90
+ VERSION = "2.224.2"
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 377-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.224.0"
14
+ VERSION = "2.224.2"
15
15
 
16
16
  import base64
17
17
  import os