Skip to main content
Glama

DaVinci Resolve MCP

A 64-tool stdio MCP server for DaVinci Resolve’s documented scripting API. Windows 11 is the primary platform, macOS is supported, and Linux support is best effort. The project does not use UI automation, OCR, simulated input, or undocumented Resolve methods.

Windows Quick Start

Requirements: Windows 11, Python 3.12 or newer, Git, and DaVinci Resolve. Live external control may require Resolve Studio, depending on the installed edition and Blackmagic’s scripting support.

Use a writable source location—not Program Files:

cd "$env:USERPROFILE\Documents\GitHub"
git clone https://github.com/BillyRaz/Davinci-MCP.git
cd Davinci-MCP
.\setup-davinci-mcp.ps1

Setup prefers py -3.12, falls back to a compatible python, creates .venv, installs .[dev], generates the user config, and runs pytest, Ruff, and offline validation. It never installs packages silently, requests Administrator access, or changes execution policy globally.

Run and validate:

.\run-davinci-mcp.ps1
.\validate-davinci-mcp.ps1
.\validate-davinci-mcp.ps1 -Live

The .cmd wrappers provide equivalent double-click entry points. The live option is read-only and should only be used with Resolve Studio open. Resolve Free external scripting limitations are reported as warnings/unsupported capability, not MCP defects.

The parameterized global color-treatment LUT engine is documented in docs/LUT_ENGINE.md.

To create an optional Desktop shortcut:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\create_windows_shortcut.ps1

The script only creates Run DaVinci MCP.lnk; it does not alter security settings.

Related MCP server: DaVinci Resolve MCP Server

Windows Codex and MCP Configuration

Keep executable and argument as separate values. Replace the example clone path:

{
  "mcpServers": {
    "davinci-resolve": {
      "command": "C:\\Users\\YOUR_NAME\\Documents\\GitHub\\Davinci-MCP\\.venv\\Scripts\\python.exe",
      "args": [
        "C:\\Users\\YOUR_NAME\\Documents\\GitHub\\Davinci-MCP\\server.py"
      ]
    }
  }
}

For Codex, add the server to the MCP configuration used by your Codex installation; inspect and preserve existing servers before editing it. Generic stdio and VS Code-compatible clients can use the same command/args object.

Windows troubleshooting:

  • “Missing .venv”: run .\setup-davinci-mcp.ps1.

  • Python not found: install Python 3.12+ with the py launcher, then reopen the shell.

  • Resolve connection unavailable: open Resolve Studio and enable local External scripting in Resolve Preferences. Do not change preferences automatically.

  • Permission errors: clone under Documents or Developer, not Program Files.

  • Paths are discovered from ProgramFiles, ProgramData, APPDATA, LOCALAPPDATA, and USERPROFILE; explicit environment overrides take priority.

macOS Installation

Clone into a user-owned development directory, then use the portable launchers:

mkdir -p "$HOME/Developer"
cd "$HOME/Developer"
git clone https://github.com/BillyRaz/Davinci-MCP.git
cd Davinci-MCP
./setup-davinci-mcp.command
./run-davinci-mcp.command

Apple Silicon and Intel are detected automatically. The launcher retains Blackmagic’s official scripting locations:

export RESOLVE_SCRIPT_API="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting"
export RESOLVE_SCRIPT_LIB="/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so"
export PYTHONPATH="${PYTHONPATH:+$PYTHONPATH:}$RESOLVE_SCRIPT_API/Modules"

RESOLVE_SCRIPT_API accepts either the parent Scripting directory or its direct Modules directory. A generic/Codex macOS configuration is:

{
  "mcpServers": {
    "davinci-resolve": {
      "command": "/Users/YOUR_NAME/Developer/Davinci-MCP/.venv/bin/python",
      "args": ["/Users/YOUR_NAME/Developer/Davinci-MCP/server.py"]
    }
  }
}

Linux Installation (Best Effort)

Linux discovery checks /opt/resolve, /opt/resolve/Developer/Scripting, and common libraries under /opt/resolve/libs, while honoring all overrides:

./setup-davinci-mcp.sh
./run-davinci-mcp.sh
./validate-davinci-mcp.sh

Linux paths and launchers are mock-tested, but live Resolve behavior is not claimed as fully validated.

Capture Support

Capture tools export genuine Resolve output only:

  • capture_current_frame

  • capture_clip_reference

  • capture_before_after_reference

  • list_captured_references

  • open_capture_folder

  • delete_captured_reference

