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 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.2
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
- [![Version](https://img.shields.io/badge/version-2.86.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.86.4-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-34%20(341%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-2.86.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.86.4-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-34%20(341%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
- > 本翻译对应 v2.86.2 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
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, 30 bugs / unreliable behaviors.
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.2"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.86.2",
3
+ "version": "2.86.4",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -85,7 +85,7 @@ if not logging.getLogger().handlers:
85
85
  handlers=[logging.StreamHandler()],
86
86
  )
87
87
 
88
- VERSION = "2.86.2"
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
@@ -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.86.2"
14
+ VERSION = "2.86.4"
15
15
 
16
16
  import base64
17
17
  import os
@@ -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",