Edit Twin MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HF_HOME | No | Where the speech model is stored. | ~/.cache/huggingface |
| EDIT_TWIN_DIR | No | Working folder used by Edit Twin. | ~/Movies/Edit Twin |
| EDIT_TWIN_DTD_DIR | No | Folder with Apple's FCPXMLv1_*.dtd files, if Final Cut Pro isn't in /Applications. | inside Final Cut Pro |
| EDIT_TWIN_WHISPER_MODEL | No | A different Whisper model (e.g. a smaller one for older Macs). | mlx-community/whisper-large-v3-turbo on Apple Silicon, large-v3-turbo for faster-whisper on Intel |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| fcp_statusA | Is Final Cut Pro installed/running, its version, and whether it is frontmost. |
| fcp_launchA | Open Final Cut Pro (or bring it to the front). |
| fcp_library_overviewB | List open libraries, their events and projects (read from Final Cut Pro). |
| fcp_export_projectB | Export the project currently open in Final Cut Pro's timeline as FCPXML (drives File > Export XML…), then open it for editing. The user should have the project open in the timeline first. |
| fcp_import_xmlC | Import an .fcpxml / .fcpxmld into Final Cut Pro (File > Import > XML). |
| fcp_menuA | Click a Final Cut Pro menu item, e.g. ["Modify", "Balance Color"] or ["File", "Share", "Master File (default)…"]. With a single entry (["Modify"]) it lists that menu's items instead of clicking. |
| fcp_shortcutB | Press a Final Cut Pro shortcut in the app. Either a named |
| fcp_go_toB | Move Final Cut Pro's playhead to a time (seconds or timecode) in the open project. |
| fcp_screenshotB | Screenshot of the screen, to see what Final Cut Pro is showing. |
| find_fcpxml_filesB | Find recent FCPXML exports (.fcpxml/.fcpxmld) in the working folder, Movies, Desktop, Downloads and Documents (or a given folder). |
| open_timelineA | Load an exported FCPXML file or .fcpxmld bundle for editing. If the file holds several projects, pick one by name. Returns a summary and the clip list. |
| get_timelineA | Clips in the primary storyline with refs, times, source media, effects, volume and their connected items (B-roll, titles, audio). Optionally only those overlapping start..end seconds. |
| list_markersB | All markers (standard, to-do, chapter) with their times. |
| probe_mediaC | Media file info: duration, resolution, frame rate, audio, timecode. |
| cut_rangesA | Ripple-delete time ranges from the primary storyline, e.g. [[12.5, 15], [40, 41.2]]. Later clips slide left. connected="keep" re-attaches B-roll/titles anchored inside a removed range at the cut point; "delete" removes them like FCP does. |
| keep_rangesB | Keep only these time ranges (in order) and remove everything else — handy for building a short/teaser from a longer edit. |
| split_clipC | Blade the primary storyline at a time (seconds or timecode). |
| delete_clipA | Delete a clip by ref ("3" or connected "3.0"). ripple=True closes the gap; ripple=False leaves a gap so timing is unchanged. |
| trim_clipA | Shorten a clip: remove |
| move_clipC | Reorder the primary storyline: move clip at |
| add_markerC | Add a marker. kind="chapter" makes YouTube-style chapter markers; "todo" a to-do. |
| remove_markersC | Remove markers, optionally only those whose name contains text or of one kind. |
| add_titleC | Connect a Basic Title above the storyline. color is hex (#ff6fb5) or a name. y_offset moves it vertically in pixels from centre (e.g. -380 for a lower third). |
| edit_titleB | Change an existing title's text, colour or size (ref like "2.0"). |
| set_volumeC | Set a clip's volume in dB (0 = unchanged, -6 = quieter, -20 = background music). |
| enable_clipB | Enable or disable (mute/hide) a clip without deleting it. |
| copy_effectsB | Copy video/audio effects from one clip to others, e.g. a colour grade or LUT. to_refs=["all"] applies to every clip in the storyline. name_contains limits which effects are copied. Only effects already used in this project can be copied. |
| remove_effectsB | Remove effects from a clip (all, or those whose name contains text). |
| insert_mediaA | Add a media file to the timeline. mode="connect" puts it above (video, lane 1) or below
(audio, lane -1) the storyline at |
| find_silencesA | Dry run for remove_silences: list pauses in the storyline clips' audio. Nothing is changed. Settings default to the user's saved style (get_style), which is calibrated from their own hand trims; pass values only to override. threshold_db: how quiet counts as a pause (-30 catches breaths, -40 only near-silence); min_silence: shortest pause to cut; keep_after_speech / keep_before_speech: air left after a word / before the next. |
| remove_silencesA | Jump-cut edit: ripple-delete pauses from the storyline clips, using the user's saved style unless overridden (see find_silences). Connected B-roll, titles, music and the adjustment clip are kept. Run find_silences first to show the user what will go. |
| transcribeA | Transcribe what's said in the storyline (local Whisper, word timestamps), with times on the CURRENT timeline (they update after cuts). Use it to find repeated takes, flubs and filler. include_words=True adds per-word times for precise cuts — best with start/end to limit the window. vocabulary: names/jargon to help spelling (e.g. product names, places, people). First run per file takes a while and may download the model; later calls are instant. |
| find_repeatsA | Find stutters ("to new to new tech"), retakes (a phrase or sentence started again) and filler sounds (um/uh) in the transcript. Each result proposes removing the FIRST take and keeping the later one; times are on the current timeline, ready for cut_ranges. Nothing is changed. Review them: when the first take is clearly better, keep it instead. |
| normalize_audioA | Set dialogue gain so the loudest peak of the edit sits at target_peak_db (default −2 dB). One shared gain by default so takes stay balanced; per_clip=True levels each clip separately. Measures only the parts used in the edit. Music/connected audio is left alone unless listed in refs. |
| fit_to_timelineA | Stretch/shrink a connected item — e.g. the Adjustment Clip carrying a look like your colour preset, or a watermark title — so it starts at 0 and covers the whole edit. Identify it by ref ("0.1") or by part of its name or effect name. Run after cuts. |
| get_styleA | The user's saved editing style: pause-cut tightness, audio chain, default look, saved looks and notes learned from their edits. Read this before a rough cut. |
| update_styleB | Change saved style defaults, e.g. when the user says cuts feel too tight (raise keep_after_speech) or too loose (lower min_silence). add_note stores a preference in words (e.g. "keep 'So' at the start of the hook"). |
| save_lookA | Save the effects on an adjustment clip in the open timeline (e.g. the one you made with your colour preset) as a reusable look, so future rough cuts can add it automatically with apply_look — no more Option-A by hand. ref defaults to the only adjustment clip. |
| apply_lookA | Add an adjustment clip with a saved look (default: the style's default look) over the whole timeline. Replaces an existing empty/same-named adjustment clip. Run after cutting (or run fit_to_timeline after later cuts). |
| save_audio_styleB | Save a clip's audio chain (volume, Loudness / Noise Removal / EQ enhancements, audio effects) as the user's default dialogue sound, from a clip they set up by hand. |
| apply_audio_styleA | Apply the saved dialogue sound (see save_audio_style) to every dialogue clip in the storyline, or to the given refs. Use instead of normalize_audio when a style is saved. |
| measure_loudnessA | Measure the edit's dialogue loudness (integrated LUFS, true peak) from the storyline clips with their clip volume applied. Final Cut's Loudness enhancement isn't simulated, so treat it as the level BEFORE that effect. Reels usually sit around -14 LUFS. |
| learn_from_editA | Compare Claude's rough cut with the user's hand-finished version and learn their style. your_version: their exported .fcpxml/.fcpxmld (default: export the project open in Final Cut now). claude_version: what Claude sent (default: the last one sent for that project). Reports what they removed or restored (with the words), how tight they trim pauses, their audio chain and adjustment-clip look, and pause settings calibrated to match them. save=True stores the pause settings, audio chain and look (named look_name, e.g. the preset they used, e.g. "warm_vlog") as their defaults. |
| undoB | Undo the last timeline edit. |
| redoA | Redo the last undone timeline edit. |
| validate_timelineA | Check the edited timeline: references, gaps/overlaps, frame alignment, and Apple's FCPXML DTD (when Final Cut Pro is installed). |
| preview_frameA | Image of the storyline's main clip at a time (ignores titles/effects/B-roll), for checking what's on screen at a cut. |
| render_previewA | Render a quick low-res MP4 of the primary storyline (straight cuts, no effects, titles or connected clips) so the user can review an edit before importing. Optional start/end seconds render only part of it. |
| save_timelineA | Save the edited timeline to a new .fcpxml (or .fcpxmld) without importing it. The project is renamed (default: " (Claude edit)") so it won't clash. |
| send_to_final_cutB | Save the edited timeline as a new project and import it into Final Cut Pro. The original project is untouched; the new one appears in the same event. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 50 tools
Most tools target clearly distinct resources or workflow stages: app control, FCPXML import/export, timeline surgery, audio, transcription, and style learning are well separated. The main ambiguity comes from broad escape hatches like fcp_menu and fcp_shortcut overlapping dedicated tools such as undo/redo, split_clip, trim_clip, and add_default_transition, though descriptions mostly clarify when to use which.
Nearly all names are snake_case and follow a predictable verb_noun pattern (open_timeline, cut_ranges, trim_clip, save_look), with fcp_ used consistently for direct Final Cut Pro app control. Minor deviations exist in noun-only fcp_ names (fcp_status, fcp_menu, fcp_shortcut) and plain undo/redo, but nothing confusing.
Fifty tools is heavy for a single MCP surface, even for a rich Final Cut Pro editing assistant. The tools are generally meaningful within subdomains, but the sheer count raises selection and context burden well beyond a practical focused toolset.
The server covers a full rough-cut editing lifecycle: inspecting FCP, importing/exporting FCPXML, analyzing timelines, cutting/trimming/moving clips, markers, titles, effects, audio, transcription, repeat detection, validation, preview, rendering, and sending back to Final Cut. Gaps are minor and mostly higher-end NLE features such as direct project/event creation, multicam, or fine-grained effect application, which can often be reached via fcp_menu or fcp_shortcut.