REC 00:00:00;00
screencast-mcp Tools Workflows Connect GitHub ↗

SCREENCAST-MCP / TOOLS / EDIT

Edit Pipeline

pipeline

Run several edits (trim, crop, scale, speed, cut_idle, redact, callout, keystroke_overlay, cursor, reframe, zoom, backdrop, audio, burn_subtitles, then optionally export_preset or export_gif) in one ffmpeg pass: one re-encode, no intermediate files. Prefer it over chaining edit tools; a recipe does the usual polish in one call.

editwritesdestructivesince v0.30.0

00:00PARAMETERS
NameTypeDescription
input requiredstringPath to the source video.
stepsobject[]Edits in order, each { op, ...its tool's options }; export_preset/export_gif only last. Times and pixels are relative to the video as it is at that step (after earlier trims, speed, crops). zoom follow:"clicks" plans from the event log; burn_subtitles takes subtitles or transcribe:true. at most 30 items
steps[trim].start requirednumber ≥ 0
steps[trim].endnumber > 0
steps[trim].durationnumber > 0
steps[crop].x requiredinteger ≥ 0, ≤ 9007199254740991
steps[crop].y requiredinteger ≥ 0, ≤ 9007199254740991
steps[crop].width requiredinteger > 0, ≤ 9007199254740991
steps[crop].height requiredinteger > 0, ≤ 9007199254740991
steps[scale].widthinteger > 0, ≤ 9007199254740991
steps[scale].heightinteger > 0, ≤ 9007199254740991
steps[speed].factor requirednumber > 0
steps[redact].regions requiredobject[] at least 1 items
steps[redact].regions[].x requiredinteger ≥ 0, ≤ 9007199254740991
steps[redact].regions[].y requiredinteger ≥ 0, ≤ 9007199254740991
steps[redact].regions[].width requiredinteger > 0, ≤ 9007199254740991
steps[redact].regions[].height requiredinteger > 0, ≤ 9007199254740991
steps[redact].regions[].startnumber ≥ 0
steps[redact].regions[].endnumber > 0
steps[redact].style"box" | "blur" | "pixelate"
steps[redact].padinteger ≥ 0, ≤ 9007199254740991
steps[redact].colorstring
steps[callout].items requiredobject[] at least 1 items, at most 50 items
steps[callout].items[box].x requirednumber
steps[callout].items[box].y requirednumber
steps[callout].items[box].width requirednumber > 0
steps[callout].items[box].height requirednumber > 0
steps[callout].items[box].thicknessnumberOutline px (default 4). > 0
steps[callout].items[box].fillbooleanFill instead of outline.
steps[callout].items[box].fromnumber ≥ 0
steps[callout].items[box].tonumber > 0
steps[callout].items[box].colorstring
steps[callout].items[text].x requirednumber
steps[callout].items[text].y requirednumber
steps[callout].items[text].text requiredstring
steps[callout].items[text].sizenumberFont size px (default 32). > 0
steps[callout].items[text].backgroundbooleanDark panel behind the text (default true).
steps[callout].items[text].fromnumber ≥ 0
steps[callout].items[text].tonumber > 0
steps[callout].items[text].colorstring
steps[callout].items[arrow].x1 requirednumber
steps[callout].items[arrow].y1 requirednumber
steps[callout].items[arrow].x2 requirednumberHead (x2,y2) is the point the arrow points at.
steps[callout].items[arrow].y2 requirednumber
steps[callout].items[arrow].thicknessnumberShaft px (default 8). > 0
steps[callout].items[arrow].fromnumber ≥ 0
steps[callout].items[arrow].tonumber > 0
steps[callout].items[arrow].colorstring
steps[callout].fontFilestringFont: a .ttf/.otf/.ttc path or a C:\Windows\Fonts file name. Default: bundled Inter, with a covering system font for scripts it lacks (CJK, emoji, Arabic, ...).
steps[reframe].aspect required"16:9" | "9:16" | "1:1" | "4:5"
steps[reframe].fit"pad" | "crop"
steps[zoom].keyframesobject[] at least 1 items, at most 100 items
steps[zoom].keyframes[].t requirednumber ≥ 0
steps[zoom].keyframes[].xnumber
steps[zoom].keyframes[].ynumber
steps[zoom].keyframes[].widthnumber > 0
steps[zoom].keyframes[].heightnumber > 0
steps[zoom].keyframes[].fullboolean
steps[zoom].follow"clicks"
steps[zoom].maxZoomnumber ≥ 1, ≤ 6
steps[zoom].holdSecnumber > 0, ≤ 30
steps[zoom].transitionSecnumber > 0, ≤ 5
steps[cut_idle].minIdleSecnumber > 0
steps[cut_idle].keepSecnumber ≥ 0
steps[audio].normalize"youtube" | "podcast" | "broadcast" | number
steps[audio].denoise"light" | "medium" | "strong"
steps[burn_subtitles].subtitlesstring
steps[burn_subtitles].transcribeboolean
steps[burn_subtitles].style"clean" | "social"
steps[backdrop].preset"desktop" | "rec" | "amber" | "light"
steps[backdrop].colorsstring[] at least 1 items, at most 4 items
steps[backdrop].imagestring
steps[backdrop].paddinginteger ≥ 0, ≤ 2000
steps[backdrop].radiusinteger ≥ 0, ≤ 1000
steps[backdrop].shadowinteger ≥ 0, ≤ 200
steps[backdrop].shadowOpacitynumber ≥ 0, ≤ 1
steps[backdrop].aspect"16:9" | "9:16" | "1:1" | "4:5"
steps[keystroke_overlay].eventsstring
steps[keystroke_overlay].clicksboolean
steps[keystroke_overlay].typingboolean
steps[keystroke_overlay].keys"shortcuts" | "masked"
steps[keystroke_overlay].lingerSecnumber > 0, ≤ 10
steps[keystroke_overlay].position"bottom" | "bottom-left" | "bottom-right" | "top" | "top-left" | "top-right"
steps[keystroke_overlay].sizenumber ≥ 8, ≤ 400
steps[keystroke_overlay].colorstring
steps[keystroke_overlay].fontFilestring
steps[cursor].eventsstring
steps[cursor].sizenumber ≥ 0.25, ≤ 8
steps[cursor].smoothingnumber ≥ 0, ≤ 1
steps[cursor].hideAfterSecnumber ≥ 0, ≤ 600
steps[cursor].clicksboolean
steps[cursor].spotlightboolean
steps[export_preset].platform required"youtube" | "instagram_reel" | "tiktok" | "x" | "square" | "steam_trailer" | "vertical_reel"
steps[export_preset].fit"pad" | "crop"
steps[export_gif].format"gif" | "webp"
steps[export_gif].maxBytesinteger ≥ 10000, ≤ 9007199254740991
steps[export_gif].fpsnumber > 0, ≤ 30
steps[export_gif].widthinteger ≥ 64, ≤ 1920
recipe"pr_demo" | "tutorial" | "social_reel"Polish preset expanded to steps (see dryRun): pr_demo = cut_idle, click zoom, GIF <=10 MB; tutorial = + audio, captions, 1080p mp4; social_reel = 9:16, big captions. Given steps replace its same-op step.
quality"draft" | "standard" | "high"Encoder preset for an mp4 result (default standard).
dryRunbooleanReturn the plan (ffmpeg command, output size) without running it.
outputstringOptional output path. Defaults under SCREENCAST_HOME/edits.
overwritebooleanAllow replacing an existing file at the output path (default false).
chaptersbooleanKeep the input's markers as chapters, re-timed through trims and speed.
00:05A MINIMAL CALL
pipeline { "input": "recording.mp4" }

The required arguments only, with placeholder values. Everything else takes its default.

00:10WHAT COMES BACK

Structured content (structuredContent), alongside a text summary:

FieldTypeDescription
processes alwaysinteger ≥ -9007199254740991, ≤ 9007199254740991
steps alwaysstring[]
00:15SEEN IN