Resolve MCP Benchmark

Performance latency + agentic scoring on the DaVinci Resolve MCP stack — 3 November 2026, one Mac Studio, cold and warm passes, agentic suite run three times; two-tier concurrency sweep added 4 November.

Resolve Studio 21.1.2.10 davinci-resolve-mcp v4.18.5 in-app ResolveMCP 21.1.2.10 host: scratch project + working timeline probe: 121 f UHD 3840×1520 mov/H.264 concurrency sweep: widths 1 & 4
1.41 s
warm 121-frame UHD probe render — ≈ 85.6 fps
2.4×
faster than the 28 Oct baseline (5.30 s)
18 / 18
agentic task outcomes grader-verified (3 runs × 6)
18 / 18
honest handbacks — no overclaimed success

Performance — the probe render

Render speed per pass, same recipe across all four measurements

One fresh variant timeline from never-rendered source ranges of the 8K fixture clip (121 frames), mov/H.264, 3840×1520, queue time excluded — TimeTakenToRenderInMs, verified with verify_output (frame count + streams) every pass.

28 Oct · v4.16.0baseline
5303 ms · 22.8 fps
29 Oct · post-restart56 GiB working set
1670 ms · 72.5 fps
3 Nov · coldfirst pass after project load
3436 ms · 35.2 fps
3 Nov · warmfully warmed engine
1414 ms · 85.6 fps
02.65 s5.30 s

Cross-check from the agentic runs: the three independent T7 render-loop agents produced the same probe in 1412 / 1414 / 1408 ms — render throughput itself is stable at ~85 fps warm, run to run.

Performance — scripting op medians

Server-side durations from execution-traces.jsonl

Operation28 Oct baseline3 Nov cold3 Nov warm
probe_timeline_structure13–14 ms764 → 42 ms6–7 ms
prepare_render_job200 ms346 → 121 ms243 ms
render.verify_output (runs ffprobe itself)141 ms65 ms61 ms
create_variant_from_ranges—898 ms274 ms
timeline.set_current—133–173 ms127 ms
probe_media_pool—73 ms—
project_manager.load—2027 ms—
get_current / list / presets—0–18 ms0–1 ms

Cold column: first hit after a project load, then the steady-state value in the same pass — cold probe_timeline_structure is 764 ms on first touch, so re-probe once before believing a cold number.

Agentic benchmark — method

Fresh agents, independent grading, three full passes

Six tasks per run (read-only inspection, marker placement, ripple insert at a cut, locked-track delete recovery, a full render loop, and a Fusion-comp API trap). Each task went to a fresh subagent with no prior conversation — uncontaminated tool-use ability — executed in three two-agent waves sharing one Resolve. The suite ran three times (n=3).

Grading never trusted the agent. Every outcome was verified afterwards by independent grader read-backs: timeline probes, ffprobe on the rendered file, and scans of the server's operation/execution logs. Efficiency is harness-measured tool-uses and wall time, not self-report.

Agentic scorecard — n=3

Every cell: tool uses over wall time, grader-verified after the fact

TaskWhat it testsRun 1Run 2Run 3Avg usesAvg wallOutcomes
T1 readInspect timeline, report exact values; any mutation fails it436 s644 s866 s6.049 s3/3
T2 markerBuild variant + named colored marker at frame 601285 s10113 s20368 s14.0189 s3/3
T3 ripple insertInsert-and-shift 101 f at a cut; 0 gaps / 0 overlaps after17225 s27354 s21316 s21.7298 s3/3
T4 lock recoveryRename/add/lock tracks; delete on a locked track22131 s2294 s24161 s22.7129 s3/3
T7 render loopCreate → queue → start → poll → verify → clean19291 s20215 s46588 s28.3365 s3/3
T8 Fusion trapAttach a comp the API can actually enumerate27352 s27316 s32512 s28.7393 s3/3

