davinci-resolve-mcp 2.70.1 → 2.70.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,59 @@
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.70.2
6
+
7
+ The control panel could never reach the free edition, even with a perfectly
8
+ healthy in-app bridge. Reported in issue #109 by @alpaolo.
9
+
10
+ ### The bug
11
+
12
+ The panel runs as a separate process from the MCP server and has its own Resolve
13
+ connector. That connector returned as soon as `import DaVinciResolveScript`
14
+ failed:
15
+
16
+ ```python
17
+ try:
18
+ import DaVinciResolveScript as dvr_script
19
+ except Exception as exc:
20
+ return None, f"Resolve scripting API unavailable: {exc}"
21
+ ```
22
+
23
+ On the free edition that import is exactly what fails — Blackmagic's module ships
24
+ with the installer, not the App Store build, so there is no
25
+ `Developer/Scripting/Modules` tree to import from. The panel returned there,
26
+ before ever calling `connect_resolve`, whose entire purpose is that it accepts
27
+ `None` in bridge mode:
28
+
29
+ > `dvr_script` may be None in bridge mode: the bridge does not need Blackmagic's
30
+ > module at all, which is precisely why it reaches editions the module cannot.
31
+
32
+ So the reporter saw the bridge listening, the MCP server connected, and the panel
33
+ insisting "Resolve unavailable" — all at the same time, all correct.
34
+
35
+ `_try_connect` in `src/server.py` already carried this guard, with a comment
36
+ recording the same diagnosis from when it bit the server. The panel's connector
37
+ was missed. That makes it the third connector overlooked when a transport was
38
+ added, after the network-scripting one in v2.64.0.
39
+
40
+ ### The fix
41
+
42
+ The panel now consults the bridge first and treats both the environment setup and
43
+ the module import as optional when it is enabled — the same ordering the MCP
44
+ server uses.
45
+
46
+ The not-connected message no longer assumes Studio. It used to send every reader
47
+ to "open Resolve Studio with a project loaded", which is poor advice for a
48
+ free-edition user, since free is the one edition external scripting refuses by
49
+ design. It now names the fix that fits the situation, and says something
50
+ different depending on whether the bridge is enabled.
51
+
52
+ ### Windows bridge: `%PROGRAMDATA%` now confirmed
53
+
54
+ v2.70.1 shipped Windows script paths unverified. The #109 report was made on free
55
+ 21.0.1.11 with the bridge installed, listed and serving from `%PROGRAMDATA%`, so
56
+ that half is now confirmed rather than assumed. `%APPDATA%` remains untested.
57
+
5
58
  ## What's New in v2.70.1
6
59
 
7
60
  Windows support for the free-edition in-app bridge, and the end of doctor.py's
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DaVinci Resolve MCP Server
2
2
 
