Skip to main content
Glama

Edit a video

edit_footage

Cut a media library video down to transcript beats or second ranges, then render a new clip with captions, reframing, music, overlays, and branding.

Instructions

Cut a video in the media library (an upload, a generated or found clip, a render) down to the moments that matter and get a new media key: keep beats or quoted words from probe_media's transcript (keep_text), or seconds (keep_ranges, remove_ranges). The same call reframes to 9:16, tightens pauses, burns in captions, lays music and places overlays, a logo and a look. Run probe_media first; plan: true reads the paper edit back before rendering. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fitNocover (default) crops to fill the new shape; contain letterboxes onto pad_color, which keeps a whole slide readable. Needs reframe.
sfxNoSounds you place, one per line or semicolon: "<window> <sound> [gain dB]", e.g. "@"the result" ding; @"but then" record scratch -3; 12.4 riser". The sound lands as the window opens. Name it by id or by a few words ("vinyl scratch", "whoosh deep"), or media:<mediaKey> for a sound in the library. A placed sound replaces an automatic one within 0.3 s; the automatic pops and whooshes stay everywhere else. Default gain -6 dB. A few per short land; a hit on every sentence is noise. Library ids: air-horn, among-us-role-reveal, anime-wow, applause, apple-pay, bell-ding, boing, bone-crack, bruh, camera-shutter, cash-register, censor-beep, crowd-gasp, deadpan-bruh, ding, discord-notification, drama-boom, dramatic-boomer, dramatic-sting, emotional-damage, error-buzzer, fah, glitch, illuminati-confirmed, keyboard-typing, loading-lag, mac-quack, mario-jump, metal-gear-alert, minecraft-hurt, mouse-click, nelly-ahh, oh-my-god-vine, omg-hell-nah, page-turn, pop, price-is-right-fail, record-scratch, riser, rizz, romance-meme, run-vine, sad-meow, sad-trombone, sad-violin, sanctuary-guardian-what, shocked, shutter-modern, shutter-old, skedaddle, snapchat-notification, spongebob-fail, sub-drop, swoosh-transition, ta-da, triggered, ui-switch, vine-boom, vinyl-scratch, whip, whoosh, whoosh-deep, whoosh-short, wilhelm-scream, windows-xp-error, yippee.
cardNoThe hook card: "<4 to 8 words> <window>", e.g. "Get customers for your product 0-5" or "... @"That's exactly"+4". The pops' dark pill in the upper third, popping in, gone when the window closes. The reels pin one from the first half second, with an icon row above the words: add "| brand:meta + <logo mediaKey> = emoji:🚀" (the same whats as pops, a brand in its real colours, joined by + and =), or one mark alone, "| brand:meta", each on its tile, popping in one after the other.
logoNoThe brand lockup small in a corner the whole cut: "<mediaKey> <window> [anchor] [width%] [| Brand Name]" ("0-45" or @"ShapelessAI"..end), top-right and 14% of the frame wide by default, a margin off the edge, the name beside the mark when given (always give it). It fades in and out and steps aside on its own while a full picture, the hook card or a pop on the same corner is on screen. Use the exact logo asset from the brand kit; beside the hook words it goes in the card's icon row.
lookNoGrade the picture, a choice for flat footage or a brand, not a default: clean lifts contrast, colour and sharpness a touch; film is softer with a warm tint and grain; noir is high-contrast black and white; warm is saturated and sunny. Unset keeps the camera's colour, which is right for most phone footage.
nameYesA 2-6 word filename for the cut, e.g. "demo hero moments". The user sees it in Assets.
planNoResolve the whole call and render nothing: the paper edit comes back, every beat of the take kept or dropped, where each plays on the cut and what sits on it, with what an editor would send back (a bare beat, a picture that leaves before the thought ends or runs into the next one, the same picture twice). Plan with it until it reads right, then repeat the call without plan to render once.
popsNoThe small things the reels pop beside the speaker ON the word, one per line or semicolon: "<what> <window> [anchor] [size%]". what: brand:nvidia (a company or product's real mark, its own app tile - tiktok, instagram, youtube, linkedin, x, meta, openai, claude, claude-code, gemini, cursor, or any handle brand_mark returned; a domain like jev.ai reaches the long tail), wordmark:claude (the name written the brand's way, on white paper, wider - for a brand the viewer must read, not just recognise), icon:rocket (lucide, a white glyph on a tile in the caption accent), emoji:🔥 or emoji:fire (animated; any other emoji draws as a still), "13,255 visits" (a few words on a dark pill, the last word in the caption accent, quoted), or a media key (a screenshot or logo on a white card). Anchor top by default; in cutout mode the free band is above the speaker, so top, top-left, top-right. One pop per product noun, on the word: @"TikTok". A named platform gets its mark: "TikTok, Reels and Shorts" is three marks in a row (brand:tiktok @"TikTok"..@"Shorts" top-left; brand:instagram @"Reels"..@"Shorts" top; brand:youtube @"Shorts" top-right). The CTA beat shows where to go: the domain in a pill ("shapelessai.com" @"check it out"..end top).
focusNo"face" finds the person in every kept segment and frames on them, eyes on the upper third - what a talking head wants. Or where the subject is in the SOURCE frame, as "x,y" percentages: "30,50" keeps the left third of a screen recording in a 9:16 crop. Centre by default. Works with or without reframe.
musicNoA bed under the take: "<mediaKey> [gain dB] [duck dB]", e.g. "music/lofi-bed.mp3 -18 12". The voice stays; the bed loops to the cut's length, sits at the gain (-18 by default, under a voice) and is pulled down by the duck amount while the person speaks, back up in the gaps. The key is plan_music's mediaKey or any audio in the library. Masters the cut's sound like normalize_audio.
namesNoThe brand, product and domain names, spelled the owner's way, comma-separated: "ShapelessAI, shapelessai.com". A recogniser hears "shapeless AI"; the captions must not misspell the customer. Always pass them when a take names the product.
speedNoPlay the cut faster or slower - 1.5 tightens a demo, 0.5 holds a detail. Audio keeps its pitch. 1 (unchanged) by default.
cutoutNoCutout mode, the shape the best founder reels run in: the speaker is lifted off their background (a real matte, hair and all) and shrunk to a corner, so the product takes the frame while the take keeps playing. Beats, each "<window> anchor [height%]", one per semicolon: "@"paste the URL"..@"analyze" bottom-right; 12-38 bottom-center 45". Anchors: bottom-left, bottom-center, bottom-right, top-left, top-right, center; the height is a share of the frame, 50 by default. Outside the beats the take is full frame. Put an overlay layer in every beat - a screenshot, a card, the product - or the person is small in front of nothing. A whoosh lands where the mode changes when studio_sound or normalize_audio is on. The reels run three quarters of their length in it: hook and CTA full frame, the demo in cutout.
effectsNoEffects pinned to the person, one per line or semicolon: "<window> <lightning|sparks|glow> from <left|right|any> hand [index|palm|fingertips] [colour]", "<window> <kind> from face" or "<window> <kind> at x,y". The hand is found in every frame and the effect follows it, lightning shooting the way the finger points: @"watch this"+2 lightning from right hand; 4-6 sparks from any hand palm gold. left and right are the person's own hands; any is the safe pick. Colour: a hex or blue, purple, red, gold, green, white. The window must be where the hand is actually in view (look at the filmstrip); the result says how many frames it was found in. A strike lands with a sound when studio_sound or normalize_audio is on.
reframeNoRe-crop to this shape. Leave unset to keep the source framing.
tightenNoTranscript-first cut: pauses over 0.5s close to 0.3s (0.45s at a sentence end), dead air before the first word and after the last goes, fillers ("um", "uh") are lifted out, and a sentence said twice keeps its last saying (the founder's retake). Every other word stays. The first thing to do to any recorded take.
captionsNoWord-by-word captions over the cut, timed by forced alignment to what is actually said. Default libass-burn - the cheap tier, which ffmpeg burns in during the same pass, no browser. A cut with no speech in it is left alone whatever this says. Pass "off" to draw nothing: a music-only clip, footage that already carries subtitles, or a cut a project will caption itself. tiktok-pop, brand-block, clean-line and mini-doc are drawn by the browser: pick one when the look matters.
overlaysNoPictures ON the cut, on the words or seconds named, one per line or semicolon: "<mediaKey> <window> [full|anchor] [width%]". full fills the frame (the demo_page clip or a screenshot behind a cutout speaker); an anchor (top, top-right, right, bottom-left, ...) places a white card in the safe area, 46% wide by default, popping in. A video key plays, an image is drawn. The window is the words it goes on (@"paste the URL"..@"analyze") or seconds of the CUT, after tighten and the ranges, so the picture lands on the noun. A video holds its last frame once it ends: give a clip a window its length, or a longer clip (demo_page: more steps, or "for 2s" holds); the result names a hold. Never fill a window with a still: end the cutout beat where the clip ends instead.
punch_inNoFrame every other segment closer, each cut by its own amount (7 to 22%, never the same twice in a row), so each cut reads as a change of shot. With focus "face" the closer framing stays on the person. The jump-cut convention of every talking-head short.
budgetUsdNoOptional: the most this call may spend, in dollars, default 2, max 10.
keep_textNoThe moments to KEEP, one span per "|", as beats from probe_media's transcript ("b1 | b4-b7 | b12") or as the take's own words ("That's exactly what I did ... make some money | I advise you to check it out"), joined in the order given. A quoted span runs from its first phrase to the end of its last ("..." between them); one phrase alone keeps just those words; it must open and close on a thought or a clause. Quote words as probe_media spells them; a phrase said twice takes #2 ("check it out#2"). The cut lands on the words, with a breath of air either side, never mid-word.
media_keyYesThe clip to edit, as a mediaKey from media_library, an upload, or find_footage.
pad_colorNoThe letterbox colour behind a 'contain' reframe, as hex. Default #000000. Match it to the clip or the brand - black bars on a light screen recording read as a broken export. Needs reframe.
backgroundNoA media key drawn behind the matted speaker in every cutout beat, instead of the blur: a brand backdrop, a product shot, a gradient, or a video that loops (a rendered motion background, a find_footage b-roll). Overlays still sit on top of it. Needs cutout; replaces cutout_backdrop.
keep_rangesNoThe moments to KEEP, in seconds of the source, joined in the order given: "12.5-18.2, 41-55.5". A timecode ("1:05-1:12") works too. For footage with no speech; a take is cut with keep_text.
studio_soundNoStudio sound for a recorded voice: rumble and room noise out, mud cut, presence lifted, sibilance tamed, then levelled to feed loudness. Use it on any take a person recorded; not on music or a produced mix.
remove_rangesNoThe moments to DROP, same format; what remains is joined. Use instead of keep_ranges, never with it.
caption_accentNoHex colour of the word being said in the captions - the karaoke highlight - and the cut's one accent: the pills' last word and the icon tiles wear it too. Match the brand; unset, the burned captions are plain white.
caption_scriptNoWhat is said in the cut, when you know it: aligning against a known script beats transcribing. Omit to transcribe the clip itself. Needs captions.
cutout_backdropNoWhat fills the frame behind the cutout: "blur" (the media overlay on screen, enlarged to cover the frame and blurred, so the product's own colours bleed into the frame; the take itself when no media is on screen; the default) or a hex colour. Needs cutout. For a picture of your own there, use background instead.
normalize_audioNoRe-level the cut to broadcast loudness, keeping what was said, without the studio_sound cleaning. For a mix that was already produced.
append_media_keysNoOther clips joined on AFTER this cut, in the order given, as a comma-separated list of mediaKeys. Each is appended whole - trim it in its own edit first if you only want part of it.
caption_foregroundNoHex colour of the burned captions' other words. White by default.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
toolYes
mediaYes
outputNoThe tool's own result, shaped by the tool.
chargedUsdYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.2.4

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses the auth requirement ('Needs the write scope'), the cost behavior ('budgetUsd ... is held while it runs and released'), and that plan: true performs a dry read without rendering. It also signals the operation is non-destructive by producing a new media key rather than altering the source, which corroborates destructiveHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and output, then layers capability, prerequisites, and cost. Every sentence conveys information, but the long feature list ('reframes to 9:16, tightens pauses, burns in captions, lays music and places overlays, a logo and a look') makes it dense and slightly sprawling for an opening paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 33-parameter mutation with an output schema, the description supplies the essential operator context: probe_media first, plan-then-render loop, write scope, and budget semantics. Return values need not be explained since an output schema exists. It does not hint at which parameter families are mutually exclusive or ordering, but the exhaustive schema covers those.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the 33 parameters are exhaustively documented in the schema, so the schema does the heavy lifting. The description only references a few names (keep_text, keep_ranges, remove_ranges, budgetUsd, plan) at a high level without adding syntax or constraints beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Cut a video in the media library') and enumerates the concrete forms it accepts (an upload, a generated or found clip, a render), then names the output ('a new media key'). This is clearly distinguishable from siblings like generate_footage, render_thumbnail, or probe_media.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a strong prerequisite and workflow: 'Run probe_media first' and 'plan: true reads the paper edit back before rendering.' It also frames the two edit modes (keep_text from the transcript vs keep_ranges/remove_ranges for seconds), so context is clear. It stops short of naming an explicit sibling alternative or a when-not-to-use condition for the tool itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.