davinci-resolve-mcp 2.93.1 → 2.93.2

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,46 @@
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.93.2
6
+
7
+ Documentation and ledger correction, validated live against DaVinci Resolve
8
+ Studio **21.0.4.5** (version read from the running instance, not assumed).
9
+
10
+ - **A false "verified live" workaround for issue #74 is withdrawn, and the real
11
+ mechanism is documented.** `resolve-advanced/vendor/drp-format/README.md`
12
+ claimed that locking the video tracks below your target redirects
13
+ `InsertFusionTitleIntoTimeline` to that track, and called it verified live. It
14
+ shipped with no test, log, or evidence file, and it contradicted the
15
+ `api_truth` ledger entry written twelve days earlier from an explicit test
16
+ matrix. A third party independently reproduced the ledger's version on
17
+ 21.0.4.5, so the two claims were re-measured on one rig, one fresh
18
+ 3-video-track timeline per arm so no insert could fail on a collision:
19
+
20
+ | Arm | Setup | `InsertFusionTitleIntoTimeline("Text+")` |
21
+ |---|---|---|
22
+ | A | nothing locked | lands on **V1** |
23
+ | B | V1 locked via `Timeline.SetTrackLock` | returns **`None`** |
24
+ | C | V1 locked by **clicking the padlock in the UI** | returns **`None`** |
25
+ | D | nothing locked, source patch dragged to V2 in the UI | lands on **V2** |
26
+
27
+ B and C are identical, which kills the standing theory that a GUI lock
28
+ advances the selector where the API lock does not. Locking blocks the target;
29
+ it never re-targets. The README claim is withdrawn as false and the ledger
30
+ entry — previously measured on 21.0.0 — is confirmed on the newest build.
31
+
32
+ - **The destination is the patch panel, not the lock state.** Arm D is the
33
+ finding: dragging the source patch badge onto V2 in the Edit page sends the
34
+ next insert to V2. The per-track badge column in the track header is the
35
+ auto-track-selector toggle; the source patch badge appears only on the patched
36
+ track, and dragging that is what re-targets. The capability exists in the
37
+ application and is reachable only by GUI automation — so the request to
38
+ Blackmagic is read/write access to the patch panel, which is smaller and
39
+ better defined than adding `trackIndex` to all six `Insert*IntoTimeline`
40
+ methods. The route is unverifiable from the API side (nothing in the scripting
41
+ surface confirms where the selector landed), so read the landing track back
42
+ with `TimelineItem.GetTrackTypeAndIndex()` and treat a wrong track as a
43
+ failure. Offline, `drp place_fusion_title` remains deterministic.
44
+
5
45
  ## What's New in v2.93.1
6
46
 
