Skip to main content
Glama
angelOnly

DaVinci Resolve MCP Server

by angelOnly
README.md
# DaVinci Resolve MCP Server

Control DaVinci Resolve Studio from MCP clients such as Claude Desktop.

This project exposes Resolve projects, timelines, media, Fusion, color, audio,
playback, and rendering operations through a local
[Model Context Protocol](https://modelcontextprotocol.io/) server.

## What it does

The server provides:

- 32 MCP tools for editing and controlling Resolve;
- 6 read-only MCP resources describing the current Resolve state;
- automatic discovery of the DaVinci Resolve scripting API on Windows, macOS,
  and Linux;
- a protected native-module probe, so a broken `fusionscript` import does not
  crash the MCP server;
- Windows runtime isolation to prevent Resolve from loading an incompatible
  Python DLL.

Example requests from an MCP client:

> Create a project called “Product Launch”.

> Import these three clips and create a timeline called “Rough Cut”.

> Add a blue marker at frame 240 with the note “Review transition”.

> Save the current grade as a still in the “Approved Looks” album.

## Requirements

- **DaVinci Resolve Studio 18 or newer.** External scripting must be enabled.
- **64-bit CPython 3.10 or 3.11.** Resolve's scripting module still imports
  `imp`, which was removed from Python 3.12.
- The DaVinci Resolve scripting API installed with Resolve.
- An MCP client such as Claude Desktop.

Before starting the server, open Resolve and set:

**Preferences → System → General → External scripting using → Local**

The free edition of Resolve does not expose the external scripting connection
used by this server. The MCP process can start, but it will remain disconnected.

## Installation

Clone the repository first:

```bash
git clone https://github.com/Tooflex/davinci-resolve-mcp.git
cd davinci-resolve-mcp
```

### Windows

Use a regular 64-bit Python from python.org. Do not use a `uv`-managed standalone
Python on Windows: Resolve's `fusionscript.dll` is known to crash with those
builds.

Install Python 3.10:

```powershell
winget install --id Python.Python.3.10 -e
```

Create the environment and install the dependencies:

```powershell
& "$env:LOCALAPPDATA\Programs\Python\Python310\python.exe" -m venv .venv310
.\.venv310\Scripts\python.exe -m pip install --upgrade pip
.\.venv310\Scripts\python.exe -m pip install -e .
```

Start the server through the Windows launcher:

```powershell
.\run_server.ps1
```

Always use `run_server.ps1` on Windows. It pins Resolve to the correct Python
runtime, isolates `PATH`, and configures the scripting API paths before starting
the server.

### macOS

Create a virtual environment with CPython 3.10 or 3.11:

```bash
python3.11 -m venv .venv
./.venv/bin/python -m pip install --upgrade pip
./.venv/bin/python -m pip install -e .
```

Start the server:

```bash
./.venv/bin/davinci-resolve-mcp
```

The standard Resolve API locations are detected automatically:

- `/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules`
- `~/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules`

Both Intel and Apple Silicon Macs use the same Resolve application and scripting
paths.

### Linux

Create the environment and install the dependencies:

```bash
python3.11 -m venv .venv
./.venv/bin/python -m pip install --upgrade pip
./.venv/bin/python -m pip install -e .
./.venv/bin/davinci-resolve-mcp
```

The default Linux scripting path is `/opt/resolve/Developer/Scripting/Modules`.

If you use `uv` as an installer, target an existing compatible CPython
environment explicitly:

```bash
uv pip install --python .venv/bin/python -e .
```

On Windows, continue to use the regular python.org environment and
`run_server.ps1`; do not let `uv` provision a standalone Python runtime.

## MCP client configuration

The server uses the MCP standard I/O transport. Configure your client to launch
the server as a local process.

### Claude Desktop on Windows

Edit `%APPDATA%\Claude\claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "davinci-resolve": {
      "command": "powershell",
      "args": [
        "-NoProfile",
        "-ExecutionPolicy",
        "Bypass",
        "-File",
        "C:\\absolute\\path\\to\\davinci-resolve-mcp\\run_server.ps1"
      ]
    }
  }
}
```

### Claude Desktop on macOS

Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "davinci-resolve": {
      "command": "/absolute/path/to/davinci-resolve-mcp/.venv/bin/davinci-resolve-mcp",
      "args": []
    }
  }
}
```

### Other MCP clients

Use the same command and argument pairs shown above:

- Windows: `powershell -NoProfile -ExecutionPolicy Bypass -File <run_server.ps1>`
- macOS/Linux: `<venv>/bin/davinci-resolve-mcp`

Use absolute paths. Keep Resolve running, restart the MCP client after changing
its configuration, and then check that the `davinci-resolve` tools are available.

## Available MCP resources

| URI | Description |
| --- | --- |
| `system://status` | Connection, project, and timeline status |
| `project://current` | Current project name and timeline count |
| `timeline://current` | Current timeline name, duration, and video-track count |
| `timeline://items` | Items on the first video track |
| `mediapool://current` | Current media-pool folder and clip count |
| `gallery://albums` | Gallery album names |

## Available MCP tools

### Projects and navigation

| Tool | Operation |
| --- | --- |
| `refresh` | Refresh cached Resolve objects |
| `create_project` | Create a project |
| `load_project` | Open an existing project |
| `save_project` | Save the current project |
| `export_project` | Export a project to a file |
| `import_project` | Import a project file |
| `set_project_setting` | Change a project setting |
| `open_page` | Open Media, Edit, Fusion, Color, Fairlight, or Deliver |

### Media and timelines

