Release history
samuelgursky/davinci-resolve-mcp releases
MCP server integration for DaVinci Resolve
All releases
42 shown
- Lifecycle‑aware extension actions via `script_plugin`: capabilities probing, safe install/remove, restart classification, and boundary reporting
- Live Extension Authoring validation with focused offline tests
Full changelog
v2.16.0
Extension Authoring kernel expansion.
Added
- Added lifecycle-aware extension actions through
script_plugin:extension_capabilities,probe_fuse_lifecycle,probe_dctl_lifecycle,probe_script_lifecycle,safe_install_extension,safe_remove_extension,refresh_or_restart_required, andextension_boundary_report. - Added
_mcp_name guards, MCP marker enforcement for safe install/remove, refresh/restart classification, and full template matrix probing across Fuse, DCTL, and Resolve-page script templates. - Added live Extension Authoring validation and focused offline tests.
Fixed
- Lua validation now writes temp source files as UTF-8, avoiding ASCII-locale failures on generated scripts with non-ASCII comment separators.
Documentation
- Added
docs/extension-authoring-kernel.md. - Updated Fuse/DCTL authoring docs, script authoring docs, README,
docs/SKILL.md, and the kernel expansion ledger.
Validation
venv/bin/python tests/test_import.pyvenv/bin/python scripts/audit_api_parity.pygit diff --checkvenv/bin/python -m unittest tests/test_extension_authoring_probe.py/opt/homebrew/bin/python3.11 tests/live_extension_authoring_validation.py --output-dir /private/tmp/extension-authoring-probe-20260509-release
Live validation ran against DaVinci Resolve Studio 20.3.2.9 with MCP-marked _mcp_ extension files only. Final probe result: 14 supported, 1 partially supported installed-Lua-script execution boundary, 1 intentional unsupported guard, and 0 errors.
- Added guarded `project_manager` lifecycle actions: `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`, and `project_boundary_report`.
- Added disposable `_mcp_` project-name guards, temp-path guards, safe delete handling for currently open projects, archive media/cache/proxy protection, database switch dry-runs, live Project/Database/Archive probe harness, and focused offline tests.
Full changelog
v2.15.0
Project / Database / Archive kernel expansion.
Added
- Added guarded
project_managerlifecycle actions: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, andproject_boundary_report. - Added disposable
_mcp_project-name guards, temp-path guards, safe delete handling for currently open projects, archive media/cache/proxy protection, and database switch dry-runs. - Added a live Project / Database / Archive probe harness and focused offline tests.
Documentation
- Added
docs/project-lifecycle-kernel.mdwith the project CRUD, DRP import/export, archive/restore, folder, settings, database, layout preset, render preset, page, keyframe, and cloud boundary map. - Updated the kernel expansion ledger, README, and
docs/SKILL.md.
Validation
venv/bin/python tests/test_import.pyvenv/bin/python scripts/audit_api_parity.pygit diff --checkvenv/bin/python -m unittest tests/test_project_lifecycle_probe.py/opt/homebrew/bin/python3.11 tests/live_project_lifecycle_validation.py --output-dir /private/tmp/project-lifecycle-probe-20260509-release
Live validation ran against DaVinci Resolve Studio 20.3.2.9 with disposable _mcp_ projects only. Final probe result: 35 supported, 5 partially supported, 1 unsupported guard, 1 not-applicable archive restore case, and 0 errors.
- Audio track/item probes
- Source audio mapping reports
- Guarded audio property writes
Full changelog
Audio / Fairlight kernel expansion. Adds audio track/item probes, source audio mapping reports, guarded audio property writes, voice isolation capabilities, auto-sync planning, transcription/subtitle probes, and Fairlight boundary reporting. Live validated on DaVinci Resolve Studio 20.3.2.9 with 13 supported surfaces, 3 partially supported audio property/auto-sync/audio-insert boundaries, and 0 errors.
- Timeline structure snapshots
- Gap/overlap detection with source range reporting
- Guarded timeline export/import and round‑trip comparison
Full changelog
Timeline Conform / Interchange kernel expansion. Adds timeline structure snapshots, gap/overlap detection, source range reporting, guarded timeline export/import, round-trip comparison, missing-media detection, and relink planning. Live validated on DaVinci Resolve Studio 20.3.2.9 with 17 supported surfaces, 1 partially supported FCPXML round-trip survivability boundary, and 0 errors.
- Safe Fusion graph inspection capabilities
- Tool creation, input write/readback helpers, and validated tool connections
- Scoped bulk input writes and boundary reporting for timeline item and active Fusion page comps
Full changelog
Fusion Composition kernel expansion. Adds safe Fusion graph inspection, tool creation, input write/readback helpers, validated tool connections, scoped bulk input writes, and boundary reporting for timeline item Fusion comps and active Fusion page comps. Live validated on DaVinci Resolve Studio 20.3.2.9 with 18 supported surfaces and 0 errors.
- New timeline_item_color actions: 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, and grade_boundary_report.
- Live Color / Grade probe harness using disposable projects and synthetic media.
Full changelog
v2.11.0
Color / Grade kernel expansion: safe grade inspection, CDL validation, node graph probing, grade copy, LUT export, version restore, Gallery, and color-group boundary reporting.
Added
- New timeline_item_color actions: 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, and grade_boundary_report.
- Live Color / Grade probe harness using disposable projects and generated synthetic color-bar media only.
- Color / Grade support map documentation and kernel ledger tracking.
Validation
- python3 -m json.tool docs/kernel-expansion-ledger.json
- venv/bin/python -m py_compile src/server.py src/granular/common.py install.py src/utils/color_grade_live_probe.py tests/live_color_grade_validation.py tests/test_color_grade_probe.py
- venv/bin/python tests/test_import.py
- venv/bin/python scripts/audit_api_parity.py
- git diff --check
- venv/bin/python -m unittest tests.test_color_grade_probe tests.test_review_annotation_probe tests.test_render_deliver_probe tests.test_media_pool_ingest_probe tests.test_timeline_kernel_probe
- Live Resolve validation: 25 supported, 2 version/page-dependent Gallery/DRX export boundaries, 1 not-applicable DRX apply path, 0 errors on DaVinci Resolve Studio 20.3.2.9.
- New timeline_marker actions: annotation_capabilities, probe_annotations, normalize_marker_payload, copy_annotations, move_annotations, sync_marker_custom_data, clear_annotations_by_scope, export_review_report, and annotation_boundary_report.
- Live Review Annotation probe harness using disposable projects with synthetic media.
Full changelog
v2.10.0
Review Annotation kernel expansion: unified marker, custom data, flag, clip color, copy/move, and review report support across timeline, timeline item, and media pool item scopes.
Added
- New timeline_markers actions: annotation_capabilities, probe_annotations, normalize_marker_payload, copy_annotations, move_annotations, sync_marker_custom_data, clear_annotations_by_scope, export_review_report, and annotation_boundary_report.
- Live Review Annotation probe harness using disposable projects and generated synthetic media only.
- Review Annotation support map documentation and ledger tracking.
Validation
- python3 -m json.tool docs/kernel-expansion-ledger.json
- venv/bin/python -m py_compile src/server.py src/granular/common.py install.py src/utils/review_annotation_live_probe.py tests/live_review_annotation_validation.py tests/test_review_annotation_probe.py
- venv/bin/python tests/test_import.py
- venv/bin/python scripts/audit_api_parity.py
- git diff --check
- venv/bin/python -m unittest tests.test_review_annotation_probe tests.test_render_deliver_probe tests.test_media_pool_ingest_probe tests.test_timeline_kernel_probe
- Live Resolve validation: 44 supported, 1 expected invalid-color boundary, 0 errors on DaVinci Resolve Studio 20.3.2.9.
- New render kernel actions: capabilities probing, settings validation, job lifecycle checks, and guarded Quick Export workflows
- Synthetic live Render/Deliver validation harness producing JSON/Markdown boundary reports
- Updated `docs/render-deliver-kernel.md` detailing format/codec, settings, job, and Quick Export support boundaries
Full changelog
v2.9.0
Render / Deliver kernel expansion for safer render planning, format/codec compatibility probing, settings validation, queue lifecycle checks, and guarded Quick Export workflows.
Added
- New
renderkernel actions: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, andexport_render_boundary_report. - Synthetic live Render / Deliver validation harness with JSON and Markdown boundary reports.
docs/render-deliver-kernel.mdwith format/codec, settings, job, and Quick Export support boundaries.
Changed
- Version surfaces bumped to 2.9.0 and README/docs updated for the new render workflow layer.
Validation
venv/bin/python tests/test_import.pyvenv/bin/python scripts/audit_api_parity.pygit diff --checkvenv/bin/python -m unittest tests.test_render_deliver_probe tests.test_media_pool_ingest_probe tests.test_timeline_kernel_probe- Live Resolve validation on DaVinci Resolve Studio 20.3.2.9: 23 supported, 1 version/page-dependent
GetRenderSettingsreadback boundary, 0 errors. The harness rendered a tiny synthetic timeline and cleaned up generated files.
- New `media_pool` kernel actions: ingest_capabilities, probe_media_pool, safe_import_media, organize_clips, copy_metadata, normalize_metadata, link_proxy_checked, set_clip_marks, and others.
- Synthetic live Media Pool/Ingest validation harness producing JSON and Markdown boundary reports.
Full changelog
v2.8.0
Media Pool / Ingest kernel expansion for safer import, organization, metadata, annotation, and link-boundary workflows.
Added
- New
media_poolkernel actions:ingest_capabilities,probe_media_pool,probe_ingest_item,safe_import_media,safe_import_sequence,safe_import_folder,organize_clips,copy_metadata,normalize_metadata,probe_clip_properties,safe_relink,safe_unlink,link_proxy_checked,link_full_resolution_checked,set_clip_marks,clear_clip_marks,copy_clip_annotations, andmedia_pool_boundary_report. - Synthetic live Media Pool / Ingest validation harness with JSON and Markdown boundary reports.
- Kernel expansion gameplans and JSON ledger for tracking the remaining surface areas.
Documentation
- Added
docs/media-pool-ingest-kernel.mdwith supported, partial, and unsupported boundaries. - Updated README and
docs/SKILL.mdfor the v2.8.0 Media Pool workflows.
Validation
venv/bin/python tests/test_import.pyvenv/bin/python scripts/audit_api_parity.pygit diff --checkvenv/bin/python -m unittest tests.test_media_pool_ingest_probe tests.test_timeline_kernel_probe- Live Resolve validation on DaVinci Resolve Studio 20.3.2.9: 56 supported, 1 expected unsupported non-media text import, 0 errors.
- Added `timeline.duplicate_clips` with new flags (`selected`, `record_frame`, `track_offset`) and placement modes (`same_time`, `offset`, `at_playhead`, `track_above`, `after_source`, `next_gap`).
- Introduced linked audio duplication via `include_linked=True`.
- Added timeline actions: `copy_clips`, `move_clips`, plus range operations `copy_range`, `duplicate_range`, `overwrite_range`, and `lift_range`.
Full changelog
v2.7.0
Timeline edit kernel expansion for clip duplication, linked audio, range edits,
state copying, and live API boundary probing.
Added
- Expanded
timeline.duplicate_clipswithselected=True, explicit
record_frame,track_offset, and placement modes:same_time,offset,
at_playhead,track_above,after_source, andnext_gap. - Added linked audio duplication with relink restoration through
include_linked=True. - Added
copy_clipsandmove_clipsactions. - Added
copy_range,duplicate_range,overwrite_range, andlift_range
timeline operations. - Added copy groups for transform, crop, composite, audio, retime, dynamic
zoom, scaling, stabilization, clip color, markers, flags, enabled state,
cache, voice isolation, Fusion comps, grades, takes, and keyframes where
Resolve exposes writable APIs. - Added
timeline.edit_kernel_capabilitiesand
timeline.probe_edit_kernel_item. - Added an exhaustive live probe harness and offline report/parser tests.
Documentation
- Added
docs/timeline-edit-kernel.mdwith supported, partially supported,
unsupported, and version/page-dependent boundaries. - Updated README and
docs/SKILL.mdwith the new timeline edit kernel surface,
usage examples, validation command, and public API limitations.
Known Limits
- Resolve's public scripting API does not expose transition cloning,
direct razor/split edits, true partial lifts, source-less append cloning, or
deep speed-ramp curve internals. - Some item-property writes and selected/current item behavior remain
Resolve-build or page-state dependent and are reported as such by the probe.
Validation
venv/bin/python tests/test_import.pyvenv/bin/python scripts/audit_api_parity.pygit diff --checkvenv/bin/python -m unittest tests.test_extract_source_frame_ranges tests.test_marker_params tests.test_v232_helpers tests.test_v233_helpers tests.test_append_clip_infos_result_handling tests.test_timeline_kernel_probevenv/bin/python -m unittest tests.test_timeline_kernel_probe tests.test_append_clip_infos_result_handling tests.test_marker_params tests.test_extract_source_frame_ranges tests.test_v232_helpers tests.test_v233_helpers tests.test_fusion_comp_targeting tests.test_cdl_and_install_config tests.test_fuse_dctl_authoring tests.test_script_plugin- Live Resolve validation on DaVinci Resolve Studio 20.3.2.9 with disposable
projects and synthetic media:
python3.11 tests/live_duplicate_clips_validation.py --output-dir /tmp/timeline-kernel-probe - Final exhaustive probe result: 255 supported, 4 partially supported,
138 unsupported, 4 version/page dependent, 0 errors.
- `timeline.duplicate_clips` action duplicates video timeline items by re-appending the same Media Pool item with identical source trim, supporting target track index and record frame offset.
- Hardened duplicate result handling tolerates thin `AppendToTimeline` return objects lacking `GetUniqueId()`/`GetName()`, scanning the target track to recover real item handles and providing per-clip error details for invalid inputs.
Full changelog
v2.6.0
Timeline clip duplication — adding an Alt-drag-style helper for duplicating
existing video timeline items without creating proxy media, renders, or source
derivatives.
New timeline.duplicate_clips action: timeline(action="duplicate_clips")
duplicates video timeline items by re-appending the same Media Pool item with
the same source trim via MediaPool.AppendToTimeline([{clipInfo}]). It accepts
timeline item IDs from timeline.get_items, an optional
target_track_index, and record_frame_offset; each result reports per-clip
success and the duplicated timeline item ID when Resolve exposes or recovers it.
Resolve append-result hardening: duplicate results now tolerate thin
AppendToTimeline return objects that lack readable GetUniqueId() or
GetName() methods, then scan the target video track to recover the real item
handle. Bad inputs now return clean per-clip errors for non-video items,
invalid offsets, and nonexistent target tracks.
Live-tested source trim semantics: validation against Resolve Studio
20.3.2.9 confirmed that positioned AppendToTimeline treats endFrame as an
exclusive source boundary in this workflow. duplicate_clips now uses
TimelineItem.GetDuration() and GetSourceStartFrame() where available, so
the duplicate preserves the original duration and source start.
Validation: added tests/live_duplicate_clips_validation.py, which creates
a disposable project, imports synthetic media, places a trimmed clip, duplicates
it to another track, verifies record frame/duration/source trim/media identity,
checks the invalid-track error path, and deletes the project. Focused unit
coverage now includes anonymous append objects, source-start preference,
video-only mediaType, and target-track ID recovery.
- macOS Fuse install path corrected from `Support/Fusion/Fuses/` to the actual scanned `Fusion/Fuses/` directory.
- Resolve 19.1.3 remains the compatibility baseline; tools verified on Resolve Studio 20.3.2.9 (macOS).
- `fuse_plugin` adds generation, installation, and validation of 18 Fuse template kinds (color, geometric, text/shapes, source/temporal, filters, modifiers, display shaders, reference).
- `dctl` provides generation, installation, and validation of 8 DCTL transform/template types including ACES IDT/ODT with full UI‑parameter support.
- `script_plugin` enables generation, installation, and inline execution of Resolve-page Lua/Python scripts via `run_inline` and `execute` actions.
Full changelog
v2.5.0 — Fuse, DCTL, and Resolve-page Script authoring tools
Three new compound tools that turn the MCP into an authoring + conversational-execution surface for Resolve extensions. Tool count: 27 → 30.
Added
-
fuse_plugin— generate, install, list, read, remove, and validate Fusion Fuse plugins (.fuse). 18 template kinds spanning color (color_matrix,per_pixel,channel_op), geometric (transform,spatial_warp), text/shapes (text_overlay,shape_generator), source/temporal (source_generator,time_displace), filters (builtin_blur,builtin_resize,variable_blurSAT-based), modifiers (modifier,point_modifier), display shaders (view_lut,dctl_kernel), and reference (controls_demo,notifychanged_demo). Each generator produces ready-to-install Lua (or Lua + GLSL / Lua + DCTL) source. Live-verified in DaVinci Resolve Studio 20.3.2.9 — generated Fuses register on Resolve restart andtext_overlaywas confirmed rendering glyphs into the viewer. Theview_luttemplate supportsfloat,vec2,vec3_rgb, andvec4_rgbashader parameter types. -
dctl— generate, install, list, read, remove, and validate DCTL color-transform files plus ACES IDT/ODT transforms. 8 template kinds:transform,transform_alpha(Resolve 19.1+ alpha modes),transition(withTRANSITION_PROGRESS),matrix(3x3 color matrix),kernel(TODO stub),lut_apply(wraps an external.cubeLUT viaDEFINE_LUT/APPLY_LUT),aces_idt,aces_odt. UI-parameter syntax covers all six DCTL UI types (slider float/int, value box, checkbox, combo, color picker) with optional tooltips. Per-templatesuggested_categoryso callers know whether to install to the regular LUT directory or the separate ACES Transforms tree. Validator catches missing entry points, brace imbalance, and float literals missing the requiredfsuffix. -
script_plugin— generate, install, and execute Resolve-page Lua/Python scripts that appear in the Workspace → Scripts menu. Two template kinds:scaffold(minimal stub) andmedia_rules(a comprehensive rules-and-variables DSL: 17 sources, 16 actions, 10 targets, 8 transforms, external CSV/JSON data with exact/regex/fuzzy matching, per-rule conditions, dry-run mode, ~22k-char Lua engine + ~18k-char Python engine, both first-class). Two new actions close the conversational loop:run_inline(source, language)runs an ad-hoc Lua/Python snippet inside Resolve and streams stdout + return value back;execute(name, category, language)runs an installed script the same way. Live-verified end-to-end — Pythonrun_inlinereturned project lists and walked the media pool; Luarun_inlineenumeratedMapPathsymbols with stdout AND return value captured. -
list_templatesaction on all three new tools enumerates available kinds.
Fixed
- macOS Fuses install path: corrected from the SDK doc's
Support/Fusion/Fuses/to the actual scannedFusion/Fuses/(verified live via Fusion's ownMapPath("Fuses:")query).
Documentation
- Six new Resolve developer-package reference notes adjacent to the scripting API:
docs/workflow-integrations.md,docs/openfx-notes.md,docs/lut-notes.md,docs/fusion-template-notes.md,docs/dctl-notes.md,docs/codec-plugin-notes.md. - Two new authoring docs:
docs/fuse-dctl-authoring.md(coverage matrix, risk levels, smoke-test recipe) anddocs/script-plugin-authoring.md(DSL spec, conversational-execution model, implementation notes on the Lua bridge quirks). - README and
docs/SKILL.mdupdated to point future agents at the right note for each failure mode.
Implementation notes
Two non-obvious Resolve 20.x behaviors are encoded in the implementation:
fusion.Execute(luaSource)from the PythonDaVinciResolveScriptbridge is a no-op — must useRunScript()against a temp file.RunScript()is asynchronous — must poll a completion sentinel (__mcp_done__viaapp:SetData/GetData) before reading results.
Validation
- 185 offline tests across 7 modules (
test_fuse_dctl_authoring.pyandtest_script_plugin.pyboth new), all passing in <2s. - Hermetic round-trip tests with mocked install paths.
- DSL-coverage tests confirm every documented source/action/target/transform/strategy is present in both Lua and Python engines.
- Python subprocess execution tested with real captured stdout/stderr.
- Live Resolve validation: generated Fuses register and render;
script_pluginrun_inlinequeries return real Resolve API data for both Lua and Python.
Compatibility
Resolve 19.1.3 remains the compatibility baseline; new tools verified live on Resolve Studio 20.3.2.9 (macOS).
Minor fixes and improvements.
Full changelog
v2.4.1
Release process documentation and versioning checklist.
Documentation
- Added
docs/release-process.md. - Documented semantic version selection for patch, minor, and major releases.
- Documented required version surfaces: server constants, installer, README badge, README release notes, tool discovery docs when needed, git tag, and GitHub Release.
- Documented required validation before release, including static checks, focused unit tests, and live Resolve validation for behavior changes.
- Clarified that live Resolve tests must use disposable projects and synthetic media only.
- Added tag/GitHub Release commands and a release-notes template.
Validation
- 49 focused unit tests passed.
tests/test_import.pypassed.scripts/audit_api_parity.pypassed.py_compilepassed for the versioned entrypoints.git diff --checkpassed.- No Resolve behavior changed; live Resolve validation was not required for this docs-only release.
- New compound action `timeline(action="extract_source_frame_ranges")` that scans clips and returns per‑source frame ranges, clip occurrences, timeline positions, source offsets, applied handles, and item IDs.
- Clip names now default to the basename from Media Pool `File Path`.
- Audio extensions are skipped by default via `skip_extensions`.
Full changelog
v2.4.0
Timeline source range extraction for frame-pull and conform preparation.
Added
- New compound action:
timeline(action="extract_source_frame_ranges"). - Scans every video clip on the current timeline and returns per-source frame ranges, clip occurrences, timeline positions, source offsets, applied handles, and timeline item IDs.
- Clip names prefer the basename from the Media Pool
File Path. - Audio extensions are skipped by default via
skip_extensions. - Fixed handles default to 24 frames.
- Passing
handles=0enables gap-only auto handles using neighboring timeline gaps up togap_maxframes.
Fixed
- Corrected source range endpoint handling so Resolve's exclusive source boundary is converted to an inclusive endpoint before applying handles.
- A 48-frame source clip with
handles=0now returnssource_used_inclusive_end=47andsource_range_final=[0, 47].
Validation
- Verified against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic media.
- Added
tests/test_extract_source_frame_ranges.pycovering zero-handle and fixed-handle range behavior. - Ran focused unit tests, import smoke test, py_compile, and API parity audit.
PR merged: #35.
- Consistent acceptance of `frame`, `frame_id`, and `frameId` across timeline, media pool item, and timeline item marker operations
- Dual support for `custom_data` and `customData` in marker custom data
- Default values for optional marker fields: color="Blue", name derived from note or "Marker", note="" , duration=1
Full changelog
v2.3.4
Marker API hardening for Issue #34.
Fixed
timeline_markers,media_pool_item_markers, andtimeline_item_markersnow acceptframe,frame_id, andframeIdconsistently for add/get/update/delete operations.- Marker custom data now accepts both
custom_dataandcustomData. timeline_markers(action="add")can add at the current playhead when frame/timecode is omitted, and it accepts explicittimecodeinput.- Optional marker fields now have defaults:
color="Blue",namefrom note or"Marker",note="", andduration=1. - Marker creation falls back from the documented six-argument
AddMarker(..., customData)call to the five-argument overload when custom data is empty and a Resolve build rejects the optional parameter.
Live Validation
- Verified against DaVinci Resolve Studio 20.3.2.9.
tests/live_marker_validation.pypassed in a disposable project with synthetic media.- Validated timeline, media-pool-item, and timeline-item marker add/get/update/delete alias paths.
- Validated current-playhead and timecode timeline marker creation.
Issue closed: #34.
- Removed undocumented cloud method wrappers: get_cloud_projects, export_project_to_cloud_tool, add_user_to_cloud_project_tool, remove_user_from_cloud_project_tool
- Removed 9 legacy granular gallery tools: get_color_presets, save_color_preset, apply_color_preset, delete_color_preset, create_color_preset_album, delete_color_preset_album, export_lut, get_lut_formats, export_all_powergrade_luts
- Removed 2 granular project optimized‑media tools: generate_optimized_media, delete_optimized_media
- Added new granular tools: append_to_timeline (simple and positioned forms), auto_sync_audio with audioSyncSettings dict, load_cloud_project_tool
- Introduced API parity CI guard script audit_api_parity.py to enforce documentation‑to‑code consistency
- Increased unit test coverage with 20 new tests for cloud settings builder, audio sync settings builder, and AppendToTimeline clipInfo builder
Full changelog
What's New in v2.3.3
Granular layer hardening — closing exposure gaps and dropped-dict-key bugs surfaced by an exhaustive parity audit of every documented Resolve scripting method against both server layers.
Cloud project helper rewritten (Critical): src/utils/cloud_operations.py was calling pm.CreateCloudProject(project_name, folder_path) with positional arguments — but the documented Resolve API signature is CreateCloudProject({cloudSettings}), a single dict. Same bug affected ImportCloudProject and RestoreCloudProject. Helper now builds proper {cloudSettings} dicts and exposes all 5 documented keys (PROJECT_NAME, PROJECT_MEDIA_PATH, IS_COLLAB, SYNC_MODE, IS_CAMERA_ACCESS) per docs lines 576-594. Granular wrappers (create_cloud_project_tool, import_cloud_project_tool, restore_cloud_project_tool) updated to expose the full settings surface; load_cloud_project_tool added (was missing entirely from granular).
Silent-drop bugs fixed (Critical):
render_with_quick_export()(granular) previously dropped the documented{param_dict}(TargetDir, CustomName, VideoQuality, EnableUpload). Now forwards all four keys per docs line 179.timeline_create_compound_clip()(granular) previously dropped the documented{clipInfo}dict (name,startTimecode). Now exposes both keys per docs line 369.
Missing granular tools added:
append_to_timeline— both simpleclip_idsform and positionedclip_infosform (MediaPool.AppendToTimelinewas completely absent from granular layer; only compound had it).auto_sync_audio— with proper{audioSyncSettings}dict mapping per docs lines 600-614 (sync_mode,channel_numberwith'automatic'/'mix'aliases,retain_embedded_audio,retain_video_metadata).load_cloud_project_tool— was missing entirely; compound had it.rename_color_group— wrapsColorGroup.SetName(compound had it viacolor_group(action=\"set_name\")but no granular tool).
Removed 4 undocumented cloud method wrappers:
get_cloud_projectsresource →GetCloudProjectListnot in API docsexport_project_to_cloud_tool→ExportToCloud/ExportProjectToCloudnot in API docsadd_user_to_cloud_project_tool→AddUserToCloudProjectnot in API docsremove_user_from_cloud_project_tool→RemoveUserFromCloudProjectnot in API docs
Removed 9 legacy granular gallery tools that wrapped undocumented or renamed methods. The proper documented Gallery and GalleryStillAlbum wrappers (14 of them, e.g. get_gallery_still_albums, create_gallery_still_album, import_stills_to_album, export_stills_from_album, get_album_stills, set_still_label) cover the documented API surface and remain. Removed: get_color_presets, save_color_preset, apply_color_preset, delete_color_preset, create_color_preset_album, delete_color_preset_album, export_lut, get_lut_formats, export_all_powergrade_luts.
Removed 2 granular project optimized-media tools that wrapped undocumented Resolve methods (Project.GenerateOptimizedMedia, Project.DeleteOptimizedMedia, MediaPool.SetClipSelection — none in API docs). Removed: generate_optimized_media, delete_optimized_media. Use the Resolve UI for optimized-media generation; set_optimized_media_mode (which uses the documented Project.SetSetting(\"OptimizedMediaMode\", ...)) is preserved.
Deprecated method call fixed: timeline(action=\"get_items_in_track\") was calling the deprecated tl.GetItemsInTrack() form (docs line 989, marked deprecated) instead of the supported tl.GetItemListInTrack() (line 350). Every other call site already used the correct form.
New: API parity CI guard at scripts/audit_api_parity.py. Parses docs/resolve_scripting_api.txt and verifies (1) no from api.X broken imports remain, (2) every documented Resolve method appears somewhere in src/, (3) wrappers calling undocumented methods are flagged for review. Includes an allowlist for legitimate undocumented-but-real Resolve API surface (Fusion compositing API, UIManager methods like OpenProjectSettings/LoadUILayout/SaveUILayout, internal type-discrimination helpers like TimelineItem.GetType/GetMediaType). Run with `python3 scripts/audit_api_parity.py` — currently passes all three checks cleanly.
Tool count: 328 granular tools (was 354 before v2.3.2; net change since v2.3.1 is −26 broken/duplicate/undocumented tools removed and +4 missing tools added). 20 new unit tests against Resolve stubs covering the cloud settings builder, audio sync settings builder, and AppendToTimeline clipInfo builder. All 41 tests pass without a live Resolve connection.
Live disposable Resolve validation: every new and changed v2.3.3 granular tool was exercised against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic temp media via `tests/live_v233_validation.py`. 10/10 checks passed: `append_to_timeline` (simple + positioned + failure path), `auto_sync_audio` (settings dict + invalid input rejection), `import_media` image-sequence form, `timeline_create_compound_clip` (info dict forwarded — compound clip created with explicit name), `rename_color_group` (renamed a real color group), `render_with_quick_export` (params dict forwarded — Resolve's structured `{JobStatus, Error}` response confirms the dict reached it), and the compound-side `GetItemListInTrack` deprecated→supported fix.
- Migrate calls to removed granular tools to their listed equivalents (e.g., use `media_pool(action="delete_clips")` instead of `delete_media`).
- Update any usage of the legacy bare-string `sub_type` argument in Timeline.AddTrack to the new dict form (`newTrackOptions`).
- Removed 25 broken granular tools (e.g., delete_media, move_media_to_bin, auto_sync_audio, unlink_clips, relink_clips, create_bin, list_media_pool_bins, get_media_pool_bin_contents, get_timeline_tracks, create_empty_timeline, delete_timeline, add_marker, add_clip_to_timeline, apply_lut, copy_grade, get_render_presets, add_to_render_queue, start_render, clear_render_queue) and 7 broken resources.
- Replaced legacy `sub_type` string argument in Timeline.AddTrack with documented `newTrackOptions` dict (`audio_type`, `index`).
- Exposed documented overloads: CreateTimelineFromClips via clip_infos, ImportMedia sequence imports via clip_infos, AddItemListToMediaPool via item_infos, and Timeline.AddTrack using newTrackOptions dict.
- `CreateSubtitlesFromAudio` now maps language and preset strings to Resolve constants and exposes chars_per_line, line_break, gap keys.
Full changelog
What's New in v2.3.2
API parity sweep — closing documented overloads and dropped parameters that the v2.3.1 audit surfaced, plus removing 25 broken granular tools that crashed on first call.
Documented overloads now exposed:
- Positioned
CreateTimelineFromClipsviaclip_infos—media_pool(action="create_timeline_from_clips", params={"clip_infos": [...]})and the granularcreate_timeline_from_clips(clip_infos=[...])now expose the documentedMediaPool.CreateTimelineFromClips(name, [{clipInfo}, ...])overload (4 keys:mediaPoolItem,startFrame,endFrame,recordFrame). - Image-sequence
ImportMediaviaclip_infos— both layers now exposeMediaPool.ImportMedia([{FilePath, StartIndex, EndIndex}, ...])for DPX/EXR/etc. sequence imports. PascalCase keys preserved per Resolve docs. - Positioned
AddItemListToMediaPoolviaitem_infos—media_storage(action="import_to_pool", params={"item_infos": [{media, startFrame, endFrame}, ...]})and granularadd_items_to_media_pool_from_storage(item_infos=[...])now expose the documentedMediaStorage.AddItemListToMediaPool([{itemInfo}, ...])overload. Timeline.AddTrackdict form — replaced the legacy bare-stringsub_typeargument with the documentednewTrackOptionsdict (audio_type,index). Granulartimeline_add_track(track_type, audio_type=, index=)and compoundtimeline(action=\"add_track\", params={\"track_type\", \"options\": {audio_type, index}}).
Dropped-parameter bugs fixed:
CreateSubtitlesFromAudioactually wired up — granulartimeline_create_subtitles_from_audiopreviously advertisedlanguageandpresetparameters then silently dropped them. Now maps user strings (e.g.\"korean\",\"netflix\",\"double\") toresolve.AUTO_CAPTION_*constants per docs lines 720-761, and exposes the missingchars_per_line,line_break,gapkeys.- Granular
import_mediano longer crashes — was importing from a deletedapi.media_operationsmodule and would throwModuleNotFoundErroron first call. Rewritten to callMediaPool.ImportMediadirectly and to share the newclip_infosoverload. SetRenderSettingsdocstring completeness — granularset_render_settingsnow documents all 27 keys per docs lines 765-799 (previously omittedEncodingProfile,MultiPassEncode,AlphaMode,NetworkOptimization,PixelAspectRatio,ClipStartFrame,TimelineStartTimecode,ReplaceExistingFilesInPlace).
Broken-tool cleanup (granular tool count: 354 → 336):
Removed 18 broken granular tools (+ 7 broken resources) that imported from a deleted `api.*` namespace and would crash with `ModuleNotFoundError` on first call. All 25 had working equivalents elsewhere or wrapped undocumented Resolve methods. Migration map for any caller hitting the removed tools:
| Removed | Use instead |
|---|---|
| `delete_media` | `media_pool(action="delete_clips")` |
| `move_media_to_bin` | `media_pool(action="move_clips")` |
| `auto_sync_audio` (granular) | `media_pool(action="auto_sync_audio")` |
| `unlink_clips` | `media_pool(action="unlink")` |
| `relink_clips` | `media_pool(action="relink")` |
| `create_bin` | `media_pool(action="add_subfolder")` |
| `list_media_pool_bins` | `folder(action="get_subfolders")` |
| `get_media_pool_bin_contents` | `folder(action="get_clips")` |
| `get_timeline_tracks` | `timeline(action="get_track_count")` + `get_items_in_track` |
| `create_empty_timeline` | `media_pool(action="create_timeline")` |
| `delete_timeline` | `media_pool(action="delete_timelines")` |
| `add_marker` (granular timeline) | `timeline_markers(action="add")` |
| `add_clip_to_timeline` | `media_pool(action="append_to_timeline")` |
| `apply_lut` (granular graph) | `graph(action="set_lut")` |
| `copy_grade` | `timeline_item_color(action="copy_grades")` |
| `get_render_presets` | `render(action="list_presets")` |
| `add_to_render_queue` | `render(action="add_job")` |
| `start_render` (granular project) | `render(action="start")` |
| `get_render_queue_status` | `render(action="list_jobs")` + `get_job_status` |
| `clear_render_queue` (granular project) | `render(action="delete_all_jobs")` |
| `create_sub_clip`, `get_current_color_node`, `get_color_wheel_params`, `set_color_wheel_param`, `add_node` | Removed — wrapped undocumented Resolve methods that are not in the official scripting API. |
Live disposable Resolve validation:
Verified every fix against DaVinci Resolve Studio 20.3.2 in a disposable project with synthetic temp media: positioned `clip_infos` create_timeline_from_clips returned a 2-item timeline, image-sequence ImportMedia produced `frame_[001-005].png`, item_infos AddItemListToMediaPool created a properly trimmed subclip, and `add_track` with the new `{audio_type, index}` dict form correctly created a stereo track at the requested slot.
Tests: 17 new unit tests, all passing without a live Resolve connection.
- AppendToTimeline overload accepts per‑entry clip_id, media_pool_item_id, start_frame, end_frame, record_frame, track_index and optional media_type
- Failed appends return structured error objects including missing timeline_item_id cases
Full changelog
What's New in v2.3.1
- Positioned
AppendToTimelineviaclip_infos—media_pool(action="append_to_timeline", params={"clip_infos": [...]})now exposes the documentedMediaPool.AppendToTimeline([{clipInfo}, ...])overload, accepting per-entryclip_id/media_pool_item_id,start_frame,end_frame,record_frame,track_index, and optionalmedia_type. Each appended item returns itstimeline_item_idfor follow-up Fusion ops. - Positioned append failure reporting — the same call now returns
{"error": ...}when Resolve fails to produce valid timeline items, including falseyAppendToTimeline()results and returned item handles without a timeline item id. - Live disposable Resolve validation — verified the fix against DaVinci Resolve Studio 20.3.2 with synthetic temp media in a disposable project: valid
clip_infosappend returnedsuccess,count=1, andtimeline_item_id; invalidclip_infoscalls returned errors.
- Resolve 20.0-20.2.2 scripting API coverage with version guards
- 98.5% API coverage (331/336 methods tested on DaVinci Resolve Studio 20.3.2)
- Improved connection recovery after Resolve restarts and Project Manager transitions
Full changelog
Highlights
- Added Resolve 20.0-20.2.2 scripting API coverage with version guards for older Resolve builds.
- Live-tested the Resolve 20 additions on DaVinci Resolve Studio 20.3.2, bringing coverage to 331/336 methods (98.5%).
- Refreshed docs/resolve_scripting_api.txt from the bundled Resolve 20 developer docs.
- Merged and updated docs/SKILL.md for AI assistant usage, current tool counts, Resolve 20 guards, and source media integrity guidance.
- Improved Resolve connection recovery by validating cached Resolve handles after restarts or Project Manager transitions.
Tool Counts
- Compound server: 27 tools
- Granular server: 354 tools
- API methods covered: 336/336
Remaining Untested API Surface
Only five methods remain untested because they need external infrastructure or content: four cloud project methods and Timeline.AnalyzeDolbyVision.
- Granular server modularization with domain modules
- Windows PYTHONHOME environment variable support for Resolve 20.3 startup stability
- Fusion comp targeting by clip_id, timeline_item_id, or timeline_item
Full changelog
What’s New in v2.2.0
- Granular server modularization —
src/resolve_mcp_server.pyis now a thin entrypoint backed by domain modules undersrc/granular/, while preserving existing granular tool names, arguments, resource behavior, and thepython src/server.py --fullflow. - Windows installer hardening — generated stdio configs now include Resolve API environment variables, and Windows configs also include
PYTHONHOMEderived from the selected interpreter base install to address Resolve/Python binding crashes seen with Resolve 20.3. - MCP stdio compatibility — both server entrypoints now use LF-only stdio wrappers for better behavior with newer MCP clients and
mcp1.27.0. - CDL input normalization —
set_cdlnow accepts the existing documented string form and JSON-array-shaped channel values, normalizing both into Resolve expected CDL strings. - Fusion comp targeting —
fusion_compcan now target timeline-item Fusion compositions byclip_id,timeline_item_id, ortimeline_item, with optionalcomp_name/comp_index. Added scopedbulk_set_inputsfor timeline Fusion comps.
Compatibility Notes
Validated live coverage for this release is still based on DaVinci Resolve Studio 19.1.3. Resolve 20.x and 21.x may work, and this release specifically hardens Windows Resolve 20.3 startup, but full Resolve 20/21 API validation is planned as a follow-up pass.
Validation
- Local import/syntax smoke tests passed.
- Compound MCP stdio initialized and listed 27 tools.
- Granular MCP stdio initialized and listed 342 tools.
- Live Resolve read-only checks passed against DaVinci Resolve Studio 19.1.3.
- Disposable generated Fusion Composition test passed for timeline-item targeting,
TextPlusinput changes, scopedbulk_set_inputs, and CDL normalization.
Thanks to contributors on PR #25 and PR #29 for the fix/feature direction incorporated into this release.
- New `fusion_comp` tool with 20 actions (add/delete/find nodes, wire connections, set/get parameters, manage keyframes, control undo, set render ranges, trigger renders)
- `timeline_item_fusion` cache actions (`get_cache_enabled`, `set_cache`)
- Fusion node graph reference with common tool IDs (Merge, TextPlus, Background, Transform, ColorCorrector, DeltaKeyer)
Full changelog
What's New in v2.1.0
- New
fusion_comptool — 20-action tool exposing the full Fusion composition node graph API. Add/delete/find nodes, wire connections, set/get parameters, manage keyframes, control undo grouping, set render ranges, and trigger renders — all on the currently active Fusion page composition timeline_item_fusioncache actions — addedget_cache_enabledandset_cacheactions for Fusion output cache control directly on timeline items- Fusion node graph reference — docstring includes common tool IDs (Merge, TextPlus, Background, Transform, ColorCorrector, DeltaKeyer, etc.) for discoverability
- Cross-platform sandbox path redirect for macOS, Linux, and Windows temp paths
- Auto-cleanup for `grab_and_export` (exported files deleted automatically)
- Version and path handling synchronized between compound and granular servers
Full changelog
What's New
- Cross-platform sandbox path redirect —
_resolve_safe_dir()now handles macOS (/var/folders,/private/var), Linux (/tmp,/var/tmp), and Windows (AppData\Local\Temp) sandbox paths that Resolve can't write to. Redirects to~/Documents/resolve-stillsinstead of Desktop - Auto-cleanup for
grab_and_export— exported files are read into the response (DRX as inline text, images as base64) then deleted from disk automatically. Zero file accumulation. Passcleanup: falseto keep files on disk - Both servers in sync —
server.pyandresolve_mcp_server.pynow share the same version and both use_resolve_safe_dir()for all Resolve-facing temp paths (project export, LUT export, still export) - CLAUDE.md added — release checklist ensuring version badges, changelog, and GitHub releases stay in sync
- New `grab_and_export` action combining grab and export in single atomic call
- Format fallback chain (requested format → tif → dpx on failure)
- Automatic file cleanup from gallery after export with `delete_after: true` default
Full changelog
New: grab_and_export action on gallery_stills
Combines GrabStill() + ExportStills() in a single atomic call, keeping the live GalleryStill reference for reliable export. Returns a file manifest with the exported image and companion .drx grade file.
Changes
- New
grab_and_exportaction — grabs the current frame as a gallery still and exports it immediately. More reliable than separategrab_still+export_stillscalls since it keeps the live object reference. - Format fallback chain — if the requested format fails, automatically retries with tif then dpx
- macOS sandbox path redirect —
/var/foldersand/private/varpaths are redirected to~/Desktop/resolve-stillssince Resolve's process can't write to sandboxed temp directories - Auto-cleanup — removes the still from the gallery after export by default (
delete_after: true) - File manifest response — returns
{files: [{name, path, size}], format, folder}instead of just{success: bool}
Key Discovery
ExportStills() requires the Gallery panel to be visible on the Color page (Workspace > Gallery). This is undocumented in the Resolve Scripting API. All 9 supported formats (dpx, cin, tif, jpg, png, ppm, bmp, xpm, drx) produce a companion .drx grade file alongside the image.
Usage
gallery_stills(action="grab_and_export", params={
"folder_path": "/path/to/output",
"prefix": "my_still",
"format": "dpx",
"delete_after": true
})
- Path traversal vulnerability fixed in `export_layout_preset`, `import_layout_preset`, and `delete_layout_preset` tools with path containment validation
Full changelog
Security: path traversal protection for layout preset tools
What's New
- Path traversal protection for layout preset tools —
export_layout_preset,import_layout_preset, anddelete_layout_presetnow validate that resolved file paths stay within the expected Resolve presets directory, preventing path traversal via crafted preset names (e.g.../../etc/important) - Security Considerations section in README — documents destructive tools (
quit_app/restart_app), layout preset file operations, and recommendations for MCP client developers on confirmation prompts
Details
Prompted by external static analysis (reachscan) that identified 13 reachable findings across EXECUTE and WRITE capabilities:
| Finding | Assessment | Action |
|---------|-----------|--------|
| 4 layout preset file ops (shutil.copy2, os.remove) | True positive — preset_name from LLM input was not validated against path traversal | Fixed with os.path.realpath() containment checks |
| 8 subprocess calls in quit_app/restart_app/launch | Accepted by design — hardcoded command lists, no shell injection vector | Documented in new Security Considerations section |
| 1 os.remove() in save_project | False positive — deletes server-created temp file, no LLM-controlled path | No change needed |
Fixed crash in `timeline_item_color` color group operations.
Full changelog
Fix: Color group operations crash in timeline_item_color
_check() returns (pm, proj, err) but timeline_item_color unpacked it as (proj, _, _), assigning the ProjectManager to proj instead of the Project. This caused assign_color_group and remove_from_color_group to crash with 'NoneType' object is not callable when calling proj.GetColorGroupsList().
Fix: (proj, _, _) → (_, proj, _)
- Lazy connection recovery with auto-reconnect and auto-launch in full server mode
- Null guards on `GetProjectManager()`, `GetCurrentProject()`, `GetCurrentTimeline()` failures with clear error messages
- Helper functions (`get_resolve()`, `get_project_manager()`, `get_current_project()`) replacing 178 boilerplate blocks
Full changelog
What's New
v2.0.5 — Lazy Connection Recovery & Null Guards
- Lazy connection recovery — full server (
--fullmode) now auto-reconnects and auto-launches Resolve, matching the compound server behavior - Null guards on all chained API calls —
GetProjectManager(),GetCurrentProject(),GetCurrentTimeline()failures now return clear errors instead ofNoneTypecrashes - Helper functions —
get_resolve(),get_project_manager(),get_current_project()replace 178 boilerplate blocks
v2.0.4 — Fix apply_grade_from_drx Parameter
- Renamed
modetograde_modeto match Resolve API; corrected docs from replace/append to actual keyframe alignment modes - Backward compatible — still accepts
mode,grade_modetakes precedence
v2.0.3 — Fix GetNodeGraph Crash
GetNodeGraph(0)returnsFalsein Resolve; now calls without args unlesslayer_indexis explicitly provided- Guard checks
not ginstead ofg is Noneto catchFalsereturns
v2.0.2 — Antigravity Support
- Google's Antigravity added as 10th MCP client
- Alphabetical client ordering in installer
v2.0.1 — Bug Fixes
- CreateMagicMask param type, GetCurrentClipThumbnailImage args, Python 3.13+ warning
v2.0.0 — Major Rewrite
- 26-tool compound server (default) — all 324 API methods grouped into 26 context-efficient tools
- Universal installer — single
python install.pyfor macOS/Windows/Linux, 10 MCP clients - Lazy Resolve connection — server starts instantly, connects when first tool is called