davinci-resolve-mcp 4.14.0 → 4.14.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,53 @@
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.2 — Refresh advanced-server dependencies
6
+
7
+ Lands #302. Fixes #301.
8
+
9
+ ### Fixed
10
+
11
+ - Refresh `resolve-advanced/package-lock.json` within the existing dependency
12
+ ranges to resolve five npm audit findings: MCP SDK 1.32.1, fast-uri 3.1.8,
13
+ hono 4.13.13, ip-address 10.7.4, and proxy-addr 2.0.8. The compatible sharp
14
+ platform packages also update. Dependency ranges are unchanged.
15
+ - Refresh the root package lockfile for the release.
16
+
17
+ ### Maintenance
18
+
19
+ - Add weekly Dependabot updates for `/resolve-advanced`.
20
+
21
+ ### Validation
22
+
23
+ - Production-only and full advanced-server npm audits report zero vulnerabilities.
24
+ - Advanced-server Node suite: 1,137 passed, 60 skipped, zero failed, with the
25
+ media-template cache directed to scratch space.
26
+ - Required release static checks pass. Control-panel documentation reviewed;
27
+ no panel behavior or navigation changed.
28
+ - No Resolve behavior changed; live Resolve validation is not required.
29
+
30
+ ## What's New in v4.14.1 — Setup finds the Mac App Store Studio bundle
31
+
32
+ Fixes #299.
33
+
34
+ ### Fixed
35
+
36
+ - **macOS path detection (`install.py`, `src/utils/resolve_runtime.py`, `src/utils/platform.py`, `scripts/doctor.py`)**:
37
+ the Mac App Store Studio build installs as `/Applications/DaVinci Resolve Studio.app`
38
+ and keeps `Developer/Scripting` inside the bundle. Setup only knew the installer
39
+ layout and the free App Store app, and the process check required a path ending
40
+ in `DaVinci Resolve.app`, so a running Studio app was reported as not running.
41
+ The installer bundle is still preferred when it is present. App Store Studio is
42
+ next, then the free App Store app. Auto-launch and restart use that same order.
43
+
44
+ ### Validation
45
+
46
+ - Path-detection unit tests pass, including the Studio process name, the in-bundle
47
+ scripting directory, and setup's candidate table.
48
+ - Release static checks pass.
49
+ - The Mac App Store Studio bundle was not connected live. It is not installed on
50
+ the release machine. The installer app and the free App Store app are.
51
+
5
52
  ## What's New in v4.14.0 — Subtitle presets install, and frame capture puts the render page back
6
53
 
7
54
  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
- [![Version](https://img.shields.io/badge/version-4.14.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-4.14.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-37%20(390%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-4.14.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-4.14.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-37%20(390%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
- > 本翻译对应 v4.14.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
15
+ > 本翻译对应 v4.14.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 = "4.14.0"
40
+ VERSION = "4.14.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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "4.14.0",
3
+ "version": "4.14.2",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
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": ("/Applications/DaVinci Resolve/DaVinci Resolve.app",),
63
- "api": ("/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting",),
64
- "lib": ("/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so",),
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 "DaVinci Resolve.app/Contents/MacOS/Resolve" in line:
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
@@ -91,7 +91,7 @@ if not logging.getLogger().handlers:
91
91
  handlers=[logging.StreamHandler()],
92
92
  )
93
93
 
94
- VERSION = "4.14.0"
94
+ VERSION = "4.14.2"
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
- app_path = "/Applications/DaVinci Resolve/DaVinci Resolve.app"
426
- if not os.path.exists(app_path):
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
@@ -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 = "4.14.0"
14
+ VERSION = "4.14.2"
15
15
 
16
16
  import base64
17
17
  import os
@@ -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
- resolve_path = '/Applications/DaVinci Resolve/DaVinci Resolve.app'
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'
@@ -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
- """The App Store bundle as well as the installer one.
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` instead —
118
- the same class of miss as a Windows install on another drive, and
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
- bundles = (
123
- "/Applications/DaVinci Resolve/DaVinci Resolve.app",
124
- "/Applications/DaVinci Resolve.app",
125
- )
126
- return [os.path.join(bundle, inside_bundle) for bundle in bundles]
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 Resolve.app`
38
- #: and the installer build inside `/Applications/DaVinci Resolve/`, and either
39
- #: one counts.
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", # macOS, both editions
42
- "Resolve.exe", # Windows
43
- "/opt/resolve/bin/resolve", # Linux
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 two editions in different places. Installer/Studio first, to
54
- #: preserve the behaviour that a machine with both starts Studio.
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