Davinci Resolve Lua MCP
Controle a edição gratuita do DaVinci Resolve usando seu Agente de IA
Documentação
DaVinci Resolve Lua MCP
Controle a edição gratuita do DaVinci Resolve 21.1 a partir do Claude por meio de um script Lua que roda dentro do Resolve. macOS e Windows (experimental), sem licença Studio, sem rede.

O DaVinci Resolve 21.1 moveu o scripting em Python e a API de scripting externa para a edição Studio, e o próprio servidor MCP da Blackmagic acompanha apenas o Studio. Ainda há uma porta aberta na edição gratuita: o Workspace > Scripts lista e executa arquivos Lua. Este projeto coloca um pequeno script Lua lá. Iniciado uma vez por sessão do Resolve, ele mantém o objeto resolve ativo e executa Lua em nome de um servidor MCP que o Claude Desktop roda como extensão.
[!NOTE] Nada aqui desbloqueia recursos do Studio: a ponte usa a própria API de scripting Lua da edição gratuita. Usuários do Studio 21.1 já têm o servidor MCP nativo da Blackmagic.
Recursos
- 15 ferramentas específicas: visão geral do projeto, listas de projetos e timelines, clipes da Media Pool, itens de timeline, marcadores, alternância de timeline e projeto, renderização com verificação de status e uma busca na referência de scripting fornecida pela Blackmagic.
run_luapara todo o resto: qualquer trecho Lua 5.1 roda dentro do Resolve com o objetoresolveativo e retorna JSON, saída capturada deprinte erros.- Um pacote
.mcpb: instale-o no Claude Desktop, e o servidor copia seus dois scripts Lua para a pasta de scripts do usuário do Resolve no primeiro início. - Sem rede: o servidor e o script se comunicam por um arquivo de requisição e pelas preferências do Fusion. Não há sockets, listeners nem telemetria.
- Rápido o suficiente para parecer interativo: cerca de 60 ms por chamada, medido de ponta a ponta em um Mac.
Requisitos
- macOS (Apple Silicon é o único hardware medido).
- Windows 10 ou 11, experimental. Os caminhos padrão vêm da documentação da Blackmagic e de relatos em fóruns; nada foi medido no Windows ainda. docs/windows.md lista o que verificar.
- DaVinci Resolve edição gratuita 21.1 (build 21.1.0.17 é a medida). O Studio não é necessário nem alvo. A Blackmagic não documenta nem este host Lua nem sua sandbox, então uma versão pontual pode mudar o que funciona.
- Claude Desktop. Ele inclui o runtime Node que o servidor precisa (Node 20 ou mais novo); nada mais é instalado.
- Um projeto aberto no Resolve enquanto você usa as ferramentas.
Instalação
- Baixe o
davinci-resolve-lua-mcp.mcpb(a versão mais recente; as notas de versão e o SHA-256 estão na página de Releases). - Clique duas vezes no arquivo, ou arraste-o para a janela do Claude Desktop. O Claude Desktop mostra os detalhes da extensão e cinco configurações; mantenha os padrões e clique em Instalar.
- No Resolve, abra um projeto e clique em
Workspace > Scripts > resolve_mcp_bridge. Esse script é a ponte; a extensão o colocou lá quando iniciou pela primeira vez.- A ponte para quando o Resolve é fechado. Clique novamente após cada início do Resolve, antes de usar as ferramentas.
- Pergunte ao Claude "Você está conectado ao DaVinci Resolve?".
Pelo terminal, qualquer um dos comandos baixa o arquivo e abre a mesma caixa de diálogo.
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"
Se nada abrir, instale o arquivo pelo Claude Desktop: Configurações > Extensões > Configurações avançadas > Instalar extensão.
Para atualizar, baixe o novo arquivo e abra-o; extensões instaladas de um arquivo não se atualizam sozinhas. O servidor atualiza seus dois scripts Lua no próximo início, então clique em Workspace > Scripts > resolve_mcp_bridge novamente depois. Para compilar o pacote você mesmo, veja Desenvolvimento.
Iniciar e parar a ponte
Abra um projeto no Resolve e clique em Workspace > Scripts > resolve_mcp_bridge. Nada aparece no Console (a edição gratuita silencia o print em scripts de menu); a ponte faz loop em segundo plano e o Resolve continua responsivo. No Claude Desktop, resolve_status então relata alive: true com produto, versão, edição, página e projeto aberto.
[!IMPORTANT] A ponte vive e morre com o Resolve. Após cada início do Resolve, clique em
Workspace > Scripts > resolve_mcp_bridgenovamente antes de usar as ferramentas. Ela nunca é iniciada automaticamente, por design: um loop iniciado porfusion:Executesegura o executor de script compartilhado do Fusion por toda a sessão, então o menu Scripts é o único início suportado.
Para pará-la, peça ao Claude para parar a ponte (stop_bridge), ou feche o Resolve. Clicar no script uma segunda vez enquanto a ponte está ativa é inofensivo: o novo assume e o antigo sai na primeira requisição endereçada à sessão mais nova.
Exemplos de prompts
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
Ferramentas
| Ferramenta | O que faz | Parâmetros | Acesso |
|---|---|---|---|
resolve_status | Se a ponte está ativa e por que não, sua sessão, a plataforma, o resultado da autoinstalação e, quando ativa, produto, versão, edição, página e projeto | nenhum | somente leitura |
run_lua | Executa um trecho Lua 5.1 dentro do Resolve com o objeto resolve ativo; retorna seu primeiro valor de retorno como JSON, além de prints capturados e erros | code; timeout_s 1..300 (padrão das configurações) | destrutivo |
get_project_info | Nome, página, banco de dados, taxa de quadros, resolução, contagem de timelines, contagens do bin raiz e a timeline atual do projeto aberto | nenhum | somente leitura |
list_projects | Projetos na pasta atual do gerenciador de projetos com datas e notas; marca o aberto | nenhum | somente leitura |
list_timelines | Cada timeline com id único, intervalo de quadros e contagens de faixas; marca a atual | nenhum | somente leitura |
list_media_pool_clips | Clipes em um bin com caminho, duração, fps, resolução, tipo, quadros e cor | bin_path (padrão /); offset; limit 1..200 (padrão 50) | somente leitura |
get_timeline_items | Itens em uma faixa da timeline atual com tipo, quadros, quadros de origem, estado de habilitação e caminho do arquivo | track_type vídeo, áudio ou legenda; track_index a partir de 1; offset; limit 1..500 (padrão 100) | somente leitura |
add_marker | Adiciona um marcador à timeline atual e retorna o marcador armazenado | frame (relativo ao início da timeline); color (uma das 16 cores do Resolve); name; note; duration em quadros (padrão 1) | gravação |
delete_markers | Exclui todos os marcadores de uma cor, ou todos os marcadores, da timeline atual | color (omitir para todos); confirm deve ser true | destrutivo |
set_current_timeline | Torna a timeline nomeada atual; um nome desconhecido lista as conhecidas | name | gravação |
open_project | Carrega o projeto nomeado, salvando o aberto primeiro por padrão; um nome desconhecido lista os projetos conhecidos | name; save_current (padrão true) | gravação |
render_current_timeline | Enfileira e inicia uma renderização da timeline atual e retorna o id do job | preset (opcional, validado contra a lista de presets); output_dir (absoluto, deve existir); filename | gravação |
get_render_status | Status, porcentagem de conclusão e erro de um job de renderização, além de se o Resolve está renderizando | job_id | somente leitura |
stop_bridge | Pede à ponte para sair limpa; reinicie-a por Workspace > Scripts depois | nenhum | gravação |
scripting_api_docs | Busca na referência de scripting fornecida pela Blackmagic (assinaturas .pyi, seções do README, CHANGELOG) com arquivo e linha; sinaliza chamadas obsoletas e não suportadas | query; limit 1..10 (padrão 5) | somente leitura |
Cada ferramenta declara suas dicas de acesso ao cliente. delete_markers recusa sem confirm: true, e o Claude é instruído a pedir sua confirmação primeiro; run_lua não exige confirmação e é sinalizada como destrutiva para o cliente poder avisar. Os resultados são JSON com um structuredContent correspondente; as ferramentas paginadas (list_media_pool_clips, get_timeline_items) relatam total, offset, limit e truncated, e cada falha nomeia o próximo passo em vez de lançar erro.
Cores de marcadores: Azul, Ciano, Verde, Amarelo, Vermelho, Rosa, Roxo, Fúcsia, Rosa-claro, Lavanda, Céu, Menta, Limão, Areia, Cacau, Creme.
Escrevendo Lua para run_lua
O trecho roda dentro do estado Lua do menu Scripts do Resolve (LuaJIT, Lua 5.1) com os globais resolve e fusion. Convenções, como o servidor também informa ao Claude:
- Chame métodos com dois pontos (
project:GetName()) e leia constantes com ponto (resolve.EXPORT_AAF). - Listas de API são tabelas baseadas em 1: use
#listefor i = 1, #list, nuncapairs. Dicionários são tabelas com chaves;GetMarkers()é chaveado por número de quadro. - Nomes de páginas para
OpenPagesão minúsculos ("edit","color","deliver"). returnum valor para recebê-lo de volta como JSON. Apenas o primeiro valor de retorno é enviado. A saída deprinté invisível no Resolve, mas volta emprints(limitada a 200 linhas / 16 KB).- Consulte o método com
scripting_api_docsprimeiro e evite as formas obsoletas que os exemplos fornecidos pela Blackmagic ainda usam:GetSetting/SetSetting(useGetSettings()/SetSettings({})),GetItemsInTrack(useGetItemListInTrack), chamadas de job de renderização baseadas em índice (ids são strings) eGetClipPropertycom um único argumento. io,os.execute,os.remove,require,package,ffiedebugnão existem neste estado; erros carregam apenas a mensagem, sem traceback.
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 }
[!WARNING] A ponte lida com uma requisição por vez e não consegue responder a diálogos modais do Resolve. Chamadas síncronas longas de API (
RenderWithQuickExport,TranscribeAudio,Export,ArchiveProject,LoadProjectem um projeto não salvo quando o salvamento automático está desligado) a bloqueiam até terminarem. Inicie renderizações comrender_current_timelinee verifiqueget_render_statusem vez de esperar dentro derun_lua.
Configurações
O Claude Desktop mostra estas cinco configurações quando você instala a extensão. Mantenha os padrões para uma instalação padrão do Resolve. Um campo de pasta vazio significa o padrão da plataforma da tabela Caminhos.
| Configuração | Padrão | O que faz |
|---|---|---|
| Pasta de scripts do usuário do Resolve | padrão da plataforma | Onde os dois scripts Lua são copiados para aparecerem em Workspace > Scripts. A única pasta do Resolve sempre gravada, e nunca criada: inicie o Resolve uma vez para que ela exista. |
| Instalar os scripts da ponte automaticamente | ativado | Copia (e atualiza) resolve_mcp_bridge.lua e claude_diag.lua para a pasta de scripts quando o servidor inicia. Desativado significa copiá-los manualmente. |
| Diretório de estado | padrão da plataforma | Onde ficam o arquivo de requisição, o lock e o log do servidor. No Windows, prefira um caminho apenas com caracteres ASCII. |
| Tempo limite padrão da ferramenta (segundos) | 30 | Quanto tempo uma ferramenta espera pela ponte antes de desistir, de 1 a 300. run_lua pode sobrescrever por chamada. |
| Pasta de prefs do Fusion do Resolve | padrão da plataforma | A pasta que contém <profile>/Fusion.prefs, pela qual a ponte responde; o arquivo de perfil mais novo é lido. Defina apenas se resolve_status disser prefs_missing. |
Caminhos
| macOS | Windows | |
|---|---|---|
| Pasta de scripts (gravada) | ~/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Utility | %APPDATA%\Blackmagic Design\DaVinci Resolve\Support\Fusion\Scripts\Utility |
| Diretório de estado (gravado) | ~/.davinci-resolve-lua-mcp | %USERPROFILE%\.davinci-resolve-lua-mcp |
| Pasta de prefs do Fusion (lida) | ~/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Profiles | %APPDATA%\Blackmagic Design\DaVinci Resolve\Support\Fusion\Profiles |
| Documentação de scripting (lida) | /Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting | %PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting |
| Logs e extensões do Claude Desktop | ~/Library/Logs/Claude/, ~/Library/Application Support/Claude/Claude Extensions/ | %APPDATA%\Claude\logs\, %APPDATA%\Claude\Claude Extensions\ |
Os caminhos do Windows são documentados, não medidos; a pasta de prefs do Fusion é a menos certa deles. Uma instalação do Claude Desktop pela Microsoft Store mantém suas pastas em %LOCALAPPDATA%\Packages\Claude_<id>\LocalCache\Roaming\Claude\. |
Variáveis de ambiente (para o loop de desenvolvimento e testes)
As configurações mapeiam para RLB_SCRIPTS_DIR, RLB_AUTO_INSTALL, RLB_STATE_DIR, RLB_DEFAULT_TIMEOUT_S e RLB_PREFS_DIR; as demais não têm configuração. Um valor inválido cai no padrão e aparece em resolve_status sob config_problems; o servidor nunca se recusa a iniciar por causa de configuração.
| Variável | Padrão | Significado |
|---|---|---|
RLB_SCRIPTS_DIR | a pasta de scripts | Onde os dois arquivos Lua vão. |
RLB_AUTO_INSTALL | true | Auto-instala os dois arquivos Lua na inicialização. |
RLB_STATE_DIR | o diretório de estado | Guarda next.lua, next.lua.tmp, lock e server.log. ~ e ${HOME} são expandidos; no Windows o servidor escreve o caminho com barras normais. |
RLB_DEFAULT_TIMEOUT_S | 30 | 1..300 segundos. |
RLB_MAX_RESPONSE_KB | 64 | Limite do JSON de uma resposta, 1..192 KB. |
RLB_LOG_LEVEL | info | debug, info, warn ou error. |
RLB_PREFS_DIR | a pasta de prefs do Fusion | Pasta dos arquivos <profile>/Fusion.prefs; o mais recente é lido. |
RLB_DOCS_DIR | a documentação de scripts | A referência enviada pela Blackmagic, lida por scripting_api_docs. Nunca é gravada. |
Solução de problemas
- A ponte não aparece em
Workspace > Scripts. Peça ao Claude porresolve_statuse leiabridge_script.outcome:installed,updatedouup_to_date: o arquivo está na pasta de scripts. Reabra o menu; o Resolve lista um arquivo novo sem reiniciar.skipped_auto_install_off: a configuração está desligada. Copiebridge/resolve_mcp_bridge.luaescripts/claude_diag.luavocê mesmo para lá.scripts_dir_missing: a pasta não existe. Abra o Resolve uma vez para que ele a crie, ou corrija a configuração da pasta de scripts; o servidor nunca cria pastas do Resolve.permission_deniedouerror: a mensagem do sistema operacional diz o motivo.
config_problemsnomeia o diretório de estado. O caminho não pode ser embutido na ponte: ele contém]==], uma aspa dupla ou uma quebra de linha, começa com@@, ou contém uma barra invertida no macOS (o Windows reescreve barras invertidas como barras normais). A auto-instalação fica desligada até você mudar a configuração do diretório de estado.- Copiei o script para
Scripts/Deliver. O Resolve também oferece os scripts dessa pasta como scripts de início/fim de renderização selecionáveis na página Deliver, o que não é onde a ponte pertence. Apague a cópia e mantenha o script apenas emScripts/Utility. Fusion.prefsnão está atualizando. A ponte grava preferências apenas quando responde a uma solicitação, então primeiro verifique se ela está em execução (resolve_status). OFusion.prefsmais recente sob a pasta de prefs é o que é lido, seja qual for o nome do perfil; defina a configuração da pasta de prefs somente se essa pasta estiver em outro lugar. Uma gravação que falha enquanto o Resolve está escrevendo o arquivo é tentada até cinco vezes, e uma gravação de início que falha é repetida uma vez por segundo até ser concluída.resolve_statusdizprefs_missing. Não existeFusion.prefssob a pasta de prefs do Fusion. Abra o Resolve pelo menos uma vez, ou aponte a configuração da pasta de prefs para a pasta certa. No Windows o padrão é documentado, mas não medido; se o seuFusion.prefsestiver em outro lugar, por favor relate o caminho como docs/windows.md descreve.- Uma solicitação está travada, ou uma ferramenta expira. A ponte está ocupada em uma chamada síncrona longa ou em um diálogo modal que ela não pode responder: espere o Resolve terminar e tente novamente. Solicitações com mais de 120 s são recusadas pela ponte e o servidor remove
next.luaapós um tempo limite, então nada precisa ser limpo manualmente. Para chamadas lentas, aumente o tempo limite padrão (até 300 s) ou passetimeout_spararun_lua. resolve_statusdizlock_held. Outro servidor segurou o slot de solicitação por mais tempo que o tempo limite: uma segunda entrada do Claude Desktop,make smoke, ou um loop de registro de desenvolvimento. Pare-o, ou mude a configuração do diretório de estado. Remova o arquivolockno diretório de estado manualmente apenas se o pid que ele nomeia não for um servidor.- No Windows, uma ferramenta responde com
EBUSYouEPERMemnext.lua. O Windows se recusa a excluir ou substituir um arquivo que outro processo mantém aberto, e a ponte relê o arquivo de solicitação a cada 50 ms, então o servidor tenta novamente por cerca de um segundo. Um erro persistente significa que outra coisa mantém o arquivo aberto, geralmente um antivírus: exclua o diretório de estado da verificação em tempo real. - No Windows,
resolve_statusdizstate_dir_ascii: false. O Lua do Resolve pode não abrir um caminho com caracteres não ASCII, e toda solicitação então expiraria. Defina o diretório de estado para um caminho apenas ASCII, comoC:\rlb. - O Resolve foi reiniciado no meio da sessão.
resolve_statusdizresolve_gone(o pid registrado está morto) ouno_reply. O registro da sessão sobrevive ao reinício de propósito, e não há batimento cardíaco, então nada reinicia a ponte por você: clique emWorkspace > Scripts > resolve_mcp_bridgenovamente. - A resposta diz
truncated: true. O JSON excedeu o limite (64 KB por padrão). Pararun_lua,result_previewguarda o início dele; uma ferramenta feita para o limite responde com um erro que nomeia o limite e pede umlimitmenor ou umoffsetdiferente. Useoffsetelimitnas ferramentas de lista, ou retorne menos do seu Lua. - Reinstalar não mostra diálogo. Remova a extensão em Configurações > Extensões, então abra o
.mcpbnovamente; o Claude Desktop relança o servidor imediatamente. - Uma ferramenta responde
bad_response. O script instalado e o servidor discordam sobre o protocolo, geralmente após uma atualização de um mas não do outro. Reinicie o Claude Desktop para que o servidor reinstale o script, então relance-o pelo menu Scripts. - Onde estão os logs. O log do próprio servidor é
server.logno diretório de estado (truncado em 5 MB; o caminho também está emresolve_status). O Claude Desktop mantém o stderr do servidor comomcp-server-DaVinci Resolve Lua MCP.logna pasta de logs, que registra a conexão, não as chamadas de ferramenta do chat; a extensão instalada élocal.mcpb.saad-khan.davinci-resolve-lua-mcpna pasta de extensões (ambos em Paths).
Prove que uma chamada foi executada
A última resposta está em Fusion.prefs, codificada em hexadecimal. No 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
No 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)
Segurança
[!WARNING] Qualquer coisa que possa gravar um arquivo nesta máquina pode executar Lua dentro do Resolve com seus privilégios. Leia um trecho de
run_luaantes de aprová-lo.
- O diretório de estado é esse limite. O macOS o cria com modo 0700; o Windows dá a ele as permissões da pasta do seu perfil (o servidor não define nenhuma própria).
- A última resposta persiste codificada em hexadecimal em
Fusion.prefsaté a próxima sobrescrevê-la. No Mac medido, esse arquivo tem modo 0666, então qualquer conta local pode ler a resposta anterior; no Windows ele fica sob%APPDATA%, privado para sua conta por padrão (não medido). Uma parada limpa marca o registro da sessãostoppede substitui a última resposta pelo reconhecimento de parada. - A extensão roda com os privilégios do seu usuário, dentro do modelo de processo do Claude Desktop, sem sandbox próprio. Ela grava apenas seu diretório de estado e os dois arquivos Lua na pasta de scripts do usuário do Resolve.
- Sem rede: o servidor não abre sockets e não faz solicitações. Arquivos entram, preferências saem.
Política de Privacidade
A extensão roda inteiramente na sua máquina e não envia nada para lugar nenhum. A política completa está em PRIVACY.md; em resumo:
- Coleta. Ela processa o que o Claude envia (código Lua, texto de marcadores, nomes, caminhos) e o que o Resolve responde (metadados de projeto, linha do tempo, clipe e marcador, caminhos de mídia). Sem contas, sem credenciais, sem telemetria, análise ou relatórios de falha.
- Uso e armazenamento. Esses dados vivem apenas no arquivo de solicitação (uma chamada, depois excluído), na última resposta em
Fusion.prefs, no log do servidor (ids, tempos, caminhos e mensagens de erro; nunca código Lua, argumentos ou resultados) e na cópia desse log no Claude Desktop. - Compartilhamento com terceiros. Nenhum pela extensão. O Claude Desktop envia entradas e resultados de ferramentas para a Anthropic como parte da sua conversa, sob a política de privacidade da Anthropic; o GitHub serve o download.
- Retenção. Até a próxima chamada ou inicialização da ponte sobrescrever a resposta, até o log passar de 5 MB, e de outra forma até você excluir os arquivos como descrito em Uninstall.
- Contato. Perguntas: abra um issue. Problemas de segurança: a aba Segurança do repositório, como SECURITY.md descreve.
Desinstalação
- Remova "DaVinci Resolve Lua MCP" em Configurações > Extensões no Claude Desktop.
- Exclua
resolve_mcp_bridge.luaeclaude_diag.luada pasta de scripts (veja Paths); de um checkout no Mac,make uninstall-bridgeremove exatamente esses dois arquivos. - Exclua o diretório de estado.
As chaves Global.ResolveLuaBridge.* permanecem em Fusion.prefs (menos de 2 KB após uma parada limpa: o registro da sessão, a resposta de parada e oito chaves apagadas). Remova-as das preferências do Fusion se quiser o arquivo impecável.
Desenvolvimento
Pré-requisitos:
- Node 20 ou mais novo e npm (o Makefile usa
~/.nvm/nvm.sh). - Uma instalação do DaVinci Resolve: os testes Lua rodam sob seu
fuscriptincluído em/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fuscript. - Opcionalmente
lua-language-server, paramake lint-lua. - O Makefile é apenas para macOS. No Windows, rode os mesmos portões do Git Bash como docs/windows.md lista; os testes
fuscriptemake smokenão têm equivalente no 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
| Alvo | O que faz |
|---|---|
make test | Verifica gates com grep, depois as verificações Lua em fuscript e os testes Node (node --test até tsx). Cada fixture é um diretório temporário; nada em ~/Library é tocado. |
make build | tsc --noEmit, depois esbuild src/index.ts em server/index.js (CommonJS, alvo Node 20). |
make bundle | Build, depois npm run bundle: mcpb validate, mcpb pack em dist/, mcpb info, depois o gate do bundle tests/check_bundle.mjs (lista exata de arquivos, tamanho abaixo de 2 MB, descompactação e uma sonda stdio tools/list + resolve_status da cópia descompactada em diretórios temporários com a auto-instalação desativada). |
make install | Bundle, depois open o .mcpb. O clique de instalação é seu. |
make sign | mcpb sign autoassinado opcional mais mcpb verify; cert.pem e key.pem ficam fora do git e do bundle. |
make dev-register / make dev-unregister | Adiciona ou remove uma entrada davinci-resolve-lua-mcp-dev em ~/Library/Application Support/Claude/claude_desktop_config.json que executa server/index.js deste checkout com o Node atual. O arquivo é copiado antes, outras chaves são mantidas, o modo 0600 é preservado. scripts/dev-register.mjs aceita --config, --name, --server (o server/index.js de outro checkout, por exemplo, o de um worktree git), --env (um arquivo KEY=VALUE cujas linhas RLB_* se tornam o ambiente da entrada; padrão .env), --dry-run e --remove. |
make smoke SMOKE_PROJECT="<name>" | Build, depois dirige as ferramentas reais contra a ponte ativa exatamente como o Claude Desktop faz: status, latência, prints e erros, listagens de projeto e timeline, uma timeline de rascunho com marcadores, paginação, truncamento, um render e sua limpeza. SMOKE_FLAGS=--no-render pula o render. A saída vai para .out/smoke.log. |
make stop | Pede para a ponte em execução sair (stop_bridge); relance-a pelo menu Scripts depois. |
make uninstall-bridge | Remove exatamente resolve_mcp_bridge.lua e claude_diag.lua da pasta de scripts (RLB_SCRIPTS_DIR substitui o padrão). |
make lint-lua | Verifica se os tipos de API gerados correspondem ao .pyi instalado, depois executa lua-language-server --check no workspace, falhando em qualquer diagnóstico sob bridge/ ou tests/. |
make inspect | Build, depois tools/list pelo CLI do MCP Inspector. O Inspector executa o servidor com os caminhos de produção, então isso realiza a auto-instalação real. |
make gen-types, make clean | Regenera types/resolve_host.d.lua a partir do .pyi enviado; remove server/, dist/ e .out/. |
O loop de desenvolvimento: make dev-register uma vez, depois make build e reinicie o Claude Desktop após cada mudança, sem reempacotar. A entrada de desenvolvimento e a extensão instalada podem rodar lado a lado: o bloqueio do slot de requisição é tomado por requisição e liberado imediatamente, então um servidor ocioso nunca bloqueia o outro. Eles respondem aos mesmos nomes de ferramentas, então desative um no Claude Desktop enquanto testa o outro. CONTRIBUTING.md tem o fluxo de branch e release.
Releases: enviar uma tag vX.Y.Z executa .github/workflows/release.yml, que roda os gates Node e make bundle no commit marcado, atesta a proveniência do build do bundle, depois publica um GitHub Release imutável com o bundle anexado e seu SHA-256 nas notas; a mensagem de uma tag anotada se torna a introdução das notas. Um segundo job publica o release no MCP Registry como io.github.saadk408/davinci-resolve-lua-mcp, com o hash do arquivo que o release serve. Verifique um bundle baixado com gh attestation verify davinci-resolve-lua-mcp.mcpb -R saadk408/davinci-resolve-lua-mcp. O workflow de testes também roda os gates Node e o gate do bundle em um runner Windows.
[!NOTE]
make smokecria e exclui uma timeline chamadabridge-smoke, adiciona e exclui marcadores nela e define o diretório de destino do render e o nome do arquivo do projeto.SMOKE_PROJECTdeve ser o nome do projeto que está aberto no Resolve, e deve ser um projeto de rascunho, nunca uma edição real. A execução se recusa a prosseguir quando os nomes diferem.
Layout:
bridge/resolve_mcp_bridge.lua: o loop dentro do Resolve, um arquivo sem dependências com menos de 600 linhas.src/: o servidor TypeScript.server.tscontém as 15 ferramentas,lua.tscada snippet Lua e o único helper de escape de strings,protocol.tso slot de requisição e o bloqueio,prefs.tso leitorFusion.prefs,bridgeInstall.tsa auto-instalação.scripts/claude_diag.lua: o diagnóstico de sandbox, também enviado no bundle.tests/: a suíte Node;tests/lua/: as verificaçõesfuscript.docs/: a lista de verificação de medição no Windows (windows.md) e as capturas de tela do README (images/).
Agradecimentos
Este projeto se baseia no trabalho de:
- AutoSubs - ponte Lua sobre preferências do Fusion no 21.1 gratuito, o canal que este projeto adotou
- samuelgursky/davinci-resolve-mcp - servidor MCP para DaVinci Resolve Studio através da API de script Python
DaVinci Resolve é uma marca registrada da Blackmagic Design Pty Ltd. Este projeto não é afiliado ou endossado pela Blackmagic Design.