关于 DaVinci Resolve Lua MCP
这是一个通过 Resolve 内部 Lua 桥接脚本控制 DaVinci Resolve 21.1 免费版的 Claude Desktop MCP 服务。它提供项目与时间线操作、渲染工具,也支持运行 Lua 和搜索脚本参考文档。
主要功能
- 01提供项目、时间线、片段、标记和渲染工具
- 02通过实时 Resolve 对象运行 Lua 5.1
- 03搜索 Blackmagic 脚本参考文档
- 04通过文件通信的无网络桥接
适用场景
- 01查看项目详情和时间线内容
- 02添加或删除时间线标记
- 03启动渲染并查询进度
- 04查找脚本 API 方法或运行自定义 Lua
MCP 相关
Claude Desktop 连接 MCP 服务扩展,再由扩展与 Resolve 内运行的 Lua 桥接脚本通信。服务向客户端提供 Resolve 状态、项目与时间线操作、渲染、文档搜索及 Lua 执行能力。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
DaVinci Resolve Lua MCP
通过在 Resolve 内运行的 Lua 脚本,让 Claude 控制免费版 DaVinci Resolve 21.1。支持 macOS 和 Windows(实验性),无需 Studio 许可证,也无需网络。

DaVinci Resolve 21.1 将 Python 脚本和外部脚本 API 移到了 Studio 版,Blackmagic 自带的 MCP 服务也仅随 Studio 版提供。免费版仍有一扇门敞开:Workspace > Scripts 会列出并运行 Lua 文件。本项目会在此处放置一个小型 Lua 脚本。每次启动 Resolve 会话时运行一次,它会持有实时的 resolve 对象,并代表 MCP 服务执行 Lua。Claude Desktop 会将该服务作为扩展运行。
说明
这里的任何内容都不会解锁 Studio 功能:该桥接使用的是免费版自带的 Lua 脚本 API。Studio 21.1 用户已经可以使用 Blackmagic 原生 MCP 服务。
功能
- 15 个专用工具:项目概览、项目和时间线列表、媒体池片段、时间线项目、标记、切换时间线和项目、带状态轮询的渲染,以及对 Blackmagic 随附脚本参考文档的搜索。
run_lua满足其他需求:任何 Lua 5.1 代码块都能在 Resolve 内运行,并使用实时的resolve对象,返回 JSON、捕获的print输出和错误。- 一个
.mcpb包:将其安装到 Claude Desktop 后,服务会在首次启动时将两个 Lua 脚本复制到 Resolve 的用户脚本文件夹。 - 无需网络:服务和脚本通过请求文件与 Fusion 的偏好设置通信。不使用套接字或监听器,也不收集遥测数据。
- 响应迅速,交互流畅:在 Mac 上端到端测得每次调用约需 60 毫秒。
要求
- macOS(目前仅在 Apple Silicon 硬件上进行过测试)。
- Windows 10 或 11(实验性)。默认路径依据 Blackmagic 文档和论坛报告;目前尚未在 Windows 上进行测试。docs/windows.md 列出了需要检查的内容。
- DaVinci Resolve 21.1 免费版(已测试的版本为 21.1.0.17)。无需 Studio 版,也不针对 Studio 版。Blackmagic 没有说明此 Lua 宿主或其沙盒的相关信息,因此小版本更新可能会改变功能表现。
- Claude Desktop。它自带服务所需的 Node 运行时(Node 20 或更高版本);无需安装其他内容。
- 使用这些工具时,Resolve 中必须打开一个项目。
安装
- 下载
davinci-resolve-lua-mcp.mcpb(最新版本;发布说明和 SHA-256 值见 Releases 页面)。 - 双击该文件,或将其拖到 Claude Desktop 窗口中。Claude Desktop 会显示扩展详情和五项设置;保留默认值并点击 安装。
- 在 Resolve 中打开项目,然后点击
Workspace > Scripts > resolve_mcp_bridge。该脚本就是桥接程序;扩展首次启动时会将它放到这里。- 退出 Resolve 后,桥接程序会停止。每次启动 Resolve 后、使用工具前,都要再次点击该脚本。
- 询问 Claude:“你已连接到 DaVinci Resolve 吗?”
在终端中运行以下任一命令,即可下载文件并打开相同的对话框。
macOS:
curl -fsSLo ~/Downloads/davinci-resolve-lua-mcp.mcpb https://github.com/saadk408/davinci-resolve-lua-mcp/releases/latest/download/davinci-resolve-lua-mcp.mcpb && open ~/Downloads/davinci-resolve-lua-mcp.mcpb
Windows(PowerShell):
Invoke-WebRequest -Uri https://github.com/saadk408/davinci-resolve-lua-mcp/releases/latest/download/davinci-resolve-lua-mcp.mcpb -OutFile "$env:USERPROFILE\Downloads\davinci-resolve-lua-mcp.mcpb"; Start-Process "$env:USERPROFILE\Downloads\davinci-resolve-lua-mcp.mcpb"
如果没有打开任何内容,请在 Claude Desktop 中安装该文件:Settings > Extensions > Advanced settings > Install Extension。
若要更新,请下载新文件并打开;从文件安装的扩展不会自动更新。服务会在下次启动时刷新它的两个 Lua 脚本,因此之后请再次点击 Workspace > Scripts > resolve_mcp_bridge。若要自行构建安装包,请参阅开发。
启动和停止桥接程序
在 Resolve 中打开项目,然后点击 Workspace > Scripts > resolve_mcp_bridge。控制台中不会显示任何内容(免费版会屏蔽菜单脚本中的 print);桥接程序会在后台循环运行,Resolve 仍可正常响应。在 Claude Desktop 中,resolve_status 随后会报告 alive: true,并显示产品、版本、版本类型、页面和已打开的项目。
重要
桥接程序会随 Resolve 启动和停止。每次启动 Resolve 后、使用工具前,都要再次点击
Workspace > Scripts > resolve_mcp_bridge。根据设计,它不会自动启动:通过fusion:Execute启动的循环会在整个会话期间占用 Fusion 的共享脚本执行器,因此 Scripts 菜单是唯一受支持的启动方式。
若要停止,请让 Claude 停止桥接程序(stop_bridge),或退出 Resolve。在桥接程序运行时再次点击脚本不会造成问题:新实例会接管,旧实例则会在收到发往新会话的第一个请求时退出。
示例提示词
Give me an overview of the open Resolve project.
List the clips in the root bin with their durations and frame rates.
What is on video track 1 of the current timeline?
Add a blue marker at frame 240 named "fix colour".
Delete all the red markers on this timeline.
Render the current timeline to ~/Movies/out as fix-v2 and tell me when it finishes.
Look up AppendToTimeline in the Resolve scripting docs.
Use run_lua to return the current timeline's start timecode and its item count on V1.
https://github.com/user-attachments/assets/febdf2b9-8e0d-4fbf-8462-0d6ecd98c829
工具
| 工具 | 功能 | 参数 | 访问权限 |
|---|---|---|---|
resolve_status | 查看桥接是否正在运行及未运行的原因、会话、平台、自行安装结果;若正在运行,还会显示产品、版本、版本类型、页面和项目 | 无 | 只读 |
run_lua | 在 Resolve 中使用实时 resolve 对象运行 Lua 5.1 代码块;以 JSON 返回第一个返回值,以及捕获的打印内容和错误 | code;timeout_s 为 1..300(默认值来自设置) | 破坏性 |
get_project_info | 查看打开项目的名称、页面、数据库、帧率、分辨率、时间线数量、根素材箱计数和当前时间线 | 无 | 只读 |
list_projects | 列出当前项目管理器文件夹中的项目及其日期和备注;标记已打开的项目 | 无 | 只读 |
list_timelines | 列出所有时间线及其唯一 ID、帧范围和轨道数;标记当前时间线 | 无 | 只读 |
list_media_pool_clips | 列出一个素材箱中的片段及其路径、时长、帧率、分辨率、类型、帧数和颜色 | bin_path(默认 /);offset;limit 为 1..200(默认 50) | 只读 |
get_timeline_items | 列出当前时间线某个轨道上的项目及其类型、帧数、源帧、启用状态和文件路径 | track_type:video、audio 或 subtitle;track_index 从 1 开始;offset;limit 为 1..500(默认 100) | 只读 |
add_marker | 在当前时间线上添加标记并返回已存储的标记 | frame(相对于时间线起始位置);color(16 种 Resolve 颜色之一);name;note;duration(以帧为单位,默认 1) | 写入 |
delete_markers | 从当前时间线上删除某种颜色的所有标记,或删除所有标记 | color(省略则删除全部);confirm 必须为 true | 破坏性 |
set_current_timeline | 将指定名称的时间线设为当前时间线;若名称未知,则列出已知时间线 | name | 写入 |
open_project | 加载指定名称的项目;默认先保存当前打开的项目。若名称未知,则列出已知项目 | name;save_current(默认 true) | 写入 |
render_current_timeline | 将当前时间线加入渲染队列并启动渲染,然后返回作业 ID | preset(可选,会根据预设列表验证);output_dir(绝对路径,必须存在);filename | 写入 |
get_render_status | 查看一个渲染作业的状态、完成百分比和错误,以及 Resolve 是否正在渲染 | job_id | 只读 |
stop_bridge | 请求桥接程序正常退出;之后可从 Workspace > Scripts 重新启动 | 无 | 写入 |
scripting_api_docs | 搜索 Blackmagic 随附的脚本参考(.pyi 签名、README 章节、CHANGELOG),并显示文件和行号;标记已弃用和不支持的调用 | query;limit 为 1..10(默认 5) | 只读 |
每个工具都会向客户端声明其访问权限提示。delete_markers 在未提供 confirm: true 时会拒绝执行,并会告知 Claude 先征求你的同意;run_lua 无需确认,并标记为具有破坏性,以便客户端发出警告。结果为 JSON,并附有相应的 structuredContent;支持分页的工具(list_media_pool_clips、get_timeline_items)会报告 total、offset、limit 和 truncated;每次失败都会说明下一步该怎么做,而不会抛出异常。
标记颜色:Blue、Cyan、Green、Yellow、Red、Pink、Purple、Fuchsia、Rose、Lavender、Sky、Mint、Lemon、Sand、Cocoa、Cream。
为 run_lua 编写 Lua
代码块在 Resolve 的脚本菜单 Lua 状态(LuaJIT、Lua 5.1)中运行,可使用全局变量 resolve 和 fusion。约定如下,服务端也会告知 Claude:
- 使用冒号调用方法(
project:GetName()),使用点号读取常量(resolve.EXPORT_AAF)。 - API 列表是从 1 开始索引的表:使用
#list和for i = 1, #list,不要使用pairs。字典是以键为索引的表;GetMarkers()以帧编号为键。 OpenPage的页面名称使用小写("edit"、"color"、"deliver")。return一个值即可将其作为 JSON 返回。只会发送第一个返回值。print的输出在 Resolve 中不可见,但会通过prints返回(上限为 200 行 / 16 KB)。- 先通过
scripting_api_docs查找方法,并避免使用 Blackmagic 随附示例中仍在使用的弃用形式:GetSetting/SetSetting(改用GetSettings()/SetSettings({}))、GetItemsInTrack(改用GetItemListInTrack)、基于索引的渲染任务调用(ID 是字符串),以及单参数GetClipProperty。 - 此状态下不存在
io、os.execute、os.remove、require、package、ffi和debug;错误只包含消息,不包含回溯。
local project = resolve:GetProjectManager():GetCurrentProject()
local timeline = project:GetCurrentTimeline()
local items = timeline:GetItemListInTrack("video", 1)
local out = {}
for i = 1, #items do
out[i] = { name = items[i]:GetName(), first = items[i]:GetStart(), last = items[i]:GetEnd() }
end
return { timeline = timeline:GetName(), start_timecode = timeline:GetStartTimecode(), items = out }
警告
此桥接一次只处理一个请求,且无法响应 Resolve 的模态对话框。长时间运行的同步 API 调用(
RenderWithQuickExport、TranscribeAudio、Export、ArchiveProject,以及在实时保存关闭时对未保存项目调用LoadProject)会阻塞桥接,直到调用完成。请使用render_current_timeline启动渲染,并轮询get_render_status,不要在run_lua中等待。
设置
安装扩展后,Claude Desktop 会显示以下五项设置。标准 Resolve 安装请保留默认值。文件夹字段为空表示使用 路径 表中的平台默认值。
| 设置 | 默认值 | 作用 |
|---|---|---|
| Resolve 用户脚本文件夹 | 平台默认值 | 两个 Lua 脚本复制到的位置,复制后会显示在 Workspace > Scripts 下。这是唯一会写入的 Resolve 文件夹,而且不会自动创建:请先启动一次 Resolve,使其创建该文件夹。 |
| 自动安装桥接脚本 | 开启 | 服务器启动时,将 resolve_mcp_bridge.lua 和 claude_diag.lua 复制(并更新)到脚本文件夹。关闭后,请手动复制。 |
| 状态目录 | 平台默认值 | 请求文件、锁文件和服务器日志所在的位置。在 Windows 上,建议使用仅含 ASCII 字符的路径。 |
| 默认工具超时时间(秒) | 30 | 工具等待桥接响应的时长,超时后放弃;范围为 1 到 300。run_lua 可针对每次调用覆盖此值。 |
| Resolve Fusion 偏好设置文件夹 | 平台默认值 | 存放 <profile>/Fusion.prefs 的文件夹,桥接会通过此文件夹响应;读取最新的配置文件。仅当 resolve_status 显示 prefs_missing 时才设置此项。 |
路径
| macOS | Windows | |
|---|---|---|
| 脚本文件夹(写入) | ~/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Utility | %APPDATA%\Blackmagic Design\DaVinci Resolve\Support\Fusion\Scripts\Utility |
| 状态目录(写入) | ~/.davinci-resolve-lua-mcp | %USERPROFILE%\.davinci-resolve-lua-mcp |
| Fusion 偏好设置文件夹(读取) | ~/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Profiles | %APPDATA%\Blackmagic Design\DaVinci Resolve\Support\Fusion\Profiles |
| 脚本编写文档(读取) | /Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting | %PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting |
| Claude Desktop 日志和扩展 | ~/Library/Logs/Claude/、~/Library/Application Support/Claude/Claude Extensions/ | %APPDATA%\Claude\logs\、%APPDATA%\Claude\Claude Extensions\ |
Windows 路径仅有文档记录,未经实际测量;其中 Fusion 偏好设置文件夹的路径最不确定。通过 Microsoft Store 安装的 Claude Desktop 会将文件夹保存在 %LOCALAPPDATA%\Packages\Claude_<id>\LocalCache\Roaming\Claude\ 下。
环境变量(用于开发循环和测试)
这些设置对应 RLB_SCRIPTS_DIR、RLB_AUTO_INSTALL、RLB_STATE_DIR、RLB_DEFAULT_TIMEOUT_S 和 RLB_PREFS_DIR;其余变量没有对应设置。无效值会回退为默认值,并显示在 resolve_status 的 config_problems 中;服务不会因配置问题而拒绝启动。
| 变量 | 默认值 | 含义 |
|---|---|---|
RLB_SCRIPTS_DIR | 脚本文件夹 | 两个 Lua 文件的存放位置。 |
RLB_AUTO_INSTALL | true | 启动时自动安装这两个 Lua 文件。 |
RLB_STATE_DIR | 状态目录 | 存放 next.lua、next.lua.tmp、lock 和 server.log。会展开 ~ 和 ${HOME};在 Windows 上,服务会使用正斜杠表示路径。 |
RLB_DEFAULT_TIMEOUT_S | 30 | 1..300 秒。 |
RLB_MAX_RESPONSE_KB | 64 | 响应 JSON 的大小上限,1..192 KB。 |
RLB_LOG_LEVEL | info | debug、info、warn 或 error。 |
RLB_PREFS_DIR | Fusion 偏好设置文件夹 | <profile>/Fusion.prefs 文件所在的文件夹;读取最新的文件。 |
RLB_DOCS_DIR | 脚本编写文档 | Blackmagic 随附的参考文档,由 scripting_api_docs 读取。不会写入。 |
故障排除
Workspace > Scripts中缺少桥接脚本。 请让 Claude 查询resolve_status,并读取bridge_script.outcome:installed、updated或up_to_date:文件已位于脚本文件夹中。重新打开菜单;Resolve 会列出新文件,无需重启。skipped_auto_install_off:此设置已关闭。请自行将bridge/resolve_mcp_bridge.lua和scripts/claude_diag.lua复制到该文件夹。scripts_dir_missing:文件夹不存在。启动一次 Resolve 以创建该文件夹,或修正脚本文件夹设置;服务不会创建 Resolve 文件夹。permission_denied或error:操作系统消息会说明原因。
config_problems指明了状态目录。 路径无法嵌入桥接脚本:其中包含]==]、双引号或换行符,以@@开头,或在 macOS 上包含反斜杠(Windows 会将反斜杠改写为正斜杠)。在更改状态目录设置之前,自动安装会保持关闭。- 我把脚本复制到了
Scripts/Deliver。 Resolve 也会将该文件夹中的脚本作为 Deliver 页面上可选择的渲染起始/结束脚本提供,但桥接脚本不应放在那里。删除该副本,仅将脚本保留在Scripts/Utility中。 Fusion.prefs未更新。 桥接脚本只会在响应请求时写入首选项,因此请先确认它正在运行(resolve_status)。首选项文件夹中最新的Fusion.prefs会被读取,无论配置文件叫什么;只有该文件夹位于其他位置时,才需要设置首选项文件夹。如果 Resolve 正在写入文件时保存失败,系统最多会重试五次;启动时保存失败则会每秒重试一次,直到成功。resolve_status显示prefs_missing。 Fusion 首选项文件夹中没有Fusion.prefs。至少启动一次 Resolve,或将首选项文件夹设置为正确的文件夹。Windows 上的默认路径已有文档记录,但未经实测;如果你的Fusion.prefs位于其他位置,请按 docs/windows.md 中的说明报告路径。- 请求卡住,或工具超时。 桥接脚本正忙于处理耗时较长的同步调用,或无法响应的模态对话框:请等待 Resolve 完成,然后重试。桥接脚本会拒绝超过 120 s 的请求,服务会在超时后移除
next.lua,因此无需手动清理。对于耗时较长的调用,可提高默认超时时间(最高为 300 s),或向run_lua传入timeout_s。 resolve_status显示lock_held。 另一个服务占用请求槽的时间超过了超时限制:可能是第二个 Claude Desktop 配置项、make smoke,或开发注册循环。请停止它,或更改状态目录设置。仅当lock文件中记录的 pid 不是服务进程时,才手动删除状态目录中的该文件。- Windows 上的工具对
next.lua返回EBUSY或EPERM。 Windows 不允许删除或替换其他进程正打开的文件,而桥接脚本每隔 50 ms 就会重新读取请求文件,因此服务会重试约一秒。若错误持续出现,说明有其他程序一直占用该文件,通常是杀毒软件扫描器:请将状态目录排除在实时扫描之外。 - Windows 上的
resolve_status显示state_dir_ascii: false。 Resolve 的 Lua 可能无法打开包含非 ASCII 字符的路径,这会导致每个请求都超时。请将状态目录设置为仅包含 ASCII 字符的路径,例如C:\rlb。 - Resolve 在会话中途重启。
resolve_status显示resolve_gone(记录的 pid 已终止)或no_reply。会话记录会有意保留在重启后,而且没有心跳机制,因此不会有任何程序替你重启桥接脚本:请再次点击Workspace > Scripts > resolve_mcp_bridge。 - 响应显示
truncated: true。 JSON 超出了上限(默认 64 KB)。对于run_lua,result_preview会包含其开头部分;超过上限时,专用工具会返回错误,说明上限并提示使用更小的limit或不同的offset。请对列表工具使用offset和limit,或减少 Lua 返回的内容。 - 重新安装时没有显示对话框。 请在 Settings > Extensions 下移除扩展,然后再次打开
.mcpb;Claude Desktop 会立即重新启动服务。 - 工具返回
bad_response。 已安装的脚本与服务使用的协议不一致,通常是其中一个升级后导致的。请重启 Claude Desktop,让服务重新安装脚本,然后从 Scripts 菜单重新启动该脚本。 - 日志位置。 服务自身的日志是状态目录中的
server.log(达到 5 MB 时会截断;路径也可在resolve_status中查看)。Claude Desktop 会将服务的 stderr 保存为日志文件夹中的mcp-server-DaVinci Resolve Lua MCP.log;该文件记录连接情况,不记录聊天中的工具调用。已安装的扩展位于扩展文件夹中的local.mcpb.saad-khan.davinci-resolve-lua-mcp(两者的位置见 Paths)。
证明调用已运行
最后一个回答以十六进制编码存储在 Fusion.prefs 中。在 macOS 上:
PREFS=~/Library/Application\ Support/Blackmagic\ Design/DaVinci\ Resolve/Fusion/Profiles/Default/Fusion.prefs
grep -o 'RLBResp = "[^"]*"' "$PREFS" | cut -d: -f2 | tr -d '"' | xxd -r -p
在 Windows 上(PowerShell):
$prefs = Join-Path $env:APPDATA 'Blackmagic Design\DaVinci Resolve\Support\Fusion\Profiles\Default\Fusion.prefs'
$hex = ([regex]::Match((Get-Content -Raw -LiteralPath $prefs), 'RLBResp = "([^"]*)"').Groups[1].Value -split ':')[1]
$bytes = [byte[]]::new($hex.Length / 2); for ($i = 0; $i -lt $bytes.Length; $i++) { $bytes[$i] = [Convert]::ToByte($hex.Substring(2 * $i, 2), 16) }
[Text.Encoding]::UTF8.GetString($bytes)
安全
警告
任何能在这台机器上写入一个文件的程序,都能以你的权限在 Resolve 中运行 Lua。批准
run_lua代码块前,请先阅读。
- 状态目录就是安全边界。macOS 会以 0700 模式创建该目录;Windows 则沿用你的个人资料文件夹权限(服务本身不设置权限)。
- 下一个回答覆盖之前,最后一个回答会以十六进制编码的形式保留在
Fusion.prefs中。在实测的 Mac 上,该文件的模式为 0666,因此任何本地账户都能读取上一个回答;在 Windows 上,该文件默认位于%APPDATA%下,只有你的账户可以访问(未经实测)。正常停止时,会将会话记录标记为stopped,并用停止确认信息替换最后一个回答。 - 此扩展以你的用户权限运行在 Claude Desktop 的进程模型内,本身没有沙盒。它只会写入自己的状态目录,以及 Resolve 用户脚本文件夹中的两个 Lua 文件。
- 不联网:服务不会打开套接字或发送请求。文件输入,偏好设置输出。
隐私政策
此扩展完全在你的机器上运行,不会向任何地方发送数据。完整政策见 PRIVACY.md;简而言之:
- 收集。 它会处理 Claude 发送的内容(Lua 代码、标记文本、名称、路径)以及 Resolve 返回的内容(项目、时间线、片段和标记元数据、媒体路径)。不收集账户、凭据、遥测、分析数据或崩溃报告。
- 使用和存储。 这些数据仅存储在请求文件中(每次调用一次,随后删除)、
Fusion.prefs中的最后一个回答、服务日志中(ID、耗时、路径和错误消息;绝不记录 Lua 代码、参数或结果),以及 Claude Desktop 保存的该日志副本中。 - 与第三方共享。 此扩展不会共享数据。Claude Desktop 会根据 Anthropic 的隐私政策,将工具输入和结果作为对话的一部分发送给 Anthropic;下载文件由 GitHub 提供。
- 保留期限。 回答会保留至下次调用或桥接程序启动时被覆盖;日志会保留至超过 5 MB;除此之外,文件会一直保留,直到你按照卸载中的说明删除。
- 联系。 有疑问:提交 issue。安全问题:请参阅仓库的 Security 选项卡,具体说明见 SECURITY.md。
卸载
- 在 Claude Desktop 的 Settings > Extensions 中移除 “DaVinci Resolve Lua MCP”。
- 从脚本文件夹中删除
resolve_mcp_bridge.lua和claude_diag.lua(参见路径);在 Mac 上的代码检出目录中运行make uninstall-bridge,即可准确移除这两个文件。 - 删除状态目录。
Global.ResolveLuaBridge.* 键会留在 Fusion.prefs 中(正常停止后不到 2 KB:会话记录、停止确认信息和八个已清空的键)。如果你希望文件保持原样,可以从 Fusion 的偏好设置中移除这些键。
开发
先决条件:
- Node 20 或更高版本以及 npm(Makefile 会加载
~/.nvm/nvm.sh)。 - DaVinci Resolve 安装:Lua 测试会通过其捆绑的
fuscript运行,路径为/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fuscript。 - 可选:
lua-language-server,用于make lint-lua。 - Makefile 仅支持 macOS。在 Windows 上,请通过 Git Bash 运行相同的检查,具体步骤见 docs/windows.md;
fuscript测试和make smoke在 Windows 上没有对应方案。
git clone https://github.com/saadk408/davinci-resolve-lua-mcp.git
cd davinci-resolve-lua-mcp
npm install
make test # Lua checks under fuscript + the Node suite
make bundle # dist/davinci-resolve-lua-mcp.mcpb, validated and probed
make install # make bundle, then open the .mcpb so Claude Desktop shows its dialog
| 目标 | 作用 |
|---|---|
make test | 运行 grep 检查,然后运行 fuscript 下的 Lua 检查和 Node 测试(通过 tsx 执行 node --test)。所有测试夹具都使用临时目录;不会触碰 ~/Library 下的任何内容。 |
make build | 运行 tsc --noEmit,然后用 esbuild 将 src/index.ts 构建为 server/index.js(CommonJS,目标为 Node 20)。 |
make bundle | 先构建,再运行 npm run bundle:执行 mcpb validate、将 mcpb pack 打包到 dist/、运行 mcpb info,然后执行打包检查 tests/check_bundle.mjs(检查文件列表是否完全匹配、大小是否低于 2 MB、解包,并在临时目录中对解包副本进行 stdio tools/list + resolve_status 探测,同时关闭自行安装)。 |
make install | 打包,然后打开 .mcpb。由你点击安装。 |
make sign | 可选:运行自签名的 mcpb sign 和 mcpb verify;cert.pem 和 key.pem 不会加入 git,也不会包含在打包文件中。 |
make dev-register / make dev-unregister | 在 ~/Library/Application Support/Claude/claude_desktop_config.json 中添加或移除 davinci-resolve-lua-mcp-dev 条目,让它使用当前 Node 运行此检出目录中的 server/index.js。文件会先备份,保留其他键,并保留 0600 权限。scripts/dev-register.mjs 接受 --config、--name、--server(另一个检出目录中的 server/index.js,例如 git worktree 中的文件)、--env(包含 KEY=VALUE 的文件,其中的 RLB_* 行会成为该条目的环境变量;默认为 .env)、--dry-run 和 --remove。 |
make smoke SMOKE_PROJECT="<name>" | 先构建,然后像 Claude Desktop 一样,通过实时桥接服务驱动真实工具:检查状态、延迟、打印内容和错误,列出项目和时间线,创建带标记的临时时间线,测试分页和截断,执行渲染并清理。SMOKE_FLAGS=--no-render 可跳过渲染。输出写入 .out/smoke.log。 |
make stop | 请求正在运行的桥接服务退出(stop_bridge);之后从 Scripts 菜单重新启动。 |
make uninstall-bridge | 仅从脚本文件夹中移除 resolve_mcp_bridge.lua 和 claude_diag.lua(可通过 RLB_SCRIPTS_DIR 覆盖默认路径)。 |
make lint-lua | 检查生成的 API 类型是否与已安装的 .pyi 匹配,然后对工作区运行 lua-language-server --check;若 bridge/ 或 tests/ 中出现任何诊断,则检查失败。 |
make inspect | 先构建,再通过 MCP Inspector CLI 运行 tools/list。Inspector 会使用生产路径运行服务,因此会执行实际的自行安装。 |
make gen-types、make clean | 根据随附的 .pyi 重新生成 types/resolve_host.d.lua;移除 server/、dist/ 和 .out/。 |
开发流程:只需运行一次 make dev-register,之后每次更改都运行 make build 并重启 Claude Desktop,无需重新打包。开发条目和已安装扩展可以同时运行:请求槽锁按请求获取并立即释放,因此空闲服务不会阻塞另一个服务。两者响应的工具名称相同,所以测试其中一个时,请在 Claude Desktop 中禁用另一个。CONTRIBUTING.md 介绍了分支和发布流程。
发布:推送 vX.Y.Z 标签会运行 .github/workflows/release.yml,该工作流会在带标签的提交上运行 Node 检查和 make bundle,为打包文件构建来源信息生成证明,然后发布不可变的 GitHub Release,并附上打包文件及其 SHA-256 值;带注释标签的消息会作为发布说明的引言。第二个任务会将发布内容作为 io.github.saadk408/davinci-resolve-lua-mcp 发布到 MCP Registry,并附上发布文件的哈希值。使用 gh attestation verify davinci-resolve-lua-mcp.mcpb -R saadk408/davinci-resolve-lua-mcp 验证下载的打包文件。测试工作流还会在 Windows 运行器上运行 Node 检查和打包检查。
说明
make smoke会创建并删除名为bridge-smoke的时间线,在其上添加并删除标记,并设置项目的渲染目标目录和文件名。SMOKE_PROJECT必须是 Resolve 中当前打开的项目名称,而且应该是一个临时项目,绝不能是真正的剪辑项目。名称不一致时,运行会拒绝继续。
目录结构:
bridge/resolve_mcp_bridge.lua:在 Resolve 中运行的循环逻辑,是一个无依赖、少于 600 行的文件。src/:TypeScript 服务端。server.ts包含 15 个工具,lua.ts包含所有 Lua 代码片段和唯一的字符串转义辅助函数,protocol.ts包含请求槽和锁,prefs.ts是Fusion.prefs读取器,bridgeInstall.ts实现自动安装。scripts/claude_diag.lua:沙盒诊断脚本,也随软件包一并提供。tests/:Node 测试套件;tests/lua/:fuscript检查。docs/:Windows 测量清单(windows.md)和 README 的截图(images/)。
致谢
本项目基于以下项目的成果构建:
- AutoSubs - 在免费版 21.1 中通过 Fusion 首选项实现的 Lua 桥接,本项目采用了该通道
- samuelgursky/davinci-resolve-mcp - 通过 Python 脚本 API 服务于 DaVinci Resolve Studio 的 MCP 服务
DaVinci Resolve 是 Blackmagic Design Pty Ltd 的商标。本项目与 Blackmagic Design 无关,也未获得其认可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。