cuttingfloor
REMOTE · API.CUTTINGFLOOR.AI
Hosted video editing for AI agents: cut, caption, mix and export real video. Sign in with OAuth.
Available components
Last scanned (10 hours ago)
Scores higher than 84% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security92
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability70
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 21134 tokens (~245/item across 86 items; 72 tools + 14 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 Management33
- Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage92
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 73% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 74 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
- Supports UI / widget rendering.Pass
Checks we ran (14)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
- Capabilities
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
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.
- 5 Nov 26 0
- Server version: 0.32.0 → 0.34.0 functional
- 4 Nov 26 0
- New resource “library” functional
- Server version: 0.31.0 → 0.32.0 functional
- Server version: 0.30.0 → 0.31.0 functional
- 3 Nov 26 +1
- New resource “editor” functional
- Server version: 0.29.3 → 0.30.0 functional
- 2 Nov 26 0
- Tool “job.get” rewrote its description, which is the text the model reads security
- Tool “clip.set_mask” rewrote its description, which is the text the model reads security
- Server version: 0.29.2 → 0.29.3 functional
- Server version: 0.29.1 → 0.29.2 functional
- Server version: 0.28.0 → 0.29.1 functional
- “job.get” reworded the description of “wait_seconds” cosmetic
- “clip.set_speed” reworded the description of “interpolate” cosmetic
- “audio.set_gain” reworded the description of “gain_db” cosmetic
- “qa.check” reworded the description of “speech” cosmetic
- 1 Nov 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “audio.set_gain” rewrote its description, which is the text the model reads security
- Tool “audio.set_master” rewrote its description, which is the text the model reads security
- Tool “caption.add” rewrote its description, which is the text the model reads security
- Tool “clip.replace” rewrote its description, which is the text the model reads security
- Tool “clip.set_animation” rewrote its description, which is the text the model reads security
- Tool “clip.set_mask” rewrote its description, which is the text the model reads security
- Tool “clip.set_transform” rewrote its description, which is the text the model reads security
- Tool “create.cutout” rewrote its description, which is the text the model reads security
- Tool “export.timeline” rewrote its description, which is the text the model reads security
- Tool “export.video” rewrote its description, which is the text the model reads security
- Tool “filter.add” rewrote its description, which is the text the model reads security
- Tool “job.cancel” rewrote its description, which is the text the model reads security
- Tool “job.get” rewrote its description, which is the text the model reads security
- Tool “job.list” rewrote its description, which is the text the model reads security
- Tool “judge.ask” rewrote its description, which is the text the model reads security
- Tool “media.analyze” rewrote its description, which is the text the model reads security
- Tool “media.get” rewrote its description, which is the text the model reads security
- Tool “media.import” rewrote its description, which is the text the model reads security
- Tool “media.listen” rewrote its description, which is the text the model reads security
- Tool “media.seek” rewrote its description, which is the text the model reads security
- Tool “qa.check” rewrote its description, which is the text the model reads security
- Tool “range.extract” rewrote its description, which is the text the model reads security
- Tool “range.lift” rewrote its description, which is the text the model reads security
- Tool “text.set” rewrote its description, which is the text the model reads security
- Tool “timeline.set_sequence” rewrote its description, which is the text the model reads security
- Tool “title.add” rewrote its description, which is the text the model reads security
- Tool “create.motion” rewrote its description, which is the text the model reads security
- Tool “create.still” rewrote its description, which is the text the model reads security
- Tool “job.cancel” is now declared destructive security
- Schema quality: 221 → 248 ▼ functional
- Server version: 0.27.6 → 0.28.0 functional
- Server version: 0.27.5 → 0.27.6 functional
- Server version: 0.27.4 → 0.27.5 functional
- New tool “create.upscaled” functional
- “clip.replace” added an optional parameter “linked” cosmetic
- “clip.set_speed” added an optional parameter “interpolate” cosmetic
- “create.cutout” added an optional parameter “region” cosmetic
- “job.get” added an optional parameter “result” cosmetic
- “job.get” added an optional parameter “wait_seconds” cosmetic
- “job.list” added an optional parameter “media_id” cosmetic
- “job.list” added an optional parameter “result” cosmetic
- “job.list” added an optional parameter “tool” cosmetic
- “media.analyze” added an optional parameter “cluster_threshold” cosmetic
- “media.analyze” added an optional parameter “percentiles” cosmetic
- “media.analyze” added an optional parameter “regions” cosmetic
- “media.analyze” added an optional parameter “speakers” cosmetic
- “text.set” added an optional parameter “spans” cosmetic
- “title.add” added an optional parameter “spans” cosmetic
- “clip.set_animation” reworded the description of “loop” cosmetic
- “filter.add” reworded the description of “name” cosmetic
- “filter.add” reworded the description of “params” cosmetic
- “judge.ask” reworded the description of “state” cosmetic
- “media.analyze” reworded the description of “at_seconds” cosmetic
- “media.analyze” reworded the description of “every_seconds” cosmetic
- “media.analyze” reworded the description of “from_seconds” cosmetic
- “media.analyze” reworded the description of “kind” cosmetic
- “media.analyze” reworded the description of “model” cosmetic
- “media.analyze” reworded the description of “region” cosmetic
- “media.analyze” reworded the description of “threshold” cosmetic
- “media.analyze” reworded the description of “timeline_id” cosmetic
- “media.analyze” reworded the description of “until_seconds” cosmetic
- “media.get” reworded the description of “from_seconds” cosmetic
- “media.get” reworded the description of “include” cosmetic
- 30 Oct 26 +1
- Server version: 0.27.3 → 0.27.4 functional
- Server version: 0.27.1 → 0.27.3 functional
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Oct 26 0
- Stability: unverified → 0.03 ▲ functional
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 5 Nov 2026 · Probed https://api.cuttingfloor.ai/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.cuttingfloor.ai | CN=YE2,O=Let's Encrypt,C=US | 19 Oct 2026 | 17 Jan 2027 | ECDSA 256 | ECDSA-SHA384 | 50c8d677f68f62714b9d9babf7a5005b14a |
| SANs: api.cuttingfloor.ai | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.cuttingfloor.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | DS published | 1814, 3799 | 8, 8 | Verified |
| cuttingfloor.ai. | No DS | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer error="invalid_token", error_description="Missing Authorization header", resource_metadata="https://api.cuttingfloor.ai/.well-known/oauth-protected-resource/mcp"
Bearer error="invalid_token", error_description="Missing Authorization header", resource_metadata="https://api.cuttingfloor.ai/.well-known/oauth-protected-resource/mcp" Protected resource metadata
| Document | https://api.cuttingfloor.ai/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://api.cuttingfloor.ai/mcp |
| Authorisation server | https://auth.cuttingfloor.ai |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.cuttingfloor.ai/mcp | Verified | 200 | |
| http (plaintext) | http://api.cuttingfloor.ai/mcp | HTTPS enforced | 308 | https://api.cuttingfloor.ai/mcp |
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 →
adjustment.add Add adjustment clip ~139
An empty clip on a video track whose effects (filter.add with its clip_id) change everything below it while it runs: a colour grade or blur over a stretch of the edit. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| at_frame | integer | – | Default: after the last clip on the track |
| duration_frames | integer | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | yes | A video track; the effects reach every track below it |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
audio.fade Fade audio ~98
Fade a clip's sound in from its start and out to its end. null removes a fade. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| in_frames | – | – | – |
| out_frames | – | – | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
audio.set_gain Set gain ~228
Volume of an audio clip (or a video clip's linked audio) in dB; keyframes ride it up and down. The preview is a waveform of the clip; with preview inline it also carries the measured loudness (preview.loudness), a link preview does not. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | An audio clip, or a video clip whose linked audio to change |
| gain_db | – | yes | dB, -60 to 24; 0 leaves it as it is. Keyframes make a ride: the first key holds backward to the clip start, so a ride that begins part-way down must also key its starting level at frame 0 or the fram… |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
audio.set_master Set master ~153
Gain (dB) and limiter ceiling on the whole mix. The ceiling caps sample peaks (dBFS); the true peak between samples can land above it, most on dense, bright sound, and qa.check measures it (dBTP). Audio edits with preview inline carry the measured loudness (preview.loudness); a link preview does not. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| gain_db | – | – | – |
| limit_db | – | – | Limiter ceiling on sample peaks, dBFS |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
audio.set_pan Set pan ~100
Place a clip's sound left (-1) to right (1). Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| pan | – | yes | -1 left, 0 centre, 1 right; null resets |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
caption.add Add captions ~384
Captions on a video track from segments (with optional word timings for highlights), from SRT/VTT text, or in_clip: segments timed in seconds of a clip's media, such as transcript word times, placed where they play. One clip per caption; returns their clip_ids. A style field you leave out takes the published default (video://catalog/text: bold white Inter at 6% of the frame height, near the bottom, with a black outline); timeline.get shows the full style. Lines wrap on their own at style max_width (a fraction of the frame width), balanced in length; \n forces a break. style max_lines caps the lines on screen at once: a longer caption shows a screenful at a time, each from its first word's time. A segment's spans style part of its text (words first_word to last_word, from 0: the timed words, or the text split at spaces), e.g. the key word in yellow. Burned in when exported. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| in_clip | object | – | Segments timed in seconds of a clip's media (e.g. transcript word times), placed where those moments play in the clip, through speed changes; what doesn't play is left out |
| offset_frames | integer | – | Shifts srt/vtt times |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| segments | array | – | – |
| srt | string | – | SubRip text instead of segments |
| style | – | – | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | yes | A video track for the captions, usually the top one |
| vtt | string | – | WebVTT text instead of segments |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.add Add clip ~453
Place media on the timeline. A/V media lands as a linked pair on a video and an audio track. Default: the whole media, after the last clip, overwriting. A picture is scaled to fit the frame (a small logo fills it edge to edge); clip.set_transform {fit: "none"} keeps its own pixel size. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| after_clip_id | string | – | Start where this clip ends (instead of at_frame) |
| at_frame | integer | – | Where the clip starts. Default: after the last clip |
| av | string | – | linked: video and audio as a link group; video or audio: only that part |
| duration_frames | integer | – | Length for stills (default 5 s); ignored when source is given |
| link_track_id | string | – | Track for the other half of a linked clip. Default: the first track of that kind |
| media_id | string | – | Media handle from media.import or a create.* tool |
| mode | string | – | overwrite replaces what is underneath; insert pushes later clips right |
| nested_timeline_id | string | – | Instead of media: nest another timeline as one clip (a compound clip) |
| other_tracks | string | – | What the other tracks do when this edit moves later clips on the clip's own tracks (linked clips always move with it). stay: they don't move, and the result warns which clips there now play early or… |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| source | – | – | Source range in sequence frames, out exclusive. Default: the whole media |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | yes | Track for the clip; a linked A/V clip puts its other half on link_track_id |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.freeze Freeze frame ~244
Hold the frame at at_frame for duration_frames: the clip splits there, a freeze frame goes in, and later clips on its tracks move later. Freezing a clip's last frame holds it after the clip, with silence under the hold. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| at_frame | integer | yes | Timeline frame to hold |
| clip_id | string | yes | – |
| duration_frames | integer | yes | – |
| other_tracks | string | – | What the other tracks do when this edit moves later clips on the clip's own tracks (linked clips always move with it). stay: they don't move, and the result warns which clips there now play early or… |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.link Link clips ~75
Make clips move, trim and split together. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_ids | array | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.move Move clip ~239
Move a clip (and its linked clips) to a frame and optionally another track. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| mode | string | – | overwrite replaces what is underneath; insert pushes later clips right |
| other_tracks | string | – | What the other tracks do when this edit moves later clips on the clip's own tracks (linked clips always move with it). stay: they don't move, and the result warns which clips there now play early or… |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| ripple | boolean | – | Close the gap left behind |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| to_frame | integer | yes | – |
| to_track_id | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.remove Remove clip ~205
Remove a clip and the clips linked to it; ripple closes the gap. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| other_tracks | string | – | What the other tracks do when this edit moves later clips on the clip's own tracks (linked clips always move with it). stay: they don't move, and the result warns which clips there now play early or… |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| ripple | boolean | – | Close the gap by pulling later clips left |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.replace Replace media ~191
Swap the media in a clip, keeping its place, length, speed and look. Starts at source_in (default 0). Its linked clips swap too (linked: false for this clip only); clip_ids lists every clip swapped. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| linked | boolean | – | Also swap its linked clips (its sound, or its picture) onto the new media, keeping their offset, where the new media has that kind; false swaps this clip only |
| media_id | string | yes | Media handle from media.import or a create.* tool |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| source_in | integer | – | Source frame the clip starts at. Default 0 |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.roll Roll edit ~109
Move the cut between a clip and the clip right after it: one gets longer, the other shorter, nothing else moves. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | The clip before the cut |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| to_frame | integer | yes | New position of the cut |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.set_animation Set animation ~198
Entrance, exit and loop presets layered over the clip transform (video://catalog/animations): e.g. in {name: "pop", duration_frames: 12}, loop {name: "float"}; a loop runs the whole clip, or only from_frame to to_frame of it (loop {name: "shake", from_frame: 30, to_frame: 45} for a jolt). null removes one. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| in | – | – | Entrance, from the clip start |
| loop | – | – | Repeats over the clip, or over from_frame to to_frame of it |
| out | – | – | Exit, ending at the clip end |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| placements | array | – | Where each clip the edit moved, cropped, masked or animated shows, sequence pixels |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.set_blend Set blend mode ~102
How a video clip mixes with the tracks below: normal, multiply, screen, overlay and more (video://catalog/blend_modes). Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| mode | string | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.set_enabled Enable/disable clip ~87
A disabled clip stays on the timeline but renders as a gap. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| enabled | boolean | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.set_mask Set mask ~326
Select part of a video clip, then show, hide or fill it: rectangle (rounded), ellipse, linear, mirror, heart, star, polygon or matte (a media's alpha, e.g. a create.cutout), with feather and invert. Several shapes: add. A fill paints the selection from the picture around it and from earlier frames where that area showed, so something that never moves against its background leaves a smudge: nothing ever shows what is behind it. It is a job of its own (job.list shows its progress); a render that needs it names the job until it is done, and an export waits for it. Position, size and rotation animate like transform values. Coordinates are fractions of the clip's fitted frame: a sequence-shaped box with the picture fitted inside (bars where the shapes differ), before the clip's scale and position. A narrower picture fills k = (its aspect / the sequence's) of the box width, centred, so a picture-fraction box maps to x = 0.5 + (x - 0.5) * k, width * k (a wider picture: the same on y and height, with k = the sequence aspect / its). null removes the mask. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| mask | – | yes | null removes the mask |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| placements | array | – | Where each clip the edit moved, cropped, masked or animated shows, sequence pixels |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.set_speed Set speed ~445
Speed up, slow down, ramp or reverse a clip and its linked clips. rate is constant; curve is a speed ramp over the clip. The clip keeps its source and its length changes; ripple (default) moves later clips. Pitch is kept unless preserve_pitch is false. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| curve | array | – | Speed ramp: rates at fractions of the clip as it plays after the change (first at 0, last at 1; 0.5 is halfway through the new length), linear between. timeline.get gives each point its clip frame an… |
| interpolate | string | – | Video, when it shows fewer new frames a second than the sequence (slowed, or a lower frame rate; rate 1 smooths that): none repeats frames; blend crossfades neighbours; motion makes new frames from t… |
| other_tracks | string | – | What the other tracks do when this edit moves later clips on the clip's own tracks (linked clips always move with it). stay: they don't move, and the result warns which clips there now play early or… |
| preserve_pitch | boolean | – | Keep voices at their pitch (default true) |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| rate | number | – | Constant speed: 2 = twice as fast |
| reverse | boolean | – | – |
| ripple | boolean | – | Move later clips as the clip gets longer or shorter |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.set_transform Set transform ~551
Position, scale, rotate, fade, flip, crop or fit a video clip over the tracks below (picture-in-picture, overlays, punch-ins). fit none shows a graphic at its own pixel size, so scale 1 is its real size; the default contain scales it to touch the frame edges. Any number takes a constant or {keyframes: [{frame, value, ease}]} with frames from the clip start; a keyframe's ease shapes the move from it to the next one (sine_in_out, cubic_out, back_out, hold and more). Overlays that must follow a zoom or pan: put the clip and its overlays in a timeline of the same shape, nest it with clip.add {nested_timeline_id} and transform the nested clip, so everything moves together. Omitted fields keep their value; null resets one. To pin an overlay to a moving subject, use media.analyze track boxes as keyframes: for each box, frame = timeline frame of the box time (where the tracked clip plays that media second) minus this clip's start, x = box x + w/2 and y = box y + h/2 (add your offset). That holds when the tracked clip fills the frame as is; if it is scaled, moved or cropped, map the box through its transform first. Skip boxes with found false. The result's placements say where the clip now shows, in sequence pixels: its picture box, the part visible after crop and mask inside the frame, and the source pixels that show there. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| crop | – | – | – |
| fit | – | – | – |
| flip | – | – | – |
| opacity | – | – | Opacity (default 1); 0 to 1 |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| rotation | – | – | Degrees clockwise (default 0); -36000 to 36000 |
| scale | – | – | Size relative to the fit (default 1); 0 to 20 |
| scale_x | – | – | Extra horizontal stretch (default 1); 0 to 20 |
| scale_y | – | – | Extra vertical stretch (default 1); 0 to 20 |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| x | – | – | Centre x, 0 = left edge, 1 = right edge (default 0.5); -4 to 5 |
| y | – | – | Centre y, 0 = top, 1 = bottom (default 0.5); -4 to 5 |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| placements | array | – | Where each clip the edit moved, cropped, masked or animated shows, sequence pixels |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.slide Slide edit ~97
Move a clip between its neighbours: the clip before it and the clip after it change length so nothing else moves. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| to_frame | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.slip Slip edit ~93
Show earlier or later source in a clip without moving or resizing it. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| by_frames | integer | yes | Positive shows later source |
| clip_id | string | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.split Split clip ~89
Cut a clip (and its linked clips) in two at a frame. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| at_frame | integer | yes | – |
| clip_id | string | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.trim Trim clip ~259
Move the start or end edge of a clip. side: video or audio trims one half of a link group (J/L cuts). Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| edge | string | yes | – |
| other_tracks | string | – | What the other tracks do when this edit moves later clips on the clip's own tracks (linked clips always move with it). stay: they don't move, and the result warns which clips there now play early or… |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| ripple | boolean | – | Shift later clips so nothing overlaps and no gap opens |
| side | string | – | Trim only one half of a link group (J/L cuts) |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| to_frame | integer | yes | New timeline position of that edge |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
clip.unlink Unlink clip ~75
Break the link group a clip belongs to. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | yes | – |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
create.cutout Cut out a subject ~263
A subject without its background, local: ProRes 4444 with alpha and the sound, or a PNG, to lay over a new background. subject any (BiRefNet) cuts out products, animals or objects; people (MODNet) is fast enough for long video. region: one item by its bounds, followed; also a clip.set_mask matte. Long-running: a task, or {job_id, media_id} for job.get.
| Name | Type | Req | Description |
|---|---|---|---|
| idempotency_key | string | – | – |
| media_id | string | yes | Media handle from media.import or a create.* tool |
| name | string | – | – |
| region | object | – | The item in this box (top-left x, y, size w, h; fractions) and/or at these points (keep false: not it) at at_seconds, outlined through the video (EdgeTAM, ~0.5 s a frame) |
| smooth | number | – | Video: steadies the edge |
| subject | string | – | people: MODNet, fast, for video of people; any: BiRefNet, any subject (products, animals, objects), about 1 s a frame and 3 GB of memory; auto: any for pictures, people for video |
Structured output declared, but exposes no named fields.
No examples provided.
create.lipsync Lip-sync a video to new speech ~632
Make a person on camera say different words: their mouth is redrawn to match the speech you give (a re-recorded line, a create.voiceover, a word taken from elsewhere in the take). Runs at the user's lip-sync provider on their own key (sync. labs), and the provider bills them for each second sent. To replace a line or swap a word, give range, the span of the video where it is said, and audio (with audio_range) holding just the new words. The result is that span alone, re-synced and carrying the new speech, as long as the speech with sync_mode remap; place it over the original span (clip.add on a track above, or clip.replace) and mute the old words. Send only the span: it costs less and finishes sooner. Lip sync is for when the face stays on screen while the words change. When the speaker is off screen at that moment, or a cutaway (b-roll, the screen being talked about, a reaction) can cover the splice, the cutaway hides the edit without it. Takes minutes. Long-running: a task, or {job_id, media_id} for job.get. The same recipe returns the same media. Provider limits (plan length, credits, file size) come back as limit_exceeded with the provider's error_code.
| Name | Type | Req | Description |
|---|---|---|---|
| audio | string | yes | The speech they should say: audio media, or a video whose sound is used (e.g. create.voiceover, a re-recorded line) |
| audio_range | object | – | Only this span of the audio, in the audio's seconds. Default: all of it |
| idempotency_key | string | – | – |
| model | string | – | The provider's model: lipsync-2 (the cheapest, about $0.05 a second), lipsync-2-pro (finer teeth, beards and detail), sync-3 (close-ups, profiles, hands or mics in front of the mouth; about $0.13 a s… |
| name | string | – | – |
| provider | string | – | sync: sync. labs (sync.so), with the user's SYNC_API_KEY |
| range | object | – | Only this span of the video, in the video's seconds (e.g. the sentence or word being replaced). The result is that span alone, re-synced; place it over the same span on the timeline. Default: the who… |
| sync_mode | string | – | When the picture and the speech differ in length. remap: the picture is sped up or slowed to the speech (result as long as the speech); cut_off: the longer one is cut (as long as the shorter); silenc… |
| video | string | yes | The video of the person speaking, whose mouth is redrawn |
Structured output declared, but exposes no named fields.
No examples provided.
create.matte Create a matte ~125
A solid or gradient picture (PNG, any length on a timeline): backgrounds, slugs, colour washes with clip.set_blend. Gradients work like CSS: angle 180 runs top to bottom; radial reaches the corners; colours may carry alpha (#RRGGBBAA). Long-running like every create.* tool, but quick.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | A solid colour |
| gradient | object | – | – |
| height | integer | – | – |
| idempotency_key | string | – | – |
| name | string | – | – |
| width | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
create.motion Create a motion graphic ~368
Render animated HTML to a video with alpha, frame-exactly: lower thirds, animated titles, callouts, logo stings, kinetic type, generated graphics. Place the media_id with clip.add on a track above the video. Up to 60 s, and width × height × fps × seconds up to 30 s of 1080p30. Runs in the sandbox: no network (inline everything, load libraries from lib/; assets are for imported files the page must show as they are, like the user's logo or a font), fixed memory and time limits. To match a reference you were shown, rebuild it in HTML/SVG; it does not need importing. The result's warnings list what went wrong in the page: uncaught errors, console errors, files blocked or not found. Long-running: returns a task, or {job_id, media_id} for job.get. The same recipe returns the same media.
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | – | – |
| duration_seconds | number | yes | – |
| fps | number | – | – |
| height | integer | – | – |
| html | string | yes | An animated HTML page or fragment laid out at width × height. Anything that animates in a browser renders frame-exactly: CSS animations and transitions, the Web Animations API, SVG, requestAnimationF… |
| idempotency_key | string | – | – |
| name | string | – | – |
| transparent | boolean | – | Alpha (ProRes 4444) so it composites over video; false gives H.264 |
| width | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
create.stabilized Steady shaky video ~258
A steadied copy of shaky video, local (vid.stab): one pass measures the camera shake over the whole media, a second moves each frame against a smoothed camera path. New media, ProRes with the sound, to put on the timeline in place of the shaky clip (clip.replace keeps its place and timing). Long-running: a task, or {job_id, media_id} for job.get.
| Name | Type | Req | Description |
|---|---|---|---|
| edges | string | – | What fills the edges steadying moves into view. zoom: one zoom for the whole video, enough to hide them; adaptive_zoom: as little zoom as each moment needs; black: no zoom, black edges; keep: no zoom… |
| idempotency_key | string | – | – |
| media_id | string | yes | Video to steady |
| name | string | – | – |
| shakiness | integer | – | How shaky the footage is: 1 a little, 10 a lot |
| smoothing | integer | – | Frames each side the camera path is smoothed over: more is steadier but follows intended moves (pans) more slowly |
| tripod | boolean | – | Hold the picture still against its first frame, as if on a tripod |
Structured output declared, but exposes no named fields.
No examples provided.
create.stems Separate voice and music ~367
The sound of a video or audio file pulled apart into stems, each new audio media for clip.add: vocals (voices, spoken or sung), drums, bass, other (everything else: guitars, keys, effects, room noise) and no_vocals (all but the voice, in one file). Laid together at the same time, the four stems make the original sound again. Use it to keep only the voice (lose the music under an interview: vocals), keep only the music (take the voice out of a clip: no_vocals), turn the music down under speech (vocals and no_vocals on their own tracks, with their own gain), or take a beat or a bass line on its own. Demucs v4 (htdemucs), local, on the CPU: about a fifth of the media's length on 8 cores (a minute of sound in about 15 s). Built for music; on speech with background noise, vocals keeps the voice and other takes most of the noise. Media up to 3 hours. Each stem is a 32-bit float WAV, 44.1 kHz stereo, as long as the original; the same media and stems give the same media again while they last. Long-running: a task, or a job_id for job.get.
| Name | Type | Req | Description |
|---|---|---|---|
| idempotency_key | string | – | – |
| media_id | string | yes | Video or audio with sound |
| name | string | – | – |
| stems | array | – | vocals: voices, spoken or sung; drums, bass, other: the rest, by kind (other holds everything else: guitars, keys, effects, room noise); no_vocals: all but the voice in one file. Each becomes its own… |
Structured output declared, but exposes no named fields.
No examples provided.
create.still Create a still ~239
Render an HTML page to a PNG: title and end cards, thumbnails, overlays, designed text. Transparent where nothing is painted. Capture waits for fonts, and for window.__ready if the page sets it to a promise (up to 10 s). Runs in the sandbox: no network (inline everything, load libraries from lib/; assets are for imported files the page must show as they are, like the user's logo or a font), fixed memory and time limits. To match a reference you were shown, rebuild it in HTML/SVG; it does not need importing. The result's warnings list what went wrong in the page: uncaught errors, console errors, files blocked or not found. Long-running: returns a task, or {job_id, media_id} for job.get.
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | – | – |
| height | integer | – | – |
| html | string | yes | An HTML page or fragment, laid out at width × height |
| idempotency_key | string | – | – |
| name | string | – | – |
| transparent | boolean | – | Unpainted areas stay transparent |
| width | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
create.upscaled Add resolution ~238
A larger copy of low-resolution video or an image with detail drawn in, local: Real-ESRGAN (realesr-general-x4v3, on the CPU) makes each frame four times the size, then it is resized to scale. Slow: on 8 cores about 1 s a frame for 320x180, 2.5 s for 640x360. Sources up to 1280x720, results up to 3840 px on the long edge. New media (ProRes with the sound, or a PNG) to put in place of the original (clip.replace keeps its place and timing). Long-running: a task, or {job_id, media_id} for job.get.
| Name | Type | Req | Description |
|---|---|---|---|
| denoise | string | – | How much noise and compression blocking is cleaned while detail is drawn in: light keeps grain and fine texture, strong gives the smoothest picture |
| idempotency_key | string | – | – |
| media_id | string | yes | Video or image to enlarge |
| name | string | – | – |
| scale | number | – | How many times wider and taller the result is |
Structured output declared, but exposes no named fields.
No examples provided.
create.voiceover Create a voiceover ~135
English text spoken by a natural voice (Kokoro, local; the model downloads once) as WAV media. words (default) times each word into the media transcript (media.get include transcript). Long-running: a task, or {job_id, media_id} for job.get.
| Name | Type | Req | Description |
|---|---|---|---|
| idempotency_key | string | – | – |
| name | string | – | – |
| speed | number | – | – |
| text | string | yes | What to say, in English |
| voice | string | – | a/b: American/British; f/m: female/male |
| words | boolean | – | Time each word |
Structured output declared, but exposes no named fields.
No examples provided.
edit.batch Batch edit ~161
Apply many edits as one change: one new timeline_id, one preview. All apply or none do. Use {"$ref":"ops[N].clip_id"} (or track_id, clip_ids[M]) to use an id an earlier op made. Returns the edit result plus results: [{tool, clip_id?, clip_ids?, track_id?}] per op.
| Name | Type | Req | Description |
|---|---|---|---|
| ops | array | yes | Edits applied in order as one change. An arg may be {"$ref":"ops[2].clip_id"} to use an id made by an earlier op |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| placements | array | – | Where each clip the edit moved, cropped, masked or animated shows, sequence pixels |
| preview | – | yes | – |
| results | array | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
export.timeline Export timeline ~302
Write the edit for another editor: fcpxml (Final Cut Pro, DaVinci Resolve), otio (Premiere, Resolve, OpenTimelineIO apps), edl (CMX 3600, one video track), or srt/vtt (the captions). Best effort: warnings lists what the format could not carry (masks, blend modes, effects, animated transforms, ramps, text styling). timeline.get is the lossless copy. media reference (default) points at the media where this server keeps it, which another machine cannot open and which goes 7 days after last use (the result warns); media collect makes a .zip with the media files next to the timeline file, to hand the edit on. Long-running: a task, or {job_id} for job.get; the result has a signed download URL.
| Name | Type | Req | Description |
|---|---|---|---|
| filename | string | – | Output file name without extension. Default: timeline name and id |
| format | string | yes | fcpxml: Final Cut Pro, Resolve; otio: Premiere, Resolve, any OTIO app; edl: CMX 3600; srt/vtt: captions |
| idempotency_key | string | – | – |
| media | string | – | reference: point at the media where it is; collect: a .zip with the media in it |
| overwrite | boolean | – | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
Structured output declared, but exposes no named fields.
No examples provided.
export.video Export video ~414
Render the timeline to a file. Presets: web_1080p_h264 (MP4, fits 1920x1080), master_prores_422hq (MOV, sequence size), social_9x16_h264 (9:16 sequences, 1080x1920), web_1080p_av1 (MP4, AV1/Opus), gif (640 px, 15 fps), review_h264 (MP4, fits 854x854 with sound: small and quick, to watch a cut), audio_wav_48k, audio_mp3. overrides changes size, fps, bitrate or crf (video://catalog/presets). Long-running: returns a task, or {job_id} for job.get. The result links the file (a resource_link to video://jobs/{job_id}/output, which reads as the file, or its signed URL when large), has a signed download URL and a page_url that plays it in any browser (the link to give a person to watch or share), both working for 24 h (job.get gives fresh ones) . The server keeps the file 7 days: to keep it longer, save it from the url, and media.import it to use it again. qa.check measures a render (gaps, frames, loudness) before you export. sha256 and fingerprint tell two renders apart without downloading them (fingerprint matches media.get of the file once imported).
| Name | Type | Req | Description |
|---|---|---|---|
| filename | string | – | Output file name without extension. Default: timeline name and id |
| idempotency_key | string | – | – |
| overrides | object | – | Change the preset: a size box (aspect kept), frame rate, bitrate or quality |
| overwrite | boolean | – | – |
| preset | string | yes | video://catalog/presets lists each with what it takes |
| range | object | – | Frames, end exclusive |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
Structured output declared, but exposes no named fields.
No examples provided.
filter.add Add effect ~296
Apply an effect to a clip, every clip on a track, or the whole timeline: picture effects (colour, LUT, blur, vignette, chroma key, glitch, denoise and more) on video, sound effects (EQ, compressor, noise_reduction, voice_denoise, pitch and more) on audio. Order matters: effects run in the order added (a track's before a clip's own). Picture numbers take keyframes, except glitch, denoise and chroma_key tolerance; sound params are constants. A wrong name or param is refused with the full list, ranges, units and defaults (also at video://catalog/effects); timeline.get shows every param applied. Returns its id as clip_id. Returns the edit result (see the server instructions).
| Name | Type | Req | Description |
|---|---|---|---|
| clip_id | string | – | Apply to one clip (or an adjustment clip) |
| name | string | yes | – |
| params | object | – | The effect's own params; any left out take their defaults. A wrong one is refused with the effect's params, ranges, units and defaults |
| preview | string | – | inline: image in the result; link: URI that renders on read; none |
| timeline | boolean | – | Or true for the whole picture or mix |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | Or to every clip on a track |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | array | yes | – |
| clip_id | string | – | – |
| clip_ids | array | – | – |
| parent | string | yes | Timeline handle; every edit returns a new one |
| preview | – | yes | – |
| timeline_id | string | yes | Timeline handle; every edit returns a new one |
| track_id | string | – | – |
| warnings | array | yes | – |
No examples provided.
How do I install the cuttingfloor MCP server?
cuttingfloor is a hosted endpoint at https://api.cuttingfloor.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.cuttingfloor.ai
claude mcp add --transport http mvp2o-ai-cuttingfloor 'https://api.cuttingfloor.ai/mcp'
What is the cuttingfloor MCP server?
cuttingfloor is an MCP server listed in the public MCP registry as io.github.Mvp2o-ai/cuttingfloor. Hosted video editing for AI agents: cut, caption, mix and export real video. Sign in with OAuth. This page covers its hosted endpoint (https://api.cuttingfloor.ai/mcp).
Is the cuttingfloor MCP server safe to use?
cuttingfloor scores 81 out of 100 on VerifyMCP. 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 cuttingfloor MCP server expose?
cuttingfloor exposes 72 tools: timeline.create, timeline.get, timeline.load, timeline.history, timeline.diff, and 67 more. Their descriptions and schemas cost roughly 19,313 tokens of context every time the server is loaded.
Does the cuttingfloor MCP server require authentication?
Yes. cuttingfloor asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the cuttingfloor MCP server still maintained?
cuttingfloor is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the cuttingfloor MCP server?
VerifyMCP ran 14 checks on cuttingfloor, covering TLS certificate, Authorization, HTTPS, HSTS header and 10 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.