davinci-resolve-mcp 2.86.1 → 2.86.3
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 +41 -0
- package/README.md +1 -1
- package/README.zh-CN.md +3 -3
- package/docs/reference/api-limitations.md +16 -1
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
- package/src/utils/api_truth.py +62 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,47 @@
|
|
|
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.86.3
|
|
6
|
+
|
|
7
|
+
A Simplified Chinese phrasing fix from the reviewer who asked for it when #122
|
|
8
|
+
merged. No behavior changed.
|
|
9
|
+
|
|
10
|
+
### Documentation
|
|
11
|
+
|
|
12
|
+
- **The Linux bridge sentence in `README.zh-CN.md` now reads as native Chinese.**
|
|
13
|
+
`直接对系统 Python 列出脚本` was translationese; it is now
|
|
14
|
+
`用系统 Python 就能直接枚举脚本`. The same sentence picks up two terms the
|
|
15
|
+
macOS paragraph three lines above was already using — `framework 版 Python`
|
|
16
|
+
(the `版` was missing) and `枚举` for script enumeration — so the two
|
|
17
|
+
paragraphs describe the same Resolve behavior with the same words. The claim
|
|
18
|
+
itself is unchanged: the issue #129 Fedora 43 report still stands behind it.
|
|
19
|
+
Thanks to @chenyuxiaojin (PR #134).
|
|
20
|
+
|
|
21
|
+
## What's New in v2.86.2
|
|
22
|
+
|
|
23
|
+
Two free-edition/render limitations found while trying to photograph a styled
|
|
24
|
+
caption, both of the "returns success, does nothing" shape.
|
|
25
|
+
|
|
26
|
+
### Documented
|
|
27
|
+
|
|
28
|
+
- **Studio-gated calls on the free edition raise a modal that blocks LATER
|
|
29
|
+
calls.** The reference documents that a Studio-only function returns `False` on
|
|
30
|
+
the free edition. It does not mention that Resolve also throws a modal upsell
|
|
31
|
+
dialog, and that while it is up, *unrelated* API calls fail too. Confirmed on
|
|
32
|
+
free 21.0.3.7 over the bridge: `CreateSubtitlesFromAudio` and `TranscribeAudio`
|
|
33
|
+
each returned `False` and raised the dialog, after which `SaveProject` returned
|
|
34
|
+
`False` on every attempt until a human dismissed it. Nothing in any return
|
|
35
|
+
value names the dialog, so an automated caller sees a cascade of unexplained
|
|
36
|
+
failures and blames whatever it called next. Detect the edition first rather
|
|
37
|
+
than discovering the gate by tripping it.
|
|
38
|
+
|
|
39
|
+
- **A render with `ExportSubtitle` / `SubtitleFormat: BurnIn` produced no
|
|
40
|
+
subtitles at all** — no burned-in pixels, no embedded stream, no sidecar —
|
|
41
|
+
despite `SetRenderSettings` reporting success. Recorded as an observation, not
|
|
42
|
+
asserted as a Resolve bug: an unmet precondition (a Deliver-page toggle, output
|
|
43
|
+
enablement) is equally consistent with what was seen. Either way the guidance
|
|
44
|
+
holds — verify the artifact, never the boolean.
|
|
45
|
+
|
|
5
46
|
## What's New in v2.86.1
|
|
6
47
|
|
|
7
48
|
Corrects `api-coverage.md` where today's live work on the free edition made it
|
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.86.
|
|
15
|
+
> 本翻译对应 v2.86.3 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
|
|
16
16
|
|
|
17
17
|
一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
|
|
18
18
|
|
|
@@ -55,7 +55,7 @@ python scripts/install_resolve_bridge.py
|
|
|
55
55
|
|
|
56
56
|
在 **macOS** 上,这需要 **framework 版 Python**(python.org 官网安装包)。Resolve 只有找到 framework Python 才会枚举 `.py` 脚本——Homebrew、pyenv、conda 的解释器都不被识别,脚本会静默地不出现在菜单里。安装时会顺带装一个 Lua 金丝雀脚本,帮你区分"Python 不对"和"目录放错"。
|
|
57
57
|
|
|
58
|
-
已在免费版 21.0.3.7 和 Studio 19.1.3.7 上验证(均为 macOS)。v2.70.1(issue #106)加入的 Windows 路径发布时未经验证;后续免费版 21.0.1.11(issue #109)和免费版 21.0.3.7(issue #112)的用户报告证实,Windows 11 上桥接在 `%PROGRAMDATA%` 和 `%APPDATA%` **两处**都能安装、列出并正常服务,这些路径现在是已证实而非假设。Linux 同样已获证实:免费版 20.3.2.9 的用户报告(issue #129,Fedora 43)显示桥接可安装到 `~/.local/share/DaVinciResolve/Fusion/Scripts/Utility
|
|
58
|
+
已在免费版 21.0.3.7 和 Studio 19.1.3.7 上验证(均为 macOS)。v2.70.1(issue #106)加入的 Windows 路径发布时未经验证;后续免费版 21.0.1.11(issue #109)和免费版 21.0.3.7(issue #112)的用户报告证实,Windows 11 上桥接在 `%PROGRAMDATA%` 和 `%APPDATA%` **两处**都能安装、列出并正常服务,这些路径现在是已证实而非假设。Linux 同样已获证实:免费版 20.3.2.9 的用户报告(issue #129,Fedora 43)显示桥接可安装到 `~/.local/share/DaVinciResolve/Fusion/Scripts/Utility`,用系统 Python 就能直接枚举脚本(Linux 不需要 framework 版 Python),并能端到端正常服务。现在没有任何平台停留在假设上:macOS 为本项目直接验证,Windows 和 Linux 来自用户报告。
|
|
59
59
|
|
|
60
60
|
注意:桥接在服务期间会一直占用端口。v2.70.3 之前,Windows 上的桥接可能在 Resolve 退出后存活,挡住下一个会话的监听器;如果你用的是旧版本且桥接不响应了,检查是否有残留的 `fuscript.exe` 还占着端口。
|
|
61
61
|
|
|
@@ -12,7 +12,7 @@ that none exists).
|
|
|
12
12
|
|
|
13
13
|
**Verified on:** DaVinci Resolve Studio 21.0.2
|
|
14
14
|
|
|
15
|
-
**Totals:** 27 missing capabilities,
|
|
15
|
+
**Totals:** 27 missing capabilities, 32 bugs / unreliable behaviors.
|
|
16
16
|
|
|
17
17
|
The authoritative source is the runtime-queryable `api_truth` ledger
|
|
18
18
|
(`resolve_control api_truth "<query>"`); this document is generated from
|
|
@@ -382,6 +382,21 @@ values, or automation-hostile modal prompts.
|
|
|
382
382
|
- **Workaround / current handling:** Verify source-side placement with GetLeftOffset, which is exact. Treat GetSourceStartFrame as approximate, and never diff it against a sent startFrame to decide whether a clip landed right. Scope: placement at 100% speed. On a retimed clip the two read DIFFERENT domains — GetLeftOffset is warped (position / speed), GetSourceStartFrame is true source — see the retime entry's witness calibration before comparing them.
|
|
383
383
|
- **Tags:** off-by-one, unreliable-return, timeline, conform, verify
|
|
384
384
|
|
|
385
|
+
### Studio-gated calls on the free edition raise a modal that blocks LATER calls
|
|
386
|
+
|
|
387
|
+
- **Object:** `Resolve (all objects)`
|
|
388
|
+
- **Behavior:** Calling a Studio-only function from the free edition returns False, which the reference documents. What it does NOT document: Resolve also raises a modal upsell dialog ('You have reached a limitation with DaVinci Resolve'), and while that dialog is up, UNRELATED subsequent API calls fail too. Confirmed live on free 21.0.3.7 over the in-app bridge (2026-08-06): Timeline.CreateSubtitlesFromAudio and MediaPoolItem.TranscribeAudio each returned False and raised the dialog; Project.SaveProject then returned False on every attempt until a human clicked 'Not Yet', after which it succeeded. Nothing in any return value, and no error, names the dialog — an automated caller sees only a cascade of unexplained False returns and will misattribute them to whatever it called next.
|
|
389
|
+
- **Workaround / current handling:** Detect the edition BEFORE calling Studio-gated features rather than discovering the gate by tripping it: the product name is 'DaVinci Resolve' on free and 'DaVinci Resolve Studio' on Studio (resolve_control get_version reports it). If a Studio-only call has already returned False on a free build, treat every following failure as suspect: re-run a known-good read, and if that fails too, a modal is blocking and only a human can dismiss it — no API closes it. Known Studio-gated so far: subtitle generation from audio, and audio transcription.
|
|
390
|
+
- **Tags:** free-edition, studio-only, silent-failure, modal, ai, subtitle, transcription
|
|
391
|
+
|
|
392
|
+
### SetRenderSettings ExportSubtitle / SubtitleFormat had no observable effect
|
|
393
|
+
|
|
394
|
+
- **Object:** `Project (render settings)`
|
|
395
|
+
- **Behavior:** Queuing a render with {'ExportSubtitle': True, 'SubtitleFormat': 'BurnIn'} returned success from SetRenderSettings and rendered without error, but the output contained NO subtitles in any form: no burned-in pixels (every frame of the region carrying 7 subtitle items was fully black and byte-identical), no embedded subtitle stream (ffprobe saw only video/audio/data), and no sidecar file. Observed on Studio 19.1.3.7, 2026-08-06, on a timeline whose subtitle track held 7 generated caption items. NOT YET DISTINGUISHED: whether Resolve ignores these keys, or whether burn-in has an unmet precondition (a Deliver-page toggle, a subtitle track enabled for output, or a format that supports it). Both are consistent with what was seen, so this is recorded as an observation rather than asserted as a Resolve bug. Note the related confirmed trap: SetRenderSettings applies on top of whatever state the Deliver page holds (issue #123), so an inherited preset can override a key that was passed.
|
|
396
|
+
- **Workaround / current handling:** Do not trust a render's subtitle settings from the settings_success boolean. VERIFY the artifact: ffprobe the output for a subtitle stream, check for a sidecar file, or sample frames for burned-in pixels. If subtitles must be burned in, confirm the result before delivering.
|
|
397
|
+
- **Reference:** [issue #123](https://github.com/samuelgursky/davinci-resolve-mcp/issues/123)
|
|
398
|
+
- **Tags:** render, subtitle, silent-failure, unverified-cause, deliver
|
|
399
|
+
|
|
385
400
|
### hasattr() / getattr() on Resolve API objects (attribute fabrication)
|
|
386
401
|
|
|
387
402
|
- **Object:** `(all Resolve scripting objects)`
|
package/install.py
CHANGED
|
@@ -36,7 +36,7 @@ from src.utils.update_check import (
|
|
|
36
36
|
|
|
37
37
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
38
38
|
|
|
39
|
-
VERSION = "2.86.
|
|
39
|
+
VERSION = "2.86.3"
|
|
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.86.
|
|
88
|
+
VERSION = "2.86.3"
|
|
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
package/src/utils/api_truth.py
CHANGED
|
@@ -901,6 +901,68 @@ API_TRUTH: List[Dict[str, Any]] = [
|
|
|
901
901
|
"tags": ["missing-method", "audio", "fairlight", "ai", "auto-mix"],
|
|
902
902
|
"submit": "missing",
|
|
903
903
|
},
|
|
904
|
+
{
|
|
905
|
+
"symbol": "Studio-gated calls on the free edition raise a modal that blocks LATER calls",
|
|
906
|
+
"object": "Resolve (all objects)",
|
|
907
|
+
"reality": "Calling a Studio-only function from the free edition returns "
|
|
908
|
+
"False, which the reference documents. What it does NOT "
|
|
909
|
+
"document: Resolve also raises a modal upsell dialog ('You "
|
|
910
|
+
"have reached a limitation with DaVinci Resolve'), and while "
|
|
911
|
+
"that dialog is up, UNRELATED subsequent API calls fail too. "
|
|
912
|
+
"Confirmed live on free 21.0.3.7 over the in-app bridge "
|
|
913
|
+
"(2026-08-06): Timeline.CreateSubtitlesFromAudio and "
|
|
914
|
+
"MediaPoolItem.TranscribeAudio each returned False and raised "
|
|
915
|
+
"the dialog; Project.SaveProject then returned False on every "
|
|
916
|
+
"attempt until a human clicked 'Not Yet', after which it "
|
|
917
|
+
"succeeded. Nothing in any return value, and no error, names "
|
|
918
|
+
"the dialog — an automated caller sees only a cascade of "
|
|
919
|
+
"unexplained False returns and will misattribute them to "
|
|
920
|
+
"whatever it called next.",
|
|
921
|
+
"recommended": "Detect the edition BEFORE calling Studio-gated features "
|
|
922
|
+
"rather than discovering the gate by tripping it: the "
|
|
923
|
+
"product name is 'DaVinci Resolve' on free and 'DaVinci "
|
|
924
|
+
"Resolve Studio' on Studio (resolve_control get_version "
|
|
925
|
+
"reports it). If a Studio-only call has already returned "
|
|
926
|
+
"False on a free build, treat every following failure as "
|
|
927
|
+
"suspect: re-run a known-good read, and if that fails too, "
|
|
928
|
+
"a modal is blocking and only a human can dismiss it — no "
|
|
929
|
+
"API closes it. Known Studio-gated so far: subtitle "
|
|
930
|
+
"generation from audio, and audio transcription.",
|
|
931
|
+
"tags": ["free-edition", "studio-only", "silent-failure", "modal", "ai",
|
|
932
|
+
"subtitle", "transcription"],
|
|
933
|
+
"submit": "bug",
|
|
934
|
+
},
|
|
935
|
+
{
|
|
936
|
+
"symbol": "SetRenderSettings ExportSubtitle / SubtitleFormat had no observable effect",
|
|
937
|
+
"object": "Project (render settings)",
|
|
938
|
+
"reality": "Queuing a render with {'ExportSubtitle': True, "
|
|
939
|
+
"'SubtitleFormat': 'BurnIn'} returned success from "
|
|
940
|
+
"SetRenderSettings and rendered without error, but the output "
|
|
941
|
+
"contained NO subtitles in any form: no burned-in pixels (every "
|
|
942
|
+
"frame of the region carrying 7 subtitle items was fully black "
|
|
943
|
+
"and byte-identical), no embedded subtitle stream (ffprobe saw "
|
|
944
|
+
"only video/audio/data), and no sidecar file. Observed on "
|
|
945
|
+
"Studio 19.1.3.7, 2026-08-06, on a timeline whose subtitle "
|
|
946
|
+
"track held 7 generated caption items. "
|
|
947
|
+
"NOT YET DISTINGUISHED: whether Resolve ignores these keys, or "
|
|
948
|
+
"whether burn-in has an unmet precondition (a Deliver-page "
|
|
949
|
+
"toggle, a subtitle track enabled for output, or a format that "
|
|
950
|
+
"supports it). Both are consistent with what was seen, so this "
|
|
951
|
+
"is recorded as an observation rather than asserted as a "
|
|
952
|
+
"Resolve bug. Note the related confirmed trap: SetRenderSettings "
|
|
953
|
+
"applies on top of whatever state the Deliver page holds "
|
|
954
|
+
"(issue #123), so an inherited preset can override a key that "
|
|
955
|
+
"was passed.",
|
|
956
|
+
"recommended": "Do not trust a render's subtitle settings from the "
|
|
957
|
+
"settings_success boolean. VERIFY the artifact: ffprobe the "
|
|
958
|
+
"output for a subtitle stream, check for a sidecar file, or "
|
|
959
|
+
"sample frames for burned-in pixels. If subtitles must be "
|
|
960
|
+
"burned in, confirm the result before delivering.",
|
|
961
|
+
"tags": ["render", "subtitle", "silent-failure", "unverified-cause",
|
|
962
|
+
"deliver"],
|
|
963
|
+
"submit": "bug",
|
|
964
|
+
"issue": 123,
|
|
965
|
+
},
|
|
904
966
|
{
|
|
905
967
|
"symbol": "Proxy / optimized-media generation",
|
|
906
968
|
"object": "MediaPoolItem",
|