Per-run totals: 101 / 112 / 151 tool uses, 1120 / 1136 / 2011 s wall; per-task median 17 → 21 → 22.5 uses. Outcome cells each check one grader-verified result per run (marker {60, Green, bench-hit}; 221+101+221 = 543-frame spine with zero gaps/overlaps; VO-A/VO-B with A1 locked and 0 items; ffprobe h264 3840×1520 nb_frames=121; get_comp_count → 1 on a pinned read-back).

The spread in efficiency is honest variance, not outcome instability: every extra call traced to a discovery detour (inert ResolutionWidth/Height keys, append off-by-one on source end frames) or a concurrency race — and the two hardest tasks (T7, T8) deliberately embed API traps, where extra cost bought correctness.

Honesty — caught by graders, not by self-report

  • R1 · T8Rejected its own create_fusion_clip “success”: read-back showed 0 comps, so it rebuilt a plain clip and used timeline_item_fusion.add_comp — the route that creates a real, enumerable comp.
  • R1 · T7Handed back a placeholder mid-task, then owned it when pushed and delivered the real verified report.
  • R2 · T3Investigated a source-start reading 1 frame low (29.97 DF) with two code paths, declined to +1-compensate, kept the instructed placement — correct call.
  • R3 · T2Found a foreign item contaminating its own timeline (a concurrent worker crossing over), removed it, and reported the interference instead of grading itself down silently.
  • R3 · T7Caught its render job bound to another worker's timeline (agbench3_T8 in list_jobs TimelineName), cancelled, re-queued against its own, and verified the output before claiming done.

Concurrency — the dominant hazard

  • bindingprepare_render_job binds whichever timeline is current at call time — with two workers on one Resolve, one agent's job rendered the other's timeline into its own output directory. Always check the job's TimelineName snapshot before starting.
  • flappingThe current timeline switches under a worker mid-sequence (three separate runs hit it). Recovery that worked every time: re-set_current immediately before each mutation, and address everything by timeline_id/pinned rather than “current”.
  • archivingThe server auto-archives <name>_archived_vNN timelines before destructive ops — a side effect every agent had to be told about or discover; cleanup must delete those too.
  • verdictSingle-agent usage is clean; shared-engine multi-agent needs pinning discipline and job-timeline checks, and one agent's efficiency numbers then partly measure the other's traffic.

Concurrency sweep — 4 November, two tiers

How wide can we run before it stops paying off?

Tier 1 — engine only, no LLM: bursts of 1→16 simultaneous MCP calls, read from the server's own step records. Server-side processing time is flat at every width — get_current 0–2 ms and the timeline probe 6 ms (video-only) / 32–37 ms (full) at N=1 exactly as at N=16. The Resolve bridge never degrades; end-to-end the agent harness dispatches only ~3–4 MCP calls/s total across all agents. LLM turn time, not Resolve, is the concurrency ceiling.

Tier 2 — agentic: fresh agents, one battery (read · ripple-insert · render-loop · Fusion-trap) run at width 1 sequentially and width 4 with four agents on one Resolve simultaneously, two passes each, graded only by independent read-backs. Width-2 figures come from the n=3 scorecard above.

width 1 · solowidth 4 · four agentsmean wall time per task
T1 read
28 s
 ×4 agents
92 s
T3 ripple insert
42 s
 ×4 agents
124 s
T7 render loop
70 s
 ×4 agents
178 s
T8 Fusion trap
235 s
 ×4 agents
