davinci-resolve-mcp 4.14.0 → 4.14.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/CHANGELOG.md +22 -0
- package/README.md +1 -1
- package/README.zh-CN.md +2 -2
- package/install.py +12 -1
- package/package.json +1 -1
- package/scripts/doctor.py +16 -3
- package/scripts/headless_differential.py +4 -1
- package/src/granular/common.py +4 -3
- package/src/server.py +1 -1
- package/src/utils/app_control.py +4 -1
- package/src/utils/platform.py +32 -9
- package/src/utils/resolve_runtime.py +13 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
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 v4.14.1 — Setup finds the Mac App Store Studio bundle
|
|
6
|
+
|
|
7
|
+
Fixes #299.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **macOS path detection (`install.py`, `src/utils/resolve_runtime.py`, `src/utils/platform.py`, `scripts/doctor.py`)**:
|
|
12
|
+
the Mac App Store Studio build installs as `/Applications/DaVinci Resolve Studio.app`
|
|
13
|
+
and keeps `Developer/Scripting` inside the bundle. Setup only knew the installer
|
|
14
|
+
layout and the free App Store app, and the process check required a path ending
|
|
15
|
+
in `DaVinci Resolve.app`, so a running Studio app was reported as not running.
|
|
16
|
+
The installer bundle is still preferred when it is present. App Store Studio is
|
|
17
|
+
next, then the free App Store app. Auto-launch and restart use that same order.
|
|
18
|
+
|
|
19
|
+
### Validation
|
|
20
|
+
|
|
21
|
+
- Path-detection unit tests pass, including the Studio process name, the in-bundle
|
|
22
|
+
scripting directory, and setup's candidate table.
|
|
23
|
+
- Release static checks pass.
|
|
24
|
+
- The Mac App Store Studio bundle was not connected live. It is not installed on
|
|
25
|
+
the release machine. The installer app and the free App Store app are.
|
|
26
|
+
|
|
5
27
|
## What's New in v4.14.0 — Subtitle presets install, and frame capture puts the render page back
|
|
6
28
|
|
|
7
29
|
Lands #298. Closes #297 and #296. #295 is only the controls the Word Highlight
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
English | [简体中文](README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
7
7
|
[](docs/reference/api-coverage.md)
|
|
8
8
|
[-blue.svg)](#server-modes)
|
package/README.zh-CN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | 简体中文
|
|
4
4
|
|
|
5
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
7
7
|
[](docs/reference/api-coverage.md)
|
|
8
8
|
[-blue.svg)](#服务器模式)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](https://www.python.org/downloads/)
|
|
13
13
|
[](https://opensource.org/licenses/MIT)
|
|
14
14
|
|
|
15
|
-
> 本翻译对应 v4.14.
|
|
15
|
+
> 本翻译对应 v4.14.1 版 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 = "4.14.
|
|
40
|
+
VERSION = "4.14.1"
|
|
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
|
|
@@ -225,14 +225,25 @@ def require_current_python(label="Python"):
|
|
|
225
225
|
|
|
226
226
|
RESOLVE_PATHS = {
|
|
227
227
|
"Darwin": {
|
|
228
|
+
# The Library scripting dir is what the installer writes. The Mac App
|
|
229
|
+
# Store builds never create it; their API lives inside the bundle.
|
|
230
|
+
# Installer first, then App Store Studio, then the free App Store app,
|
|
231
|
+
# so a machine with more than one keeps the installer.
|
|
228
232
|
"api": [
|
|
229
233
|
"/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting",
|
|
234
|
+
"/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Resources/Developer/Scripting",
|
|
235
|
+
"/Applications/DaVinci Resolve Studio.app/Contents/Resources/Developer/Scripting",
|
|
236
|
+
"/Applications/DaVinci Resolve.app/Contents/Resources/Developer/Scripting",
|
|
230
237
|
],
|
|
231
238
|
"lib": [
|
|
232
239
|
"/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so",
|
|
240
|
+
"/Applications/DaVinci Resolve Studio.app/Contents/Libraries/Fusion/fusionscript.so",
|
|
241
|
+
"/Applications/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so",
|
|
233
242
|
],
|
|
234
243
|
"app": [
|
|
235
244
|
"/Applications/DaVinci Resolve/DaVinci Resolve.app",
|
|
245
|
+
"/Applications/DaVinci Resolve Studio.app",
|
|
246
|
+
"/Applications/DaVinci Resolve.app",
|
|
236
247
|
],
|
|
237
248
|
},
|
|
238
249
|
"Windows": {
|
package/package.json
CHANGED
package/scripts/doctor.py
CHANGED
|
@@ -59,9 +59,22 @@ CODEX_CONFIG = CODEX_HOME / "config.toml"
|
|
|
59
59
|
#: what made it so confusing to diagnose (issue #106). Linux had the same bug.
|
|
60
60
|
_RESOLVE_PATH_CANDIDATES: dict[str, dict[str, tuple[str, ...]]] = {
|
|
61
61
|
"darwin": {
|
|
62
|
-
"app": (
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
"app": (
|
|
63
|
+
"/Applications/DaVinci Resolve/DaVinci Resolve.app",
|
|
64
|
+
"/Applications/DaVinci Resolve Studio.app",
|
|
65
|
+
"/Applications/DaVinci Resolve.app",
|
|
66
|
+
),
|
|
67
|
+
"api": (
|
|
68
|
+
"/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting",
|
|
69
|
+
"/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Resources/Developer/Scripting",
|
|
70
|
+
"/Applications/DaVinci Resolve Studio.app/Contents/Resources/Developer/Scripting",
|
|
71
|
+
"/Applications/DaVinci Resolve.app/Contents/Resources/Developer/Scripting",
|
|
72
|
+
),
|
|
73
|
+
"lib": (
|
|
74
|
+
"/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so",
|
|
75
|
+
"/Applications/DaVinci Resolve Studio.app/Contents/Libraries/Fusion/fusionscript.so",
|
|
76
|
+
"/Applications/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so",
|
|
77
|
+
),
|
|
65
78
|
},
|
|
66
79
|
"win32": {
|
|
67
80
|
"app": (r"C:\Program Files\Blackmagic Design\DaVinci Resolve\Resolve.exe",),
|
|
@@ -469,7 +469,10 @@ def resolve_process_argv() -> List[str]:
|
|
|
469
469
|
try:
|
|
470
470
|
out = subprocess.run(["ps", "-Ao", "pid=,command="], capture_output=True, text=True, timeout=10)
|
|
471
471
|
for line in out.stdout.splitlines():
|
|
472
|
-
if
|
|
472
|
+
if (
|
|
473
|
+
"DaVinci Resolve Studio.app/Contents/MacOS/Resolve" in line
|
|
474
|
+
or "DaVinci Resolve.app/Contents/MacOS/Resolve" in line
|
|
475
|
+
):
|
|
473
476
|
return line.split()
|
|
474
477
|
except Exception:
|
|
475
478
|
pass
|
package/src/granular/common.py
CHANGED
|
@@ -91,7 +91,7 @@ if not logging.getLogger().handlers:
|
|
|
91
91
|
handlers=[logging.StreamHandler()],
|
|
92
92
|
)
|
|
93
93
|
|
|
94
|
-
VERSION = "4.14.
|
|
94
|
+
VERSION = "4.14.1"
|
|
95
95
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
96
96
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
97
97
|
logger.info(f"Detected platform: {get_platform()}")
|
|
@@ -422,8 +422,9 @@ def _launch_resolve():
|
|
|
422
422
|
"""Launch DaVinci Resolve and wait for it to become available."""
|
|
423
423
|
sys_name = platform.system().lower()
|
|
424
424
|
if sys_name == "darwin":
|
|
425
|
-
|
|
426
|
-
if
|
|
425
|
+
from src.utils.resolve_runtime import MACOS_RESOLVE_APPS
|
|
426
|
+
app_path = next((p for p in MACOS_RESOLVE_APPS if os.path.exists(p)), None)
|
|
427
|
+
if not app_path:
|
|
427
428
|
return False
|
|
428
429
|
subprocess.Popen(["open", app_path], stdin=subprocess.DEVNULL)
|
|
429
430
|
elif sys_name == "windows":
|
package/src/server.py
CHANGED
package/src/utils/app_control.py
CHANGED
|
@@ -236,7 +236,10 @@ def restart_resolve_app(resolve_obj, wait_seconds: int = 5) -> bool:
|
|
|
236
236
|
try:
|
|
237
237
|
# Get Resolve executable path for restart
|
|
238
238
|
if platform.system().lower() == 'darwin':
|
|
239
|
-
|
|
239
|
+
from src.utils.resolve_runtime import MACOS_RESOLVE_APPS
|
|
240
|
+
resolve_path = next((p for p in MACOS_RESOLVE_APPS if os.path.exists(p)), None)
|
|
241
|
+
if resolve_path is None:
|
|
242
|
+
return False
|
|
240
243
|
elif platform.system().lower() == 'windows':
|
|
241
244
|
# Default path, may need to be customized
|
|
242
245
|
resolve_path = r'C:\Program Files\Blackmagic Design\DaVinci Resolve\Resolve.exe'
|
package/src/utils/platform.py
CHANGED
|
@@ -61,6 +61,14 @@ def get_resolve_paths():
|
|
|
61
61
|
if env_api and os.path.isdir(env_api):
|
|
62
62
|
api_path = env_api
|
|
63
63
|
modules_path = os.path.join(api_path, "Modules")
|
|
64
|
+
elif platform_name == "darwin" and not os.path.isdir(api_path):
|
|
65
|
+
# The Mac App Store builds keep Developer/Scripting inside the bundle
|
|
66
|
+
# and never create the /Library path above.
|
|
67
|
+
for candidate in _macos_api_candidates():
|
|
68
|
+
if os.path.isdir(candidate):
|
|
69
|
+
api_path = candidate
|
|
70
|
+
modules_path = os.path.join(api_path, "Modules")
|
|
71
|
+
break
|
|
64
72
|
env_lib = os.environ.get("RESOLVE_SCRIPT_LIB")
|
|
65
73
|
if env_lib and os.path.isfile(env_lib):
|
|
66
74
|
lib_path = env_lib
|
|
@@ -110,20 +118,35 @@ def _windows_lib_candidates():
|
|
|
110
118
|
return candidates
|
|
111
119
|
|
|
112
120
|
|
|
121
|
+
def _macos_bundles():
|
|
122
|
+
"""Installer, App Store Studio, then the free App Store app.
|
|
123
|
+
|
|
124
|
+
Imported lazily: this module is loaded while Resolve support is still
|
|
125
|
+
being located, and `resolve_runtime` is the list launch already uses.
|
|
126
|
+
"""
|
|
127
|
+
from .resolve_runtime import MACOS_RESOLVE_APPS
|
|
128
|
+
return MACOS_RESOLVE_APPS
|
|
129
|
+
|
|
130
|
+
|
|
113
131
|
def _macos_lib_candidates():
|
|
114
|
-
"""
|
|
132
|
+
"""Every macOS bundle's fusionscript, in launch order.
|
|
115
133
|
|
|
116
134
|
The default above names `/Applications/DaVinci Resolve/DaVinci Resolve.app`.
|
|
117
|
-
The App Store build installs to `/Applications/DaVinci Resolve.app
|
|
118
|
-
|
|
119
|
-
`resolve_runtime.MACOS_RESOLVE_APPS` already records both.
|
|
135
|
+
The free App Store build installs to `/Applications/DaVinci Resolve.app`,
|
|
136
|
+
and App Store Studio to `/Applications/DaVinci Resolve Studio.app`.
|
|
120
137
|
"""
|
|
121
138
|
inside_bundle = os.path.join("Contents", "Libraries", "Fusion", "fusionscript.so")
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
139
|
+
return [os.path.join(bundle, inside_bundle) for bundle in _macos_bundles()]
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _macos_api_candidates():
|
|
143
|
+
"""In-bundle scripting dirs, for builds that never write /Library.
|
|
144
|
+
|
|
145
|
+
Checked only when the system scripting directory is absent. The installer
|
|
146
|
+
build's /Library path stays the default when it exists.
|
|
147
|
+
"""
|
|
148
|
+
inside_bundle = os.path.join("Contents", "Resources", "Developer", "Scripting")
|
|
149
|
+
return [os.path.join(bundle, inside_bundle) for bundle in _macos_bundles()]
|
|
127
150
|
|
|
128
151
|
|
|
129
152
|
def _linux_lib_candidates():
|
|
@@ -34,13 +34,16 @@ import subprocess
|
|
|
34
34
|
from typing import Any, Dict, List, Optional
|
|
35
35
|
|
|
36
36
|
#: Process paths that mean a DaVinci Resolve application is running. Not the
|
|
37
|
-
#: full path: the App Store build lives at `/Applications/DaVinci
|
|
38
|
-
#:
|
|
39
|
-
#:
|
|
37
|
+
#: full path: the free App Store build lives at `/Applications/DaVinci
|
|
38
|
+
#: Resolve.app`, App Store Studio at `/Applications/DaVinci Resolve Studio.app`,
|
|
39
|
+
#: and the installer build inside `/Applications/DaVinci Resolve/`. The Studio
|
|
40
|
+
#: name is its own pattern — `DaVinci Resolve Studio.app` does not end with
|
|
41
|
+
#: `DaVinci Resolve.app`.
|
|
40
42
|
RESOLVE_PROCESS_PATTERNS = (
|
|
41
|
-
"DaVinci Resolve.app/Contents/MacOS/Resolve",
|
|
42
|
-
"Resolve.
|
|
43
|
-
"
|
|
43
|
+
"DaVinci Resolve Studio.app/Contents/MacOS/Resolve", # macOS, App Store Studio
|
|
44
|
+
"DaVinci Resolve.app/Contents/MacOS/Resolve", # macOS, installer and free App Store
|
|
45
|
+
"Resolve.exe", # Windows
|
|
46
|
+
"/opt/resolve/bin/resolve", # Linux
|
|
44
47
|
)
|
|
45
48
|
|
|
46
49
|
#: The documented headless switch. Blackmagic spells it exactly this way on all
|
|
@@ -50,10 +53,12 @@ HEADLESS_FLAG = "-nogui"
|
|
|
50
53
|
#: Set to 1 to make this server's auto-launch start Resolve without a UI.
|
|
51
54
|
ENV_PREFER_HEADLESS = "DAVINCI_RESOLVE_HEADLESS"
|
|
52
55
|
|
|
53
|
-
#: macOS puts the
|
|
54
|
-
#:
|
|
56
|
+
#: macOS puts the editions in different places. Installer first, then App Store
|
|
57
|
+
#: Studio, then the free App Store app: a machine with the installer still
|
|
58
|
+
#: starts that one, and a machine with both App Store editions starts Studio.
|
|
55
59
|
MACOS_RESOLVE_APPS = (
|
|
56
60
|
"/Applications/DaVinci Resolve/DaVinci Resolve.app",
|
|
61
|
+
"/Applications/DaVinci Resolve Studio.app",
|
|
57
62
|
"/Applications/DaVinci Resolve.app",
|
|
58
63
|
)
|
|
59
64
|
|