| Tool | Operation |
| --- | --- |
| `import_media` | Import files into the media pool |
| `add_sub_folder` | Add a media-pool subfolder |
| `create_timeline` | Create an empty timeline |
| `set_current_timeline` | Select a timeline by its 1-based index |
| `append_to_timeline` | Append named clips |
| `create_timeline_from_clips` | Build a timeline from named clips |
| `import_timeline_from_file` | Import a timeline such as XML or EDL |
| `set_clip_property` | Change a timeline clip property |
| `add_timeline_marker` | Add a marker at a frame |
| `add_track` | Add a video, audio, or subtitle track |
| `set_track_name` | Rename a track |
| `enable_track` | Enable or disable a track |
| `set_current_version` | Select a color or Fusion clip version |

### Fusion and color

| Tool | Operation |
| --- | --- |
| `execute_lua` | Execute Lua in Resolve's Fusion environment |
| `create_fusion_node` | Add a node to the current Fusion composition |
| `add_color_node` | Add a color node to the current clip |
| `save_still` | Save the current grade to a gallery album |
| `apply_still` | Apply a named still to a clip |

`execute_lua` runs code inside Resolve. Only execute scripts from sources you
trust.

### Audio, playback, and rendering

| Tool | Operation |
| --- | --- |
| `set_audio_volume` | Set a named clip's audio volume |
| `set_track_volume` | Set an audio-track volume |
| `play_timeline` | Start playback |
| `stop_timeline` | Stop playback |
| `set_playhead_position` | Move the playhead to a frame |
| `start_project_render` | Start a render with an optional preset and output path |

## How the connection bootstrap works

`server.py` imports `resolve_env.py` before creating `ResolveAPI`.

On every platform, the bootstrap:

1. selects the Resolve scripting API and native library paths;
2. propagates the selected Modules directory to child processes;
3. probes `DaVinciResolveScript` in a disposable subprocess;
4. imports the native library in the MCP process only when the probe exits
   safely.

On Windows, Resolve may otherwise select a Python runtime from the Windows
registry and load a foreign `python3xx.dll` into the current process.
`FUSION_PYTHON3_HOME`, DLL preloading, and the isolated launcher prevent that
native crash.

## Environment overrides

Defaults work for standard Resolve installations. For a custom installation,
set these variables before starting the server:

| Variable | Purpose |
| --- | --- |
| `RESOLVE_SCRIPT_PATH` | Directory containing `DaVinciResolveScript.py` |
| `RESOLVE_SCRIPT_API` | Root of Resolve's `Developer/Scripting` directory |
| `RESOLVE_SCRIPT_LIB` | Absolute path to `fusionscript.dll` or `fusionscript.so` |
| `FUSION_PYTHON3_HOME` | Windows Python runtime Resolve must load |

Example:

```bash
export RESOLVE_SCRIPT_PATH="/custom/Developer/Scripting/Modules"
export RESOLVE_SCRIPT_API="/custom/Developer/Scripting"
export RESOLVE_SCRIPT_LIB="/custom/Fusion/fusionscript.so"
./.venv/bin/davinci-resolve-mcp
```

## Troubleshooting

### The server starts but is not connected

- Confirm that DaVinci Resolve Studio is running.
- Set **External scripting using** to **Local**, then restart Resolve.
- Confirm that the configured Python is version 3.10 or 3.11.
- Check that the Resolve scripting Modules directory exists.

The server intentionally remains available in a disconnected state when it
cannot initialize Resolve.

### `scriptapp('Resolve') returned None`

The native module loaded, but it could not obtain a running Resolve object.
Resolve is either closed, external scripting is disabled, or the installed
edition does not support external scripting.

### `ModuleNotFoundError: No module named 'imp'`

Python 3.12 or newer is being used. Recreate the virtual environment with Python
3.10 or 3.11.

### Windows access violation `0xC0000005`

Launch the project through `run_server.ps1`, not with `python server.py`.

The crash occurs when `fusionscript.dll` loads an incompatible Python runtime,
often from another python.org or Anaconda installation registered on the
machine. The launcher sets `FUSION_PYTHON3_HOME` and isolates DLL resolution.

### `No valid Resolve scripting module path found`

Set `RESOLVE_SCRIPT_PATH` to the directory containing
`DaVinciResolveScript.py`. If the native library is also in a non-standard
location, set `RESOLVE_SCRIPT_LIB`.

### Missing MCP dependencies

Install the project into the same interpreter configured in the MCP client:

```bash
python -m pip install -e .
```

## Development

Install the project in editable mode:

```bash
python -m pip install -e .
```

Run the unit tests:

```bash
python -m unittest discover -s tests -v
```

Run syntax checks:

```bash
python -m py_compile server.py resolve_api.py resolve_env.py
```

The GitHub Actions workflow runs the unit tests on Python 3.10 and 3.11 across
Windows, macOS, and Linux.

Contributions should keep platform-specific bootstrap behavior covered by tests.

TDQS

B3/5.0

Scored across 32 tools

Disambiguation4/5

Most tools target distinct resources and actions (e.g., project management, timeline editing, color grading). A few potential overlaps exist—such as set_audio_volume vs. set_track_volume and add_color_node vs. create_fusion_node—but descriptions clearly differentiate them.

Naming Consistency5/5

All tool names follow a consistent verb_noun (or verb_phrase) pattern, e.g., create_project, load_project, set_track_name, play_timeline. There are no mixed conventions or ambiguous verb choices.

Tool Count4/5

32 tools is high but appropriate for a full-featured video editing server covering project management, timeline manipulation, media import, color grading, playback, and rendering. Each tool addresses a distinct operation, and the count reflects the complexity of DaVinci Resolve without bloat.

Completeness3/5

The toolset covers many workflows but has notable gaps: no project deletion, no timeline deletion, no media pool listing, and no generic query tools to inspect current state. The refresh tool exists but does not expose data to the agent, making it hard to discover available projects or clips.

Maintenance

ActivityStale
ResponsivenessNo issues