davinci-mcp 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. davinci_mcp-1.0.0/PKG-INFO +311 -0
  2. davinci_mcp-1.0.0/README.md +291 -0
  3. davinci_mcp-1.0.0/pyproject.toml +163 -0
  4. davinci_mcp-1.0.0/pyproject.toml.orig +90 -0
  5. davinci_mcp-1.0.0/src/davinci_mcp/__init__.py +4 -0
  6. davinci_mcp-1.0.0/src/davinci_mcp/__main__.py +90 -0
  7. davinci_mcp-1.0.0/src/davinci_mcp/actions/__init__.py +2 -0
  8. davinci_mcp-1.0.0/src/davinci_mcp/actions/pipeline.py +390 -0
  9. davinci_mcp-1.0.0/src/davinci_mcp/actions/registry.py +333 -0
  10. davinci_mcp-1.0.0/src/davinci_mcp/actions/repair.py +152 -0
  11. davinci_mcp-1.0.0/src/davinci_mcp/actions/spec.py +188 -0
  12. davinci_mcp-1.0.0/src/davinci_mcp/api/__init__.py +4 -0
  13. davinci_mcp-1.0.0/src/davinci_mcp/api/_generated/__init__.py +10 -0
  14. davinci_mcp-1.0.0/src/davinci_mcp/api/_generated/api_surface_21_1.json +7520 -0
  15. davinci_mcp-1.0.0/src/davinci_mcp/api/_generated/resolve_21_1.py +2117 -0
  16. davinci_mcp-1.0.0/src/davinci_mcp/api/stub_parser.py +239 -0
  17. davinci_mcp-1.0.0/src/davinci_mcp/api/surface.py +100 -0
  18. davinci_mcp-1.0.0/src/davinci_mcp/audit.py +42 -0
  19. davinci_mcp-1.0.0/src/davinci_mcp/bridge/__init__.py +2 -0
  20. davinci_mcp-1.0.0/src/davinci_mcp/bridge/install.py +33 -0
  21. davinci_mcp-1.0.0/src/davinci_mcp/bridge/resolve_bridge.py +463 -0
  22. davinci_mcp-1.0.0/src/davinci_mcp/cache.py +48 -0
  23. davinci_mcp-1.0.0/src/davinci_mcp/capabilities.py +121 -0
  24. davinci_mcp-1.0.0/src/davinci_mcp/config.py +141 -0
  25. davinci_mcp-1.0.0/src/davinci_mcp/connection/__init__.py +2 -0
  26. davinci_mcp-1.0.0/src/davinci_mcp/connection/backend.py +24 -0
  27. davinci_mcp-1.0.0/src/davinci_mcp/connection/bridge.py +289 -0
  28. davinci_mcp-1.0.0/src/davinci_mcp/connection/external.py +151 -0
  29. davinci_mcp-1.0.0/src/davinci_mcp/connection/manager.py +221 -0
  30. davinci_mcp-1.0.0/src/davinci_mcp/domains/__init__.py +53 -0
  31. davinci_mcp-1.0.0/src/davinci_mcp/domains/_runtime.py +44 -0
  32. davinci_mcp-1.0.0/src/davinci_mcp/domains/ai.py +703 -0
  33. davinci_mcp-1.0.0/src/davinci_mcp/domains/app.py +480 -0
  34. davinci_mcp-1.0.0/src/davinci_mcp/domains/audio.py +854 -0
  35. davinci_mcp-1.0.0/src/davinci_mcp/domains/code.py +166 -0
  36. davinci_mcp-1.0.0/src/davinci_mcp/domains/color.py +1052 -0
  37. davinci_mcp-1.0.0/src/davinci_mcp/domains/fusion.py +1798 -0
  38. davinci_mcp-1.0.0/src/davinci_mcp/domains/gallery.py +524 -0
  39. davinci_mcp-1.0.0/src/davinci_mcp/domains/interchange.py +1353 -0
  40. davinci_mcp-1.0.0/src/davinci_mcp/domains/item.py +1191 -0
  41. davinci_mcp-1.0.0/src/davinci_mcp/domains/media.py +1947 -0
  42. davinci_mcp-1.0.0/src/davinci_mcp/domains/project.py +1026 -0
  43. davinci_mcp-1.0.0/src/davinci_mcp/domains/render.py +1153 -0
  44. davinci_mcp-1.0.0/src/davinci_mcp/domains/snapshots.py +56 -0
  45. davinci_mcp-1.0.0/src/davinci_mcp/domains/timeline.py +1830 -0
  46. davinci_mcp-1.0.0/src/davinci_mcp/domains/ui.py +471 -0
  47. davinci_mcp-1.0.0/src/davinci_mcp/domains/vision.py +781 -0
  48. davinci_mcp-1.0.0/src/davinci_mcp/domains/workflow.py +1346 -0
  49. davinci_mcp-1.0.0/src/davinci_mcp/errors.py +91 -0
  50. davinci_mcp-1.0.0/src/davinci_mcp/executor.py +66 -0
  51. davinci_mcp-1.0.0/src/davinci_mcp/images.py +42 -0
  52. davinci_mcp-1.0.0/src/davinci_mcp/install.py +148 -0
  53. davinci_mcp-1.0.0/src/davinci_mcp/jobs.py +259 -0
  54. davinci_mcp-1.0.0/src/davinci_mcp/py.typed +0 -0
  55. davinci_mcp-1.0.0/src/davinci_mcp/receipts.py +34 -0
  56. davinci_mcp-1.0.0/src/davinci_mcp/recipes/__init__.py +7 -0
  57. davinci_mcp-1.0.0/src/davinci_mcp/recipes/builtin/assemble_timeline.yaml +24 -0
  58. davinci_mcp-1.0.0/src/davinci_mcp/recipes/builtin/conform_and_deliver.yaml +27 -0
  59. davinci_mcp-1.0.0/src/davinci_mcp/recipes/engine.py +366 -0
  60. davinci_mcp-1.0.0/src/davinci_mcp/recipes/loader.py +75 -0
  61. davinci_mcp-1.0.0/src/davinci_mcp/recipes/model.py +126 -0
  62. davinci_mcp-1.0.0/src/davinci_mcp/recipes/templating.py +77 -0
  63. davinci_mcp-1.0.0/src/davinci_mcp/refs.py +349 -0
  64. davinci_mcp-1.0.0/src/davinci_mcp/safety/__init__.py +2 -0
  65. davinci_mcp-1.0.0/src/davinci_mcp/safety/consent.py +142 -0
  66. davinci_mcp-1.0.0/src/davinci_mcp/safety/pages.py +65 -0
  67. davinci_mcp-1.0.0/src/davinci_mcp/safety/paths.py +83 -0
  68. davinci_mcp-1.0.0/src/davinci_mcp/safety/snapshots.py +193 -0
  69. davinci_mcp-1.0.0/src/davinci_mcp/server.py +527 -0
