Sandbox
@samuelgursky/davinci-resolve-mcp

MCP server for DaVinci Resolve Studio

This repo provides an MCP server that connects an agent to DaVinci Resolve Studio through Blackmagic's scripting API. It supports Resolve control, media pool work, timeline editing, grading, Fusion, Fairlight, render setup, and review helpers, plus a local browser control panel for inspecting state and analysis results.

2,629 stars307 forksPythonUpdated 7d ago
Who it's for

Builders who want their agent to control DaVinci Resolve Studio and work with edits, grades, media, and delivery inside the app.

What it delivers

You can ask an agent to operate Resolve directly instead of copying steps by hand between the editor and the chat window.

What it does

Compound and granular server modes

Offers a default compound server in `src/server.py` and a full one-tool-per-method mode in `src/resolve_mcp_server.py`.

Local control panel

Ships a browser-based panel for inspecting Resolve state, running analysis, and editing analysis output inline.

Free-edition bridge

Includes an in-app bridge script for cases where external scripting is unavailable.

Offline advanced server

Bundles `davinci-resolve-advanced-mcp` for working with `.drp`, `.drt`, and `.drx` files without Resolve running.

Agent setup for multiple clients

The installer can configure Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Continue, Cline, Roo Code, OpenCode, Codex CLI, and JetBrains IDEs.

Execution traces and audit reports

Records multi-step runs and can export reviewable execution reports from recent agent activity.

How to get it

  1. 1Run
    npx davinci-resolve-mcp setup
  2. 2For source installs
    git clone https://github.com/samuelgursky/davinci-resolve-mcp.git
    cd davinci-resolve-mcp
    python install.py

README

DaVinci Resolve MCP Server

English | 简体中文

Version npm API Coverage Tools Advanced Tested DaVinci Resolve Python License

A Model Context Protocol (MCP) server that lets AI assistants control DaVinci Resolve Studio through the official Scripting API. It provides full API coverage plus guarded workflow helpers for editing, media pool organization, render setup, review markers, grading, Fusion, Fairlight, project lifecycle tasks, extension authoring, and source-safe media analysis.

Local control panel

A local browser control panel ships with the server for inspecting Resolve state, running source-safe analysis, drilling into analyzed clips and shots, and editing analysis output inline. See the Control Panel Guide for the full tour.

Quick Start

npx davinci-resolve-mcp setup

Before connecting, open DaVinci Resolve Studio and set Preferences > General > External scripting using to Local. (On the free edition that preference does not help — see Free edition below.) The npm launcher installs a managed copy under your user application-data directory, then runs the universal Python installer. The installer creates a virtual environment, detects Resolve paths, and can configure Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Zed, Continue, Cline, Roo Code, OpenCode, Codex CLI, and JetBrains IDEs.

For source installs:

git clone https://github.com/samuelgursky/davinci-resolve-mcp.git
cd davinci-resolve-mcp
python install.py

For platform paths, client-specific config, and manual setup, see Installation and Configuration.

The installer and server check the latest GitHub release for MCP updates. Checks are best-effort and throttled; the server never blocks MCP startup for a prompt. The installer can prompt, snooze, ignore a release, disable checks, or apply an opt-in safe auto-update for clean git checkouts.

Free edition (in-app bridge)

