fcp-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FCP_MCP_OUTPUT_DIR | No | Override output directory for modified FCPXMLs. If not set, files are written next to input with '_modified' suffix. |
Capabilities
Features and capabilities supported by this server
| 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 |
|---|---|
| fcpxml_parseB | Parse an FCPXML file and return a structure summary. Args: path: Path to .fcpxml file (absolute or relative to FCP_PROJECTS_DIR) |
| fcpxml_list_clipsA | List all clips in the timeline with timecodes, durations, and roles. Args: path: Path to .fcpxml file project_name: Optional project name filter (uses first project if empty) |
| fcpxml_list_markersC | List all markers, chapter markers, and keywords across all clips. Args: path: Path to .fcpxml file |
| fcpxml_analyze_pacingA | Analyze shot pacing — average/median shot length, distribution histogram. Args: path: Path to .fcpxml file |
| fcpxml_detect_gapsB | Find all gaps in the timeline. Args: path: Path to .fcpxml file |
| fcpxml_detect_flash_framesA | Find clips shorter than max_frames (potential flash frames / accidental edits). Args: path: Path to .fcpxml file max_frames: Maximum frame count to flag (default 2) |
| fcpxml_detect_duplicatesC | Find clips that use the same source media. Args: path: Path to .fcpxml file |
| fcpxml_validateC | Validate FCPXML structure and report errors/warnings. Args: path: Path to .fcpxml file |
| fcpxml_list_effectsB | List all effects and transitions applied to clips. Args: path: Path to .fcpxml file |
| fcpxml_list_rolesB | List all roles and subroles used in the timeline. Args: path: Path to .fcpxml file |
| fcpxml_timeline_statsB | Get comprehensive timeline statistics — duration, clip count, resolution, pacing, etc. Args: path: Path to .fcpxml file |
| fcpxml_diffB | Compare two FCPXML files and show differences. Args: path_a: Path to first .fcpxml file path_b: Path to second .fcpxml file |
| fcpxml_add_markerA | Add a marker to a clip. Args: path: Path to .fcpxml file clip_name: Name of the clip to add the marker to start: Marker position in FCPXML time (e.g., "60060/30000s") value: Marker title/value note: Optional marker note marker_type: "standard" or "chapter" output_path: Output file path (default: adds _modified suffix) |
| fcpxml_batch_add_markersA | Add multiple markers at once. Args: path: Path to .fcpxml file markers_json: JSON array of markers, each: {"clip_name": str, "start": str, "value": str, "note"?: str, "type"?: str} output_path: Output file path (default: adds _modified suffix) |
| fcpxml_add_keywordC | Add a keyword to a clip. Args: path: Path to .fcpxml file clip_name: Name of the clip value: Keyword text start: Start time in FCPXML format duration: Duration of keyword range (optional) output_path: Output file path |
| fcpxml_trim_clipC | Trim a clip's source in/out points. Args: path: Path to .fcpxml file clip_name: Name of the clip to trim new_start: New source start time (optional) new_duration: New duration (optional) output_path: Output file path |
| fcpxml_split_clipA | Split a clip at a given offset within the clip. Args: path: Path to .fcpxml file clip_name: Name of the clip to split split_at: Offset within the clip to split at (FCPXML time) output_path: Output file path |
| fcpxml_delete_clipsB | Remove clips from the timeline by name. Args: path: Path to .fcpxml file clip_names_json: JSON array of clip names to delete output_path: Output file path |
| fcpxml_reorder_clipsB | Reorder clips in the primary spine to match the given name order. Args: path: Path to .fcpxml file clip_names_json: JSON array of clip names in desired order output_path: Output file path |
| fcpxml_add_transitionB | Insert a transition after a clip. Args: path: Path to .fcpxml file after_clip_name: Name of the clip to add transition after duration: Transition duration (default: 1 second at 29.97) name: Transition name output_path: Output file path |
| fcpxml_change_speedB | Change clip playback speed. Args: path: Path to .fcpxml file clip_name: Name of the clip speed_factor: Speed multiplier (2.0 = 2x fast, 0.5 = half speed) output_path: Output file path |
| fcpxml_assign_roleC | Set the role on a clip (e.g., "Dialogue", "Video", "Music", "Effects"). Args: path: Path to .fcpxml file clip_name: Name of the clip role: Role name output_path: Output file path |
| fcpxml_add_titleB | Add a title clip to the timeline. Args: path: Path to .fcpxml file text: Title text duration: Title duration in FCPXML time position: "start", "end", or clip name to insert after output_path: Output file path |
| fcpxml_add_audioA | Add an audio clip to the timeline. Args: path: Path to .fcpxml file audio_src: Path to audio file name: Clip name (defaults to filename) duration: Duration in FCPXML time (defaults to asset duration) position: "start", "end", or clip name to insert after output_path: Output file path |
| fcpxml_create_projectB | Create a new empty FCPXML project file. Args: name: Project name format_name: Video format (e.g., FFVideoFormat1080p2997, FFVideoFormat4Kp24) width: Frame width height: Frame height frame_duration: Frame duration in FCPXML time event_name: Event name output_path: Where to save (default: ~/Movies/.fcpxml) |
| fcpxml_create_timelineA | Build a timeline from a list of clip definitions. Args: clips_json: JSON array of clips, each: {"src": "/path/to/file.mov", "name"?: str, "duration": "FCPXML_time", "start"?: str, "role"?: str} project_name: Project name format_name: Video format name event_name: Event name output_path: Where to save |
| fcpxml_auto_rough_cutA | Auto-assemble clips into a rough cut timeline. Args: clips_json: JSON array of clips: [{"src": str, "name"?: str, "duration": str}, ...] target_duration: Target total duration (optional — uses all clips if empty) max_clip_duration: Maximum clip duration (trims longer clips) transition_duration: If set, adds transitions between clips project_name: Project name output_path: Where to save |
| fcpxml_generate_montageB | Generate a montage/highlight reel with uniform clip durations and transitions. Args: clips_json: JSON array of clips: [{"src": str, "name"?: str, "duration": str}, ...] clip_duration: Duration for each clip in the montage transition_duration: Transition duration between clips project_name: Project name output_path: Where to save |
| fcpxml_import_srtB | Convert SRT subtitles to title clips and add to timeline. Args: path: Path to .fcpxml file to add subtitles to srt_path: Path to .srt subtitle file output_path: Output file path |
| fcpxml_import_edlB | Convert an EDL (Edit Decision List) to FCPXML. Args: edl_path: Path to .edl file media_dir: Directory containing media files (for resolving reel names) project_name: Project name output_path: Where to save |
| fcpxml_reformatB | Reformat a timeline for a different aspect ratio (e.g., 16:9 → 9:16 for vertical). Args: path: Path to .fcpxml file target_width: Target width target_height: Target height target_format_name: Target format name output_path: Output file path |
| fcpxml_fix_flash_framesA | Auto-fix flash frames by extending very short clips to minimum duration. Args: path: Path to .fcpxml file min_frames: Minimum frame count (clips shorter than this get extended) frame_duration: Frame duration for calculating frame count output_path: Output file path |
| fcpxml_fill_gapsB | Replace all gaps in the timeline with clips from a specified asset. Args: path: Path to .fcpxml file fill_asset_ref: Asset resource ID to use as fill (e.g., "r3") fill_name: Name for the fill clips output_path: Output file path |
| fcpxml_remove_silenceC | Remove gaps longer than the threshold from the timeline. Args: path: Path to .fcpxml file silence_threshold_seconds: Minimum gap duration to remove (seconds) output_path: Output file path |
| fcpxml_batch_rename_clipsB | Rename clips matching a pattern (substring replacement). Args: path: Path to .fcpxml file pattern: Text to find in clip names replacement: Text to replace with output_path: Output file path |
| fcpxml_batch_assign_rolesC | Assign roles to clips based on name matching rules. Args: path: Path to .fcpxml file rules_json: JSON array of rules: [{"match": "interview", "role": "Dialogue"}, ...] output_path: Output file path |
| fcpxml_batch_apply_transitionB | Add transitions between all adjacent clips in the timeline. Args: path: Path to .fcpxml file duration: Transition duration name: Transition name output_path: Output file path |
| fcpxml_qc_reportA | Generate a comprehensive quality check report for the timeline. Checks: validation, gaps, flash frames, duplicates, pacing. Args: path: Path to .fcpxml file |
| fcpxml_check_media_linksB | Verify all referenced media files exist on disk. Args: path: Path to .fcpxml file |
| fcpxml_check_frame_ratesC | Detect mixed frame rate issues in the timeline. Args: path: Path to .fcpxml file |
| fcpxml_check_audio_levelsB | Flag clips with potential audio issues (volume adjustments, missing audio). Args: path: Path to .fcpxml file |
| fcpxml_check_safe_zonesA | Check for clips with transforms that might push content outside safe zones. Args: path: Path to .fcpxml file |
| fcpxml_check_durationB | Verify the timeline fits a target duration. Args: path: Path to .fcpxml file target_seconds: Target duration in seconds |
| fcp_list_motion_templatesA | List installed Motion templates (titles, transitions, generators, effects). |
| fcp_list_share_destinationsB | List configured FCP share destinations. |
| fcp_discover_effectsA | List available FCP effects and transitions by scanning known locations. |
| fcpxml_list_templatesA | List available FCPXML template files. Args: templates_dir: Directory to search (default: FCP_PROJECTS_DIR) |
| fcpxml_apply_templateA | Apply an FCPXML template to a set of clips. Replaces placeholder clips in the template with provided clips. Args: template_path: Path to template .fcpxml file clips_json: JSON array of clips to insert project_name: New project name output_path: Where to save |
| fcpxml_save_templateA | Save the current FCPXML structure as a reusable template. Args: path: Path to .fcpxml file to use as template template_name: Name for the template output_dir: Directory to save template (default: FCP_PROJECTS_DIR) |
| fcp_is_runningA | Check if Final Cut Pro is currently running. |
| fcp_get_librariesA | Get all open libraries in Final Cut Pro (requires FCP to be running). |
| fcp_get_eventsA | Get events in a library (or all libraries if name not specified). Args: library_name: Library name to filter (optional) |
| fcp_get_projectsA | Get projects in an event (or all events if name not specified). Args: event_name: Event name to filter (optional) |
| fcp_get_timeline_infoA | Get info about the current/first timeline in FCP. |
| fcp_get_app_stateA | Get FCP application state — version, frontmost status. |
| fcp_open_libraryC | Open a FCP library file. Args: library_path: Path to .fcpbundle file |
| fcp_import_xmlB | Import an FCPXML file into Final Cut Pro. Args: fcpxml_path: Path to .fcpxml file |
| fcp_export_xmlB | Trigger XML export in FCP via menu automation (requires Accessibility permissions). |
| fcp_playbackB | Control FCP playback. Args: action: "play", "pause", "stop", or "toggle" (space bar) |
| fcp_navigateA | Navigate to a specific timecode in FCP. Args: timecode: Timecode to navigate to (e.g., "00:01:30:00"). Opens timecode entry if provided. |
| fcp_select_toolB | Switch FCP editing tool. Args: tool: "select" (A), "trim" (T), "position" (P), "range" (R), "blade" (B), "zoom" (Z), "hand" (H) |
| fcp_undoA | Undo the last action in FCP. |
| fcp_redoA | Redo the last undone action in FCP. |
| fcp_menu_commandA | Execute any FCP menu command by path. Args: menu_path: Menu path like "File > Export XML..." or "Edit > Select All" |
| fcp_keyboard_shortcutA | Send a keyboard shortcut to FCP. Args: keys: Shortcut description like "cmd+c", "cmd+shift+e", "option+w" |
| fcp_shareC | Trigger a share/export from FCP. Args: destination: Share destination name (opens default if empty) |
| compressor_encodeB | Encode a file using Compressor CLI. Args: input_path: Path to input media file setting_path: Path to Compressor preset (.cmprstng) output_dir: Output directory batch_name: Batch name for Compressor |
| compressor_list_settingsA | List available Compressor encoding presets. |
| fcpxml_export_resolveA | Convert FCPXML to DaVinci Resolve-compatible format (FCPXML v1.9). Args: path: Path to .fcpxml file output_path: Output file path |
| fcpxml_export_fcp7A | Convert FCPXML to FCP7 XML format (compatible with Premiere Pro and Avid). Args: path: Path to .fcpxml file output_path: Output file path |
| fcpxml_export_edlB | Export timeline as EDL (Edit Decision List). Args: path: Path to .fcpxml file output_path: Output .edl file path |
| media_infoA | Get detailed media file info (codec, resolution, duration, bitrate, etc.). Args: path: Path to media file |
| media_detect_silenceB | Detect silent sections in audio/video files. Args: path: Path to media file noise_threshold: Noise floor threshold (e.g., "-30dB", "-40dB") min_duration: Minimum silence duration in seconds |
| media_detect_beatsB | Detect beat positions in audio/music files. Returns beat timestamps that can be used for music-synced editing. Args: path: Path to audio/video file |
| media_loudnessA | Analyze audio loudness (EBU R128 / LUFS). Returns integrated loudness, loudness range, and true peak. Args: path: Path to audio/video file |
| media_extract_thumbnailB | Extract a frame thumbnail from video at a specific time. Args: path: Path to video file time: Time in seconds to extract frame from output_path: Where to save thumbnail (default: auto-generated) width: Thumbnail width in pixels |
| media_extract_thumbnailsB | Extract thumbnails at regular intervals (contact sheet / storyboard). Args: path: Path to video file interval: Seconds between thumbnails output_dir: Directory to save thumbnails width: Thumbnail width in pixels |
| media_list_streamsB | List all audio, video, and subtitle streams in a media file. Args: path: Path to media file |
| media_scene_detectA | Detect scene changes in video. Useful for automatic clip segmentation. Args: path: Path to video file threshold: Scene change sensitivity (0.0-1.0, lower = more sensitive) |
| media_extract_audioA | Extract audio track from a video file. Useful for feeding video audio into transcription, analysis, or the sheet-music-maker pipeline (basic-pitch → MIDI → notation). Args: path: Path to video file output_path: Where to save audio (default: same dir, .wav extension) format: Audio format: wav, mp3, flac (default: wav) |
| media_audio_to_midiA | Transcribe audio to MIDI using basic-pitch (ML audio transcription). Converts audio (from video or standalone) into MIDI note data. Returns the MIDI file path and a summary of detected notes. Requires basic-pitch: pip install basic-pitch Args: path: Path to audio file (wav, mp3, flac) or video file output_path: Where to save MIDI (default: same dir, .mid extension) |
| puppet_create_rigA | Define a puppet character rig from body parts. Each part is a separate image (PNG) that gets positioned and layered to form a character. Parts can be animated independently. Args: rig_json: JSON object defining the character: { "name": "my_character", "position": [0, 0], "parts": [ { "name": "head", "image": "/absolute/path/to/head.png", "position": [0, 200], "scale": 1.0, "rotation": 0, "anchor": [0, -50], "z_order": 5 }, ... ] } - position: [x, y] offset from character center (y-positive = up) - anchor: pivot point for rotation - z_order: higher = in front Returns: JSON summary of the rig (use this to verify before building a scene). |
| puppet_create_humanoid_rigA | Create a standard 6-part humanoid rig from a folder of images. Expects PNG files named: head.png, body.png, left_arm.png, right_arm.png, left_leg.png, right_leg.png in the image directory. Parts are auto-positioned for a standard humanoid layout on a 1080p frame. Args: name: Character name image_dir: Absolute path to folder containing part images position_x: X position on screen (0 = center) position_y: Y position on screen (0 = center) scale: Overall scale multiplier |
| puppet_build_sceneA | Build an FCPXML timeline from one or more puppet rigs. Each rig's parts become layered connected clips with transforms applied. Import the resulting .fcpxml into FCP to see the assembled characters. Args: rigs_json: JSON array of rig definitions (same format as puppet_create_rig). Each rig: {"name": str, "position": [x, y], "parts": [...]} duration: Scene duration in FCPXML time (default 10 seconds at 29.97fps) project_name: Project name output_path: Where to save (default: ~/Movies/<project_name>.fcpxml) |
| puppet_animateA | Build a puppet scene with custom keyframe animations. Args: rigs_json: JSON array of rig definitions animations_json: JSON array of animations: [ { "part": "head", "property": "position", "keyframes": [ {"time": "0s", "value": [0, 200], "interp": "smooth2"}, {"time": "150150/30000s", "value": [20, 210], "interp": "smooth2"}, {"time": "300300/30000s", "value": [0, 200], "interp": "smooth2"} ] }, { "part": "left_arm", "property": "rotation", "keyframes": [ {"time": "0s", "value": 0}, {"time": "150150/30000s", "value": 45}, {"time": "300300/30000s", "value": 0} ] } ] property: "position" (value=[x,y]), "rotation" (value=degrees), "scale" (value=[sx,sy]) interp: "smooth2" (default, ease), "linear", "hold" duration: Scene duration project_name: Project name output_path: Where to save |
| puppet_preset_motionA | Build a puppet scene with a preset motion applied. Available presets:
Args: rig_json: JSON rig definition preset: Motion preset name duration: Scene duration project_name: Project name output_path: Where to save cycles: Number of motion cycles (more = faster movement) intensity: Scale factor for motion amplitude (0.5 = subtle, 2.0 = exaggerated) |
| puppet_multi_sceneA | Build a multi-scene puppet animation with different presets per scene. Generates one FCPXML per scene. Useful for storyboarding a sequence. Args: rigs_json: JSON array of rig definitions (shared across scenes) scenes_json: JSON array of scene definitions: [ {"name": "intro", "duration": "300300/30000s", "preset": "idle"}, {"name": "greeting", "duration": "150150/30000s", "preset": "wave"}, {"name": "walking", "duration": "600600/30000s", "preset": "walk", "cycles": 4} ] project_name: Base project name (scenes get suffixed) output_path: Output directory (default: ~/Movies/) |
| puppet_list_presetsA | List all available puppet animation presets with descriptions. Returns details on each preset, what body parts it uses, and what parameters it accepts. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| qc-check | Run a full QC sweep on an FCPXML timeline and interpret the results. |
| rough-cut | Assemble a rough cut from a list of clips, optionally target a duration. |
| cleanup | Heal flash frames and gaps in an existing FCPXML, then re-QC. |
| youtube-chapters | Extract FCPXML markers and emit a YouTube chapter timestamp blob. |
| beat-sync | Detect beats in an audio file and cut clips to land on them. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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/dreliq9/fcp-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server