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
package/docs/SKILL.md
ADDED
|
@@ -0,0 +1,1145 @@
|
|
|
1
|
+
# DaVinci Resolve MCP Server — AI Skill Reference
|
|
2
|
+
|
|
3
|
+
This document gives AI assistants the context needed to use the DaVinci Resolve
|
|
4
|
+
MCP server effectively. It covers the tool landscape, page prerequisites,
|
|
5
|
+
common workflow patterns, error recovery, and known gotchas.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What This Server Does
|
|
10
|
+
|
|
11
|
+
The DaVinci Resolve MCP server bridges AI assistants to DaVinci Resolve Studio
|
|
12
|
+
via its official Scripting API. You can control every aspect of a post-production
|
|
13
|
+
session — projects, timelines, clips, color grading, Fusion compositions, audio,
|
|
14
|
+
render queues, and more — through natural language.
|
|
15
|
+
|
|
16
|
+
DaVinci Resolve must be running with **Preferences > General > "External scripting
|
|
17
|
+
using"** set to **Local**. The server auto-launches Resolve if it is not running,
|
|
18
|
+
but that first connection can take up to 60 seconds.
|
|
19
|
+
|
|
20
|
+
Workflow Integration plugins/scripts are a separate Resolve-hosted UI mechanism.
|
|
21
|
+
They are not required for this MCP server, but `docs/integrations/workflow-integrations.md`
|
|
22
|
+
summarizes when they are useful for optional in-Resolve panels, UIManager
|
|
23
|
+
scripts, and render callback companions.
|
|
24
|
+
|
|
25
|
+
OpenFX plugins are native C++ image-effect plugins, not an MCP control surface.
|
|
26
|
+
Use `docs/notes/openfx-notes.md` when diagnosing `insert_ofx_generator` failures or
|
|
27
|
+
discussing optional OFX plugin development.
|
|
28
|
+
|
|
29
|
+
LUT files are directly relevant to Color-page graph actions. Use
|
|
30
|
+
`docs/notes/lut-notes.md` when diagnosing `graph.set_lut` failures, validating `.cube`
|
|
31
|
+
files, or explaining `project_settings.refresh_luts`.
|
|
32
|
+
|
|
33
|
+
Fusion templates are relevant to Edit/Cut page insertion actions. Use
|
|
34
|
+
`docs/notes/fusion-template-notes.md` when diagnosing `insert_fusion_generator` or
|
|
35
|
+
`insert_fusion_title` failures, template paths, `.setting` files, or `.drfx`
|
|
36
|
+
bundles.
|
|
37
|
+
|
|
38
|
+
DCTL files are programmable color transforms/effects adjacent to LUT and OpenFX
|
|
39
|
+
workflows. Use `docs/notes/dctl-notes.md` when diagnosing `.dctl`/`.dctle` discovery,
|
|
40
|
+
ResolveFX DCTL plugin behavior, ACES DCTL IDT/ODT setup, or DCTL-as-LUT usage.
|
|
41
|
+
|
|
42
|
+
Codec plugins are native IO encode plugins that extend Deliver-page render
|
|
43
|
+
formats/codecs. Use `docs/notes/codec-plugin-notes.md` when diagnosing missing custom
|
|
44
|
+
render formats/codecs, `.dvcp.bundle` packaging, or IOPlugins install paths.
|
|
45
|
+
|
|
46
|
+
The `fuse_plugin`, `dctl`, and `script_plugin` compound tools (v2.5.0+) write
|
|
47
|
+
Fuse plugin source, DCTL files, and Lua/Python scripts into Resolve's install
|
|
48
|
+
directories. They are *authoring* tools — every other tool in this server wraps
|
|
49
|
+
Resolve's scripting API, while these three emit and install plugin/script
|
|
50
|
+
source. Status: lifecycle-verified in DaVinci Resolve Studio 20.3.2.9 for
|
|
51
|
+
MCP-marked install/read/list/remove, regular DCTL `refresh_luts`, ACES/Fuse
|
|
52
|
+
restart-required classification, Python installed-script execution, and
|
|
53
|
+
Python/Lua `run_inline`. Use `docs/kernels/extension-authoring-kernel.md` for the
|
|
54
|
+
kernel boundary map, `docs/authoring/fuse-dctl-authoring.md` for the Fuse + DCTL coverage
|
|
55
|
+
matrix, and `docs/authoring/script-plugin-authoring.md` for the script DSL spec and the
|
|
56
|
+
conversational-execution model.
|
|
57
|
+
|
|
58
|
+
Extension Authoring kernel actions (v2.16.0+) are exposed through
|
|
59
|
+
`script_plugin`:
|
|
60
|
+
|
|
61
|
+
- `extension_capabilities`
|
|
62
|
+
- `probe_fuse_lifecycle(name?, kind?, install?, cleanup?)`
|
|
63
|
+
- `probe_dctl_lifecycle(name?, kind?, category?, install?, refresh_luts?, cleanup?)`
|
|
64
|
+
- `probe_script_lifecycle(name?, language?, category?, install?, execute?, cleanup?)`
|
|
65
|
+
- `safe_install_extension(extension_type, name, source?|kind?, dry_run?)`
|
|
66
|
+
- `safe_remove_extension(extension_type, name, dry_run?)`
|
|
67
|
+
- `refresh_or_restart_required(extension_type, category?)`
|
|
68
|
+
- `extension_boundary_report(include_template_matrix?)`
|
|
69
|
+
|
|
70
|
+
Key behavioral notes for `script_plugin`:
|
|
71
|
+
- `run_inline(source, language)` runs ad-hoc Lua/Python in Resolve and returns
|
|
72
|
+
stdout + result — use this for one-off conversational queries against the
|
|
73
|
+
Resolve API instead of building+installing a script.
|
|
74
|
+
- `language` accepts `lua`, `py`, or the human-facing aliases `python` and
|
|
75
|
+
`python3`.
|
|
76
|
+
- `execute(name, category, language)` runs an installed script; Python stdout
|
|
77
|
+
and stderr are captured, while installed Lua execution can return false from
|
|
78
|
+
the Python bridge even when install/read/list/remove worked.
|
|
79
|
+
- Lua scripts: `fusion.Execute()` from the Python bridge is a no-op in
|
|
80
|
+
Resolve 20.x — `_run_inline_lua` works around this with `RunScript` against
|
|
81
|
+
a temp file plus completion-sentinel polling on `app:SetData/GetData`.
|
|
82
|
+
- Fuse install path on macOS is `…/DaVinci Resolve/Fusion/Fuses/` (NOT
|
|
83
|
+
`Support/Fusion/Fuses/` as the SDK doc lists). The MCP path helpers handle
|
|
84
|
+
this; if you're staging files manually, use the path the implementation
|
|
85
|
+
emits.
|
|
86
|
+
- Resolve picks up new scripts without a restart; new Fuses need a restart
|
|
87
|
+
to register; new DCTLs need `project_settings(action='refresh_luts')`
|
|
88
|
+
(regular LUT category) or a restart (ACES IDT/ODT category).
|
|
89
|
+
|
|
90
|
+
Tool metadata (v2.17.1+) includes MCP `ToolAnnotations` for read-only,
|
|
91
|
+
destructive, idempotent, and external-resource hints. Treat compound tool
|
|
92
|
+
annotations as conservative because a single compound tool may expose both probe
|
|
93
|
+
and mutation actions behind its `action` parameter. Continue to prefer
|
|
94
|
+
`safe_*`, `dry_run`, `probe_*`, `capabilities`, and `boundary_report` actions
|
|
95
|
+
before mutating Resolve state.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Two Server Modes
|
|
100
|
+
|
|
101
|
+
| Mode | Entry point | Tool count | Use when |
|
|
102
|
+
|---|---|---|---|
|
|
103
|
+
| Compound (default) | `src/server.py` | 32 tools | Most workflows — keeps context lean |
|
|
104
|
+
| Granular (full) | `src/server.py --full` | 329 tools | Power users needing one tool per API method |
|
|
105
|
+
|
|
106
|
+
This skill document covers the **compound server** (the default). Each compound
|
|
107
|
+
tool accepts an `action` string and an optional `params` object.
|
|
108
|
+
|
|
109
|
+
The compound server also registers MCP prompts. Use `davinci_resolve_workflow`
|
|
110
|
+
as the compact operating brief, and use `analyze_media` as a slash-command style
|
|
111
|
+
entry point for read-only project, selected-clip, bin, or file analysis. The
|
|
112
|
+
Analyze Media prompt defaults to chat-context visual analysis when the MCP
|
|
113
|
+
client supports sampling/image messages, while allowing `include_visuals=false`
|
|
114
|
+
for technical-only or privacy-sensitive runs. It also encodes session-only
|
|
115
|
+
defaults, optional transcription, and finished-video editorial guardrails.
|
|
116
|
+
|
|
117
|
+
## Local Control Panel
|
|
118
|
+
|
|
119
|
+
If the user asks to open, launch, or inspect the Resolve MCP control panel, run
|
|
120
|
+
this from the repository root:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
venv/bin/python -m src.control_panel
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The command starts the local control panel and opens the default browser. Use
|
|
127
|
+
`--no-open` when running in a headless context, then give the user the printed
|
|
128
|
+
localhost URL. The panel is local and single-user; it is an operational surface
|
|
129
|
+
for server status, Resolve clips, source-safe analysis jobs, preferences, and
|
|
130
|
+
diagnostics as those sections are added.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Editorial Memory And Decision-Making
|
|
135
|
+
|
|
136
|
+
When the user asks for cutting, pacing, story shape, suspense, comedy timing, or
|
|
137
|
+
tonal reframing, operate like an editor, not just a metadata scanner. Use
|
|
138
|
+
`docs/guides/editorial-decision-guide.md` as the project-owned craft reference. The
|
|
139
|
+
short version: emotion and story come first, then clarity, rhythm, eye trace,
|
|
140
|
+
screen geography, continuity, and coverage variety.
|
|
141
|
+
|
|
142
|
+
Before analyzing or rebuilding anything, check whether the active project already
|
|
143
|
+
contains useful evidence:
|
|
144
|
+
|
|
145
|
+
- `media_analysis(action="summarize")`
|
|
146
|
+
- `media_analysis(action="get_report")` when a manifest or report path is known
|
|
147
|
+
- `timeline(action="list")`
|
|
148
|
+
- `timeline(action="get_current")`
|
|
149
|
+
- `timeline(action="probe_timeline_structure")`
|
|
150
|
+
- `timeline(action="source_range_report")`
|
|
151
|
+
- `timeline_markers(action="get_all")`
|
|
152
|
+
- `media_analysis(action="review_timeline_markers")` when marker imagery matters
|
|
153
|
+
|
|
154
|
+
Reuse prior analysis unless it is stale, incomplete, or missing the modality the
|
|
155
|
+
user is asking for. For example, do not re-run visual analysis just because the
|
|
156
|
+
edit task is new if a current report already has keyframes, motion variance, and
|
|
157
|
+
usable visual descriptions. Add transcription, chat-context vision, marker
|
|
158
|
+
review, or source range checks only when that missing evidence changes the
|
|
159
|
+
decision. Use `force_refresh=true` only when the user asks for a fresh read or
|
|
160
|
+
when cache signatures show the source, prompt, depth, or requested modality has
|
|
161
|
+
changed.
|
|
162
|
+
|
|
163
|
+
For finished-video editorial work, scene detection and motion variance are
|
|
164
|
+
guardrails, not story. Use them to avoid black frames, flash frames, corrupt
|
|
165
|
+
ranges, and accidental cut points. Let transcript, sound events, complete
|
|
166
|
+
thoughts, reactions, and decisive visual frames drive the actual edit.
|
|
167
|
+
|
|
168
|
+
After creating or modifying a timeline variant, do a second pass before calling
|
|
169
|
+
the work done:
|
|
170
|
+
|
|
171
|
+
- `timeline(action="detect_gaps_overlaps")`
|
|
172
|
+
- `timeline(action="source_range_report")`
|
|
173
|
+
- `timeline_markers(action="get_thumbnail_image")` at important markers and cuts
|
|
174
|
+
- Compare each marker name against the Resolve-rendered frame; revise the marker
|
|
175
|
+
or edit if the image contradicts the plan.
|
|
176
|
+
|
|
177
|
+
Do not depend on personal, external, or workstation-specific editorial context.
|
|
178
|
+
For this project, keep the editorial craft reference self-contained in
|
|
179
|
+
`docs/guides/editorial-decision-guide.md` and keep this `SKILL.md` focused on
|
|
180
|
+
operational use of the MCP.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Color Memory And Decision-Making
|
|
185
|
+
|
|
186
|
+
When the user asks for color correction, shot matching, look development, LUTs,
|
|
187
|
+
DCTLs, DRX grades, Gallery stills, or color-group workflows, use
|
|
188
|
+
`docs/guides/color-decision-guide.md` as the project-owned color reference.
|
|
189
|
+
|
|
190
|
+
Be explicit about the API boundary:
|
|
191
|
+
|
|
192
|
+
- Directly creatable/control surfaces: CDL values on an existing node, grade
|
|
193
|
+
versions, color-group assignment, LUT assignment on existing nodes, node
|
|
194
|
+
enable/cache state, LUT/DCTL assets, Gallery still import/export, and grade
|
|
195
|
+
copy/export helpers.
|
|
196
|
+
- Opaque full-grade surfaces: copied grades, imported/exported `.drx` stills,
|
|
197
|
+
and manually built Resolve node graphs. These can carry full grades, but the
|
|
198
|
+
MCP applies or copies them as packages.
|
|
199
|
+
- Not directly creatable from structured params: new node trees, Lift/Gamma/Gain
|
|
200
|
+
wheel values, log/HDR palette values, curves, qualifiers, power windows,
|
|
201
|
+
tracking, Color Warper, and detailed ResolveFX/OFX parameter edits.
|
|
202
|
+
|
|
203
|
+
For safe color work, start with `timeline_item_color(action="grade_boundary_report")`,
|
|
204
|
+
`timeline_item_color(action="grade_version_snapshot")`,
|
|
205
|
+
`timeline_item_color(action="probe_node_graph")`, and a Resolve-rendered frame
|
|
206
|
+
reference for the target shot or shots. Use thumbnails, contact sheets, Gallery
|
|
207
|
+
stills, marker frames, or existing visual analysis reports before writing a
|
|
208
|
+
grade, and cite the inspected frames in the response. When the API can safely
|
|
209
|
+
provide them, compare matched untreated/bypass, current, and after frames at the
|
|
210
|
+
same timecodes, then restore the previous active version or node-enabled state
|
|
211
|
+
after any temporary bypass capture. Treat untreated frames as diagnostic
|
|
212
|
+
evidence, not as permission to discard an existing creative grade.
|
|
213
|
+
|
|
214
|
+
Prefer `safe_set_cdl` for small reversible primary corrections. Use DRX/stills
|
|
215
|
+
or grade copy only when the user accepts whole-grade replacement/transfer
|
|
216
|
+
semantics. Use DCTL/LUT authoring only for reusable mathematical transforms, not
|
|
217
|
+
as a substitute for hand-built windows, qualifiers, or tracked secondaries. Do
|
|
218
|
+
not apply blind/global grades unless the user explicitly asks for that. When the
|
|
219
|
+
user asks to build on or adjust an existing grade, preserve the current
|
|
220
|
+
grade/version as the starting point, create or switch to a recoverable
|
|
221
|
+
adjustment version, and apply only incremental changes through supported
|
|
222
|
+
controls. Do not reset grades, replace graphs, or apply DRX/copy-grade
|
|
223
|
+
whole-grade artifacts unless replacement or transfer semantics are explicitly
|
|
224
|
+
accepted. Distinguish Resolve's default one-node graph from an existing creative
|
|
225
|
+
grade; only describe a creative grade when active tools, LUTs, or other grade
|
|
226
|
+
state are present.
|
|
227
|
+
|
|
228
|
+
For sequence-wide looks, prefer a duplicated timeline, batch creation of
|
|
229
|
+
reference/current/look versions across all target clips, and one bulk Resolve
|
|
230
|
+
script for repeated version, group, or CDL operations. Use color groups for shared
|
|
231
|
+
scene-level intent only when they fit the work: group pre-clip for shared
|
|
232
|
+
normalization, clip versions for shot-specific matching, and group post-clip for
|
|
233
|
+
the creative look. Sampling can guide a first pass, but final handoff should
|
|
234
|
+
state the reviewed scope; short sequences should be checked shot by shot.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Page Context Requirements
|
|
239
|
+
|
|
240
|
+
DaVinci Resolve is a page-based application. Certain operations only work on
|
|
241
|
+
specific pages. Always confirm or switch pages before calling page-sensitive tools.
|
|
242
|
+
|
|
243
|
+
| Operation category | Required page | How to switch |
|
|
244
|
+
|---|---|---|
|
|
245
|
+
| Color grading, node graphs, CDL | Color | `resolve_control(action="open_page", params={"page": "color"})` |
|
|
246
|
+
| Gallery stills export, `grab_and_export` | Color, Gallery panel open | `resolve_control` + open Gallery panel in Workspace menu |
|
|
247
|
+
| Fusion compositions (page comp) | Fusion | `resolve_control(action="open_page", params={"page": "fusion"})` |
|
|
248
|
+
| Timeline editing, track operations | Edit or Cut | `resolve_control(action="open_page", params={"page": "edit"})` |
|
|
249
|
+
| Fairlight audio | Fairlight | `resolve_control(action="open_page", params={"page": "fairlight"})` |
|
|
250
|
+
| Render / deliver | Deliver | `resolve_control(action="open_page", params={"page": "deliver"})` |
|
|
251
|
+
| Media import, storage browsing | Media | `resolve_control(action="open_page", params={"page": "media"})` |
|
|
252
|
+
|
|
253
|
+
When a tool returns an unexpected `False` or an error about context, check whether
|
|
254
|
+
you are on the correct page first.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Tool Map
|
|
259
|
+
|
|
260
|
+
### App Control
|
|
261
|
+
|
|
262
|
+
**`resolve_control`** — App-level operations.
|
|
263
|
+
|
|
264
|
+
Key actions:
|
|
265
|
+
- `launch` — connect to or start Resolve; call this first if any tool returns a
|
|
266
|
+
"Not connected" error
|
|
267
|
+
- `get_version` — returns `{product, version, version_string}`
|
|
268
|
+
- `get_page` / `open_page(page)` — read or switch the active page
|
|
269
|
+
- `get_keyframe_mode` / `set_keyframe_mode(mode)`
|
|
270
|
+
- `get_fairlight_presets` — Resolve 20.2.2+; returns available Fairlight
|
|
271
|
+
preset names
|
|
272
|
+
- `quit` — terminates Resolve (destructive; confirm with user first)
|
|
273
|
+
|
|
274
|
+
**`layout_presets`** — Save, load, export, import, delete UI layout presets.
|
|
275
|
+
|
|
276
|
+
**`render_presets`** — Import and export render and burn-in presets.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
### Project Management
|
|
281
|
+
|
|
282
|
+
**`project_manager`** — CRUD on projects.
|
|
283
|
+
|
|
284
|
+
Key actions: `list`, `get_current`, `create(name, media_location_path?)`,
|
|
285
|
+
`load(name)`, `save`, `close`,
|
|
286
|
+
`delete(name)`, `import_project(path)`, `export_project(name, path)`, `archive`,
|
|
287
|
+
`restore`
|
|
288
|
+
|
|
289
|
+
Project / Database / Archive kernel actions (v2.15.0+) add guarded project
|
|
290
|
+
lifecycle, settings, database, preset, and archive boundary helpers:
|
|
291
|
+
|
|
292
|
+
- `project_capabilities`
|
|
293
|
+
- `probe_project_lifecycle`
|
|
294
|
+
- `probe_project_settings(keys?, try_write?, dry_run?)`
|
|
295
|
+
- `safe_project_create(name, media_location_path?, dry_run?)`
|
|
296
|
+
- `safe_project_export(name, path, with_stills_and_luts?, dry_run?)`
|
|
297
|
+
- `safe_project_import(path, name, dry_run?)`
|
|
298
|
+
- `safe_project_archive(name, path, src_media=false, render_cache=false, proxy_media=false, dry_run?)`
|
|
299
|
+
- `safe_project_restore(path, name, dry_run?)`
|
|
300
|
+
- `safe_project_delete(name, close_current?, dry_run?)`
|
|
301
|
+
- `safe_set_project_settings(settings, restore?, dry_run?)`
|
|
302
|
+
- `project_settings_snapshot(name?)`
|
|
303
|
+
- `database_capabilities`
|
|
304
|
+
- `safe_set_current_database(db_info, dry_run?, allow_switch?)`
|
|
305
|
+
- `preset_lifecycle_probe`
|
|
306
|
+
- `project_boundary_report`
|
|
307
|
+
|
|
308
|
+
Safe project actions require `_mcp_` names and temp paths by default. Database
|
|
309
|
+
switching dry-runs by default because Resolve closes open projects when
|
|
310
|
+
switching databases. Archive source media/cache/proxy flags are rejected unless
|
|
311
|
+
explicitly opted in.
|
|
312
|
+
|
|
313
|
+
**`project_manager_folders`** — Navigate project folders.
|
|
314
|
+
|
|
315
|
+
Key actions: `list`, `get_current`, `create(name)`, `open(name)`, `goto_root`,
|
|
316
|
+
`goto_parent`
|
|
317
|
+
|
|
318
|
+
**`project_manager_database`** — Switch databases.
|
|
319
|
+
|
|
320
|
+
Key actions: `get_current`, `list`, `set_current(db_info)`
|
|
321
|
+
|
|
322
|
+
**`project_manager_cloud`** — Cloud projects (requires Resolve cloud
|
|
323
|
+
infrastructure; most users will not have this).
|
|
324
|
+
|
|
325
|
+
**`project_settings`** — Project metadata, settings, color groups, and misc
|
|
326
|
+
operations on the open project.
|
|
327
|
+
|
|
328
|
+
Key actions: `get_name`, `set_name(name)`, `get_setting(name?)`,
|
|
329
|
+
`set_setting(name, value)`, `get_color_groups`, `add_color_group(name)`,
|
|
330
|
+
`delete_color_group(name)`, `export_frame_as_still(path)`,
|
|
331
|
+
`load_burnin_preset(name)`, `insert_audio(media_path, ...)`,
|
|
332
|
+
`apply_fairlight_preset(preset_name)`
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
### Media
|
|
337
|
+
|
|
338
|
+
**`media_storage`** — Browse mounted volumes and import files.
|
|
339
|
+
|
|
340
|
+
Key actions: `get_volumes`, `get_subfolders(path)`, `get_files(path)`,
|
|
341
|
+
`import_to_pool(items)` — `items` is a list of file path strings
|
|
342
|
+
|
|
343
|
+
**`media_pool`** — Full Media Pool management.
|
|
344
|
+
|
|
345
|
+
Key actions: `get_root_folder`, `get_current_folder`, `set_current_folder(path)`,
|
|
346
|
+
`add_subfolder(name)`, `create_timeline(name)`, `import_timeline(path, options?)`,
|
|
347
|
+
`import_media(paths)`, `delete_clips(clip_ids)`, `move_clips(clip_ids, target_path)`,
|
|
348
|
+
`setup_multicam_timeline(name, clip_ids|angles, sync_mode?, include_audio?, dry_run?)`,
|
|
349
|
+
`get_selected`, `set_selected(clip_id)`, `export_metadata(path, clip_ids?)`
|
|
350
|
+
|
|
351
|
+
Media Pool / Ingest kernel actions (v2.8.0+) add safer agent-facing workflows:
|
|
352
|
+
`ingest_capabilities`, `probe_media_pool`, `probe_ingest_item`,
|
|
353
|
+
`safe_import_media`, `safe_import_sequence`, `safe_import_folder`,
|
|
354
|
+
`organize_clips`, `copy_metadata`, `normalize_metadata`,
|
|
355
|
+
`probe_clip_properties`, `metadata_field_inventory`, `safe_relink`,
|
|
356
|
+
`safe_unlink`, `link_proxy_checked`, `link_full_resolution_checked`,
|
|
357
|
+
`set_clip_marks`, `clear_clip_marks`, `copy_clip_annotations`,
|
|
358
|
+
`setup_multicam_timeline`, and
|
|
359
|
+
`media_pool_boundary_report`. See
|
|
360
|
+
`docs/kernels/media-pool-ingest-kernel.md` for the live-tested support map.
|
|
361
|
+
|
|
362
|
+
`setup_multicam_timeline` is a helper, not a native multicam API wrapper. It
|
|
363
|
+
creates a source-safe stacked prep timeline with one angle per video track,
|
|
364
|
+
optional matching audio tracks, and `stack_start`, `source_timecode`, or
|
|
365
|
+
explicit `record_frame` placement. Native multicam clip creation, angle
|
|
366
|
+
switching, and flattening remain Resolve UI workflows; see
|
|
367
|
+
`docs/guides/multicam-setup-guide.md`.
|
|
368
|
+
|
|
369
|
+
Note: `folder path` arguments use slash notation like `"Master/SubFolder"`.
|
|
370
|
+
`"Master"` or `"/"` refers to the root folder.
|
|
371
|
+
|
|
372
|
+
**`folder`** — Operations on a specific Media Pool folder.
|
|
373
|
+
|
|
374
|
+
Key actions: `get_clips(path?)`, `get_subfolders(path?)`, `export(path?, export_path)`,
|
|
375
|
+
`transcribe_audio(path?)`, `clear_transcription(path?)`
|
|
376
|
+
|
|
377
|
+
**`media_pool_item`** — Read/write clip metadata and properties. All actions
|
|
378
|
+
require a `clip_id` (the UUID returned by `GetUniqueId()`).
|
|
379
|
+
|
|
380
|
+
Key actions: `get_name`, `get_metadata(key?)`, `set_metadata(key, value)`,
|
|
381
|
+
`get_clip_property(key?)`, `set_clip_property(key, value)`, `get_clip_color`,
|
|
382
|
+
`set_clip_color(color)`, `link_proxy(proxy_path)`, `replace_clip(path)`,
|
|
383
|
+
`set_name(name)`, `link_full_resolution_media(path)`,
|
|
384
|
+
`replace_clip_preserve_sub_clip(path)`, `monitor_growing_file`,
|
|
385
|
+
`transcribe_audio`, `get_audio_mapping`, `get_mark_in_out`, `set_mark_in_out`
|
|
386
|
+
|
|
387
|
+
**`media_pool_item_markers`** — Markers and flags on clips in the Media Pool.
|
|
388
|
+
All actions require a `clip_id`.
|
|
389
|
+
|
|
390
|
+
Key actions: `add(frame, color, name, note, duration)`, `get_all`, `delete_by_color(color)`,
|
|
391
|
+
`delete_at_frame(frame)`, `add_flag(color)`, `get_flags`, `set_name(name)`
|
|
392
|
+
|
|
393
|
+
**`media_analysis`** — Project-scoped media intelligence and guarded metadata publishing.
|
|
394
|
+
|
|
395
|
+
Media Analysis and editorial-assist actions (v2.17.0+) add source-safe planning,
|
|
396
|
+
report reuse, session-only execution, chat-context visual review, and
|
|
397
|
+
timeline-level editorial helpers.
|
|
398
|
+
|
|
399
|
+
Key actions: `capabilities`, `install_guidance`, `resolve_output_root`, `plan`,
|
|
400
|
+
`analyze_file`, `analyze_clip`, `analyze_bin`, `analyze_project`,
|
|
401
|
+
`detect_sync_events`, `add_sync_event_markers`, `publish_clip_metadata`,
|
|
402
|
+
`summarize`, `get_report`, `build_index`, `index_status`, `query_index`,
|
|
403
|
+
`start_batch_job`, `run_batch_job_slice`, `batch_job_status`,
|
|
404
|
+
`list_batch_jobs`, `cancel_batch_job`, `resume_batch_job`,
|
|
405
|
+
`review_timeline_markers`, and `cleanup_artifacts`.
|
|
406
|
+
The tool never installs
|
|
407
|
+
dependencies and validates that outputs stay under
|
|
408
|
+
`davinci-resolve-mcp-analysis` project roots rather than beside source media.
|
|
409
|
+
Executed file/clip analysis defaults to session-only: scratch artifacts are
|
|
410
|
+
removed after structured reports are returned to the MCP response. `persist=true`
|
|
411
|
+
keeps reports under the project analysis root, and `keep_artifacts=true`
|
|
412
|
+
preserves a session scratch run for inspection. Persisted analysis refreshes the
|
|
413
|
+
local SQLite search index automatically unless `auto_build_index=false` is set;
|
|
414
|
+
`build_index` remains the manual rebuild action for existing reports. `quick`
|
|
415
|
+
uses ffprobe metadata; `standard` adds ffmpeg read-through checks,
|
|
416
|
+
cut-boundary analysis from full-stream scene detection, flash-frame candidates,
|
|
417
|
+
motion/variance scoring, analysis keyframes, and sidecar reports.
|
|
418
|
+
By default, planning checks the active project's analysis root for existing
|
|
419
|
+
reports and marks matching clips `skip_execution=true` when those reports already
|
|
420
|
+
contain the requested technical, motion, transcription, and vision layers.
|
|
421
|
+
Reports include cache signatures with source stat, depth, frame budget, prompt
|
|
422
|
+
hash, and requested modalities. Use `force_refresh=true` for a fresh read,
|
|
423
|
+
`max_report_age_days` for freshness limits, and `reuse_policy="fresh"` when
|
|
424
|
+
unsigned older reports should not be reused. Pass `reuse_existing=false` only
|
|
425
|
+
when the user explicitly wants to ignore memory.
|
|
426
|
+
Transcription requires explicit opt-in. The `analyze_media` prompt opts into
|
|
427
|
+
visual analysis by default and uses `vision.provider="chat_context"` when the
|
|
428
|
+
MCP client supports sampling; pass `include_visuals=false` to opt out. For
|
|
429
|
+
direct `media_analysis` tool calls, set `vision.enabled=true` explicitly when
|
|
430
|
+
visual interpretation is needed. Standard/deep runs prioritize first/last usable
|
|
431
|
+
frames plus before/after cut-boundary frames; those sampled frames are sent to
|
|
432
|
+
the current chat/sampling model and the response is stored in the default
|
|
433
|
+
structured JSON shape. If chat-context vision is unavailable, continue with
|
|
434
|
+
technical/motion analysis and ask whether the user wants setup steps or a
|
|
435
|
+
no-visual run. The local mock providers are for tests and do not send frames
|
|
436
|
+
off-machine.
|
|
437
|
+
Use `detect_sync_events` before multicam setup, deliverable QC, or single-camera
|
|
438
|
+
sync review when the user needs likely 2-pop or slate-clap locations. It reads
|
|
439
|
+
source audio through FFmpeg/FFprobe only, returns advisory frames/timecodes and
|
|
440
|
+
per-file `record_offset` suggestions, and never installs FFmpeg automatically.
|
|
441
|
+
It also returns marker suggestions; only call `add_sync_event_markers` after the
|
|
442
|
+
user explicitly approves marker writes, and pass `confirm=true`.
|
|
443
|
+
Use `publish_clip_metadata` when the user wants analysis to become searchable
|
|
444
|
+
inside Resolve. It analyzes or reuses reports, proposes field-specific merges
|
|
445
|
+
for `Description`, `Comments`, `Keywords`, `People`, and optional slate-derived
|
|
446
|
+
fields, stores provenance in third-party metadata, defaults to `dry_run=true`,
|
|
447
|
+
and writes Resolve metadata only when called with `confirm=true`.
|
|
448
|
+
`review_timeline_markers` creates a labeled
|
|
449
|
+
Resolve-rendered marker contact sheet plus JSON sidecar, and can request
|
|
450
|
+
chat-context vision for marker/frame mismatch review.
|
|
451
|
+
|
|
452
|
+
Before calling `analyze_*`, prefer `summarize` and `get_report` to discover
|
|
453
|
+
existing reports for the active project. If reports exist, use them as the
|
|
454
|
+
working memory for edit decisions and only request fresh analysis when a missing
|
|
455
|
+
layer changes the decision. If a user is
|
|
456
|
+
making story or audio-spine decisions and transcription is available but disabled,
|
|
457
|
+
tell them that transcript analysis may materially improve the edit instead of
|
|
458
|
+
silently skipping it. Resolve-native transcription changes project state; use it
|
|
459
|
+
only when that mutation is intentional.
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
### Timelines
|
|
464
|
+
|
|
465
|
+
**`timeline`** — Timeline operations: tracks, clips, import/export, generators.
|
|
466
|
+
|
|
467
|
+
Key actions:
|
|
468
|
+
- `list` — all timelines in the project
|
|
469
|
+
- `get_current` — current timeline info
|
|
470
|
+
- `set_current(index)` — switch timeline by 1-based index
|
|
471
|
+
- `get_track_count(track_type)` — track_type: `"video"`, `"audio"`, `"subtitle"`
|
|
472
|
+
- `add_track(track_type, sub_type?)` / `delete_track(track_type, index)`
|
|
473
|
+
- `get_items(track_type, index)` — items on a track
|
|
474
|
+
- `delete_clips(clip_ids, ripple?)` — IDs are unique IDs from `get_items`
|
|
475
|
+
- `duplicate_clips(clip_ids?, selected?, target_track_index?, track_offset?, placement?, record_frame?, record_frame_offset?, copy_properties?, include_linked?)` —
|
|
476
|
+
duplicate existing video timeline items by re-appending the same Media Pool
|
|
477
|
+
item with the same source trim; `selected=True` uses Resolve's selected/current
|
|
478
|
+
item when available, `placement` supports `"same_time"`, `"offset"`,
|
|
479
|
+
`"at_playhead"`, `"track_above"`, `"after_source"`, and `"next_gap"`, and
|
|
480
|
+
`include_linked=True` duplicates linked audio and restores link state.
|
|
481
|
+
`copy_properties` can copy `transform`, `crop`, `composite`, `audio`,
|
|
482
|
+
`retime`, `dynamic_zoom`, `scaling`, `stabilization`, `clip_color`,
|
|
483
|
+
`markers`, `flags`, `enabled`, `cache`, `voice_isolation`, `fusion`,
|
|
484
|
+
`grades`, `takes`, and `keyframes`; `transitions` is accepted but reported
|
|
485
|
+
unsupported because Resolve's public scripting API does not expose transition
|
|
486
|
+
cloning. `copy_keyframes=True` adds the `keyframes` group.
|
|
487
|
+
- `copy_clips(...)` / `move_clips(...)` — same safe append path; `move_clips`
|
|
488
|
+
deletes successfully duplicated source items afterward
|
|
489
|
+
- `copy_range` / `duplicate_range` — copy exact video/audio source segments
|
|
490
|
+
from `start_frame`/`end_frame` or mark in/out to `record_frame`
|
|
491
|
+
- `overwrite_range` — delete whole destination overlaps, then copy the exact
|
|
492
|
+
range segment
|
|
493
|
+
- `lift_range` — delete whole items in a range; partial overlaps require
|
|
494
|
+
`allow_partial_item_delete=True` because Resolve does not expose a safe
|
|
495
|
+
partial lift primitive here
|
|
496
|
+
- `story_spine_report` — read markers, source ranges, and audio/video structure
|
|
497
|
+
into an editor-facing beat report
|
|
498
|
+
- `create_variant_from_ranges(name, ranges, markers?, cdl?, dry_run?)` — create
|
|
499
|
+
a guarded timeline variant from declarative source ranges, optional markers,
|
|
500
|
+
transforms, and CDL
|
|
501
|
+
- `bulk_set_item_properties(ops, dry_run?, readback?)` — apply transforms,
|
|
502
|
+
crop/composite/audio/property groups to many timeline items in one call
|
|
503
|
+
- `apply_look_to_items(target_ids, cdl?|copy_from_item_id?, dry_run?)` — apply a
|
|
504
|
+
normalized CDL and/or copy a source grade to multiple video items
|
|
505
|
+
- `thumbnail_contact_sheet` / `marker_thumbnail_review` — sample Resolve-rendered
|
|
506
|
+
thumbnails under the project analysis root for visual verification
|
|
507
|
+
- `edit_kernel_capabilities` — report supported, partially supported, and
|
|
508
|
+
unsupported timeline edit kernel behavior
|
|
509
|
+
- `probe_edit_kernel_item(clip_ids? selected? timeline_item?)` — read-only
|
|
510
|
+
capability/property probe for timeline items, including available item
|
|
511
|
+
methods, `GetProperty()` values, known property keys, keyframe counts, and
|
|
512
|
+
linked item summaries
|
|
513
|
+
- `title_property_scan(clip_id|timeline_item_id|timeline_item)` — inspect
|
|
514
|
+
undocumented Edit-page title/generator `TimelineItem.GetProperty()` keys
|
|
515
|
+
- `set_title_text(clip_id|..., text, property_key?, as_styled_xml?, try_plain_first?, try_heuristic_keys?, readback?)`
|
|
516
|
+
/ `bulk_set_title_text(ops, ...)` — update title text via explicit or scanned
|
|
517
|
+
keys when the current Resolve build accepts the `SetProperty()` write
|
|
518
|
+
- `export(path, type, subtype?)` — type: `"AAF"`, `"EDL"`, `"FCPXML"`, `"DRT"`, etc.
|
|
519
|
+
- `insert_generator(name)`, `insert_title(name)`, `insert_fusion_title(name)`
|
|
520
|
+
- `get_mark_in_out`, `set_mark_in_out(mark_in, mark_out, type?)`
|
|
521
|
+
- `duplicate(name?)` — duplicate the current timeline
|
|
522
|
+
- `get_voice_isolation_state(track_index)` / `set_voice_isolation_state`
|
|
523
|
+
- `extract_source_frame_ranges(handles?, gap_max?, skip_extensions?)` — return
|
|
524
|
+
inclusive source frame ranges for current-timeline video clips, with fixed
|
|
525
|
+
handles or gap-only auto handles when `handles=0`
|
|
526
|
+
|
|
527
|
+
Timeline Conform / Interchange kernel actions (v2.13.0+) add live-tested
|
|
528
|
+
structure, interchange, comparison, missing-media, and relink-planning helpers:
|
|
529
|
+
|
|
530
|
+
- `conform_capabilities`
|
|
531
|
+
- `probe_timeline_structure(track_types?, include_markers?, include_clip_properties?)`
|
|
532
|
+
- `detect_gaps_overlaps(track_types?, min_gap?)`
|
|
533
|
+
- `source_range_report(handles?, merge?)`
|
|
534
|
+
- `export_timeline_checked(path, format?|type?, subtype?, require_temp_path?, dry_run?)`
|
|
535
|
+
- `import_timeline_checked(path, options?, timeline_name?, import_source_clips?, require_temp_path?, dry_run?)`
|
|
536
|
+
- `compare_timelines(right_timeline_id?|right_timeline_index?|left_snapshot?, right_snapshot?)`
|
|
537
|
+
- `probe_interchange_roundtrip(format?, output_dir?, cleanup_imported?)`
|
|
538
|
+
- `detect_missing_media`
|
|
539
|
+
- `build_relink_plan(search_roots)`
|
|
540
|
+
- `conform_boundary_report`
|
|
541
|
+
|
|
542
|
+
Audio / Fairlight kernel actions (v2.14.0+) add live-tested audio state,
|
|
543
|
+
mapping, voice-isolation, sync, transcription, subtitle, and Fairlight boundary
|
|
544
|
+
helpers:
|
|
545
|
+
|
|
546
|
+
- `audio_capabilities`
|
|
547
|
+
- `probe_audio_track(track_index?)`
|
|
548
|
+
- `probe_audio_item(track_type?, track_index?, item_index?)`
|
|
549
|
+
- `safe_set_audio_properties(properties, restore?, dry_run?, track_type?, track_index?, item_index?)`
|
|
550
|
+
- `audio_mix_capability_report(...)`
|
|
551
|
+
- `voice_isolation_capabilities(track_index?, track_type?, item_index?)`
|
|
552
|
+
- `audio_mapping_report(clip_ids?)`
|
|
553
|
+
- `safe_auto_sync_audio(clip_ids|selected, settings?, dry_run?)`
|
|
554
|
+
- `transcription_capabilities(clip_ids?|selected?)`
|
|
555
|
+
- `subtitle_generation_probe(settings?, allow_generate?)`
|
|
556
|
+
- `fairlight_boundary_report`
|
|
557
|
+
|
|
558
|
+
**`timeline_markers`** — Markers and playhead on the current timeline.
|
|
559
|
+
|
|
560
|
+
Key actions: `add(frame|frame_id|timecode?, color?, name?, note?, duration?)`, `get_all`,
|
|
561
|
+
`get_current_timecode`, `set_current_timecode(timecode)`,
|
|
562
|
+
`get_current_video_item`, `get_thumbnail`, `get_thumbnail_image`
|
|
563
|
+
|
|
564
|
+
Review Annotation kernel actions (v2.10.0+) add a unified review layer across
|
|
565
|
+
timeline, timeline item, and media pool item scopes: `annotation_capabilities`,
|
|
566
|
+
`probe_annotations`, `normalize_marker_payload`, `copy_annotations`,
|
|
567
|
+
`move_annotations`, `sync_marker_custom_data`, `clear_annotations_by_scope`,
|
|
568
|
+
`export_review_report`, and `annotation_boundary_report`. See
|
|
569
|
+
`docs/kernels/review-annotation-kernel.md` for the live-tested scope and boundary map.
|
|
570
|
+
|
|
571
|
+
For `add`, omit `frame`/`timecode` to create the marker at the current playhead.
|
|
572
|
+
The compound tool accepts `frame`, `frame_id`, and `frameId` aliases.
|
|
573
|
+
|
|
574
|
+
Note: `get_thumbnail` returns raw pixel data from `GetCurrentClipThumbnailImage()`.
|
|
575
|
+
The dictionary includes `data` (raw bytes as a Python bytes-like object),
|
|
576
|
+
`format`, `width`, `height`, `noOfComponents`, and `depth`. This reflects the
|
|
577
|
+
current frame as rendered by Resolve — including any color grading or effects
|
|
578
|
+
applied — which is different from reading the source file directly.
|
|
579
|
+
|
|
580
|
+
Use `get_thumbnail_image` when the MCP client can display image content directly.
|
|
581
|
+
It converts the same Resolve thumbnail payload to PNG bytes without writing a
|
|
582
|
+
file to disk.
|
|
583
|
+
|
|
584
|
+
**`timeline_ai`** — AI/ML analysis on the current timeline.
|
|
585
|
+
|
|
586
|
+
Key actions: `create_subtitles(settings?)`, `detect_scene_cuts`,
|
|
587
|
+
`grab_still`, `grab_all_stills(source?)`, `analyze_dolby_vision`
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
### Timeline Items
|
|
592
|
+
|
|
593
|
+
Timeline items are identified by `track_type`, `track_index`, and `item_index`
|
|
594
|
+
(all default to `"video"`, `1`, `0` respectively — the first clip on the first
|
|
595
|
+
video track). Always retrieve item IDs via `timeline.get_items` before operating
|
|
596
|
+
on specific items.
|
|
597
|
+
|
|
598
|
+
**`timeline_item`** — Properties, transform, speed, audio, keyframes.
|
|
599
|
+
|
|
600
|
+
Key actions:
|
|
601
|
+
- `get_property(key?)` / `set_property(key, value)` — raw property access
|
|
602
|
+
- `get_name` / `set_name(name)`
|
|
603
|
+
- `get_duration`, `get_start`, `get_end`
|
|
604
|
+
- `get_retime` / `set_retime(process?, motion_estimation?)`
|
|
605
|
+
- process: `"nearest"`, `"frame_blend"`, `"optical_flow"` (or 0–3)
|
|
606
|
+
- motion_estimation: integer 0–6
|
|
607
|
+
- `get_transform` / `set_transform(Pan?, Tilt?, ZoomX?, ZoomY?, RotationAngle?, ...)`
|
|
608
|
+
- `get_crop` / `set_crop(CropLeft?, CropRight?, CropTop?, CropBottom?, ...)`
|
|
609
|
+
- `get_composite` / `set_composite(Opacity?, CompositeMode?)`
|
|
610
|
+
- `get_audio` / `set_audio(Volume?, Pan?, AudioSyncOffset?)`
|
|
611
|
+
- `get_voice_isolation_state` / `set_voice_isolation_state(state)` — Resolve
|
|
612
|
+
20.1+; audio timeline items only
|
|
613
|
+
- `get_keyframes(property)`, `add_keyframe(property, frame, value)`,
|
|
614
|
+
`modify_keyframe`, `delete_keyframe`, `set_keyframe_interpolation`
|
|
615
|
+
- interpolation values: `"Linear"`, `"Bezier"`, `"EaseIn"`, `"EaseOut"`, `"EaseInOut"`
|
|
616
|
+
- `get_unique_id` — use this to get the ID for other tool calls
|
|
617
|
+
- `get_media_pool_item` — get the source clip from the Media Pool
|
|
618
|
+
|
|
619
|
+
**`timeline_item_markers`** — Markers, flags, clip color on timeline items.
|
|
620
|
+
|
|
621
|
+
**`timeline_item_fusion`** — Fusion comp management on timeline items.
|
|
622
|
+
|
|
623
|
+
Key actions: `add_comp`, `get_comp_count`, `get_comp_names`, `export_comp(path, index)`,
|
|
624
|
+
`import_comp(path)`, `delete_comp(name)`, `load_comp(name)`, `rename_comp`,
|
|
625
|
+
`get_cache_enabled`, `set_cache(value)` — value: `"Auto"`, `"On"`, `"Off"`
|
|
626
|
+
|
|
627
|
+
**`timeline_item_color`** — Color grading on timeline items. Requires Color page
|
|
628
|
+
for most operations.
|
|
629
|
+
|
|
630
|
+
Key actions:
|
|
631
|
+
- `set_cdl(cdl)` — cdl: `{NodeIndex, Slope, Offset, Power, Saturation}`
|
|
632
|
+
- Slope/Offset/Power can be arrays `[R, G, B]` or strings like `"1.0 1.0 1.0"`
|
|
633
|
+
- `add_version(name, type?)`, `load_version(name, type?)`, `get_version_names(type?)`
|
|
634
|
+
- type: `0` = local, `1` = remote
|
|
635
|
+
- `assign_color_group(group_name)`, `remove_from_color_group`
|
|
636
|
+
- `export_lut(type, path)`
|
|
637
|
+
- `reset_all_node_colors` — Resolve 20.2+; resets node colors for the active
|
|
638
|
+
clip version
|
|
639
|
+
- `stabilize`, `smart_reframe`
|
|
640
|
+
- `create_magic_mask(mode)` — mode: `"F"` forward, `"B"` backward, `"BI"` bidirectional
|
|
641
|
+
(requires DaVinci Neural Engine and Color page)
|
|
642
|
+
|
|
643
|
+
Color / Grade kernel actions (v2.11.0+) add safer grade inspection and
|
|
644
|
+
boundary helpers: `grade_capabilities`, `probe_grade_item`,
|
|
645
|
+
`probe_node_graph`, `safe_set_cdl`, `safe_copy_grade`, `safe_apply_drx`,
|
|
646
|
+
`safe_export_lut`, `grade_version_snapshot`, `grade_version_restore`,
|
|
647
|
+
`color_group_capabilities`, `gallery_capabilities`, and
|
|
648
|
+
`grade_boundary_report`. See `docs/kernels/color-grade-kernel.md` for the live-tested
|
|
649
|
+
support map, and `docs/guides/color-decision-guide.md` for the practical distinction
|
|
650
|
+
between direct API color controls and opaque full-grade artifacts.
|
|
651
|
+
|
|
652
|
+
**`timeline_item_takes`** — Take management.
|
|
653
|
+
|
|
654
|
+
Key actions: `add(clip_id, start_frame?, end_frame?)`, `get_count`,
|
|
655
|
+
`get_selected_index`, `select(index)`, `delete(index)`, `finalize`
|
|
656
|
+
|
|
657
|
+
---
|
|
658
|
+
|
|
659
|
+
### Gallery
|
|
660
|
+
|
|
661
|
+
**`gallery`** — Gallery album management.
|
|
662
|
+
|
|
663
|
+
Key actions: `get_still_albums`, `get_current_album`, `set_current_album(album_index)`,
|
|
664
|
+
`create_still_album`, `create_power_grade_album`
|
|
665
|
+
|
|
666
|
+
**`gallery_stills`** — Manage stills within an album. Requires Color page.
|
|
667
|
+
|
|
668
|
+
Key actions:
|
|
669
|
+
- `get_stills(album_index?)` — returns count
|
|
670
|
+
- `get_label(still_index)` / `set_label(still_index, label)`
|
|
671
|
+
- `import_stills(paths)` — paths to `.drx` files
|
|
672
|
+
- `export_stills(folder_path, prefix?, format?, album_index?)`
|
|
673
|
+
- formats: `dpx`, `cin`, `tif`, `jpg`, `png`, `ppm`, `bmp`, `xpm`, `drx`
|
|
674
|
+
- `grab_and_export(folder_path, prefix?, format?, album_index?, cleanup?)` —
|
|
675
|
+
grabs a still from the current frame and exports it in one atomic call.
|
|
676
|
+
Returns `{files, format, folder, cleaned_up}` where each file entry includes
|
|
677
|
+
`data_base64` for image files and `data` (text) for `.drx` grade files.
|
|
678
|
+
`cleanup` defaults to `true` — files are deleted from disk after being inlined.
|
|
679
|
+
Requires Color page with Gallery panel visible.
|
|
680
|
+
- `delete_stills(still_indices)`
|
|
681
|
+
|
|
682
|
+
---
|
|
683
|
+
|
|
684
|
+
### Node Graphs
|
|
685
|
+
|
|
686
|
+
**`graph`** — Node graph operations on timeline, timeline item, or color group.
|
|
687
|
+
|
|
688
|
+
The `source` parameter controls which graph you target:
|
|
689
|
+
- `"timeline"` (default) — the timeline node graph
|
|
690
|
+
- `"item"` — a specific timeline item (needs `track_type`, `track_index`, `item_index`)
|
|
691
|
+
- `"color_group_pre"` / `"color_group_post"` — group pre/post graphs (needs `group_name`)
|
|
692
|
+
|
|
693
|
+
Key actions: `get_num_nodes(source?)`, `set_lut(node_index, lut_path, source?)`,
|
|
694
|
+
`get_lut(node_index, source?)`, `get_node_label(node_index, source?)`,
|
|
695
|
+
`set_node_enabled(node_index, enabled, source?)`,
|
|
696
|
+
`apply_grade_from_drx(path, grade_mode?, source?)` — grade_mode: `0`=no keyframes,
|
|
697
|
+
`1`=source timecode aligned, `2`=start frames aligned,
|
|
698
|
+
`reset_all_grades(source?)`
|
|
699
|
+
|
|
700
|
+
**`color_group`** — Manage color groups.
|
|
701
|
+
|
|
702
|
+
Key actions: `list`, `get_name(group_name)`, `set_name(group_name, new_name)`,
|
|
703
|
+
`get_clips(group_name)`, `get_pre_clip_graph(group_name)`,
|
|
704
|
+
`get_post_clip_graph(group_name)`
|
|
705
|
+
|
|
706
|
+
---
|
|
707
|
+
|
|
708
|
+
### Fusion
|
|
709
|
+
|
|
710
|
+
**`fusion_comp`** — Fusion composition node graph operations.
|
|
711
|
+
|
|
712
|
+
Target a comp either from a timeline item (pass `clip_id`, `timeline_item_id`, or
|
|
713
|
+
`timeline_item={track_type, track_index, item_index}`) or from the active Fusion
|
|
714
|
+
page comp (omit timeline scope).
|
|
715
|
+
|
|
716
|
+
Key actions:
|
|
717
|
+
- `add_tool(tool_type, x?, y?, name?)` — common types: `Merge`, `Background`,
|
|
718
|
+
`TextPlus`, `Transform`, `Blur`, `ColorCorrector`, `RectangleMask`,
|
|
719
|
+
`EllipseMask`, `Tracker`, `MediaIn`, `MediaOut`, `Glow`, `DeltaKeyer`,
|
|
720
|
+
`UltraKeyer`, `FilmGrain`, `CornerPositioner`
|
|
721
|
+
- `delete_tool(tool_name)`, `get_tool_list(type?)`, `find_tool(name)`
|
|
722
|
+
- `connect(target_tool, input_name, source_tool, output_name?)`
|
|
723
|
+
- `disconnect(tool_name, input_name)`
|
|
724
|
+
- `set_input(tool_name, input_name, value, time?)` /
|
|
725
|
+
`get_input(tool_name, input_name, time?)`
|
|
726
|
+
- `get_inputs(tool_name)` / `get_outputs(tool_name)`
|
|
727
|
+
- `set_attrs(tool_name, attrs)` / `get_attrs(tool_name)`
|
|
728
|
+
- `add_keyframe(tool_name, input_name, time, value)`
|
|
729
|
+
- `get_comp_info`, `set_frame_range(start, end)`, `render`
|
|
730
|
+
- `start_undo(name?)` / `end_undo(keep?)`
|
|
731
|
+
- `bulk_set_inputs(ops)` — batch set inputs across multiple timeline item comps in
|
|
732
|
+
one call; each op requires timeline scope plus `tool_name`, `input_name`, `value`
|
|
733
|
+
|
|
734
|
+
Fusion Composition kernel actions (v2.12.0+) add safer graph inspection and
|
|
735
|
+
mutation wrappers around the raw Fusion API:
|
|
736
|
+
|
|
737
|
+
- `fusion_graph_capabilities`
|
|
738
|
+
- `probe_fusion_comp(include_io?, max_tools?)`
|
|
739
|
+
- `probe_fusion_tool(tool_name, include_io?)`
|
|
740
|
+
- `safe_add_tool(tool_type, name?, dry_run?)`
|
|
741
|
+
- `safe_set_inputs(tool_name, inputs, readback?)`
|
|
742
|
+
- `safe_connect_tools(target_tool, input_name, source_tool, dry_run?)`
|
|
743
|
+
- `fusion_boundary_report(include_io?)`
|
|
744
|
+
|
|
745
|
+
---
|
|
746
|
+
|
|
747
|
+
### Render
|
|
748
|
+
|
|
749
|
+
**`render`** — Render pipeline: jobs, presets, formats, codecs.
|
|
750
|
+
|
|
751
|
+
Key actions: `add_job`, `list_jobs`, `delete_job(job_id)`, `delete_all_jobs`,
|
|
752
|
+
`start(job_ids?, interactive?)`, `stop`, `is_rendering`, `get_formats`,
|
|
753
|
+
`get_codecs(format)`, `set_format_and_codec(format, codec)`,
|
|
754
|
+
`get_resolutions(format, codec)`, `set_settings(settings)`,
|
|
755
|
+
`list_presets`, `load_preset(name)`, `save_preset(name)`,
|
|
756
|
+
`quick_export_presets`, `quick_export(preset, params?)`
|
|
757
|
+
|
|
758
|
+
Render / Deliver kernel actions (v2.9.0+) add planning and safety layers:
|
|
759
|
+
`render_capabilities`, `probe_render_matrix`, `probe_render_settings`,
|
|
760
|
+
`validate_render_settings`, `safe_set_render_settings`,
|
|
761
|
+
`prepare_render_job`, `render_job_lifecycle_probe`,
|
|
762
|
+
`quick_export_capabilities`, `safe_quick_export`, and
|
|
763
|
+
`export_render_boundary_report`. See `docs/kernels/render-deliver-kernel.md` for the
|
|
764
|
+
live-tested format/codec, settings, job, and Quick Export boundary map.
|
|
765
|
+
|
|
766
|
+
---
|
|
767
|
+
|
|
768
|
+
## Common Workflows
|
|
769
|
+
|
|
770
|
+
### 1. Connect and verify
|
|
771
|
+
|
|
772
|
+
```
|
|
773
|
+
resolve_control(action="launch")
|
|
774
|
+
resolve_control(action="get_version")
|
|
775
|
+
resolve_control(action="mcp_update_status")
|
|
776
|
+
setup(action="get_defaults")
|
|
777
|
+
resolve_control(action="get_page")
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
Always call `launch` first in a new session. It is safe to call when Resolve is
|
|
781
|
+
already running.
|
|
782
|
+
|
|
783
|
+
Use `setup(action="schema")`, `setup(action="get_defaults")`, and
|
|
784
|
+
`setup(action="set_defaults")` when the user wants durable conversation
|
|
785
|
+
defaults for media analysis, metadata publishing, timed markers, report style,
|
|
786
|
+
or MCP update behavior. Setup defaults may shape future tool parameters, but
|
|
787
|
+
confirmed Resolve project writes still require the relevant action's explicit
|
|
788
|
+
confirmation flag.
|
|
789
|
+
|
|
790
|
+
### 2. Open a project and navigate timelines
|
|
791
|
+
|
|
792
|
+
```
|
|
793
|
+
project_manager(action="list")
|
|
794
|
+
project_manager(action="load", params={"name": "My Film"})
|
|
795
|
+
timeline(action="list")
|
|
796
|
+
timeline(action="set_current", params={"index": 2})
|
|
797
|
+
timeline(action="get_current")
|
|
798
|
+
```
|
|
799
|
+
|
|
800
|
+
### 3. Add clips to Media Pool and build a timeline
|
|
801
|
+
|
|
802
|
+
```
|
|
803
|
+
media_storage(action="get_volumes")
|
|
804
|
+
media_storage(action="import_to_pool", params={"items": ["/path/to/clip.mp4"]})
|
|
805
|
+
media_pool(action="get_current_folder")
|
|
806
|
+
media_pool(action="create_timeline", params={"name": "Assembly"})
|
|
807
|
+
media_pool(action="get_selected")
|
|
808
|
+
media_pool(action="append_to_timeline", params={"clip_ids": ["<uuid>", ...]})
|
|
809
|
+
media_pool(action="safe_import_sequence", params={
|
|
810
|
+
"pattern": "/path/to/frames/shot_%04d.dpx",
|
|
811
|
+
"start_index": 1001,
|
|
812
|
+
"end_index": 1048,
|
|
813
|
+
"target_folder": "Master/Plates"
|
|
814
|
+
})
|
|
815
|
+
media_pool(action="media_pool_boundary_report", params={"selected": True, "depth": 2})
|
|
816
|
+
# Positioned append (MediaPool.AppendToTimeline([{clipInfo}, ...])) — e.g. rebuild a subtitle row after delete_clips
|
|
817
|
+
media_pool(action="append_to_timeline", params={"clip_infos": [
|
|
818
|
+
{"clip_id": "<uuid>", "start_frame": 0, "end_frame": 100, "record_frame": 1200, "track_index": 4}
|
|
819
|
+
]})
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
### 4. Inspect and annotate timeline items
|
|
823
|
+
|
|
824
|
+
```
|
|
825
|
+
timeline(action="get_items", params={"track_type": "video", "index": 1})
|
|
826
|
+
timeline(action="duplicate_clips", params={
|
|
827
|
+
"clip_ids": ["<timeline-item-uuid>"], "target_track_index": 2, "record_frame_offset": 120
|
|
828
|
+
})
|
|
829
|
+
timeline(action="duplicate_clips", params={
|
|
830
|
+
"selected": True,
|
|
831
|
+
"placement": "track_above",
|
|
832
|
+
"include_linked": True,
|
|
833
|
+
"copy_properties": ["transform", "crop", "composite", "audio", "dynamic_zoom", "scaling", "stabilization", "clip_color", "markers", "enabled"],
|
|
834
|
+
"copy_keyframes": True
|
|
835
|
+
})
|
|
836
|
+
timeline(action="probe_edit_kernel_item", params={"selected": True})
|
|
837
|
+
timeline(action="copy_range", params={
|
|
838
|
+
"start_frame": 110, "end_frame": 130, "record_frame": 900,
|
|
839
|
+
"track_types": ["video", "audio"], "target_track_index": 2
|
|
840
|
+
})
|
|
841
|
+
timeline_item(action="get_name", params={"track_type": "video", "track_index": 1, "item_index": 0})
|
|
842
|
+
timeline_item(action="get_property", params={"track_type": "video", "track_index": 1, "item_index": 0})
|
|
843
|
+
timeline_markers(action="add", params={"color": "Blue", "note": "Review this"})
|
|
844
|
+
timeline_item_markers(action="add", params={"frame": 100, "color": "Blue", "name": "Review", "note": "Check this", "duration": 1, "track_type": "video", "track_index": 1, "item_index": 0})
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
For an exhaustive live boundary map of the timeline edit kernel, run:
|
|
848
|
+
|
|
849
|
+
```
|
|
850
|
+
python3.11 tests/live_duplicate_clips_validation.py --output-dir /tmp/timeline-kernel-probe
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
The live harness first validates duplicate/range edit behavior, then runs the
|
|
854
|
+
exhaustive probe. It creates disposable projects with synthetic media, emits
|
|
855
|
+
JSON and Markdown reports, and classifies each API surface as `supported`,
|
|
856
|
+
`partially_supported`, `read_only`, `write_only_unverifiable`,
|
|
857
|
+
`version_or_page_dependent`, `unsupported`, `not_applicable`, or `error`.
|
|
858
|
+
See `docs/kernels/timeline-edit-kernel.md` for the maintained support map and current
|
|
859
|
+
Resolve API limitations.
|
|
860
|
+
|
|
861
|
+
For the Media Pool / Ingest boundary map, run:
|
|
862
|
+
|
|
863
|
+
```
|
|
864
|
+
python3.11 tests/live_media_pool_ingest_validation.py --output-dir /tmp/media-pool-ingest-probe
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
The harness creates a disposable project, generates synthetic video/audio/still
|
|
868
|
+
and image-sequence fixtures, probes safe import/metadata/annotation/link
|
|
869
|
+
helpers, writes JSON and Markdown reports, deletes the project, and removes the
|
|
870
|
+
generated media directory. See `docs/kernels/media-pool-ingest-kernel.md`.
|
|
871
|
+
|
|
872
|
+
For the Review Annotation boundary map, run:
|
|
873
|
+
|
|
874
|
+
```
|
|
875
|
+
python3.11 tests/live_review_annotation_validation.py --output-dir /tmp/review-annotation-probe
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
The harness creates a disposable project, generates synthetic video/audio media,
|
|
879
|
+
probes timeline, timeline item, and media pool item marker/flag/color/report
|
|
880
|
+
behavior, writes JSON and Markdown reports, deletes the project, and removes the
|
|
881
|
+
generated media directory. See `docs/kernels/review-annotation-kernel.md`.
|
|
882
|
+
|
|
883
|
+
### 5. Color grading
|
|
884
|
+
|
|
885
|
+
```
|
|
886
|
+
resolve_control(action="open_page", params={"page": "color"})
|
|
887
|
+
timeline_item_color(action="set_cdl", params={"cdl": {"NodeIndex": 1, "Slope": [1.1, 1.0, 0.9], "Offset": [0.0, 0.0, 0.0], "Power": [1.0, 1.0, 1.0], "Saturation": 1.0}, "track_type": "video", "track_index": 1, "item_index": 0})
|
|
888
|
+
timeline_item_color(action="add_version", params={"name": "Grade v2", "track_type": "video", "track_index": 1, "item_index": 0})
|
|
889
|
+
timeline_item_color(action="grade_boundary_report", params={"track_type": "video", "track_index": 1, "item_index": 0})
|
|
890
|
+
timeline_item_color(action="safe_export_lut", params={"type": "33ptcube", "path": "/tmp/look.cube", "track_type": "video", "track_index": 1, "item_index": 0})
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
For the Color / Grade boundary map, run:
|
|
894
|
+
|
|
895
|
+
```
|
|
896
|
+
python3.11 tests/live_color_grade_validation.py --output-dir /tmp/color-grade-probe
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
The harness creates a disposable project, generates synthetic color-bar media,
|
|
900
|
+
probes grade, node graph, version, copy, LUT, Gallery, and color-group
|
|
901
|
+
behavior, writes JSON and Markdown reports, deletes the project, and removes
|
|
902
|
+
generated media and exported probe files. See `docs/kernels/color-grade-kernel.md`.
|
|
903
|
+
|
|
904
|
+
### 6. Grab a still and read the grade data
|
|
905
|
+
|
|
906
|
+
```
|
|
907
|
+
resolve_control(action="open_page", params={"page": "color"})
|
|
908
|
+
gallery_stills(action="grab_and_export", params={"folder_path": "/tmp/stills", "format": "jpg"})
|
|
909
|
+
```
|
|
910
|
+
|
|
911
|
+
The response includes `files[].data_base64` (the image as base64) and
|
|
912
|
+
`files[].data` for the companion `.drx` grade file (plain text XML). The
|
|
913
|
+
image reflects the color-graded frame as Resolve sees it, not the raw source.
|
|
914
|
+
|
|
915
|
+
### 7. Export the timeline
|
|
916
|
+
|
|
917
|
+
```
|
|
918
|
+
timeline(action="export", params={"path": "/tmp/export.edl", "type": "EDL", "subtype": "CMX3600"})
|
|
919
|
+
timeline(action="export", params={"path": "/tmp/export.fcpxml", "type": "FCPXML"})
|
|
920
|
+
timeline(action="export_timeline_checked", params={"path": "/tmp/export.drt", "format": "drt"})
|
|
921
|
+
timeline(action="detect_gaps_overlaps")
|
|
922
|
+
timeline(action="conform_boundary_report", params={"handles": 8})
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
For the Timeline Conform / Interchange boundary map, run:
|
|
926
|
+
|
|
927
|
+
```
|
|
928
|
+
python3.11 tests/live_timeline_conform_validation.py --output-dir /tmp/timeline-conform-probe
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
The harness creates a disposable project, generates synthetic media, builds a
|
|
932
|
+
gapped timeline, probes structure, source ranges, gap/overlap detection,
|
|
933
|
+
interchange export/import/round-trip behavior, synthetic missing-media relink
|
|
934
|
+
planning, writes reports, deletes the project, and removes generated media.
|
|
935
|
+
See `docs/kernels/timeline-conform-interchange-kernel.md`.
|
|
936
|
+
|
|
937
|
+
For the Audio / Fairlight boundary map, run:
|
|
938
|
+
|
|
939
|
+
```
|
|
940
|
+
python3.11 tests/live_audio_fairlight_validation.py --output-dir /tmp/audio-fairlight-probe
|
|
941
|
+
```
|
|
942
|
+
|
|
943
|
+
The harness creates a disposable project, generates synthetic video and audio
|
|
944
|
+
media, probes track/item audio state, mappings, voice isolation, property
|
|
945
|
+
writes, auto-sync, transcription, subtitle generation, Fairlight preset listing,
|
|
946
|
+
audio insertion, writes reports, deletes the project, and removes generated
|
|
947
|
+
media. See `docs/kernels/audio-fairlight-kernel.md`.
|
|
948
|
+
|
|
949
|
+
### 8. Add and start a render job
|
|
950
|
+
|
|
951
|
+
```
|
|
952
|
+
render(action="get_formats")
|
|
953
|
+
render(action="probe_render_matrix")
|
|
954
|
+
render(action="set_format_and_codec", params={"format": "QuickTime", "codec": "H.265 Master"})
|
|
955
|
+
render(action="validate_render_settings", params={"settings": {"TargetDir": "/tmp/renders", "CustomName": "review", "SelectAllFrames": true}, "require_temp_target": true})
|
|
956
|
+
render(action="prepare_render_job", params={"target_dir": "/tmp/renders", "settings": {"CustomName": "review", "SelectAllFrames": true}})
|
|
957
|
+
render(action="add_job")
|
|
958
|
+
render(action="list_jobs")
|
|
959
|
+
render(action="start")
|
|
960
|
+
render(action="is_rendering")
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
For the Render / Deliver boundary map, run:
|
|
964
|
+
|
|
965
|
+
```
|
|
966
|
+
python3.11 tests/live_render_deliver_validation.py --output-dir /tmp/render-deliver-probe
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
The harness creates a disposable project, generates a synthetic timeline, probes
|
|
970
|
+
format/codec/resolution compatibility, validates settings, runs a tiny temp
|
|
971
|
+
render job, writes reports, deletes the project, and removes generated media and
|
|
972
|
+
render outputs.
|
|
973
|
+
|
|
974
|
+
### 9. Apply a Fusion effect to a timeline item
|
|
975
|
+
|
|
976
|
+
```
|
|
977
|
+
timeline_item_fusion(action="add_comp", params={"track_type": "video", "track_index": 1, "item_index": 0})
|
|
978
|
+
fusion_comp(action="add_tool", params={"tool_type": "Glow", "timeline_item": {"track_type": "video", "track_index": 1, "item_index": 0}})
|
|
979
|
+
fusion_comp(action="set_input", params={"tool_name": "Glow1", "input_name": "Gain", "value": 0.8, "timeline_item": {"track_type": "video", "track_index": 1, "item_index": 0}})
|
|
980
|
+
fusion_comp(action="fusion_boundary_report", params={"timeline_item": {"track_type": "video", "track_index": 1, "item_index": 0}})
|
|
981
|
+
```
|
|
982
|
+
|
|
983
|
+
For the Fusion Composition boundary map, run:
|
|
984
|
+
|
|
985
|
+
```
|
|
986
|
+
python3.11 tests/live_fusion_composition_validation.py --output-dir /tmp/fusion-composition-probe
|
|
987
|
+
```
|
|
988
|
+
|
|
989
|
+
The harness creates a disposable project, generates synthetic video media,
|
|
990
|
+
probes timeline item comp creation, safe tool creation, input writes, graph
|
|
991
|
+
inspection, connections, bulk writes, frame range, and comp export, writes
|
|
992
|
+
reports, deletes the project, and removes generated media. See
|
|
993
|
+
`docs/kernels/fusion-composition-kernel.md`.
|
|
994
|
+
|
|
995
|
+
---
|
|
996
|
+
|
|
997
|
+
## Error Handling and Recovery
|
|
998
|
+
|
|
999
|
+
| Error message | Cause | Fix |
|
|
1000
|
+
|---|---|---|
|
|
1001
|
+
| `"Not connected to DaVinci Resolve"` | Resolve is not running or scripting is disabled | Call `resolve_control(action="launch")`, wait, retry |
|
|
1002
|
+
| `"No project open"` | No project is currently loaded | Call `project_manager(action="load", params={"name": "..."})` |
|
|
1003
|
+
| `"No current timeline"` | Project has no timeline set as current | Call `timeline(action="set_current", params={"index": 1})` |
|
|
1004
|
+
| `"No item at index N"` | `item_index` out of range for the track | Call `timeline(action="get_items", ...)` first to find valid indices |
|
|
1005
|
+
| `"Clip not found"` | Stale or wrong `clip_id` | Re-fetch IDs via `media_pool(action="get_selected")` or `folder(action="get_clips")` |
|
|
1006
|
+
| `"Gallery not available"` | Not on Color page | `resolve_control(action="open_page", params={"page": "color"})` |
|
|
1007
|
+
| `"GrabStill failed"` | Not on Color page or no clip under playhead | Switch to Color page, move playhead over a clip |
|
|
1008
|
+
| `"ExportStills failed"` | Gallery panel not open in UI | Instruct user to open Workspace > Gallery |
|
|
1009
|
+
| `"Tool '...' not found"` | Wrong tool name in Fusion comp | Use `fusion_comp(action="get_tool_list")` to list available tools |
|
|
1010
|
+
| `"Color group '...' not found"` | Group name mismatch | Use `color_group(action="list")` first |
|
|
1011
|
+
|
|
1012
|
+
When a tool returns `{"success": False}` without an error key, the underlying
|
|
1013
|
+
Resolve API returned `False`. This usually means a precondition was not met
|
|
1014
|
+
(wrong page, wrong state, context missing). Check the API reference in
|
|
1015
|
+
`docs/reference/resolve_scripting_api.txt` for the specific method.
|
|
1016
|
+
|
|
1017
|
+
---
|
|
1018
|
+
|
|
1019
|
+
## Known Gotchas
|
|
1020
|
+
|
|
1021
|
+
**Resolve API object lifetimes** — Objects like timelines, clips, and color groups
|
|
1022
|
+
returned by the API are live references that can become stale if the project state
|
|
1023
|
+
changes (e.g., the user deletes a timeline). Always re-fetch IDs after any
|
|
1024
|
+
destructive action.
|
|
1025
|
+
|
|
1026
|
+
**`SetName` on the active timeline** — `timeline(action="set_name")` returns
|
|
1027
|
+
`False` if you try to rename the currently active timeline. Switch to a different
|
|
1028
|
+
timeline first, rename, then switch back.
|
|
1029
|
+
|
|
1030
|
+
**`DeleteProject`** — Returns `False` if the project is currently open. Close it
|
|
1031
|
+
first.
|
|
1032
|
+
|
|
1033
|
+
**CDL value format** — `set_cdl` accepts Slope/Offset/Power as arrays `[R, G, B]`,
|
|
1034
|
+
tuples, or space-separated strings like `"1.0 1.0 1.0"`. All forms are normalized
|
|
1035
|
+
internally.
|
|
1036
|
+
|
|
1037
|
+
**`GetNodeGraph(0)`** — Passing `0` as `layer_index` to `GetNodeGraph` on a
|
|
1038
|
+
timeline item returns `False` in Resolve. Use `get_node_graph` without a
|
|
1039
|
+
`layer_index` to get the default graph.
|
|
1040
|
+
|
|
1041
|
+
**Gallery export requires the Gallery panel visible** — `ExportStills` only works
|
|
1042
|
+
if the Gallery panel is open in the Resolve UI on the Color page. Instruct the
|
|
1043
|
+
user to open it via Workspace menu if export fails.
|
|
1044
|
+
|
|
1045
|
+
**Python version** — Resolve's scripting library works best with Python 3.10–3.12.
|
|
1046
|
+
Python 3.13+ may cause `scriptapp("Resolve")` to return `None` due to ABI
|
|
1047
|
+
incompatibilities.
|
|
1048
|
+
|
|
1049
|
+
**Resolve version guards** — Resolve 20-specific actions return a clear
|
|
1050
|
+
`requires DaVinci Resolve 20.x+` error when called against older builds. Resolve
|
|
1051
|
+
19.1.3 remains the compatibility baseline; Resolve 20 additions were live-tested
|
|
1052
|
+
on Resolve Studio 20.3.2.
|
|
1053
|
+
|
|
1054
|
+
**Source media integrity** — Do not transcode, convert, create proxies, or write
|
|
1055
|
+
derivatives of source media unless the user explicitly asks. Analysis and tests
|
|
1056
|
+
should write sidecars or synthetic fixtures, never modify camera originals.
|
|
1057
|
+
|
|
1058
|
+
**Windows multi-Python setups** — On Windows with multiple Python installations,
|
|
1059
|
+
Resolve 20.3 may crash on import unless `PYTHONHOME` is set to the interpreter
|
|
1060
|
+
used to build the venv. The installer handles this automatically; manual configs
|
|
1061
|
+
may need it added.
|
|
1062
|
+
|
|
1063
|
+
**`item_index` is 0-based** — When specifying `item_index` in params, `0` is the
|
|
1064
|
+
first item on the track, not `1`.
|
|
1065
|
+
|
|
1066
|
+
**`track_index` is 1-based** — Track indices start at `1`, not `0`.
|
|
1067
|
+
|
|
1068
|
+
**Fusion comp scope** — `fusion_comp` actions without a timeline scope target the
|
|
1069
|
+
active composition on the Fusion page. If you intend to operate on a specific
|
|
1070
|
+
clip's comp, always pass `clip_id`, `timeline_item_id`, or `timeline_item`.
|
|
1071
|
+
|
|
1072
|
+
---
|
|
1073
|
+
|
|
1074
|
+
## Seeing What Resolve Sees (Visual Context)
|
|
1075
|
+
|
|
1076
|
+
The server provides two mechanisms to inspect a frame as Resolve has processed it,
|
|
1077
|
+
including color grading, effects, and compositing — not just the raw source file.
|
|
1078
|
+
|
|
1079
|
+
**`timeline_markers(action="get_thumbnail")`** — Returns raw thumbnail data at
|
|
1080
|
+
the current playhead position. The response is a dictionary with keys `data`,
|
|
1081
|
+
`format`, `width`, `height`, `noOfComponents`, and `depth`.
|
|
1082
|
+
|
|
1083
|
+
**`timeline_markers(action="get_thumbnail_image")`** — Converts the same current
|
|
1084
|
+
frame thumbnail to PNG bytes and returns MCP image content without writing a file.
|
|
1085
|
+
|
|
1086
|
+
**`gallery_stills(action="grab_and_export", params={...})`** — Grabs a still from
|
|
1087
|
+
the current frame on the Color page and returns the image encoded as base64 in the
|
|
1088
|
+
response (`files[].data_base64`). This is the most reliable way to get a
|
|
1089
|
+
color-graded frame preview as a standard image format (jpg, tif, dpx, etc.)
|
|
1090
|
+
that can be passed directly to a vision-capable AI model. Requires the Color page
|
|
1091
|
+
with Gallery panel visible.
|
|
1092
|
+
|
|
1093
|
+
To use `grab_and_export` for visual inspection:
|
|
1094
|
+
|
|
1095
|
+
```
|
|
1096
|
+
resolve_control(action="open_page", params={"page": "color"})
|
|
1097
|
+
gallery_stills(action="grab_and_export", params={
|
|
1098
|
+
"folder_path": "/tmp/resolve-preview",
|
|
1099
|
+
"format": "jpg",
|
|
1100
|
+
"cleanup": true
|
|
1101
|
+
})
|
|
1102
|
+
```
|
|
1103
|
+
|
|
1104
|
+
The response `files[0].data_base64` is a standard JPEG, base64-encoded. Feed it
|
|
1105
|
+
to a vision model to describe what Resolve is displaying — including all grading
|
|
1106
|
+
and effects applied to the source.
|
|
1107
|
+
|
|
1108
|
+
---
|
|
1109
|
+
|
|
1110
|
+
## Clip ID Reference Pattern
|
|
1111
|
+
|
|
1112
|
+
Many tools require a `clip_id` (the UUID of a Media Pool clip) or a timeline item
|
|
1113
|
+
identified by `track_type + track_index + item_index`. Use this pattern to resolve
|
|
1114
|
+
both:
|
|
1115
|
+
|
|
1116
|
+
```
|
|
1117
|
+
# List clips in the Media Pool
|
|
1118
|
+
folder(action="get_clips")
|
|
1119
|
+
# -> returns [{name, id}, ...] — use id as clip_id
|
|
1120
|
+
|
|
1121
|
+
# List items on a timeline track
|
|
1122
|
+
timeline(action="get_items", params={"track_type": "video", "index": 1})
|
|
1123
|
+
# -> returns [{name, id, start, end, duration}, ...]
|
|
1124
|
+
# Use track_type="video", track_index=1, item_index=<position in this list>
|
|
1125
|
+
# Or use id to look up later via timeline_item(action="get_unique_id", ...)
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
---
|
|
1129
|
+
|
|
1130
|
+
## API Coverage
|
|
1131
|
+
|
|
1132
|
+
All 336 non-deprecated methods of the DaVinci Resolve Scripting API are covered.
|
|
1133
|
+
331 methods have been live-tested across Resolve 19.1.3 Studio and Resolve
|
|
1134
|
+
20.3.2 Studio. Five methods require infrastructure not available in typical
|
|
1135
|
+
setups:
|
|
1136
|
+
|
|
1137
|
+
| Method | Requires |
|
|
1138
|
+
|---|---|
|
|
1139
|
+
| `ProjectManager.CreateCloudProject` | Resolve cloud infrastructure |
|
|
1140
|
+
| `ProjectManager.LoadCloudProject` | Resolve cloud infrastructure |
|
|
1141
|
+
| `ProjectManager.ImportCloudProject` | Resolve cloud infrastructure |
|
|
1142
|
+
| `ProjectManager.RestoreCloudProject` | Resolve cloud infrastructure |
|
|
1143
|
+
| `Timeline.AnalyzeDolbyVision` | HDR / Dolby Vision content |
|
|
1144
|
+
|
|
1145
|
+
The full API reference is in `docs/reference/resolve_scripting_api.txt`.
|