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 +53 -0
- package/README.md +6 -6
- package/docs/SKILL.md +8 -5
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/analysis_dashboard.py +49 -4
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
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
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
4
4
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
5
5
|
[](docs/reference/api-coverage.md)
|
|
6
6
|
[-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.
|
|
61
|
-
added in v2.70.1 (issue #106)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
37
|
-
targeted
|
|
38
|
-
|
|
39
|
-
|
|
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.
|
|
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
|
@@ -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
|
-
|
|
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
|
|
11999
|
+
import DaVinciResolveScript as _dvr_script # type: ignore
|
|
12000
|
+
|
|
12001
|
+
dvr_script = _dvr_script
|
|
11974
12002
|
except Exception as exc:
|
|
11975
|
-
|
|
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,
|
|
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.
|
package/src/granular/common.py
CHANGED
|
@@ -85,7 +85,7 @@ if not logging.getLogger().handlers:
|
|
|
85
85
|
handlers=[logging.StreamHandler()],
|
|
86
86
|
)
|
|
87
87
|
|
|
88
|
-
VERSION = "2.70.
|
|
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()}")
|