@@ -0,0 +1,311 @@
1
+ Metadata-Version: 2.4
2
+ Name: davinci-mcp
3
+ Version: 1.0.0
4
+ Summary: Exhaustive, typed and safe MCP server for DaVinci Resolve.
5
+ Keywords: mcp,davinci-resolve,video-editing,ai-agents
6
+ Author: Delanoe Pirard
7
+ Author-email: Delanoe Pirard <delanoe.pirard@gmail.com>
8
+ License-Expression: Apache-2.0
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Intended Audience :: End Users/Desktop
11
+ Classifier: Programming Language :: Python :: 3.13
12
+ Classifier: Topic :: Multimedia :: Video :: Non-Linear Editor
13
+ Requires-Dist: fastmcp>=4.1.3,<5
14
+ Requires-Dist: pydantic>=2.11
15
+ Requires-Dist: pyyaml>=6.0
16
+ Requires-Python: >=3.13
17
+ Project-URL: Repository, https://github.com/Aedelon/davinci-mcp
18
+ Project-URL: Changelog, https://github.com/Aedelon/davinci-mcp/blob/main/CHANGELOG.md
19
+ Description-Content-Type: text/markdown
20
+
21
+ <p align="center">
22
+ <img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/banner.png" alt="davinci-mcp: the safe, verified MCP server for DaVinci Resolve" width="100%">
23
+ </p>
24
+
25
+ <p align="center">
26
+ <a href="https://github.com/Aedelon/davinci-mcp/actions/workflows/ci.yml"><img src="https://github.com/Aedelon/davinci-mcp/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
27
+ <a href="https://pypi.org/project/davinci-mcp/"><img src="https://img.shields.io/pypi/v/davinci-mcp?color=e9762b" alt="PyPI"></a>
28
+ <img src="https://img.shields.io/badge/python-3.13%2B-3776ab" alt="Python 3.13+">
29
+ <img src="https://img.shields.io/badge/license-Apache%202.0-blue" alt="Apache 2.0">
30
+ <img src="https://img.shields.io/badge/DaVinci%20Resolve-21.1-d9381e" alt="DaVinci Resolve 21.1">
31
+ <img src="https://img.shields.io/badge/MCP-2026--07--28-7a8a99" alt="MCP spec 2026-07-28">
32
+ <a href="https://ko-fi.com/aedelon"><img src="https://img.shields.io/badge/Ko--fi-support-ff5e5b?logo=ko-fi&logoColor=white" alt="Support on Ko-fi"></a>
33
+ </p>
34
+
35
+ <p align="center"><b>Let an AI agent edit, grade and deliver in DaVinci Resolve, with every change checked.</b></p>
36
+
37
+ ---
38
+
39
+ davinci-mcp is an [MCP](https://modelcontextprotocol.io) server for **DaVinci Resolve**. It gives AI agents such as Claude access to the whole Resolve scripting API: 299 typed actions across 17 domains. Every change is **verified against Resolve itself** before it is reported as done.
40
+
41
+ It is built for **editors and colorists** who want an assistant that does the clicking, and for **developers** who want a dependable bridge between an agent and Resolve.
42
+
43
+ ## See it work
44
+
45
+ A real Claude agent, given four plain messages, cut this 52-second action trailer from the open movie *Tears of Steel*. It imported the footage, laid out 33 shots on the beat, added the title cards, graded teal and orange, and rendered it. Nothing in the run was staged; the video below is sped up 4×.
46
+
47
+ <p align="center">
48
+ <a href="https://www.youtube.com/watch?v=iT-ptK_Gx-g"><img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/demo-preview.gif" alt="A Claude agent editing a trailer in DaVinci Resolve through davinci-mcp" width="100%"></a>
49
+ <br><sub><a href="https://www.youtube.com/watch?v=iT-ptK_Gx-g">▶ Watch the full demo on YouTube (39 s)</a></sub>
50
+ </p>
51
+
52
+ <p align="center">
53
+ <a href="https://www.youtube.com/watch?v=epndWG8TqFM"><img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/trailer-poster.jpg" alt="The trailer the agent cut" width="70%"></a>
54
+ <br><sub><a href="https://www.youtube.com/watch?v=epndWG8TqFM">▶ Watch the trailer the agent cut on YouTube (52 s)</a></sub>
55
+ </p>
56
+
57
+ ## Why davinci-mcp
58
+
59
+ **Verified, not hopeful**
60
+ - Every write is read back from Resolve, and its receipt says `verified: true` or `false`. An agent can't claim a change that didn't happen.
61
+ - `dry_run` previews any write without applying it.
62
+ - Deletes need consent: the first call returns a plan and a `confirm_token`, and nothing is removed until the same call comes back with the token.
63
+ - Destructive edits take a safety snapshot of the timeline first.
64
+ - Every call is written to a JSONL audit log.
65
+
66
+ **Reliable**
67
+ - In the benchmark below, 20 of 20 jobs passed. The community MCP server passed 13 of 20.
68
+ - Near-miss parameters are repaired instead of refused (`fade_out` → `FadeOut`, a bare clip name → a selector), and every rewrite is reported.
69
+ - Errors are actionable: they suggest the right field ("did you mean"), name the right tool, and say which render setting Resolve rejected.
70
+
71
+ **Economical**
72
+ - `batch_run` chains a whole sequence server-side in one call, for example 18 steps from timeline to render.
73
+ - Clients defer the tools, so the first turn costs about 32k tokens of context.
74
+ - Replies and schemas are compact. Against the community server: **31 % cheaper** and **60 % fewer calls**.
75
+
76
+ **Exhaustive and extensible**
77
+ - 17 domains: project, media, timeline, item, color, Fusion, gallery, audio, render, interchange, AI tools, UI, app and more.
78
+ - One-call workflows: `conform_from_edl`, `deliver`, `build_vertical_reel`, `apply_look`, `title_overlay`.
79
+ - Your own [recipes](https://github.com/Aedelon/davinci-mcp/blob/main/docs/recipes.md): YAML templates, plus Python when you opt in.
80
+
81
+ **Safe by default**
82
+ - File access is limited to the folders you allow.
83
+ - The server's own state, its configuration and your Claude configuration files are always off-limits.
84
+ - Symlinks are never followed when importing a folder.
85
+
86
+ ## Benchmarks
87
+
88
+ Headless Claude agents (Sonnet) ran four post-production jobs on a live Resolve Studio 21.1, five runs each. An agent that never saw the server's code wrote the jobs:
89
+ - **dailies**: log and organise a day of footage;
90
+ - **promo**: build a promo with a music bed;
91
+ - **look**: grade with versions and a still;
92
+ - **spot QC**: duplicate, export interchange files and render a range.
93
+
94
+ Each check reads Resolve directly, never through the server under test. Every agent ran under the same isolated harness. [Full method and history →](https://github.com/Aedelon/davinci-mcp/blob/main/eval/RESULTS.md)
95
+
96
+ <p align="center">
97
+ <img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/bench-success.svg" alt="Jobs completed: davinci-mcp 100 %, community MCP 65 %, Resolve built-in MCP 100 %" width="49%">
98
+ <img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/bench-cost.svg" alt="Cost for the 4 jobs: davinci-mcp $0.62, community MCP $0.99, Resolve built-in MCP $0.35" width="49%">
99
+ </p>
100
+
101
+ | Server | Jobs passed | Tool calls | Cost (4 jobs) |
102
+ |---|---|---|---|
103
+ | **davinci-mcp** | **20 / 20** | 35 | $0.62 |
104
+ | Community MCP ([samuelgursky/davinci-resolve-mcp](https://github.com/samuelgursky/davinci-resolve-mcp)) | 13 / 20 | 90 | $0.99 |
105
+ | Resolve's built-in MCP | 20 / 20 | 17 | $0.35 |
106
+
107
+ **About the built-in server.** Resolve 21.1 ships its own MCP server, which is cheaper because it hands the agent one tool, `run_script_unsafe`, to run arbitrary Python inside Resolve. That makes for short runs, but nothing is validated, read back, audited, snapshotted or confirmed before a delete. In our scale test (160 clips, 4 timelines) it once put a marker at the wrong frame, then reported the job done. davinci-mcp trades a little cost for changes you can trust.
108
+
109
+ ## Talk to it like an editor
110
+
111
+ ```text
112
+ Import the clips in ~/Footage/day03, sort interviews and B-roll into bins, and colour the circled takes green.
113
+ ```
114
+ ```text
115
+ Build a 9:16 reel from these three shots, add subtitles from the audio, and render it for Instagram.
116
+ ```
117
+ ```text
118
+ Conform this EDL against the media in ~/Rushes and deliver a ProRes master and an H.264 proxy.
119
+ ```
120
+ ```text
121
+ Apply the show LUT to every shot of the timeline except the end card, and grab a still of the first shot.
122
+ ```
123
+ ```text
124
+ Add a red marker at the start of every shot named "broll_" in Edit_03.
125
+ ```
126
+ ```text
127
+ Duplicate the approved cut as "QC", export it as FCPXML and OTIO, and render 01:00:02:00 to 01:00:07:24.
128
+ ```
129
+
130
+ ## How it works
131
+
132
+ ```mermaid
133
+ flowchart LR
134
+ A["AI agent<br/>Claude, Cursor…"] -->|MCP call| V["Validate<br/>+ repair"]
135
+ V --> C["Consent<br/>deletes only"]
136
+ C --> N["Snapshot<br/>destructive only"]
137
+ N --> X["Call Resolve<br/>one thread"]
138
+ X <-->|scripting API| D[("DaVinci<br/>Resolve")]
139
+ X --> R["Read back<br/>→ receipt"]
140
+ R --> L["Audit log"]
141
+ R -->|"verified: true / false"| A
142
+ ```
143
+
144
+ 1. **Validate.** The agent calls a domain tool such as `timeline_write` with `{"op": {"action": ..., ...}}`, and the parameters are checked against a typed schema. Almost-right parameters are repaired, and each repair is reported.
145
+ 2. **Consent and snapshot.** Deletes stop at a plan until they are confirmed, and destructive edits take a snapshot first.
146
+ 3. **Call Resolve.** The call runs on a single executor thread, the only place Resolve is ever called from.
147
+ 4. **Read back.** The server reads the result back from Resolve and returns a receipt with `verified`. Long renders become jobs that the agent can wait on.
148
+
149
+
150
+ ## Install
151
+
152
+ <details open>
153
+ <summary><b>Requirements</b></summary>
154
+
155
+ - **DaVinci Resolve Studio 21.1 or later.** In *Preferences → General → External scripting using*, choose **Local**.
156
+ - **The free edition** is reachable through the in-app bridge: run `davinci-mcp install --bridge`, then start the bridge from *Workspace → Scripts*.
157
+ - **Python 3.13+** and [uv](https://docs.astral.sh/uv/).
158
+ </details>
159
+
160
+ ```bash
161
+ uv tool install davinci-mcp
162
+ ```
163
+
164
+ ```bash
165
+ davinci-mcp doctor
166
+ ```
167
+
168
+ `doctor` checks that Resolve is reachable and reports its version, edition and channel.
169
+
170
+ <details>
171
+ <summary><b>Claude Code</b></summary>
172
+
173
+ ```bash
174
+ davinci-mcp install --target claude-code
175
+ ```
176
+
177
+ Or add it by hand:
178
+
179
+ ```bash
180
+ claude mcp add davinci-mcp -- davinci-mcp serve
181
+ ```
182
+ </details>
183
+
184
+ <details>
185
+ <summary><b>Claude Desktop</b></summary>
186
+
187
+ ```bash
188
+ davinci-mcp install --target claude-desktop
189
+ ```
190
+
191
+ This adds the server to `claude_desktop_config.json`. Restart Claude Desktop to load it. To do it by hand:
192
+
193
+ ```json
194
+ {
195
+ "mcpServers": {
196
+ "davinci-mcp": { "command": "davinci-mcp", "args": ["serve"] }
197
+ }
198
+ }
199
+ ```
200
+
201
+ If Claude Desktop can't find the command, use its absolute path (`which davinci-mcp`).
202
+ </details>
203
+
204
+ <details>
205
+ <summary><b>Cursor</b></summary>
206
+
207
+ In `~/.cursor/mcp.json`:
208
+
209
+ ```json
210
+ {
211
+ "mcpServers": {
212
+ "davinci-mcp": { "command": "davinci-mcp", "args": ["serve"] }
213
+ }
214
+ }
215
+ ```
216
+ </details>
217
+
218
+ <details>
219
+ <summary><b>VS Code</b></summary>
220
+
221
+ In `.vscode/mcp.json`:
222
+
223
+ ```json
224
+ {
225
+ "servers": {
226
+ "davinci-mcp": { "type": "stdio", "command": "davinci-mcp", "args": ["serve"] }
227
+ }
228
+ }
229
+ ```
230
+ </details>
231
+
232
+ <details>
233
+ <summary><b>Any other MCP client</b></summary>
234
+
235
+ Run `davinci-mcp serve` over stdio. Use `davinci-mcp serve --transport http` for Streamable HTTP; it binds to loopback and needs a bearer token for any other host. The server also exposes a `davinci://status` resource.
236
+ </details>
237
+
238
+ ## Configure
239
+
240
+ The optional file `~/.config/davinci-mcp/config.toml` holds the settings. Any key can be overridden with a `DAVINCI_MCP_<SECTION>__<KEY>` environment variable.
241
+
242
+ ```toml
243
+ [safety]
244
+ allowed_roots = ["~/Movies", "~/Projects"] # files outside these are refused (default: your home)
245
+ auto_snapshot = "destructive" # "off" | "destructive" | "all"
246
+
247
+ [recipes]
248
+ allow_python = false # Python recipes run arbitrary code: opt in
249
+ ```
250
+
251
+ ## FAQ
252
+
253
+ <details>
254
+ <summary><b>The agent says it cannot reach Resolve</b></summary>
255
+
256
+ Check three things:
257
+ - Resolve is running;
258
+ - in Studio, *External scripting using* is set to **Local**;
259
+ - no dialog is open in Resolve, such as an update prompt or a project manager.
260
+
261
+ Then run `davinci-mcp doctor`.
262
+ </details>
263
+
264
+ <details>
265
+ <summary><b>Does it work with the free edition?</b></summary>
266
+
267
+ Yes, through the in-app bridge (`davinci-mcp install --bridge`). Resolve 21.1 removed external scripting from the free edition, so the bridge runs inside Resolve instead.
268
+ </details>
269
+
270
+ <details>
271
+ <summary><b>Can it delete my work?</b></summary>
272
+
273
+ Not without consent. Every delete returns a plan first and needs a matching `confirm_token`. Destructive edits snapshot the timeline, and every call is logged.
274
+ </details>
275
+
276
+ <details>
277
+ <summary><b>Will it touch files outside my projects?</b></summary>
278
+
279
+ Only inside `allowed_roots`. The server's own state, its configuration and your Claude configuration files are always refused, whatever you allow.
280
+ </details>
281
+
282
+ <details>
283
+ <summary><b>Why is the built-in Resolve MCP cheaper?</b></summary>
284
+
285
+ It runs one unchecked Python script per job. davinci-mcp makes typed, verified calls, so it uses a few more steps. `batch_run` and the one-call workflows keep that overhead small.
286
+ </details>
287
+
288
+ ## Contributing
289
+
290
+ Issues and pull requests are welcome. [docs/domain-guide.md](https://github.com/Aedelon/davinci-mcp/blob/main/docs/domain-guide.md) shows how to add an action: a parameter model, a handler, a read-back check and a test. The rest is generated from there.
291
+
292
+ ```bash
293
+ uv sync
294
+ uv run pytest
295
+ uv run ruff check . && uv run pyright
296
+ ```
297
+
298
+ ## Credits
299
+
300
+ - Demo footage: *Tears of Steel*, © Blender Foundation | [mango.blender.org](https://mango.blender.org), CC-BY 3.0.
301
+ - Demo music: *Five Armies* by Kevin MacLeod ([incompetech.com](https://incompetech.com)), CC-BY 4.0.
302
+
303
+ davinci-mcp is an independent project. It is not affiliated with, endorsed by or sponsored by Blackmagic Design. DaVinci Resolve is a trademark of Blackmagic Design Pty. Ltd.
304
+
305
+ ## Support
306
+
307
+ davinci-mcp is free and open source. If it saves you time in the edit, you can buy me a coffee:
308
+
309
+ <a href="https://ko-fi.com/aedelon"><img src="https://ko-fi.com/img/githubbutton_sm.svg" alt="Support davinci-mcp on Ko-fi"></a>
310
+
311
+ Made by Delanoe Pirard (Aedelon) · Apache 2.0
@@ -0,0 +1,291 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/banner.png" alt="davinci-mcp: the safe, verified MCP server for DaVinci Resolve" width="100%">
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/Aedelon/davinci-mcp/actions/workflows/ci.yml"><img src="https://github.com/Aedelon/davinci-mcp/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
7
+ <a href="https://pypi.org/project/davinci-mcp/"><img src="https://img.shields.io/pypi/v/davinci-mcp?color=e9762b" alt="PyPI"></a>
8
+ <img src="https://img.shields.io/badge/python-3.13%2B-3776ab" alt="Python 3.13+">
9
+ <img src="https://img.shields.io/badge/license-Apache%202.0-blue" alt="Apache 2.0">
10
+ <img src="https://img.shields.io/badge/DaVinci%20Resolve-21.1-d9381e" alt="DaVinci Resolve 21.1">
11
+ <img src="https://img.shields.io/badge/MCP-2026--07--28-7a8a99" alt="MCP spec 2026-07-28">
12
+ <a href="https://ko-fi.com/aedelon"><img src="https://img.shields.io/badge/Ko--fi-support-ff5e5b?logo=ko-fi&logoColor=white" alt="Support on Ko-fi"></a>
13
+ </p>
14
+
15
+ <p align="center"><b>Let an AI agent edit, grade and deliver in DaVinci Resolve, with every change checked.</b></p>
16
+
17
+ ---
18
+
19
+ davinci-mcp is an [MCP](https://modelcontextprotocol.io) server for **DaVinci Resolve**. It gives AI agents such as Claude access to the whole Resolve scripting API: 299 typed actions across 17 domains. Every change is **verified against Resolve itself** before it is reported as done.
20
+
21
+ It is built for **editors and colorists** who want an assistant that does the clicking, and for **developers** who want a dependable bridge between an agent and Resolve.
22
+
23
+ ## See it work
24
+
25
+ A real Claude agent, given four plain messages, cut this 52-second action trailer from the open movie *Tears of Steel*. It imported the footage, laid out 33 shots on the beat, added the title cards, graded teal and orange, and rendered it. Nothing in the run was staged; the video below is sped up 4×.
26
+
27
+ <p align="center">
28
+ <a href="https://www.youtube.com/watch?v=iT-ptK_Gx-g"><img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/demo-preview.gif" alt="A Claude agent editing a trailer in DaVinci Resolve through davinci-mcp" width="100%"></a>
29
+ <br><sub><a href="https://www.youtube.com/watch?v=iT-ptK_Gx-g">▶ Watch the full demo on YouTube (39 s)</a></sub>
30
+ </p>
31
+
32
+ <p align="center">
33
+ <a href="https://www.youtube.com/watch?v=epndWG8TqFM"><img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/trailer-poster.jpg" alt="The trailer the agent cut" width="70%"></a>
34
+ <br><sub><a href="https://www.youtube.com/watch?v=epndWG8TqFM">▶ Watch the trailer the agent cut on YouTube (52 s)</a></sub>
35
+ </p>
36
+
37
+ ## Why davinci-mcp
38
+
39
+ **Verified, not hopeful**
40
+ - Every write is read back from Resolve, and its receipt says `verified: true` or `false`. An agent can't claim a change that didn't happen.
41
+ - `dry_run` previews any write without applying it.
42
+ - Deletes need consent: the first call returns a plan and a `confirm_token`, and nothing is removed until the same call comes back with the token.
43
+ - Destructive edits take a safety snapshot of the timeline first.
44
+ - Every call is written to a JSONL audit log.
45
+
46
+ **Reliable**
47
+ - In the benchmark below, 20 of 20 jobs passed. The community MCP server passed 13 of 20.
48
+ - Near-miss parameters are repaired instead of refused (`fade_out` → `FadeOut`, a bare clip name → a selector), and every rewrite is reported.
49
+ - Errors are actionable: they suggest the right field ("did you mean"), name the right tool, and say which render setting Resolve rejected.
50
+
51
+ **Economical**
52
+ - `batch_run` chains a whole sequence server-side in one call, for example 18 steps from timeline to render.
53
+ - Clients defer the tools, so the first turn costs about 32k tokens of context.
54
+ - Replies and schemas are compact. Against the community server: **31 % cheaper** and **60 % fewer calls**.
55
+
56
+ **Exhaustive and extensible**
57
+ - 17 domains: project, media, timeline, item, color, Fusion, gallery, audio, render, interchange, AI tools, UI, app and more.
58
+ - One-call workflows: `conform_from_edl`, `deliver`, `build_vertical_reel`, `apply_look`, `title_overlay`.
59
+ - Your own [recipes](https://github.com/Aedelon/davinci-mcp/blob/main/docs/recipes.md): YAML templates, plus Python when you opt in.
60
+
61
+ **Safe by default**
62
+ - File access is limited to the folders you allow.
63
+ - The server's own state, its configuration and your Claude configuration files are always off-limits.
64
+ - Symlinks are never followed when importing a folder.
65
+
66
+ ## Benchmarks
67
+
68
+ Headless Claude agents (Sonnet) ran four post-production jobs on a live Resolve Studio 21.1, five runs each. An agent that never saw the server's code wrote the jobs:
69
+ - **dailies**: log and organise a day of footage;
70
+ - **promo**: build a promo with a music bed;
71
+ - **look**: grade with versions and a still;
72
+ - **spot QC**: duplicate, export interchange files and render a range.
73
+
74
+ Each check reads Resolve directly, never through the server under test. Every agent ran under the same isolated harness. [Full method and history →](https://github.com/Aedelon/davinci-mcp/blob/main/eval/RESULTS.md)
75
+
76
+ <p align="center">
77
+ <img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/bench-success.svg" alt="Jobs completed: davinci-mcp 100 %, community MCP 65 %, Resolve built-in MCP 100 %" width="49%">
78
+ <img src="https://raw.githubusercontent.com/Aedelon/davinci-mcp/main/docs/assets/bench-cost.svg" alt="Cost for the 4 jobs: davinci-mcp $0.62, community MCP $0.99, Resolve built-in MCP $0.35" width="49%">
79
+ </p>
80
+
81
+ | Server | Jobs passed | Tool calls | Cost (4 jobs) |
82
+ |---|---|---|---|
83
+ | **davinci-mcp** | **20 / 20** | 35 | $0.62 |
84
+ | Community MCP ([samuelgursky/davinci-resolve-mcp](https://github.com/samuelgursky/davinci-resolve-mcp)) | 13 / 20 | 90 | $0.99 |
85
+ | Resolve's built-in MCP | 20 / 20 | 17 | $0.35 |
86
+
87
+ **About the built-in server.** Resolve 21.1 ships its own MCP server, which is cheaper because it hands the agent one tool, `run_script_unsafe`, to run arbitrary Python inside Resolve. That makes for short runs, but nothing is validated, read back, audited, snapshotted or confirmed before a delete. In our scale test (160 clips, 4 timelines) it once put a marker at the wrong frame, then reported the job done. davinci-mcp trades a little cost for changes you can trust.
88
+
89
+ ## Talk to it like an editor
90
+
91
+ ```text
92
+ Import the clips in ~/Footage/day03, sort interviews and B-roll into bins, and colour the circled takes green.
93
+ ```
94
+ ```text
95
+ Build a 9:16 reel from these three shots, add subtitles from the audio, and render it for Instagram.
96
+ ```
97
+ ```text
98
+ Conform this EDL against the media in ~/Rushes and deliver a ProRes master and an H.264 proxy.
99
+ ```
100
+ ```text
101
+ Apply the show LUT to every shot of the timeline except the end card, and grab a still of the first shot.
102
+ ```
103
+ ```text
104
+ Add a red marker at the start of every shot named "broll_" in Edit_03.
105
+ ```
106
+ ```text
107
+ Duplicate the approved cut as "QC", export it as FCPXML and OTIO, and render 01:00:02:00 to 01:00:07:24.
108
+ ```
109
+
110
+ ## How it works
111
+
112
+ ```mermaid
113
+ flowchart LR
114
+ A["AI agent<br/>Claude, Cursor…"] -->|MCP call| V["Validate<br/>+ repair"]
115
+ V --> C["Consent<br/>deletes only"]
116
+ C --> N["Snapshot<br/>destructive only"]
117
+ N --> X["Call Resolve<br/>one thread"]
118
+ X <-->|scripting API| D[("DaVinci<br/>Resolve")]
119
+ X --> R["Read back<br/>→ receipt"]
120
+ R --> L["Audit log"]
121
+ R -->|"verified: true / false"| A
122
+ ```
123
+
124
+ 1. **Validate.** The agent calls a domain tool such as `timeline_write` with `{"op": {"action": ..., ...}}`, and the parameters are checked against a typed schema. Almost-right parameters are repaired, and each repair is reported.
125
+ 2. **Consent and snapshot.** Deletes stop at a plan until they are confirmed, and destructive edits take a snapshot first.
126
+ 3. **Call Resolve.** The call runs on a single executor thread, the only place Resolve is ever called from.
127
+ 4. **Read back.** The server reads the result back from Resolve and returns a receipt with `verified`. Long renders become jobs that the agent can wait on.
128
+
129
+
130
+ ## Install
131
+
132
+ <details open>
133
+ <summary><b>Requirements</b></summary>
134
+
135
+ - **DaVinci Resolve Studio 21.1 or later.** In *Preferences → General → External scripting using*, choose **Local**.
136
+ - **The free edition** is reachable through the in-app bridge: run `davinci-mcp install --bridge`, then start the bridge from *Workspace → Scripts*.
137
+ - **Python 3.13+** and [uv](https://docs.astral.sh/uv/).
138
+ </details>
139
+
140
+ ```bash
141
+ uv tool install davinci-mcp
142
+ ```
143
+
144
+ ```bash
145
+ davinci-mcp doctor
146
+ ```
147
+
148
+ `doctor` checks that Resolve is reachable and reports its version, edition and channel.
149
+
150
+ <details>
151
+ <summary><b>Claude Code</b></summary>
152
+
153
+ ```bash
154
+ davinci-mcp install --target claude-code
155
+ ```
156
+
157
+ Or add it by hand:
158
+
159
+ ```bash
160
+ claude mcp add davinci-mcp -- davinci-mcp serve
161
+ ```
162
+ </details>
163
+
164
+ <details>
165
+ <summary><b>Claude Desktop</b></summary>
166
+
167
+ ```bash
168
+ davinci-mcp install --target claude-desktop
169
+ ```
170
+
171
+ This adds the server to `claude_desktop_config.json`. Restart Claude Desktop to load it. To do it by hand:
172
+
173
+ ```json
174
+ {
175
+ "mcpServers": {
176
+ "davinci-mcp": { "command": "davinci-mcp", "args": ["serve"] }
177
+ }
178
+ }
179
+ ```
180
+
181
+ If Claude Desktop can't find the command, use its absolute path (`which davinci-mcp`).
182
+ </details>
183
+
184
+ <details>
185
+ <summary><b>Cursor</b></summary>
186
+
187
+ In `~/.cursor/mcp.json`:
188
+
189
+ ```json
190
+ {
191
+ "mcpServers": {
192
+ "davinci-mcp": { "command": "davinci-mcp", "args": ["serve"] }
193
+ }
194
+ }
195
+ ```
196
+ </details>
197
+
198
+ <details>
199
+ <summary><b>VS Code</b></summary>
200
+
201
+ In `.vscode/mcp.json`:
202
+
203
+ ```json
204
+ {
205
+ "servers": {
206
+ "davinci-mcp": { "type": "stdio", "command": "davinci-mcp", "args": ["serve"] }
207
+ }
208
+ }
209
+ ```
210
+ </details>
211
+
212
+ <details>
213
+ <summary><b>Any other MCP client</b></summary>
214
+
215
+ Run `davinci-mcp serve` over stdio. Use `davinci-mcp serve --transport http` for Streamable HTTP; it binds to loopback and needs a bearer token for any other host. The server also exposes a `davinci://status` resource.
216
+ </details>
217
+
218
+ ## Configure
219
+
220
+ The optional file `~/.config/davinci-mcp/config.toml` holds the settings. Any key can be overridden with a `DAVINCI_MCP_<SECTION>__<KEY>` environment variable.
221
+
222
+ ```toml
223
+ [safety]
224
+ allowed_roots = ["~/Movies", "~/Projects"] # files outside these are refused (default: your home)
225
+ auto_snapshot = "destructive" # "off" | "destructive" | "all"
226
+
227
+ [recipes]
228
+ allow_python = false # Python recipes run arbitrary code: opt in
229
+ ```
230
+
231
+ ## FAQ
232
+
233
+ <details>
234
+ <summary><b>The agent says it cannot reach Resolve</b></summary>
235
+
236
+ Check three things:
237
+ - Resolve is running;
238
+ - in Studio, *External scripting using* is set to **Local**;
239
+ - no dialog is open in Resolve, such as an update prompt or a project manager.
240
+
241
+ Then run `davinci-mcp doctor`.
242
+ </details>
243
+
244
+ <details>
245
+ <summary><b>Does it work with the free edition?</b></summary>
246
+
247
+ Yes, through the in-app bridge (`davinci-mcp install --bridge`). Resolve 21.1 removed external scripting from the free edition, so the bridge runs inside Resolve instead.
248
+ </details>
249
+
250
+ <details>
251
+ <summary><b>Can it delete my work?</b></summary>
252
+
253
+ Not without consent. Every delete returns a plan first and needs a matching `confirm_token`. Destructive edits snapshot the timeline, and every call is logged.
254
+ </details>
255
+
256
+ <details>
257
+ <summary><b>Will it touch files outside my projects?</b></summary>
258
+
259
+ Only inside `allowed_roots`. The server's own state, its configuration and your Claude configuration files are always refused, whatever you allow.
260
+ </details>
261
+
262
+ <details>
263
+ <summary><b>Why is the built-in Resolve MCP cheaper?</b></summary>
264
+
265
+ It runs one unchecked Python script per job. davinci-mcp makes typed, verified calls, so it uses a few more steps. `batch_run` and the one-call workflows keep that overhead small.
266
+ </details>
267
+
268
+ ## Contributing
269
+
270
+ Issues and pull requests are welcome. [docs/domain-guide.md](https://github.com/Aedelon/davinci-mcp/blob/main/docs/domain-guide.md) shows how to add an action: a parameter model, a handler, a read-back check and a test. The rest is generated from there.
271
+
272
+ ```bash
273
+ uv sync
274
+ uv run pytest
275
+ uv run ruff check . && uv run pyright
276
+ ```
277
+
278
+ ## Credits
279
+
280
+ - Demo footage: *Tears of Steel*, © Blender Foundation | [mango.blender.org](https://mango.blender.org), CC-BY 3.0.
281
+ - Demo music: *Five Armies* by Kevin MacLeod ([incompetech.com](https://incompetech.com)), CC-BY 4.0.
282
+
283
+ davinci-mcp is an independent project. It is not affiliated with, endorsed by or sponsored by Blackmagic Design. DaVinci Resolve is a trademark of Blackmagic Design Pty. Ltd.
284
+
285
+ ## Support
286
+
287
+ davinci-mcp is free and open source. If it saves you time in the edit, you can buy me a coffee:
288
+
289
+ <a href="https://ko-fi.com/aedelon"><img src="https://ko-fi.com/img/githubbutton_sm.svg" alt="Support davinci-mcp on Ko-fi"></a>
290
+
291
+ Made by Delanoe Pirard (Aedelon) · Apache 2.0