davinci-resolve-mcp 2.26.1 → 2.27.1
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 +71 -0
- package/README.md +1 -1
- package/docs/SKILL.md +10 -0
- package/docs/guides/media-analysis-guide.md +27 -0
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/analysis_dashboard.py +507 -105
- package/src/granular/common.py +1 -1
- package/src/server.py +283 -1
- package/src/utils/analysis_caps.py +28 -19
- package/src/utils/media_analysis.py +229 -30
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,77 @@
|
|
|
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.27.1
|
|
6
|
+
|
|
7
|
+
**Faster control-panel startup with network source media (issue #50)** — on
|
|
8
|
+
first open the control panel could sit on "connection pending" for a long time
|
|
9
|
+
when Media Pool clips lived on mounted network storage, because the UI only
|
|
10
|
+
treated the connection as live once the full media inventory finished loading,
|
|
11
|
+
and that inventory probed every clip's file path on disk.
|
|
12
|
+
|
|
13
|
+
Fixes and performance work:
|
|
14
|
+
|
|
15
|
+
- **Connection state is decoupled from the media inventory.** The overview and
|
|
16
|
+
diagnostics panels now derive "connected" from the `/api/boot` handshake (which
|
|
17
|
+
returns as soon as the Resolve bridge is reachable) and show inventory loading
|
|
18
|
+
separately, so Resolve reads as live immediately while clips stream in.
|
|
19
|
+
- **Parallel, cached file-existence probing.** `os.path.exists` for every clip
|
|
20
|
+
now runs in a thread pool and is memoized for a short TTL, instead of two serial
|
|
21
|
+
`stat()` calls per clip — the dominant cost on network storage.
|
|
22
|
+
- **Background polls reuse the cached Media Pool walk.** The recurring poll no
|
|
23
|
+
longer re-runs the ~N serial `GetClipProperty` calls; it reuses the last walk
|
|
24
|
+
and re-applies only the local, disk-backed analysis-status overlay. A cheap
|
|
25
|
+
project-id check still catches a project switched directly in Resolve, and a
|
|
26
|
+
manual refresh always does a full walk.
|
|
27
|
+
- **Resolve scripting API access is serialized.** A re-entrant lock guards every
|
|
28
|
+
scripting-API entry point, since the dashboard's threaded HTTP server could
|
|
29
|
+
previously fire concurrent (thread-unsafe) Resolve calls at startup.
|
|
30
|
+
- **ETag/304 on the inventory endpoint** skips transfer and table re-render when
|
|
31
|
+
nothing changed; the last good inventory is cached client-side and painted
|
|
32
|
+
instantly on reload; and the first inventory build is warmed in a background
|
|
33
|
+
thread at server start.
|
|
34
|
+
|
|
35
|
+
No public MCP tool surface changed. Adds regression tests in
|
|
36
|
+
`tests/test_media_analysis.py` (path-existence probing, inventory cache reuse,
|
|
37
|
+
project-switch detection, lock reentrancy).
|
|
38
|
+
|
|
39
|
+
## What's New in v2.27.0
|
|
40
|
+
|
|
41
|
+
**Frame-sampling modes (issue #46)** — how many frames a clip gets for visual
|
|
42
|
+
analysis is now governed by a `sampling_mode`, decoupled from `depth` (which
|
|
43
|
+
still controls which layers run). A fixed frame count over-sampled short clips
|
|
44
|
+
and under-covered long ones; the demand-driven engine already scaled by
|
|
45
|
+
duration/content, but the caps layer was flat-truncating its output back to 8
|
|
46
|
+
frames — that flat cap was the real cause of long-clip under-coverage.
|
|
47
|
+
|
|
48
|
+
Four clearly-tiered modes, organized so token cost is predictable per tier:
|
|
49
|
+
|
|
50
|
+
- **Economy** (`fixed`) — flat N evenly-spaced, content-blind frames. Cheapest and
|
|
51
|
+
most predictable; good for proxies/triage.
|
|
52
|
+
- **Balanced** (`per_minute`) — `clamp(minutes × frames_per_minute, floor, ceiling)`
|
|
53
|
+
(defaults 4/min, 3–80). Cost is linear in footage length; content-blind.
|
|
54
|
+
- **Thorough** (`adaptive_capped`, recommended/default) — content-aware: samples
|
|
55
|
+
shot boundaries, representatives, and flash candidates, bounded to `[floor,
|
|
56
|
+
ceiling]`. Best coverage with a bounded cost.
|
|
57
|
+
- **Thorough (uncapped)** (`adaptive`) — content-aware with no per-clip ceiling
|
|
58
|
+
(up to the 512-frame hard cap). Use only when clips are short or few.
|
|
59
|
+
|
|
60
|
+
The first time you analyze without a saved default, the tool returns a
|
|
61
|
+
`confirmation_required` response with a `sampling_mode_prompt`; choosing a mode
|
|
62
|
+
saves it as your standing default (mirrors `timed_markers_default`). Pass
|
|
63
|
+
`sampling_mode` per call any time for a one-off that doesn't change the default.
|
|
64
|
+
Tunables (`frames_per_minute`, `frame_floor`, `frame_ceiling`) and the mode are
|
|
65
|
+
all exposed in the control panel (Preferences → Frame sampling mode) with a live
|
|
66
|
+
per-clip token-cost estimate; batch jobs honor the saved default.
|
|
67
|
+
|
|
68
|
+
Analysis-caps presets were retuned so `frames_per_clip` is now a *safety ceiling*
|
|
69
|
+
(minimal/standard/generous = 12/80/200), not the primary frame dial, and the
|
|
70
|
+
per-clip/job/day vision-token caps were raised so the default Thorough mode isn't
|
|
71
|
+
refused by the per-clip token cap. Cache reuse re-samples only when switching up
|
|
72
|
+
the thoroughness rank; a richer prior report still satisfies a cheaper mode. Adds
|
|
73
|
+
`tests/test_sampling_modes.py` (30 tests). Validated end-to-end on a synthetic
|
|
74
|
+
multi-shot clip with real ffmpeg frame extraction.
|
|
75
|
+
|
|
5
76
|
## What's New in v2.26.1
|
|
6
77
|
|
|
7
78
|
**Python 3.13 / 3.14 support (issue #45)** — `npx davinci-resolve-mcp setup`
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DaVinci Resolve MCP Server
|
|
2
2
|
|
|
3
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
4
4
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
5
5
|
[](docs/reference/api-coverage.md)
|
|
6
6
|
[-blue.svg)](#server-modes)
|
package/docs/SKILL.md
CHANGED
|
@@ -468,6 +468,16 @@ for existing reports. `quick` uses ffprobe metadata; `standard` adds ffmpeg
|
|
|
468
468
|
read-through checks,
|
|
469
469
|
cut-boundary analysis from full-stream scene detection, flash-frame candidates,
|
|
470
470
|
motion/variance scoring, analysis keyframes, and sidecar reports.
|
|
471
|
+
`depth` controls which layers run; a separate `sampling_mode` controls how many
|
|
472
|
+
frames each clip gets for visual analysis (and thus token cost): `fixed`
|
|
473
|
+
(Economy, flat content-blind frames), `per_minute` (Balanced, frames scale with
|
|
474
|
+
duration), `adaptive_capped` (Thorough, content-aware bounded to
|
|
475
|
+
`[frame_floor, frame_ceiling]` — recommended/default), or `adaptive` (Thorough
|
|
476
|
+
uncapped). When no default is saved, the first analyze returns
|
|
477
|
+
`confirmation_required` with a `sampling_mode_prompt`; choosing a mode saves it
|
|
478
|
+
as the default. Pass `sampling_mode` per call for a one-off. The mode owns frame
|
|
479
|
+
count — `analysis_caps.frames_per_clip` is a safety ceiling above it, not the
|
|
480
|
+
primary dial.
|
|
471
481
|
By default, planning checks the active project's analysis root and bounded
|
|
472
482
|
related project-version roots for existing reports, then marks matching clips
|
|
473
483
|
`skip_execution=true` when those reports already contain the requested
|
|
@@ -93,6 +93,33 @@ FFprobe is required. If missing:
|
|
|
93
93
|
via host_chat_paths (finalized per clip with commit_vision, ~2-5 minutes per
|
|
94
94
|
file plus host-chat read time)
|
|
95
95
|
|
|
96
|
+
`depth` controls *which layers run*. How many frames each clip gets for visual
|
|
97
|
+
analysis is a separate axis — the **sampling mode** — because a fixed frame count
|
|
98
|
+
over-samples short clips and under-covers long ones.
|
|
99
|
+
|
|
100
|
+
### 3b. Frame-sampling mode
|
|
101
|
+
|
|
102
|
+
Pass `sampling_mode` on any analyze action, or set a standing default in the
|
|
103
|
+
control panel (Preferences → Frame sampling mode). The mode owns frame count and
|
|
104
|
+
thus token cost; `analysis_caps.frames_per_clip` is now a safety ceiling above it,
|
|
105
|
+
not the primary dial.
|
|
106
|
+
|
|
107
|
+
- **Economy** (`fixed`) — flat N frames (depth-derived, default 8) regardless of
|
|
108
|
+
clip length. Cheapest and most predictable; good for proxies/triage.
|
|
109
|
+
- **Balanced** (`per_minute`) — `frames = clamp(minutes × frames_per_minute, floor,
|
|
110
|
+
ceiling)` (defaults 4/min, 3–80). Cost is linear in footage length; content-blind.
|
|
111
|
+
- **Thorough** (`adaptive_capped`, **recommended**) — content-aware: samples shot
|
|
112
|
+
boundaries, representatives, and flash candidates, bounded to `[floor, ceiling]`
|
|
113
|
+
(3–80). Best coverage with a bounded cost.
|
|
114
|
+
- **Thorough (uncapped)** (`adaptive`) — content-aware with no per-clip ceiling
|
|
115
|
+
(up to the absolute 512-frame hard cap). Use only when clips are short or few.
|
|
116
|
+
|
|
117
|
+
Tunables (`frames_per_minute`, `frame_floor`, `frame_ceiling`) apply to Balanced
|
|
118
|
+
and Thorough. The first time you analyze without a saved default, the tool returns
|
|
119
|
+
a `confirmation_required` response with a `sampling_mode_prompt`; re-run with
|
|
120
|
+
`sampling_mode=<choice>` (which saves it as your default) or pick it in the panel.
|
|
121
|
+
Pass `sampling_mode` explicitly any time for a one-off that doesn't change the default.
|
|
122
|
+
|
|
96
123
|
---
|
|
97
124
|
|
|
98
125
|
## Analysis Commands
|
package/install.py
CHANGED
|
@@ -35,7 +35,7 @@ from src.utils.update_check import (
|
|
|
35
35
|
|
|
36
36
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
37
37
|
|
|
38
|
-
VERSION = "2.
|
|
38
|
+
VERSION = "2.27.1"
|
|
39
39
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
40
40
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
41
41
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|