Capture uses documented current-frame export when exposed, Gallery still export/delete as a fallback, or a supported temporary one-frame render path. Pillow is used only to combine already-exported images or calculate technical image-change metrics. A “before” is never claimed unless it was actually captured first.

Every generated file result includes its absolute path. Metadata includes the project, timeline, frame/timecode, timestamp, and actual capture method.

TimelineItem Locks

The playhead is an acquisition tool only. lock_timeline_item (and the compatible lock_timeline_target name) double-reads the item under the playhead, validates any confirmed identity, and stores a session-local TimelineItemLock. The stored lock contains project, timeline, item unique ID, original track/address and frame range, duration, source identity/path, creation time, and connection generation. It does not contain the playhead position.

All production capture and grading tools re-resolve the locked item by Resolve unique ID before acting and use its currently resolved track/item address. Moving the playhead, playing, scrubbing, or switching Resolve pages therefore does not invalidate the lock. A project or timeline switch, connection generation change, missing or ambiguous item, explicit release, or server restart does.

queue_timeline_item supports acquiring multiple independent item identities for future batch workflows. validate_queued_timeline_items resolves the queue without consulting the playhead. Queue entries are session-local and are not persisted.

The official API does not expose timeline-item selection independently of the playhead, so initial interactive acquisition still uses the item under it. Capture may temporarily move the timeline to export an explicit frame and then restore the editor's timecode; this does not change which TimelineItem is locked.

Validation

Offline validation checks Python, dependencies, platform discovery, scripting paths, native library, writable output, config, presets, and MCP registration. Live validation additionally inspects the read-only connection/project/timeline/ clip/Gallery/render capabilities. It does not apply grades, start renders, or change the active timeline.

Reports use passed, warning, failed, skipped, and unsupported, and are written as JSON and Markdown with timestamped copies.

Configuration and Output Paths

Default config:

Platform

Config

Windows

%APPDATA%\DavinciMCP\config.toml

macOS

~/Library/Application Support/DavinciMCP/config.toml

Linux

${XDG_CONFIG_HOME:-~/.config}/davinci-mcp/config.toml

Default output root:

Platform

Output

Windows

%LOCALAPPDATA%\DavinciMCP

macOS

~/Library/Application Support/DavinciMCP

Linux

${XDG_DATA_HOME:-~/.local/share}/DavinciMCP

Each root contains captures, comparisons, validation, logs, reports, presets, and cache.

Older macOS artifacts at /Applications/DaVinci Resolve/davinci-mcp/output are left untouched. Copy wanted files manually into the new Application Support subdirectories; no automatic move or deletion occurs.

Environment variables override TOML configuration:

  • DAVINCI_RESOLVE_HOME

  • RESOLVE_SCRIPT_API

  • RESOLVE_SCRIPT_LIB

  • DAVINCI_MCP_OUTPUT_DIR

  • DAVINCI_MCP_PRESET_DIR

  • DAVINCI_MCP_LOG_LEVEL

  • DAVINCI_MCP_CONNECTION_MODE

  • DAVINCI_MCP_CAPTURE_FORMAT

  • DAVINCI_MCP_TEMP_RENDER_DIR

  • DAVINCI_MCP_CONNECTION_TIMEOUT

  • DAVINCI_MCP_RENDER_TIMEOUT

Discovery priority is explicit override, existing discovered installation, known platform default, then a clear validation failure when the selected path is absent.

Development and Testing

python3.12 -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
.venv/bin/python -m pytest
.venv/bin/python -m ruff check .
.venv/bin/python scripts/offline_validate.py

On Windows, replace .venv/bin/python with .venv\Scripts\python.exe. GitHub Actions runs Python 3.12 tests and Ruff on Windows, macOS, and Ubuntu without attempting a live Resolve connection.

Available Tools

64 tools
add_layer_mixerB

Report the official API limitation for layer mixers.

Inputs: no named parameters. Returns: result

add_markerC

Add a marker at a zero-based frame offset in the active timeline.

Inputs: frame (required), name, note, color, +2 more. Returns: object

add_parallel_nodeC

Report the official API limitation for parallel nodes.

Inputs: no named parameters. Returns: result

add_render_jobB

Configure the current timeline and append a job to Resolve's render queue.

Inputs: target_dir (required), mode, codec, format, +4 more. Returns: object

add_serial_nodeC

Report the official API limitation for adding serial nodes.

Inputs: no named parameters. Returns: result

