davinci-resolve-mcp 2.87.0 → 2.87.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/AGENTS.md +7 -1
- package/CHANGELOG.md +31 -0
- package/README.md +1 -1
- package/README.zh-CN.md +2 -2
- package/docs/reference/api-coverage.md +3 -3
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/granular/common.py +1 -1
- package/src/server.py +10 -4
package/AGENTS.md
CHANGED
|
@@ -73,7 +73,13 @@ semantics.
|
|
|
73
73
|
`docs/reference/api-limitations.md` — when you document a new Resolve API
|
|
74
74
|
limitation, add a `submit`-tagged entry to `src/utils/api_truth.py` and
|
|
75
75
|
regenerate with `scripts/gen_api_limitations.py` (a drift guard enforces it)
|
|
76
|
-
- Bundled Resolve API text: `docs/reference/resolve_scripting_api.txt`
|
|
76
|
+
- Bundled Resolve API text: `docs/reference/resolve_scripting_api.txt` — refresh
|
|
77
|
+
it by copying the shipped `Developer/Scripting/README.txt` over it wholesale,
|
|
78
|
+
never by hand-adding the lines you already know about. The file's only value
|
|
79
|
+
is that a diff against it is trustworthy; a hand-patch carries a newer
|
|
80
|
+
`Last Updated:` header while still hiding everything you did not know to look
|
|
81
|
+
for. That is exactly how it sat eight weeks stale at 26 May 2026 while ten
|
|
82
|
+
documented 21.0.4 methods went unwired (PR #139)
|
|
77
83
|
|
|
78
84
|
## Key Paths
|
|
79
85
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
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.87.1
|
|
6
|
+
|
|
7
|
+
Follow-up evidence from @legionsound on PR #139, plus the process fix for the
|
|
8
|
+
tooling failure that PR exposed.
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **`import_user_preferences_preset` now says what the preset ended up called.**
|
|
13
|
+
The no-name path was the one branch in v2.87.0 with nothing behind it — it
|
|
14
|
+
calls the single-argument binding, which would have been a `TypeError` rather
|
|
15
|
+
than a graceful failure if the binding wanted two positionals. Round-tripped
|
|
16
|
+
on Studio 21.0.4.5 (export → delete → import both ways): the single-arg form
|
|
17
|
+
returns `True`, and the imported preset is **named after the file**. The
|
|
18
|
+
answer now carries that, so a caller who passed no name knows to read the
|
|
19
|
+
name back with `list_user_preferences_presets` instead of guessing.
|
|
20
|
+
|
|
21
|
+
### Documentation
|
|
22
|
+
|
|
23
|
+
- **`api-coverage.md`: the import/export rows carry the round-trip**, not
|
|
24
|
+
`dir()` membership. Still 🔬 and still 23 untested of 361 — the counting
|
|
25
|
+
convention is unchanged, because none of this was executed here. What changed
|
|
26
|
+
is the strength of the contributor's evidence behind two of the rows.
|
|
27
|
+
- **`AGENTS.md` now states how the API snapshot must be refreshed:** copy the
|
|
28
|
+
shipped `Developer/Scripting/README.txt` over it wholesale, never hand-add the
|
|
29
|
+
lines you already know about. A hand-patch carries a newer `Last Updated:`
|
|
30
|
+
header while hiding everything you did not know to look for — which is
|
|
31
|
+
precisely how the file sat eight weeks stale at 26 May 2026 while ten
|
|
32
|
+
documented 21.0.4 methods went unwired. The v2.87.0 snapshot was verified as a
|
|
33
|
+
wholesale replace (md5 `d732b3f6c1da08dc516bc8f80c5acd92`, byte-identical to
|
|
34
|
+
the 21.0.4.5 shipped file per the contributor).
|
|
35
|
+
|
|
5
36
|
## What's New in v2.87.0
|
|
6
37
|
|
|
7
38
|
The ten Resolve 21.0.4 scripting surfaces that the 24 Jul 2026 README refresh
|
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
|
-
> 本翻译对应 v2.87.
|
|
15
|
+
> 本翻译对应 v2.87.1 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
|
|
16
16
|
|
|
17
17
|
一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
|
|
18
18
|
|
|
@@ -157,7 +157,7 @@ checkable rather than asserted.
|
|
|
157
157
|
| `Resolve.SaveUserPreferencesPreset` | Requires a Resolve 21.0.4 build; the validation machine runs Studio 19.1.3 and free 21.0.3 | Yes |
|
|
158
158
|
| `Resolve.LoadUserPreferencesPreset` | Deliberately not executed even by the reporter: swaps the user's global preferences session-wide | No |
|
|
159
159
|
| `Resolve.DeleteUserPreferencesPreset` | Requires a Resolve 21.0.4 build; the validation machine runs Studio 19.1.3 and free 21.0.3 | Yes |
|
|
160
|
-
| `Resolve.ImportUserPreferencesPreset` | Requires a Resolve 21.0.4 build
|
|
160
|
+
| `Resolve.ImportUserPreferencesPreset` | Requires a Resolve 21.0.4 build; round-tripped by the reporter on 21.0.4.5 in both call shapes (PR #139), not here | Yes |
|
|
161
161
|
| `Resolve.ExportUserPreferencesPreset` | Requires a Resolve 21.0.4 build; the validation machine runs Studio 19.1.3 and free 21.0.3 | Yes |
|
|
162
162
|
| `PM.GetProjectAttributesInCurrentFolder` | Requires a Resolve 21.0.4 build; the validation machine runs Studio 19.1.3 and free 21.0.3 | Yes |
|
|
163
163
|
|
|
@@ -218,8 +218,8 @@ Every method in the DaVinci Resolve Scripting API and its test status. Methods a
|
|
|
218
218
|
| 28 | `SaveUserPreferencesPreset(presetName)` | 🔬 | Resolve 21.0.4. Not executed here; part of the issue #138 round-trip on 21.0.4.5 |
|
|
219
219
|
| 29 | `LoadUserPreferencesPreset(presetName)` | 🔬 | Resolve 21.0.4. `dir()`-present on 21.0.4.5; **not executed** even by the reporter — swaps the user's global preferences session-wide (issue #138) |
|
|
220
220
|
| 30 | `DeleteUserPreferencesPreset(presetName)` | 🔬 | Resolve 21.0.4. Not executed here; part of the issue #138 round-trip on 21.0.4.5 |
|
|
221
|
-
| 31 | `ImportUserPreferencesPreset(presetFilePath, presetName)` | 🔬 | Resolve 21.0.4.
|
|
222
|
-
| 32 | `ExportUserPreferencesPreset(presetName, exportPath)` | 🔬 | Resolve 21.0.4.
|
|
221
|
+
| 31 | `ImportUserPreferencesPreset(presetFilePath, presetName)` | 🔬 | Resolve 21.0.4. Not executed here; reporter's export→delete→import round-trip on 21.0.4.5 (PR #139) covers **both** call shapes — single-arg returns `True` rather than a `TypeError`, and the imported preset is then named after the file; the two-arg form takes the given name. Per the README the imported preset is **not** auto-loaded, and the round-trip did not load either import |
|
|
222
|
+
| 32 | `ExportUserPreferencesPreset(presetName, exportPath)` | 🔬 | Resolve 21.0.4. Not executed here; reported writing the file at the given path with no extension appended, on 21.0.4.5 (PR #139) |
|
|
223
223
|
|
|
224
224
|
### ProjectManager
|
|
225
225
|
|
package/install.py
CHANGED
|
@@ -36,7 +36,7 @@ from src.utils.update_check import (
|
|
|
36
36
|
|
|
37
37
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
38
38
|
|
|
39
|
-
VERSION = "2.87.
|
|
39
|
+
VERSION = "2.87.1"
|
|
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
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.87.
|
|
88
|
+
VERSION = "2.87.1"
|
|
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.87.
|
|
14
|
+
VERSION = "2.87.1"
|
|
15
15
|
|
|
16
16
|
import base64
|
|
17
17
|
import os
|
|
@@ -13589,7 +13589,10 @@ def resolve_control(action: str, params: Optional[Dict[str, Any]] = None) -> Dic
|
|
|
13589
13589
|
delete_user_preferences_preset(name) -> {success} — Resolve 21.0.4+
|
|
13590
13590
|
import_user_preferences_preset(path, name?) -> {success} — Resolve 21.0.4+.
|
|
13591
13591
|
The imported preset is NOT auto-loaded; follow with
|
|
13592
|
-
load_user_preferences_preset to activate it.
|
|
13592
|
+
load_user_preferences_preset to activate it. Omitting name is safe
|
|
13593
|
+
(reported on 21.0.4.5: single-arg returns True, not a TypeError) and
|
|
13594
|
+
the preset is then named after the file, so pass name when the preset
|
|
13595
|
+
should be called something the filename does not say.
|
|
13593
13596
|
export_user_preferences_preset(name, path) -> {success} — Resolve 21.0.4+
|
|
13594
13597
|
open_control_panel(port?, host?, open_browser?) -> {success, url, pid, port, status}
|
|
13595
13598
|
— Launches the analysis control panel (src/analysis_dashboard.py) as a background process.
|
|
@@ -13862,8 +13865,11 @@ def resolve_control(action: str, params: Optional[Dict[str, Any]] = None) -> Dic
|
|
|
13862
13865
|
ok = bool(r.ImportUserPreferencesPreset(p["path"], p["name"]))
|
|
13863
13866
|
else:
|
|
13864
13867
|
ok = bool(r.ImportUserPreferencesPreset(p["path"]))
|
|
13865
|
-
|
|
13866
|
-
|
|
13868
|
+
note = "The imported preset is not auto-loaded; use load_user_preferences_preset to activate it."
|
|
13869
|
+
if not p.get("name"):
|
|
13870
|
+
note += (" No name was given, so the preset takes its name from the file — "
|
|
13871
|
+
"list_user_preferences_presets to read it back.")
|
|
13872
|
+
return {"success": ok, "note": note}
|
|
13867
13873
|
elif action == "export_user_preferences_preset":
|
|
13868
13874
|
missing = _requires_method(r, "ExportUserPreferencesPreset", "21.0.4")
|
|
13869
13875
|
if missing:
|