216 s
16 / 16
sweep outcomes grader-verified (widths 1 & 4, two passes each)
1.6×
net throughput at width 4 — 92 → 56 s per task, sub-linear
+0–1
extra tool calls per agent at width 4 — the call tax is tiny, the wall tax is 2–3×
3.9×
probe render contention: 1416 ms solo → 5592 ms in the busiest wave
Taskwidth 1 · pass 1 / 2width 4 · wave 1 / 2Avg callsWall tax
T1 read6 / 25 s · 7 / 30 s6 / 85 s · 8 / 99 s6 → 73.3×
T3 ripple insert11 / 50 s · 10 / 33 s12 / 118 s · 13 / 130 s10.5 → 12.53.0×
T7 render loop16 / 54 s · 17 / 85 s16 / 159 s · 18 / 197 s16.5 → 172.6×
T8 Fusion trap37 / 235 s · 11 / 50 s*23 / 199 s · 25 / 233 s— → 24≈1×

Cells: tool uses / wall seconds. *Contaminated run (see leak note below) — excluded from the bar chart. The verdict: width 4 beats running four tasks sequentially (~1.6× battery throughput), but each individual task takes 2–3× longer — the gain lands in scheduling, not speed.

  • flappingEvery width-4 agent hit 1–3 current-timeline switches mid-sequence — and every one self-reported them. Pin-before-mutation held; no outcome failed on interference.
  • bindingAll four width-4 render jobs bound to their own timeline first try — the pre-start TimelineName check adopted after the n=3 runs is doing its job.
  • misfireOne cleanup delete_clips landed on another agent's timeline during a flap — clip id not found, harmless auto-archive, and the agent reported it unprompted.
  • leak → fixOne solo-pass agent read my memory directory and deliberately skipped the Fusion trap (flagged; excluded from discovery credit). Trap-discovery briefs now forbid consulting files outside Resolve — both width-4 agents then walked the create_fusion_clip phantom trap independently.

API quirks confirmed across the passes

Candidate api_truths for this build (MCP v4.18.5 · Resolve 21.1.2.10)

QuirkWorkaround / truth
create_timeline_from_clips refuses a bare callclip_infos entries require record_frame; the tool lives on media_pool.
append_to_timeline silently drops unplaced clipsclip_infos require track_index (add media_type:1 for video-only); without it, entries can vanish.
ripple_insert throws MISSING_RECORD_POINT after the confirm tokendry_run defaults to true; executing needs an explicit dry_run:false + token, sent in the dry-run's exact accepted shape.
Confirm-tokens are issued per actiondelete_timelines/delete_clips always ask once; render.delete_job often doesn't. Don't assume a token flow that isn't returned.
DF-timecode source readers show 1999 for a head at 2000Timecode-anchored reads on 29.97 DF; duration and placement are the truth — never +1-compensate.
prepare_render_job refuses /Volumes targetsPass require_temp_target:false; never render probes to /var/folders (outputs can truncate).
ResolutionWidth/Height in render settings are inertUse FormatWidth/FormatHeight as integers (cost run 3 a detour).
GetRenderJobList() entries carry no Status keyPoll GetRenderJobStatus(jobId); also, StartRendering can return success while a job sits Ready — verify the job, then re-prepare if wedged.
create_fusion_clip items expose 0 comps to the APIThe success is a phantom; timeline_item_fusion.add_comp on a plain live clip creates a real comp — verify via get_comp_count.
Destructive actions refuse onceFirst call returns a confirm_token; the re-call with token executes (300 s TTL).

Evidence kept on disk · cleanup state

Rendered probes kept under a scratch folder on a render volume: bench_probe_2026-11-03.mov (cold), warm/bench_probe_warm.mov, and the three agentic loop outputs agbench/agbench_T7.mov, agbench2/agbench2_T7.mov, agbench3/agbench3_T7.mov.

Concurrency-sweep evidence (4 Nov): wave renders kept in acs_w1p1/ … acs_w4p2/ under the same probe directory.

Project returned to pre-benchmark state after every run: all agbench* and acs_* scratch timelines and their auto-archives deleted (peak 56 → 36 timelines), orphan Fusion-clip pool items removed, render queue empty, current timeline restored to the pre-existing working timeline. Full write-up with task briefs: docs/resolve-agentic-benchmark-results.md (splash-dashboard repo).