Batch operations and analysis for Final Cut Pro XML files via Claude.
A Model Context Protocol (MCP) server that reads and writes FCPXML files. Claude can analyze your timelines, make batch edits, and generate new sequences.
- Not a plugin that runs inside Final Cut Pro
- Not real-time editing β you export XML, modify it, then reimport
- Not a replacement for manual editing when you need visual feedback
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Final Cut Pro βββββ>β Claude + βββββ>β Final Cut Pro β
β Export XML β β MCP Server β β Import XML β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
- Export from FCP:
File β Export XML... - Run MCP tools: Analyze, modify, generate via Claude
- Import back to FCP:
File β Import β XML
This is a roundtrip workflow. Each edit cycle requires an export and import.
| Use Case | Why It Works |
|---|---|
| Batch marker insertion | Add 100 chapter markers from a transcript in one operation |
| QC before delivery | Find flash frames, gaps, duplicates programmatically |
| Data extraction | Export EDL, CSV, chapter markers for handoffs |
| Template generation | Create rough cuts from tagged clips automatically |
| Automated assembly | Build montages from keywords and pacing rules |
| Timeline health checks | Validate timing, find issues, get stats |
| Use Case | Why Not |
|---|---|
| Creative editing decisions | No visual feedback β you can't see results until reimport |
| Real-time adjustments | Export/import cycle is slow for iterative changes |
| Fine-tuning cuts | Adjusting by a few frames is faster in FCP directly |
| Anything visual | Color, framing, motion β need to see it |
git clone https://github.com/DareDev256/fcp-mcp-server.git
cd fcp-mcp-server
pip install -e .Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
Using uv (recommended):
{
"mcpServers": {
"fcpxml": {
"command": "uv",
"args": ["--directory", "/path/to/fcp-mcp-server", "run", "server.py"],
"env": {
"FCP_PROJECTS_DIR": "/Users/you/Movies"
}
}
}
}Using pip:
{
"mcpServers": {
"fcpxml": {
"command": "python",
"args": ["/path/to/fcp-mcp-server/server.py"],
"env": {
"FCP_PROJECTS_DIR": "/Users/you/Movies"
}
}
}
}File β Export XML... (saves as .fcpxml)
Open Claude Desktop and start working with your timeline.
These are ready-to-use workflows that chain multiple tools together. Select them from Claude's prompt menu.
| Prompt | What It Does |
|---|---|
| qc-check | Full quality control β flash frames, gaps, duplicates, health score |
| youtube-chapters | Extract chapter markers formatted for YouTube descriptions |
| rough-cut | Guided rough cut β shows available clips, suggests structure, generates |
| timeline-summary | Quick overview β stats, pacing, keywords, markers, assessment |
| cleanup | Find and auto-fix flash frames and gaps |
The server automatically discovers .fcpxml files in your projects directory (FCP_PROJECTS_DIR). Claude can see them without you specifying paths manually.
| Tool | Description |
|---|---|
list_projects |
Find all FCPXML files in a directory |
analyze_timeline |
Get stats on duration, resolution, pacing |
list_clips |
List all clips with timecodes, durations, keywords |
list_library_clips |
List all source clips available in the library |
list_markers |
Extract markers with timestamps (YouTube chapter format) |
find_short_cuts |
Find potential flash frames (< threshold) |
find_long_clips |
Find clips that might need trimming |
list_keywords |
Extract all keywords/tags from project |
export_edl |
Generate EDL for color/audio handoffs |
export_csv |
Export timeline data to CSV |
analyze_pacing |
Get pacing metrics with suggestions |
| Tool | Description |
|---|---|
detect_flash_frames |
Find ultra-short clips with severity (critical/warning) |
detect_duplicates |
Find clips using same source media |
detect_gaps |
Find unintentional gaps in timeline |
validate_timeline |
Health check with score (0-100%) |
| Tool | Description |
|---|---|
add_marker |
Add a single marker at a timecode |
batch_add_markers |
Add multiple markers, or auto-generate at cuts/intervals |
insert_clip |
Insert a library clip onto the timeline at any position |
trim_clip |
Adjust in/out points with optional ripple |
reorder_clips |
Move clips to new timeline positions |
add_transition |
Add cross-dissolve, fade, wipe between clips |
change_speed |
Slow motion or speed up clips |
delete_clips |
Remove clips with optional ripple |
split_clip |
Split a clip at specified timecodes |
| Tool | Description |
|---|---|
fix_flash_frames |
Auto-fix flash frames (extend neighbors or delete) |
rapid_trim |
Batch trim clips to max duration |
fill_gaps |
Close gaps by extending adjacent clips |
| Tool | Description |
|---|---|
auto_rough_cut |
Generate timeline from keywords, duration, pacing |
generate_montage |
Create montages with pacing curves (accelerating/decelerating/pyramid) |
generate_ab_roll |
Documentary-style A/B roll alternating edits |
| Tool | Description |
|---|---|
import_beat_markers |
Import beat markers from JSON audio analysis |
snap_to_beats |
Align cuts to nearest beat markers |
| Tool | Description |
|---|---|
import_srt_markers |
Parse SRT/VTT subtitles into timeline markers |
import_transcript_markers |
Parse timestamped text (YouTube chapters format) into markers |
"Analyze my latest FCP project"
"List all clips shorter than 1 second"
"Extract chapter markers for YouTube description"
"Run a health check on my timeline"
"Add chapter markers at these timestamps: [list]"
"Trim 2 seconds off the end of every interview clip"
"Add a cross-dissolve between all clips"
"Fix all flash frames by extending previous clips"
"Export an EDL for the colorist"
"Generate a CSV of all clips with timecodes"
"List all clips tagged 'interview' with durations"
"Create a 3-minute rough cut using clips tagged 'broll'"
"Generate a montage with accelerating pacing"
"Build an A/B roll: interviews as main, broll as cutaways"
"Import beat markers from beats.json"
"Snap all cuts to the nearest beat"
fcp-mcp-server/
βββ server.py # MCP server (32 tools, 5 prompts, resources)
βββ fcpxml/
β βββ __init__.py
β βββ parser.py # Read FCPXML β Python + library clip listing
β βββ writer.py # Python β FCPXML, batch fixes, gap filling
β βββ rough_cut.py # Rough cut, montage, A/B roll generation
β βββ models.py # Timeline, Clip, Marker, TimeValue, PacingCurve
βββ docs/
β βββ specs/ # Design specs and schemas
βββ tests/
β βββ test_models.py # Model & TimeValue tests (57 tests)
β βββ test_parser.py # Parser tests (8 tests)
β βββ test_writer.py # Writer tests (8 tests)
β βββ test_speed_cutting.py # Speed cutting & montage tests (22 tests)
βββ examples/
β βββ sample.fcpxml # Sample FCPXML for testing
βββ requirements.txt
βββ pyproject.toml
βββ README.md
- Python 3.10+
- Final Cut Pro 10.4+ (for FCPXML 1.8+)
- Claude Desktop (or any MCP-compatible client)
- mcp package (
pip install mcp)
After directing 350+ music videos, I got tired of repetitive editing tasks:
- Counting cuts manually
- Extracting chapter markers one by one
- Finding flash frames by scrubbing through footage
- Building rough cuts clip by clip
These are batch operations that don't need visual feedback. Export the XML, let Claude handle it, import the result.
- MCP Prompts: 5 pre-built workflows (qc-check, youtube-chapters, rough-cut, timeline-summary, cleanup)
- MCP Resources: Auto-discovery of FCPXML files in projects directory
- Refactored server: Dispatch dict pattern replaces 1000-line if/elif chain
- Cleaned dependencies: Removed unused packages (pydantic, timecode, click, opentimelineio)
- Better error handling: FileNotFoundError caught separately with clear messages
- uv support: Modern install instructions for Claude Desktop
- Entry point:
fcp-mcp-serverconsole script via pyproject.toml - SRT/VTT import:
import_srt_markersβ parse subtitles into timeline markers - Transcript import:
import_transcript_markersβ YouTube chapter format to markers - 34 tools total
- QC Tools:
detect_flash_frames,detect_duplicates,detect_gaps,validate_timeline - Batch Fixes:
fix_flash_frames,rapid_trim,fill_gaps - Generation:
generate_montagewith pacing curves,generate_ab_rollfor documentary-style edits - Beat Sync:
import_beat_markers,snap_to_beats - Timeline health scoring (0-100%)
- Flash frame severity levels (critical < 2 frames, warning < 6 frames)
- 32 tools total
- New:
list_library_clipsβ See all source media available for insertion - New:
insert_clipβ Add library clips at any position with subclip support - 21 tools total
- Write tools:
trim_clip,reorder_clips,add_transition,change_speed,delete_clips,split_clip,batch_add_markers - Generation:
auto_rough_cutβ Generate rough cuts from keywords - 19 tools total
- Core FCPXML parsing (v1.8 - v1.11)
- Timeline analysis and clip listing
- Marker extraction (chapters, TODOs, standard)
- EDL/CSV export
- 10 tools total
- Core FCPXML parsing
- Timeline analysis tools
- Marker extraction & insertion
- Clip trimming & reordering
- Transition insertion
- Speed changes
- Auto rough cut generation
- EDL/CSV export
- Library clip listing & insertion
- Flash frame detection & auto-fix
- Gap detection & filling
- Timeline validation with health scoring
- Montage generation with pacing curves
- A/B roll documentary-style editing
- Beat marker import & snap-to-beat
- MCP Prompts (pre-built workflows)
- MCP Resources (file auto-discovery)
- SRT/VTT subtitle import as markers
- Timestamped transcript import as markers
- Audio sync detection
- Multi-timeline comparison
- Premiere Pro XML support
PRs welcome. If you're a video editor who codes (or a coder who edits), let's build this together.
Built by @DareDev256 β Former music video director (350+ videos for Chief Keef, Migos, Masicka), now building tools for creators.
MIT License β see LICENSE for details.