Add clips to project
add_clipsCreate new clips on a project. One tool, four sources:
kind="blank": empty slide clips you'll populate with add_elements / generate_media. Pass
clips: [{title?, duration?}, ...]. Note: create_project already creates clip 0; calling with N blank entries gives N+1 clips total.kind="pptx": extract slides from an uploaded .ppt/.pptx. Pass
mcp_upload_id(from upload_file), optionalslide_indices. Each slide becomes a slide_clip with native text/image/shape elements pre-populated.kind="video": cut clips from an uploaded video/audio. Pass
mcp_upload_idand optionallymime_type(default video/mp4),title,voiceover_text,cuts: [{start_seconds, end_seconds, heading?}],auto_elements. Withoutcutsthe whole upload becomes one clip. Pipeline (download → transcribe → insert) runs in the background; subsequent calls on the same upload hit a 24h cache and return synchronously. (To overlay a video ONTO an existing clip — picture-in-picture, b-roll, background loop — rather than insert it as its own clip, use add_elements(element_type='video') instead.)Re-cut clips already on the timeline: pass
source_start_clip_id,source_end_clip_id(a run of video clips from one recording, inclusive) andcutsinstead of an upload. The run is replaced in place by one clip per cut; cut seconds are on the run's own clock (0 = start of the first clip). Recording cut out between the clips counts back in, so a cut across it restores that footage (restored_gap_seconds).
kind="template": one clip from a clip template (find(type='clip_templates')). Pass
template_idandtext_overrides(strings for the template's text elements in document order; a missing or empty one keeps the placeholder — fill them with the user's words).after_clip_idis REQUIRED: ask the user where it goes, never guess. Insert only; a template whose aspect ratio differs from the project is refused (aspect_mismatch— pick another). The clip inherits the project's voice.
All variants accept after_clip_id to control insertion position; appends at end if omitted (except kind="template").
Concurrency: whole-project mutation (conflict domain: the entire project) — serialize. Do not run it in parallel with ANY other mutation on the same project_id, including element/voiceover edits; run them one at a time. (Mutations to different projects run in parallel freely.)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cuts | No | kind='video' only: per-clip cuts. Each entry becomes one inserted clip. Omit to insert the full upload as a single clip. | |
| kind | Yes | Source for the new clips: 'blank' | 'pptx' | 'video' | 'template'. | |
| clips | No | kind='blank' only: one entry per blank clip. Optionally set background_color/background + transition per clip at creation — no follow-up update_clips needed. | |
| title | No | kind='video' only: clip title (default 'Video'). | |
| mime_type | No | kind='video' only: MIME type (default 'video/mp4'). Audio MIME types insert the file as a sequential clip with auto-TTS; for background music, use add_audio instead. | |
| project_id | Yes | Project (guide) ID. | |
| template_id | No | kind='template' only: template_id from find(type='clip_templates'). | |
| after_clip_id | No | Insert after this clip ID; appends at end if omitted. kind='video': '' inserts at the front. | |
| auto_elements | No | kind='video' only: when true, run auto-element detection (zooms, spotlights, blurs). Default false. Only meaningful on cache miss; cache hits clone the originating run's auto-elements. | |
| mcp_upload_id | No | kind='pptx' or 'video': mcp_upload_id from upload_file, or a Clueso upload_id (or its S3 key). | |
| slide_indices | No | kind='pptx' only: 0-based slide indices to insert. Omit to insert all slides. | |
| text_overrides | No | kind='template' only: text for the template's text elements, in document order. | |
| voiceover_text | No | kind='video' only: post-AI voiceover script (saved as v2). Original audio is always retained as the base transcript. Bracketed emotion tags ([excited], [whispers]) are performed, not spoken; <pause:1.5s> is exact timed silence. | |
| source_end_clip_id | No | kind='video' re-cut: last clip of the run (inclusive). | |
| source_start_clip_id | No | kind='video' re-cut: first clip of the run to re-cut (inclusive). |