FableCut
NPM · FABLECUT · 2 COMPONENTS
Zero-dependency browser video editor AI agents drive via a JSON timeline over MCP; ffmpeg export.
Available components
Last scanned (9 hours ago)
Scores higher than 59% of npm servers
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to ronak-create/FableCut). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 4 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6201 tokens (~442/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 14 Oct 26 +29
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- First check of Destructive annotations: pass functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 100 functional
- 12 Oct 26 50
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 17 Oct 2026 · Analysed npm/fablecut@1.14.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | ronak-create/FableCut |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/ronak-create/FableCut/.github/workflows/publish-npm.yml@refs/tags/v1.14.0 |
| Rekor log index | 3225846763 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:bbfae6a2c19c20b4f4e390c3b37beffd0dedd886fc7435127ca9bb087fadfcbd7a69ac1e6b3426925d19cd34878d142de316c4029d6bf9eea46f13753 |
Background: How many MCP packages publish verified provenance →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
fablecut_analyze_reference ~276
Analyze a reference video into an EDIT BLUEPRINT so a similar edit can be rebuilt with different footage over the same music. Returns: shot boundaries (cuts) with per-shot audio energy, music beats + BPM, a loudness curve, the detected drop, and extracts the reference's music track into media/ (registered in the project, ready to place on A1). Remake recipe: copy the reference's width/height/fps to the project, write `beats` into project `markers`, lay the extracted music on A1, then place one clip per blueprint `shot` at the same start/duration — pick calm footage for low-energy shots and action for high-energy ones, and make the biggest moment land on `drop`. See the 'Remake a reference video' section of fablecut_docs.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | The reference video: an absolute file path (copied into media/ automatically) or an existing '/media/…' src |
| registerMusic | boolean | – | Extract the reference's music and register it as project media (default true) |
| threshold | number | – | Scene-cut sensitivity 0–1 (default: adaptive 0.30→0.20→0.12). Lower it if obvious cuts are missed, raise it if too many false cuts. |
No output schema declared.
No examples provided.
fablecut_auto_duck ~335
Duck music under dialogue: finds where the voice tracks have sound (RMS above `threshold`, short gaps bridged so the music doesn't pump between words) and writes `duck` keyframes (dB) on the given music clips — a dip of `amount` dB ramping down `attack` s before speech and back up `release` s after. The duck multiplies the clip's volume, so its own level, volume keyframes and fades are untouched, and re-running replaces the previous dips (amount 0 clears them). Voice = every audio clip on `under` tracks (default: all audio tracks the music isn't on). Linked stems of a music clip get the same keys. The same pipeline as the editor's Auto-duck. Needs ffmpeg + ffprobe on PATH. Refuses locked clips unless force:true.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | – | Dip depth in dB, -40…0 (default -12; 0 removes the ducking) |
| attack | number | – | Seconds to ramp down before speech (default 0.3) |
| clipIds | array | yes | The music / bed clips to duck |
| force | boolean | – | Also change clips the user locked (only when they asked) |
| release | number | – | Seconds to ramp back up after speech (default 0.6) |
| threshold | number | – | Voice detection level in dBFS (default -40; raise it if room noise triggers ducks) |
| under | array | – | Audio tracks holding the voice, e.g. ["A1"] (default: every other audio track) |
No output schema declared.
No examples provided.
fablecut_denoise ~181
Reduce background noise (hiss, hum, room tone) on audio clips: ffmpeg's FFT denoiser renders a cleaned FLAC of each clip's whole source file into media/, and the clip — with its linked stems — switches to it (the picture keeps its own file, so links and timing stay intact). The same as the inspector's Noise control. amount 'off' switches back to the original. Re-running reuses a file already rendered. Needs ffmpeg + ffprobe on PATH. Refuses locked clips unless force:true.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | – | How hard to pull the noise down (default medium); off restores the original audio |
| clipIds | array | yes | Audio clips, or video clips with linked audio stems |
| force | boolean | – | Also change clips the user locked (only when they asked) |
No output schema declared.
No examples provided.
fablecut_docs ~112
Return the FableCut project schema documentation: clips, tracks, props, keyframe animation, transitions, and editing recipes. Read this before editing. TOKEN TIP: pass `section` to fetch only the '## …' section(s) you need (substring match, e.g. "props", "Recipes", "Remake") instead of the whole manual.
| Name | Type | Req | Description |
|---|---|---|---|
| section | string | – | Return only '## ' sections whose heading contains this text (case-insensitive). Omit for the full document. |
No output schema declared.
No examples provided.
fablecut_encode_profiles ~156
List ffmpeg encoding profiles for Fast export (from encoding-profiles.json). Each profile is a raw ffmpeg argument list plus jpegQuality, extension, and optional color (output matrix/range — default BT.709 tv). Use to pick a profile id for project.encodeProfile. Edit encoding-profiles.json on disk to add custom profiles — anything the local ffmpeg supports works, and the server hot-reloads the file. Profiles are dry-run against ffmpeg when an export starts, so a bad argument is rejected before rendering.
| Name | Type | Req | Description |
|---|---|---|---|
| detail | boolean | – | Include the full ffmpeg args array per profile (default: a truncated summary) |
| profile | string | – | Return one profile by id instead of the full list |
No output schema declared.
No examples provided.
fablecut_export ~330
Render the timeline to a video file in exports/ — the editor's own Fast export (same compositor, audio mix and encoding profile as the Export button), so the file matches what the user sees. It runs in a browser: an open editor tab takes the job (the user sees the progress bar), or with no tab open the server starts headless Chrome / Edge (set FABLECUT_CHROME to pick one) and closes it afterwards. Waits for the file by default and returns its path. Range: the project's inPoint→outPoint when set, else the whole timeline (or pass range). Needs ffmpeg on PATH. One export at a time. Long edits: pass wait:false, then poll with {job}; {cancel:job} stops one.
| Name | Type | Req | Description |
|---|---|---|---|
| cancel | string | – | Cancel this export job |
| job | string | – | Report on an export started earlier instead of starting one |
| profile | string | – | Encoding profile id (fablecut_encode_profiles); default: project.encodeProfile, else the server default |
| range | string | – | Whole timeline, or the project's inPoint→outPoint (default: in-out when either is set) |
| timeout | number | – | Seconds to wait before returning the job's status instead (default 900); the export keeps running |
| wait | boolean | – | Block until the file is written (default true) |
| where | string | – | auto (default): an open editor tab, else headless · tab: only an open tab · headless: always a background browser, leaving the user's tab alone |
No output schema declared.
No examples provided.
fablecut_get_project ~88
Get the FableCut project (the timeline document). TOKEN TIP: pass compact:true for a one-line-per-clip summary (ids, tracks, timings, non-default props) — usually all you need to plan an edit; fetch the full JSON only when you must inspect exact keyframes.
| Name | Type | Req | Description |
|---|---|---|---|
| compact | boolean | – | Return a compact human-readable summary instead of the full JSON |
No output schema declared.
No examples provided.
fablecut_import_media ~114
Import a media file into FableCut's media library and register it in the project. Pass a local absolute path (copied, including .svg) or an https:// URL (downloaded into ./media/; video/audio/image only — remote SVG is refused). The URL is never kept as the playback src — CORS would break export. Returns the created media entry (use its id in clips).
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to a local file, or an https:// URL to download |
No output schema declared.
No examples provided.
fablecut_normalize_audio ~259
Loudness-normalize clips: measures each clip's source audio (ITU-R BS.1770 integrated LUFS, or sample peak) after its channel routing and sets `props.gain` (clip gain, dB) so it lands on the target — the same measurement as the editor's Normalize button. Linked stems (a video's per-channel audio clips) are measured together and get one shared gain, so a stereo pair stays balanced; passing a video clip normalizes its stems. Volume keyframes / fades are untouched (they ride on top). Typical targets: -14 LUFS streaming/social, -16 LUFS podcast/dialogue, -23 LUFS broadcast, or mode 'peak' at -1 dBFS. Needs ffmpeg + ffprobe on PATH. Refuses locked clips unless force:true.
| Name | Type | Req | Description |
|---|---|---|---|
| clipIds | array | yes | Clips to normalize (audio, or video with audio) |
| force | boolean | – | Also change clips the user locked (only when they asked) |
| mode | string | – | Measure integrated loudness (default) or sample peak |
| target | number | – | Target level: LUFS for mode lufs (default -14), dBFS for mode peak (default -1) |
No output schema declared.
No examples provided.
fablecut_patch_project ~3,159
Apply targeted edits to the FableCut project WITHOUT round-tripping the whole document — PREFER THIS over get+set for every edit (it is ~10-100x cheaper in tokens and merge-safe by design: it re-reads the latest document from disk, applies your ops in order, bumps revision once, saves atomically). Ops: {op:'addClip', clip:{…}} (id auto-generated if omitted) · {op:'updateClip', id, set:{…}} · {op:'removeClip', id} · {op:'addMedia', media:{…}} · {op:'removeMedia', id} · {op:'setProject', set:{name|width|height|fps|background|markers|disabledTracks|lockedTracks|untargetedTracks|encodeProfile|master}} (markers = the full list [{t, label?, color?}], color: gold|red|orange|green|cyan|blue|purple|pink; master = {gain}, the master fader in dB) · {op:'setTrack', id:'A1', set:{gain?, pan?, out?}} (audio-track fader in dB −60…+12, pan −1…1, out = a submix bus id or 'master'; null or 0 resets) · {op:'setBus', id:'B1', set:{name?, gain?, pan?, mute?}} (submix bus, created if missing; route tracks into it with setTrack out) · {op:'removeBus', id} · {op:'setFx', target:'clip'|'track'|'bus'|'master', id?, preset?:'podcast'|… OR fx:[{type,…params}], append?:true} (audio effects — validated; presets: clean-voice, podcast, radio, deep-voice, telephone, cinematic, wide, muffled; fx:null clears; on a clip it applies to its linked stems too) · {op:'setFxKeys', target, id?, index?|type?, param, keys:[{t, v, ease?}]|null} (automate one effect parameter: t is clip-local for a clip's effects, timeline seconds otherwise; see the 'Audio mix' docs section) · {op:'setGrade', id | ids:[…], grade:{exposure?, temp?, tint?, lift?, gamma?, gain?, offset?, contrast?, pivot?, blacks?, shadows?, midtones?, highlights?, whites?, lowSoft?, highSoft?, saturation?, curves?:{y?, r?, g?, b?}, hueHue?, hueSat?, hueLuma?, satLuma?, layers?:[…], on?}, replace?:true} (color grade on video / image / svg / adjust clips — wheels are [r, g, b, master]; curves are [[x, y], …] point lists on 0…1 and merge per channel;…
| Name | Type | Req | Description |
|---|---|---|---|
| baseRevision | integer | – | Revision these ops were planned against. If project.json has moved past it, the patch is refused with CONFLICT (nothing saved). Omit to apply on top of the latest revision. |
| ops | array | yes | Edit operations, applied in order (see tool description for shapes). Any op may carry force:true to override a lock the user set. |
No output schema declared.
No examples provided.
fablecut_scopes ~363
Measure the graded picture at one moment — what the editor's scopes show, as numbers: luma levels (min, 1st percentile, median, mean, 99th percentile, max on 0–1), the % of pixels crushed to black / clipped to white, mean R/G/B, average saturation, and the colour cast of the midtones (hue name + strength; neutral below 0.01), plus the clips on screen with their grades, masks, track mattes and blend modes. Rendered by the same compositor as export (an open editor tab, else headless Chrome / Edge), over the export frame when one is set. Use it to check a grade: e.g. a cast strength above ~0.03 on footage that should be neutral, whitePct above ~1 (clipped highlights), or a median far from ~0.4 for a normally exposed shot. The user's playhead does not move.
| Name | Type | Req | Description |
|---|---|---|---|
| mask | object | – | Also measure a clip's masks: {clip}. Adds how much of that clip's picture the masks keep (coverage %, the feathered matte measured alone) and how much of the frame the masked clip covers |
| matte | object | – | Also measure what one grade layer selects: {clip, layer} (layer = index into the clip's grade.layers). Adds the matte's coverage (% of that clip's picture) and the levels / colour of the selected pix… |
| time | number | – | Timeline seconds to measure (default: the editor's playhead) |
| timeout | number | – | Seconds to wait (default 60) |
| where | string | – | auto (default): an open editor tab, else headless · tab · headless |
No output schema declared.
No examples provided.
fablecut_set_project ~170
Replace the FableCut project JSON. Pass the COMPLETE document (read with fablecut_get_project, modify, send back whole). Revision is auto-bumped; the open editor UI hot-reloads instantly so the user sees the edit live. CONFLICT-SAFE: if the project changed on disk since your last fablecut_get_project (e.g. the user tweaked something in the UI), the call errors instead of overwriting — re-read, re-apply your edit on top of the latest document, and retry.
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | Overwrite even if the project changed since it was last read (discards those external/user changes). Only when the user explicitly asks. |
| project | object | yes | The complete project document (see fablecut_docs for schema) |
No output schema declared.
No examples provided.
fablecut_status ~48
FableCut video editor: ensure the editor web server is running (auto-starts it), and get the editor URL, project summary and media library. Call this first in a session.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
fablecut_track ~610
Follow something in a video clip frame by frame (motion tracking, in the editor: an open tab, else headless Chrome / Edge) and store it on the clip as a named track (props.tracks). Then, in the same call, make a mask follow it (apply:{mask}) or pin another clip to it (apply:{clip} — a title, sticker, blur box… its x / y, and optionally scale / rotation, get keyframes that ride on the track, keeping where it is at `at`). What to follow: region {x, y, w, h} or point {x, y} (+ size), as fractions of the clip's picture (0…1, y down) at time `at`; or leave both out with apply:{mask} to follow what that mask covers. To re-apply an existing track, pass its name with apply and no region. Pick something with detail (a corner, a logo, text, an eye), not a flat area; the result reports match quality (≥ 0.8 is solid) and where the region was lost, if it was. Check the outcome with fablecut_scopes or by looking at the keyed clip.
| Name | Type | Req | Description |
|---|---|---|---|
| apply | object | – | Bake the track into keys: {mask: index | name} (the mask's x / y — and scale / rotation when tracked — follow) or {clip: id, scale?, rotation?, at?} (that clip rides on the track) |
| at | number | – | Timeline seconds where the region is as given (default: the clip's start) |
| clip | string | yes | The video clip to track in |
| direction | string | – | Track from `at` to the clip's end (default), to its start, or both |
| force | boolean | – | Allow changing locked clips — only when the user asked |
| name | string | – | The track's name (default: the mask's name, or Track n). An existing name is extended / replaced over the tracked range |
| point | object | – | A spot to follow at `at` (fractions of the picture); a square region of `size` around it is matched |
| region | object | – | The area to follow at `at`: centre x, y and size w, h, fractions of the clip's picture |
| rotation | boolean | – | Also follow the region's rotation |
| scale | boolean | – | Also follow the region's size (zooms, objects moving closer) |
| size | number | – | With point: the region's width, fraction of the picture's width (default 0.08) |
| timeout | number | – | Seconds to wait (default 300) |
| to | number | – | Timeline seconds to stop at (default: the clip's end / start) |
| where | string | – | auto (default): an open editor tab, else headless · tab · headless |
No output schema declared.
No examples provided.
How do I install the FableCut MCP server?
FableCut runs locally as an npm package, launched with npx -y fablecut. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · fablecut
claude mcp add ronak-create-fablecut -- npx -y fablecut
What is the FableCut MCP server?
FableCut is an MCP server listed in the public MCP registry as io.github.ronak-create/fablecut. Zero-dependency browser video editor AI agents drive via a JSON timeline over MCP; ffmpeg export. This page covers its npm package (fablecut).
Is the FableCut MCP server safe to use?
FableCut scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 17 October 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the FableCut MCP server expose?
FableCut exposes 14 tools: fablecut_status, fablecut_docs, fablecut_get_project, fablecut_patch_project, fablecut_set_project, and 9 more. Their descriptions and schemas cost roughly 6,201 tokens of context every time the server is loaded.
Is the FableCut MCP server still maintained?
FableCut is still listed as active in the MCP registry. We last reached this channel on 17 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the FableCut MCP server under?
FableCut declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.