DaVinci ProfessionalSAFE
Token-efficient MCP server for DaVinci Resolve Studio — kernel + domain architecture keeps context cost proportional to the work.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
An enterprise-grade Model Context Protocol (MCP) server that exposes the full DaVinci Resolve scripting API to AI assistants. This project was inspired by the davinci-resolve-mcp project by @samuelgursky, even though it is now a significantly different architecture.
Compatible with any AI system that supports modern MCP specifications.
How It Works
Most MCP servers dump every available tool into the AI's context window at session start. With a large API surface, that means hundreds of tool definitions loaded whether or not the current task needs them — wasting tokens and slowing response time.
This server uses a kernel + domain architecture instead:
- Kernel tools (always available, 6 total):
activate_domain,
deactivate_domain, list_domains, get_version, get_current_page, switch_page. These are useful regardless of what you're doing in Resolve.
- Domain tools (loaded on demand): the full Resolve API is organized into
domains — Project Management, Timeline Operations, Media Pool, and more. Call activate_domain("project_management") and the server fires a notifications/tools/list_changed event; your MCP client refetches the tool list and the domain's tools are immediately available, no session restart needed.
Context cost at session start is bounded by the kernel alone. You expand it deliberately, only for the domains your current workflow actually needs.
Who This Is For
This server is built for independent creators and boutique studios where AI API costs are real and context overhead matters.
Compared to other popular MCP servers for DaVinci Resolve:
Most alternatives load every available tool definition into the AI's context at session start. For a well-resourced production environment — a studio running Claude on dedicated infrastructure with token budgets absorbed into overhead — that approach is solid and t
7c8042daef78OBSERVED · 2026-10-09Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add davinci-mcp-professional -- uvx davinci-mcp-professional
{
"mcpServers": {
"davinci-mcp-professional": {
"command": "uvx",
"args": [
"davinci-mcp-professional"
]
}
}
}Exposed tools (167)
93 read · 70 write · 4 destructive. Blast radius: 4 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add_clip_flag | write | Add a color flag to a clip |
add_clip_marker | write | Add a marker to a clip at a specific source frame |
add_color_version | write | Add a new color version to a timeline item |
add_item_marker | write | Add a marker to a timeline item at a source frame |
add_storage_items_to_pool | write | Add files or folders from media storage to the media pool |
add_take | write | Add a media pool clip as a take to a timeline item |
add_timeline_marker | write | Add a marker to a timeline at a specific frame |
add_timeline_mattes | write | Add timeline matte files to the media pool |
add_track | write | Add a new track to a timeline |
analyze_dolby_vision | write | Run Dolby Vision analysis on timeline items |
append_clips_to_timeline | read | Append media pool clips to the current timeline |
apply_fairlight_preset | write | Apply a Fairlight preset to the current timeline |
auto_sync_audio | write | Auto-sync audio clips to video clips by waveform or timecode |
clear_clip_color | destructive | Clear the color label of a clip |
clear_clip_flags | destructive | Clear clip flags by color. Use |
clear_clip_mark_in_out | destructive | Clear in/out marks from a clip |
clear_timeline_marks | destructive | Clear in/out marks from a timeline |
copy_grades | read | Copy grades from one timeline item to others |
create_color_group | write | Create a new color group in the current project |
create_media_pool_folder | write | Create a subfolder inside an existing media pool folder |
create_powergrade_album | write | Create a new gallery PowerGrade album |
create_project | write | Create a new project with the given name |
create_project_folder | write | Create a project subfolder in the current folder |
create_stereo_clip | write | Create a stereo clip from two existing clips (DaVinci Resolve Studio only) |
create_still_album | write | Create a new gallery still album |
create_timeline | write | Create a new empty timeline with the given name |
create_timeline_from_clips | write | Create a new timeline from a list of media pool clips. Timeline is placed in the current media pool folder (use set_current_media_pool_folder to control placement). |
duplicate_timeline | read | Duplicate a timeline with a new name |
enable_track | write | Enable or disable a timeline track |
export_clip_metadata | read | Export clip metadata to a CSV file. Pass empty clip_ids list to export all clips. |
export_current_frame_as_still | read | Export the current frame as a still image file |
export_fusion_comp | read | Export a Fusion composition to a file |
export_layout_preset | read | Export a layout preset to a file |
export_project | read | Export a project to a .drp file |
export_timeline | read | Export a timeline to AAF, EDL, XML, FCPXML, OTIO, DRT, ALE, HDR, or Dolby Vision |
get_burn_in_preset_list | read | Get the list of available burn-in preset names |
get_clip_color | read | Get the color label of a clip |
get_clip_flags | read | Get the list of color flags on a clip |
get_clip_mark_in_out | write | Get the in/out marks set on a clip |
get_clip_matte_list | read | Get the list of matte file paths attached to a clip |
get_clip_name | read | Get the name of a media pool clip |
get_clip_third_party_metadata | read | Get third-party metadata from a clip |
get_clip_timeline | read | Get the timeline associated with a clip (if it is a timeline clip) |
get_clip_unique_id | read | Get the UUID of a clip (stable identifier for subsequent calls) |
get_clips_in_color_group | read | Get the timeline items assigned to a color group |
get_color_group_post_graph | write | Get node-count info for a color group |
get_color_group_pre_graph | read | Get node-count info for a color group |
get_color_groups | read | Get the list of color group names in the current project |
get_current_clip_thumbnail | read | Get the current clip thumbnail image data from the Color page |
get_current_database | read | Get info about the current project database |
get_current_media_pool_folder | read | Get the currently selected media pool folder |
get_current_project | read | Get the name of the currently open project |
get_current_project_folder | read | Get the name of the current project folder |
get_current_render_format | read | Get the currently selected render format and codec |
get_current_still_album | read | Get the name of the currently active still album |
get_current_timecode | read | Get the current playhead timecode of a timeline |
get_current_timeline | read | Get the name of the currently active timeline |
get_current_video_item | read | Get the current video item under the playhead |
get_fairlight_presets | read | Get the list of available Fairlight audio preset names |
get_folder_clips | read | List clips in a specific media pool folder |
get_folder_subfolders | read | List subfolders of a media pool folder |
get_gallery_albums | read | Get the list of gallery still album names |
get_gallery_powergrade_albums | read | Get the list of gallery PowerGrade album names |
get_graph_node_cache_mode | read | Get the cache mode of a graph node |
get_graph_node_count | read | Get the number of nodes in the current timeline |
get_graph_node_label | read | Get the label of a node in the timeline |
get_graph_node_lut | read | Get the LUT path assigned to a graph node |
get_graph_node_tools | read | Get the list of tool names active in a graph node |
get_keyframe_mode | read | Get the current keyframe mode (0=all, 1=color, 2=sizing) |
get_layout_presets | read | Get the list of available UI layout preset names |
get_media_pool_root_folder | read | Get info about the media pool root folder |
get_mounted_volumes | read | Get the list of mounted volumes visible to Resolve |
get_quick_export_presets | read | Get available Quick Export preset names |
get_render_codecs | read | Get codecs for a render format as {description: codec} |
get_render_formats | read | Get available render formats as {format: file_extension} |
get_render_job_list | read | Get the list of all render jobs and their settings |
get_render_job_status | read | Get the status and completion percentage of a render job |
get_render_mode | read | Get render mode (0=individual clips, 1=single clip) |
get_render_preset_list | read | Get the list of available render preset names |
get_render_resolutions | read | Get available resolutions for a format and codec |
get_selected_pool_clips | read | Get the clips currently selected in the media pool. Note: MediaPool.GetSelectedClips() is undocumented in FusionScript and returns empty in Resolve 21 — treat this as best-effort. |
get_start_timecode | write | Get the start timecode of a timeline |
get_still_label | read | Get the label of a still by index within an album |
get_storage_files | read | List files in a media storage path |
get_storage_subfolders | read | List subfolders in a media storage path |
get_timeline_end_frame | read | Get the end frame number of a timeline |
get_timeline_markers | read | Get all markers on a timeline as {frameId: {color, duration, note, name, customData}} |
get_timeline_marks | read | Get the in/out marks of a timeline |
get_timeline_media_pool_item | read | Get the media pool item associated with a timeline |
get_timeline_node_graph | read | Get the color node graph for a timeline (Color page) |
get_timeline_settings | read | Get one or all settings of a timeline. Omit setting_name to get all. |
get_timeline_start_frame | write | Get the start frame number of a timeline |
get_track_count | read | Get the number of tracks of a given type in a timeline |
get_track_enabled | read | Get whether a timeline track is enabled |
get_track_locked | read | Get whether a timeline track is locked |
get_track_name | read | Get the name of a timeline track |
get_track_subtype | read | Get the audio format subtype of an audio track |
get_version | read | Get DaVinci Resolve version information |
goto_parent_folder | read | Navigate to the parent project folder |
goto_root_folder | read | Navigate to the root project folder |
grab_still | read | Grab a still from the current clip on the Color page |
import_folder_from_file | write | Import a folder from a .drb bin file |
import_into_timeline | write | Import content into a timeline from an AAF file with remapping |
import_layout_preset | write | Import a layout preset from a file |
import_media | write | Import a media file into the current media pool folder |
import_project | write | Import a project from a .drp file |
import_stills | write | Import still files into a gallery album |
import_timeline_from_file | write | Import a timeline from an EDL, AAF, XML, FCPXML, DRT, ADL, or OTIO file |
insert_fusion_composition | write | Insert a new Fusion composition into a timeline at the current position |
insert_fusion_generator | write | Insert a Fusion generator into a timeline |
insert_fusion_title | write | Insert a Fusion title into a timeline |
insert_generator | write | Insert a generator clip into a timeline at the current playhead position |
insert_ofx_generator | write | Insert an OFX generator into a timeline |
insert_title | write | Insert a title clip into a timeline |
is_rendering_in_progress | read | Check whether a render is currently in progress |
link_clips | read | Link or unlink video and audio clips in a timeline |
link_full_resolution_media | read | Link a full-resolution media file to a clip |
link_proxy_media | read | Link a proxy media file to a clip |
list_databases | read | List all available project databases |
list_media_clips | read | List all clips in the media pool root folder |
list_project_folders | read | List project subfolders in the current folder |
list_projects | read | List all available projects in the current database folder |
list_timelines | read | List all timelines in the current project |
load_color_version | read | Load a color version by name |
load_layout_preset | read | Load a UI layout preset by name |
load_project_burn_in_preset | read | Load a burn-in preset for the current project |
load_render_preset | read | Load a render preset by name |
lock_track | read | Lock or unlock a timeline track |
move_folders | write | Move media pool folders to a different parent folder |
open_project | read | Open a project by name |
open_project_folder | read | Navigate into a project subfolder |
refresh_lut_list | read | Refresh the LUT list from disk |
refresh_media_pool_folders | read | Refresh media pool folders (use in collaboration mode) |
relink_clips | read | Relink offline clips to a new media folder |
rename_color_group | write | Rename a color group |
rename_color_version | write | Rename a color version |
rename_fusion_comp | write | Rename a Fusion composition on a timeline item |
rename_project | write | Rename the currently open project |
rename_timeline | write | Rename an existing timeline |
save_layout_preset | write | Save the current UI layout as a named preset |
save_project | write | Save the current project |
save_render_preset | write | Save current render settings as a new named preset |
set_clip_color | write | Set the color label of a clip |
set_clip_mark_in_out | write | Set in/out marks on a clip |
set_clip_metadata | write | Set a clip metadata field |
set_clip_name | write | Set the name of a media pool clip |
set_clip_property | write | Set a single clip property by key |
set_clip_third_party_metadata | write | Set a third-party metadata field on a clip |
set_current_media_pool_folder | write | Set the currently selected media pool folder |
set_graph_node_cache_mode | write | Set the cache mode of a graph node |
set_graph_node_enabled | write | Enable or disable a node in the timeline |
set_graph_node_lut | write | Assign a LUT file to a graph node |
set_item_node_lut | write | Assign a LUT file to a specific node on a timeline item |
set_keyframe_mode | write | Set keyframe mode (0=all, 1=color, 2=sizing) |
set_project_setting | write | Set a project setting value |
set_render_format_and_codec | write | Set the current render format and codec |
set_render_mode | write | Set render mode (0=individual clips, 1=single clip) |
set_selected_pool_clip | write | Set a clip as the selected clip in the media pool (sets the source viewer clip). Note: selection state cannot be verified via get_selected_pool_clips in Resolve 21. |
set_start_timecode | write | Set the start timecode of a timeline |
set_still_label | write | Set the label of a still by index within an album |
set_timeline_marks | write | Set in/out marks on a timeline |
set_timeline_setting | write | Set a timeline setting value. Note: Timeline.SetSetting() has very limited write support in Resolve 21 — most settings are effectively read-only via the API and will return |
set_track_name | write | Set the name of a timeline track |
stop_rendering | write | Stop the current render operation |
switch_page | read | Switch to a specific page in DaVinci Resolve |
switch_timeline | read | Switch the current timeline by name |
unlink_proxy_media | read | Unlink the proxy media from a clip |
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (11)
clear_clip_color, clear_clip_flags, clear_clip_mark_in_out, clear_timeline_marks
.bandit
"pickle.loads(","marshal.loads(","eval(","exec(",return (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot "../../..")).Path
marshal.loads( ... "eval(
You are a senior security engineer conducting a focused security review of the changes on this branch.
[official installer](https://www.python.org/downloads/) with "Add to PATH"
[python.org](https://www.python.org/downloads/) with "Add to PATH" and
Gates applied: no_behavioural_pass.
7c8042daef78full audit observations/trust-audit/mcp-server/hoyt-harness__davinci-professional-1.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-09 | 7c8042daef78 | SAFE | B | 89 | first audit |
Questions
What is the DaVinci Professional MCP server?
Token-efficient MCP server for DaVinci Resolve Studio — kernel + domain architecture keeps context cost proportional to the work.
What tools does DaVinci Professional expose?
167 in total: 93 read-only, 70 that write, and 4 that can delete or overwrite (clear_clip_color, clear_clip_flags, clear_clip_mark_in_out, clear_timeline_marks). Every one is listed on this page with its risk.
Is DaVinci Professional safe to connect to an agent?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 4 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does DaVinci Professional need?
No credential environment variables were found in its source, so it appears to need none.
How does DaVinci Professional run?
It speaks stdio, so it runs as a local process your client starts. It is published on PyPI as davinci-mcp-professional.
How current is this page?
The grade is for one exact copy of the source (7c8042daef78), read on 2026-10-09. The repository is watched and re-audited when it changes.