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