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.
| Action | Parameters | Returns |
|---|---|---|
list_comps | track_index?, item_index? | List of comp names and count |
inspect | comp_index?, track_index?, item_index? | All tools with IDs and key inputs |
create | track_index?, item_index? | New empty comp name |
import_comp | path, track_index?, item_index? | Success status |
export_comp | path, comp_index?, track_index?, item_index? | Success status |
delete | name, 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.
| Action | Parameters | Returns |
|---|---|---|
list_tools | comp_index?, track_index?, item_index? | All tools with name, ID, passthrough state |
get_input | tool_name, input_name | Current value |
set_input | tool_name, input_name, value | Success + readback |
get_all_inputs | tool_name | Full input dump |
set_passthrough | tool_name, enabled | Success 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.
| Action | Parameters | Returns |
|---|---|---|
scan_text | min_track? (default 5) | All generators with text field values |
set_text | track_index, item_index, tool_name, field, value | Success + readback |
set_font | track_index, item_index, tool_name, font, style?, size? | Success |
set_color | track_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.
| Action | Parameters | Returns |
|---|---|---|
insert_generator | name | Success status |
insert_title | name | Success status |
insert_composition | — | Success status |
list_generators | — | Common 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.
| Action | Parameters | Returns |
|---|---|---|
list_recipes | — | All 10 recipes with descriptions |
build | recipe, + recipe params | Tools created, tool names |
build_lower_third | text, subtitle?, font?, size?, color? | Shortcut for lower third |
build_title_card | text, font?, size?, color?, bg_color? | Shortcut for title card |
Available recipes:
| Recipe | Category | What it builds |
|---|---|---|
lower_third | Titles | Background bar + name TextPlus + optional subtitle |
title_card | Titles | Full-screen background + centered title text |
name_super | Titles | Simple name with optional title line |
text_overlay | Titles | Positioned text (center, top, bottom, corners) |
chroma_key | Compositing | DeltaKeyer configured for green/blue screen |
luma_key | Compositing | Luminance-based key |
blend_layers | Compositing | Merge with blend mode control |
solid_background | Motion Graphics | Solid color or gradient background |
vignette | Motion Graphics | Elliptical mask vignette with strength/softness |
blur_transition | Motion Graphics | Directional 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
| Action | Parameters | Returns |
|---|---|---|
list_tracks | — | All audio tracks with names, item counts, lock/enable state |
insert_audio | path, track_index? | Success status |
get_voice_isolation | track_index?, item_index? | Current state |
set_voice_isolation | enabled, track_index?, item_index? | Success status |
add_track | sub_type? (mono/stereo/5.1/7.1/adaptive) | Success status |
audio_presets — Fairlight Presets
| Action | Parameters | Returns |
|---|---|---|
list_presets | — | Available Fairlight presets |
apply_preset | name | Success status |
scan_audio_tracks | — | Per-track: clip count, total duration, empty status |
audio_transcribe — Transcription & Subtitles
| Action | Parameters | Returns |
|---|---|---|
create_subtitles | options? | Triggers Resolve's built-in subtitle generation |
list_subtitle_tracks | — | Subtitle tracks with item counts |
export_subtitles | track_index? | All subtitle items with start/end/duration |
audio_analyze — Analysis & Placement
| Action | Parameters | Returns |
|---|---|---|
find_gaps | track_index?, min_gap_frames? | Empty gaps in audio tracks |
coverage_report | — | Per-track audio coverage percentage |
suggest_music_placement | edit_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
| Action | Parameters | Returns |
|---|---|---|
analyze | — | Full analysis: name, duration, all tracks, item counts, markers |
detect_scene_cuts | — | Scene cut detection results |
duplicate | name? | Safe duplicate of current timeline |
export | path, format? (AAF/EDL/FCPXML/DRT) | Export file |
Example: Get a complete picture of your timeline:
edit_timeline(action="analyze")
edit_clips — Clip Operations
| Action | Parameters | Returns |
|---|---|---|
list_clips | track_type?, track_index? | All clips with name, duration, start/end, source info |
get_properties | track_index?, item_index? | Full property dump (Pan, Zoom, Rotation, Opacity, etc.) |
set_property | track_index?, item_index?, key, value | Set any clip property |
create_compound | track_index?, clip_indices? | Create compound clip |
create_fusion_clip | track_index?, clip_indices? | Create Fusion clip |
edit_pacing — Pacing Analysis
Analyzes your edit rhythm and suggests trims for different content styles.
| Action | Parameters | Returns |
|---|---|---|
analyze | track_index? | Shot durations, rhythm classification, energy, tempo, outliers |
suggest_trims | style?, track_index? | Per-clip trim suggestions with priority |
analyze_transitions | track_index? | Transition types and durations |
Style targets:
| Style | Avg Shot | Max Shot | Best for |
|---|---|---|---|
documentary | 6.0s | 20.0s | Interview-driven docs |
commercial | 2.5s | 6.0s | TV spots, ads |
narrative | 5.0s | 15.0s | Film, drama, story |
music_video | 1.8s | 4.0s | Music videos, montage |
corporate | 4.0s | 10.0s | Corporate videos, training |
social_media | 1.5s | 3.0s | Reels, 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
| Action | Parameters | Returns |
|---|---|---|
list | scope? (timeline/clip) | All markers with frame, color, name, note |
add | frame, color, name?, note?, duration? | Add single marker |
delete | frame | Delete marker at frame |
bulk_add | markers (list of {frame, color, name?, note?}) | Batch add markers |
export | — | Export 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
| Action | Parameters | Returns |
|---|---|---|
build_selects | color?, marker_color?, output_name? | Find clips matching criteria for selects timeline |
reorder_by_timecode | track_index? | Report clips in source timecode order |
find_gaps | track_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
| Action | Parameters | Returns |
|---|---|---|
generate | description | CDL values + human-readable description |
apply | cdl, track_index?, item_index? | Apply CDL to clip |
list_presets | category? | All 30 presets with descriptions |
apply_preset | name, 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
| Action | Parameters | Returns |
|---|---|---|
analyze_hero | track_index?, item_index? | Hero shot CDL + description |
copy_to_all | track_index?, item_index? | Copy hero grade to all other clips |
apply_cdl_to_track | cdl, track_index? | Apply CDL to every clip on a track |
grade_analyze — Grade Analysis
| Action | Parameters | Returns |
|---|---|---|
describe | track_index?, item_index? | Plain-language grade description + node info |
compare | item_a, item_b | Distance score + match quality |
scan_track | track_index? | Describe every grade on a track |
mood_grade — Emotional Color Grading
| Action | Parameters | Returns |
|---|---|---|
translate | description | CDL + dimension scores + confidence |
apply | description, track_index?, item_index? | Translate and apply |
blend | description_a, description_b, mix? | Blend two moods |
reset | track_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
| Action | Parameters | Returns |
|---|---|---|
scan_metadata | folder? | All clip metadata: cameras, codecs, properties |
group_by | criterion | Groups by camera, scene, codec, resolution, clip_color |
auto_color_code | criterion? | Assign Resolve clip colors to groups automatically |
organize_bins — Bin Management
| Action | Parameters | Returns |
|---|---|---|
list_folders | — | Top-level Media Pool folders |
create_folder | name | Create new folder |
move_clips | clip_ids, target_folder | Move clips to folder |
auto_organize | criterion? | Create folders by criterion and sort clips |
organize_metadata — Metadata Ops
| Action | Parameters | Returns |
|---|---|---|
batch_read | clip_ids?, fields? | Read metadata from clips |
batch_write | updates [{clip_id, field, value}] | Write metadata in batch |
copy_metadata | source_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
actionparameter - Shared connection module — all tools import from
connection.pyfor 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()returnsNonefor empty tracks, not[]— all tools handle this- Fusion comp indices are 1-based —
GetFusionCompByIndex(1)is the first comp GetLeftOffset()returnsNonefor generators and transitions — used as a type detectorCopyGrades()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