fcpkit-mcp
Provides tools for interacting with Final Cut Pro timelines and libraries, enabling checks, edits, and guarded imports into Final Cut Pro via AppleScript and Apple events.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fcpkit-mcpbrief MyTimeline.fcpxmld and check its transition handles"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
ffmpegis 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 effectT1, 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 |
| 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. |
| A row of frames + waveform (red ticks = cuts) of the main storyline around a timeline time, each frame resolved through angles/compounds. |
| Checks every |
| 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 |
| 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. |
| The shared base: every timed element with absolute start/end and lane; |
Edits (always to a new file)
Command | What it does |
| Moves caption / zoom starts back onto a main-storyline cut when the cut is at most |
Final Cut Pro (live) and safety rails
Command | What it does |
| Which FCP copy is running — identified by executable path, because several copies (stock, an older version, a SpliceKit-patched copy) share the bundle id |
| Imports into the library you name, guarded. It writes an import copy whose first child is |
| 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. |
| Append-only write ledger (JSONL) with input/output sha256 (bundles hashed whole). Undo never deletes: it moves outputs into |
| Waits for a fresh FCP "Export XML" by content hash (stable across two polls, newest wins) and optionally diffs it against your build. |
| 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 |
| 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 ( |
The XML also contains |
|
A 30-frame transition whose clips have only 6 frames of handle | Imported without any warning, shortened to 6 frames — the maximum |
AppleScript | Cannot be coerced to text (error −1700). fcpkit reads every field in its own |
Two FCP copies installed (12.3 and 12.4) | Same bundle id; |
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 |
|
| the app |
| — ( | extra FCP copies to recognise; a SpliceKit copy in |
|
| cooperative lock while a tool drives FCP ( |
|
| optional SpliceKit bridge, read only, for dialog recording |
|
| filmstrips, loudness |
|
|
|
|
| which title templates |
Safety model
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 withxmllintagainst the DTD inside your installed Final Cut Pro, the output must not exist (exclusive create), and the source is re-hashed just before publishing.Unknown is REVIEW, not PASS. Unsupported retimes (holds, reverse, eased multi-point ramps), unresolved references, missing registries — all surface as REVIEW with the reason.
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.
Undo moves, never deletes, and only files whose hash still matches.
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/python33.9, have no entity-expansion limits). External entities are never fetched;xmllintruns 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-mcpHow 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 |
|
Time | exact | frame rate from the first |
Unknown cases | REVIEW with a reason | unresolvable clips are skipped |
FCP behaviour evidence | observed live on FCP 12.3 (above) | tests simulate |
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 testsAll 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 toolsfcpkit_briefARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | to this timeline second | |
| ids | No | add #n to element lines so the brief can be edited and sent to fcpkit_brief_apply | |
| xml | Yes | path to a .fcpxml file or .fcpxmld bundle | |
| lang | No | label language | |
| start | No | from this timeline second | |
| detail | No | 1 no values, 2 key values (default), 3 + effect parameters |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| out | Yes | new .fcpxml / .fcpxmld path (must not exist) | |
| xml | Yes | path to a .fcpxml file or .fcpxmld bundle | |
| dry_run | No | ||
| partial | No | ||
| edited_brief | Yes | the full edited brief text |
TDQS
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.
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.
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.
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.
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.
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_checkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | Yes | path to a .fcpxml file or .fcpxmld bundle | |
| templates_dir | No | user Motion Templates folder (optional) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| at | Yes | timeline seconds | |
| pre | No | ||
| xml | Yes | path to a .fcpxml file or .fcpxmld bundle | |
| post | No | ||
| frames | No | ||
| out_dir | No | new folder for the PNGs (default: temp) |
TDQS
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.
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.
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.
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.
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.
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_handlesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | Yes | path to a .fcpxml file or .fcpxmld bundle | |
| measure | No | measure removed audio under jump-cut dissolves with ffmpeg |
TDQS
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.
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.
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.
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.
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.
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_librariesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| durations | No |
TDQS
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.
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.
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.
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.
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.
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_relink_previewARead-only
Report each asset's media path, whether it exists (NFC/NFD aware), bookmark presence, and what a whole-segment prefix remap would find. Never rewrites the XML.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | Yes | path to a .fcpxml file or .fcpxmld bundle | |
| to_prefix | No | ||
| from_prefix | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces that with "Never rewrites the XML" while adding substantive behavior the annotations don't cover: NFC/NFD-aware path existence checks and bookmark presence. It does not discuss cost on large libraries or how many assets are reported, which keeps it below a 5 given the lower bar set by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, with the report contents front-loaded and the key safety guarantee ("Never rewrites the XML") placed as a closing qualifier where it is most needed. Every clause carries information an agent cannot get from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must carry the return shape, and it does by enumerating the four report elements per asset. The remaining gap is the treatment of the two optional-looking prefix parameters and what the output looks like when they are absent, which leaves a small but real hole for a 3-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% — only `xml` is documented, while `from_prefix` and `to_prefix` have no schema description. The phrase "whole-segment prefix remap" does add real semantics, implying segment-aware matching rather than substring replacement, but the description never says the two prefixes are optional, whether they must be supplied as a pair, or how the report changes when they are omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb ("Report") and enumerates exactly what is reported: media path per asset, existence with NFC/NFD awareness, bookmark presence, and the result of a hypothetical prefix remap. It is clearly a non-mutating diagnostic, which separates it from any sibling that edits a timeline. It stops short of explicitly naming which sibling to use instead, but no listed sibling overlaps with relink diagnosis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: "what a whole-segment prefix remap would find" plus "Never rewrites the XML" signals a dry-run to be consulted before committing a relink. There is no explicit when-to-use/when-not-to-use sentence and no named alternative or follow-up tool. Adequate for an agent to infer intent, but it requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fcpkit_timeline_diffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | baseline timeline | |
| b | Yes | changed timeline | |
| kinds | No | only these kinds: main, caption, title, overlay, audio | |
| caption_pattern | No | regex on title template names that marks captions |
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.1.0- First observed
fcpkit_brief - First observed
fcpkit_brief_apply - First observed
fcpkit_effects_check - First observed
fcpkit_filmstrip - First observed
fcpkit_handles - First observed
fcpkit_libraries - First observed
fcpkit_relink_preview - First observed
fcpkit_timeline_diff
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
Evidence-readiness MCP server: validate, audit, and score briefs, memos, and evidence packs.
Read-only XRP Ledger MCP tools with proof-annotation envelopes and signed daily snapshots.
2,000+ MCP servers read at source level. Know what one does before you connect. Free, no key.
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Related MCP Servers
- AlicenseAqualityAmaintenanceThe 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.151,889 PyPI130MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables AI to control Final Cut Pro on macOS, including reading libraries/projects, importing FCPXML, and creating title or storyboard projects.MIT
- FlicenseNot gradedqualityAmaintenanceEnables 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.-
- FlicenseNot gradedqualityAmaintenanceEnables 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.-