davinci-resolve-mcp 2.86.2 → 2.86.4
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 +58 -1
- package/README.md +1 -1
- package/README.zh-CN.md +2 -2
- 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,7 +2,39 @@
|
|
|
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.
|
|
5
|
+
## What's New in v2.86.4
|
|
6
|
+
|
|
7
|
+
The issue #132 follow-up, which turned out not to be a tool bug at all. No
|
|
8
|
+
behavior changed in any tool.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **The skills told an assistant to "route the user to the UI" and stopped
|
|
13
|
+
there, so it invented the directions.** In issue #132 a user was sent hunting
|
|
14
|
+
for a retime dropdown "in the lower left of the clip"; the keyframe tray was
|
|
15
|
+
never mentioned. That direction exists nowhere in this repo — no skill, doc,
|
|
16
|
+
or ledger entry describes where any Resolve control sits. The assistant
|
|
17
|
+
improvised the handoff and delivered it in the same confident register as the
|
|
18
|
+
API facts around it, which had been measured, so the user had no way to tell
|
|
19
|
+
the two apart. `resolve-edit` now carries the rule: **never improvise UI
|
|
20
|
+
geography.** Name the operation, say you cannot see the user's screen, and
|
|
21
|
+
treat a UI pointer already written into a skill (the playback-frame-rate path
|
|
22
|
+
in `resolve-rough-cut`) as the only kind to quote — verbatim, never extended
|
|
23
|
+
from memory. Where no pointer exists, point at Blackmagic's manual for their
|
|
24
|
+
build rather than supplying one. `resolve-rough-cut` picks up the same guard
|
|
25
|
+
at its own UI handoff.
|
|
26
|
+
|
|
27
|
+
Deliberately **not** fixed by adding the correct location. This repo verifies
|
|
28
|
+
API behavior and has no mechanism to version-guard a UI claim — every
|
|
29
|
+
`api_truth` entry is stamped with the build it was measured on because
|
|
30
|
+
unstamped claims rot, and UI geography moves between builds, pages and
|
|
31
|
+
layouts with no drift guard that would catch it going stale. The reporter hit
|
|
32
|
+
this on Resolve 21; the validation machine here is Studio 19.1.3.7, so
|
|
33
|
+
confirming a location here and publishing it for 21 would be the exact move
|
|
34
|
+
v2.82.1 exists to correct. Thanks to @magwa101 for coming back with the
|
|
35
|
+
detail that relocated the bug.
|
|
36
|
+
|
|
37
|
+
## What's New in v2.86.3
|
|
6
38
|
|
|
7
39
|
A Simplified Chinese phrasing fix from the reviewer who asked for it when #122
|
|
8
40
|
merged. No behavior changed.
|
|
@@ -18,6 +50,31 @@ merged. No behavior changed.
|
|
|
18
50
|
itself is unchanged: the issue #129 Fedora 43 report still stands behind it.
|
|
19
51
|
Thanks to @chenyuxiaojin (PR #134).
|
|
20
52
|
|
|
53
|
+
## What's New in v2.86.2
|
|
54
|
+
|
|
55
|
+
Two free-edition/render limitations found while trying to photograph a styled
|
|
56
|
+
caption, both of the "returns success, does nothing" shape.
|
|
57
|
+
|
|
58
|
+
### Documented
|
|
59
|
+
|
|
60
|
+
- **Studio-gated calls on the free edition raise a modal that blocks LATER
|
|
61
|
+
calls.** The reference documents that a Studio-only function returns `False` on
|
|
62
|
+
the free edition. It does not mention that Resolve also throws a modal upsell
|
|
63
|
+
dialog, and that while it is up, *unrelated* API calls fail too. Confirmed on
|
|
64
|
+
free 21.0.3.7 over the bridge: `CreateSubtitlesFromAudio` and `TranscribeAudio`
|
|
65
|
+
each returned `False` and raised the dialog, after which `SaveProject` returned
|
|
66
|
+
`False` on every attempt until a human dismissed it. Nothing in any return
|
|
67
|
+
value names the dialog, so an automated caller sees a cascade of unexplained
|
|
68
|
+
failures and blames whatever it called next. Detect the edition first rather
|
|
69
|
+
than discovering the gate by tripping it.
|
|
70
|
+
|
|
71
|
+
- **A render with `ExportSubtitle` / `SubtitleFormat: BurnIn` produced no
|
|
72
|
+
subtitles at all** — no burned-in pixels, no embedded stream, no sidecar —
|
|
73
|
+
despite `SetRenderSettings` reporting success. Recorded as an observation, not
|
|
74
|
+
asserted as a Resolve bug: an unmet precondition (a Deliver-page toggle, output
|
|
75
|
+
enablement) is equally consistent with what was seen. Either way the guidance
|
|
76
|
+
holds — verify the artifact, never the boolean.
|
|
77
|
+
|
|
21
78
|
## What's New in v2.86.1
|
|
22
79
|
|
|
23
80
|
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.4 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
|
|
16
16
|
|
|
17
17
|
一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
|
|
18
18
|
|
|
@@ -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.4"
|
|
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.4"
|
|
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",
|