analyze_clip_scopesB

Explain why numerical image analysis cannot use the official scripting API.

Inputs: no named parameters. Returns: result

apply_gradeC

Apply a DRX grade to a clip. Modes: 0 none, 1 source TC, 2 start aligned.

Inputs: drx_path (required), item_index (required), track_index (required), grade_mode. Returns: object

batch_grade_clipsC

Apply one registered DRX template to explicit timeline clip addresses.

Inputs: clips (required), template (required), grade_mode. Returns: object

batch_rename_clipsB

Rename timeline clips. Each item needs track_index, item_index, and name.

Inputs: items (required). Returns: object

capture_before_after_referenceC

Preserve two genuine exported frames and optionally combine them side by side.

Inputs: after_reference (required), before_reference (required), overwrite, output_name, +1 more. Returns: object

capture_clip_referenceC

Export a frame from an explicit clip, restoring the original playhead afterward.

Inputs: clip_identifier (required), overwrite, output_name, custom_frame, +2 more. Returns: object

capture_current_frameC

Export the current Resolve timeline frame and matching JSON metadata.

Inputs: overwrite, output_name, output_format, include_metadata. Returns: object

connect_to_resolveC

Connect to running Resolve Studio and return product/project context.

Inputs: force. Returns: object

copy_gradeC

Copy a source clip's current grade to explicitly addressed target clips.

Inputs: targets (required), source_item (required), source_track (required). Returns: object

create_cinematic_gradeD

Apply registered cinematic DRX.

Inputs: item_index (required), track_index (required), grade_mode. Returns: object

create_commercial_gradeD

Apply registered commercial DRX.

Inputs: item_index (required), track_index (required), grade_mode. Returns: object

create_dark_moody_gradeD

Apply registered dark-moody DRX.

Inputs: item_index (required), track_index (required), grade_mode. Returns: object

create_editorial_gradeD

Apply registered editorial DRX.

Inputs: item_index (required), track_index (required), grade_mode. Returns: object

create_luxury_bridal_gradeC

Apply registered luxury bridal DRX with protected skin and warm golds.

Inputs: item_index (required), track_index (required), grade_mode. Returns: object

create_music_video_gradeD

Apply registered music-video DRX.

Inputs: item_index (required), track_index (required), grade_mode. Returns: object

create_render_presetC

Configure supported render settings and save them as a named preset.

Inputs: name (required), target_dir (required), mode, codec, +4 more. Returns: object

current_clipA

Return the current video timeline item under the playhead.

Inputs: no named parameters. Returns: object

current_playheadA

Return the active timeline playhead timecode.

Inputs: no named parameters. Returns: object

current_projectA

Return the active project's identity, timeline count, and render state.

Inputs: no named parameters. Returns: object

current_timelineA

Return active timeline bounds, playhead, and track counts.

Inputs: no named parameters. Returns: object

delete_captured_referenceC

Delete one generated artifact and paired capture metadata when present.

Inputs: reference (required). Returns: object

delete_markerC

Delete the active timeline marker at a frame offset.

Inputs: frame (required). Returns: object

export_stillC

Export selected Gallery stills, including DRX for later grade application.

Inputs: folder (required), prefix (required), album_index (required), still_indices (required), +2 more. Returns: object

get_latest_validation_reportB

Return the latest persisted validation report and its absolute path.

Inputs: no named parameters. Returns: object

inspect_clipA

Inspect the current clip's metadata; image-scope analysis is not API-accessible.

Inputs: no named parameters. Returns: object

inspect_media_poolA

Return the recursive media-pool bin tree, optionally including clip metadata.

Inputs: include_clips. Returns: object

inspect_node_treeC

Inspect count, labels, LUTs, tools, and cache mode for a clip node graph.

Inputs: item_index (required), track_index (required), layer. Returns: object

jump_markerC

Move the playhead to a timeline marker identified by frame offset.

Inputs: frame (required). Returns: object

jump_to_timecodeA

Move the timeline playhead to an HH:MM:SS:FF timecode.

Inputs: timecode (required). Returns: object

label_nodeB

Report the official API limitation for changing node labels.

Inputs: no named parameters. Returns: result

list_captured_referencesA

List generated capture/comparison artifacts with absolute paths.

Inputs: no named parameters. Returns: result

list_clipsA

List addressable video timeline clips, optionally on one 1-based track.

Inputs: track_index. Returns: result

list_markersA

List active timeline markers with frame offsets and metadata.