Blackmagic gates external scripting to Studio: on the free edition scriptapp("Resolve") refuses a foreign process, whatever the preference says. Through Resolve 21.0.x the Workspace ▸ Scripts menu was not gated — a script launched from it is handed the live resolve object (measured on free 21.0.3.7) — so the server can reach the free edition through a small script that runs inside Resolve and re-exports it over an authenticated loopback listener. Resolve 21.1 moved Python scripting to Studio. On free 21.1 the Scripts menu no longer lists .py files at all (reported on Fedora 44 in #203; a Lua script in the same folder lists normally). Whether the Console still runs Python there is unconfirmed, so treat the bridge as a 21.0.x path until that is measured.

python scripts/install_resolve_bridge.py
# restart Resolve, open a project, then: Workspace > Scripts > resolve_bridge

The installer and MCP client use ~/.config/davinci-resolve-mcp/bridge.json by default. To keep the authenticated bridge config elsewhere, set DAVINCI_RESOLVE_BRIDGE_CONFIG while running the installer and in the MCP client environment; both sides will use that path.

Once that listener is running it is used automatically whenever external scripting is unavailable — no environment variable required. Setting DAVINCI_RESOLVE_BRIDGE=1 forces the bridge instead: it becomes the only transport tried, so a bridge that stops answering reports its own fault rather than quietly falling back to another transport. Use it when the bridge is the path you intend to depend on.

On macOS, Resolve looks for Python 3 in exactly two places: the PYTHON3HOME environment variable, then /usr/local/bin/python3. Homebrew, pyenv, uv and conda land in neither, so the script silently never appears in the menu. A python.org install works because its installer creates /usr/local/bin/python3 — but you do not need one: point Resolve at the interpreter you already have, no sudo required.

launchctl setenv PYTHON3HOME "$(python3 -c 'import sys; print(sys.prefix)')"

Use launchctl setenv, not export — Resolve is launched from the Dock and never sees your shell's environment. Restart Resolve afterwards. A Lua canary is installed alongside so you can tell "Python not detected" apart from a wrong folder.

Two things that bite (#182). The prefix must contain both lib/libpython3.X.dylib and bin/python3 under that exact unversioned name — Homebrew's framework builds often ship only bin/python3.13, which is half a Python as far as Resolve is concerned, and the installer's preflight now says so instead of reporting a usable prefix. And launchctl setenv does not survive a reboot; if scripts stop listing weeks later with no error, that is why. For something persistent, put an interpreter where Resolve already looks (this one needs sudo, and check that /usr/local/bin does not precede your normal Python on PATH):

sudo ln -s "$(command -v python3)" /usr/local/bin/python3

Validated on free 21.0.3.7 and Studio 19.1.3.7, both macOS. The Windows paths added in v2.70.1 (issue #106) shipped unverified; reports on free 21.0.1.11 (issue #109) and free 21.0.3.7 (issue #112) have since shown the bridge installing, listing and serving from both %PROGRAMDATA% and %APPDATA% on Windows 11, so those paths are now confirmed rather than assumed. Linux is confirmed as well: a report on free 20.3.2.9 (issue #129, Fedora 43) shows the bridge installing to ~/.local/share/DaVinciResolve/Fusion/Scripts/Utility, listing against the system Python — Linux has none of this discovery problem — and serving end-to-end. No platform now rests on an assumption: macOS was validated directly, Windows and Linux on user reports.

Note that the bridge holds its port for as long as it serves. Before v2.70.3 a Windows bridge could outlive Resolve and block the next session's listener; if you are on an older build and a bridge stops answering, check for a stale fuscript.exe still holding the port.

This is the documented in-app path, not a licence circumvention, but Blackmagic could close it — treat it as a supported-until-it-is-not tier. Loopback only, HMAC-signed requests, one-use nonces.

Local Control Panel

Launch the single-user local control panel from the repository root:

venv/bin/python -m src.control_panel

The command starts a loopback-only server and opens the control panel in your browser at a URL that carries a per-launch access token (http://127.0.0.1:8765/#token=…) — use that exact URL; the panel refuses requests without it. To have an AI coding agent do this, ask: "Open the Resolve MCP control panel for this repo." Agents should use venv/bin/python -m src.control_panel unless your Python environment is already active. Persisted analysis jobs refresh the local search index automatically after successful slices; the manual Build Index action is for rebuilding from existing reports.

Server Modes

ModeEntry pointToolsBest for
Compoundsrc/server.py36Default mode for most assistants. Related Resolve operations are grouped behind action parameters to keep context usage low.
Full / granularsrc/server.py --full or src/resolve_mcp_server.py377Power users who want one MCP tool per Resolve API method.

The compound server is recommended unless you specifically need the granular one-tool-per-method surface.

Advanced server — beyond the scripting API (optional, Node)

The same package ships a second, optional MCP server: davinci-resolve-advanced-mcp (bin bin/davinci-resolve-advanced-mcp.mjs). Where the Python server drives a live Resolve over the sanctioned scripting API, the advanced server does what the API can't — it reads and edits Resolve files (.drp / .drt / .drx) and applies DB/XML-level changes with no Resolve running, so it runs cloud or local. 18 tools: drp, drt, drx (per-clip grade codec plus a deterministic, offline grading/QC catalog — within-camera + cross-camera skin (v2 skin-line metric) + b-roll + neutral-patch WB matching, match-to-reference, saturation/black-balance, contrast-normalize, ASC CDL import, lossless grade-transfer + season-look authoring, named-LUT attach, scope reads + intent tags, verify-grade, display-referred frame extraction, broadcast-legal QC), offline_ref, conform (frame-oracle conform/relink QC + lineage), color_trace (carry grades across a re-conform), fusion, audio_plan, fairlight (bus routing), audio, project_read, project_db, pipeline (a DB-as-truth pipeline: compile YAML project specs into a canonical SQLite DB, then run stages with gates, provenance, and intent↔actual drift detection), capabilities, deliverable (deliverable QC / compliance), media (media front-end / AE ingest), editorial (editorial integrity / changelist), provenance (provenance / audit / episode report). It can also be consumed as a library (importable engine API), not just spawned as a server.

DRX grade writes are live-calibrated against Resolve Studio: grade params take Resolve's on-screen panel units by default (space: 'ui' | 'drx'), and the structural writes (power windows, qualifiers, HDR zones, HSL curves, ColorSlice, blur/key/motion-effects) are panel-readback-verified — per-control status in resolve-advanced/vendor/drx-parameters/CALIBRATION-STATUS.md. It also closes a UI-only gap: programmatic "Cleanup Node Graph" (drx relayout for one clip, project_db relayout_node_graphs for a whole project) — node layout tidied, grade content byte-preserved.

Add it alongside the live server (both ship in one npm install):

{
  "mcpServers": {
    "davinci-resolve": { "command": "<python>", "args": ["<path>/src/server.py"] },
    "davinci-resolve-advanced": { "command": "node", "args": ["<path>/bin/davinci-resolve-advanced-mcp.mjs"] }
  }
}

install.py prints both entries. The core is pure-JS/MIT with no required native modules; a few features need user-installed tools (ffmpeg for audio, sharp/better-sqlite3 for some paths) — call the capabilities tool for live status and install hints.

Unlike the Python server, this one has Node dependencies. npx davinci-resolve-mcp setup installs them into the managed install (npm install --omit=dev --omit=optional under resolve-advanced/) and only then registers the bin. If that install could not run — offline, or npm unavailable — setup registers an npx command for the advanced server instead, so the entry it writes always boots. To repair an existing install without re-running setup: npx davinci-resolve-mcp sync.

Bradford Post Assistant — managed application (closed beta)

The maintainers also build Bradford Post Assistant, a desktop application on top of this open foundation. Where the MCP servers give an agent hands, Post Assistant is the working copilot around them — an on-device AI assistant for post-production where client material never leaves the workstation:

  • A post-production copilot — a desktop app that sits alongside DaVinci Resolve and watches the session live (timeline, grades, and frames — not just API calls), with an embedded AI assistant and agent runtime, local media analysis (transcription, frame analysis, editorial intelligence), and in-app conform QC.
  • Memory — persistent, encrypted on-device assistant memory plus cross-episode learning mined from your pipeline's decoded facts (season-look drift, per-camera correction priors, hero-frame libraries, conform path-map reuse), with accumulation managed for you and a reviewed-insight workflow.
  • Self-contained by design — Post Assistant wires everything itself: this MCP for Resolve control, the Bradford API for its extended services, and your choice of LLM provider. Nothing to configure by hand, no separate clients to manage, and the app keeps itself (and its bundled MCP) current with signed auto-updates.
  • An extended professional toolset — grade surgery on live projects, 22+ adaptive grade families, a curated looks library, delivery-spec validation, editorial pacing/cleanup analysis, natural-language color direction, and Fusion composition authoring — delivered through the managed Bradford API.
  • Production workflows — the raw tools composed into finished, real-world flows (turnover → conform → QC → delivery, season-look carry, episode reporting) with the guardrails and approvals a client-facing shop expects.

It is currently in closed beta — you can request access at bradfordoperations.com/software/post-assistant. The open-source servers are complete and fully functional on their own.

What You Can Do

"List all projects and open the one called 'My Film'"
"Create a timeline called 'Assembly Cut' from all clips in the current bin"
"Build a multicam prep timeline from selected camera angles and preserve source media"
"Detect 2-pops or slate claps and suggest record offsets for sync prep"
"Publish analysis summaries, keywords, people, and slate hints into Resolve clip metadata"
"Probe this timeline for gaps, overlaps, missing media, and source frame ranges"
"Safely import this image sequence, organize it into bins, and normalize clip metadata"
"Build a ProRes 422 HQ render plan, validate the settings, and queue the job"
"Copy review markers from the timeline to the selected clip and export a review report"
"Snapshot this clip's grade, validate a CDL update, and export a temp LUT"
"Create a Fusion TextPlus overlay on the selected clip and verify graph connections"
"Report audio channel mappings, voice isolation availability, and subtitle support"
"Install this MCP-marked DCTL or script, classify refresh/restart needs, then remove it"

Core Capabilities

AreaWhat the compound server supports
App and project controlLaunch/reconnect, page switching, project CRUD, project folders, databases, cloud project wrappers, settings, presets, archives
Media pool and ingestSafe import, image sequences, multicam prep timelines, bin organization, metadata normalization, metadata field inventory, marks, annotations, relink/proxy/full-resolution guards
Media analysisSource-safe file/clip/bin/project analysis, 2-pop/slate-clap sync-event detection, default Resolve metadata and Media Pool marker writeback, persisted analysis artifacts, existing-report reuse, host_chat_paths visual analysis (finalized per clip with commit_vision, works with any vision-capable MCP client) with opt-out, transcription with opt-out
Timeline editing and conformTrack/item probing, title text key scans/writes, copy/move/duplicate helpers, ripple insert, range operations, gaps/overlaps, source ranges, checked interchange exports/imports
Review annotationsTimeline/item/clip markers, custom data, flags, clip color, copy/move/sync cleanup, review reports, marker thumbnail review
Color and gradingNode graph probing, CDL validation, grade copy, DRX/LUT helpers, versions, Gallery stills, color groups
FusionTimeline-item comps, safe tool creation, input writes, port inspection, validated connections, scoped bulk writes
Audio and FairlightTrack/item probes, source mapping, guarded audio property writes, voice isolation, auto-sync planning, transcription/subtitle probes
Render and deliverFormat/codec matrix probing, render settings validation, queued job lifecycle checks, guarded Quick Export
Extension authoringFuse, DCTL, ACES DCTL, and Resolve-page Lua/Python script lifecycle helpers with safe MCP-marked install/remove
Craft guidanceThe bundled editorial, colour, audio, and workflow guidance served as prose over MCP — indexed, searchable, and readable by any client, not just ones with this repository on disk

Operation envelope

Every compound tool return carries an _operation block beside its payload, so an agent reads one shape instead of a different key per tool: status (success / partial / blocked / failed), verification (with contradiction kept distinct — Resolve reported success and the readback disagreed), changes (the semantic delta), warnings, and an execution_id.

Two absences are meaningful and deliberate. verification.status: "unverified" means no evidence was reported, not "checked and clean". A missing changes means the action did not report a delta, not that nothing changed — an empty {} there would be a confident, wrong answer about an edit that simply never declared one.

The envelope is namespaced rather than merged into the top level because status, operation, warnings, result and changes are all already domain keys here; flattening would rewrite a background job's status: "done" and a confirm gate's status: "confirmation_required". setup(action="set_defaults", params={"result_envelope": "pure" | "legacy"}) changes the shape, per call via params={"envelope": ...}, per process via RESOLVE_MCP_RESULT_ENVELOPE.

Agent execution traces ("Why did the editor do this?")

Multi-step AI operations correlate across tool calls into unified execution traces. Each trace aggregates tool durations (duration_ms), call counts, cumulative semantic deltas (items_deleted, items_added), and readback verifications. Agents and editors can inspect workflows via resolve_control: get_execution_trace(execution_id?), list_recent_executions(), or open a scoped execution with begin_execution(request="...") / end_execution(). export_execution_report(execution_id?, format="markdown"|"json") writes a reviewable audit artifact with the same summary, defaulting to logs/execution-reports/<execution_id>.md. path writes it anywhere you want it instead — alongside a conform in a dated TransferFiles folder, say — and creates the directories to get there, so check the path before you send it. An existing file is never replaced without overwrite: true. inspect_operation(tool?, target_action?, target_params?) evaluates pre-flight risk level (low, medium, high, critical), destructive potential, and blast radius (item, track, timeline, project, system) before taking action, while list_lifecycle_hooks() inspects active execution interceptors.

It is a heuristic over action names, not a simulation — it never touches the project and does not validate your parameters, so recognised: false means the levels are defaults rather than a finding, and snapshot_available: null means rollback availability was not determined rather than absent. Every shipped hook observes; none replaces a tool's result, so dry_run always reaches the real handler and nothing synthesises a preview for an action that has none.

A report for a run where nothing was verified says "not established — no checks recorded", not "passed". Absence of evidence is a question still open, and an audit document is the last place to let a reader read it as an all-clear.

Traces live in a 100-entry in-memory ring and are appended to logs/execution-traces.jsonl beside server.logRESOLVE_MCP_TRACE_FILE moves it, and RESOLVE_MCP_LOG_FILE moves server.log itself (a path, or empty for no file; the offline test suite points it at a temporary file so it never writes into the operator's log). list_recent_executions reports that path and whether it is writable, so "the log is empty" and "nothing is being written" are distinguishable without reading the source. What is recorded is tool name, action, timing, status, semantic deltas and verification — no parameters and no file paths. The one free-text field is the request you pass to begin_execution, so treat it the way you would a commit message on a client project.

Optional Extras

The core install is deliberately small: Python, ffmpeg, and the Resolve scripting API. Some features need more, and each one refuses honestly with its own install line rather than degrading into a guess — a fabricated tempo or an invented level produces confident, wrong output, which is worse than no feature.

Run python scripts/doctor.py to see which of these you have.

ExtraUnlocksLicence
ffmpeg on PATHSilence detection, dead-space markers, level measurement, audio analysis. The single most useful thing to install.LGPL/GPL — invoked as a subprocess, never bundled
pip install numpyColour pre-balance, reference-still matching, sound-density auditBSD
pip install librosaBeat, bar and phrase detection for music-driven cuttingISC
pip install -U openai-whisperTranscription, and everything word-level built on itMIT
pip install open_clip_torchVisual similarity and find_similarMIT
pip install transformersCLAP audio embeddingsApache-2.0
pip install opencv-pythonAdditional frame analysisApache-2.0

media_analysis action capabilities reports the analysis stack in detail and tells you what each missing piece would enable.

Nothing here is bundled. Model weights carry their own licences separate from the code that loads them; check them before commercial use.

What This Does Not Do

Knowing where a tool stops is worth as much as knowing what it does, and it is cheaper to read it here than to discover it mid-project.

Not supportedWhy, and what you get instead
Choosing the best takePerformance is most of what makes a take right, and none of it is measurable from a waveform or a transcript. rank_takes ranks fluency — fillers, restarts, script coverage — and says so in every response. The take that plays is regularly the least fluent one, because the hesitation is often the acting. Use it to find the clean safety take, not to choose the read.
Automatic music editingOptional librosa support provides beat detection and beat/bar/phrase cut-point plans, not a finished assembly. Downbeats are inferred from the first beat; use beat_offset for pickups. Speech-silence tools are unsuitable for finding musical edit points.
Judging a cutNothing here has an opinion about whether an edit is good. Every destructive action is plan → review → confirm for that reason.
Replacing an editorThe output is a first-pass assembly, in the assistant-editor sense: ingest, sync, organize, string out, flag problems. It is a starting point you cut, not a finished cut. Defaults are deliberately generous — a first assembly is supposed to run long, because trimming is fast and visible while recovering discarded material is slow and invisible.
**Modifyi

Files in the repo

Repository payload34 top-level entries
  • .agents
  • .claude
  • .codex
  • .continue
  • .cursor
  • .github
  • .roo
  • .windsurf
  • bin
  • docs
  • examples
  • logs
  • release-notes
  • resolve-advanced
  • scripts
  • src
  • tests
  • .clinerules
  • .cursorrules
  • .gitignore
  • .npmignore
  • .windsurfrules
  • AGENTS.md
  • CHANGELOG.md
  • CLAUDE.md
  • install.py
  • LICENSE
  • look.cube
  • package-lock.json
  • package.json
  • README.md
  • README.zh-CN.md
  • requirements.txt
  • SECURITY.md

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface

86k

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
tirth8205/
code-review-graph

Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.

31k
2akouwu/
reverify

Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k