3
- [![Version](https://img.shields.io/badge/version-2.70.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.70.2-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-34%20(341%20full)-blue.svg)](#server-modes)
@@ -57,11 +57,11 @@ interpreters are not detected, and the script silently never appears in the
57
57
  menu. A Lua canary is installed alongside so you can tell that apart from a
58
58
  wrong folder.
59
59
 
60
- Validated on free 21.0.3.7 and Studio 19.1.3.7, both macOS. **Windows paths were
61
- added in v2.70.1 (issue #106) and have not yet been confirmed on Windows
62
- hardware** the installer targets the `%APPDATA%` and `%PROGRAMDATA%` script
63
- folders Blackmagic documents, but whether Resolve lists the bridge from them is
64
- unverified. Reports welcome.
60
+ Validated on free 21.0.3.7 and Studio 19.1.3.7, both macOS. The Windows paths
61
+ added in v2.70.1 (issue #106) shipped unverified; a report on free 21.0.1.11
62
+ (issue #109) has since shown the bridge installing, listing and serving from
63
+ `%PROGRAMDATA%` on Windows, so that path is now confirmed rather than assumed.
64
+ `%APPDATA%` remains untested. Reports welcome.
65
65
 
66
66
  This is the documented in-app path, not a licence circumvention, but Blackmagic
67
67
  could close it — treat it as a supported-until-it-is-not tier. Loopback only,
package/docs/SKILL.md CHANGED
@@ -33,11 +33,14 @@ work unchanged. Two things to know when diagnosing it:
33
33
  Lua canary, which always lists, so "Python not detected" is distinguishable
34
34
  from "wrong folder". The preflight is macOS-only — off macOS Resolve finds
35
35
  Python by other means, and running the check there was a false alarm (#106).
36
- - **Windows is unconfirmed.** The `%APPDATA%`/`%PROGRAMDATA%` script folders are
37
- targeted as of v2.70.1, but no Windows machine has verified that Resolve lists
38
- the bridge from them. If a user reports the menu entry missing on Windows, ask
39
- whether the Lua canary lists that separates "wrong folder" from "Python not
40
- detected" there too.
36
+ - **Windows: `%PROGRAMDATA%` confirmed, `%APPDATA%` still not.** Both script
37
+ folders have been targeted since v2.70.1; a free 21.0.1.11 report (#109) has
38
+ since shown Resolve listing and serving the bridge from `%PROGRAMDATA%`. If a
39
+ user reports the menu entry missing on Windows, ask whether the Lua canary
40
+ lists — that separates "wrong folder" from "Python not detected" there too.
41
+ - The **control panel connects over the bridge too** (fixed in v2.70.2). It runs
42
+ as a separate process with its own connector, so a panel that reports "Resolve
43
+ unavailable" while tool calls work is a panel-side bug, not a broken bridge.
41
44
  - The in-Resolve runtime is a **copy taken at install time**. After changing the
42
45
  repository, re-run the installer and then ask the running bridge to reload —
43
46
  it re-imports from disk in place, so Resolve does not need restarting.
package/install.py CHANGED
@@ -36,7 +36,7 @@ from src.utils.update_check import (
36
36
 
37
37
  # ─── Version ──────────────────────────────────────────────────────────────────
38
38
 
39
- VERSION = "2.70.1"
39
+ VERSION = "2.70.2"
40
40
  # Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
41
41
  # Resolve's scripting bridge loads into newer interpreters on recent builds
42
42
  # (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.70.1",
3
+ "version": "2.70.2",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -11953,9 +11953,33 @@ def _serialize_resolve(func):
11953
11953
  return wrapper
11954
11954
 
11955
11955
 
11956
+ def _bridge_requested() -> bool:
11957
+ """Has the operator asked for the in-app bridge?
11958
+
11959
+ Read at call time rather than at import, so a panel started before the
11960
+ variable was set still honours it.
11961
+ """
11962
+ try:
11963
+ from src.utils import resolve_bridge_client
11964
+
11965
+ return resolve_bridge_client.bridge_enabled()
11966
+ except Exception: # pragma: no cover - the client is optional
11967
+ return False
11968
+
11969
+
11956
11970
  def _connect_resolve_read_only() -> Tuple[Any, Optional[str]]:
11957
11971
  global _RESOLVE_ENV_READY
11958
11972
  with _RESOLVE_API_LOCK:
11973
+ # Blackmagic's module ships with the *installer*, not the App Store
11974
+ # build, so a free-edition machine has no Developer/Scripting/Modules
11975
+ # tree and both the environment setup and the import fail. Returning
11976
+ # here made the control panel unreachable on exactly the configuration
11977
+ # the bridge exists for: the MCP server connects fine over the bridge
11978
+ # while the panel — a separate process with its own connector — reports
11979
+ # "Resolve unavailable". `connect_resolve` accepts None in bridge mode,
11980
+ # and this returned before ever calling it (server.py:_try_connect
11981
+ # carries the same guard for the same reason).
11982
+ bridge_on = _bridge_requested()
11959
11983
  # Environment + sys.path setup is pure overhead and never goes stale, so
11960
11984
  # run it once per process rather than on every connection.
11961
11985
  if not _RESOLVE_ENV_READY:
@@ -11968,20 +11992,41 @@ def _connect_resolve_read_only() -> Tuple[Any, Optional[str]]:
11968
11992
  sys.path.append(candidate)
11969
11993
  _RESOLVE_ENV_READY = True
11970
11994
  except Exception as exc:
11971
- return None, f"Resolve scripting API unavailable: {exc}"
11995
+ if not bridge_on:
11996
+ return None, f"Resolve scripting API unavailable: {exc}"
11997
+ dvr_script = None
11972
11998
  try:
11973
- import DaVinciResolveScript as dvr_script # type: ignore
11999
+ import DaVinciResolveScript as _dvr_script # type: ignore
12000
+
12001
+ dvr_script = _dvr_script
11974
12002
  except Exception as exc:
11975
- return None, f"Resolve scripting API unavailable: {exc}"
12003
+ if not bridge_on:
12004
+ return None, f"Resolve scripting API unavailable: {exc}"
11976
12005
  try:
11977
12006
  resolve = connect_resolve(dvr_script)
11978
12007
  except Exception as exc:
11979
12008
  return None, f"Resolve connection failed: {exc}"
11980
12009
  if resolve is None:
11981
- return None, "DaVinci Resolve is not connected. Open Resolve Studio with a project loaded."
12010
+ return None, _not_connected_message(bridge_on)
11982
12011
  return resolve, None
11983
12012
 
11984
12013
 
12014
+ def _not_connected_message(bridge_on: bool) -> str:
12015
+ """Name the fix that applies, rather than assuming Studio.
12016
+
12017
+ The old text sent every reader to "open Resolve Studio", which is wrong
12018
+ advice for a free-edition user — the edition external scripting refuses by
12019
+ design, and the one the bridge exists to reach.
12020
+ """
12021
+ if bridge_on:
12022
+ return ("The in-app bridge is enabled but not answering. In Resolve, run "
12023
+ "Workspace > Scripts > resolve_bridge; launching Resolve cannot start it.")
12024
+ return ("DaVinci Resolve is not connected. On Studio, enable Preferences > General > "
12025
+ "'External scripting using' = Local. On the free edition, install the in-app "
12026
+ "bridge, run Workspace > Scripts > resolve_bridge, and set "
12027
+ "DAVINCI_RESOLVE_BRIDGE=1.")
12028
+
12029
+
11985
12030
  @_serialize_resolve
11986
12031
  def _current_resolve_project_id() -> Tuple[Optional[str], Optional[str]]:
11987
12032
  """(project_id, error) for the currently-open Resolve project.
@@ -85,7 +85,7 @@ if not logging.getLogger().handlers:
85
85
  handlers=[logging.StreamHandler()],
86
86
  )
87
87
 
88
- VERSION = "2.70.1"
88
+ VERSION = "2.70.2"
89
89
  logger = logging.getLogger("davinci-resolve-mcp")
90
90
  logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
91
91
  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 341-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.70.1"
14
+ VERSION = "2.70.2"
15
15
 
16
16
  import base64
17
17
  import os