Create product video campaigns from 1-4 product photos and track them. Requires an API key.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <WIA Motion API key> from https://wiamotion.ai/#connect
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check status/progress/artifacts of a wiamotion campaign job by job_id (from create_campaign).
job_id returned by create_campaign
Check status/progress/artifacts of a wiamotion campaign job by job_id (from create_campaign).
| Argument | Type | Description |
|---|---|---|
| job_id* | string | job_id returned by create_campaign |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"pattern": "^job_[a-f0-9]{16}$",
"description": "job_id returned by create_campaign"
}
}
}Create a wiamotion product video campaign from 1-4 product photos. Produces finished 1080x1920 video(s) + thumbnail(s) + multi-language metadata (never a raw/unfinished clip) and deducts credits from the caller's account. Package tiers: "trial" (1 video, watermarked, 25cr, 3-language metadata), "starter" (1 video, 50cr, 254-language metadata), "launch" (3 videos — hook/how-to/brand mood — 254-language metadata, 125cr), "story" (everything in launch plus one 60-90s cinematic brand short on a premium engine, 400cr). DIRECT YOUR OWN CINEMATOGRAPHY: write distinct scene prompts (English, one short cinematic camera direction each) — this is what makes the result good, the server will not invent creative direction for you. Videos are subtitle-free by default (globally reusable); on-screen text (hook_text / endcard_text) is OPT-IN — omit both unless you specifically want burned-in copy for one language. For "starter"/"trial" use scenes[] (2-4 scenes, one video). For "launch"/"story" use hook_scenes[]/howto_scenes[]/brand_scenes[] (2-4 scenes each, one set per video role) — omit any of these to fall back to a generic template for that video. For "story" additionally use story_scenes[] (8-12 scenes) for the brand short — think in classic beats: hook, development, climax, resolution into the endcard. The server always appends a standard anti-distortion guard to every scene prompt server-side (keeps the product/printed text exactly as in the reference photo, no warping) — do not add your own "no distortion" wording, just describe the shot. Prefer image_urls over images_base64 when the photos are already hosted somewhere — base64 request bodies are capped at 8MB total (~1MB/photo) and get rejected past that. "creator" (200 credits, 2026-09-25) = a realistic on-screen presenter holds the product and speaks YOUR script with lip-sync (~12s, up to 15s): pass persona (who appears), setting (where), language, script (what they say — hook first, then proof), optional gender (voice) and direction (gestures/beats). scenes/hook_text/bgm are ignored for creator. Returns a job_id — poll it with check_campaign.
| Argument | Type | Description |
|---|---|---|
| gender | string | "creator" only — voice gender (default f). |
| scenes | array | "starter"/"trial" only — 2-4 distinct scenes cut together for the single video (no looping/padding). Omit to fall back to a generic 2-scene hero+detail template. |
| script | string | "creator" only — the spoken line, about 12 seconds (ja/zh ≤90 chars, ko ≤120, en/ar/hi ≤200, others ≤260). |
| package | string | Package tier — see tool description for what each builds and costs. |
| persona | string | "creator" only — who appears on screen: age, look, outfit, mood. |
| setting | string | "creator" only — where it is filmed: place, light, camera. |
| bgm_mood | string | Background music mood, applied to every video in the campaign. Omit for a deterministic per-job default. |
| language | string | "creator" only — spoken language of the script. |
| direction | string | "creator" only — optional gestures, camera moves and beats. |
| hook_text | string | OPTIONAL on-screen hook headline, ≤30 chars. Text overlays are opt-in — OMIT for clean, no-caption output that is reusable in any language/market (the default). Provide only when you deliberately want burned-in text (locks the video to that one language). |
List wiamotion campaign packages — credit cost, video count/duration, resolution. Call before create_campaign to pick a package.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}| image_urls |
| array |
| 1-4 publicly fetchable URLs — either direct product photo files (jpg/png), or product detail-page URLs (e.g. a Coupang/Amazon listing) with an og:image/twitter:image meta tag, which the server will fetch the photo from automatically. Preferred over images_base64. |
| brand_chain | any | "launch"/"story" only. When true, each brand_scenes[] shot after the first is generated from the LAST FRAME of the previous shot instead of the original product photo — use this when your scenes describe a continuous transformation (e.g. a hand finishing a drawing, then holding the finished result) that must stay visually consistent across shots. Costs the same credits as a normal launch/story campaign — no extra charge. Omit (default false) for independent shots, each anchored to the original product photo. |
| description | string | Short product description |
| hook_scenes | array | "launch"/"story" only — 2-4 scenes for the hook video. Omit to fall back to a generic hero+detail template. |
| brand_scenes | array | "launch"/"story" only — 2-4 scenes for the brand-mood video. Omit to fall back to a generic atmospheric-lifestyle template. |
| endcard_text | string | OPTIONAL text on the closing brand card, ≤30 chars. Omit (default) for a clean logo-only endcard with no copy — globally reusable. Provide only to burn in a caption for one specific language. |
| howto_scenes | array | "launch"/"story" only — 2-4 scenes for the how-to/demo video. Omit to fall back to a generic hands-on-demo template. |
| product_name* | string | Product name |
| story_scenes | array | "story" only — 8-12 scenes for the 60-90s cinematic brand short (hook → development → climax → resolution). Omit to fall back to a generic dome-style 8-scene template. |
| images_base64 | array | 1-4 base64-encoded product photos, alternative to image_urls. Total request body capped at 8MB — use image_urls for larger photos. |
| accept_text_risk | any | Set true ONLY after the user explicitly agrees to proceed despite a source_text_risk rejection (the uploaded image contains heavy printed marketing copy, which AI video generation will garble; garbled text is then not refund-eligible). On a 422 source_text_risk error, explain the risk to the user and ask before retrying with this flag. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"product_name"
],
"properties": {
"gender": {
"enum": [
"f",
"m"
],
"type": "string",
"description": "\"creator\" only — voice gender (default f)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"description": "English cinematic camera direction for this scene, e.g. \"slow orbital rotation around the product, soft studio lighting\". Do not include distortion-guard wording — the server adds that automatically."
},
"duration_s": {
"type": "number",
"maximum": 8,
"minimum": 4,
"description": "Scene length in seconds, 4-8 (default 5)."
}
}
},
"maxItems": 4,
"minItems": 2,
"description": "\"starter\"/\"trial\" only — 2-4 distinct scenes cut together for the single video (no looping/padding). Omit to fall back to a generic 2-scene hero+detail template."
},
"script": {
"type": "string",
"maxLength": 260,
"description": "\"creator\" only — the spoken line, about 12 seconds (ja/zh ≤90 chars, ko ≤120, en/ar/hi ≤200, others ≤260)."
},
"package": {
"enum": [
"trial",
"starter",
"launch",
"story",
"creator"
],
"type": "string",
"default": "starter",
"description": "Package tier — see tool description for what each builds and costs."
},
"persona": {
"type": "string",
"maxLength": 600,
"description": "\"creator\" only — who appears on screen: age, look, outfit, mood."
},
"setting": {
"type": "string",
"maxLength": 400,
"description": "\"creator\" only — where it is filmed: place, light, camera."
},
"bgm_mood": {
"enum": [
"upbeat",
"warm",
"tech",
"bright",
"trendy"
],
"type": "string",
"description": "Background music mood, applied to every video in the campaign. Omit for a deterministic per-job default."
},
"language": {
"enum": [
"en",
"ko",
"ja",
"zh",
"es",
"pt",
"fr",
"de",
"it",
"ar",
"hi",
"id",
"th",
"vi",
"tr",
"ru",
"pl",
"nl"
],
"type": "string",
"description": "\"creator\" only — spoken language of the script."
},
"direction": {
"type": "string",
"maxLength": 1500,
"description": "\"creator\" only — optional gestures, camera moves and beats."
},
"hook_text": {
"type": "string",
"maxLength": 30,
"description": "OPTIONAL on-screen hook headline, ≤30 chars. Text overlays are opt-in — OMIT for clean, no-caption output that is reusable in any language/market (the default). Provide only when you deliberately want burned-in text (locks the video to that one language)."
},
"image_urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 4,
"minItems": 1,
"description": "1-4 publicly fetchable URLs — either direct product photo files (jpg/png), or product detail-page URLs (e.g. a Coupang/Amazon listing) with an og:image/twitter:image meta tag, which the server will fetch the photo from automatically. Preferred over images_base64."
},
"brand_chain": {
"anyOf": [
{
"type": "boolean"
},
{
"enum": [
"0",
"1",
"true",
"false"
],
"type": "string"
}
],
"description": "\"launch\"/\"story\" only. When true, each brand_scenes[] shot after the first is generated from the LAST FRAME of the previous shot instead of the original product photo — use this when your scenes describe a continuous transformation (e.g. a hand finishing a drawing, then holding the finished result) that must stay visually consistent across shots. Costs the same credits as a normal launch/story campaign — no extra charge. Omit (default false) for independent shots, each anchored to the original product photo."
},
"description": {
"type": "string",
"description": "Short product description"
},
"hook_scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"description": "English cinematic camera direction for this scene, e.g. \"slow orbital rotation around the product, soft studio lighting\". Do not include distortion-guard wording — the server adds that automatically."
},
"duration_s": {
"type": "number",
"maximum": 8,
"minimum": 4,
"description": "Scene length in seconds, 4-8 (default 5)."
}
}
},
"maxItems": 4,
"minItems": 2,
"description": "\"launch\"/\"story\" only — 2-4 scenes for the hook video. Omit to fall back to a generic hero+detail template."
},
"brand_scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"description": "English cinematic camera direction for this scene, e.g. \"slow orbital rotation around the product, soft studio lighting\". Do not include distortion-guard wording — the server adds that automatically."
},
"duration_s": {
"type": "number",
"maximum": 8,
"minimum": 4,
"description": "Scene length in seconds, 4-8 (default 5)."
}
}
},
"maxItems": 4,
"minItems": 2,
"description": "\"launch\"/\"story\" only — 2-4 scenes for the brand-mood video. Omit to fall back to a generic atmospheric-lifestyle template."
},
"endcard_text": {
"type": "string",
"maxLength": 30,
"description": "OPTIONAL text on the closing brand card, ≤30 chars. Omit (default) for a clean logo-only endcard with no copy — globally reusable. Provide only to burn in a caption for one specific language."
},
"howto_scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"description": "English cinematic camera direction for this scene, e.g. \"slow orbital rotation around the product, soft studio lighting\". Do not include distortion-guard wording — the server adds that automatically."
},
"duration_s": {
"type": "number",
"maximum": 8,
"minimum": 4,
"description": "Scene length in seconds, 4-8 (default 5)."
}
}
},
"maxItems": 4,
"minItems": 2,
"description": "\"launch\"/\"story\" only — 2-4 scenes for the how-to/demo video. Omit to fall back to a generic hands-on-demo template."
},
"product_name": {
"type": "string",
"minLength": 1,
"description": "Product name"
},
"story_scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"description": "English cinematic camera direction for this scene, e.g. \"slow orbital rotation around the product, soft studio lighting\". Do not include distortion-guard wording — the server adds that automatically."
},
"duration_s": {
"type": "number",
"maximum": 8,
"minimum": 4,
"description": "Scene length in seconds, 4-8 (default 5)."
}
}
},
"maxItems": 12,
"minItems": 8,
"description": "\"story\" only — 8-12 scenes for the 60-90s cinematic brand short (hook → development → climax → resolution). Omit to fall back to a generic dome-style 8-scene template."
},
"images_base64": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"data_base64"
],
"properties": {
"filename": {
"type": "string"
},
"data_base64": {
"type": "string"
}
}
},
"maxItems": 4,
"minItems": 1,
"description": "1-4 base64-encoded product photos, alternative to image_urls. Total request body capped at 8MB — use image_urls for larger photos."
},
"accept_text_risk": {
"anyOf": [
{
"type": "boolean"
},
{
"enum": [
"0",
"1",
"true",
"false"
],
"type": "string"
}
],
"description": "Set true ONLY after the user explicitly agrees to proceed despite a source_text_risk rejection (the uploaded image contains heavy printed marketing copy, which AI video generation will garble; garbled text is then not refund-eligible). On a 422 source_text_risk error, explain the risk to the user and ask before retrying with this flag."
}
}
}