davinci-resolve-mcp 2.86.2 → 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 CHANGED
@@ -2,7 +2,7 @@
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.3
6
6
 
7
7
  A Simplified Chinese phrasing fix from the reviewer who asked for it when #122
8
8
  merged. No behavior changed.
@@ -18,6 +18,31 @@ merged. No behavior changed.
18
18
  itself is unchanged: the issue #129 Fedora 43 report still stands behind it.
19
19
  Thanks to @chenyuxiaojin (PR #134).
20
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
+
21
46
  ## What's New in v2.86.1
22
47
 
23
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
- [![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.3-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.3-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.3 版 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.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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.86.2",
3
+ "version": "2.86.3",
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.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
@@ -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.3"
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",