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.
Files changed (92) hide show
  1. package/AGENTS.md +85 -0
  2. package/CHANGELOG.md +802 -0
  3. package/CLAUDE.md +15 -0
  4. package/LICENSE +21 -0
  5. package/README.md +159 -0
  6. package/SECURITY.md +53 -0
  7. package/bin/davinci-resolve-mcp.mjs +376 -0
  8. package/docs/README.md +56 -0
  9. package/docs/SKILL.md +1145 -0
  10. package/docs/authoring/fuse-dctl-authoring.md +242 -0
  11. package/docs/authoring/script-plugin-authoring.md +195 -0
  12. package/docs/contributing.md +82 -0
  13. package/docs/guides/color-decision-guide.md +387 -0
  14. package/docs/guides/editorial-decision-guide.md +136 -0
  15. package/docs/guides/media-analysis-guide.md +615 -0
  16. package/docs/guides/multicam-setup-guide.md +138 -0
  17. package/docs/install.md +198 -0
  18. package/docs/integrations/workflow-integrations.md +120 -0
  19. package/docs/kernels/README.md +28 -0
  20. package/docs/kernels/audio-fairlight-kernel.md +86 -0
  21. package/docs/kernels/color-grade-kernel.md +103 -0
  22. package/docs/kernels/extension-authoring-kernel.md +101 -0
  23. package/docs/kernels/fusion-composition-kernel.md +91 -0
  24. package/docs/kernels/media-pool-ingest-kernel.md +147 -0
  25. package/docs/kernels/project-lifecycle-kernel.md +120 -0
  26. package/docs/kernels/render-deliver-kernel.md +92 -0
  27. package/docs/kernels/review-annotation-kernel.md +110 -0
  28. package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
  29. package/docs/kernels/timeline-edit-kernel.md +189 -0
  30. package/docs/notes/codec-plugin-notes.md +136 -0
  31. package/docs/notes/dctl-notes.md +234 -0
  32. package/docs/notes/fusion-template-notes.md +136 -0
  33. package/docs/notes/lut-notes.md +136 -0
  34. package/docs/notes/openfx-notes.md +120 -0
  35. package/docs/process/release-process.md +152 -0
  36. package/docs/reference/api-coverage.md +488 -0
  37. package/docs/reference/resolve_scripting_api.txt +1012 -0
  38. package/examples/README.md +53 -0
  39. package/examples/markers/README.md +81 -0
  40. package/examples/media/README.md +94 -0
  41. package/examples/timeline/README.md +98 -0
  42. package/install.py +1196 -0
  43. package/package.json +52 -0
  44. package/scripts/audit_api_parity.py +275 -0
  45. package/scripts/live_media_analysis_polish_probe.py +65 -0
  46. package/src/__init__.py +3 -0
  47. package/src/analysis_dashboard.py +4936 -0
  48. package/src/control_panel.py +13 -0
  49. package/src/granular/__init__.py +17 -0
  50. package/src/granular/common.py +727 -0
  51. package/src/granular/folder.py +287 -0
  52. package/src/granular/gallery.py +306 -0
  53. package/src/granular/graph.py +309 -0
  54. package/src/granular/media_pool.py +679 -0
  55. package/src/granular/media_pool_item.py +852 -0
  56. package/src/granular/media_storage.py +179 -0
  57. package/src/granular/project.py +1594 -0
  58. package/src/granular/resolve_control.py +521 -0
  59. package/src/granular/timeline.py +1074 -0
  60. package/src/granular/timeline_item.py +2251 -0
  61. package/src/resolve_mcp_server.py +43 -0
  62. package/src/server.py +15691 -0
  63. package/src/utils/__init__.py +3 -0
  64. package/src/utils/app_control.py +319 -0
  65. package/src/utils/audio_fairlight_live_probe.py +263 -0
  66. package/src/utils/cdl.py +20 -0
  67. package/src/utils/cloud_operations.py +192 -0
  68. package/src/utils/color_grade_live_probe.py +444 -0
  69. package/src/utils/dctl_templates.py +368 -0
  70. package/src/utils/extension_authoring_live_probe.py +292 -0
  71. package/src/utils/fuse_templates.py +1968 -0
  72. package/src/utils/fusion_composition_live_probe.py +284 -0
  73. package/src/utils/layout_presets.py +333 -0
  74. package/src/utils/mcp_stdio.py +32 -0
  75. package/src/utils/media_analysis.py +3618 -0
  76. package/src/utils/media_analysis_jobs.py +796 -0
  77. package/src/utils/media_pool_ingest_live_probe.py +592 -0
  78. package/src/utils/multicam.py +393 -0
  79. package/src/utils/object_inspection.py +287 -0
  80. package/src/utils/platform.py +157 -0
  81. package/src/utils/project_lifecycle_live_probe.py +376 -0
  82. package/src/utils/project_properties.py +601 -0
  83. package/src/utils/render_deliver_live_probe.py +384 -0
  84. package/src/utils/resolve_connection.py +77 -0
  85. package/src/utils/review_annotation_live_probe.py +352 -0
  86. package/src/utils/script_templates.py +1193 -0
  87. package/src/utils/sync_detection.py +887 -0
  88. package/src/utils/timeline_conform_live_probe.py +280 -0
  89. package/src/utils/timeline_kernel_live_probe.py +1091 -0
  90. package/src/utils/timeline_kernel_probe.py +185 -0
  91. package/src/utils/timeline_title_text.py +87 -0
  92. 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`.