{"name":"io.github.ronak-create/fablecut","slug":"ronak-create-fablecut","title":"FableCut","description":"Zero-dependency browser video editor AI agents drive via a JSON timeline over MCP; ffmpeg export.","url":"https://mcp.market/server/ronak-create-fablecut","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"scraping","tags":["scraping","productivity","media"],"presence":{"score":58,"stars":783,"forks":100,"downloads_week":253,"last_push_at":"2026-10-30T18:11:28.000Z","license":"MIT"},"uptime":null,"claimed":true,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ronak-create/FableCut","website":"https://fablecut.space/","version":"1.18.0","remotes":[],"packages":[{"registryType":"npm","identifier":"fablecut","version":"1.18.0","transport":{"type":"stdio"},"packageArguments":[{"type":"positional","value":"mcp"}]},{"registryType":"mcpb","identifier":"https://github.com/ronak-create/FableCut/releases/download/v1.18.0/fablecut.mcpb","fileSha256":"d7d7ee330705416fdcc10a963912fe4695357c7f5876276aa892e26ed836adbb","transport":{"type":"stdio"}}],"tools":[{"name":"fablecut_analyze_reference","description":"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 t","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_auto_duck","description":"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, ","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_beats","description":"The music's beat on the timeline, and cuts that land on it. Listens to a music clip (an audio clip, or a video's sound) and finds its tempo (BPM), a steady beat grid phased to the hits, and the drop — all in timeline seconds, through the clip's in point and speed. Then, in one revision: markers:true puts a cyan marker on every beat; snap:true rolls each cut on the video tracks (the targeted ones, ","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_captions","description":"Captions from what is said: makes caption clips on the timeline from the clips' transcripts (transcribing first when there is none, like fablecut_transcribe), each one a text clip with `wordTimes` so its words follow the speech. Captions are cut at pauses and sentences, one or two lines as wide as the canvas allows. Styles: subtitle (plain, on a dark bar), karaoke (words light up as they are said)","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_denoise","description":"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 rende","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_docs","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_encode_profiles","description":"List what fablecut_export can make. DELIVERY PRESETS (structured settings, the Export dialog's Preset list): youtube, youtube-shorts, instagram-reels, tiktok, x, linkedin, master (project size), broadcast (ProRes 422 HQ), web (720p), archive (lossless FFV1), custom — plus presets the user saved — each a spec of resolution, fps, codec (h264, hevc, av1, vp9, prores, dnxhr, mpeg2 XDCAM, ffv1), rate c","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_export","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_frame","description":"LOOK at the footage — returns an actual image, not just numbers. REQUIRES A VISION-CAPABLE MODEL: if you cannot read images, pass `text:true` instead (or skip this tool and use fablecut_analyze_reference). Three modes. (1) One frame of a source clip: pass `path` (an absolute file path, or a '/media/…' src — read where it lies, never copied) and `t` in seconds. (2) A contact sheet: pass `frames` (2","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_get_project","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_highlights","description":"The best moments of long footage, cut into a short edit: a 30 s reel from a 20-minute vlog, a match, a talk, a day of B-roll. Looks at the video clips on the open timeline (or clipIds, or whole files with mediaIds) — frames twice a second and the sound — and scores every half second: movement, sound louder than around it (a cheer, a laugh, a hit), a clear picture. Cuts already in the footage are f","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_import_media","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_normalize_audio","description":"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 ","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_projects","description":"Several projects in one FableCut: the projects dashboard. ./project.json (what every other tool reads and edits) is always the OPEN project; the others are stored beside it and share media/, exports/ and the library, so a duplicate or a template copies no footage. Actions: list (default; archived:'only'|'all' to see archived ones) · open {id} — switches the editor to that project (the open one is ","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_proxy","description":"Proxies: light H.264 copies (540p by default, 720p or 1080p; never larger than the source) of heavy footage — 4K, HEVC, ProRes, long phone clips — that the editor plays while the user edits, so playback and scrubbing stay smooth. Export, fablecut_frame, fablecut_scopes and every measurement always read the original, so a proxy never changes the result. Without create or delete it reports each vide","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_reframe","description":"Reframe for another shape, following the subject: a 16:9 edit made 9:16 (Reels, Shorts, TikTok), 1:1 or 4:5. With aspect, a copy of the open sequence is made on that canvas (the project's shorter side kept, e.g. 1920×1080 → 1080×1920) and opened, so the original cut stays as it was; without aspect, the open sequence is reframed on its own canvas. Each full-frame shot (a video or still that isn't m","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_scopes","description":"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 blen","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_set_project","description":"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-","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_silence","description":"Find the silences in speech and, with cut:true, cut them out. Listens to the given clips (a video's linked audio stems, after channel routing, gain and volume) and reports every stretch where none of them is above `threshold` for at least `minSilence` seconds, keeping `padding` seconds of quiet beside each phrase so words aren't clipped. Gaps between clips are left alone. With cut:true each silenc","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_status","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_track","description":"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, keepin","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_transcribe","description":"What is said, word by word, with times — and text-based editing. Transcribes the clips' speech with Whisper in the editor (an open tab, else headless Chrome / Edge; the speech model downloads once, the audio never leaves the machine), keeps one transcript per file (analysis/transcripts/), and answers with the timeline's words as timed lines (timeline seconds), so you can read an interview, pick th","write_action":false,"price_micros":0,"input_schema":null},{"name":"fablecut_versions","description":"A project's version history: saved copies you can go back to, never destructive. Actions: list (default) · save {name?, note?, final?} — keep the project as it is now (do this before big or risky edits, and when the user is happy with a cut) · diff {version, to?} — what changed from that version to now (or to another version): clips added / removed / changed, length, media, settings · restore {ver","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-11-07T17:56:08.910Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-07T17:56:08.850Z","components":{"code":{"score":25,"max":25,"notes":["44 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 8 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"fablecut","version":"1.18.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":0,"publishedAt":"2026-10-27T18:39:58.816Z","repositoryUrl":"git+https://github.com/ronak-create/FableCut.git","weeklyDownloads":253}],"repo":{"found":true,"owner":"ronak-create","repo":"FableCut","archived":false,"pushedAt":"2026-10-30T18:11:28Z","stars":783,"forks":100,"openIssues":11,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/84374383?v=4","ownerCreatedAt":"2021-05-18T07:28:11Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/84374383?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":783,"forks":100,"downloadsWeek":253,"license":"MIT","lastPushAt":"2026-10-30T18:11:28.000Z","score":58}}}},"grade_history":[],"reviews":[]}