davinci-resolve-mcp 2.23.0
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/AGENTS.md +85 -0
- package/CHANGELOG.md +802 -0
- package/CLAUDE.md +15 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/SECURITY.md +53 -0
- package/bin/davinci-resolve-mcp.mjs +376 -0
- package/docs/README.md +56 -0
- package/docs/SKILL.md +1145 -0
- package/docs/authoring/fuse-dctl-authoring.md +242 -0
- package/docs/authoring/script-plugin-authoring.md +195 -0
- package/docs/contributing.md +82 -0
- package/docs/guides/color-decision-guide.md +387 -0
- package/docs/guides/editorial-decision-guide.md +136 -0
- package/docs/guides/media-analysis-guide.md +615 -0
- package/docs/guides/multicam-setup-guide.md +138 -0
- package/docs/install.md +198 -0
- package/docs/integrations/workflow-integrations.md +120 -0
- package/docs/kernels/README.md +28 -0
- package/docs/kernels/audio-fairlight-kernel.md +86 -0
- package/docs/kernels/color-grade-kernel.md +103 -0
- package/docs/kernels/extension-authoring-kernel.md +101 -0
- package/docs/kernels/fusion-composition-kernel.md +91 -0
- package/docs/kernels/media-pool-ingest-kernel.md +147 -0
- package/docs/kernels/project-lifecycle-kernel.md +120 -0
- package/docs/kernels/render-deliver-kernel.md +92 -0
- package/docs/kernels/review-annotation-kernel.md +110 -0
- package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
- package/docs/kernels/timeline-edit-kernel.md +189 -0
- package/docs/notes/codec-plugin-notes.md +136 -0
- package/docs/notes/dctl-notes.md +234 -0
- package/docs/notes/fusion-template-notes.md +136 -0
- package/docs/notes/lut-notes.md +136 -0
- package/docs/notes/openfx-notes.md +120 -0
- package/docs/process/release-process.md +152 -0
- package/docs/reference/api-coverage.md +488 -0
- package/docs/reference/resolve_scripting_api.txt +1012 -0
- package/examples/README.md +53 -0
- package/examples/markers/README.md +81 -0
- package/examples/media/README.md +94 -0
- package/examples/timeline/README.md +98 -0
- package/install.py +1196 -0
- package/package.json +52 -0
- package/scripts/audit_api_parity.py +275 -0
- package/scripts/live_media_analysis_polish_probe.py +65 -0
- package/src/__init__.py +3 -0
- package/src/analysis_dashboard.py +4936 -0
- package/src/control_panel.py +13 -0
- package/src/granular/__init__.py +17 -0
- package/src/granular/common.py +727 -0
- package/src/granular/folder.py +287 -0
- package/src/granular/gallery.py +306 -0
- package/src/granular/graph.py +309 -0
- package/src/granular/media_pool.py +679 -0
- package/src/granular/media_pool_item.py +852 -0
- package/src/granular/media_storage.py +179 -0
- package/src/granular/project.py +1594 -0
- package/src/granular/resolve_control.py +521 -0
- package/src/granular/timeline.py +1074 -0
- package/src/granular/timeline_item.py +2251 -0
- package/src/resolve_mcp_server.py +43 -0
- package/src/server.py +15691 -0
- package/src/utils/__init__.py +3 -0
- package/src/utils/app_control.py +319 -0
- package/src/utils/audio_fairlight_live_probe.py +263 -0
- package/src/utils/cdl.py +20 -0
- package/src/utils/cloud_operations.py +192 -0
- package/src/utils/color_grade_live_probe.py +444 -0
- package/src/utils/dctl_templates.py +368 -0
- package/src/utils/extension_authoring_live_probe.py +292 -0
- package/src/utils/fuse_templates.py +1968 -0
- package/src/utils/fusion_composition_live_probe.py +284 -0
- package/src/utils/layout_presets.py +333 -0
- package/src/utils/mcp_stdio.py +32 -0
- package/src/utils/media_analysis.py +3618 -0
- package/src/utils/media_analysis_jobs.py +796 -0
- package/src/utils/media_pool_ingest_live_probe.py +592 -0
- package/src/utils/multicam.py +393 -0
- package/src/utils/object_inspection.py +287 -0
- package/src/utils/platform.py +157 -0
- package/src/utils/project_lifecycle_live_probe.py +376 -0
- package/src/utils/project_properties.py +601 -0
- package/src/utils/render_deliver_live_probe.py +384 -0
- package/src/utils/resolve_connection.py +77 -0
- package/src/utils/review_annotation_live_probe.py +352 -0
- package/src/utils/script_templates.py +1193 -0
- package/src/utils/sync_detection.py +887 -0
- package/src/utils/timeline_conform_live_probe.py +280 -0
- package/src/utils/timeline_kernel_live_probe.py +1091 -0
- package/src/utils/timeline_kernel_probe.py +185 -0
- package/src/utils/timeline_title_text.py +87 -0
- package/src/utils/update_check.py +610 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Multicam Setup Helper Guide
|
|
2
|
+
|
|
3
|
+
The multicam setup helper prepares source-safe Resolve timelines for multicam
|
|
4
|
+
workflows. It is a workflow helper, not a native multicam API wrapper: DaVinci
|
|
5
|
+
Resolve's public scripting API does not expose creating native multicam clips,
|
|
6
|
+
switching multicam angles, or flattening multicam edits.
|
|
7
|
+
|
|
8
|
+
The current Resolve UI workflow is documented in the installed DaVinci Resolve
|
|
9
|
+
20 Manual, Edit > Chapter 42, "Multicam Editing." In Resolve, native multicam
|
|
10
|
+
creation and "Convert Compound Clips (Timelines) to Multicam Clips" are Media
|
|
11
|
+
Pool context-menu operations.
|
|
12
|
+
|
|
13
|
+
## What The Helper Does
|
|
14
|
+
|
|
15
|
+
`media_pool(action="setup_multicam_timeline")` creates a new prep timeline that
|
|
16
|
+
references existing Media Pool clips:
|
|
17
|
+
|
|
18
|
+
- One camera angle per video track.
|
|
19
|
+
- Optional matching audio tracks.
|
|
20
|
+
- Track names from angle names or clip names.
|
|
21
|
+
- Exact `AppendToTimeline([{clipInfo}])` placement with source ranges and
|
|
22
|
+
record frames.
|
|
23
|
+
- Dry-run planning before touching Resolve project state.
|
|
24
|
+
|
|
25
|
+
The helper never modifies, transcodes, proxies, renders, relinks, replaces, or
|
|
26
|
+
creates derivatives of source media.
|
|
27
|
+
|
|
28
|
+
## What It Does Not Do
|
|
29
|
+
|
|
30
|
+
- It does not create a native multicam clip.
|
|
31
|
+
- It does not run Resolve's "Create Multicam Clip Using Selected Clips" dialog.
|
|
32
|
+
- It does not switch angles in an edited multicam clip.
|
|
33
|
+
- It does not flatten multicam clips.
|
|
34
|
+
- It does not perform waveform/audio correlation internally. Use
|
|
35
|
+
`media_analysis(action="detect_sync_events")` as a separate read-only analysis
|
|
36
|
+
layer when 2-pops or slate claps should feed this helper.
|
|
37
|
+
|
|
38
|
+
## Sync Modes
|
|
39
|
+
|
|
40
|
+
`stack_start`
|
|
41
|
+
: Places every angle at the same record frame. Use this when clips are already
|
|
42
|
+
trimmed to the same sync point or you want a simple visual stack.
|
|
43
|
+
|
|
44
|
+
`source_timecode`
|
|
45
|
+
: Reads each angle's `source_timecode` parameter or Resolve clip Start TC
|
|
46
|
+
metadata and computes offsets from `timeline_start_timecode`. Use this for
|
|
47
|
+
jam-synced cameras or externally prepared timecode metadata.
|
|
48
|
+
|
|
49
|
+
`record_frame`
|
|
50
|
+
: Uses explicit per-angle `record_frame` values. Use this for manual sync,
|
|
51
|
+
external alignment tools, or future FFmpeg/ffprobe audio-analysis results.
|
|
52
|
+
|
|
53
|
+
## Minimal Example
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"action": "setup_multicam_timeline",
|
|
58
|
+
"params": {
|
|
59
|
+
"name": "Interview Multicam Prep",
|
|
60
|
+
"clip_ids": ["clip-a-id", "clip-b-id"],
|
|
61
|
+
"sync_mode": "stack_start",
|
|
62
|
+
"include_audio": true,
|
|
63
|
+
"dry_run": true
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Run the same call with `dry_run=false` or omit `dry_run` to create the timeline.
|
|
69
|
+
|
|
70
|
+
## Timecode Example
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"action": "setup_multicam_timeline",
|
|
75
|
+
"params": {
|
|
76
|
+
"name": "Concert Multicam Prep",
|
|
77
|
+
"sync_mode": "source_timecode",
|
|
78
|
+
"timeline_start_timecode": "01:00:00:00",
|
|
79
|
+
"start_timecode": "01:00:00:00",
|
|
80
|
+
"include_audio": true,
|
|
81
|
+
"angles": [
|
|
82
|
+
{
|
|
83
|
+
"clip_id": "cam-a-id",
|
|
84
|
+
"angle_name": "Camera A",
|
|
85
|
+
"source_timecode": "01:00:03:12"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"clip_id": "cam-b-id",
|
|
89
|
+
"angle_name": "Camera B",
|
|
90
|
+
"source_timecode": "01:00:06:04"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The helper also accepts `start_frame`, `end_frame`, `duration_frames`,
|
|
98
|
+
`record_offset`, `track_index`, and `audio_track_index` per angle for more
|
|
99
|
+
explicit control.
|
|
100
|
+
|
|
101
|
+
## After The Timeline Is Created
|
|
102
|
+
|
|
103
|
+
1. Open the setup timeline and verify sync by scrubbing visible action, slate,
|
|
104
|
+
clap, or reference audio.
|
|
105
|
+
2. Duplicate the setup timeline if you want a preserved editable source, because
|
|
106
|
+
Resolve's conversion to multicam is one-way.
|
|
107
|
+
3. In the Media Pool, right-click the setup timeline.
|
|
108
|
+
4. Choose "Convert Compound Clips (Timelines) to Multicam Clips."
|
|
109
|
+
5. Edit the created native multicam clip into the working timeline.
|
|
110
|
+
6. Use Resolve's Multicam viewer, keyboard shortcuts, angle switching, and
|
|
111
|
+
optional flattening tools for the edit.
|
|
112
|
+
|
|
113
|
+
## Agent Workflow
|
|
114
|
+
|
|
115
|
+
When asked to prepare multicam:
|
|
116
|
+
|
|
117
|
+
1. Gather clip IDs with `media_pool(action="probe_media_pool")` or
|
|
118
|
+
`media_pool(action="get_selected")`.
|
|
119
|
+
2. Prefer a `dry_run` call first.
|
|
120
|
+
3. Explain which sync mode is being used and what evidence supports it.
|
|
121
|
+
4. Create the setup timeline only after the plan is coherent.
|
|
122
|
+
5. Report the resulting timeline name/id and remind the user that native
|
|
123
|
+
conversion is a Resolve UI step.
|
|
124
|
+
|
|
125
|
+
For audio-derived alignment, first run a separate source-safe analysis pass
|
|
126
|
+
against source paths with `media_analysis(action="detect_sync_events")`. Use
|
|
127
|
+
the returned `alignment.suggestions[].suggested_record_offset_frames` values as
|
|
128
|
+
per-angle `record_offset` values, then call this helper with
|
|
129
|
+
`sync_mode="record_frame"`.
|
|
130
|
+
|
|
131
|
+
If sync markers would help the user verify the setup, show the returned marker
|
|
132
|
+
suggestions and ask first. Only after approval, call
|
|
133
|
+
`media_analysis(action="add_sync_event_markers", params={"confirm": true, ...})`
|
|
134
|
+
to write Media Pool item markers.
|
|
135
|
+
|
|
136
|
+
Do not install FFmpeg automatically. If `ffmpeg` or `ffprobe` is missing, report
|
|
137
|
+
that the optional audio-analysis layer is unavailable and suggest installing
|
|
138
|
+
FFmpeg before retrying that feature.
|
package/docs/install.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Installation and Configuration
|
|
2
|
+
|
|
3
|
+
This guide covers Resolve requirements, the universal installer, supported MCP clients, server modes, and manual configuration.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- **DaVinci Resolve Studio** 18.5+ (macOS, Windows, or Linux) — the free edition does not support external scripting
|
|
8
|
+
- **Python 3.10–3.12** recommended (3.13+ may have ABI incompatibilities with Resolve's scripting library)
|
|
9
|
+
- DaVinci Resolve running with **Preferences > General > "External scripting using"** set to **Local**
|
|
10
|
+
|
|
11
|
+
Validated live coverage is based on **DaVinci Resolve 19.1.3 Studio** for the original API surface, plus **DaVinci Resolve 20.3.2 Studio** for the Resolve 20.0-20.2.2 scripting additions. Resolve 21 beta APIs are intentionally deferred until a stable release.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Make sure DaVinci Resolve Studio is running, then:
|
|
17
|
+
npx davinci-resolve-mcp setup
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The npm launcher installs a managed copy in your user application-data directory
|
|
21
|
+
and then runs the universal Python installer from there. MCP client configs point
|
|
22
|
+
directly at the managed Python virtual environment and `src/server.py`, so Node
|
|
23
|
+
is not required after setup.
|
|
24
|
+
|
|
25
|
+
For source installs:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
git clone https://github.com/samuelgursky/davinci-resolve-mcp.git
|
|
29
|
+
cd davinci-resolve-mcp
|
|
30
|
+
|
|
31
|
+
python install.py
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The universal installer auto-detects your platform, finds your DaVinci Resolve installation, creates a virtual environment, and configures your MCP client — all in one step.
|
|
35
|
+
|
|
36
|
+
The installer and MCP server perform a best-effort update check against the latest GitHub release. The server check runs in the background, is throttled to once every 24 hours, and never installs code automatically. Set `DAVINCI_RESOLVE_MCP_UPDATE_CHECK=0` to disable it, or `DAVINCI_RESOLVE_MCP_UPDATE_INTERVAL_HOURS` to adjust the interval.
|
|
37
|
+
|
|
38
|
+
### Supported MCP Clients
|
|
39
|
+
|
|
40
|
+
The installer can automatically configure any of these clients:
|
|
41
|
+
|
|
42
|
+
| Client | Config Written To |
|
|
43
|
+
|--------|-------------------|
|
|
44
|
+
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) |
|
|
45
|
+
| Claude Code | `.mcp.json` (project root) |
|
|
46
|
+
| Cursor | `~/.cursor/mcp.json` |
|
|
47
|
+
| VS Code (Copilot) | `.vscode/mcp.json` (workspace) |
|
|
48
|
+
| Windsurf | `~/.codeium/windsurf/mcp_config.json` |
|
|
49
|
+
| Cline | VS Code global storage |
|
|
50
|
+
| Roo Code | VS Code global storage |
|
|
51
|
+
| Zed | `~/.config/zed/settings.json` |
|
|
52
|
+
| Continue | `~/.continue/config.json` |
|
|
53
|
+
| JetBrains IDEs | Manual (Settings > Tools > AI Assistant > MCP) |
|
|
54
|
+
|
|
55
|
+
You can configure multiple clients at once, or use `--clients manual` to get copy-paste config snippets.
|
|
56
|
+
|
|
57
|
+
### Installer Options
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx davinci-resolve-mcp setup # Interactive npm setup
|
|
61
|
+
npx davinci-resolve-mcp setup --clients all # Configure all clients
|
|
62
|
+
npx davinci-resolve-mcp doctor # Dry-run environment/config check
|
|
63
|
+
npx davinci-resolve-mcp server # Launch the managed MCP server
|
|
64
|
+
npx davinci-resolve-mcp control-panel # Launch the local control panel
|
|
65
|
+
|
|
66
|
+
python install.py # Interactive mode
|
|
67
|
+
python install.py --clients all # Configure all clients
|
|
68
|
+
python install.py --clients cursor,claude-desktop # Specific clients
|
|
69
|
+
python install.py --clients manual # Just print the config
|
|
70
|
+
python install.py --dry-run --clients all # Preview without writing
|
|
71
|
+
python install.py --no-venv --clients cursor # Skip venv creation
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Server Modes
|
|
75
|
+
|
|
76
|
+
The MCP server comes in two modes:
|
|
77
|
+
|
|
78
|
+
| Mode | File | Tools | Best For |
|
|
79
|
+
|------|------|-------|----------|
|
|
80
|
+
| **Compound** (default) | `src/server.py` | 32 | Most users — fast, clean, low context usage |
|
|
81
|
+
| **Full** | `src/resolve_mcp_server.py` | 329 | Power users who want one tool per API method |
|
|
82
|
+
|
|
83
|
+
The compound server's `timeline_item` tool includes dedicated actions for common workflows:
|
|
84
|
+
|
|
85
|
+
| Category | Actions | Parameters |
|
|
86
|
+
|----------|---------|------------|
|
|
87
|
+
| **Retime** | `get_retime`, `set_retime` | process (nearest, frame_blend, optical_flow), motion_estimation (0-6) |
|
|
88
|
+
| **Transform** | `get_transform`, `set_transform` | Pan, Tilt, ZoomX/Y, RotationAngle, AnchorPointX/Y, Pitch, Yaw, FlipX/Y |
|
|
89
|
+
| **Crop** | `get_crop`, `set_crop` | CropLeft, CropRight, CropTop, CropBottom, CropSoftness, CropRetain |
|
|
90
|
+
| **Composite** | `get_composite`, `set_composite` | Opacity, CompositeMode |
|
|
91
|
+
| **Audio** | `get_audio`, `set_audio` | Volume, Pan, AudioSyncOffset |
|
|
92
|
+
| **Keyframes** | `get_keyframes`, `add_keyframe`, `modify_keyframe`, `delete_keyframe`, `set_keyframe_interpolation` | property, frame, value, interpolation (Linear, Bezier, EaseIn, EaseOut, EaseInOut) |
|
|
93
|
+
|
|
94
|
+
The installer uses the compound server by default. To use the full server:
|
|
95
|
+
```bash
|
|
96
|
+
python src/server.py --full # Launch full 329-tool server
|
|
97
|
+
# Or point your MCP config directly at src/resolve_mcp_server.py
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Local Control Panel
|
|
101
|
+
|
|
102
|
+
The repository includes a local, single-user control panel for server status,
|
|
103
|
+
Resolve clip visibility, source-safe media-analysis jobs, and the searchable
|
|
104
|
+
analysis index. Persisted analysis jobs refresh the index automatically after
|
|
105
|
+
successful slices; the manual Build Index action is for rebuilding from existing
|
|
106
|
+
reports.
|
|
107
|
+
|
|
108
|
+
From the repository root:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
venv/bin/python -m src.control_panel
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This opens the browser by default. Use `--no-open` to run only the localhost
|
|
115
|
+
server, or `--port` to choose a different port:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
venv/bin/python -m src.control_panel --no-open --port 8766
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
You can also ask an AI coding agent: **"Open the Resolve MCP control panel for
|
|
122
|
+
this repo."** The agent should launch the command above and open the local URL.
|
|
123
|
+
|
|
124
|
+
### Manual Configuration
|
|
125
|
+
|
|
126
|
+
If you prefer to set things up yourself, add to your MCP client config:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"mcpServers": {
|
|
131
|
+
"davinci-resolve": {
|
|
132
|
+
"command": "/path/to/venv/bin/python",
|
|
133
|
+
"args": ["/path/to/davinci-resolve-mcp/src/server.py"],
|
|
134
|
+
"env": {
|
|
135
|
+
"RESOLVE_SCRIPT_API": "/path/to/DaVinci Resolve/Developer/Scripting",
|
|
136
|
+
"RESOLVE_SCRIPT_LIB": "/path/to/fusionscript.so-or-dll",
|
|
137
|
+
"PYTHONPATH": "/path/to/DaVinci Resolve/Developer/Scripting/Modules"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
On Windows, installer-generated configs also include `PYTHONHOME`. That scopes Resolve's Python binding to the selected interpreter and avoids the Resolve 20.3 multi-Python crash reported in [Issue #26](https://github.com/samuelgursky/davinci-resolve-mcp/issues/26).
|
|
145
|
+
|
|
146
|
+
When the compound server is running, `resolve_control(action="get_version")`
|
|
147
|
+
includes the local MCP version, the last update-check status, and the current
|
|
148
|
+
update decision under the `mcp` key. `resolve_control(action="mcp_update_status",
|
|
149
|
+
params={"force_check": true})` performs an explicit foreground check.
|
|
150
|
+
|
|
151
|
+
### MCP Update Policy
|
|
152
|
+
|
|
153
|
+
The server keeps update checks non-interactive so MCP stdio startup remains safe
|
|
154
|
+
for every client. The installer is the human-facing prompt surface: when a newer
|
|
155
|
+
GitHub release is available, interactive installs can update now, continue,
|
|
156
|
+
snooze for 24 hours, ignore that release, enable safe auto-update, or disable
|
|
157
|
+
checks for the checkout.
|
|
158
|
+
|
|
159
|
+
Safe auto-update only runs for clean git checkouts with a configured upstream,
|
|
160
|
+
and applies `git fetch --tags --prune` followed by `git pull --ff-only`. If the
|
|
161
|
+
checkout has local changes, no upstream, or a non-fast-forward update, the
|
|
162
|
+
installer continues with the current build.
|
|
163
|
+
|
|
164
|
+
Installer flags:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
python install.py --update-now
|
|
168
|
+
python install.py --update-policy prompt
|
|
169
|
+
python install.py --update-policy auto
|
|
170
|
+
python install.py --update-policy notify
|
|
171
|
+
python install.py --update-policy never
|
|
172
|
+
python install.py --clear-update-preferences
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The same local defaults are available from chat through
|
|
176
|
+
`setup(action="get_defaults")` and `setup(action="set_defaults")`. For example,
|
|
177
|
+
`{"defaults":{"updates":{"mode":"notify"}}}` changes the MCP update policy
|
|
178
|
+
without rerunning the installer. `updates.check_interval_hours` and
|
|
179
|
+
`updates.snooze_hours` can also be set from the same setup tool; environment
|
|
180
|
+
variables still take precedence when present.
|
|
181
|
+
|
|
182
|
+
Environment controls:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
DAVINCI_RESOLVE_MCP_UPDATE_CHECK=0
|
|
186
|
+
DAVINCI_RESOLVE_MCP_UPDATE_MODE=prompt|auto|notify|never
|
|
187
|
+
DAVINCI_RESOLVE_MCP_UPDATE_INTERVAL_HOURS=24
|
|
188
|
+
DAVINCI_RESOLVE_MCP_UPDATE_SNOOZE_HOURS=24
|
|
189
|
+
DAVINCI_RESOLVE_MCP_UPDATE_STATE=/path/to/update-check.json
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Platform-specific paths:
|
|
193
|
+
|
|
194
|
+
| Platform | API Path | Library Path |
|
|
195
|
+
|----------|----------|-------------|
|
|
196
|
+
| macOS | `/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting` | `fusionscript.so` in DaVinci Resolve.app |
|
|
197
|
+
| Windows | `C:\ProgramData\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting` | `fusionscript.dll` in Resolve install dir |
|
|
198
|
+
| Linux | `/opt/resolve/Developer/Scripting` | `/opt/resolve/libs/Fusion/fusionscript.so` |
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# DaVinci Resolve Workflow Integration Notes
|
|
2
|
+
|
|
3
|
+
Blackmagic ships a separate Workflow Integrations developer package alongside the
|
|
4
|
+
Python/Lua scripting docs. This MCP server does not need a Workflow Integration
|
|
5
|
+
plugin to run; it talks to Resolve through the standard Python scripting API.
|
|
6
|
+
The Workflow Integration package is still useful context when building an
|
|
7
|
+
optional Resolve-hosted panel or script UI around the MCP.
|
|
8
|
+
|
|
9
|
+
## What Workflow Integrations Are
|
|
10
|
+
|
|
11
|
+
Workflow Integration plugins are Electron apps loaded by DaVinci Resolve Studio
|
|
12
|
+
under `Workspace > Workflow Integrations`. Resolve scans a platform-specific
|
|
13
|
+
plugin root on startup, reads each plugin's `manifest.xml`, and launches the
|
|
14
|
+
plugin's configured JavaScript entry point.
|
|
15
|
+
|
|
16
|
+
Plugin roots:
|
|
17
|
+
|
|
18
|
+
| Platform | Workflow Integration plugin root |
|
|
19
|
+
|---|---|
|
|
20
|
+
| macOS | `/Library/Application Support/Blackmagic Design/DaVinci Resolve/Workflow Integration Plugins/` |
|
|
21
|
+
| Windows | `%PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Workflow Integration Plugins\` |
|
|
22
|
+
|
|
23
|
+
Resolve-hosted Python/Lua Workflow Integration scripts are also supported. Those
|
|
24
|
+
scripts use the same Resolve scripting API as this MCP server and can create
|
|
25
|
+
small UIManager windows inside Resolve. Plugins are supported on macOS and
|
|
26
|
+
Windows; scripts are supported on macOS, Windows, and Linux.
|
|
27
|
+
|
|
28
|
+
## Current Blackmagic Notes Worth Preserving
|
|
29
|
+
|
|
30
|
+
- Resolve 19.0.2 and newer use an Electron runtime with process sandboxing and
|
|
31
|
+
context isolation enabled by default. New plugins should use a preload script,
|
|
32
|
+
`contextBridge`, and `ipcMain` rather than renderer-side Node access.
|
|
33
|
+
- Resolve 20.1 updated Workflow Integrations to Electron 36.3.2 and added
|
|
34
|
+
promise-based JavaScript APIs: `InitializePromise()` and
|
|
35
|
+
`GetResolvePromise()`.
|
|
36
|
+
- Plugin authors should keep `WorkflowIntegration.node` current by copying the
|
|
37
|
+
version bundled with the installed Resolve developer package.
|
|
38
|
+
- JavaScript Resolve access is plugin-hosted only; Blackmagic notes that there
|
|
39
|
+
is no console-based JavaScript API support.
|
|
40
|
+
- `WorkflowIntegration.SetAPITimeout(seconds)` exists for plugin calls that
|
|
41
|
+
should fail instead of blocking indefinitely. `0` disables the timeout.
|
|
42
|
+
- `WorkflowIntegration.CleanUp()` should be called when the plugin app quits.
|
|
43
|
+
|
|
44
|
+
## WorkflowIntegration Module Surface
|
|
45
|
+
|
|
46
|
+
The Electron-side native module exposes:
|
|
47
|
+
|
|
48
|
+
| Function | Purpose |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `GetInfo()` | Returns module metadata, including module version. |
|
|
51
|
+
| `Initialize(pluginId)` | Initializes the native bridge for the manifest plugin ID. |
|
|
52
|
+
| `InitializePromise(pluginId)` | Promise-returning initialize variant. |
|
|
53
|
+
| `GetResolve()` | Returns the Resolve scripting root object. |
|
|
54
|
+
| `GetResolvePromise()` | Returns a promise Resolve object; subsequent API calls return promises. |
|
|
55
|
+
| `RegisterCallback(name, fn)` | Registers a supported callback. |
|
|
56
|
+
| `DeregisterCallback(name)` | Removes a registered callback. |
|
|
57
|
+
| `CleanUp()` | Releases the Workflow Integration bridge on plugin quit. |
|
|
58
|
+
| `SetAPITimeout(seconds)` | Sets a blocking API timeout for plugin calls. |
|
|
59
|
+
|
|
60
|
+
Supported callback names:
|
|
61
|
+
|
|
62
|
+
- `RenderStart`
|
|
63
|
+
- `RenderStop`
|
|
64
|
+
- `ResolveQuit`
|
|
65
|
+
|
|
66
|
+
These callbacks are not exposed through the standard Python scripting API used
|
|
67
|
+
by this MCP server. If the MCP ever needs event-style render notifications, the
|
|
68
|
+
clean design is an optional Workflow Integration companion that forwards these
|
|
69
|
+
callbacks to the MCP process over a local HTTP/WebSocket bridge. The core MCP
|
|
70
|
+
server should continue to use polling actions such as `render.list_jobs`,
|
|
71
|
+
`render.get_job_status`, and `render.is_rendering`.
|
|
72
|
+
|
|
73
|
+
## UIManager Script Notes
|
|
74
|
+
|
|
75
|
+
Workflow Integration Python scripts launched by Resolve are automatically given
|
|
76
|
+
`resolve` and `project` variables. UI windows are built with:
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
ui = fusion.UIManager()
|
|
80
|
+
dispatcher = bmd.UIDispatcher(ui)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The useful primitives for small Resolve-hosted panels are:
|
|
84
|
+
|
|
85
|
+
- `dispatcher.AddWindow(props, children)` and `dispatcher.AddDialog(...)`
|
|
86
|
+
- `win.Show()` followed by `dispatcher.RunLoop()`
|
|
87
|
+
- `dispatcher.ExitLoop()` in the window close handler
|
|
88
|
+
- `win.Find(id)`, `win.GetItems()`, and `ui.FindWindow(id)` for element lookup
|
|
89
|
+
- event handlers via `win.On[element_id].Clicked = handler`
|
|
90
|
+
|
|
91
|
+
Common UI elements include `Label`, `Button`, `CheckBox`, `ComboBox`, `SpinBox`,
|
|
92
|
+
`Slider`, `LineEdit`, `TextEdit`, `ColorPicker`, `TabBar`, `Tree`, and
|
|
93
|
+
`TreeItem`. Layout is usually composed with `ui.VGroup`, `ui.HGroup`, `ui.VGap`,
|
|
94
|
+
and `ui.HGap`.
|
|
95
|
+
|
|
96
|
+
## Good Additions For This Repo
|
|
97
|
+
|
|
98
|
+
The Workflow Integration docs suggest a few possible additions, but none should
|
|
99
|
+
be treated as required for the MCP server itself:
|
|
100
|
+
|
|
101
|
+
1. Add an optional `examples/workflow-integration-panel/` Electron panel that
|
|
102
|
+
demonstrates a Resolve-hosted UI talking to a local MCP-adjacent endpoint.
|
|
103
|
+
Do not vendor `WorkflowIntegration.node`; document that users copy it from
|
|
104
|
+
their installed Resolve developer package.
|
|
105
|
+
2. Add an optional Python UIManager script example for launching a few common
|
|
106
|
+
MCP-assisted workflows from inside Resolve.
|
|
107
|
+
3. Add a render callback companion only if we need push-style `RenderStart`,
|
|
108
|
+
`RenderStop`, or `ResolveQuit` events. Keep the main MCP render tools
|
|
109
|
+
polling-based and dependency-free.
|
|
110
|
+
4. Extend the installer only after there is a real companion plugin/script to
|
|
111
|
+
install into the Workflow Integration root. The current MCP client installer
|
|
112
|
+
should stay focused on MCP client configuration.
|
|
113
|
+
|
|
114
|
+
## Source Media Integrity Caveat
|
|
115
|
+
|
|
116
|
+
Blackmagic's sample Workflow Integration Python script includes proxy-linking
|
|
117
|
+
examples. This repo's policy is stricter: never create, link, transcode, or
|
|
118
|
+
otherwise introduce proxy/derivative source media unless the user explicitly
|
|
119
|
+
asks for that workflow. Workflow Integration examples should preserve that rule
|
|
120
|
+
and keep analysis outputs in sidecar files or analysis directories.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Kernel Action Coverage
|
|
2
|
+
|
|
3
|
+
Kernel actions are MCP workflow actions layered on top of the public DaVinci
|
|
4
|
+
Resolve Scripting API. They are tracked separately from API method coverage:
|
|
5
|
+
API coverage answers "can MCP reach every Blackmagic method?", while kernel
|
|
6
|
+
coverage answers "which higher-level, guarded agent workflows are available?".
|
|
7
|
+
|
|
8
|
+
Current kernel coverage: **136 actions** across **9 compound MCP tools**.
|
|
9
|
+
|
|
10
|
+
| Kernel | MCP Tool | Actions |
|
|
11
|
+
|--------|----------|---------|
|
|
12
|
+
| Media analysis | `media_analysis` | `capabilities`, `install_guidance`, `resolve_output_root`, `plan`, `analyze_file`, `analyze_clip`, `analyze_bin`, `analyze_project`, `detect_sync_events`, `add_sync_event_markers`, `publish_clip_metadata`, `review_timeline_markers`, `summarize`, `get_report`, `build_index`, `index_status`, `query_index`, `start_batch_job`, `run_batch_job_slice`, `batch_job_status`, `list_batch_jobs`, `cancel_batch_job`, `resume_batch_job`, `cleanup_artifacts` |
|
|
13
|
+
| Timeline edit | `timeline` | `duplicate_clips`, `copy_clips`, `move_clips`, `copy_range`, `duplicate_range`, `overwrite_range`, `lift_range`, `story_spine_report`, `create_variant_from_ranges`, `bulk_set_item_properties`, `apply_look_to_items`, `thumbnail_contact_sheet`, `marker_thumbnail_review`, `edit_kernel_capabilities`, `probe_edit_kernel_item`, `title_property_scan`, `set_title_text`, `bulk_set_title_text` |
|
|
14
|
+
| Media Pool / ingest | `media_pool` | `ingest_capabilities`, `setup_multicam_timeline`, `probe_ingest_item`, `probe_media_pool`, `safe_import_media`, `safe_import_sequence`, `safe_import_folder`, `organize_clips`, `copy_metadata`, `normalize_metadata`, `probe_clip_properties`, `metadata_field_inventory`, `safe_relink`, `safe_unlink`, `link_proxy_checked`, `link_full_resolution_checked`, `set_clip_marks`, `clear_clip_marks`, `copy_clip_annotations`, `media_pool_boundary_report` |
|
|
15
|
+
| Render / Deliver | `render` | `render_capabilities`, `probe_render_matrix`, `probe_render_settings`, `validate_render_settings`, `safe_set_render_settings`, `prepare_render_job`, `render_job_lifecycle_probe`, `quick_export_capabilities`, `safe_quick_export`, `export_render_boundary_report` |
|
|
16
|
+
| Review annotations | `timeline_markers` | `annotation_capabilities`, `probe_annotations`, `normalize_marker_payload`, `copy_annotations`, `move_annotations`, `sync_marker_custom_data`, `clear_annotations_by_scope`, `export_review_report`, `annotation_boundary_report` |
|
|
17
|
+
| Color / Grade | `timeline_item_color` | `grade_capabilities`, `probe_grade_item`, `probe_node_graph`, `safe_set_cdl`, `safe_copy_grade`, `safe_apply_drx`, `safe_export_lut`, `grade_version_snapshot`, `grade_version_restore`, `color_group_capabilities`, `gallery_capabilities`, `grade_boundary_report` |
|
|
18
|
+
| Fusion composition | `fusion_comp` | `fusion_graph_capabilities`, `probe_fusion_comp`, `probe_fusion_tool`, `safe_add_tool`, `safe_set_inputs`, `safe_connect_tools`, `fusion_boundary_report` |
|
|
19
|
+
| Conform / interchange | `timeline` | `conform_capabilities`, `probe_timeline_structure`, `detect_gaps_overlaps`, `source_range_report`, `export_timeline_checked`, `import_timeline_checked`, `compare_timelines`, `probe_interchange_roundtrip`, `detect_missing_media`, `build_relink_plan`, `conform_boundary_report` |
|
|
20
|
+
| Audio / Fairlight | `timeline` | `audio_capabilities`, `probe_audio_item`, `probe_audio_track`, `safe_set_audio_properties`, `audio_mix_capability_report`, `voice_isolation_capabilities`, `audio_mapping_report`, `safe_auto_sync_audio`, `transcription_capabilities`, `subtitle_generation_probe`, `fairlight_boundary_report` |
|
|
21
|
+
| Project lifecycle | `project_manager` | `project_capabilities`, `probe_project_lifecycle`, `probe_project_settings`, `safe_project_create`, `safe_project_export`, `safe_project_import`, `safe_project_archive`, `safe_project_restore`, `safe_project_delete`, `safe_set_project_settings`, `project_settings_snapshot`, `database_capabilities`, `safe_set_current_database`, `preset_lifecycle_probe`, `project_boundary_report` |
|
|
22
|
+
| Extension authoring | `script_plugin` | `extension_capabilities`, `probe_fuse_lifecycle`, `probe_dctl_lifecycle`, `probe_script_lifecycle`, `safe_install_extension`, `safe_remove_extension`, `refresh_or_restart_required`, `extension_boundary_report` |
|
|
23
|
+
|
|
24
|
+
Helper-tool details that need more than an action list live in guides. See
|
|
25
|
+
[Multicam Setup Helper Guide](../guides/multicam-setup-guide.md) for the
|
|
26
|
+
`media_pool.setup_multicam_timeline` helper/API boundary and Resolve UI
|
|
27
|
+
conversion steps, and [Media Analysis Guide](../guides/media-analysis-guide.md)
|
|
28
|
+
for source-safe 2-pop/slate-clap detection.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Audio / Fairlight Kernel
|
|
2
|
+
|
|
3
|
+
The Audio / Fairlight kernel expands `timeline` into a safer audio-state,
|
|
4
|
+
mapping, voice isolation, auto-sync, transcription, subtitle, and Fairlight
|
|
5
|
+
boundary layer.
|
|
6
|
+
|
|
7
|
+
Live validation was run against DaVinci Resolve Studio 20.3.2.9 with a
|
|
8
|
+
disposable `_mcp_audio_fairlight_probe_*` project and generated synthetic video
|
|
9
|
+
plus audio-only media. Final release probe counts:
|
|
10
|
+
|
|
11
|
+
| Status | Count |
|
|
12
|
+
| --- | ---: |
|
|
13
|
+
| `supported` | 13 |
|
|
14
|
+
| `partially_supported` | 3 |
|
|
15
|
+
| `unsupported` | 0 |
|
|
16
|
+
| `version_or_page_dependent` | 0 |
|
|
17
|
+
| `not_applicable` | 0 |
|
|
18
|
+
| `error` | 0 |
|
|
19
|
+
|
|
20
|
+
The partially supported results were generated-item `Volume` property writes,
|
|
21
|
+
`AutoSyncAudio` execution, and `InsertAudioToCurrentTrackAtPlayhead`; all
|
|
22
|
+
returned false in the release probe while their guarded planning/probe layers
|
|
23
|
+
worked.
|
|
24
|
+
|
|
25
|
+
## Added Actions
|
|
26
|
+
|
|
27
|
+
All kernel actions are exposed through `timeline`.
|
|
28
|
+
|
|
29
|
+
| Action | Purpose |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `audio_capabilities` | Return track, item, media pool, timeline AI, Fairlight, and known boundary support. |
|
|
32
|
+
| `probe_audio_track` | Snapshot audio track subtype, name, lock/enable state, and track voice isolation state. |
|
|
33
|
+
| `probe_audio_item` | Snapshot audio item properties, source audio mapping, voice isolation, and method availability. |
|
|
34
|
+
| `safe_set_audio_properties` | Validate audio property keys, write with readback, and restore original values by default. |
|
|
35
|
+
| `voice_isolation_capabilities` | Report track-level and item-level voice isolation availability and state. |
|
|
36
|
+
| `audio_mapping_report` | Report timeline item source audio mappings and MediaPoolItem audio mappings. |
|
|
37
|
+
| `safe_auto_sync_audio` | Validate clip selection and normalize Resolve audio-sync constants; dry-run by default. |
|
|
38
|
+
| `transcription_capabilities` | Report clip and folder transcription method availability without mutating by default. |
|
|
39
|
+
| `subtitle_generation_probe` | Dry-run subtitle generation by default; requires `allow_generate=True` to call Resolve. |
|
|
40
|
+
| `fairlight_boundary_report` | Return capabilities, track/item probes, mappings, transcription state, presets, and project methods. |
|
|
41
|
+
|
|
42
|
+
## Supported Findings
|
|
43
|
+
|
|
44
|
+
- Audio track subtype, name, lock, enable, and voice isolation state probing
|
|
45
|
+
worked.
|
|
46
|
+
- Audio item source audio mapping and MediaPoolItem audio mapping readback
|
|
47
|
+
worked on generated media.
|
|
48
|
+
- Guarded audio property dry-run worked.
|
|
49
|
+
- Voice isolation capability reporting worked for track and item scopes.
|
|
50
|
+
- Auto-sync dry-run produced a normalized Resolve-constant settings payload.
|
|
51
|
+
- MediaPoolItem transcription and clear-transcription both returned true on the
|
|
52
|
+
generated video clip.
|
|
53
|
+
- Subtitle generation from the generated timeline returned true.
|
|
54
|
+
- Fairlight preset listing and the full boundary report worked.
|
|
55
|
+
|
|
56
|
+
## Boundaries
|
|
57
|
+
|
|
58
|
+
- Timeline item audio properties may be readable as `None` and can reject writes
|
|
59
|
+
for some generated item types. The release probe saw `Volume` write and
|
|
60
|
+
restore return false.
|
|
61
|
+
- `AutoSyncAudio` depends on media content and Resolve's sync engine. The
|
|
62
|
+
guarded call normalized waveform/channel settings but Resolve returned false
|
|
63
|
+
for the generated video/audio pair.
|
|
64
|
+
- `InsertAudioToCurrentTrackAtPlayhead` can return false depending on current
|
|
65
|
+
track, page, and insertion state even with a valid generated audio path.
|
|
66
|
+
- Transcription and subtitle APIs can be asynchronous, language-component
|
|
67
|
+
dependent, and license/build dependent even when they return true quickly.
|
|
68
|
+
- The public API does not expose full Fairlight mix automation curves or plugin
|
|
69
|
+
parameter graphs.
|
|
70
|
+
|
|
71
|
+
## Live Probe
|
|
72
|
+
|
|
73
|
+
Run the live boundary probe with:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python3.11 tests/live_audio_fairlight_validation.py --output-dir /tmp/audio-fairlight-probe
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The harness creates a disposable project, generates synthetic video and
|
|
80
|
+
audio-only media, probes track/item audio state, source/audio mappings,
|
|
81
|
+
voice-isolation state, guarded property writes, auto-sync, transcription,
|
|
82
|
+
subtitle generation, Fairlight preset listing, audio insertion, writes JSON and
|
|
83
|
+
Markdown reports, deletes the project, and removes generated media.
|
|
84
|
+
|
|
85
|
+
Use `--keep-open` only when you intentionally want to inspect the disposable
|
|
86
|
+
project by hand.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Color / Grade Kernel
|
|
2
|
+
|
|
3
|
+
The Color / Grade kernel expands `timeline_item_color` into a safer grade
|
|
4
|
+
inspection, versioning, copy, LUT, DRX, Gallery, and color-group boundary layer.
|
|
5
|
+
|
|
6
|
+
Live validation was run against DaVinci Resolve Studio 20.3.2.9 with a
|
|
7
|
+
disposable `_mcp_color_grade_probe_*` project and generated synthetic color-bar
|
|
8
|
+
media. Final release probe counts:
|
|
9
|
+
|
|
10
|
+
| Status | Count |
|
|
11
|
+
| --- | ---: |
|
|
12
|
+
| `supported` | 25 |
|
|
13
|
+
| `version_or_page_dependent` | 2 |
|
|
14
|
+
| `not_applicable` | 1 |
|
|
15
|
+
| `partially_supported` | 0 |
|
|
16
|
+
| `unsupported` | 0 |
|
|
17
|
+
| `error` | 0 |
|
|
18
|
+
|
|
19
|
+
The version/page-dependent results were Gallery still export and
|
|
20
|
+
`ExportCurrentFrameAsStill(.drx)` in this Resolve/UI state. `safe_apply_drx`
|
|
21
|
+
was marked `not_applicable` because the probe could not produce a DRX file
|
|
22
|
+
through the public API in that run.
|
|
23
|
+
|
|
24
|
+
## Added Actions
|
|
25
|
+
|
|
26
|
+
All actions are exposed through `timeline_item_color`.
|
|
27
|
+
|
|
28
|
+
| Action | Purpose |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `grade_capabilities` | Return callable item methods, graph sources, LUT export types, version modes, guards, and known boundaries. |
|
|
31
|
+
| `probe_grade_item` | Snapshot grade versions, item graph, color group, cache states, ids, names, and callable methods. |
|
|
32
|
+
| `probe_node_graph` | Inspect item, timeline, pre-clip group, or post-clip group graph availability and node metadata. |
|
|
33
|
+
| `safe_set_cdl` | Validate and normalize CDL payloads before calling `SetCDL`; supports dry run. |
|
|
34
|
+
| `safe_copy_grade` | Resolve target timeline item IDs before calling `CopyGrades`; supports dry run. |
|
|
35
|
+
| `safe_apply_drx` | Validate DRX file existence and temp-path guard before calling `ApplyGradeFromDRX`. |
|
|
36
|
+
| `safe_export_lut` | Resolve LUT export type aliases and require temp output paths by default. |
|
|
37
|
+
| `grade_version_snapshot` | Read current, local, and remote grade version names. |
|
|
38
|
+
| `grade_version_restore` | Safely load a named local/remote version after verifying it exists. |
|
|
39
|
+
| `color_group_capabilities` | Report color groups and pre/post graph availability. |
|
|
40
|
+
| `gallery_capabilities` | Report Gallery availability, albums, and callable Gallery methods. |
|
|
41
|
+
| `grade_boundary_report` | Return capabilities, current item snapshot, color groups, Gallery, and timeline graph summary. |
|
|
42
|
+
|
|
43
|
+
## Scope Matrix
|
|
44
|
+
|
|
45
|
+
| Scope | Probe Support | Mutation Support | Notes |
|
|
46
|
+
| --- | --- | --- | --- |
|
|
47
|
+
| Timeline item graph | Supported | CDL, LUT export, grade copy, DRX apply when file exists | Primary grade entry point. |
|
|
48
|
+
| Timeline graph | Supported | Raw `graph` tool can mutate | Live probe found zero timeline nodes by default. |
|
|
49
|
+
| Color group pre-clip graph | Supported | Raw `graph` tool can mutate | Requires existing `group_name`. |
|
|
50
|
+
| Color group post-clip graph | Supported | Raw `graph` tool can mutate | Requires existing `group_name`. |
|
|
51
|
+
| Gallery albums/stills | Partially environment dependent | Album create and list supported; still export may require UI panel state | Public API can return false if Gallery export is not ready. |
|
|
52
|
+
|
|
53
|
+
## Supported Findings
|
|
54
|
+
|
|
55
|
+
- `SetCDL` worked after payload validation and Resolve-specific string
|
|
56
|
+
normalization.
|
|
57
|
+
- Item graph and timeline graph objects were available; item graph exposed one
|
|
58
|
+
node in the synthetic clip.
|
|
59
|
+
- Node graph metadata probes worked for node count, LUT, cache mode, label, and
|
|
60
|
+
tools-in-node where Resolve returned data.
|
|
61
|
+
- Local grade version add, rename, load, restore, and delete worked when the
|
|
62
|
+
version to delete was not currently loaded.
|
|
63
|
+
- `CopyGrades` worked from the first synthetic timeline item to the second.
|
|
64
|
+
- `ExportLUT` produced a 33-point `.cube` file under the generated temp probe
|
|
65
|
+
directory.
|
|
66
|
+
- Color group create, assign, capability probe, pre/post graph probe, remove,
|
|
67
|
+
and delete worked.
|
|
68
|
+
- Gallery capability and album list/create calls worked.
|
|
69
|
+
|
|
70
|
+
## Boundaries
|
|
71
|
+
|
|
72
|
+
- Node graph internals are intentionally limited by Resolve's public API. The
|
|
73
|
+
kernel can inspect high-level node count and a few node attributes, but not
|
|
74
|
+
every grading control inside a node.
|
|
75
|
+
- `ApplyGradeFromDRX` replaces the target graph. There is no append mode in the
|
|
76
|
+
public API.
|
|
77
|
+
- `safe_apply_drx` requires an existing DRX path. The live release probe could
|
|
78
|
+
not produce one because both Gallery still export and
|
|
79
|
+
`ExportCurrentFrameAsStill(.drx)` were unavailable in the current UI/build
|
|
80
|
+
state.
|
|
81
|
+
- Gallery still export may require the Color page Gallery panel to be open and
|
|
82
|
+
ready. The public API returned false in the release probe even after the page
|
|
83
|
+
was active.
|
|
84
|
+
- LUT export writes files, so `safe_export_lut` requires temp paths by default.
|
|
85
|
+
- Stabilize, Smart Reframe, Magic Mask, and Magic Mask regeneration are exposed
|
|
86
|
+
as callable methods but are not forced in the boundary report because they can
|
|
87
|
+
be asynchronous, page dependent, and expensive.
|
|
88
|
+
|
|
89
|
+
## Live Probe
|
|
90
|
+
|
|
91
|
+
Run the live boundary probe with:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
python3.11 tests/live_color_grade_validation.py --output-dir /tmp/color-grade-probe
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The harness creates a disposable project, generates synthetic color-bar media,
|
|
98
|
+
builds a two-item timeline, probes grade/node/version/copy/LUT/group/Gallery
|
|
99
|
+
surfaces, writes JSON and Markdown reports, deletes the project, and removes
|
|
100
|
+
generated media and exported probe files.
|
|
101
|
+
|
|
102
|
+
Use `--keep-open` only when you intentionally want to inspect the disposable
|
|
103
|
+
project by hand.
|