Inputs: no named parameters. Returns: result

list_nodesB

List nodes in a clip color graph using 1-based node indices.

Inputs: item_index (required), track_index (required), layer. Returns: result

list_render_jobsA

List queued and completed render jobs.

Inputs: no named parameters. Returns: result

list_render_presetsA

List render presets visible to the active project.

Inputs: no named parameters. Returns: result

list_stillsA

List still labels and stable-in-call indices in a Gallery album.

Inputs: album_index (required), powergrades. Returns: result

list_timelinesA

List all timelines and indicate which one is active.

Inputs: no named parameters. Returns: result

load_powergradeC

Apply a registered PowerGrade DRX template to a timeline clip.

Inputs: name (required), item_index (required), track_index (required), grade_mode. Returns: object

monitor_renderA

Return one job's completion/status or the overall queue state.

Inputs: job_id. Returns: object

open_capture_folderA

Open the generated capture directory in Finder.

Inputs: no named parameters. Returns: object

register_powergradeC

Register or replace a named DRX template in the local grade catalog.

Inputs: name (required), drx_path (required), category, favorite, +1 more. Returns: object

run_full_validationA

Run offline plus optional read-only live checks and write JSON/Markdown reports.

Inputs: live. Returns: object

save_powergradeC

Grab a still from the current Color-page clip into the current album.

Inputs: label. Returns: object

search_clipsA

Search clip names and properties recursively across all media-pool bins.

Inputs: query (required). Returns: result

search_powergradesA

Search registered DRX templates by text and optional exact category.

Inputs: query, category. Returns: result

selected_clipsA

Return selected Media Pool clips (timeline multi-selection is not API-exposed).

Inputs: no named parameters. Returns: result

set_cdlC

Set ASC CDL values on an existing color node.

Inputs: item_index (required), node_index (required), track_index (required), power, +3 more. Returns: object

set_node_enabledB

Enable or bypass a color node through the official Graph API.

Inputs: enabled (required), item_index (required), node_index (required), track_index (required). Returns: object

start_renderB

Start selected render job IDs, or all queued jobs when omitted.

Inputs: job_ids. Returns: object

switch_timelineC

Make the uniquely named project timeline current.

Inputs: name (required). Returns: object

validate_capture_supportA

Inspect official frame-export, Gallery, and render capabilities without capture.

Inputs: no named parameters. Returns: object

validate_current_clipA

Check the timeline clip under the playhead.

Inputs: no named parameters. Returns: object

validate_current_projectB

Check that a current Resolve project is available.

Inputs: no named parameters. Returns: object

validate_current_timelineA

Check that a current Resolve timeline and playhead are available.

Inputs: no named parameters. Returns: object

validate_grade_applicationC

Validate supported observable grade state; makes no color-quality claim.

Inputs: drx_path (required), item_index (required), track_index (required), operation_succeeded (required), +2 more. Returns: object

validate_render_configurationA

Inspect supported render API methods without changing settings or rendering.

Inputs: no named parameters. Returns: object

validate_resolve_connectionA

Check the live Resolve API connection without changing Resolve state.

Inputs: no named parameters. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.6/5.0

    Scored across 64 tools

    Disambiguation3/5

    Many tools have similar purposes, such as the multiple 'create_*_grade' tools that apply different DRX presets, and the numerous validation tools. While descriptions distinguish them, an agent may struggle to select the right one without careful reading.

    Naming Consistency4/5

    Tool names use snake_case consistently, with verbs like 'list_', 'create_', 'validate_', etc. The pattern is predictable, though verb variety is high, and some names are less typical (e.g., 'run_full_validation').

    Tool Count2/5

    64 tools is excessive for a server, even for a complex application like DaVinci Resolve. Many tools are duplicative or simply report API limitations, inflating the count without adding real functionality.

    Completeness3/5

    The tool set covers color grading, rendering, and media pool well, but lacks editing, audio, and fusion tools. Several tools are non-functional stubs (e.g., 'add_serial_node'), creating dead ends for agents.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      C
      quality
      D
      maintenance
      A Model Context Protocol server that enables AI assistants like Claude to interact with DaVinci Resolve Studio, providing advanced control over editing, color grading, audio, and other video production tasks.
      32
      22
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that exposes the complete DaVinci Resolve scripting API, enabling AI assistants to control DaVinci Resolve programmatically with over 440 tools for project management, timeline editing, color grading, rendering, and more.
      24
      MIT