---
name: fluidcut
description: Clip YouTube videos into captioned shorts and edit videos (a YouTube link or the user's own file) into finished posts with FluidCut's MCP tools, either with FluidCut's editor or with an edit plan you write yourself, then change the result in plain words. Use when the user asks to clip, cut, edit, caption or repurpose a video, make shorts, reels or TikToks, or add b-roll, titles or a cold open.
---

# FluidCut

FluidCut renders; you plan. The tools live on the `fluidcut` MCP server (setup: https://fluidcut.app/install.md). Jobs spend the user's FluidCut credits; preparing an edit and every read tool are free.

## Pick the job

- **Many short clips from one long video**: `create_clips(url, output_format, look, length)`. Poll `job_status(id)` until `complete`, then `get_results(id)`.
- **One finished edit of a video**: `edit_video(url, formats, look, captions, broll, cleanup, coldopen, prompt)`. Poll until `needs-input`, then `start_edit(id)`. Poll until `ready`, then `get_results(id)`.
- **You direct the edit**: `edit_video(url, directed=true)`. Poll until `needs-input`, call `get_source(id)`, write a plan, call `render_plan(id, plan)`, poll until `ready`, then `get_results(id)`.
- **The user's own file** (MP4, MOV, M4V, WebM or MKV, up to 2 GB): see below, then `edit_video(upload_id=..., ...)` in place of `url`. Every other step is the same.
- **A change after the render**: `request_change(edit_id, change)`. See below.

## The user's own file

1. Get the file's exact size in bytes (`wc -c < "path/to/video.mp4"`), then call `upload_video(filename, size_bytes)` with the full path as `filename`.
2. If the file is on the machine you run on, run the `command` it returns. It sends the file straight to storage with a signed link that holds no API key, so it is safe to show. Exit code 0 means the file arrived.
3. If the file is not on your machine, or you have no shell, give the user the `link` instead. They open it in a browser and drop the file there. The link works once and for 1 hour; if it fails, call `upload_video` again for a new one.
4. Then call `edit_video(upload_id=...)` with the options you want. If it says the video has not finished uploading, wait for the command or the user, then call it again. Uploading and preparing are free.

## Changes after the render

When the edit is `ready`, show the user the result and ask what to change. Pass their words as `change`, for example `request_change(edit_id, "make the captions bigger")` or "cut the first 10 seconds". Add `formats` only to render other formats. Each change renders a new version from the latest one and charges per source minute per format, without the planning cost. Poll `job_status` until `ready` again, then `get_results(id)`: `latest` holds the new version's files. Up to 12 versions per edit.

Before a large job, call `credit_balance()` and tell the user the rough cost: clips cost per minute of video; an edit costs per source minute per format, plus planning on the first render. `list_looks()` has the exact rates, the looks and the formats.

## Polling

Renders take minutes. Call `job_status` every 30 to 60 seconds, and tell the user the message and progress rather than calling silently many times. `failed` and `no-good-moments` return the credits automatically.

## Writing a plan for render_plan

`get_source` gives every word as `[index, start_s, end_s, text, speaker]`, sentences as `[first_word_index, start_s, end_s, text]`, camera shots with the face position in each, the allowed icon names and graphic types. Then:

1. **Cut (optional)**: `keep` is a list of inclusive word ranges `{"from": i, "to": j}` in time order. Drop false starts, repeated takes, greetings and trailing fragments; keep the later complete take; keep sentences whole. Leave `keep` out to let FluidCut's cleanup choose.
2. **Hook**: `text` at most 7 words, a question or bold claim from what is said; `until_word` is the last word index of the opening sentence.
3. **Scenes**: `w` is the word index where a scene starts, strictly increasing, a new scene every 2 to 5 seconds. Each scene has a `title` (max 26 characters), a `key` (1 or 2 words of the title), a `sub` (max 42), a `graphic` that matches the words spoken right then (list for named examples, stat for a spoken number, compare for a contrast, flow or steps for a process), and `vertical`: `split`, `full` (personal or emotional lines), `graphic`, or `broll`.
4. **B-roll**: only for concrete, filmable things the speaker names. `query` is 2 to 5 plain words for what a camera sees ("chef plating a dish"). Set `subject` only for one named real place, landmark, person or event, and then `generic_ok: false`. At most one b-roll scene per 8 seconds, and set `vertical: "broll"` on it.
5. **End card**: if the speaker ends with a call to action, the last scene is `kind: "end"` with a `button` (max 20).
6. Use the language and script of the captions. No em dashes, no emoji, no hashtags.

The plan is validated strictly: an unknown field, an icon not in the list, a word index past the transcript or a too-long title comes back as an error naming the field. Fix exactly that and call `render_plan` again; nothing is charged until a plan is accepted.

## Sharing results

`get_results` returns download links that work without a key for 6 hours, with the newest finished version in `latest`. Give the user those links; ask for fresh ones with `get_results` again after that.

## Errors

- 401: the API key is wrong or revoked. The user makes a new one at https://fluidcut.app/#credits.
- 402: not enough credits. The user can buy more at https://fluidcut.app/pricing.
- 429: wait a minute; one video at a time is processed per account for clips, two at a time for edits.
