Skip to main content
Glama

fcpkit-mcp

Exact, safety-first tools for Final Cut Pro timelines (FCPXML) on macOS.

fcpkit reads .fcpxml files and .fcpxmld bundles with exact rational time, resolves what every clip really shows and plays — through multicam angles, compound clips, sync clips and retimes — and uses that to check the things FCP gets wrong silently: transitions that run past the media, dissolves over jump cuts, effects and templates that will go missing on import, media that will not relink. A guarded importer puts an XML into the library you name, and nowhere else.

  • Python 3.9+, standard library only. ffmpeg is needed only for pictures and loudness.

  • Never overwrites a source. Every write goes to a new file, is validated against the FCP DTD that ships inside your Final Cut Pro, and is refused if the source changed since it was read.

  • Unknown is REVIEW, never PASS. A mapping fcpkit cannot resolve exactly is reported as such; exit code 2 means "could not verify".

Status: alpha (0.1.0). Developed against Final Cut Pro 12.3 and 12.4 on macOS, FCPXML 1.11–1.14.

Install

pip install .            # from a checkout (installs the fcpkit-* commands and fcpkit-mcp)

Every tool is also runnable as a module: python3 -m fcpkit.handles X.fcpxmld.

Related MCP server: final-cut-pro-mcp

Tools

Exit codes for the checkers: 0 pass, 1 defect found, 2 could not verify (REVIEW).

Read first: the brief

fcpkit-brief X.fcpxmld [--from 60 --to 120] [--detail 1|2|3] [--lang en|ko] [--out brief.md] [--json rows.json]

Raw FCPXML is machine detail — ids, rational times, text-style definitions, effect blobs, bookmarks. Reading it costs a model (or a person) a lot of time and things get missed. The brief "decompiles" it into the edit:

  • a symbol table: every source / multicam / compound becomes M1, M2 …, every template or effect T1, T2 …, so long names appear once;

  • one line per main-storyline cut — ▌00:07.01 M1 @05:36.90 [angle] vol -15dB (1.94s) — and under it everything that starts during that cut: captions and titles with their text, overlays, sounds, music, transitions, markers, with lane, time, length and key values (volume, scale/position, effects, speed, keyframes);

  • values shared by most cuts are stated once in the header, not repeated;

  • a compound clip on the main storyline is opened: its inner cuts appear as normal lines in timeline time (nested compounds too); compounds used as overlays stay one line with the number of items inside, and the coverage line reports that number separately;

  • a lane table, per-minute density, and a coverage line: timed items shown 1413/1413 (all) — anything not shown is named.

On two real 15-minute multicam/longform timelines: 1.52 MB → 69 KB and 1.16 MB → 61 KB, every timed item shown. --json keeps exact rational times and the XML path of each row, so you can go from a brief line back to the element. Over MCP this is fcpkit_brief — have the agent call it before reading any XML.

