{"ok":true,"site":{"host":"rough-cut.samarthsaxena1672003.workers.dev","url":"https://rough-cut.samarthsaxena1672003.workers.dev/","type":"live","desc":"A human-first video editor with structured WebMCP tools for any compatible agent.","tools":[{"name":"request_video_upload","kind":"act","impl":"imperative","description":"Focus and highlight the source-video upload control so the human can click it and choose one local video. Returns human_action_required because browser security requires a user gesture.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/"},{"name":"get_project_state","kind":"answer","impl":"imperative","description":"Read the active project version, duration, ordered clips, transitions, protected ranges, captions, caption style, overlays, background music and B-roll markers. Call before editing.","inputSchema":{"type":"object","properties":{}},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"get_activity","kind":"answer","impl":"imperative","description":"Read a paginated page of recent human, agent and system project activity.","inputSchema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":100}},"required":[],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"rename_project","kind":"act","impl":"imperative","description":"Change the persisted project name used by the editor and default exports.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"name":{"type":"string","description":"New project name"}},"required":["expected_version","name"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"get_transcript","kind":"answer","impl":"imperative","description":"Read a page of word-timestamped transcript for the active source video.","inputSchema":{"type":"object","properties":{"offset":{"type":"number","description":"Zero-based word offset","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":500,"description":"Words to return"}},"required":[],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"search_transcript","kind":"answer","impl":"imperative","description":"Find transcript words matching text and return surrounding word-timestamped context.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Text to find"},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["query"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"inspect_frame","kind":"answer","impl":"imperative","description":"Seek the visible editor to a timeline time and return the displayed frame as JPEG data with its exact time.","inputSchema":{"type":"object","properties":{"timeline_ms":{"type":"number","description":"Timeline position in milliseconds","minimum":0}},"required":[],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"detect_silences","kind":"answer","impl":"imperative","description":"Analyze source audio with FFmpeg and return candidate silent source ranges. This does not edit the timeline.","inputSchema":{"type":"object","properties":{"threshold_db":{"type":"number","minimum":-60,"maximum":-10},"minimum_ms":{"type":"number","minimum":100,"maximum":5000}},"required":[],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"transcribe_video","kind":"act","impl":"imperative","description":"Transcribe the source video with Cloudflare Whisper and save word timestamps. This may take several minutes.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"}},"required":["expected_version"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"split_clip","kind":"act","impl":"imperative","description":"Split one timeline clip at an exact source-media time.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Clip ID from get_project_state"},"source_ms":{"type":"number","description":"Source-media split time in milliseconds","minimum":0}},"required":["expected_version","clip_id","source_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"split_text","kind":"act","impl":"imperative","description":"Split one caption or text-overlay clip at an exact timeline time.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"kind":{"type":"string","enum":["caption","overlay"]},"item_id":{"type":"string","description":"Caption or overlay ID"},"timeline_ms":{"type":"number","description":"Timeline split position","minimum":0}},"required":["expected_version","kind","item_id","timeline_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"split_background_music","kind":"act","impl":"imperative","description":"Split one non-looping A2 music clip at an exact timeline time.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Music clip ID"},"timeline_ms":{"type":"number","description":"Timeline split position","minimum":0}},"required":["expected_version","clip_id","timeline_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"trim_clip","kind":"act","impl":"imperative","description":"Set a clip's source in and out points without rippling later clips.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Clip ID"},"source_in_ms":{"type":"number","description":"New source in","minimum":0},"source_out_ms":{"type":"number","description":"New source out","minimum":0}},"required":["expected_version","clip_id","source_in_ms","source_out_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"delete_clip","kind":"act","impl":"imperative","description":"Delete one entire clip. By default its timeline gap remains; set ripple true to close the removed clip's span. Protected source ranges are rejected.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Clip ID"},"ripple":{"type":"boolean","description":"Shift later clips left to close the removed span"}},"required":["expected_version","clip_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"remove_segments","kind":"act","impl":"imperative","description":"Remove one or more source-media ranges from every matching clip. Protected ranges are rejected.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"ranges":{"type":"array","minItems":1,"items":{"type":"object","properties":{"start_ms":{"type":"number","description":"Start","minimum":0},"end_ms":{"type":"number","description":"End","minimum":0}},"required":["start_ms","end_ms"],"additionalProperties":false}}},"required":["expected_version","ranges"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"reorder_clips","kind":"act","impl":"imperative","description":"Replace timeline clip order atomically and pack clips together without gaps. Include every current clip ID exactly once.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["expected_version","clip_ids"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"move_clip","kind":"act","impl":"imperative","description":"Move a linked video/audio clip to an explicit timeline position. Clips cannot overlap.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Clip ID"},"timeline_start_ms":{"type":"number","description":"Timeline start in milliseconds","minimum":0}},"required":["expected_version","clip_id","timeline_start_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"adjust_clip","kind":"act","impl":"imperative","description":"Adjust a clip's color, X/Y zoom and pan, volume, mute state, speed or edge fades. Omitted properties remain unchanged.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Clip ID"},"brightness":{"type":"number","minimum":-1,"maximum":1},"contrast":{"type":"number","minimum":0,"maximum":2},"saturation":{"type":"number","minimum":0,"maximum":3},"hue":{"type":"number","minimum":-180,"maximum":180},"scale_x":{"type":"number","minimum":0.25,"maximum":4},"scale_y":{"type":"number","minimum":0.25,"maximum":4},"position_x":{"type":"number","minimum":-100,"maximum":100},"position_y":{"type":"number","minimum":-100,"maximum":100},"volume":{"type":"number","minimum":0,"maximum":5},"muted":{"type":"boolean"},"speed":{"type":"number","minimum":0.5,"maximum":2},"fade_in_ms":{"type":"number","description":"Fade-in duration","minimum":0},"fade_out_ms":{"type":"number","description":"Fade-out duration","minimum":0}},"required":["expected_version","clip_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"set_transition","kind":"act","impl":"imperative","description":"Set the transition from one clip into the next: cut, crossfade or fade-black.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Outgoing clip ID"},"type":{"type":"string","enum":["cut","crossfade","fade-black"]},"duration_ms":{"type":"number","description":"Transition duration","minimum":0}},"required":["expected_version","clip_id","type"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"set_captions","kind":"act","impl":"imperative","description":"Replace captions with timed timeline text cues.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"captions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","description":"Caption"},"start_ms":{"type":"number","description":"Timeline start","minimum":0},"end_ms":{"type":"number","description":"Timeline end","minimum":0},"position":{"type":"string","enum":["top","center","bottom"]}},"required":["text","start_ms","end_ms"],"additionalProperties":false}}},"required":["expected_version","captions"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"resync_captions","kind":"act","impl":"imperative","description":"Rebuild captions from the saved word-timestamped transcript and current clip layout without running transcription again. This replaces current captions.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"}},"required":["expected_version"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"add_caption","kind":"act","impl":"imperative","description":"Add one positioned caption without replacing existing captions.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"text":{"type":"string","description":"Caption text"},"start_ms":{"type":"number","description":"Timeline start","minimum":0},"end_ms":{"type":"number","description":"Timeline end","minimum":0},"position":{"type":"string","enum":["top","center","bottom"]}},"required":["expected_version","text","start_ms","end_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"update_caption","kind":"act","impl":"imperative","description":"Edit an existing caption's text, timing or position. Text corrections to generated captions also update their linked transcript words.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"caption_id":{"type":"string","description":"Caption ID"},"text":{"type":"string"},"start_ms":{"type":"number","description":"Timeline start","minimum":0},"end_ms":{"type":"number","description":"Timeline end","minimum":0},"position":{"type":"string","enum":["top","center","bottom"]}},"required":["expected_version","caption_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"set_caption_style","kind":"act","impl":"imperative","description":"Set the shared subtitle size, color, background visibility and background opacity.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"size":{"type":"string","enum":["small","medium","large"]},"color":{"type":"string","enum":["white","yellow","lime"]},"background":{"type":"boolean"},"background_opacity":{"type":"number","minimum":0,"maximum":1}},"required":["expected_version"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"remove_caption","kind":"act","impl":"imperative","description":"Remove one caption by ID.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"caption_id":{"type":"string","description":"Caption ID"}},"required":["expected_version","caption_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"add_text_overlay","kind":"act","impl":"imperative","description":"Add a positioned text overlay at timeline timestamps.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"text":{"type":"string","description":"Overlay text"},"start_ms":{"type":"number","description":"Timeline start","minimum":0},"end_ms":{"type":"number","description":"Timeline end","minimum":0},"position":{"type":"string","enum":["top","center","bottom"]},"font_size":{"type":"number","description":"Font size","minimum":0},"color":{"type":"string","enum":["white","yellow","lime"]},"background":{"type":"boolean"}},"required":["expected_version","text","start_ms","end_ms"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"update_text_overlay","kind":"act","impl":"imperative","description":"Edit an existing text overlay's text, timing or position.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"overlay_id":{"type":"string","description":"Overlay ID"},"text":{"type":"string"},"start_ms":{"type":"number","description":"Timeline start","minimum":0},"end_ms":{"type":"number","description":"Timeline end","minimum":0},"position":{"type":"string","enum":["top","center","bottom"]},"font_size":{"type":"number","description":"Font size","minimum":0},"color":{"type":"string","enum":["white","yellow","lime"]},"background":{"type":"boolean"}},"required":["expected_version","overlay_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"remove_text_overlay","kind":"act","impl":"imperative","description":"Remove one text overlay by ID.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"overlay_id":{"type":"string","description":"Overlay ID"}},"required":["expected_version","overlay_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"request_background_music_upload","kind":"act","impl":"imperative","description":"Switch to the Music tab and highlight the upload control so the human can choose a local audio file. Returns human_action_required because browser security requires a user gesture.","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"adjust_background_music","kind":"act","impl":"imperative","description":"Adjust the uploaded A2 background-music track. The human must upload the audio asset first.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Music clip ID"},"timeline_start_ms":{"type":"number","description":"Timeline start","minimum":0},"source_in_ms":{"type":"number","description":"Music source in","minimum":0},"source_out_ms":{"type":"number","description":"Music source out","minimum":0},"speed":{"type":"number","minimum":0.5,"maximum":2},"volume":{"type":"number","minimum":0,"maximum":5},"muted":{"type":"boolean"},"fade_in_ms":{"type":"number","description":"Fade in","minimum":0},"fade_out_ms":{"type":"number","description":"Fade out","minimum":0},"loop":{"type":"boolean"}},"required":["expected_version","clip_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"remove_background_music","kind":"act","impl":"imperative","description":"Remove one A2 background-music clip. Set ripple true to close the resulting A2 gap.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"clip_id":{"type":"string","description":"Music clip ID"},"ripple":{"type":"boolean"}},"required":["expected_version","clip_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"protect_segment","kind":"act","impl":"imperative","description":"Protect a source range so later destructive edits cannot remove it.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"start_ms":{"type":"number","description":"Source start","minimum":0},"end_ms":{"type":"number","description":"Source end","minimum":0},"label":{"type":"string","description":"Why this must remain"}},"required":["expected_version","start_ms","end_ms","label"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"unprotect_segment","kind":"act","impl":"imperative","description":"Remove protection from a source range by ID.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"range_id":{"type":"string","description":"Protected range ID"}},"required":["expected_version","range_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"mark_broll","kind":"act","impl":"imperative","description":"Attach a B-roll brief to a spoken source range without generating footage.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"start_ms":{"type":"number","description":"Source start","minimum":0},"end_ms":{"type":"number","description":"Source end","minimum":0},"brief":{"type":"string","description":"Visual brief"}},"required":["expected_version","start_ms","end_ms","brief"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"remove_broll","kind":"act","impl":"imperative","description":"Remove one B-roll marker by ID.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"},"marker_id":{"type":"string","description":"B-roll marker ID"}},"required":["expected_version","marker_id"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"undo","kind":"act","impl":"imperative","description":"Undo the latest reversible timeline edit.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"}},"required":["expected_version"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"redo","kind":"act","impl":"imperative","description":"Redo the latest undone timeline edit.","inputSchema":{"type":"object","properties":{"expected_version":{"type":"integer","minimum":0,"description":"Project version returned by get_project_state"}},"required":["expected_version"],"additionalProperties":false},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"export_mp4","kind":"act","impl":"imperative","description":"Render the current project as an MP4. When rendering completes, a highlighted Download MP4 button appears in the editor; ask the human to click it because browser security requires a trusted user gesture to save the file.","inputSchema":{"type":"object","properties":{}},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"export_edl","kind":"act","impl":"imperative","description":"Generate and download a CMX3600-style EDL for the current cut.","inputSchema":{"type":"object","properties":{}},"executable":true,"handlerField":"execute","page":"/editor/demo"},{"name":"export_srt","kind":"act","impl":"imperative","description":"Generate and download an SRT subtitle file from the current captions.","inputSchema":{"type":"object","properties":{}},"executable":true,"handlerField":"execute","page":"/editor/demo"}],"category":"Media & Personal","favicon":"/favicons/rough-cut.samarthsaxena1672003.workers.dev.ico","apiSurface":"spec","pages":["/","/editor/demo"],"toolCount":40}}