{"data":{"name":"io.github.Mvp2o-ai/cuttingfloor","title":"cuttingfloor","description":"Hosted video editing for AI agents: cut, caption, mix and export real video. Sign in with OAuth.","version":"0.30.0","websiteUrl":"https://cuttingfloor.ai","repositoryUrl":"https://github.com/Mvp2o-ai/cuttingfloor","remotes":[{"type":"streamable-http","url":"https://api.cuttingfloor.ai/mcp"}],"packages":[],"status":"active","isLatest":true,"publishedAt":"2026-11-02T23:23:56.404Z","updatedAt":"2026-11-02T23:23:56.404Z","source":"official-registry","verification":"official","confidence":100,"stars":null,"sources":[{"source":"official-registry","sourceId":"io.github.Mvp2o-ai/cuttingfloor","verification":"official","confidence":100,"stars":null,"updatedAt":"2026-11-02T23:23:56.404Z","title":"cuttingfloor","description":"Hosted video editing for AI agents: cut, caption, mix and export real video. Sign in with OAuth.","websiteUrl":"https://cuttingfloor.ai","repositoryUrl":"https://github.com/Mvp2o-ai/cuttingfloor"}],"toolIndex":{"tools":[{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"adjustment.add","title":"Add adjustment clip","description":"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).","inputSchema":{"type":"object","properties":{"track_id":{"type":"string","description":"A video track; the effects reach every track below it"},"at_frame":{"description":"Default: after the last clip on the track","type":"integer","minimum":0},"duration_frames":{"type":"integer","exclusiveMinimum":0,"maximum":10000000},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["track_id","duration_frames","timeline_id"]},"annotations":{"title":"Add adjustment clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"3b1eb6a6c3b50e5e06b15cc844436bf0ff6dc7c926c032f2dfcab6db697afeae","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"audio.fade","title":"Fade audio","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"in_frames":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":1000000},{"type":"null"}]},"out_frames":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":1000000},{"type":"null"}]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","timeline_id"]},"annotations":{"title":"Fade audio","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"3718b807af2909f03545a449b0cdce0d82bfc2dd2721695d30e15331a6845ff2","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"audio.set_gain","title":"Set gain","description":"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 the measured loudness. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string","description":"An audio clip, or a video clip whose linked audio to change"},"gain_db":{"description":"dB, -60 to 24; 0 leaves it as it is; keyframes for rides","$ref":"#/$defs/Animatable"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","gain_db","timeline_id"],"$defs":{"Animatable":{"anyOf":[{"type":"number"},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":-1000000,"maximum":100000000},"value":{"type":"number"},"ease":{"type":"string"}},"required":["frame","value"]},"description":"frame is relative to the clip start; ease from video://catalog/eases"}},"required":["keyframes"]},{"type":"null"}]}}},"annotations":{"title":"Set gain","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"84be436ab23df56d4b9c18982b07a2280d8732740a97dec2450b9ac5affceedc","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"audio.set_master","title":"Set master","description":"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 preview with the measured loudness. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"gain_db":{"anyOf":[{"type":"number","minimum":-60,"maximum":40},{"type":"null"}]},"limit_db":{"description":"Limiter ceiling on sample peaks, dBFS","anyOf":[{"type":"number","minimum":-20,"maximum":0},{"type":"null"}]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["timeline_id"]},"annotations":{"title":"Set master","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"6aca1246f8f65a22b9673b2daa8cb7f4584b0d7e659dc500d781507e3afdae7e","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"audio.set_pan","title":"Set pan","description":"Place a clip's sound left (-1) to right (1). Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"pan":{"anyOf":[{"type":"number","minimum":-1,"maximum":1},{"type":"null"}],"description":"-1 left, 0 centre, 1 right; null resets"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","pan","timeline_id"]},"annotations":{"title":"Set pan","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"9794e687364ca49015186b1b3a90a50cc7de23e767d18fed952f593f05aa49eb","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"caption.add","title":"Add captions","description":"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. Burned in when exported. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"track_id":{"type":"string","description":"A video track for the captions, usually the top one"},"segments":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"start_frame":{"type":"integer","minimum":0},"end_frame":{"type":"integer","minimum":0},"text":{"type":"string","minLength":1,"maxLength":2000},"words":{"description":"Word timings for highlights, timeline frames","maxItems":500,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":200},"start_frame":{"type":"integer","minimum":0},"end_frame":{"type":"integer","minimum":0}},"required":["text","start_frame","end_frame"]}}},"required":["start_frame","end_frame","text"]}},"in_clip":{"description":"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","type":"object","properties":{"clip_id":{"type":"string"},"segments":{"minItems":1,"maxItems":5000,"type":"array","items":{"type":"object","properties":{"start":{"type":"number","minimum":0},"end":{"type":"number","minimum":0},"text":{"type":"string","minLength":1,"maxLength":2000},"words":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":200},"start":{"type":"number","minimum":0},"end":{"type":"number","minimum":0}},"required":["text","start","end"]}}},"required":["start","end","text"]}}},"required":["clip_id","segments"]},"srt":{"description":"SubRip text instead of segments","type":"string","maxLength":2000000},"vtt":{"description":"WebVTT text instead of segments","type":"string","maxLength":2000000},"offset_frames":{"default":0,"description":"Shifts srt/vtt times","type":"integer","minimum":-1000000,"maximum":1000000},"style":{"$ref":"#/$defs/TextStyle"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["track_id","timeline_id"],"$defs":{"TextStyle":{"type":"object","properties":{"font":{"description":"video://catalog/fonts","type":"string","minLength":1,"maxLength":100},"font_media_id":{"description":"An imported font","type":"string","pattern":"^m_[0-9a-z]{26}$"},"size":{"description":"Of frame height","type":"number","minimum":0.005,"maximum":1},"color":{"type":"string"},"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"align":{"type":"string","enum":["left","center","right"]},"x":{"type":"number","minimum":-1,"maximum":2},"y":{"type":"number","minimum":-1,"maximum":2},"anchor":{"type":"string","enum":["top","middle","bottom"]},"max_width":{"type":"number","minimum":0.05,"maximum":1},"letter_spacing":{"type":"number","minimum":-0.5,"maximum":2},"outline":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"width":{"type":"number","minimum":0,"maximum":0.5}},"required":["color","width"]},{"type":"null"}]},"shadow":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"distance":{"type":"number","minimum":0,"maximum":0.5},"blur":{"type":"number","minimum":0,"maximum":0.5}},"required":["color","distance"]},{"type":"null"}]},"box":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"padding":{"type":"number","minimum":0,"maximum":1}},"required":["color","padding"]},{"type":"null"}]},"highlight":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["none","fill","word","karaoke","pop"]},"color":{"type":"string"}},"required":["mode","color"]},{"type":"null"}]},"reveal":{"type":"string","enum":["none","typewriter","word_fade","word_pop"]},"reveal_frames":{"type":"integer","minimum":1,"maximum":10000}}}}},"annotations":{"title":"Add captions","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"6f4a51b5647b16bf80762e80ba4bbc9f234258025cfe834420ee6c0cadc437d1","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.add","title":"Add clip","description":"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).","inputSchema":{"type":"object","properties":{"track_id":{"type":"string","description":"Track for the clip; a linked A/V clip puts its other half on link_track_id"},"media_id":{"type":"string","pattern":"^m_[0-9a-z]{26}$","description":"Media handle from media.import or a create.* tool"},"nested_timeline_id":{"description":"Instead of media: nest another timeline as one clip (a compound clip)","type":"string","pattern":"^tl_[0-9a-f]{32}$"},"at_frame":{"description":"Where the clip starts. Default: after the last clip","type":"integer","minimum":0},"after_clip_id":{"description":"Start where this clip ends (instead of at_frame)","type":"string"},"source":{"description":"Source range in sequence frames, out exclusive. Default: the whole media","anyOf":[{"type":"object","properties":{"in":{"type":"integer","minimum":0},"out":{"type":"integer","minimum":0}},"required":["in","out"]},{"type":"object","properties":{"words":{"type":"array","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":0}],"items":false,"minItems":2,"maxItems":2}},"required":["words"],"description":"Transcript words i to j (inclusive), from media.get include transcript"}]},"duration_frames":{"description":"Length for stills (default 5 s); ignored when source is given","type":"integer","exclusiveMinimum":0},"av":{"default":"linked","description":"linked: video and audio as a link group; video or audio: only that part","type":"string","enum":["linked","video","audio"]},"link_track_id":{"description":"Track for the other half of a linked clip. Default: the first track of that kind","type":"string"},"mode":{"default":"overwrite","description":"overwrite replaces what is underneath; insert pushes later clips right","type":"string","enum":["overwrite","insert"]},"other_tracks":{"default":"stay","description":"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 late. sync: they get the same change, so titles, overlays and sound stay in step: time taken out here comes out of them too (like range.extract), time added here opens the same gap in them (clips crossing that point are split, as insert does). Locked tracks always stay","type":"string","enum":["stay","sync"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["track_id","timeline_id"]},"annotations":{"title":"Add clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"d7c1ea00391c0995caaa4dd67fffb2116f66ef227a613afc0b59db612193b94e","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.freeze","title":"Freeze frame","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"at_frame":{"type":"integer","minimum":0,"description":"Timeline frame to hold"},"duration_frames":{"type":"integer","exclusiveMinimum":0,"maximum":1000000},"other_tracks":{"default":"stay","description":"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 late. sync: they get the same change, so titles, overlays and sound stay in step: time taken out here comes out of them too (like range.extract), time added here opens the same gap in them (clips crossing that point are split, as insert does). Locked tracks always stay","type":"string","enum":["stay","sync"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","at_frame","duration_frames","timeline_id"]},"annotations":{"title":"Freeze frame","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"a84216a497811739daa98dbffd39aa092e6bdb47aeeab6ddabee3586cde7a6ab","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.link","title":"Link clips","description":"Make clips move, trim and split together. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_ids":{"minItems":2,"type":"array","items":{"type":"string"}},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_ids","timeline_id"]},"annotations":{"title":"Link clips","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"9fb26cf9bdbbb81b9250bcbec5d00f701b791b243bfb92eb255af666ba255558","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.move","title":"Move clip","description":"Move a clip (and its linked clips) to a frame and optionally another track. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"to_frame":{"type":"integer","minimum":0},"to_track_id":{"type":"string"},"mode":{"default":"overwrite","description":"overwrite replaces what is underneath; insert pushes later clips right","type":"string","enum":["overwrite","insert"]},"ripple":{"default":false,"description":"Close the gap left behind","type":"boolean"},"other_tracks":{"default":"stay","description":"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 late. sync: they get the same change, so titles, overlays and sound stay in step: time taken out here comes out of them too (like range.extract), time added here opens the same gap in them (clips crossing that point are split, as insert does). Locked tracks always stay","type":"string","enum":["stay","sync"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","to_frame","timeline_id"]},"annotations":{"title":"Move clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"24c034c8c88fecbf946fac6a4477ea4424ad66e2780dbbe5823987bbe9f658ed","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.remove","title":"Remove clip","description":"Remove a clip and the clips linked to it; ripple closes the gap. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"ripple":{"default":false,"description":"Close the gap by pulling later clips left","type":"boolean"},"other_tracks":{"default":"stay","description":"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 late. sync: they get the same change, so titles, overlays and sound stay in step: time taken out here comes out of them too (like range.extract), time added here opens the same gap in them (clips crossing that point are split, as insert does). Locked tracks always stay","type":"string","enum":["stay","sync"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","timeline_id"]},"annotations":{"title":"Remove clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"a499d795a078e030cc0936a86a02dd847fd1bf8f0c1fb01ee0da7b81d747f637","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.replace","title":"Replace media","description":"Swap the media in a clip, keeping its place, length, speed and look. Starts at source_in (default 0). Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"media_id":{"type":"string","pattern":"^m_[0-9a-z]{26}$","description":"Media handle from media.import or a create.* tool"},"source_in":{"description":"Source frame the clip starts at. Default 0","type":"integer","minimum":0},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","media_id","timeline_id"]},"annotations":{"title":"Replace media","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"615435358e4b8c3da9af244005304c5e7c14cd7477f76a080d6fefd8aff0ed09","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.roll","title":"Roll edit","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string","description":"The clip before the cut"},"to_frame":{"type":"integer","minimum":0,"description":"New position of the cut"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","to_frame","timeline_id"]},"annotations":{"title":"Roll edit","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"13e8dbd2fb030901dd8024a8da2f56312bee52f2ca669752dd54870d0e034b87","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.set_animation","title":"Set animation","description":"Entrance, exit and loop presets layered over the clip transform (video://catalog/animations): e.g. in {name: \"pop\", duration_frames: 12}, loop {name: \"float\"}. null removes one. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"in":{"description":"Entrance, from the clip start","anyOf":[{"type":"object","properties":{"name":{"type":"string","enum":["fade","zoom_in","zoom_out","slide_left","slide_right","slide_up","slide_down","pop","spin","drop"]},"duration_frames":{"type":"integer","exclusiveMinimum":0,"maximum":100000}},"required":["name","duration_frames"]},{"type":"null"}]},"out":{"description":"Exit, ending at the clip end","anyOf":[{"type":"object","properties":{"name":{"type":"string","enum":["fade","zoom_in","zoom_out","slide_left","slide_right","slide_up","slide_down","pop","spin","drop"]},"duration_frames":{"type":"integer","exclusiveMinimum":0,"maximum":100000}},"required":["name","duration_frames"]},{"type":"null"}]},"loop":{"description":"Repeats for the whole clip","anyOf":[{"type":"object","properties":{"name":{"type":"string","enum":["pulse","sway","shake","float","spin","flicker"]},"period_frames":{"type":"integer","exclusiveMinimum":0,"maximum":100000},"strength":{"default":1,"type":"number","minimum":0,"maximum":5}},"required":["name"]},{"type":"null"}]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","timeline_id"]},"annotations":{"title":"Set animation","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"ce655adbfec03939ee66b9e5df293c8a157e2787cc1ed492f3c96afcdf56ba36","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.set_blend","title":"Set blend mode","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"mode":{"type":"string","enum":["normal","add","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","exclusion"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","mode","timeline_id"]},"annotations":{"title":"Set blend mode","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"a19e9af23347650ab5f4155ffd7c4af536baf88d8655c509c38ad48069dbd24d","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.set_enabled","title":"Enable/disable clip","description":"A disabled clip stays on the timeline but renders as a gap. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"enabled":{"type":"boolean"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","enabled","timeline_id"]},"annotations":{"title":"Enable/disable clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"e330ca74047bcedf997a0f74a5b2d5f5cf71e59ab90637a388762ee3dae70672","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.set_mask","title":"Set mask","description":"Show only part of a video clip: rectangle (rounded), ellipse, linear, mirror, heart, star or polygon, with feather and invert. Position, size, rotation and feather animate like transform values. null removes the mask. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"mask":{"anyOf":[{"type":"object","properties":{"shape":{"type":"string","enum":["rectangle","ellipse","linear","mirror","heart","star","polygon"]},"x":{"description":"Mask centre x in the clip picture, 0–1 (default 0.5); -4 to 5","$ref":"#/$defs/Animatable"},"y":{"description":"Mask centre y in the clip picture, 0–1 (default 0.5); -4 to 5","$ref":"#/$defs/Animatable"},"width":{"description":"Fraction of the picture width (default 0.5); 0 to 10","$ref":"#/$defs/Animatable"},"height":{"description":"Fraction of the picture height (default 0.5); band thickness for mirror; 0 to 10","$ref":"#/$defs/Animatable"},"rotation":{"description":"Degrees clockwise; for linear, the edge angle; -36000 to 36000","$ref":"#/$defs/Animatable"},"feather":{"description":"Soft edge as a fraction of the picture short side","type":"number","minimum":0,"maximum":0.5},"corner_radius":{"description":"rectangle: corner radius as a fraction of its short side","type":"number","minimum":0,"maximum":0.5},"invert":{"description":"Keep the outside instead","type":"boolean"},"points":{"description":"polygon: [x, y] corners in the clip picture, 0–1","minItems":3,"maxItems":64,"type":"array","items":{"type":"array","prefixItems":[{"type":"number","minimum":-4,"maximum":5},{"type":"number","minimum":-4,"maximum":5}],"items":false,"minItems":2,"maxItems":2}}},"required":["shape"]},{"type":"null"}],"description":"null removes the mask"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","mask","timeline_id"],"$defs":{"Animatable":{"anyOf":[{"type":"number"},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":-1000000,"maximum":100000000},"value":{"type":"number"},"ease":{"type":"string"}},"required":["frame","value"]},"description":"frame is relative to the clip start; ease from video://catalog/eases"}},"required":["keyframes"]},{"type":"null"}]}}},"annotations":{"title":"Set mask","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"825e577c0203f85cd8eb602185e97195315801a5ac789328f03b96897a8c338f","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.set_speed","title":"Set speed","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"rate":{"description":"Constant speed: 2 = twice as fast","type":"number","minimum":0.05,"maximum":100},"curve":{"description":"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 and source frame","minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"at":{"type":"number","minimum":0,"maximum":1},"rate":{"type":"number","minimum":0.05,"maximum":100}},"required":["at","rate"]}},"reverse":{"type":"boolean"},"preserve_pitch":{"description":"Keep voices at their pitch (default true)","type":"boolean"},"ripple":{"default":true,"description":"Move later clips as the clip gets longer or shorter","type":"boolean"},"other_tracks":{"default":"stay","description":"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 late. sync: they get the same change, so titles, overlays and sound stay in step: time taken out here comes out of them too (like range.extract), time added here opens the same gap in them (clips crossing that point are split, as insert does). Locked tracks always stay","type":"string","enum":["stay","sync"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","timeline_id"]},"annotations":{"title":"Set speed","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"1ab192b34461b62a571c86ddf7e977c2fe95d86ed69c8a26b8ff3257bdcbc322","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.set_transform","title":"Set transform","description":"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; eases are listed at video://catalog/eases. 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. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"x":{"description":"Centre x, 0 = left edge, 1 = right edge (default 0.5); -4 to 5","$ref":"#/$defs/Animatable"},"y":{"description":"Centre y, 0 = top, 1 = bottom (default 0.5); -4 to 5","$ref":"#/$defs/Animatable"},"scale":{"description":"Size relative to the fit (default 1); 0 to 20","$ref":"#/$defs/Animatable"},"scale_x":{"description":"Extra horizontal stretch (default 1); 0 to 20","$ref":"#/$defs/Animatable"},"scale_y":{"description":"Extra vertical stretch (default 1); 0 to 20","$ref":"#/$defs/Animatable"},"rotation":{"description":"Degrees clockwise (default 0); -36000 to 36000","$ref":"#/$defs/Animatable"},"opacity":{"description":"Opacity (default 1); 0 to 1","$ref":"#/$defs/Animatable"},"fit":{"anyOf":[{"type":"string","enum":["contain","cover","fill","none"],"description":"contain: whole picture inside the frame, scaled up or down to touch its edges (default); cover: fill the frame, cropping; fill: stretch; none: its own pixels at sequence size, unscaled (a 300 px logo stays 300 px on a 1920 px sequence), for logos and graphics made to size"},{"type":"null"}]},"flip":{"anyOf":[{"type":"string","enum":["none","horizontal","vertical","both"]},{"type":"null"}]},"crop":{"anyOf":[{"type":"object","properties":{"left":{"default":0,"type":"number","minimum":0,"maximum":0.99},"right":{"default":0,"type":"number","minimum":0,"maximum":0.99},"top":{"default":0,"type":"number","minimum":0,"maximum":0.99},"bottom":{"default":0,"type":"number","minimum":0,"maximum":0.99}},"description":"Fractions of the picture hidden from each edge; the rest stays where it was"},{"type":"null"}]},"clip_id":{"type":"string"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","timeline_id"],"$defs":{"Animatable":{"anyOf":[{"type":"number"},{"type":"object","properties":{"keyframes":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"frame":{"type":"integer","minimum":-1000000,"maximum":100000000},"value":{"type":"number"},"ease":{"type":"string"}},"required":["frame","value"]},"description":"frame is relative to the clip start; ease from video://catalog/eases"}},"required":["keyframes"]},{"type":"null"}]}}},"annotations":{"title":"Set transform","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"7bf468ab03edc5067d73b76c011a6e5308bee265209bd6a45289421ea46add20","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.slide","title":"Slide edit","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"to_frame":{"type":"integer","minimum":0},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","to_frame","timeline_id"]},"annotations":{"title":"Slide edit","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"c57dc2091ef77c117d19104a8435bdb2c44309ae8548e8d108bf763bc66ef99c","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.slip","title":"Slip edit","description":"Show earlier or later source in a clip without moving or resizing it. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"by_frames":{"type":"integer","minimum":-10000000,"maximum":10000000,"description":"Positive shows later source"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","by_frames","timeline_id"]},"annotations":{"title":"Slip edit","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"7c456e9e7b0d7814c5f3605082365016b15d9a4068575abc20658c0fce3ee465","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.split","title":"Split clip","description":"Cut a clip (and its linked clips) in two at a frame. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"at_frame":{"type":"integer","minimum":0},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","at_frame","timeline_id"]},"annotations":{"title":"Split clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"fc9cb07c303681d6963f9dd4f17558f1d40c89ca1f629850f3d7724d95cce20d","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.trim","title":"Trim clip","description":"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).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"edge":{"type":"string","enum":["start","end"]},"to_frame":{"type":"integer","minimum":0,"description":"New timeline position of that edge"},"ripple":{"default":false,"description":"Shift later clips so nothing overlaps and no gap opens","type":"boolean"},"side":{"default":"both","description":"Trim only one half of a link group (J/L cuts)","type":"string","enum":["both","video","audio"]},"other_tracks":{"default":"stay","description":"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 late. sync: they get the same change, so titles, overlays and sound stay in step: time taken out here comes out of them too (like range.extract), time added here opens the same gap in them (clips crossing that point are split, as insert does). Locked tracks always stay","type":"string","enum":["stay","sync"]},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","edge","to_frame","timeline_id"]},"annotations":{"title":"Trim clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"3fe8302e2be06d5cec096144ac38ddd5a1e2b67ea42d479a48a5e1b447475b76","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"clip.unlink","title":"Unlink clip","description":"Break the link group a clip belongs to. Returns the edit result (see the server instructions).","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string"},"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]}},"required":["clip_id","timeline_id"]},"annotations":{"title":"Unlink clip","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"eb3fa191d656106d0942247098bd80a8a7dd1fb13cdf893d887f068f2b5d0a16","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"},{"serverName":"io.github.Mvp2o-ai/cuttingfloor","endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","name":"edit.batch","title":"Batch edit","description":"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.","inputSchema":{"type":"object","properties":{"timeline_id":{"type":"string","pattern":"^tl_[0-9a-f]{32}$","description":"Timeline handle; every edit returns a new one"},"preview":{"default":"link","description":"inline: image in the result; link: URI that renders on read; none","type":"string","enum":["inline","link","none"]},"ops":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"tool":{"type":"string","enum":["timeline.set_sequence","track.add","track.remove","track.set","clip.add","clip.remove","clip.move","clip.trim","clip.split","clip.link","clip.unlink","clip.set_enabled","clip.set_speed","clip.freeze","clip.roll","clip.slip","clip.slide","clip.replace","range.lift","range.extract","title.add","caption.add","text.set","audio.set_gain","audio.set_pan","audio.fade","audio.set_master","filter.add","filter.set","filter.remove","adjustment.add","transition.add","transition.set","transition.remove","clip.set_transform","clip.set_blend","clip.set_mask","clip.set_animation"]},"args":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["tool","args"]},"description":"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"}},"required":["timeline_id","ops"]},"annotations":{"title":"Batch edit","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"fec626fa8e0896e787778b219328c23b73736b249a3cc557dd27c1c35664cb57","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-11-01T17:47:11.187Z","metadataTrust":"untrusted"}],"endpoints":[{"endpointFingerprint":"5c7fd6387aabab031a258aca7d9a95db4d71d2086ffa43a9743d10c8f4f78c3d","protocol":"streamable-http","status":"indexed","toolCount":50,"observedAt":"2026-11-01T17:47:11.187Z"}],"authentication":"unknown"},"connectionConfigurations":{"status":"ready","authentication":"not embedded","clients":{"Claude Desktop":{"mcpServers":{"io.github.Mvp2o-ai/cuttingfloor":{"url":"https://api.cuttingfloor.ai/mcp"}}},"Cursor":{"mcpServers":{"io.github.Mvp2o-ai/cuttingfloor":{"url":"https://api.cuttingfloor.ai/mcp"}}},"VS Code":{"servers":{"io.github.Mvp2o-ai/cuttingfloor":{"type":"http","url":"https://api.cuttingfloor.ai/mcp"}}}}},"resourceType":"mcp-server","callable":true,"runtime":{"callable":true,"protocols":["mcp"]},"interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://api.cuttingfloor.ai/mcp"}],"profile":{"apiVersion":"1","schemaVersion":"1","id":"mcp-server:io.github.Mvp2o-ai%2Fcuttingfloor","resourceType":"mcp-server","canonicalUrl":"https://www.agentsjunction.com/api/v1/servers/io.github.Mvp2o-ai%2Fcuttingfloor","name":"io.github.Mvp2o-ai/cuttingfloor","description":"Hosted video editing for AI agents: cut, caption, mix and export real video. Sign in with OAuth.","interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://api.cuttingfloor.ai/mcp"}],"capabilities":[],"identity":{"source":"official-registry","websiteUrl":"https://cuttingfloor.ai","repositoryUrl":"https://github.com/Mvp2o-ai/cuttingfloor","version":"0.30.0"},"verification":{"state":"official","confidence":100},"operations":{"resourceType":"mcp-server","name":"io.github.Mvp2o-ai/cuttingfloor","status":"online","lastCheckedAt":"2026-11-03T18:18:19.036Z","lastSuccessfulCheck":"2026-11-03T18:18:19.036Z","latencyMs":18,"consecutiveFailures":0,"isStale":false,"checks":{"endpointReachable":true,"protocolValid":true,"agentCardValid":null,"mcpHandshakeValid":true},"lastSeen":null,"lastSuccessfulInteraction":null,"lastHealthCheck":"2026-11-03T18:18:19.036Z","source":{"type":"health-check","url":null},"observedAt":"2026-11-03T18:18:19.036Z"},"security":null,"timestamps":{"createdAt":"2026-11-02T23:23:56.404Z","updatedAt":"2026-11-02T23:23:56.404Z","observedAt":"2026-11-03T18:18:19.036Z"},"compatibility":{"serverVersion":"0.30.0","protocolVersions":[{"protocol":"mcp","version":null}]}}}}