Edit through the brief. fcpkit-brief X --ids --out X.brief.md numbers every element line (#n) and records the XML's sha256. Edit the brief — move a caption, change its length, lane or text, change vol -12dB, delete a line — and run fcpkit-brief-apply X X.brief.md --out X_fixed.fcpxmld (MCP: fcpkit_brief_apply). Only changed lines are applied, to the exact element each #n stands for: times snap to frames; an item moved past its host clip is re-anchored to the main-storyline clip at the new time, in the position the FCP DTD requires; a text change touches only the styled run that holds it. Main-storyline cuts accept only volume (anything else would ripple). New lines, other value changes, keyframed volumes and text edits that span differently styled runs are refused, and then nothing is written. After applying, every element is compared before/after — only the edited ones may differ, each to the requested value — and the result is DTD-validated and written as a new file. A range brief (--from/--to) can be applied too. Same-lane overlaps caused by an edit are reported as warnings. Live check on Final Cut Pro 12.3: six edits to a 15-minute timeline (text, nudge, re-anchor, volume, delete) imported without warnings, and FCP's own export matched the applied XML item for item.

Checks (read only)

Command

What it does

fcpkit-handles X.fcpxmld [--measure] [--strips DIR]

For every transition (main storyline and connected storylines) measures where it really sits — FCP exports off-centre transitions — and whether each side has the media it needs, resolving multicam angles, compounds and linear retimes. Classifies the cut as jump (same source, time jumps), continuous, different source, or fade. A dissolve over a jump cut shows the material the cut removed → FAIL. --measure reports how loud the removed audio under it is (ffmpeg volumedetect); --strips writes filmstrips of both handles. Reports the longest centred transition that would fit.

fcpkit-filmstrip program X --at 61.7 --out-dir out/

A row of frames + waveform (red ticks = cuts) of the main storyline around a timeline time, each frame resolved through angles/compounds. --cuts makes one per cut. fcpkit-filmstrip source FILE t0 t1 --out p.png does the same for a raw source range. A JSON sidecar records every time and file.

fcpkit-effects X.fcpxmld

Checks every <effect> resource: user Motion templates (src and the ~/Movies file, and whether they are the same file), templates embedded in a library, FCP built-in templates (looked up inside FCP's own MotionEffect.fxp), and FxPlug:<UUID> effects against FCP's internal plug-in list and installed third-party plug-ins. A template uid without src, or a bare UUID without the FxPlug: prefix, is MISSING (FCP drops those silently).

fcpkit-relink-preview X [--from P --to Q]

Where each asset's media lives, whether it exists now (NFC/NFD-aware: Korean, Japanese and accented names come in both forms), whether it carries a bookmark, grouped by volume; with --from/--to, what a whole-path-segment prefix remap would find. Never edits the XML — relinking is done in FCP (File › Relink Files).

fcpkit-diff A.fcpxmld B.fcpxmld [--kind caption]

What changed between two timelines, e.g. your generated build and the editor's FCP export. Matching runs in stages from most to least certain (identical → same text → same source in-point → same placement → most-overlapping source range) and only pairs keys that are unique on both sides. Reports frame deltas of start/end/source, lane and text changes, added/removed items, grouped by kind.

fcpkit-timeline X [--resolve 61]

The shared base: every timed element with absolute start/end and lane; --resolve shows which file and file time the main storyline shows and plays at a timeline second.

Edits (always to a new file)

Command

What it does

fcpkit-snap X --select REGEX [--out NEW]

Moves caption / zoom starts back onto a main-storyline cut when the cut is at most --before (0.5 s) earlier and speech does not continue across it. Every selected item lands in one bucket: moved, on_cut, no_cut, or skipped with a reason (another caption spans the cut, same-lane overlap, anchor would leave its host, not enough media). Without --out it only reports. --select matches "<template name> | <clip name>", e.g. --select '^Lower Third' or, for a Korean template, --select '^하단 자막'.

Final Cut Pro (live) and safety rails

Command

What it does

fcpkit-libraries running | list | diff

Which FCP copy is running — identified by executable path, because several copies (stock, an older version, a SpliceKit-patched copy) share the bundle id com.apple.FinalCutApp — and, through FCP's official AppleScript dictionary, the libraries, events and projects it has open. Read only; never launches FCP; refuses when two copies run.

fcpkit-import X.fcpxmld --library L.fcpbundle --dry-run

Imports into the library you name, guarded. It writes an import copy whose first child is <import-options> (library location, copy assets 0, suppress warnings 0), then — only after every check passes — opens it with the running FCP, polls until the projects appear in a new event, records any FCP dialog (via an optional SpliceKit bridge; it never clicks), and writes a JSON receipt. --dry-run runs the offline checks, writes the copy and prints the live steps.

fcpkit-plan make | check

Binds an approval to one exact job: plan id = sha256 of (action, XML content hash, library, event, app, validity window). A rebuilt XML, another library or an expired window → refused.

fcpkit-ledger list | verify | undo | record

Append-only write ledger (JSONL) with input/output sha256 (bundles hashed whole). Undo never deletes: it moves outputs into undone/ and refuses if a file changed since.

fcpkit-watch-export --dir D [--against BUILD]

Waits for a fresh FCP "Export XML" by content hash (stable across two polls, newest wins) and optionally diffs it against your build.

fcpkit-mcp

MCP server (see below).

Import checks, all before any Apple event: lock file free; plan id matches; every /Volumes/<name> holding media is mounted; exactly one FCP running and it is the planned app; target library is open in FCP (path match is case-, slash- and NFC/NFD-insensitive); no open library modified in the last 10 minutes (someone may be editing); no event of the same name in the target library; no FCP dialog already open; the copy does not exist yet.

Behaviour verified live on Final Cut Pro 12.3

Observed with a scratch library while building the importer (not inferred):

Situation

What FCP did

<import-options> library location names a library that is open (not the first one)

Imported exactly there; projects visible in the listing within ~10 s.

Library location does not exist

FCP silently created a new library at that path and imported into it — hence the "must be open" check (--create-library allows it on purpose).

The XML also contains <library location="…"> pointing elsewhere

import-options wins; the other library was untouched.

A 30-frame transition whose clips have only 6 frames of handle

Imported without any warning, shortened to 6 frames — the maximum fcpkit-handles had predicted. Warning dialogs cannot catch this; check handles before importing.

AppleScript persistent ID of libraries/events/projects

Cannot be coerced to text (error −1700). fcpkit reads every field in its own try and identifies objects by id (a UUID).

Two FCP copies installed (12.3 and 12.4)

Same bundle id; tell application "Final Cut Pro" is ambiguous. Addressing the running copy by its full .app path reached the right one (checked by the responding version).

Known from earlier use or other sources, and guarded against, but not re-tested here: without <import-options> a flat .fcpxml imports nothing silently and a .fcpxmld opens a blocking "which library?" picker; importing an event whose name/uid already exists in the library fails with "Invalid argument" (fcpkit refuses before sending anything).

Not yet verified: stock FCP 12.4 import behaviour, recording of real warning dialogs (missing media), XML files over 1 MB.

Configuration

Defaults suit a stock install; override with environment variables (most also have a CLI flag).

Variable

Default

Used by

FCPKIT_FCP_APP

/Applications/Final Cut Pro.app

the app fcpkit-import expects to be running (--app)

FCPKIT_FCP_APPS

— (:-separated)

extra FCP copies to recognise; a SpliceKit copy in ~/Applications/SpliceKit/ is detected automatically

FCPKIT_LOCK

~/Library/Application Support/fcpkit/FCP.lock

cooperative lock while a tool drives FCP (--lock)

FCPKIT_SPLICEKIT_PORT

9876

optional SpliceKit bridge, read only, for dialog recording

FCPKIT_FFMPEG

ffmpeg on PATH

filmstrips, loudness

FCPKIT_MOTION_TEMPLATES

~/Movies/Motion Templates.localized

fcpkit-effects (--templates-dir)

FCPKIT_CAPTION_PATTERN

(?i)caption|subtitle|자막

which title templates fcpkit-diff counts as captions (--caption-pattern); "자막" is Korean for caption

Safety model

  1. Sources are never overwritten. Writes go through fcpxml_io: the bytes outside the <fcpxml> root (declaration, DOCTYPE) are kept byte-for-byte, the re-serialised tree is re-parsed and compared, the result is validated with xmllint against the DTD inside your installed Final Cut Pro, the output must not exist (exclusive create), and the source is re-hashed just before publishing.

  2. Unknown is REVIEW, not PASS. Unsupported retimes (holds, reverse, eased multi-point ramps), unresolved references, missing registries — all surface as REVIEW with the reason.

  3. Live steps are opt-in and bounded. Nothing launches FCP implicitly. An import needs an approved plan id, takes a lock, refuses on any failed check, and leaves a receipt. Lock files are renamed, not deleted, when released.

  4. Undo moves, never deletes, and only files whose hash still matches.

  5. Hostile files are refused, not expanded. FCPXML never uses entities, so any <!ENTITY> or DOCTYPE internal subset is rejected before parsing (old expat builds, such as the one in macOS's /usr/bin/python3 3.9, have no entity-expansion limits). External entities are never fetched; xmllint runs with --nonet. No tool runs a shell: every subprocess gets an argument list, and the only value put into AppleScript (the FCP app path) is escaped.

MCP server (read only, except filmstrip pictures)

fcpkit-mcp speaks MCP over stdio (stdlib only) and exposes fcpkit_brief, fcpkit_brief_apply, fcpkit_handles, fcpkit_effects_check, fcpkit_timeline_diff, fcpkit_relink_preview, fcpkit_filmstrip (returns the PNGs as images) and fcpkit_libraries. It has no tool that writes XML or imports into FCP.

claude mcp add fcpkit -- fcpkit-mcp

How it compares with fcp-mcp-server

DareDev256/fcp-mcp-server is a broad MCP server for driving FCP (editing, assembly, transcription, automatic import). Several fcpkit tools started from ideas found while reading it (v0.27.2): <import-options> targeting, AppleScript library listing, handle checks, filmstrip + waveform, effect registry lookup, the write journal. fcpkit is narrower and differs in emphasis:

fcpkit

fcp-mcp-server (v0.27.2, code read, not run)

Scope

checks, a few guarded edits, guarded import

wide editing and automation surface

Multicam / sync clips

resolved to the active angle, separately for video and audio

mc-clip / sync-clip not in its clip walk, so not handle-checked

Time

exact Fractions from each sequence's own frameDuration; round half away from zero

frame rate from the first <format> (default 24); int(seconds × fps) truncation

Unknown cases

REVIEW with a reason

unresolvable clips are skipped

FCP behaviour evidence

observed live on FCP 12.3 (above)

tests simulate osascript

Pick fcp-mcp-server when you want an agent to edit broadly; pick fcpkit when you want to know, exactly, whether a timeline will survive the trip into FCP.

Tests

python3 -m unittest discover -s tests

All tests use synthetic XML and ffmpeg-generated media; none sends an Apple event or opens FCP (the live import flow runs against fakes). FCPKIT_TEST_TMP sets where temporary files go. One test compiles the listing AppleScript with osacompile and is skipped when no Final Cut Pro is installed.

License

MIT — see LICENSE.

Available Tools

8 tools
fcpkit_briefA
Read-only

Read a timeline as a compact editorial brief instead of raw XML (call this first): symbol table of sources/templates, one line per main-storyline cut (source @time, angle, non-default volume/scale/effects) and under it every caption (with text), title, overlay, sound, transition and marker that starts during that cut; lane table, density, and a coverage line "timed items shown n/n". Typically 15-25x smaller than the XML.

NameRequiredDescriptionDefault
endNoto this timeline second
idsNoadd #n to element lines so the brief can be edited and sent to fcpkit_brief_apply
xmlYespath to a .fcpxml file or .fcpxmld bundle
langNolabel language
startNofrom this timeline second
detailNo1 no values, 2 key values (default), 3 + effect parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, non-destructive, non-open-world behavior, so the description does not need to restate safety. It adds useful behavioral context by describing the brief's structure, the coverage line "timed items shown n/n", and the typical 15-25x size reduction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and is dense with useful detail rather than filler. It is somewhat run-on and could be structured more readably, but every clause contributes to explaining the brief's contents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the burden of explaining return values, which it does thoroughly: symbol table, per-cut lines, nested captions/titles/overlays/sounds/transitions/markers, lane table, density, and coverage line. Combined with the fully described input schema, this is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines all six parameters, including start, end, ids, lang, and detail. The description does not add significant parameter-specific meaning beyond implying that non-default effects and captions are surfaced in the output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: read a timeline as a compact editorial brief instead of raw XML. The phrase "call this first" and the detailed brief contents make its role clear and distinguish it from raw XML inspection and downstream editing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage guidance with "call this first" and positions itself against raw XML. However, it does not explicitly mention when to prefer siblings such as fcpkit_timeline_diff or fcpkit_filmstrip, so alternatives beyond raw XML are left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fcpkit_brief_applyA

Apply an edited brief (made with fcpkit_brief ids=true from this exact XML) back to a NEW FCPXML: only changed lines are applied — start time, length, lane, caption text, "vol NdB", or a deleted line; main-storyline cuts accept vol only. Anything else is refused and nothing is written. The result is verified (only the edited elements changed, to the requested values) and DTD-validated. Never overwrites the source.

NameRequiredDescriptionDefault
outYesnew .fcpxml / .fcpxmld path (must not exist)
xmlYespath to a .fcpxml file or .fcpxmld bundle
dry_runNo
partialNo
edited_briefYesthe full edited brief text

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: only changed lines are written, main-storyline cuts accept vol only, out-of-scope edits abort with nothing written, the result is verified and DTD-validated, and the source is never overwritten. That is consistent with readOnlyHint=false/destructiveHint=false. It does not explain how dry_run or partial alter behavior, which leaves a behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and then densely packed with constraints; nearly every clause carries information (accepted fields, refusal behavior, verification, no overwrite). Slightly heavy in embedded parentheticals, but no wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with five parameters and no output schema, the description covers the write semantics and safety but says nothing about the return value or about dry_run/partial modes. Adequate but with clear gaps an agent would have to discover by probing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 60%, and the two undocumented parameters (dry_run, partial) are behaviorally significant flags that the description never mentions. The description clarifies the xml/edited_brief/out relationship somewhat, but it does not compensate for the missing flag semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (apply an edited brief back to a NEW FCPXML) and pins the input's provenance to fcpkit_brief ids=true from this exact XML, which separates it cleanly from the sibling fcpkit_brief that produces the brief. An agent can tell exactly what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear prerequisite (brief must come from fcpkit_brief ids=true on this exact XML) and an explicit allow-list of applicable edits, with the rule that anything else is refused. It stops short of naming the alternative tool to use when the edit falls outside that list, but the guardrails make the intended usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fcpkit_effects_checkA
Read-only

Check that every resource resolves: Motion templates (src/uid files), FCP built-in templates, FxPlug UUIDs against FCP's own registry and installed plug-ins. MISSING/REVIEW/OK/INFO per effect.

NameRequiredDescriptionDefault
xmlYespath to a .fcpxml file or .fcpxmld bundle
templates_dirNouser Motion Templates folder (optional)

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, non-destructive, closed-world, so the safety bar is met. The description goes beyond them by disclosing the resolution sources it consults and the four result classifications (MISSING/REVIEW/OK/INFO), which is real behavioral information not encoded anywhere else given there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and scoped by the resolution sources. The telegraphic style ('Motion templates (src/uid files)', 'MISSING/REVIEW/OK/INFO per effect') is dense but earns its space; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description is the only source for return semantics, and it gives labels without definitions — an agent cannot tell what distinguishes REVIEW from INFO or what actions each implies. The core scope is adequately covered, but the ambiguous status vocabulary leaves a real gap for interpreting results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'xml' (path to .fcpxml/.fcpxmld bundle) and optional 'templates_dir' fully documented inline. The description adds nothing about either parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('Check') and a specific resource ('every <effect> resource'), and enumerates the three resolution paths covered: Motion templates, FCP built-ins, and FxPlug UUIDs. The sibling tools all operate on other resources (libraries, handles, timeline diff, filmstrip), so there is no realistic confusion, though the description never explicitly routes against them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: an agent can infer this is a pre-flight validation for effect resolution in a .fcpxml file. There is no explicit 'when to use this vs X', no stated prerequisites (e.g. FCP installed, registry accessible), and no mention of what to do with REVIEW vs MISSING results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fcpkit_filmstripB

Pictures of the main storyline around timeline times: evenly spaced frames resolved through multicam angles/compounds, waveform underneath, red ticks at cuts. Writes PNGs to a new folder and returns them as images (max 8 times).

NameRequiredDescriptionDefault
atYestimeline seconds
preNo
xmlYespath to a .fcpxml file or .fcpxmld bundle
postNo
framesNo
out_dirNonew folder for the PNGs (default: temp)

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, non-destructive, closed-world behavior; the description adds meaningful context by saying it writes PNGs to a new folder, returns them as images, and is capped at 8 times. It does not contradict the annotations. It omits details such as overwrite/permission behavior, but the annotation set carries some of that burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with the visual composition and output behavior front-loaded. There is little filler, though the final phrase 'max 8 times' is ambiguous and slightly undermines clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter local tool with no output schema, the description adequately explains the visual output and file-writing behavior. However, it leaves usage routing and several parameter semantics under-specified, so an agent would still need the schema to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, so the description needs to compensate. It implies timeline times and a new output folder, and 'evenly spaced frames' hints at the frames parameter, but it leaves pre, post, and frames defaults/units unexplained. The 'max 8 times' phrase is also unclear about which parameter or limit it refers to.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description concretely describes generating pictures of the main storyline around timeline times, including what is rendered (multicam angles/compounds, waveform, cut ticks) and the output (PNG folder/images). It clearly distinguishes the tool from siblings like fcpkit_handles or fcpkit_timeline_diff. It is slightly telegraphic and never plainly says 'generate a filmstrip', but the purpose is still evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not state when to use this tool, when not to use it, or which sibling to prefer for adjacent tasks. Usage must be inferred from the visual-output description. There is no explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fcpkit_handlesA
Read-only

Check every transition: does each side have the media it needs (multicam, compound and retime aware), and does a dissolve sit on a jump cut (it would show removed material)? Statuses PASS/INFO/REVIEW/FAIL; unknown is REVIEW, never PASS.

NameRequiredDescriptionDefault
xmlYespath to a .fcpxml file or .fcpxmld bundle
measureNomeasure removed audio under jump-cut dissolves with ffmpeg

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/closed-world/non-destructive, so the description spends its budget well by defining the status vocabulary (PASS/INFO/REVIEW/FAIL) and the conservative rule that unknown resolves to REVIEW, never PASS. That is real behavioral context an agent cannot get from annotations. It omits any note about ffmpeg availability affecting results when measuring.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler; the media check precedes the jump-cut check, matching execution order, and the status rule is placed last as a caveat. The parentheticals make sentences long but each clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully supplies the status enum and its default semantics, which is the key return-value knowledge. Missing only the report shape (per-transition list vs aggregate) and whether ffmpeg is required for 'measure' — minor gaps for a read-only inspection tool with a fully documented schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both 'xml' and 'measure' are already documented; baseline 3 applies. The description's mention of 'it would show removed material' loosely hints at what measurement is for, but adds no syntax, format, or cost information beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb ('check every transition') and enumerates the two things verified: media presence on each side (multicam, compound, retime aware) and dissolves landing on jump cuts. The opaquely named resource 'handles' is defined inline, so an agent can distinguish this from fcpkit_effects_check and fcpkit_timeline_diff. It stops short of a one-line summary of what a 'handle' problem means overall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies the tool is for pre-conformance validation of transitions, but never says when to reach for it versus fcpkit_effects_check or fcpkit_timeline_diff, nor any prerequisites or exclusion conditions. The triggering context must be inferred from the check list itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fcpkit_librariesA
Read-only

List the libraries, events and projects open in the running Final Cut Pro (AppleScript, read only). Refuses if FCP is not running or two copies run; never launches FCP.

NameRequiredDescriptionDefault
timeoutNo
durationsNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses key operational behavior: it uses AppleScript, refuses when FCP is not running or two copies are running, and never launches FCP. These are exactly the preconditions an agent needs to avoid failed or surprising calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences front-load the purpose and follow with the critical failure behaviors. Every clause earns its place, including the parenthetical '(AppleScript, read only)' and the 'never launches FCP' guarantee.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and its core scope plus refusal behavior are well covered, but with no output schema and no parameter documentation, the definition leaves the two input parameters unexplained. An agent can call it with defaults, but cannot make informed choices about timeout or durations from the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has two parameters, 'timeout' and 'durations', with 0% description coverage, and the description says nothing about either. Since schema coverage is low, the description should compensate for this gap, but it provides no meaning, units, or effect for the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('List') and precise resources ('libraries, events and projects') scoped to the running Final Cut Pro application. It is immediately distinguishable from sibling tools such as timeline_diff or effects_check without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context of use is implied by 'open in the running Final Cut Pro', but the description never states explicit when-to-use or when-not-to-use guidance relative to siblings like fcpkit_brief. The precondition 'Refuses if FCP is not running' is helpful but is behavioral rather than a usage routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fcpkit_timeline_diffA
Read-only

What changed between two timelines (e.g. a generated build vs the editor's FCP export): unique-key matching, frame deltas of start/end/source, lane and text changes, added/removed items.

NameRequiredDescriptionDefault
aYesbaseline timeline
bYeschanged timeline
kindsNoonly these kinds: main, caption, title, overlay, audio
caption_patternNoregex on title template names that marks captions

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly=true, destructive=false, closed-world, so the safety profile is covered. The description still adds real behavioral content beyond them: it discloses that items are paired by unique key (so both timelines must carry stable identifiers) and that deltas are reported in frames for start/end/source. It does not touch cost or output shape, but for a read-only comparison that gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence opens with the core question ('What changed between two timelines') and then packs the comparison semantics and reported fields. Every clause carries information; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must carry return-value expectations, and it does list the categories of changes reported. What is missing is the result's shape (a match/changed/added/removed grouping, units of the frame deltas), which an agent would have to discover by calling. For a 4-parameter read-only tool this is close to sufficient but not fully closed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents 'a' as baseline, 'b' as changed, the allowed `kinds` values, and the `caption_pattern` regex. The description reinforces the asymmetric baseline-vs-changed framing via the build-vs-export example but adds no syntax or format detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (diff / 'what changed') and a specific resource (two timelines), then enumerates exactly which aspects are compared: unique-key matching, frame deltas of start/end/source, lane and text changes, added/removed items. No sibling tool (handles, filmstrip, effects_check, relink_preview) shares this operation, so an agent can route unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical 'e.g. a generated build vs the editor's FCP export' gives a concrete scenario that tells the agent when this tool is the right pick. There is no explicit when-not guidance or named alternative, but the siblings are functionally distant enough that no exclusion is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedfcpkit_brief
    • First observedfcpkit_brief_apply
    • First observedfcpkit_effects_check
    • First observedfcpkit_filmstrip
    • First observedfcpkit_handles
    • First observedfcpkit_libraries
    • First observedfcpkit_relink_preview
    • First observedfcpkit_timeline_diff

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation4/5

The tools cover distinct jobs: listing open FCP state, reading a compact brief, applying brief edits, checking transition handles, checking effects, diffing timelines, previewing relinks, and producing filmstrips. The timeline-inspection and validation tools are related but remain clearly separated by their outputs and descriptions.

Naming Consistency4/5

All tools use a consistent fcpkit_ prefix and snake_case naming. The suffix grammar varies somewhat (noun, noun_verb, verb_noun), but names remain readable and predictable.

Tool Count5/5

Eight tools is well within an appropriate range for an FCPXML inspection and editing toolkit. Each tool appears to earn its place by covering a distinct workflow step.

Completeness4/5

The surface covers listing open FCP state, timeline briefing and editing, transition/effect validation, timeline diffing, relink preview, and visual inspection. Minor gaps exist around broader project/media management and more general FCPXML write operations, but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    The first MCP server for Final Cut Pro. 53 tools that parse, edit, and generate FCPXML timelines via natural language. Health checks, flash frame detection, chapter markers, rough cuts, NLE export. 912 tests, MIT licensed.
    15
    1,889 PyPI
    130
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables Claude and other MCP clients to read, edit, and generate real Final Cut Pro timelines from FCPXML, including cut detection, markers, roles, silence removal, transcript-based editing, cross-NLE export, and pushing changes into a running Final Cut Pro. Every write is journaled and undoable, with validation and safety checks for reliable timeline edits.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables an MCP client like Claude to read, edit, and generate real Final Cut Pro timelines from exported FCPXML, covering cut and flash-frame detection, silence and gap removal, markers, keyframes, speed ramps, transcript-based editing, cross-NLE export, and pushing the result into a running Final Cut Pro. Every write is journaled with its sha256 so changes can be undone and unreviewed cuts refused.
    -