DaVinci Resolve MCP Server
Exposes 20 tools for project, media, render, and timeline control in DaVinci Resolve 18+ via stdio MCP, enabling AI agents to operate the software through natural language.
README
<img width="1672" height="941" alt="image" src="https://github.com/user-attachments/assets/86fa31b1-9229-484a-9ce8-6314d4015340" />
davinci-resolve-cli (dvr)
A CLI for DaVinci Resolve 18+ — project / media / render / timeline control for humans and AI agents.
Demo
$ dvr doctor --format json | jq '{version, edition, bridgeStatus}'
{
"version": "19.1.4.11",
"edition": "Studio",
"bridgeStatus": "ok"
}
$ dvr project current --format json
{
"name": "Untitled Project",
"timelineCount": 1,
"framerate": 24.0,
"resolution": { "width": 3840, "height": 2160 }
}
$ dvr render presets --format json | head -3
[
"H.264 Master",
"ProRes 422 HQ"
$ dvr timeline marker add --at 00:00:01:00 --note "review" --color Green --format json
{ "ok": true, "frame": 24, "timecode": "00:00:01:00" }
$ dvr mcp # ← then any MCP client (stdio) can call 20 tools
An animated demo will replace this snapshot once
vhs docs/demo.tapecan be run on macOS 15 (the tape script anddocs/demo.tapesource are already in the repo).
Install
pipx install davinci-resolve-cli
Requires DaVinci Resolve 18+ already installed (Studio recommended). macOS first; Windows/Linux follow.
Quickstart
# Health check
dvr doctor
# Project ops
dvr project list
dvr project current
# Media batch
dvr media import ~/footage --recursive --bin "Day1"
# Render (async)
JOB=$(dvr render submit --preset "H.264 Master" --timeline cur --output ~/out.mp4 --format json | jq -r .jobId)
dvr render wait "$JOB"
# Timeline scripted edits
dvr timeline marker add --at 01:00:05:00 --note "review"
Capabilities at a glance
| Domain | Subcommands | What it does |
|---|---|---|
doctor |
— | Diagnose the Resolve bridge environment (version, Studio / Free, API path, issues) |
project |
list / current / open / new / close / save / export / import |
Project library CRUD |
media |
import / list / tag |
Media-pool batch ops — recursive import, per-bin lookup, 16 named flag colors, partial-failure reporting |
render |
presets / submit / status / list / wait / cancel |
Async render queue. submit returns a jobId immediately; wait blocks until terminal (completed / failed / cancelled) |
timeline |
list / current / open / new / delete / clips / cut* / move*<br>marker add / delete / list |
Timeline CRUD + marker ops. *cut and move go through the WI bridge but currently emit placeholder behavior because Resolve has no public razor / clip-move API — see docs/wi-research.md. |
mcp |
— | Start a stdio MCP server exposing 20 tools (one per CLI verb), each with a JSON-Schema'd inputSchema |
subtitle |
import / export |
Round-trip .srt / .vtt between disk and the timeline subtitle track |
config |
show / init |
TOML-driven defaults; <cwd>/.dvr/config.toml and ~/.dvr/config.toml merged, CLI flag > project > user > built-in |
install-wi |
--uninstall / --force |
Deploy / remove the Workflow Integration plugin used by timeline cut and timeline move |
Conventions across every command:
--format json|yaml|table— JSON by default in non-TTY,table(rich) in TTY, override viaDVR_OUTPUT- Structured errors on stderr —
{"errorCode", "message", "hint"}, stable codes (resolve_not_running,validation_error,not_found,api_call_failed,wi_unavailable, …) --dry-runon every mutating command — prints theplannedactions without touching Resolve- Exit codes:
0ok,1user error,2Resolve unavailable,3API call failed
Output formats
| context | default |
|---|---|
| TTY | table (rich) |
| pipe / non-TTY | json |
Override with --format json|yaml|table or DVR_OUTPUT=yaml.
AI Agent
dvr ships two complementary AI-agent integration paths.
1. Skill file (SKILL.md)
A SKILL.md packaged with the wheel; auto-discovered by skill systems that scan installed packages. Five worked example prompts:
- "Render the current timeline as 1080p mp4"
- "List clips imported today and tag them green"
- "Wait for render job X and tell me when it finishes"
- "Check if Resolve is ready"
- "Tag all clips in Day1 bin as Green for review"
2. MCP server (dvr mcp)
Standard stdio MCP server exposing 20 tools across doctor / project.* / media.* / render.* / timeline.* namespaces. Any MCP-aware AI client can wire it up:
// .mcp.json or your client's MCP server config
{
"mcpServers": {
"davinci-resolve": {
"command": "dvr",
"args": ["mcp"]
}
}
}
Tool errors are returned as structured JSON {"errorCode", "message", "hint"} matching the CLI's stderr contract — same error codes (resolve_not_running, validation_error, not_found, etc.) so an agent can branch on them deterministically.
Verify the server is reachable:
dvr mcp # blocks, reads stdin/writes stdout per MCP spec
Architecture
flowchart LR
Human["Human<br/>(terminal)"]
Agent["AI agent<br/>(MCP client)"]
CLI["dvr CLI"]
MCP["dvr mcp<br/>(stdio)"]
Boot["bootstrap.py"]
DVRScript["DaVinciResolveScript"]
Resolve["DaVinci Resolve 18+"]
WIServer["wi_client.py<br/>(localhost:50420)"]
WIPlugin["WI plugin<br/>(JS, inside Resolve)"]
Jobs["~/.dvr/jobs.json"]
Human -->|argv| CLI
Agent -->|tool calls| MCP
MCP -->|same helpers| CLI
CLI --> Boot --> DVRScript --> Resolve
CLI -->|render jobs| Jobs
CLI -->|cut/move<br/>JSON-RPC| WIServer
WIPlugin -->|poll /inbox<br/>POST /result| WIServer
WIPlugin --> Resolve
Five command domains, two transports (CLI + MCP), one bridge (DaVinciResolveScript), one escape hatch for ops the Python API doesn't cover (Workflow Integration). Full write-up in docs/architecture.md.
Compatibility
| OS | Status |
|---|---|
| macOS (Apple Silicon / Intel) | ✅ primary, end-to-end verified |
| Windows | ✅ unit + CI tested (real-Resolve smoke pending community feedback) |
| Linux | ✅ unit + CI tested (Resolve Studio Linux only) |
| Resolve | Status |
|---|---|
| 18.x Studio | ✅ |
| 18.x Free | ⚠️ partial (render encoders limited) |
| 17.x or older | ❌ unsupported |
Cookbook
Five end-to-end recipes covering the most common workflows. Each is a copy-paste shell snippet that assumes DaVinci Resolve 18+ Studio is running and a project is open.
1. Render the current timeline as 1080p H.264 mp4
# Preflight: make sure the bridge is healthy
dvr doctor --format json | jq -e '.bridgeStatus == "ok"' >/dev/null || { echo "Resolve not ready"; exit 2; }
# Pick the first preset whose name contains "H.264"
PRESET=$(dvr render presets --format json | jq -r '.[] | select(test("H\\.264"; "i"))' | head -1)
# Submit (async — returns immediately), then block until done
JOB=$(dvr render submit --preset "$PRESET" --timeline cur --output ~/Renders/out.mp4 --start --format json | jq -r .jobId)
dvr render wait "$JOB" # progress to stderr, terminal status to stdout
2. Import a SD card's footage into per-date bins
# Assumes ~/footage/<YYYY-MM-DD>/ structure
for day_dir in ~/footage/*/; do
day=$(basename "$day_dir")
dvr media import "$day_dir" --bin "$day" --recursive --format json | jq '.imported | length' \
| xargs -I{} echo "imported {} clips into '$day'"
done
3. Tag every clip in a bin as "Green" for review (skipping ones already tagged)
BIN="Day1"
IDS=$(dvr media list --bin "$BIN" --format json \
| jq -r '.[] | select(.flags | index("Green") | not) | .id')
[ -n "$IDS" ] && dvr media tag $IDS --color Green --format json
4. Drop chapter markers from a CSV file (timecode, label)
# chapters.csv:
# 00:00:00:00,intro
# 00:01:30:00,demo
# 00:04:15:00,outro
while IFS=, read -r tc label; do
dvr timeline marker add --at "$tc" --name "$label" --color Sky --format json >/dev/null
done < chapters.csv
dvr timeline marker list --format json | jq '.[] | "\(.timecode) → \(.name)"'
5. AI agent: render via MCP server
Wire dvr mcp into any MCP-aware client (most desktop AI assistants now support MCP — check your client's docs for the right config file path):
// ~/.config/<client>/mcp.json
{ "mcpServers": { "davinci-resolve": { "command": "dvr", "args": ["mcp"] } } }
Then ask the agent:
"Render the currently open timeline as 1080p H.264, save it to ~/out.mp4, and tell me when it's done."
The agent will call doctor → render.presets → render.submit(start=true) → render.wait automatically. Tool errors come back as structured {errorCode, message, hint} so the agent can branch on resolve_not_running / validation_error / etc. deterministically.
Configuration
dvr reads two optional TOML files and merges them with this precedence (highest wins):
- CLI flag — per command, always wins
<cwd>/.dvr/config.toml— project-local; commit it to your repo so your team shares the same defaults~/.dvr/config.toml— user-global; your personal preferences across all projects- Built-in defaults
Initialize a commented sample in the current project:
dvr config init
See exactly which layer every effective value came from:
dvr config show --format json | jq '.sources'
Initial supported fields (more can be added incrementally without breaking changes):
[defaults]
output_format = "json" # default --format for table-capable commands
bin = "Master" # default --bin for media import / list
preset = "H.264 Master" # default --preset for render submit
marker_color = "Blue" # default --color for timeline marker add
marker_duration = 1
Troubleshooting
<details>
<summary><b>dvr doctor reports resolve_not_running but Resolve is open</b></summary>
Make sure:
- A project is open inside Resolve (the splash / project picker doesn't count).
- Preferences → System → General → External scripting using is set to
Local. The default isNone;Localis required for DaVinciResolveScript to accept connections. - You're on Resolve 18 or newer.
dvr doctorwill tell you the detected version underversion. </details>
<details> <summary><b>Free vs Studio — what works on Free?</b></summary>
dvr doctor reports your edition in the edition field. On Free:
- ✅ All
project,media,timeline marker *commands work - ⚠️
render submitworks but some preset codecs (DNxHR, ProRes 4444, etc.) are Studio-only — the job will queue but fail at encode time - ❌
dvr install-wideploys the plugin but Workflow Integrations require Resolve Studio at runtime, sotimeline cut / movewill returnwi_unavailableon Free </details>
<details>
<summary><b>pipx install fails with No matching distribution found for mcp>=1.0</b></summary>
Your Python is 3.9 or older. dvr 0.2.1+ requires Python 3.10+ because the mcp SDK does. Check with python --version. If your system Python is too old, install a newer one (pyenv install 3.12, brew install python@3.12, or use Homebrew Cask).
</details>
<details>
<summary><b>Windows: dvr doctor can't find DaVinciResolveScript</b></summary>
Resolve's default install path on Windows is %PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting\. If you installed Resolve to a custom location, set these two env vars before running dvr:
set RESOLVE_SCRIPT_API=<your-path>\Support\Developer\Scripting
set RESOLVE_SCRIPT_LIB=<your-path>\fusionscript.dll
dvr doctor --format json shows the resolved apiPath and libPath — useful to confirm what we tried.
</details>
<details>
<summary><b>I ran dvr install-wi but the bridge doesn't show up in Resolve's Workspace menu</b></summary>
- Restart Resolve. Workflow Integrations are scanned at launch.
- Check you're on Resolve Studio — WI is Studio-only.
- macOS: the plugin must land at
~/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Workflow Integration Plugins/dvr-cli-bridge/.dvr install-wi --format jsonprints the destination — verify the path exists and containsmanifest.xml / index.html / server.js. - After enabling under Workspace → Workflow Integrations, a small panel should pop up showing "Polling localhost:50420…". If you don't see it, check Resolve's
console.log(Help → Logs). </details>
Development
pip install -e ".[dev]"
pytest # unit only
pytest -m integration # requires Resolve running
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。