A full-coverage Model Context Protocol server for DaVinci Resolve Studio — control editing, media management, color grading, Fusion compositing, Fairlight audio, AI/Neural Engine features, and rendering from any MCP client (Claude Desktop, Cursor, or your own agent).
334 tools — 316 live tools across 22 domain modules that drive a running Resolve
instance via its scripting API, plus 18 offline tools that read/write Resolve's own
files (.drp/.drt/.drx) and a local SQLite store with no Resolve connection at
all. One server, one process, one mcp = FastMCP(...) instance — every tool connects
lazily (live tools) or touches only local files (offline tools), on first call.
- What & why
- Highlights
- Architecture
- Tool catalog
- Offline (no-Resolve) tools
- Requirements & compatibility
- Installation
- Configuration
- Usage with Claude Desktop
- Usage with Cursor
- Example prompts
- Agent skill (Claude Code, Cowork, and more)
- Claude Code / Cowork plugin
- Safety
- Troubleshooting
- Development & validation
- Contributing
- Support & security
- Project status
- License
DaVinci Resolve's external scripting API (DaVinciResolveScript / fusionscript) is a
Python (and Lua) C-extension — Blackmagic Design ships it as a native module with a
Python-first calling convention (resolve.GetProjectManager(),
project.GetMediaPool(), timeline.GetItemListInTrack(...), etc.). There is no native
binding for Node.js, Go, Rust, or any other runtime. Any non-Python MCP server would
have to spawn a Python subprocess and shuttle every call across a bridge anyway — an
extra process, an extra serialization boundary, and an extra failure mode for zero
benefit. Python is therefore not just a reasonable choice, it is the strictly
simpler and more direct one for this server.
This server aims for full API coverage: every major Resolve scripting object
(Project, ProjectManager, MediaPool, MediaPoolItem, MediaStorage, Timeline,
TimelineItem, Gallery/Color, Fusion, Fairlight audio, the render/Deliver page, and
AI/Neural Engine features) gets first-class, individually documented tools — not a
single generic "call any method" passthrough. An execute_resolve_code escape hatch is
still included for the long tail of API surface that doesn't (yet) have a dedicated
tool.
Design priorities, in order:
- Never crash the server. Every tool wraps its body in
try/exceptand returns an"Error: ..."string on failure. Resolve not running, no project open, no active timeline, a Resolve-free-edition/older-version API gap — all of these come back as a clear string an LLM can read and react to, never a raised exception or a dead process. - Never touch Resolve at import time. Connecting is fully lazy — the module tree imports cleanly (and is tested to do so) on a machine with no DaVinci Resolve installed at all. Every tool reconnects on its own first call via a shared, lock-guarded connection singleton.
- One tool, one job, one clear docstring. Tool names are globally unique and each docstring documents its parameters — that docstring is the only description an LLM client sees when deciding whether and how to call the tool.
- Broad Resolve control: projects, bins, media, timelines, Inspector properties, Color, Fusion, Fairlight, Neural Engine features, gallery stills, effects, transitions, keyframes, and the render queue.
- Works with standard MCP clients: the server uses stdio transport and ships setup paths for Claude Desktop, Claude Code, Cowork, Cursor, Windsurf, and manual clients.
- Useful without Resolve running: 18 offline tools inspect or author Resolve project, timeline, grade, and composition formats; run media QC; and maintain a local SQLite workflow ledger.
- Failure-aware: live connections are lazy, tool failures return readable strings, and mutating offline actions identify results that still need live Resolve validation.
- Extensible: tool modules share one FastMCP instance, keep names globally unique, and are covered by connection-free registration tests.
src/davinci_resolve_mcp/
├── app.py # the single FastMCP instance + startup lifespan + prompt
├── server.py # entry point: imports every tools/* module (registration
│ # side effect), then mcp.run() over stdio
├── connection.py # ResolveConnection: lazy DaVinciResolveScript import,
│ # per-OS path auto-detection, RLock-guarded accessors,
│ # stale-handle reconnect, execute_code() escape hatch
├── helpers.py # _conn(), _require_timeline(), _get_timeline_item(),
│ # _ok(), _coerce_value() — shared by every tools/* module
├── resolve_utils.py # serializers: Resolve objects -> plain dict/JSON-safe
│ # structures (folders, clips, timelines, items, stills)
├── resources.py # read-only resolve://... MCP resources (project info,
│ # current timeline, media pool structure)
├── transcription_engine.py # local Whisper wrapper (mlx-whisper / openai-whisper)
├── formats/ # OFFLINE codecs: drx_xml, drx_codec (zstd FieldsBlob),
│ # cdl, lut, drt, drp — parse/author Resolve's own files
├── store/ # OFFLINE DB-as-truth: db.py (local SQLite project/run/
│ # stage store), provenance.py (append-only audit ledger)
├── grading/ # OFFLINE deterministic compute cores: cdl_ops,
│ # white_balance, skin_match, qc (broadcast-legal/gamut)
└── tools/ # one module per Resolve API domain — see catalog below
├── ai.py, audio.py, code.py, color.py, export_still.py, fusion.py,
├── fx_plugins.py, inspector.py, keyframes.py, media_pool.py,
├── media_pool_item.py, media_storage.py, project.py, project_manager.py,
├── render.py, resolve_app.py, screenshot.py, timeline.py,
├── timeline_edit.py, timeline_item.py, transcription.py, transitions.py,
└── off_*.py # 18 offline tools — see "Offline (no-Resolve) tools"
The rules that keep this architecture sound:
app.pyowns the singlemcp = FastMCP(...)instance. It never imports anytools.*module (that would risk a circular import), and it never importsDaVinciResolveScript— its startup "lifespan" tries a best-effort connect and swallows failure, since every tool reconnects on its own.- Every
tools/*.pymodule starts withfrom ..app import mcpand registers its tools with@mcp.tool()against that shared instance as an import-time side effect.server.pyis the sole place that imports everytools.*module, which is what actually wires the whole tool surface together — add or remove one of those imports and you add or remove that module's tools from the running server. - Tool bodies get Resolve state through
helpers._conn()(→connection.get_resolve_connection()), never by importingDaVinciResolveScriptthemselves.connection.pyis the only file that imports it, and only inside a method body — never at module import time. - Ownership of tool names is pinned per module (e.g.
detect_scene_cutsand everyinsert_*timeline-editing tool live intools/timeline_edit.py;grab_stilllives intools/color.py;export_timelinelives intools/export_still.py) so two modules can never register a tool with the same name — MCP requires every tool name to be globally unique, andtests/test_tool_exposure.pyasserts this holds. - The 18 offline tools follow the same rules, minus the Resolve connection. Each
tools/off_*.pymodule still starts withfrom ..app import mcpand registers with@mcp.tool()against the same shared instance —server.pyimports them exactly like the live modules, so removing oneoff_*import drops exactly that tool. But they never callhelpers._conn()and never importDaVinciResolveScript— instead they read/write local files (.drp/.drt/.drx,.comp, media) and a local SQLite store (store/db.py,store/provenance.py) by composing theformats/,store/, andgrading/layers. See Offline (no-Resolve) tools below.
334 tools total (verified by tests/test_tool_exposure.py, which imports the whole
server with no Resolve instance present and asserts on mcp.list_tools()): 316 live
tools across the 22 domain modules below, driving a running Resolve instance, plus 18
offline tools (covered in the next section) that never
touch Resolve at all. Also 3 read-only MCP resources and 1 prompt.
| Module | Domain | Tools |
|---|---|---|
tools/color.py |
Color page — node graph, LUT get/set, CDL, grade-from-DRX, color versions, gallery stills | 42 |
tools/media_pool_item.py |
MediaPoolItem — clip properties/metadata, markers, flags, clip color, proxy media, mark in/out |
30 |
tools/timeline.py |
Timeline — read/navigate/structure: list & switch timelines, duplicate, settings, tracks, timecode, item listing, markers | 27 |
tools/media_pool.py |
MediaPool — bin/folder tree, media & timeline import, move/delete/relink/unlink, timeline creation |
25 |
tools/render.py |
Render/Deliver — formats/codecs/presets, render settings, render-queue management, job status | 24 |
tools/timeline_item.py |
TimelineItem — properties, markers, clip attributes, takes |
22 |
tools/project_manager.py |
ProjectManager — project list/create/load/save/close/delete, folder navigation, database switching, import/export/restore |
20 |
tools/resolve_app.py |
App-level — page navigation, product/version info, UI layout presets, keyframe mode, render-preset import/export | 18 |
tools/fusion.py |
Fusion comp management on timeline items — list/add/import/export/load/delete/rename | 16 |
tools/timeline_edit.py |
Timeline mutation — insert/append/delete/move edits, scene-cut detection | 12 |
tools/audio.py |
Audio / Fairlight — voice isolation, audio-specific track tools | 10 |
tools/fx_plugins.py |
OFX / FX plugins — apply, configure, cache, classify, and animate effects/templates | 18 |
tools/project.py |
Project info & settings — summary, get/set settings, name, supported render resolutions | 10 |
tools/inspector.py |
Inspector — timeline-item property inspection and editing | 8 |
tools/media_storage.py |
MediaStorage — mounted-volume browsing, add-to-media-pool |
7 |
tools/ai.py |
AI / Neural Engine — Magic Mask, Smart Reframe, Stabilize, AI subtitles | 6 |
tools/transcription.py |
Local speech-to-text (mlx-whisper / openai-whisper) | 6 |
tools/transitions.py |
Transitions — author/place native, MotionVFX, and default timeline transitions | 6 |
tools/keyframes.py |
Keyframes — read/set/delete animation keyframes on timeline items | 4 |
tools/export_still.py |
Timeline export, current-frame still export, clip thumbnail grab | 3 |
tools/code.py |
execute_resolve_code — arbitrary-snippet escape hatch for uncovered API surface |
1 |
tools/screenshot.py |
Screenshot of the running Resolve UI, returned as an in-band MCP Image |
1 |
| Total | 316 |
Plus:
- 3 read-only resources (
resources.py):resolve://project/info,resolve://timeline/current,resolve://mediapool/structure. - 1 prompt (
app.py):editing_strategy— a recommended end-to-end workflow for driving Resolve through this tool surface.
Run ./.venv/bin/python -c "from davinci_resolve_mcp.server import mcp; import asyncio; print(len(asyncio.run(mcp.list_tools())))"
yourself at any time to re-verify the live count (316 + 18 = 334) — no Resolve
installation required.
18 tools that never open a Resolve connection — no _conn(), no
DaVinciResolveScript, no import-time Resolve. Each is a single
action-dispatch @mcp.tool() (one tool name, an action parameter, and
typed per-action arguments) that reads and/or writes local files — Resolve's
own .drp/.drt/.drx/.comp formats, plus a local SQLite store — and
returns a JSON string. Failures come back as an "Error: ..." string, exactly
like the live tools, never a raised exception.
Any tool action that writes or mutates state returns "verified": false
in its JSON result. That flag means the write is structurally correct —
it round-trips through this project's own parser, matches the on-disk format
byte-for-byte where checked, and passes the automated test fixtures — but it
has not yet been calibrated by loading the result into a live DaVinci
Resolve and confirming Resolve reads it identically. Treat "verified": false output as "correct by construction, unconfirmed by Resolve itself"
until you've round-tripped it through a real Resolve session. (Read-only
actions that write nothing return no "verified" field at all — there is
nothing to verify.)
Query capabilities (action "report") at any time for a live, in-process
inventory of every offline domain, its action vocabulary, and which optional
dependencies (ffmpeg, PyYAML, zstandard) are available in the current
interpreter — all 18 below degrade to a clear "Error: ..." string for the
one action that needs a missing optional dependency, rather than failing to
import.
| Tool name | Domain | What it does |
|---|---|---|
capabilities |
Self-inspection | Report offline dependency availability + the domain/action catalog, as JSON. |
drx |
.drx grade files |
Inspect/decode a PowerGrade's zstd-compressed FieldsBlob, export/import ASC-CDL, attach a LUT, apply catalog grading ops, verify against a fixture. |
drt |
.drt timelines |
Parse, author, and surgically edit a .drt/.drp SeqContainer timeline (tracks, clips, in/out frames). |
drp |
.drp projects |
Read/author a .drp Resolve Project — folders, Media-Pool clips, timelines, embedded Project XML. |
project_read |
Read-only inspector | One-call read of any .drp or .drt file into a flattened {timelines, clipRecords, ...} summary. |
project_db |
DB-backed grade ops | Batch operations (e.g. node-graph relayout) across a set of local .drx grade files. |
offline_ref |
Reference frames | Extract a still frame from local media via ffmpeg, and tag shot intent. |
conform |
Conform/relink QC | Diff a project's recorded media links against an on-disk manifest by frame math, not filename guessing. |
color_trace |
Grade carry-over | Match clips between a graded project and its re-conform by content identity, and carry grades across. |
offline_fusion |
.comp files |
Inspect/edit a Fusion composition file's node graph offline. |
audio_plan |
Fairlight planning | Turn a project spec into a Fairlight track/stem plan, plus coverage/loudness analysis. |
fairlight_plan |
Bus routing | Compute a Fairlight bus-routing plan (the scripting API can't create buses; this plans what a DB patch would need). |
offline_audio |
Loudness/level QC | Measure LUFS/dBTP/LRA for a media file via ffmpeg's ebur128 filter, with optional pass/fail targets. |
pipeline |
DB-as-truth orchestration | Compile a spec into the local SQLite store, run pipeline stages with gates, and track intent-vs-actual drift. |
deliverable |
Compliance QC | Run a named compliance profile (broadcast-legal/gamut + custom checks) against caller-supplied numbers. |
media_ingest |
Assistant-editor ingest | Scan a folder into a SQLite media manifest (hash + optional ffprobe technical metadata). |
editorial |
Changelist diffing | Diff two .drp/.drt projects by clip DbId identity and report what changed. |
provenance |
Audit ledger | Append and query an immutable provenance/audit trail in the local SQLite store. |
These compose four internal layers that do the real parsing/computation — tools never reimplement it themselves:
formats/—drx_xml,drx_codec(the length-prefixed zstdFieldsBlobcodec, via thezstandardpackage),cdl,lut,drt,drp.store/—db.py(the local SQLite project/run/stage store) andprovenance.py(the append-only ledger layered on it).grading/— deterministic compute cores:cdl_ops,white_balance,skin_match,qc(broadcast-legal/gamut checks).- Optional executables/packages (
ffmpeg, PyYAML,zstandard) are declared as theofflineextra inpyproject.toml— install with./.venv/bin/pip install -e ".[offline]"; every tool still imports and degrades gracefully without them.
These tools are implemented in Python and share the same lazy, single-process architecture as the live tool surface.
| Component | Requirement |
|---|---|
| Python | 3.10 or newer |
| DaVinci Resolve | A recent version with external scripting enabled; Studio is recommended because some APIs are edition- or version-gated |
| Operating system | macOS, Windows, or Linux; standard Resolve scripting paths are auto-detected per OS |
| MCP client | Any client that can launch a local stdio MCP server |
| Node.js | 18+ only when using the optional npx GitHub bootstrapper or skills installer |
The base install includes the MCP runtime. Optional capabilities are grouped so users only install what they need:
| Extra | Adds |
|---|---|
offline |
zstandard for compressed DRX payloads and PyYAML for YAML pipeline specs |
transcription |
Local Whisper transcription (mlx-whisper on macOS, openai-whisper elsewhere) |
screenshot |
mss and Pillow for screenshot capture on Windows/Linux; macOS uses its native capture path |
Resolve API availability varies by Resolve version, edition, current page, selected object, and project state. Unsupported calls return a readable error instead of taking down the server.
Want an AI agent (e.g. Claude Code) to set this up for you? Hand it
INSTALL.md— an imperative, gated setup runbook written for an agent to execute end-to-end (detect OS → install → verify tool registration offline → enable Resolve scripting → register with your MCP client → live smoke test). The steps below are the same process for a human. (INSTALL.md's own gate prints its own tool count — seeINSTALL.mdfor the exact figure it currently checks.)
Requirements: Python 3.10+, and DaVinci Resolve (Studio recommended — some tools are Studio-only and degrade to an explanatory error string on the free edition) installed locally for actual use. The server itself installs and starts fine without Resolve present; tools simply return connection errors until Resolve is running.
From a clone, install.py creates the venv, installs the server, and registers it
with your MCP clients automatically (with a backup of any existing config):
git clone https://github.com/CiprianSpiridon/davinci-resolve-mcp.git
cd davinci-resolve-mcp
python3 install.py # venv + install + register all detected clients
# or target specific clients / preview:
python3 install.py --clients cursor,claude-code
python3 install.py --dry-run --clients allPrefer not to clone? Install straight from Git, then run setup:
pipx install "git+https://github.com/CiprianSpiridon/davinci-resolve-mcp.git"
# or: pip install "git+https://github.com/CiprianSpiridon/davinci-resolve-mcp.git"
davinci-resolve-mcp setup --clients cursor,claude-codeOr run the bootstrapper directly from the public GitHub repository with npx. The server itself is Python, so Python 3.10+ must still be installed:
npx github:CiprianSpiridon/davinci-resolve-mcp setup
npx github:CiprianSpiridon/davinci-resolve-mcp doctorAfter installing, check health any time with davinci-resolve-mcp doctor (verifies
all 334 tools — 316 live + 18 offline — register and, if Resolve is running, that a live
connection succeeds). The setup/doctor subcommands are also available on the console script directly
(davinci-resolve-mcp setup --clients cursor).
git clone https://github.com/CiprianSpiridon/davinci-resolve-mcp.git
cd davinci-resolve-mcp
python3 -m venv .venv
./.venv/bin/pip install -e .This installs the davinci-resolve-mcp console script (defined in pyproject.toml as
davinci-resolve-mcp = "davinci_resolve_mcp.server:main") into .venv/bin/, plus the
mcp[cli] dependency. requirements.txt mirrors the same runtime dependencies if you
prefer pip install -r requirements.txt.
Install optional capabilities as needed:
./.venv/bin/pip install -e ".[offline]"
./.venv/bin/pip install -e ".[transcription]"
./.venv/bin/pip install -e ".[screenshot]"
# or install every optional group together:
./.venv/bin/pip install -e ".[offline,transcription,screenshot]"In DaVinci Resolve: Preferences → General → External scripting using must be set to
Local (or Network) for the scripting API to be reachable at all.
All configuration is via environment variables, and every one is optional — the
server auto-detects the standard per-OS Resolve install paths. See
.env.example for the full reference:
| Variable | Purpose | Default (auto-detected) |
|---|---|---|
RESOLVE_SCRIPT_LIB |
Path to the fusionscript shared library |
macOS: /Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so · Windows: C:\Program Files\Blackmagic Design\DaVinci Resolve\fusionscript.dll · Linux: /opt/resolve/libs/Fusion/fusionscript.so |
RESOLVE_SCRIPT_API |
Path to the Resolve Developer/Scripting directory (its Modules subfolder is added to sys.path) |
macOS: /Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting · Windows: %PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting · Linux: /opt/resolve/Developer/Scripting |
RESOLVE_MCP_LOG_LEVEL |
Server log verbosity (DEBUG/INFO/WARNING/ERROR) — logs go to stderr, never stdout, since stdout carries the MCP protocol stream |
INFO |
Only set these if your Resolve install lives somewhere non-standard. Set them as
real environment variables — the env block of your MCP client config (see below)
is the recommended place, or export them in your shell. .env.example lists the
variables and per-platform defaults for reference; the server reads the process
environment and does not auto-load a .env file.
Add an entry to your claude_desktop_config.json
(~/Library/Application Support/Claude/claude_desktop_config.json on macOS,
%APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"davinci-resolve": {
"command": "/absolute/path/to/davinci-resolve-mcp/.venv/bin/davinci-resolve-mcp",
"env": {
"RESOLVE_MCP_LOG_LEVEL": "INFO"
}
}
}
}Use the absolute path to the davinci-resolve-mcp script inside your virtualenv's
bin/ (or Scripts\davinci-resolve-mcp.exe on Windows) — Claude Desktop does not
inherit your shell's PATH or activated virtualenv. Restart Claude Desktop after
editing the config. Only add RESOLVE_SCRIPT_LIB / RESOLVE_SCRIPT_API to env if
your Resolve install is in a non-standard location (see Configuration).
Cursor reads MCP server configuration from ~/.cursor/mcp.json (global) or
.cursor/mcp.json in a specific project. The shape is the same as Claude Desktop's:
{
"mcpServers": {
"davinci-resolve": {
"command": "/absolute/path/to/davinci-resolve-mcp/.venv/bin/davinci-resolve-mcp",
"env": {
"RESOLVE_MCP_LOG_LEVEL": "INFO"
}
}
}
}Reload the MCP servers list in Cursor's settings (or restart Cursor) after adding this,
then enable the davinci-resolve server for the chat/agent you're using.
Once the server is connected, ask your MCP client in ordinary language. Good first requests are small, observable, and easy to verify:
- “Show me the current project, active timeline, tracks, and playhead timecode.”
- “Create a bin named
Selects, import these three files, and report what Resolve accepted.” - “List the clips on video track 1, then move the playhead to the start of
Interview A.” - “Read the Inspector transform values for the selected clip; do not change anything.”
- “Apply a cross dissolve at
01:00:12:00, then verify the timeline changed.” - “Queue the current timeline with the
YouTube 1080ppreset, but do not start rendering.” - “Inspect this
.drpoffline and report missing media without opening Resolve.”
For mutating work, ask the agent to inspect first, state the exact target, make one change, and verify by reading the resulting Resolve state back.
This repository ships four canonical agent skills under skills/. The
tracked .claude/skills/ entries are compatibility symlinks to those same folders, so
there is only one source of truth per skill.
| Skill | Purpose |
|---|---|
davinci-resolve |
Set up and operate the MCP with an inspect → act → verify workflow |
davinci-resolve-use-plugins |
Apply OFX/ResolveFX and use Fusion titles, generators, and template packs |
davinci-resolve-generate-plugin-list |
Index installed effects and templates into a machine-local catalog |
davinci-resolve-remove-silences-bad-takes-and-umms |
Build and verify a non-destructive first-pass editorial cleanup |
The base skill includes onboarding and operation guidance, safety around destructive or
rendering actions, screenshot discipline, recipes, and an exact tool reference at
skills/davinci-resolve/reference/tool-catalog.md.
Install them globally (available in Claude Code, Cowork, and other compatible agents) with the skills.sh CLI:
npx skills add CiprianSpiridon/davinci-resolve-mcp --global --agent '*' -yOr copy the skills into the global skills directory manually (Claude Code and Cowork both read this location):
mkdir -p ~/.claude/skills
cp -R skills/davinci-resolve* ~/.claude/skills/The repo is also installable as a Claude Code plugin — this bundles both the MCP
server registration (via .mcp.json, using uvx so there's no manual pip install)
and the agent skill in one step, using the
repo itself as a plugin marketplace
(.claude-plugin/marketplace.json +
.claude-plugin/plugin.json):
claude plugin marketplace add CiprianSpiridon/davinci-resolve-mcp
claude plugin install davinci-resolveThis works the same way in Claude Code and Claude Cowork (both read the same
plugin/marketplace configuration). After install, restart the client if prompted; the
davinci-resolve MCP server and the davinci-resolve skill are both active with no
further setup. Requires Python 3.10+ and uvx (from uv)
on PATH for the bundled MCP server to launch — see
Installation for alternatives if you'd rather manage the venv
yourself and point a client at the console script directly.
This server can make real, immediate changes to Resolve projects and local files.
- Save or back up important projects before broad edits, grade application, relinking, project deletion, render-queue changes, or arbitrary-code execution.
- Inspect the current project, timeline, target clip, and selected page before mutating them. Prefer one bounded change followed by a readback check.
- Treat
execute_resolve_code,execute_fusion_lua, project deletion, file-writing offline actions, andquit_resolveas high-impact tools. - Keep Resolve external scripting set to
Localunless you intentionally need remote access and understand the network boundary. - A mutating offline result with
"verified": falseis structurally validated but has not been confirmed by importing it into a live Resolve session. - Never point output paths at the only copy of valuable media or project files.
Run davinci-resolve-mcp doctor first. For a gated, phase-by-phase setup and recovery
flow, use INSTALL.md.
| Symptom | Check |
|---|---|
| Client shows no tools | Use the absolute virtualenv executable path, validate the client JSON, and fully restart the client |
| “Could not connect to DaVinci Resolve” | Start Resolve, open a project, enable Preferences → General → External scripting using → Local, then retry |
DaVinciResolveScript cannot be imported |
Set RESOLVE_SCRIPT_API and RESOLVE_SCRIPT_LIB to the actual Resolve installation paths |
| One API call is unavailable | Check Resolve version, edition, current page, selected object, and project state; APIs differ across releases |
| Compressed DRX or YAML action reports a missing package | Install .[offline] in the same interpreter your MCP client launches |
| Local transcription is unavailable | Install .[transcription]; model downloads can be large and happen on first use |
| Logs appear to corrupt MCP output | Logs must go to stderr; do not print diagnostics to stdout from tool or startup code |
./.venv/bin/pip install -e . pytest
./.venv/bin/pytesttests/test_tool_exposure.py imports the full server with no DaVinci Resolve
instance present and no network access, and asserts:
- at least 100 tools are registered (the real count is 334: 316 live + 18 offline — see the Tool catalog and Offline tools sections above),
- every tool name is globally unique,
- every tool has a non-empty docstring/description,
- the module-ownership contract holds (e.g. exactly one
detect_scene_cuts, exactly onegrab_still, noinsert_*tools registered outsidetimeline_edit.py).
The test suite is designed to collect and run without Resolve. Live integration tests
under tests/live/ are separately marked and skip when a Resolve session is not
available.
Issues and pull requests are welcome once the repository is public.
- Open an issue for substantial changes so scope and Resolve-version behavior can be agreed before implementation.
- Create a focused branch and virtual environment.
- Install the project plus the optional extras needed by the changed surface.
- Add or update tests that run without Resolve whenever possible.
- Run
python -m pytest -qandgit diff --checkbefore opening a pull request.
When adding a tool, keep the repository contracts intact: register against the single
mcp instance, connect lazily through the shared helpers, give the tool a unique name
and complete docstring, catch runtime failures at the tool boundary, and update the
tool catalog/counts. Keep machine-generated catalogs, local media, caches, and personal
workflow state out of commits.
- Use GitHub Issues for reproducible bugs and feature requests. Include OS, Python version, Resolve version/edition, MCP client, the tool name, and sanitized stderr.
- Use GitHub Discussions for setup questions, workflows, and design proposals.
- Do not post credentials, project databases, customer media, or private project paths.
- For a suspected vulnerability, use GitHub's private vulnerability reporting from the repository Security tab when available. If it is unavailable, contact the maintainer privately through their GitHub profile before public disclosure.
The package is currently version 1.0.0. The registered surface is tested offline on
every run, while live behavior necessarily depends on the installed Resolve release and
the active project. Public releases should document supported Resolve versions and any
known edition-specific limitations.
MIT.
This is an independent, unofficial project and is not affiliated with or endorsed by Blackmagic Design. DaVinci Resolve, Fusion, Fairlight, and related product names belong to their respective owners.