fcpxml-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OPENAI_BASE_URL | No | Route LLM calls through any OpenAI-compatible proxy (LiteLLM, OpenRouter, Ollama, vLLM) | |
| FCP_PROJECTS_DIR | No | Root directory for FCPXML file discovery via list_projects | ~/Movies |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_projectsA | List all FCPXML projects in directory |
| analyze_timelineB | Get comprehensive timeline statistics including duration, resolution, clip count, pacing metrics |
| list_clipsB | List all clips with timecodes, durations, and metadata |
| list_markersC | Extract markers (chapter, todo, standard) with timestamps |
| find_short_cutsC | Find clips shorter than threshold (flash frame detection) |
| find_long_clipsC | Find clips longer than threshold |
| list_keywordsC | Extract all keywords/tags from project |
| export_edlC | Generate EDL (Edit Decision List) from timeline |
| export_csvC | Export timeline data to CSV format |
| analyze_pacingC | Analyze edit pacing with suggestions for improvements |
| list_library_clipsA | List all available clips in the library (source media, not yet on timeline) |
| detect_flash_framesB | Find ultra-short clips (flash frames) that are likely errors, with severity categorization |
| detect_duplicatesC | Find clips using the same source media (potential duplicates) |
| detect_gapsC | Find unintentional gaps in the timeline |
| add_markerC | Add a marker at a specific timecode |
| batch_add_markersA | Add multiple markers at once, or auto-generate at cuts/intervals |
| trim_clipB | Trim a clip's in-point and/or out-point |
| reorder_clipsC | Move clips to a new position in the timeline |
| add_transitionC | Add a transition between clips |
| change_speedC | Change clip playback speed (slow motion or speed up) |
| delete_clipsC | Delete clips from timeline |
| split_clipC | Split a clip at specified timecodes |
| insert_clipB | Insert a library clip onto the timeline at a specific position |
| fix_flash_framesB | Automatically fix detected flash frames by extending neighbors or deleting |
| rapid_trimB | Batch trim clips to a maximum duration for fast-paced montages |
| fill_gapsC | Automatically fill gaps in the timeline by extending adjacent clips |
| validate_timelineB | Comprehensive timeline health check for flash frames, gaps, duplicates, and issues |
| auto_rough_cutC | Generate a rough cut from source clips based on keywords, duration, and pacing |
| generate_montageC | Create rapid-fire montages with pacing curves (accelerating, decelerating, pyramid) |
| generate_ab_rollB | Create documentary-style A/B roll edits alternating between main content and cutaways |
| import_beat_markersC | Import beat markers from external audio analysis (JSON format) |
| snap_to_beatsB | Align cuts to nearest beat markers for music-synced edits |
| import_srt_markersA | Import SRT or VTT subtitles as chapter markers on the timeline |
| import_transcript_markersA | Import timestamped transcript (YouTube chapter format) as markers. Supports '0:00 Title' and 'HH:MM:SS Title' formats |
| list_connected_clipsA | List all connected clips (B-roll, titles, audio) with their lanes and parent clips |
| add_connected_clipA | Connect a library clip to an existing timeline clip (B-roll overlay, audio, title) |
| list_compound_clipsA | List compound clips (ref-clips) and their nested content |
| list_rolesA | List all audio/video roles used in the timeline with clip counts |
| assign_roleC | Set the audio or video role on a clip (dialogue, music, effects, titles, etc.) |
| filter_by_roleC | List all clips matching a specific audio or video role |
| export_role_stemsA | Export clip list grouped by role for audio mixing stem planning |
| diff_timelinesB | Compare two FCPXML files and report differences in clips, markers, transitions, and format |
| reformat_timelineA | Create new FCPXML with different resolution/aspect ratio (9:16 for TikTok, 1:1 for Instagram, etc.) |
| detect_media_silenceA | Detect REAL silence by analyzing each clip's source audio with ffmpeg silencedetect, mapped into timeline time. Unlike detect_silence_candidates (XML-only heuristics), this reads the actual media files referenced by the timeline. Requires ffmpeg; clips whose media is missing or unreadable are reported, not failed. |
| detect_beatsA | Detect musical beats and tempo in an audio/video file (librosa beat tracker). Writes a beats JSON next to the media file that plugs directly into import_beat_markers + snap_to_beats for beat-synced editing. Requires the optional [intelligence] extra (librosa); degrades to an install hint without it. |
| remove_media_silenceA | Detect REAL silence in each clip's source audio (ffmpeg) and CUT it out of the timeline with ripple. Clips are split around silence; the silent middles are removed and everything after shifts earlier. Non-destructive: writes a _silence_removed copy. Preview with detect_media_silence first. |
| transcribe_mediaA | Transcribe each clip's source media locally with word-level timestamps (faster-whisper). Writes a _transcript.json next to each media file (reused by edit_by_transcript / remove_filler_words so media is only transcribed once) and optionally an SRT for captions. Requires the optional [transcribe] extra; degrades to an install hint without it. |
| edit_by_transcriptA | Text-based editing: cut timeline content by what was SAID. mode=remove cuts every occurrence of the given phrases (with ripple); mode=keep_only keeps only the matched phrases and cuts everything else in each matched clip (clips with no matches are left untouched). Uses each media file's _transcript.json (auto-transcribes if missing). Non-destructive: writes a _transcript_edit copy. |
| remove_filler_wordsA | Cut filler words (um, uh, erm...) out of the timeline with ripple, using word-level transcripts of the real source audio. Conservative default filler list — words like 'like' and 'so' are only cut if you pass them explicitly. Uses each media file's _transcript.json (auto-transcribes if missing). Non-destructive: writes a _defillered copy. |
| detect_silence_candidatesA | Detect potential silence/dead air using timeline heuristics (gaps, ultra-short clips, name patterns, duration anomalies) |
| remove_silence_candidatesB | Remove or mark detected silence candidates from timeline |
| export_resolve_xmlB | Export timeline as DaVinci Resolve compatible FCPXML (simplified v1.9) |
| export_fcp7_xmlA | Export timeline as FCP7 XML (XMEML) for Premiere Pro, DaVinci Resolve, and Avid compatibility |
| list_effectsA | List all available FCP transition effects with slugs and UUIDs |
| add_audioB | Add an audio clip or music bed to the timeline |
| create_compound_clipB | Group spine clips into a compound clip |
| flatten_compound_clipB | Flatten a compound clip back into individual clips in the spine |
| list_templatesA | List available timeline templates with slot definitions |
| apply_templateB | Fill a timeline template with clips and generate FCPXML |
| relink_mediaA | Bulk-rewrite media source paths (asset/media-rep src URLs) to relink moved or renamed media folders without opening FCP. Prefix-based: find='/Volumes/OldDrive/Media' replace='/Volumes/NewDrive/Media'. Use dry_run to preview. |
| push_to_fcpA | LIVE: send an FCPXML file into the running Final Cut Pro with zero clicks (official Open Document Apple event). Creates/targets a library via import-options. Launches FCP if needed. macOS-only; first use triggers an Automation permission prompt. For true zero-click, pass a library_location ending in .fcpbundle (a new path is auto-created); omitting it makes FCP show a modal library picker. |
| list_fcp_librariesA | LIVE: enumerate the running Final Cut Pro's open libraries, events, and projects via Apple's read-only scripting dictionary. Refuses to launch FCP unless allow_launch is true. macOS-only. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| qc-check | Run a full quality control check on your timeline — flash frames, gaps, duplicates, and health score |
| youtube-chapters | Extract chapter markers formatted for YouTube descriptions |
| rough-cut | Guided rough cut generation — choose keywords, pacing, and duration |
| timeline-summary | Quick overview of a timeline — stats, pacing, and potential issues |
| cleanup | Find and fix common timeline issues — flash frames, gaps, and duplicates |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DareDev256/fcp-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server