7
47
  Documentation only; no behavior changed and no Resolve validation required.
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.93.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.93.2-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(353%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.93.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.93.2-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(353%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.93.1 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
15
+ > 本翻译对应 v2.93.2 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
16
16
 
17
17
  一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
18
18
 
@@ -66,8 +66,8 @@ equivalent, blocking full automation.
66
66
  ### Source Track Selector / destination track for Insert*IntoTimeline
67
67
 
68
68
  - **Object:** `Timeline`
69
- - **Behavior:** There is no API to read or set the Source/Auto Track Selector (the Edit-page patch panel that picks the destination track). InsertTitleIntoTimeline, InsertFusionTitleIntoTimeline, InsertGeneratorIntoTimeline, InsertFusionGeneratorIntoTimeline, InsertOFXGeneratorIntoTimeline and InsertFusionCompositionIntoTimeline take no trackIndex and always drop the clip on the selector's current target (V1 in practice). Locking lower video tracks does NOT redirect the insert — verified live on 21.0.0: locking V1 makes the insert FAIL rather than land on V2. Titles/generators also can't be moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo and MoveClips don't apply).
70
- - **Workaround / current handling:** Accept the limitation for titles/generators (insert lands on V1). For clips that DO have a MediaPoolItem, target a track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' instead (exposed as media_pool append_to_timeline clip_infos). See issue #74.
69
+ - **Behavior:** There is no API to read or set the Source/Auto Track Selector (the Edit-page patch panel that picks the destination track). InsertTitleIntoTimeline, InsertFusionTitleIntoTimeline, InsertGeneratorIntoTimeline, InsertFusionGeneratorIntoTimeline, InsertOFXGeneratorIntoTimeline and InsertFusionCompositionIntoTimeline take no trackIndex and always drop the clip on the selector's current target (V1 in practice). Locking lower video tracks does NOT redirect the insert — verified live on 21.0.0: locking V1 makes the insert FAIL rather than land on V2. Titles/generators also can't be moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo and MoveClips don't apply). RE-MEASURED on Studio 21.0.4.5 (2026-08-12, version read live), one fresh 3-video-track timeline per arm so no insert could fail on a collision: nothing locked -> lands V1; V1 locked via SetTrackLock -> returns None; V1 locked by CLICKING THE PADLOCK IN THE UI -> returns None, IDENTICAL to the API lock. That kills the recurring theory that the GUI lock advances the selector where the API lock does not — it does not, and a revision of resolve-advanced/vendor/drp-format/README.md that claimed otherwise as 'verified live' has been withdrawn as false. WHAT DOES WORK, and it is the whole mechanism: dragging the SOURCE PATCH badge onto V2 in the Edit-page patch panel sends the next insert to V2 (measured, same rig, nothing locked). The destination is the patch panel, never the lock state. In the track header the per-track badge column is the auto-track-selector toggle, while the source patch badge appears only on the patched track and dragging THAT is what re-targets. So the capability exists in the application and is reachable only by GUI automation; exposing read/write on the patch panel is a smaller, better-defined API request than adding trackIndex to all six Insert*IntoTimeline methods.
70
+ - **Workaround / current handling:** Accept the limitation for titles/generators (insert lands on V1). For clips that DO have a MediaPoolItem, target a track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' instead (exposed as media_pool append_to_timeline clip_infos). Do NOT reach for track locking as a bypass in either form — it blocks the insert rather than re-targeting it. If a title genuinely must land on a chosen track of the OPEN timeline, the only route is GUI automation of the patch panel, and it is unverifiable from the API side: nothing in the scripting surface can confirm the selector went where you dragged it, so read the landing track back with TimelineItem.GetTrackTypeAndIndex() and treat a wrong track as a failure. For anything that can be built offline, place titles by track and frame with the advanced server's drp place_fusion_title instead. See issue #74.
71
71
  - **Reference:** [issue #74](https://github.com/samuelgursky/davinci-resolve-mcp/issues/74)
72
72
  - **Tags:** missing-method, timeline, title, generator, track
73
73
 
package/install.py CHANGED
@@ -36,7 +36,7 @@ from src.utils.update_check import (
36
36
 
37
37
  # ─── Version ──────────────────────────────────────────────────────────────────
38
38
 
39
- VERSION = "2.93.1"
39
+ VERSION = "2.93.2"
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.93.1",
3
+ "version": "2.93.2",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -87,10 +87,38 @@ Plus the full **DRX grade** surface (`createSimpleGrade`, curves/qualifiers/wind
87
87
  ## Live-edit recipe (the one thing that needs Resolve running)
88
88
 
89
89
  **#74 — insert a Text+/generator on a chosen track of the OPEN timeline.** The API's
90
- `InsertFusionTitleIntoTimeline` takes no track arg (always the lowest unlocked video track). Bypass:
91
- via computer-use, **lock the video tracks below your target**, then call `timeline.insert_fusion_title` —
92
- it lands on the chosen track. Verified live. (For export-based workflows, `place_fusion_title` does this
93
- offline.)
90
+ `InsertFusionTitleIntoTimeline` takes no track arg; the insert lands on the Source/Auto Track
91
+ Selector's current target (V1 in practice), which no API can read or set.
92
+
93
+ > **Track locking does not redirect the insert — through the API *or* the UI.** An earlier
94
+ > revision of this README claimed that locking the tracks below your target via computer-use
95
+ > redirects the insert, and called it verified live. That claim shipped with no test or evidence
96
+ > and is **withdrawn as false.** Measured 2026-08-12 on **Studio 21.0.4.5** (version read live,
97
+ > not assumed), one fresh 3-video-track timeline per arm so no insert could fail on a collision:
98
+ >
99
+ > | Arm | Setup | `InsertFusionTitleIntoTimeline("Text+")` |
100
+ > |---|---|---|
101
+ > | A | nothing locked | lands on **V1** |
102
+ > | B | V1 locked via `Timeline.SetTrackLock` | returns **None**, nothing placed |
103
+ > | C | V1 locked by **clicking the padlock in the UI** | returns **None**, nothing placed |
104
+ > | D | nothing locked, source patch dragged to V2 in the UI | lands on **V2** |
105
+ >
106
+ > B and C are identical, so the GUI-lock hypothesis is dead: locking blocks the target, it never
107
+ > re-targets. This also reproduces issue #74 (measured on 21.0.0) on the newest build.
108
+ >
109
+ > **D is the real control.** The destination is the Edit-page patch panel, not the lock state.
110
+ > Dragging the source patch onto V2 sends the insert to V2. In the header, the x-column of
111
+ > per-track badges is the auto-track-selector toggle; the source patch badge appears only on the
112
+ > patched track, and dragging it is what re-targets. The API can neither read nor set any of it —
113
+ > which is exactly the gap to put in front of Blackmagic, and a far smaller ask than new
114
+ > parameters on all six `Insert*IntoTimeline` methods.
115
+ >
116
+ > So a live-edit recipe does exist, but it is **GUI automation of the patch panel**, not track
117
+ > locking. Treat it as such: it is not verifiable from the API side, since nothing in the
118
+ > scripting surface can confirm the selector landed where you dragged it.
119
+
120
+ For export-based workflows, `place_fusion_title` places a title on any track at an exact frame
121
+ offline, with no selector involved.
94
122
 
95
123
  ---
96
124
 
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
87
87
  handlers=[logging.StreamHandler()],
88
88
  )
89
89
 
90
- VERSION = "2.93.1"
90
+ VERSION = "2.93.2"
91
91
  logger = logging.getLogger("davinci-resolve-mcp")
92
92
  logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
93
93
  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 353-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.93.1"
14
+ VERSION = "2.93.2"
15
15
 
16
16
  import base64
17
17
  import os
@@ -560,12 +560,42 @@ API_TRUTH: List[Dict[str, Any]] = [
560
560
  "insert — verified live on 21.0.0: locking V1 makes the insert "
561
561
  "FAIL rather than land on V2. Titles/generators also can't be "
562
562
  "moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo "
563
- "and MoveClips don't apply).",
563
+ "and MoveClips don't apply). RE-MEASURED on Studio 21.0.4.5 "
564
+ "(2026-08-12, version read live), one fresh 3-video-track "
565
+ "timeline per arm so no insert could fail on a collision: "
566
+ "nothing locked -> lands V1; V1 locked via SetTrackLock -> "
567
+ "returns None; V1 locked by CLICKING THE PADLOCK IN THE UI -> "
568
+ "returns None, IDENTICAL to the API lock. That kills the "
569
+ "recurring theory that the GUI lock advances the selector where "
570
+ "the API lock does not — it does not, and a revision of "
571
+ "resolve-advanced/vendor/drp-format/README.md that claimed "
572
+ "otherwise as 'verified live' has been withdrawn as false. "
573
+ "WHAT DOES WORK, and it is the whole mechanism: dragging the "
574
+ "SOURCE PATCH badge onto V2 in the Edit-page patch panel sends "
575
+ "the next insert to V2 (measured, same rig, nothing locked). The "
576
+ "destination is the patch panel, never the lock state. In the "
577
+ "track header the per-track badge column is the auto-track-selector "
578
+ "toggle, while the source patch badge appears only on the patched "
579
+ "track and dragging THAT is what re-targets. So the capability "
580
+ "exists in the application and is reachable only by GUI "
581
+ "automation; exposing read/write on the patch panel is a smaller, "
582
+ "better-defined API request than adding trackIndex to all six "
583
+ "Insert*IntoTimeline methods.",
564
584
  "recommended": "Accept the limitation for titles/generators (insert lands "
565
585
  "on V1). For clips that DO have a MediaPoolItem, target a "
566
586
  "track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' "
567
587
  "instead (exposed as media_pool append_to_timeline clip_infos). "
568
- "See issue #74.",
588
+ "Do NOT reach for track locking as a bypass in either form — "
589
+ "it blocks the insert rather than re-targeting it. If a title "
590
+ "genuinely must land on a chosen track of the OPEN timeline, "
591
+ "the only route is GUI automation of the patch panel, and it "
592
+ "is unverifiable from the API side: nothing in the scripting "
593
+ "surface can confirm the selector went where you dragged it, "
594
+ "so read the landing track back with "
595
+ "TimelineItem.GetTrackTypeAndIndex() and treat a wrong track "
596
+ "as a failure. For anything that can be built offline, place "
597
+ "titles by track and frame with the advanced server's "
598
+ "drp place_fusion_title instead. See issue #74.",
569
599
  "tags": ["missing-method", "timeline", "title", "generator", "track"],
570
600
  "submit": "missing",
571
601
  "issue": 74,
@@ -471,33 +471,35 @@ DELIVERY_TARGETS: Dict[str, DeliveryTarget] = {
471
471
  # ── Mastering: DNxHR family ─────────────────────────────────────────────
472
472
  "dnxhr_lb_master": _dnxhr(
473
473
  "dnxhr_lb_master", "LB",
474
- ("DNxHR LB", "DNxHR_LB"),
474
+ ("DNxHRLB", "Avid DNxHR LB 12-bit", "DNxHR LB"),
475
475
  "Low-bandwidth DNxHR. Offline/review, not finishing.",
476
476
  ),
477
477
  "dnxhr_sq_master": _dnxhr(
478
478
  "dnxhr_sq_master", "SQ",
479
- ("DNxHR SQ", "DNxHR_SQ"),
479
+ ("DNxHRSQ", "Avid DNxHR SQ 12-bit", "DNxHR SQ"),
480
480
  "Standard-quality DNxHR. Avid-family review and distribution.",
481
481
  ),
482
482
  "dnxhr_hq_master": _dnxhr(
483
483
  "dnxhr_hq_master", "HQ",
484
- ("DNxHR HQ", "DNxHR_HQ"),
484
+ ("DNxHRHQ", "Avid DNxHR HQ 12-bit", "DNxHR HQ"),
485
485
  "High-quality 8-bit DNxHR. Common Avid mezzanine.",
486
486
  ),
487
- # Live matrix carries a bit depth in the label plain "DNxHR HQX" does not exist.
487
+ # Codec IDS proved stable across 19.1.3.7 -> 21.0.4.5 while DESCRIPTIONS did not:
488
+ # every DNx description gained an "Avid " prefix in 21.x, and plain "DNxHR HQX"
489
+ # never existed. So the id leads each candidate list and descriptions follow.
488
490
  "dnxhr_hqx_master": _dnxhr(
489
491
  "dnxhr_hqx_master", "HQX 10-bit",
490
- ("DNxHR HQX 10-bit", "DNxHRHQX_10", "DNxHR HQX 12-bit", "DNxHRHQX_12", "DNxHR HQX"),
492
+ ("DNxHRHQX_10", "Avid DNxHR HQX 10-bit", "DNxHR HQX 10-bit", "DNxHRHQX_12", "DNxHR HQX"),
491
493
  "10-bit DNxHR. The DNx tier to use for finishing and HDR.",
492
494
  ),
493
495
  "dnxhr_444_master": _dnxhr(
494
496
  "dnxhr_444_master", "444 12-bit",
495
- ("DNxHR 444 12-bit", "DNxHR444_12", "DNxHR 444 10-bit", "DNxHR444_10", "DNxHR 444"),
497
+ ("DNxHR444_12", "Avid DNxHR 444 12-bit", "DNxHR 444 12-bit", "DNxHR444_10", "DNxHR 444"),
496
498
  "4:4:4 12-bit DNxHR. Highest DNx tier for finishing.",
497
499
  ),
498
500
  "dnxhd_1080p220_10_master": _dnxhr(
499
501
  "dnxhd_1080p220_10_master", "HD 1080p 220 10-bit",
500
- ("DNxHD 1080p 220/185/175 10-bit", "DNxHD1080p220_10"),
502
+ ("DNxHD1080p220_10", "Avid DNxHD 1080p 220/185/175 10-bit", "DNxHD 1080p 220/185/175 10-bit"),
501
503
  "HD-era 10-bit DNxHD for Avid finishing at 1920x1080.",
502
504
  width=1920,
503
505
  height=1080,
@@ -561,7 +563,7 @@ DELIVERY_TARGETS: Dict[str, DeliveryTarget] = {
561
563
  describe="Avid-native handoff: MXF OP-Atom essence, DNxHR HQ.",
562
564
  tier="broadcast",
563
565
  format_candidates=("MXF OP-Atom", "MXF_OP_Atom", "mxf_op_atom"),
564
- codec_candidates=("DNxHR HQ", "DNxHR_HQ"),
566
+ codec_candidates=("DNxHRHQ", "Avid DNxHR HQ 12-bit", "DNxHR HQ"),
565
567
  qc_container="mxf",
566
568
  qc_codec="dnxhd",
567
569
  audio_channels=2,