clipform_generate_video
ActiveTool of io.github.Clipform/mcp-server
Generate a video from images, video clips, or both, synced to an audio track. Use this for narrated question backgrounds, topic visualisations, or any form node that benefits from video. Combine with clipform_generate_tts for narrated audio and clipform_search_media for royalty-free images. Creates 9:16 (720x1280) with Ken Burns pan/zoom effects and transitions. Returns a public URL when complete. Items: type "image" (Ken Burns motion) or "video" (cover-cropped, muted by default). Duration matches audio_url or set duration_seconds explicitly. For multi-question builds, pass wait: false on every render: each call returns a job ID immediately, so all renders run in parallel - then collect URLs with clipform_check_render. Sequential waiting renders take 15-120 seconds EACH. Choosing a render tool: for a recognisable form/quiz beat (guess-the-city, this-or-that, mystery reveal, multiple choice, photo montage...) reach for a video template first (clipform_list_video_templates + clipform_render_video_template) - it is a one-call recipe. Use clipform_generate_video for a narrated or audio-synced media montage (images/clips timed to a voice track). Use clipform_render_composition only when neither fits and you need a custom layer stack. Montage disambiguation: choose clipform_generate_video when the montage is narrated or synced to an audio track; choose the slideshow video template when it is silent (motion + transitions only, no voice-over). A render for a form node is not done until it is attached to that node. Pass node_id (and form_id) so the completed render attaches itself automatically - do not poll clipform_check_render to completion or manually chain clipform_upload_media_asset + clipform_attach_node_media; fire the render and move on.
Parameters schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"items"
],
"properties": {
"wait": {
"type": "boolean",
"default": true,
"description": "true (default) blocks until the video is ready and returns its URL. false returns a job ID immediately - fire all renders first, then poll clipform_check_render. Use false whenever rendering more than one video."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"url"
],
"properties": {
"fit": {
"enum": [
"cover",
"blur-pad",
"auto"
],
"type": "string",
"description": "Framing mode (image only). auto = cover for portrait, blur-pad for landscape."
},
"url": {
"type": "string",
"format": "uri",
"description": "Media URL"
},
"type": {
"enum": [
"image",
"video"
],
"type": "string",
"description": "'image' for still images with Ken Burns effects, 'video' for video clips"
},
"effect": {
"type": "string",
"description": "Ken Burns effect (image only): pan-left, pan-right, pan-up, pan-down, zoom-in-pan-left, zoom-in-pan-right, zoom-in, zoom-out, static, random"
},
"volume": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Clip audio volume 0-1 (video only, default 0 = muted)"
},
"start_from": {
"type": "number",
"minimum": 0,
"description": "Start time in seconds (video only). Trims the clip."
},
"aspect_ratio": {
"type": "number",
"description": "Image width/height ratio (image only). Enables auto blur-pad for landscape images.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"maxItems": 20,
"minItems": 1,
"description": "Media items (images, video clips, or a mix)"
},
"duotone": {
"type": "object",
"required": [
"shadow",
"highlight"
],
"properties": {
"shadow": {
"type": "string",
"description": "Darker tone (maps to image shadows), e.g. '#1a1633'"
},
"contrast": {
"type": "number",
"description": "Contrast boost before mapping (default 1.1)",
"exclusiveMinimum": 0
},
"highlight": {
"type": "string",
"description": "Lighter tone (maps to image highlights), e.g. '#f5c542'"
}
},
"description": "Two-tone editorial recolour on image items - desaturates then maps to a shadow->highlight palette. Pair with a halftone texture for a screen-print poster look.",
"additionalProperties": false
},
"form_id": {
"type": "string",
"format": "uuid",
"description": "The form UUID (required when node_id is set)."
},
"node_id": {
"type": "string",
"description": "Form node to attach this render to automatically once it completes - skips the manual clipform_upload_media_asset + clipform_attach_node_media steps and republishes the form if it's currently live. Requires form_id."
},
"texture": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"checker",
"halftone",
"scanlines"
],
"type": "string",
"description": "checker = square dither mesh, halftone = dot grid, scanlines = horizontal lines"
},
"sizePx": {
"type": "number",
"description": "Pattern cell size in px (default 4)",
"exclusiveMinimum": 0
},
"opacity": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Pattern darkness 0-1 (default 0.35)"
}
},
"description": "Print-style pattern overlay on image items - makes stock imagery read as designed (screen-print dither look)",
"additionalProperties": false
},
"captions": {
"type": "array",
"items": {
"type": "object",
"required": [
"start",
"end",
"text"
],
"properties": {
"end": {
"type": "number",
"description": "Segment end time in seconds"
},
"text": {
"type": "string",
"description": "Full segment text"
},
"start": {
"type": "number",
"description": "Segment start time in seconds"
},
"words": {
"type": "array",
"items": {
"type": "object",
"required": [
"word",
"start",
"end"
],
"properties": {
"end": {
"type": "number"
},
"word": {
"type": "string"
},
"start": {
"type": "number"
}
},
"additionalProperties": false
},
"description": "Per-word timestamps within the segment"
}
},
"additionalProperties": false
},
"description": "Word-level captions from clipform_generate_tts - carried onto the attached media asset. Only used when node_id is set."
},
"audio_url": {
"type": "string",
"format": "uri",
"description": "Audio track URL. Video duration matches audio duration."
},
"transition": {
"type": "object",
"properties": {
"type": {
"type": "string",
"default": "fade",
"description": "Transition: fade, fadeblack, fadewhite, slideleft, slideright, circlecrop, circleopen, circleclose, dissolve, pixelize, radial, smoothleft, smoothright, wipeleft, wiperight, diagtl, diagbr, hblur"
},
"duration": {
"type": "number",
"default": 1,
"description": "Transition duration in seconds (default: 1)"
}
},
"additionalProperties": false
},
"style_preset": {
"enum": [
"cinematic",
"dramatic",
"calm",
"documentary",
"dreamy",
"moody",
"energetic"
],
"type": "string",
"description": "Ken Burns style preset: cinematic, dramatic, calm, documentary, dreamy, moody, energetic"
},
"random_effects": {
"type": "boolean",
"default": true,
"description": "Shuffle Ken Burns effects across image items (default: true)"
},
"background_color": {
"type": "string",
"description": "Background color (default '#000')"
},
"duration_seconds": {
"type": "number",
"description": "Video duration in seconds (required if no audio_url)",
"exclusiveMinimum": 0
},
"background_audio_url": {
"type": "string",
"format": "uri",
"description": "Ambience/music bed under the narration (crowd noise, room tone). Loops to fill the video. Find tracks with clipform_search_music."
},
"background_audio_volume": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Background bed volume 0-1 (default 0.15 - sits under speech)"
}
},
"additionalProperties": false
}No endpoints wrapped at confidence ≥ 0.70.
Parent server
io.github.Clipform/mcp-server
https://github.com/clipform/mcp-server
1/7 registries