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 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
- [![Version](https://img.shields.io/badge/version-2.86.1-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.1-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.1 版 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
 
@@ -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`,直接对系统 Python 列出脚本(Linux 上不需要 framework Python),并能端到端正常服务。现在没有任何平台停留在假设上:macOS 为本项目直接验证,Windows 和 Linux 来自用户报告。
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, 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.1"
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.1",
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.1"
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.1"
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",