Resolve AI Toolkit

March 16, 2026 · View on GitHub

AI-powered MCP toolkit for DaVinci Resolve Studio — 21 tools across Fusion/VFX, editing, audio, color grading, and organization.

Built for editors who know their craft and want AI to handle the repetitive parts: Fusion comp building, pacing analysis, metadata organization, look development, and audio management — all through natural language via Claude.

What This Does

This is an MCP (Model Context Protocol) server that gives Claude direct access to DaVinci Resolve's Scripting API. Instead of clicking through menus, you describe what you want:

"Apply a warm golden hour look to the hero shot on V2"
"Analyze the pacing of my edit — is it too slow for a commercial?"
"Scan all my clips and organize them by camera"
"Build a lower third that says 'John Smith, CEO'"
"List all Fairlight presets and apply Vanguard_Nick"

Claude translates these into precise API calls through 21 specialized tools.


Requirements

  • DaVinci Resolve Studio (free version doesn't support external scripting)
  • macOS (Apple Silicon or Intel)
  • Python 3.10–3.12 (Resolve's scripting API doesn't support 3.13+)
  • External scripting enabled in Resolve: Preferences → General → External scripting → Local

Installation

1. Clone the repo

git clone https://github.com/InfiniviewStudios/resolve-ai-toolkit.git
cd resolve-ai-toolkit

2. Create a virtual environment and install

python3 -m venv .venv
source .venv/bin/activate
pip install -e .

3. Verify it works

python -c "from resolve_toolkit.server import mcp, VERSION; print(f'v{VERSION} — {mcp.name} ready')"

4. Configure Claude Code

Add to ~/.claude/settings.json under mcpServers:

{
  "mcpServers": {
    "resolve-ai-toolkit": {
      "command": "/path/to/resolve-ai-toolkit/.venv/bin/python",
      "args": ["-m", "resolve_toolkit"]
    }
  }
}

Replace /path/to/ with the actual path to your clone.

5. Start using it

Launch DaVinci Resolve Studio, open a project, then talk to Claude:

"Analyze my current timeline"
"What does the grade look like on V2 clip 0?"
"Insert a Fusion generator called Text+"

Tool Reference

Every tool uses an action dispatch pattern:

tool_name(action="action_name", params={"key": "value"})

Most tools default to track_type="video", track_index=1, item_index=0 when addressing timeline items.


Fusion/VFX Module (5 tools)

The primary module — automates Fusion composition work that normally requires manual node wiring.

fusion_comp — Composition Management

Manage Fusion compositions on timeline items.

ActionParametersReturns
list_compstrack_index?, item_index?List of comp names and count
inspectcomp_index?, track_index?, item_index?All tools with IDs and key inputs
createtrack_index?, item_index?New empty comp name
import_comppath, track_index?, item_index?Success status
export_comppath, comp_index?, track_index?, item_index?Success status
deletename, track_index?, item_index?Success status

Example: Inspect what's inside a Fusion comp on V5:

fusion_comp(action="inspect", params={"track_index": 5, "item_index": 0})

fusion_tools — Node/Tool Manipulation

Read and write any input on any Fusion tool — the power tool for VFX work.

ActionParametersReturns
list_toolscomp_index?, track_index?, item_index?All tools with name, ID, passthrough state
get_inputtool_name, input_nameCurrent value
set_inputtool_name, input_name, valueSuccess + readback
get_all_inputstool_nameFull input dump
set_passthroughtool_name, enabledSuccess status

Example: Change a Background node's color to deep blue:

fusion_tools(action="set_input", params={
    "tool_name": "Background1",
    "input_name": "TopLeftBlue",
    "value": 0.8,
    "track_index": 5
})

fusion_text — TextPlus Operations

Specialized tools for reading and writing text on Fusion generators.

ActionParametersReturns
scan_textmin_track? (default 5)All generators with text field values
set_texttrack_index, item_index, tool_name, field, valueSuccess + readback
set_fonttrack_index, item_index, tool_name, font, style?, size?Success
set_colortrack_index, item_index, tool_name, r, g, b, a?Success

Example: Scan all text generators on tracks V5 and above:

fusion_text(action="scan_text", params={"min_track": 5})

fusion_effects — Effect Library

Insert Fusion generators, titles, and blank compositions into the timeline.

ActionParametersReturns
insert_generatornameSuccess status
insert_titlenameSuccess status
insert_compositionSuccess status
list_generatorsCommon generator/title names

Example: Insert a Text+ generator at the playhead:

fusion_effects(action="insert_generator", params={"name": "Text+"})

fusion_recipes — AI-Guided Comp Building

Build complete Fusion compositions from recipes — no manual node wiring needed.

ActionParametersReturns
list_recipesAll 10 recipes with descriptions
buildrecipe, + recipe paramsTools created, tool names
build_lower_thirdtext, subtitle?, font?, size?, color?Shortcut for lower third
build_title_cardtext, font?, size?, color?, bg_color?Shortcut for title card

Available recipes:

RecipeCategoryWhat it builds
lower_thirdTitlesBackground bar + name TextPlus + optional subtitle
title_cardTitlesFull-screen background + centered title text
name_superTitlesSimple name with optional title line
text_overlayTitlesPositioned text (center, top, bottom, corners)
chroma_keyCompositingDeltaKeyer configured for green/blue screen
luma_keyCompositingLuminance-based key
blend_layersCompositingMerge with blend mode control
solid_backgroundMotion GraphicsSolid color or gradient background
vignetteMotion GraphicsElliptical mask vignette with strength/softness
blur_transitionMotion GraphicsDirectional blur transition

Example: Build a lower third on V5 clip 0:

fusion_recipes(action="build", params={
    "recipe": "lower_third",
    "text": "John Smith",
    "subtitle": "Chief Executive Officer",
    "track_index": 5,
    "item_index": 0
})

Audio/Fairlight Module (4 tools)

Manage audio tracks, apply Fairlight presets, handle transcription, and analyze audio placement.

audio_manage — Track Management

ActionParametersReturns
list_tracksAll audio tracks with names, item counts, lock/enable state
insert_audiopath, track_index?Success status
get_voice_isolationtrack_index?, item_index?Current state
set_voice_isolationenabled, track_index?, item_index?Success status
add_tracksub_type? (mono/stereo/5.1/7.1/adaptive)Success status

audio_presets — Fairlight Presets

ActionParametersReturns
list_presetsAvailable Fairlight presets
apply_presetnameSuccess status
scan_audio_tracksPer-track: clip count, total duration, empty status

audio_transcribe — Transcription & Subtitles

ActionParametersReturns
create_subtitlesoptions?Triggers Resolve's built-in subtitle generation
list_subtitle_tracksSubtitle tracks with item counts
export_subtitlestrack_index?All subtitle items with start/end/duration

audio_analyze — Analysis & Placement

ActionParametersReturns
find_gapstrack_index?, min_gap_frames?Empty gaps in audio tracks
coverage_reportPer-track audio coverage percentage
suggest_music_placementedit_track?Suggested music cue points based on edit rhythm

Example: Get a coverage report across all audio tracks:

audio_analyze(action="coverage_report")

Editing Module (5 tools)

Timeline analysis, clip management, pacing analysis with style-based trim suggestions, marker management, and assembly helpers.

edit_timeline — Timeline Operations

ActionParametersReturns
analyzeFull analysis: name, duration, all tracks, item counts, markers
detect_scene_cutsScene cut detection results
duplicatename?Safe duplicate of current timeline
exportpath, format? (AAF/EDL/FCPXML/DRT)Export file

Example: Get a complete picture of your timeline:

edit_timeline(action="analyze")

edit_clips — Clip Operations

ActionParametersReturns
list_clipstrack_type?, track_index?All clips with name, duration, start/end, source info
get_propertiestrack_index?, item_index?Full property dump (Pan, Zoom, Rotation, Opacity, etc.)
set_propertytrack_index?, item_index?, key, valueSet any clip property
create_compoundtrack_index?, clip_indices?Create compound clip
create_fusion_cliptrack_index?, clip_indices?Create Fusion clip

edit_pacing — Pacing Analysis

Analyzes your edit rhythm and suggests trims for different content styles.

ActionParametersReturns
analyzetrack_index?Shot durations, rhythm classification, energy, tempo, outliers
suggest_trimsstyle?, track_index?Per-clip trim suggestions with priority
analyze_transitionstrack_index?Transition types and durations

Style targets:

StyleAvg ShotMax ShotBest for
documentary6.0s20.0sInterview-driven docs
commercial2.5s6.0sTV spots, ads
narrative5.0s15.0sFilm, drama, story
music_video1.8s4.0sMusic videos, montage
corporate4.0s10.0sCorporate videos, training
social_media1.5s3.0sReels, TikTok, shorts

Example: Are my shots too long for a commercial?

edit_pacing(action="suggest_trims", params={"style": "commercial", "track_index": 2})

edit_markers — Marker Management

ActionParametersReturns
listscope? (timeline/clip)All markers with frame, color, name, note
addframe, color, name?, note?, duration?Add single marker
deleteframeDelete marker at frame
bulk_addmarkers (list of {frame, color, name?, note?})Batch add markers
exportExport all markers as JSON

Available marker colors: Blue, Cyan, Green, Yellow, Red, Pink, Purple, Fuchsia, Rose, Lavender, Sky, Mint, Lemon, Sand, Cocoa, Cream.

edit_assembly — Rough Cut Helpers

ActionParametersReturns
build_selectscolor?, marker_color?, output_name?Find clips matching criteria for selects timeline
reorder_by_timecodetrack_index?Report clips in source timecode order
find_gapstrack_type?, track_index?, min_gap_frames?Find empty gaps between clips

Color Module (4 tools)

Natural-language color grading with 30 built-in cinematic presets.

look_develop — Look Development

ActionParametersReturns
generatedescriptionCDL values + human-readable description
applycdl, track_index?, item_index?Apply CDL to clip
list_presetscategory?All 30 presets with descriptions
apply_presetname, track_index?, item_index?Apply named preset

30 presets in 5 categories:

  • Film stocks: kodak_5219, fuji_3513, kodachrome, ektachrome, portra_400, cinestill_800t
  • Moods: golden_hour, blue_hour, moonlight, overcast, harsh_midday, sunset_blaze
  • Genres: film_noir, scifi_cool, horror_desat, romance_warm, western_dust, thriller_tense
  • Decades: seventies_warm, eighties_neon, nineties_grunge, teal_and_orange
  • Emotions: melancholy, joy, tension, nostalgia, isolation, dreamlike, fury, serenity

shot_match — Shot Matching

ActionParametersReturns
analyze_herotrack_index?, item_index?Hero shot CDL + description
copy_to_alltrack_index?, item_index?Copy hero grade to all other clips
apply_cdl_to_trackcdl, track_index?Apply CDL to every clip on a track

grade_analyze — Grade Analysis

ActionParametersReturns
describetrack_index?, item_index?Plain-language grade description + node info
compareitem_a, item_bDistance score + match quality
scan_tracktrack_index?Describe every grade on a track

mood_grade — Emotional Color Grading

ActionParametersReturns
translatedescriptionCDL + dimension scores + confidence
applydescription, track_index?, item_index?Translate and apply
blenddescription_a, description_b, mix?Blend two moods
resettrack_index?, item_index?Reset to neutral CDL

Example: Apply "fading memory" mood to V2:

mood_grade(action="apply", params={"description": "fading memory", "track_index": 2})

Organization Module (3 tools)

Smart clip grouping, Media Pool bin management, and batch metadata operations.

organize_clips — Smart Grouping

ActionParametersReturns
scan_metadatafolder?All clip metadata: cameras, codecs, properties
group_bycriterionGroups by camera, scene, codec, resolution, clip_color
auto_color_codecriterion?Assign Resolve clip colors to groups automatically

organize_bins — Bin Management

ActionParametersReturns
list_foldersTop-level Media Pool folders
create_foldernameCreate new folder
move_clipsclip_ids, target_folderMove clips to folder
auto_organizecriterion?Create folders by criterion and sort clips

organize_metadata — Metadata Ops

ActionParametersReturns
batch_readclip_ids?, fields?Read metadata from clips
batch_writeupdates [{clip_id, field, value}]Write metadata in batch
copy_metadatasource_id, target_ids, fields?Copy metadata between clips

Example: Organize all clips by camera and color-code them:

organize_clips(action="auto_color_code", params={"criterion": "camera"})

Workflow Examples

Quick Corporate Video Setup

1. "Analyze my timeline"
2. "Scan the audio tracks — which ones have content?"
3. "Check the pacing for a corporate style"
4. "Apply the 'kodak_5219' preset to V2 clip 0"
5. "Copy that grade to all clips on V2"

Fusion VFX Session

1. "List the Fusion comps on V5 clip 0"
2. "Inspect the comp — what tools are in it?"
3. "Set the StyledText on TextPlus1 to 'New Title'"
4. "Build a lower third on V6 clip 0: text 'Jane Doe', subtitle 'Director'"
5. "Build a vignette on V2 clip 0 with strength 0.3"

Audio Post Session

1. "List all Fairlight presets"
2. "Apply preset 'Dialogue Clean' to the timeline"
3. "Create subtitles from the audio"
4. "Find gaps in audio track 1 longer than 24 frames"
5. "Suggest where to place music cues based on the edit"

Color Grading Session

1. "Generate a look for 'warm sunset with slightly crushed shadows'"
2. "Apply it to V2 clip 0"
3. "Describe what the grade looks like on clip 3"
4. "Compare clip 0 and clip 3 grades"
5. "Blend 'golden hour' with 'film noir' at 30% mix"

Architecture

resolve_toolkit/
├── server.py          # Main MCP server — registers all 21 tools
├── connection.py      # Shared Resolve connection (lazy) + helpers
├── fusion/
│   ├── tools.py       # 5 tools: comp, tools, text, effects, recipes
│   └── templates.py   # 10 recipe builders
├── audio/
│   └── tools.py       # 4 tools: manage, presets, transcribe, analyze
├── editing/
│   ├── tools.py       # 5 tools: timeline, clips, pacing, markers, assembly
│   └── pacing.py      # Pacing analysis engine
├── color/
│   ├── tools.py       # 4 tools: look_develop, shot_match, grade_analyze, mood_grade
│   ├── engine.py      # CDL math, mood-to-CDL translation, describe_cdl
│   └── presets.py     # 30 cinematic look presets as CDL values
└── organize/
    └── tools.py       # 3 tools: clips, bins, metadata

Key Design Decisions

  • Single MCP server — one process, all 21 tools, no multi-server complexity
  • Lazy Resolve connection — server starts instantly, connects on first tool call
  • Action dispatch — each tool handles multiple related actions via action parameter
  • Shared connection module — all tools import from connection.py for DRY Resolve access
  • No external AI dependencies — mood-to-CDL translation and pacing analysis are pure Python engines, no LLM calls
  • macOS-native — Resolve scripting paths hardcoded for macOS (where Resolve Studio runs)

Resolve API Notes

Things to know when working with the tools:

  • GetItemListInTrack() returns None for empty tracks, not [] — all tools handle this
  • Fusion comp indices are 1-basedGetFusionCompByIndex(1) is the first comp
  • GetLeftOffset() returns None for generators and transitions — used as a type detector
  • CopyGrades() requires Color page active — the shot_match tool uses this
  • Timeline handles go stale after SetCurrentTimeline() — tools reacquire as needed
  • Fusion input writes need settling time — tools include time.sleep(0.2-0.3) after writes

License

MIT