VAR2.ai
Server Details
VAR2 is a hosted creative MCP server for generating and editing images, creating videos, music, voiceovers and 3D assets, and assembling creative workflows. Connect with OAuth using a VAR2 account; generation uses account credits.
- Status
- Healthy
- Uptime
- 94.7% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 26 tools
The tools cover distinct modality+action lanes (create/get per image/video/audio/3d/dialog, plus upload/join/render), and the descriptions carry explicit routing rules for the tricky cases. There is still real overlap risk within the get_*_result family (six status tools distinguished only by 'media word') and the three upload tools, which requires the verbose descriptions to navigate correctly.
Names follow a predictable var2_[verb]_[noun] snake_case pattern throughout (var2_create_video, var2_get_image_result, var2_trim_audio). Minor deviations exist: status checks mix 'check' (check_join_status) with 'get' (get_video_result), and magic_replace uses an unusual adjective+verb form.
26 tools is heavy but justified by a broad multi-modal surface — image, video, audio, 3D, and voice-over each need create + result/polling tools, plus shared infrastructure (uploads, join, timeline, catalogs). It sits just above the comfortable range but each tool maps to a real capability.
Coverage is strong: creation, status, modification, stitching, timeline rendering, cost estimation, catalogs, character sheets, and multiple upload paths are all present. Minor gaps remain — no delete/management tools and no dedicated video trim (audio trim exists), but core workflows are closed-loop.
Available Tools
26 toolsvar2_check_join_statusARead-onlyInspect
Status check for a join / stitch render. "Is it ready / done yet?" / "check on it" / "where is my …" + placeholder_id or var2 link, media word = a join / stitch render → THIS tool. Status question with an id/link: NEVER answer null — one var2_get_*result always matches; pick by MEDIA WORD. Action verbs ("animate it", "upscale", "extend it", "make a 3d model from it") → the matching create/modify tool with that url/id, NOT a status tool. Pair: var2_join_videos. One immediate snapshot, never loop. Plain video renders → var2_get_video_result. A jp… id is a PLAN, not a render — it STARTS rendering via var2_join_videos({plan_id}); this tool takes only the plain-UUID placeholder_id of an already-queued render (from var2_join_videos or var2_render_timeline).
| Name | Required | Description | Default |
|---|---|---|---|
| placeholder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint=true, so safety is already handled, but the description adds real behavioral traits beyond that: 'One immediate snapshot, never loop' (no polling) and the constraint that jp_ ids start a render elsewhere rather than being accepted here. It stops short of describing the snapshot's shape, hence a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is dense and repeats the routing idea in several phrasings ('NEVER answer null', 'pick by MEDIA WORD', the media-word list, the pair line). Useful content, but it reads as a routing memo rather than a tight definition and could be trimmed without losing coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read-only status tool with no output schema, it covers trigger phrases, disambiguation, parameter origin, and the no-loop behavior. What the snapshot actually returns is left implicit, which is a minor gap given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% with a bare string param, so the description must carry the load — and it does: placeholder_id is the plain-UUID of an already-queued render originating from var2_join_videos or var2_render_timeline, and a jp_… id is explicitly rejected. That is substantive semantics absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Status check for a join / stitch render.' It explicitly carves itself apart from siblings by naming var2_get_video_result for plain video renders and var2_join_videos as its pair. An agent can route to it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ('is it ready / done yet', status question with an id/link), explicit when-not ('action verbs ... → the matching create/modify tool, NOT a status tool'), and named alternatives per media type. Exclusions and alternatives are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_confirm_uploadAInspect
Validate + register a file uploaded via var2_request_upload: probes the object, rejects/deletes bytes whose magic-byte signature or size does not match type, records it in the user's library → real placeholder_id for var2_join_videos chaining. Call with path + type from the request_upload response AFTER the PUT succeeds. Optional — skip if you only need public_url.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional display name for the asset library. | |
| path | Yes | The storage `path` returned by var2_request_upload (e.g. "<userId>/<uuid>.png"). Must be inside your own prefix. | |
| type | Yes | Modality — must match what you requested the upload for. | |
| bucket | No | Ignored (derived from `type`); accepted so you can pass the request_upload response back verbatim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries the full burden and delivers: it probes the object, deletes rejected bytes on signature/size mismatch, records the asset, and returns a real placeholder_id. The destructive deletion behavior is disclosed up front — a trait no annotation covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense with zero filler; the arrow notation compresses the register→placeholder_id→join_videos flow efficiently. Telegraphic style is slightly terse but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the return (real placeholder_id) and the alternative output (public_url). For a 4-param validation tool with chaining implications, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds pipeline meaning: it ties `path`/`type` to the request_upload response and explains that the confirmed id feeds var2_join_videos, going beyond the field-level docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb+resource (validate + register an uploaded file) and immediately scopes it against the sibling that created it (var2_request_upload). The mention of the resulting placeholder_id for var2_join_videos chaining lets an agent place it in the pipeline without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-call (with `path` + `type` from the request_upload response AFTER the PUT succeeds) and explicit when-to-skip (optional; skip if you only need `public_url`). Both the trigger and the exclusion are named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_create_3dAInspect
3D mesh (.glb) from ONE image. "Make a 3d model of this image/character" → THIS tool, even when the image is a www.var2.ai/image/ share link (action on an image routes here, not to a status tool). image: storage URL, var2 share link, or any https URL — pass the link the user gave. Models: trellis-2 (default, best price) | tripo ("high quality / detailed / production" 3D, PBR, ≤20k faces, pricier). No image at all → var2_create_image first. Local/attached file, no URL → var2_upload_asset first. Never fabricate the image URL.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Storage URL, var2 share link (www.var2.ai/image/<id> — auto-resolved), or any public https URL. | |
| model | No | Default trellis-2. | |
| resolution | No | ||
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| texture_size | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries the burden and does add real context: model trade-offs (trellis-2 default/best price vs tripo high-quality/PBR/≤20k faces/pricier) and share-link auto-resolution behavior. It omits async/long-running lifecycle and how results are retrieved (via var2_get_3d_result), which are meaningful gaps for a generation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability, then routing rules and model trade-offs in dense arrow notation. Very efficient, though the telegraphic style is terse and slightly hard to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should explain what calling it returns (job id? polling?), which it does not. It also leaves resolution/texture_size undefined and only implies the async lifecycle. Adequate for routing but incomplete for correct invocation mechanics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%. The description enriches the image param (storage URL, share link, or any https URL — pass the link the user gave) and the model param (default and pricing tiers). But resolution and texture_size enums have no semantics in either schema or description, leaving genuine gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: produce a 3D mesh (.glb) from ONE image. It explicitly distinguishes itself from siblings — routing image-share-link actions here rather than to a status tool, and naming var2_create_image / var2_upload_asset as prerequisites. An agent can tell it apart from var2_get_3d_result without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ("Make a 3d model of this image/character"), when-to-use alternatives (no image → var2_create_image first; local file → var2_upload_asset first), and a subtle routing rule for var2.ai/image share links. It even warns against fabricating the URL.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_create_audioAInspect
Create, EXTEND, or edit MUSIC / a song / a track (Suno). type ∈ create-music (default) | extend-music | replace-music-section. "extend that track by N seconds" / "make the song longer" / "continue past 1:00" → type=extend-music, track id in audioRecordId. "That track" without a re-pasted id = the track from earlier in this conversation — use its placeholder_id from context; never answer null / ask for a link. "replace / swap seconds X-Y of the track" → type=replace-music-section. ANY make/extend/lengthen/replace-section on a song / track / music = THIS tool — never a video or image tool, never an invented tool. "A song AND cover art" → START HERE (art = follow-up var2_create_image, not an upload). customMode=false: prompt = song description ≤2800 chars on V6/V6_WILD (≤500 on V5_5 and older). customMode=true: prompt = full lyrics; style + title required. Never name real artists or songs (copyright filter).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Default create-music. | |
| model | No | Default suno. | |
| style | No | Required when customMode=true. Max 200 chars. | |
| title | No | Required when customMode=true. | |
| prompt | No | customMode=false: song description ≤2800 chars on V6/V6_WILD, ≤500 on older (Suno writes lyrics). customMode=true: full lyrics. | |
| continueAt | No | Required for extend-music. Seconds offset to extend from. | |
| customMode | No | Default false. Set true when the user provides exact lyrics. Requires style + title. | |
| infillEndS | No | Required for replace-music-section. Window end in seconds (> infillStartS; ~6-60s window). | |
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| infillStartS | No | Required for replace-music-section. Window start in seconds. | |
| instrumental | No | ||
| audioRecordId | No | Required for extend-music / replace-music-section. placeholder_id from the source var2_create_audio call (var2-hosted tracks only). "That track" = the most recent track in this conversation — take its placeholder_id from context rather than declining. | |
| model_version | No | Default V6 (latest). V6_WILD for bolder, more experimental takes. Older only for a specific sound. | V6 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only a title, so the description carries the full behavioral burden. It does disclose real constraints: the copyright filter (never name real artists or songs), the customMode-dependent prompt semantics, and per-type required fields. However, it never states that generation is asynchronous, that the call yields a job/placeholder id, or how the finished asset is retrieved (var2_get_audio_result / webhook) — the central behavioral trait of an asset-creation tool is left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and the dense routing rules that follow each map to a real disambiguation need. It is long and mixes caps-lock emphasis with quoted user phrases, which hurts scanability slightly, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter creation tool with no annotations and no output schema, the description covers input-side behavior well: type routing, per-type required fields, prompt constraints, and the placeholder_id convention for follow-up calls. The missing piece is the output lifecycle — the description never tells the agent that a result must later be fetched or that a webhook fires.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 92%, so the baseline is 3, and the description genuinely adds value on top: it maps user phrasing to the 'type' enum, clarifies that extend targets 'audioRecordId' with the source track's placeholder_id, and spells out the customMode=false vs customMode=true prompt contract (description vs full lyrics). Some of this duplicates the schema, which keeps it out of 5 territory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb set and resource (create / extend / edit music, song, or track) and names the underlying provider (Suno). It actively differentiates from siblings ('never a video or image tool') and routes cover-art requests to var2_create_image. An agent can place this tool without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is mapped from natural-language user utterances to each type value ('make the song longer' → extend-music, 'replace seconds X-Y' → replace-music-section), with explicit exclusions ('never an invented tool'), a follow-up path for cover art, and a rule for resolving 'that track' from conversation context. This is about as explicit as routing guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_create_dialogAInspect
TTS / voice-over (ElevenLabs v4 by default; model "elevenlabs-v3" for the previous generation, ≤5000 chars). dialogue = [{voice, text}, ...]. Default voices: EXAVITQu4vr4xnSDxMaL (Sarah, warm female), JBFqnCBsd6RMkjVDRZzb (George, warm British male). Hebrew: language_code "he" + nikud. Combined text ≤10000 chars. v4 reads English audio tags in square brackets inside text, before the words they color — [excited], [whispers], [sarcastic], [laughs], [sighs] — write them yourself, or pass auto_tag: true to have var2 add them. NOT for voice browsing — that's var2_get_voice_list.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Dialog model. Default elevenlabs-v4 (most expressive, ≤10000 chars). Only pass this when the user asks for a specific version. | |
| title | No | Optional asset display name. | |
| auto_tag | No | ElevenLabs v4 only. true = var2 adds fitting audio tags ([excited], [laughs]…) to every line before generating (free, limited per hour). Omit when you wrote the tags yourself. | |
| dialogue | Yes | ||
| stability | No | 0 = expressive, 0.5 = balanced (default), 1 = monotone. | |
| project_id | No | Optional project to attach to. Defaults to the user's default project. | |
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| language_code | No | ISO 639-1 (e.g. "he"). Omit to auto-detect. | |
| idempotency_key | No | Optional. Retries with the same key never double-bill (dedupes on ai_jobs.request_id). Use a stable per-user-action value (e.g. a UUID). | |
| auto_tag_density | No | How many tags auto_tag adds: light (≈1 per line), medium (default), rich. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears nearly the full burden and does well: it discloses model defaults, per-model character ceilings, that auto_tag is 'free, limited per hour', tag placement semantics, and webhook signature/retry behavior via schema. The significant omission is that this is an asynchronous job — nothing tells the agent it must poll var2_get_dialog_result instead of expecting media back.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose and payload shape lead, then defaults, then the sibling exclusion. One weak spot is that the opening '≤5000 chars' and the later 'Combined text ≤10000 chars' sit far apart and are easy to misread as conflicting, though no sentence is outright filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, mutation-style tool with no output schema and title-only annotations, the description covers inputs, limits, limits-derived behavior, and locale handling thoroughly. It falls just short on the request lifecycle — it never says the work is queued and must be retrieved via var2_get_dialog_result, which is the one thing an agent needs to complete the flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 90%, so the baseline is 3, and the description earns above that by contributing facts the schema lacks: the concrete default voice ids with human names (Sarah, George), the combined 10000-char budget across lines, and the semantics of where bracketed tags sit relative to words. Model, stability, and language_code semantics are left almost entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('TTS / voice-over' creation) and immediately characterizes the payload shape ('dialogue = [{voice, text}, ...]'), so the agent knows this produces multi-speaker speech rather than a generic audio asset. It also actively differentiates itself from var2_get_voice_list ('NOT for voice browsing'), so it is distinguishable from at least one sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use (dialogue voice-over, model selection, Hebrew handling, tag writing) and one explicit exclusion that routes voice discovery to var2_get_voice_list, plus tells the agent where voice ids come from. It does not, however, distinguish itself from the other audio-producing sibling var2_create_audio, leaving the agent to infer single-speaker vs dialogue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_create_imageAInspect
Create a STILL IMAGE from a text prompt — "make/generate/draw an image of X", variations of an image — or edit one (type=image-to-image + image_url; image_refs[] locks character/style). A storyboard / N frames / N panels / comic strip with a consistent character = still IMAGES, one call per frame, not a video. Use var2_list_models for the complete current model list and supported settings; do not infer model availability from examples. Upscale/"sharper" → var2_modify_image; animate → var2_create_video; 3D → var2_create_3d.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Default text-to-image. grok-imagine-image-2 only: segment-map (FREE — splits image_url into named segments, returns segment_map_id + segments[{index,name,mask_url}]; prompt is ignored) then segment-edit (segment_map_id + mask_indexes + prompt — redraws only those segments). | |
| model | No | Default gpt-image-2. | |
| prompt | Yes | ||
| image_url | No | Required for type=image-to-image. Storage URL, var2 share link (www.var2.ai/image/<id> — auto-resolved), or any public https URL. | |
| image_refs | No | Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2, gpt-image-2-5, grok-imagine-image-2, seedream-5-pro); ignored by others. | |
| resolution | No | Output size of the NEW generation — does not upscale an existing image (that is var2_modify_image). seedream-5-pro: 1K or 2K (default 2K). | |
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| aspect_ratio | No | ||
| mask_indexes | No | type=segment-edit: segment index values (from segments[].index) to redraw. | |
| segment_map_id | No | type=segment-edit: the segment_map_id returned by type=segment-map. | |
| idempotency_key | No | Optional. Retries with the same key never double-bill (dedupes on ai_jobs.request_id). Use a stable per-user-action value (e.g. a UUID). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries the behavioral burden and does add real context: segment-map is FREE and ignores the prompt, image_refs are ignored by non-ref-aware models, model availability must be checked via var2_list_models rather than inferred from examples. It stops short of disclosing the async job lifecycle (that webhook/polling is needed and that var2_get_image_result retrieves output), which is the one material behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, front-loaded with the core capability and then the routing directives. It is information-efficient, though the mode/routing clauses are packed tightly enough that it reads more like a decision tree than prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema and no annotations, the description covers modes, model caveats, and sibling routing well enough to call correctly. It omits how the result is retrieved (var2_get_image_result / webhook or idempotency flow), which is the remaining completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (82%), so the baseline is 3. Most of the description's parameter guidance (type semantics, image_url requirement for image-to-image, image_refs locking, resolution not upscaling) is already stated in the schema's own field descriptions, so the description adds little that the agent doesn't already have.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb + resource ('Create a STILL IMAGE from a text prompt') and immediately enumerates the supported modes (text-to-image, image-to-image edit, storyboard per-frame). It explicitly distinguishes itself from var2_create_video, var2_create_3d, and var2_modify_image, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use rules: upscale/'sharper' → var2_modify_image, animate → var2_create_video, 3D → var2_create_3d, model list → var2_list_models. It also pre-empts a common misclassification by declaring a multi-panel storyboard is N still-image calls, not a video.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_create_videoAInspect
Create video. Replace/swap something in an existing clip, recast it with a new character, or restyle it into a preset look (anime, claymation…) → use var2_magic_replace instead. Pick type by INPUT: existing clip — www.var2.ai/video/ or video link (free-form prompt edit, "keep the motion") → video-to-video (video_url), NEVER image-to-video for a /video/ link. ONE image to animate → image-to-video. 2-3 image links, one consistent character in a NEW scene → reference-to-video (reference_image_urls), not kling_elements. Portrait image + audio track (talking head) → audio-to-video. Text only → text-to-video. "Turn this image into a video" / "animate this image" — link or URL included — is THIS tool, type=image-to-video, URL as first_frame_url (grok-imagine: reference_image_url); an action verb on an image link beats the /image/ path — NOT var2_get_image_result. Video only — songs/music are a different tool. Models: veo-3.1 (default), ltx-2.3, ltx-retake, wan-2.7, seedance-2, seedance-2.5, seedance-2-mini, happyhorse, kling, kling-3, kling-motion-control, kling-3-motion-control, gemini-omni-video, gemini-omni-flash-1-1, minimax-h3, wan-3, wan-3-prime, kling-3-omni, sora-2, grok-imagine, pruna-avatar (talking head), heygen-avatar-iv (photorealistic talking head). kling-3: optional first/last frame (first_frame_url/last_frame_url or image_urls) + subject refs (kling_elements). kling-3-omni: Kling 3.0 Omni — text, frames, ≤7 references or one reference video, multi-shot, @elements and video edits (video_url) up to 4K.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | kling/kling-3: std | pro. grok: normal | fun | spicy. seedance-2: pro | fast. seedance-2.5: draft (same as draft: true). ltx-retake: replace_audio | replace_video | replace_audio_and_video. kling-motion-control / kling-3-motion-control: 720p | 1080p. | |
| type | No | Pick by INPUT: an existing clip / video URL (free-form edit, "keep the motion") → video-to-video (video_url); swap / recast / preset restyle of a clip → var2_magic_replace instead. ONE image to animate → image-to-video (first_frame_url; grok: reference_image_url). 2-3 reference images for a new scene ("keep this character consistent across these references") → reference-to-video — CALL IT with the URLs the user gave (var2 share links included) as reference_image_urls[] (veo-3.1: reference_images[]); never decline over which param name fits. Portrait + audio track (talking head, "character talking") → audio-to-video — when the user supplies a portrait URL and an audio URL, call immediately (pruna-avatar or heygen-avatar-iv: first_frame_url + audio_url + audio_duration_seconds); any https URL the user pasted is real and usable as-is, whatever its domain. Text only → text-to-video (default). A /video/ URL or "clip" means video-to-video, not image-to-video. | |
| draft | No | seedance-2.5 only — draft mode: a fast, cheap 480p preview (resolution is forced to 480p). Upgrade a draft you like with type=draft-upgrade. | |
| model | No | Default veo-3.1. | |
| shots | No | kling-3 / kling-3-omni multi-shot sequence (when multi_shots=true). Each shot has its own prompt + duration (seconds). kling-3-omni: ≤6 shots, 1–12s each, ≤512 chars, 3–15s total. | |
| sound | No | kling / kling-3 / kling-3-omni — generate audio alongside the video (kling-3-omni: not with a video input). (ltx-2.3 always renders native audio; seedance uses generate_audio.) | |
| prompt | Yes | ||
| duration | No | kling: "5" | "10" (string). grok: "6" | "10" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10. minimax-h3: whole seconds 4-15 (default 6). wan-3 / wan-3-prime: whole seconds 2-30 (default 5; reference video + output ≤ 30s). kling-3-omni: whole seconds 3-15 (default 5; ignored with a video — the output follows the clip). | |
| audio_url | No | Required for pruna-avatar / heygen-avatar-iv (audio-to-video). Public MP3/WAV/M4A URL, ≤60s. | |
| video_url | No | Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it). minimax-h3: a 2-15s clip used as the motion/scene reference, billed as input seconds. wan-3 / wan-3-prime: a 1-15s clip used as reference Video1, billed as input seconds. kling-3-omni: a 3-15s clip to edit (+ up to 4 reference_image_urls), billed on its seconds at the video-input rate. | |
| image_urls | No | kling-3 (type=text-to-video) / kling-3-omni: [startFrame] or [startFrame, endFrame] to drive the shot from images (same as first_frame_url / last_frame_url). | |
| input_urls | No | kling-motion-control / kling-3-motion-control only — reference image(s) whose subject is driven by the motion video. | |
| resolution | No | grok: 480p | 720p. wan-2.7: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. minimax-h3: 768P (default) | 2K. wan-3 / wan-3-prime: 480p | 720p (default) | 1080p. kling-3-omni: 720p (default) | 1080p | 4k. Others: model-specific. | |
| start_time | No | ltx-retake only — segment start offset in seconds. | |
| multi_shots | No | kling-3 / kling-3-omni — true to render a multi-shot sequence from `shots` (kling-3-omni: not with a video). | |
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| aspect_ratio | No | kling/grok: 1:1 | 16:9 | 9:16. veo/sora: portrait | landscape. wan-3 / wan-3-prime: auto (default) | 16:9 | 9:16 | 1:1 | 4:3 | 3:4. | |
| generate_audio | No | seedance-2 / seedance-2.5 / seedance-2-mini / wan-3 / wan-3-prime — generate audio (default true). | |
| kling_elements | No | kling-3 (type=text-to-video) / kling-3-omni: subject reference images for character/object consistency. Each element is a named subject backed by 2+ images (kling-3-omni: 2–4, ≤3 elements, one-word names, not with a video); write @name in the prompt to place it. | |
| last_frame_url | No | Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1, minimax-h3, wan-3, wan-3-prime, kling-3-omni (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.) | |
| total_duration | No | kling-3 only — total seconds (5–15). Defaults to the sum of shot durations. | |
| video_duration | No | ltx-retake: full trimmed source duration (drives per-second pricing). kling-motion-control: reference video duration (≤30s); kling-3-motion-control reads it server-side. | |
| first_frame_url | No | Starting frame for image-to-video (all models except grok-imagine); also accepted by kling-3 (type=text-to-video) and used as the portrait for pruna-avatar / heygen-avatar-iv. | |
| negative_prompt | No | kling / kling-3 / wan-2.7 — things to avoid in the output. | |
| reference_images | No | veo-3.1 reference-to-video only — 1–3 character/style reference images (veo uses this param, not reference_image_urls). | |
| reference_labels | No | seedance-2 / seedance-2.5 / seedance-2-mini / minimax-h3 — optional short names for the reference media, aligned by index with reference_image_urls / reference_video_urls / reference_audio_urls (e.g. {"images": ["david", "castle at night"], "videos": ["dolly move"]}). The server prepends them to the prompt as a "[Reference assets]" mapping ("@Image 1: david") so the model binds each asset; leave an entry null to use the type default. ≤64 per type, ≤80 chars each. | |
| source_video_url | No | Deprecated alias for video_url (video-to-video). Prefer video_url. | |
| draft_generation_id | No | seedance-2.5 type=draft-upgrade only — the placeholder_id (or share link) of a finished seedance-2.5 draft. Renders that exact video at 1080p; prompt, aspect ratio and length come from the draft. Drafts can be upgraded for 7 days. | |
| reference_image_url | No | grok-imagine image-to-video only (singular, distinct from reference_image_urls). | |
| reference_audio_urls | No | reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks (≤15s combined); seedance-2.5: up to 10 (≤30s combined); minimax-h3: up to 3 (free; needs a reference image or video alongside); wan-3 / wan-3-prime: up to 5 (each 1-15s, ≤15s combined, free) — name them Audio1, Audio2… in the prompt. | |
| reference_image_urls | No | reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3 / wan-3 / wan-3-prime / kling-3-omni) — character/style reference images (plural array; seedance-2 / seedance-2-mini accept up to 9, seedance-2.5 up to 30, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee; wan-3 / wan-3-prime up to 10, free — name them Image1, Image2… in the prompt; kling-3-omni up to 7 shared with kling_elements, 4 next to a video). veo-3.1 reference mode uses reference_images instead. | |
| reference_video_urls | No | seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation. minimax-h3: up to 3 (each 2-15s, ≤15s combined), their seconds are billed at the same per-second rate as the output. wan-3 / wan-3-prime: up to 5 (each 1-15s, ≤15s combined, + output ≤ 30s), billed like minimax-h3 — name them Video1, Video2… in the prompt. kling-3-omni: ONE 3-15s clip (+ up to 4 reference_image_urls); the output follows its length, billed at the video-input rate. | |
| character_orientation | No | kling-motion-control / kling-3-motion-control only — take orientation from the reference image or the motion video. | |
| audio_duration_seconds | No | Required for pruna-avatar / heygen-avatar-iv — drives per-second pricing. | |
| reference_video_durations | No | Seconds per entry of reference_video_urls. Optional — the server measures the files itself for billing; supplying it only makes var2_estimate_cost exact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations contain only a title, so the description carries the full behavioral burden. It discloses model-specific capabilities (kling-3-omni edits up to 4K, ltx-2.3 always renders native audio, heygen-avatar-iv is 1080p only) and the 7-day draft-upgrade window, but never says the call is asynchronous or how a finished asset is retrieved via var2_get_video_result — the single most important behavior for a 35-param generation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the sibling exclusion, which is good, but the body is one long arrow-chained paragraph that duplicates the enum guidance already present in the `type` property description and ends with a 22-item model list also enumerated in the `model` enum. Information-dense but wasteful and hard to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 35-parameter tool with no annotations and no output schema, routing is covered thoroughly but the description never explains what a successful call returns or how to poll for the result. That lifecycle gap is material, though the exceptionally rich schema partly compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 97%, so the baseline is 3, and the description adds genuinely new cross-field meaning: the input→`type` decision rule, which model each param pairing applies to, and the note that any https URL the user pasted is usable as-is. This is more than a restatement of the schema's per-param text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a clear verb+resource ('Create video') and then spends the rest of the text distinguishing this tool from named siblings: var2_magic_replace for swap/recast/restyle, var2_get_image_result for ambiguous 'animate this image' cases, and var2_create_audio for songs/music. An agent can route to this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use rules are given per input shape (existing clip → video-to-video, one image → image-to-video, 2-3 refs → reference-to-video, portrait+audio → audio-to-video, text only → text-to-video), including negative routing ('NEVER image-to-video for a /video/ link') and the alternative tool for edits. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_estimate_costARead-onlyInspect
Token-cost estimate for one or more planned create_* calls. Use when the user asks "how much".
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, side-effect-free read, so the description's burden is lighter. It usefully implies the estimate applies to *planned* (not executed) calls, but says nothing about estimate accuracy, expiry, or what the response contains. Adequate with annotations carrying the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core purpose front-loaded and the trigger condition second. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batching tool over a 15-value type enum with nested params and no output schema, the description never indicates what the returned estimate looks like (per-item vs. total, currency, units). The readOnly annotation covers safety, but the return-value and input-shaping context are thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single `items` parameter is undocumented in the description beyond the phrase 'one or more planned create_* calls', which hints at batching but not the per-item structure. Nothing explains quantity limits, model_id, or how the 15 enum types map to cost models, so the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (estimate) and resource (token cost) with scope ('one or more planned create_* calls'), which cleanly distinguishes it from every sibling that actually creates or fetches assets. An agent can tell immediately that this computes cost rather than producing media.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger is explicit: 'Use when the user asks "how much".' There are no competing cost-estimation siblings, so no exclusions are needed. It stops short of stating prerequisites, such as whether the params must mirror the intended create call exactly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_extract_video_endpointsAInspect
Extract the ACTUAL first and last image frames from a completed owned video. Returns reusable image assets for shared-frame shot chaining. Paid per extracted frame through the normal approval/credit flow; never estimates the endpoint from FPS. Pass an owned video Share link, ID, or storage URL; import external videos first. A stable idempotency_key is required outside the assistant.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| projectId | No | ||
| video_url | Yes | ||
| idempotency_key | No | Optional. Retries with the same key never double-bill (dedupes on ai_jobs.request_id). Use a stable per-user-action value (e.g. a UUID). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears the full burden and does so well: it discloses billing ('Paid per extracted frame through the normal approval/credit flow'), a determinism guarantee ('never estimates the endpoint from FPS'), and retry safety ('stable idempotency_key is required outside the assistant'). These are exactly the traits an agent needs and none are inferable from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with zero filler, and the most important fact — that it extracts the real endpoint frames rather than an FPS estimate — is front-loaded. Every clause adds actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paid, four-parameter tool with no output schema, the description covers inputs, billing, retry semantics, and the nature of the returned assets. The one notable omission is whether the operation is synchronous or job-based (siblings like var2_get_video_result and var2_check_join_status suggest async patterns), which an agent would want to know before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% — only idempotency_key is described in the schema, and name/projectId are undocumented everywhere. The description compensates for video_url by enumerating accepted forms (Share link, ID, storage URL) and for idempotency_key with the deployment caveat, but leaves two of four parameters entirely unexplained, so it only partially closes the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Extract the ACTUAL first and last image frames') with a clear qualifier ('completed owned video') and states the output artifact ('reusable image assets for shared-frame shot chaining'). An agent can distinguish this from create_image, modify_image, get_image_result, and trim_audio without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit input condition ('Pass an owned video Share link, ID, or storage URL') and a prerequisite for the failure case ('import external videos first'), plus a deployment condition for idempotency_key ('required outside the assistant'). It does not name a sibling alternative or state when NOT to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_3d_resultARead-onlyInspect
Status check for a 3D MODEL / mesh / glb. "Is it ready / done yet?" / "check on it" / "where is my …" + placeholder_id or var2 link, media word = a 3D MODEL / mesh / glb → THIS tool. Status question with an id/link: NEVER answer null — one var2_get_*_result always matches; pick by MEDIA WORD. Action verbs ("animate it", "upscale", "extend it", "make a 3d model from it") → the matching create/modify tool with that url/id, NOT a status tool. Pair: var2_create_3d. One immediate snapshot, never loop. "Is the 3d model ready? placeholder " → THIS tool with that placeholder_id.
| Name | Required | Description | Default |
|---|---|---|---|
| placeholder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds a real behavioral constraint beyond that: 'One immediate snapshot, never loop,' which tells the agent not to poll. It also asserts a fallback rule ('NEVER answer null'). It stops short of describing what the snapshot contains, but the non-looping guidance is genuinely additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the routing rule are front-loaded, which is good, but the body is a dense run-on of quoted user phrases, arrows, and a repeated example that restates the 'is it ready' case already covered earlier. The signal is present but padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only status tool with no output schema and annotations covering the safety profile, the description covers routing, exclusions, and the non-polling expectation. It omits any hint of what the returned status values look like, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single param is undocumented in the schema, so the description must carry it. It does convey that the parameter accepts a placeholder_id or a var2 link, and shows the placeholder form in an example, but it never states the expected string format or whether a link is parsed differently.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource: 'Status check for a 3D MODEL / mesh / glb', and explicitly carves itself out from the sibling get_*_result tools by the 'media word' rule. An agent can distinguish it from var2_get_image_result or var2_get_video_result without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Is it ready / done yet?' with an id/link), when-not-to-use (action verbs like 'animate it'/'upscale' route to create/modify tools, NOT status tools), and the selection rule among sibling status tools ('pick by MEDIA WORD'). It even supplies a worked example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_audio_resultARead-onlyInspect
Status check for AUDIO: a song / music / track / tune. "Is it ready / done yet?" / "check on it" / "where is my …" + placeholder_id or var2 link, media word = AUDIO: a song / music / track / tune → THIS tool. Status question with an id/link: NEVER answer null — one var2_get_*_result always matches; pick by MEDIA WORD. Action verbs ("animate it", "upscale", "extend it", "make a 3d model from it") → the matching create/modify tool with that url/id, NOT a status tool. Pair: var2_create_audio. One immediate snapshot, never loop.
| Name | Required | Description | Default |
|---|---|---|---|
| inline_media | No | Default true. Pass false to skip the inline base64 payload and rely on the resource_link + structured URL only. ALWAYS pass false when the user already saw this asset (repeat status checks, chaining into another tool) — never re-render the same media twice. | |
| placeholder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: 'One immediate snapshot, never loop,' which tells the agent not to poll, and 'NEVER answer null — one var2_get_*_result always matches' sets expectations on the result. It doesn't cover auth or rate limits, but the added context is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and densely packed with routing rules; every clause carries actionable content. Slightly repetitive, though — the phrase 'AUDIO: a song / music / track / tune' appears twice and the parenthetical examples are listy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the tool is a single-shot status check and the description conveys the snapshot behavior plus routing. It stops short of describing what the returned payload contains, though the inline_media schema field covers the rendering choice. Adequate for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and inline_media is already richly documented in the schema. The description compensates for the undocumented placeholder_id by clarifying it accepts 'placeholder_id or var2 link', which the schema alone does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource: 'Status check for AUDIO: a song / music / track / tune,' and explicitly routes by media word so an agent can distinguish it from var2_get_image_result, var2_get_video_result, etc. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Is it ready / done yet?', 'check on it', status question with an id/link), when-not-to-use (action verbs like 'upscale', 'extend it' belong to create/modify tools), and names the paired tool var2_create_audio. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_characterARead-onlyInspect
Fetch a saved character/product/style sheet by name ("use my character Dana", "the avatar we saved", "our hero product") — returns reference image urls to pass as image_refs / reference_image_urls for a consistent look. "Which characters do I have saved?" / "list my saved sheets" → call with NO name. Saved character referenced → call this FIRST, never regenerate from a text prompt.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Sheet name to fetch. Omit to list all saved sheets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds genuinely new behavior: what it returns (reference image urls) and how the result is consumed downstream (image_refs / reference_image_urls for look consistency). It does not cover error behavior for an unmatched name, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and scoped tightly to three sentences with no filler. The mid-sentence em-dash insertion of the listing rule is slightly awkward but the content all earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with readOnlyHint and no output schema, the description supplies the missing pieces: the return payload, the downstream parameter names it feeds, and the workflow ordering against regeneration. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: the examples ('use my character Dana') show what the name value looks like in practice, and the no-name case is framed as a listing operation rather than an error.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and resource (saved character/product/style sheet), and enumerates the natural-language phrasings that map to it. The contrast with var2_save_character and var2_create_image is implicit but clear: this retrieves a saved sheet rather than generating one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: omit name to list saved sheets, and 'call this FIRST, never regenerate from a text prompt' for a referenced character. Both the when-to-use and the when-not-to-use (regeneration) cases are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_dialog_resultARead-onlyInspect
Status check for a VOICE-OVER / narration / dialog / spoken TTS clip. "Is it ready / done yet?" / "check on it" / "where is my …" + placeholder_id or var2 link, media word = a VOICE-OVER / narration / dialog / spoken TTS clip → THIS tool. Status question with an id/link: NEVER answer null — one var2_get_*_result always matches; pick by MEDIA WORD. Action verbs ("animate it", "upscale", "extend it", "make a 3d model from it") → the matching create/modify tool with that url/id, NOT a status tool. Pair: var2_create_dialog. One immediate snapshot, never loop. "Is the voice-over done?" → THIS tool, never var2_get_video_result or var2_get_audio_result.
| Name | Required | Description | Default |
|---|---|---|---|
| inline_media | No | Default true. Pass false to skip the inline base64 payload and rely on the resource_link + structured URL only. ALWAYS pass false when the user already saw this asset (repeat status checks, chaining into another tool) — never re-render the same media twice. | |
| placeholder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and a human title, so the safety profile is covered. The description adds genuinely new behavior: 'One immediate snapshot, never loop' tells the agent not to poll, which is not in any structured field. It does not describe the shape of the returned status payload, which would be the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the description is dense with repeated routing heuristics and repeats the media-type phrase twice ('VOICE-OVER / narration / dialog / spoken TTS clip'). Most sentences earn their place as disambiguation, yet the same message (this is the dialog status tool) is restated three times.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status tool with no output schema, the description covers selection, alternatives, and the no-loop behavior, which is what an agent needs to call it correctly. It never explains what the status response actually contains (progress, URL, error states), which is the one remaining unknown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: inline_media is fully documented in the schema, but placeholder_id has no description. The description compensates partially by stating that placeholder_id can be either an id or a 'var2 link', which is useful beyond the schema. With the other half of the meaning carried by the schema, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb+resource: a status check for a voice-over/narration/dialog/TTS clip. It explicitly distinguishes itself from siblings by media type ('Is the voice-over done?' → THIS tool, never var2_get_video_result or var2_get_audio_result). An agent can route without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use triggers ('Is it ready / done yet?', 'check on it', status question with an id/link), explicit when-NOT-to-use (action verbs like 'animate it'/'upscale' go to the matching create/modify tool), and the correct sibling pair (var2_create_dialog). It also states the routing rule for the ambiguous case (pick by media word).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_image_resultARead-onlyInspect
Status check for an IMAGE (picture / photo). "Is it ready / done yet?" / "check on it" / "where is my …" + placeholder_id or var2 link, media word = an IMAGE (picture / photo) → THIS tool. Status question with an id/link: NEVER answer null — one var2_get_*_result always matches; pick by MEDIA WORD. Action verbs ("animate it", "upscale", "extend it", "make a 3d model from it") → the matching create/modify tool with that url/id, NOT a status tool. Pair: var2_create_image / var2_modify_image. One immediate snapshot, never loop.
| Name | Required | Description | Default |
|---|---|---|---|
| inline_media | No | Default true. Pass false to skip the inline base64 payload and rely on the resource_link + structured URL only. ALWAYS pass false when the user already saw this asset (repeat status checks, chaining into another tool) — never re-render the same media twice. | |
| placeholder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds genuinely new behavioral context — 'One immediate snapshot, never loop' tells the agent not to poll, and the inline_media note warns against re-rendering an already-seen asset. It stops short of describing the snapshot payload shape, but that is the main gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The routing rule and the anti-pattern are front-loaded and every clause carries signal, but the slash-and-arrow phrasing is dense and slightly hard to parse compared with plain prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does enough: it states the snapshot nature, the non-looping expectation, and the media-word routing needed to pick among many var2_get_*_result siblings. Only the returned status values themselves are unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (inline_media is fully documented in the schema), yet the description compensates by clarifying that placeholder_id accepts either an id or a var2 link. That is real meaning added beyond the bare schema, though it doesn't spell out format details for the id itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Status check for an IMAGE') and pins the routing key ('media word = an IMAGE → THIS tool'), letting an agent separate it from var2_get_video_result / var2_get_audio_result without opening any schema. It even names its create/modify counterparts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger phrases ('is it ready / done yet', 'where is my …' + placeholder_id or var2 link), an explicit anti-pattern (action verbs → the matching create/modify tool, NOT a status tool), and the fallback rule that one var2_get_*_result always matches. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_resultsARead-onlyInspect
Show 2+ finished results in one gallery (browse / sort / group / filter). Triggers: "show me all of those", "put these three side by side", "line them up so I can compare", "drop / gather all of those clips into one place" — 2+ existing var2 links or ids = THIS tool, not an upload. items: 2–24 placeholder_ids and/or var2 links, any mix of images / videos / tracks / 3D. Finished items show instantly; rendering ones fill in. Never call with empty items. Single result → var2_get__result. "What models are available" has no ids → var2_list_models (voices: var2_get_voice_list). display=false returns data (states + URLs) without rendering, for chaining.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | 2–24 placeholder_ids and/or var2 links (www.var2.ai/image|video|music|3d/…). Mix types freely; {id, type} objects also accepted. | |
| title | No | Optional heading shown above the gallery. | |
| display | No | Default true → render the gallery. false = logic-only fetch: return state + URLs as data without rendering (for chaining or checking a batch without re-showing media). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses meaningful behavior: finished items render instantly while rendering ones fill in, and display=false returns state + URLs as data without rendering for chaining. These are non-obvious operational traits the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then usage rules, then parameter guidance. Dense and largely waste-free, though the trigger-phrase list and arrow shorthand make it longer than strictly necessary for an agent reader.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining what display=false returns (states + URLs). Combined with routing rules and item constraints, an agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real context: items accepts 2–24 mixed placeholder_ids and var2 links across images/videos/tracks/3D, and it clarifies the display flag's purpose for chaining rather than merely restating the schema. The empty-items prohibition reinforces the minItems constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Show 2+ finished results in one gallery (browse / sort / group / filter)'. It explicitly routes the single-result case to var2_get_<modality>_result, so an agent can distinguish it from the entire var2_get_*_result family without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrases, an explicit boundary rule ('2+ existing var2 links or ids = THIS tool, not an upload'), a negative constraint ('Never call with empty items'), and names the correct alternatives for single results, model listing, and voice listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_video_resultARead-onlyInspect
Status check for a VIDEO clip (not a song / voice-over / stitched render). "Is it ready / done yet?" / "check on it" / "where is my …" + placeholder_id or var2 link, media word = a VIDEO clip (not a song / voice-over / stitched render) → THIS tool. Status question with an id/link: NEVER answer null — one var2_get_*_result always matches; pick by MEDIA WORD. Action verbs ("animate it", "upscale", "extend it", "make a 3d model from it") → the matching create/modify tool with that url/id, NOT a status tool. Pair: var2_create_video. One immediate snapshot, never loop. Join/stitch renders → var2_check_join_status; voice-overs → var2_get_dialog_result. "Is this ready yet? www.var2.ai/video/" → THIS tool.
| Name | Required | Description | Default |
|---|---|---|---|
| placeholder_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: it is one immediate snapshot and must never be looped, and a status question with an id must never be answered null. It does not describe the returned status values, but the snapshot/no-loop rule is a meaningful non-obvious trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The routing intent is front-loaded and useful, but the text is a run-on packed with quoted example phrases and repeats the '(not a song / voice-over / stitched render)' exclusion twice. It is denser than needed and could be tightened without losing routing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only status tool with no output schema, the description covers routing, exclusions, and the no-loop behavior thoroughly. The one remaining gap is that it never hints at what the returned status looks like, though the absence of an output schema lowers that expectation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the single property is an undescribed string), so the description must carry the burden. It does clarify that placeholder_id accepts either a placeholder id or a var2 link/URL, which meaningfully extends the bare schema type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (status check for a VIDEO clip) and immediately scopes it against siblings by media word, explicitly excluding song, voice-over, and stitched render. An agent can distinguish this from var2_get_image_result or var2_get_dialog_result without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use triggers (status questions with an id/link), when-NOT (action verbs like 'animate it'/'upscale' route to create/modify tools), and names the exact alternative siblings (var2_check_join_status, var2_get_dialog_result). It even handles the edge case of a null answer and points to the paired create tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_get_voice_listARead-onlyInspect
Voice catalog (ElevenLabs). "What voices do you have", "list voices", "which voice for <language/style>", "browse voices" → THIS, never null. source = account (~10-50 curated) | library (10K+ searchable). Filter: gender / language (ISO 639-1; "he" = Hebrew-verified) / category. Lists voices only — speaking is var2_create_dialog.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | library only. young | middle_aged | old. | |
| live | No | false uses the bundled static catalog instead of fetching live. | |
| accent | No | library only. e.g. american, british, australian. | |
| gender | No | male | female | non-binary. Case-insensitive. | |
| search | No | library only. Free-text search. | |
| source | No | account = curated voices on our account. library = full public ElevenLabs library (10K+). | account |
| category | No | ||
| featured | No | library only. true = featured voices only. | |
| language | No | ISO 639-1 code (e.g. "he", "en"). Filters to verified voices. | |
| page_size | No | library only. 1-100. Paginate via response.last_sort_id. | |
| use_cases | No | library only. Comma-separated, e.g. "narration,characters_animation". | |
| descriptives | No | library only. Comma-separated, e.g. "calm,warm,deep". | |
| include_legacy | No | account only. false hides legacy voices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered; the description additionally discloses catalog size differences between source modes ('account ~10-50 curated' vs 'library 10K+ searchable') and clarifies that 'he' means Hebrew-verified. It does not mention rate limits or auth requirements, but for a read-only list tool the added context is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then triggers, then source modes, then the sibling exclusion — an efficient ordering. The telegraphic fragment style ('THIS, never null') is dense but every clause carries routing or scoping value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, zero-required, read-only list tool with no output schema, the description covers purpose, routing, source-mode semantics and filtering. Pagination is delegated to the schema (last_sort_id), which is acceptable; only return-shape expectations are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 92%, so the schema already documents all 13 parameters thoroughly. The description's filter summary (gender / language / category) and source-mode note largely restate what the schema says, adding only the 'he = Hebrew-verified' nuance. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Voice catalog (ElevenLabs)') and states the tool lists voices only. It explicitly names the sibling it is not ('speaking is var2_create_dialog'), so an agent can separate it from the create/result tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete user-phrasing triggers ('what voices do you have', 'list voices', 'which voice for <language/style>', 'browse voices') and an emphatic routing rule ('→ THIS, never null'). It also names the alternative (var2_create_dialog) for the adjacent action of speaking, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_join_videosAInspect
Stitch videos / images / audio into one mp4 on a 30fps timeline. Fractional seconds are supported and rounded to frames, not whole seconds; the plan returns timeline_frames and fps. For a VERIFIED duplicated shared endpoint between 30fps clips, shorten the preceding clip by exactly 1/30 second, preserve the next first frame, and use no transition. A shared reference image does not prove actual endpoints match or eliminate duplicate frames; this tool does not extract or compare frames. Never replace one-frame removal with an arbitrary 0.2–0.5 second trim. Continuous background audio spans the joined timeline. Two-pass: dry_run=true (default) returns a plan to review with the user; dry_run=false renders it. Poll with var2_check_join_status (NOT var2_get_video_result).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional project name shown in the user's editor. | |
| dry_run | No | When true (default), returns the planned timeline + render-time estimate WITHOUT actually queuing the render, plus a `plan_id`. ALWAYS call with dry_run=true first, show the plan to the user, get explicit approval, then render by calling with ONLY {plan_id} — no other parameters needed. Renders take minutes-to-hours and use compute budget — never run without confirmation. | |
| plan_id | No | Render an approved plan exactly as shown: after user approval, call with ONLY {plan_id} — nothing else needed (dry_run defaults to render when plan_id is present). A jp_… id ALWAYS comes back HERE to START the render — it is a plan id, NOT a status id (status ids are plain UUIDs and go to var2_check_join_status). {plan_id, dry_run:true} re-displays the stored plan. If any parameter changed after the dry-run, resend full args instead. | |
| segments | Yes | Ordered list of clips on the timeline. ALWAYS ask the user about the order before calling — the order matters and cannot be changed after rendering starts. | |
| resolution | Yes | REQUIRED — always ask the user. 1080p renders roughly 2× longer than 720p but produces a sharper output. | |
| aspect_ratio | Yes | REQUIRED — always ask the user which one they want. 16:9 = landscape (YouTube/desktop), 9:16 = portrait (TikTok/Reels/Shorts), 1:1 = square (Instagram feed). | |
| background_audio_url | No | Optional separate audio track that spans the whole video (storage/signed URL, var2 share link, or placeholder_id — resolved server-side). Ask the user if they want background music. | |
| background_audio_volume | No | ||
| video_audio_when_stacked | No | How to handle the video's native audio when an audio source is layered on top (inline audio segments OR background_audio_url). When the timeline stacks video + audio, ALWAYS ask the user — and recommend `mute` as the first option (cleanest result, no clashing tracks). `reduce` keeps video audio at 0.2× under the music. `keep` plays both at full volume (usually clashes). | |
| background_audio_placeholder_id | No | STRONGLY RECOMMENDED whenever `background_audio_url` is set. The placeholder_id of the asset behind that URL (e.g. the id returned by var2_upload_asset). Without it the editor opens the saved project with an empty background-audio clip — no waveform, no playback in preview — even though the rendered mp4 mixes the audio correctly. The server auto-extracts var2 UUIDs from var2.ai share-page URLs and Supabase storage paths when possible. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears the full behavioral burden and does so: frame rounding (not whole seconds), no server-side frame extraction or comparison, renders take minutes-to-hours and consume compute budget, plan returns timeline_frames/fps, and plan_id lifecycle (jp_ prefix, resend full args if params changed). These are exactly the traits an agent cannot infer elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the two-pass contract, and most sentences earn their place. It is dense and long, and the duplicate-endpoint guidance is somewhat niche for the opening paragraph, but nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, multi-stage rendering tool with no output schema and no meaningful annotations, the description covers the full lifecycle: planning, review, approval, render, and polling handoff, plus what the plan returns. An agent has everything needed to invoke it correctly end-to-end.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 90%, so the baseline is 3. The description nonetheless adds real meaning beyond the schema: the plan_id-vs-status-id distinction, the 'call with ONLY {plan_id}' contract, and the 1/30s vs arbitrary-trim rule for duration_seconds. It stops short of covering every parameter (e.g. background_audio_volume), hence 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stitch videos / images / audio into one mp4 on a 30fps timeline'), and the 30fps timeline detail immediately distinguishes it from generic render/mux tools. The scope is unambiguous against siblings like var2_render_timeline or var2_create_video.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the two-pass workflow (dry_run=true first, review with user, then dry_run=false), states the default, and names the correct polling tool (var2_check_join_status, NOT var2_get_video_result). It also gives a concrete when-to-use rule for the duplicate-endpoint fix. This is close to exhaustive routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_list_modelsARead-onlyInspect
Model catalog + pricing. "What/which models are available", "show me <image|video|audio|3d> models", "any other options", "browse models" → THIS, even when a modality word like "3d" appears. Filter by modality (image | video | audio | 3d | modify). Not a generator; var2_get_results is only for showing 2+ finished assets.
| Name | Required | Description | Default |
|---|---|---|---|
| modality | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's job is lighter. It adds real value: it discloses that the response includes pricing, and that the tool is a catalog rather than a generator, which prevents wasted calls. It stops short of describing return shape or pagination, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and a dense block of trigger phrases that each earn their place by covering a distinct user phrasing. The pipe-separated style is terse, though the middle trigger list reads slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-param, read-only list tool with no output schema and annotations covering safety, the description supplies purpose, routing, and trigger coverage. Return format details are not required since no output schema exists, but pricing/catalog shape could be fleshed out slightly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is one enum parameter, but the enum values are self-explanatory strings in the schema. The description restates them ('image | video | audio | 3d | modify') and frames modality as a filter, which is only marginally more than the schema already conveys. Adequate but not compensatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Model catalog + pricing.' It immediately names what the tool returns and explicitly distinguishes itself from generator siblings ('Not a generator') and from var2_get_results. An agent can place it correctly in the toolset without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit trigger phrases ('What/which models are available', 'show me <modality> models', 'browse models') and an edge-case rule ('even when a modality word like 3d appears'), plus the negative condition routing away from var2_get_results. This is exactly the when/when-not/alternative structure that earns a top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_magic_replaceAInspect
Magic Replacer — edit an EXISTING video clip, keeping its motion. Engine: Seedance 2.5 (default) or MiniMax Hailuo 3 (engine: "minimax-h3"). Three modes: swap (Object Swap) replaces ONE named element — a product, person, outfit or prop — with what the reference image shows and keeps everything else (e.g. "put my serum bottle in her hand instead of the coffee cup", "replace the man in the red jacket with this character", "change her dress to this outfit"). transfer (Motion Transfer) keeps ONLY the motion, camera and timing and rebuilds cast + world from the references (e.g. "same dance, but this character on a beach"; keep_location=true keeps the original place). restyle keeps the people and motion and re-renders the look in a preset (e.g. "make this video anime / claymation / noir"). Use THIS tool whenever the input is an existing clip and the ask is replace / swap / recast / restyle. Use var2_create_video instead for NEW footage (text/image/reference-to-video), wan-2.7 for a free-form prompt edit of a clip, and ltx-retake to redo only a time range of a clip. Limits — seedance-2-5: source 4–30s, ≤8 reference images, 480p | 720p (default 720p), sound optional, billed per output second (= source seconds). minimax-h3: source 4–15s at 24–60 fps, ≤9 reference images (each beyond 5 costs extra), 768P | 2K (default 768P), always generates sound, billed per second of output + source clip. Trim longer clips first; output length and aspect ratio follow the source; upscale afterwards for more resolution. Do not pass a duration — the server measures the clip. Use the default engine unless the user asks for MiniMax / Hailuo / H3 or 2K output. Tips: character refs work best as a clean full-body photo or a multi-angle character sheet on a plain background (make one first with var2_create_image, model gpt-image-2, character-sheet prompt). In swap mode name the target concretely ("the blue mug on the desk") — or call first with analyze_only=true (free) to get the detected subjects with ids like "s2" plus a credit quote, then pass target:"s2". The scene analysis is saved per clip, so later calls on the same video_url reuse it instantly and the subject ids stay the same. For a cost estimate without analysis use var2_estimate_cost with model_id "magic-replacer", type "video-to-video", params {duration:, resolution, engine}. Returns a video placeholder (poll with var2_get_video_result). Reply in ONE short sentence + the share link; do not narrate tool calls.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | swap = replace one element, keep the rest. transfer = keep only motion/camera/timing, new cast + world from references. restyle = same people + motion, new look (needs preset, a style reference or an instruction). | |
| engine | No | Render engine. seedance-2-5 (default): 4–30s clips, 480p/720p, sound optional. minimax-h3 (MiniMax Hailuo 3): 4–15s clips at 24–60 fps, up to 9 reference images, 768P/2K, always with sound. | |
| preset | No | Style preset for restyle (and optionally transfer). | |
| target | No | swap: what to replace — a concrete description ("the coffee cup in her right hand") or a subject id from analyze_only ("s2"). Required for swap unless a reference has `replaces` or the instruction says it. | |
| analysis | No | Optional and rarely needed: the `analysis` object from a previous analyze_only call for the SAME video_url, passed back verbatim. The server already saves each clip's analysis and reuses it automatically. | |
| video_url | Yes | Source clip, 4–30s MP4/MOV, var2-hosted: storage URL, var2 share link (www.var2.ai/video/<id>) or placeholder_id — auto-resolved. Third-party links (dropbox/CDN/etc.): import first with var2_upload_asset (url); local files: upload first. | |
| references | No | Rich form: reference images (combined with reference_image_urls — up to 8 on seedance-2-5, 9 on minimax-h3), each with a role, optional label and what it replaces. swap and transfer need at least one. | |
| resolution | No | seedance-2-5: 480p | 720p (default 720p; 480p costs less than half). minimax-h3: 768P | 2K (default 768P). | |
| instruction | No | Optional free-text direction appended to the compiled prompt (e.g. "she smiles at the end", "golden-hour light"). | |
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| analyze_only | No | true = FREE pre-flight: measure the clip, list detected subjects (ids like "s1") and shots, report blocking issues and quote credits per resolution. Nothing is generated or charged. Use it when the swap target is ambiguous or the user asks what it would cost. | |
| keep_location | No | transfer only: keep the source video's real location instead of rebuilding it. Default false. | |
| generate_audio | No | Default true — keep / regenerate the clip's audio, dialogue and lip-sync timing. false = silent output. | |
| idempotency_key | No | Optional. Retries with the same key never double-bill (dedupes on ai_jobs.request_id). Use a stable per-user-action value (e.g. a UUID). | |
| reference_image_urls | No | Simple form: reference image URLs, each given the default role for the mode. Use `references` instead when images play different roles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations carrying only a title, the description bears full behavioral burden and delivers: per-engine duration/fps/reference limits, default resolutions, billing rules (per output second; minimax bills output + source), 'always generates sound' on minimax, the no-duration rule, analyze_only being free, per-clip analysis caching, and placeholder polling. This is unusually rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and modes before limits and tips, and given 15 parameters the length is largely justified. It is still a dense wall of text, and the trailing 'Reply in ONE short sentence + the share link; do not narrate tool calls' is output-format guidance that sits awkwardly inside the tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, it tells the agent it 'Returns a video placeholder (poll with var2_get_video_result),' and covers limits, billing, engine choice, target naming, and reference handling. Nothing needed to invoke this complex tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nonetheless adds practical meaning beyond the schema by explaining engine-selection heuristics ('use the default engine unless the user asks for MiniMax / Hailuo / H3 or 2K'), how to name the swap target, and character-reference best practices. Marginal gain is modest since the schema already documents every parameter thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('edit an EXISTING video clip, keeping its motion') and names the sibling alternatives it is not (var2_create_video for new footage, wan-2.7, ltx-retake). The three modes are spelled out with concrete examples, so an agent can distinguish this from every related sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use THIS tool whenever the input is an existing clip and the ask is replace / swap / recast / restyle,' then routes away from it for new footage, free-form prompt edits, and time-range retakes. It also directs the agent to analyze_only for ambiguity/cost and to var2_estimate_cost for a no-analysis estimate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_modify_imageAInspect
Remove background (cut out subject, transparent) OR upscale (2K/4K/8K, "sharper", "enhance", "isolate the ") an existing IMAGE — even when it is a www.var2.ai/image/ link. type ∈ upscale | remove-bg (no other type exists). IMAGE ONLY — judge by media type, not "edit"/"extend": track/song edits → var2_create_audio; video edits → var2_create_video / var2_join_videos. image_url: storage URL, var2 share link, or any https URL. Models: topaz-upscale (upscale_factor 2–6, default 2; credits scale with output megapixels), recraft-upscale (≤2048px), remove-background. Stylistic edits → var2_create_image type=image-to-image.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Default upscale. | |
| model | No | Default topaz-upscale. | |
| image_url | Yes | Storage URL, var2 share link (www.var2.ai/image/<id> — auto-resolved), or any public https URL. | |
| webhook_url | No | Optional. https:// URL var2 POSTs a signed delivery to when the asset is ready (or fails). Signature header: X-VAR2-Signature: t=<unix>, v1=<hex(hmac_sha256(webhook_secret, t + "." + body))>. Retried with exponential backoff (8 attempts over ~4 days). | |
| upscale_factor | No | topaz-upscale only. Default 2. Output = image × factor per side (max 100 MP); credits are charged per started 8 MP of output. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description still carries real behavioral weight: it names the available models and their limits (recraft ≤2048px, topaz factor 2–6), discloses that credits scale with output megapixels, and notes var2 share links are auto-resolved. It never says the job is asynchronous or how results are fetched, which is the one notable omission for a generation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two core operations, then candidate triggers, then disambiguation. Dense and slightly overloaded with parenthetical synonyms and arrow chains, but nearly every clause routes or constrains a decision rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter async image tool with no output schema, the description covers types, models, credit implications, and input URL forms, with the webhook delivery contract documented in the schema. The missing piece is that the result is retrieved asynchronously (presumably via var2_get_image_result), leaving the post-call lifecycle implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds value the schema lacks: it enumerates the valid model names and their resolution constraints, and cites the natural-language triggers that map to each type value. Defaults and factor range largely restate the schema, keeping it out of 5 territory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States two specific operations (background removal and upscaling) on a specific resource (an existing IMAGE), and explicitly disambiguates from siblings by media type: audio edits go to var2_create_audio, video to var2_create_video/var2_join_videos, stylistic edits to var2_create_image. An agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for use (upscale cues like 'sharper', 'enhance', '2K/4K/8K'; cut-out for background removal), states the closed type set ('no other type exists'), and routes alternative intents to the correct sibling tools. When-not-to-use is covered via the media-type exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_render_timelineAInspect
Build a PRECISE multi-track video timeline — explicit per-clip start times, overlaps, per-clip mute/volume/fades/trim, TEXT/CAPTION overlays with styling, audio tracks with offsets — and save it as an editable project (render=false, default) or queue the render (render=true). Accepts a simplified tracks[] or the raw GUI editor schema; captions turns word/line lyrics timestamps into a styled caption track server-side. Frames at 30fps are canonical; seconds fields are converted exactly. For simple back-to-back concatenation use var2_join_videos instead; status of a queued render → var2_check_join_status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| assets | No | Raw-schema mode: map of assetId → url / var2 share link / placeholder_id. | |
| render | No | Default false = save project only (user edits in GUI). true = also queue the render now. | |
| schema | No | RAW GUI editor ProjectSchema passthrough (fps/width/height/durationInFrames/tracks with startFrame+durationInFrames). Use with `assets`. | |
| tracks | No | Simplified timeline: [{type: video|image|audio|text, muted?, clips: [{type?, asset? (url/share link/placeholder_id), text? (string or {content,fontSize,color,backgroundColor,alignment,bold}), start_seconds?, duration_seconds (required), trim_start_seconds?, muted?, volume?, fade_in_seconds?, fade_out_seconds?, label?, objectFit?}]}]. Omitted start_seconds appends after the previous clip in the track. | |
| captions | No | Server-computed caption/lyrics track — no frame math needed: {timestamps: [{text, start_seconds, end_seconds}] (word- OR line-level), max_words_per_caption? (word-level, default 4), style? (TextProps overrides), position? (bottom|top|center)}. Appended as a text track to the timeline. | |
| resolution | No | Default 1080p (render only). | |
| aspect_ratio | No | Default 16:9. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears the disclosure burden and does well: it names the default mode, states that render=true queues (not completes) the render, and that captions are computed server-side with 'no frame math needed.' It stops short of saying what the call returns or what permissions are required, which is the only notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then mode/default, then the sibling escapes. It is dense with em-dash-heavy clauses but nearly every clause carries distinct information (modes, defaults, alternatives, captions behavior), with little padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with nested track/caption objects and no output schema, the description covers modes, defaults, input dialects (simplified tracks[] vs raw GUI schema), and how to get render status, which is enough to call it correctly. It could still say what a successful call returns (project id / job id), but the sibling hand-off mitigates that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 88%, so the schema documents name, assets, render, schema, tracks, captions, resolution and aspect_ratio in detail. The description mostly restates those fields; its only added semantic is that 30fps frames are canonical and 'seconds fields are converted exactly.' Baseline 3 is appropriate given the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Build a PRECISE multi-track video timeline ... save it as an editable project or queue the render') and contrasts itself against siblings by name (var2_join_videos, var2_check_join_status). An agent can distinguish it from var2_join_videos and var2_create_video without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'For simple back-to-back concatenation use var2_join_videos instead' and 'status of a queued render → var2_check_join_status.' It also gives the mode condition (render=false = save project, render=true = queue render) up front, so the when-to-use decision is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_request_uploadAInspect
Signed URL to upload a LOCAL file straight into var2 (durable, first-party, no expiry). Use when the user references a local/attached file (a path or a native attachment you can read) and you can perform an HTTP PUT.
Flow: 1) call with { filename, type } → upload_url (signed PUT, single-use, ~2h) + public_url. 2) PUT the raw bytes to upload_url (curl -X PUT --data-binary @./logo.png -H "Content-Type: image/png" "<upload_url>") — bytes never pass through model context. 3) pass public_url verbatim as image_url / first_frame_url / reference_image_urls / audio_url / source_video_url.
PUT blocked (sandboxed egress / host_not_allowed)? Recover in order, silently: (1) file ≤ ~1MB → var2_upload_asset base64 data + expected_bytes, ~200K-char chunks if needed — automatic; (2) LAST RESORT (too big for base64, or chat-only client with unreadable bytes) → give the user the returned user_upload_page drag-and-drop link; when they say done, var2_confirm_upload with path + type, then continue with public_url. Never downscale a file to dodge a blocked PUT.
Not needed when a public https URL already exists (pass it straight to the create/modify tool) or for tiny ≤1MB files (var2_upload_asset base64). Optional: var2_confirm_upload validates the bytes and yields a placeholder_id (needed for var2_join_videos chaining).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Modality of the asset being uploaded. | |
| filename | No | The local file name (e.g. "logo.png"). Only the extension is used, to give the stored object a clean URL. Optional. | |
| content_type | No | MIME of the file (e.g. "image/png"). Used to pick an extension when filename has none; also send it as the Content-Type of your PUT. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title annotation, the description carries the full burden and does so richly: single-use signed PUT, ~2h expiry, bytes never pass through model context, and the concrete host_not_allowed / sandboxed-egress failure mode with silent recovery steps. This is far beyond what any structured field provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a numbered flow and a labeled recovery ladder — highly scannable. It is long, but nearly every sentence carries operational detail (PUT example, chunk sizes, anti-downscaling rule) rather than filler, so it mostly earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains all return values (upload_url, public_url, user_upload_page, placeholder_id) and the exact downstream fields public_url feeds into. For a multi-step upload tool this is complete enough to drive correct orchestration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the three parameters are already fully documented in the schema. The description restates the call shape {filename, type} and adds that public_url must be passed verbatim to downstream fields, but contributes little parameter-level meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Signed URL to upload a LOCAL file straight into var2'. It also distinguishes itself from siblings by naming var2_upload_asset and var2_confirm_upload and clarifying scope ('LOCAL file', 'durable, first-party, no expiry'). An agent can tell it apart from the base64 upload path immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('user references a local/attached file... and you can perform an HTTP PUT') and when NOT ('Not needed when a public https URL already exists... or for tiny ≤1MB files'). It also provides an ordered recovery ladder and names the exact fallback tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_save_characterAInspect
Save a CHARACTER SHEET (or product/style sheet) for reuse across sessions — a named set of reference images. Triggers: "save this character as Dana", "keep these angles of the avatar", "save the coffee cup as our hero product". Copies images into the in-app element library, returns durable urls; same name again replaces the sheet. UGC flow: hero image → upscale → image-to-image angles → save here. One-off uploads → var2_upload_asset.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Default character. | |
| name | Yes | Sheet name to save under (any language) — you will fetch it later by this name. | |
| notes | No | Style/wardrobe/persona notes to remember with the sheet. | |
| images | Yes | The sheet images — urls / share links / placeholder_ids (auto-resolved). Optionally {url, angle} with labels like "front", "profile", "3quarter", "full-body". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only a title in annotations, the description carries the behavioral burden and delivers the important non-obvious facts: images are copied into the in-app element library, durable URLs are returned, and re-using the same name replaces the existing sheet (an overwrite/upsert semantic that is not readable from the schema). It omits permission/auth requirements and any rate or size constraints beyond what the schema encodes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then triggers, then flow guidance, then the sibling disambiguation. It is dense rather than bloated, though the run of example trigger phrases is longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description discloses the return value (durable URLs) and the overwrite behavior. For a 4-param upsert-style tool with full schema coverage and a title-only annotation set, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for the name parameter by explaining the sheet is fetched later by that name and that re-using the name replaces the sheet — behavior the schema does not state. The kind/notes/images params are left to the (already thorough) schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (save) and resource (character sheet = named set of reference images for reuse across sessions), and explicitly contrasts with the sibling var2_upload_asset for one-off uploads. An agent can distinguish it from upload/asset tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrases, names the alternative (var2_upload_asset) with the condition that selects it, and sketches the intended UGC pipeline (hero image → upscale → image-to-image angles → save). When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_trim_audioAInspect
Cut or SPLIT AUDIO (a song / track / recording) by time — the only tool for that. Triggers: "cut seconds X to Y out of my song", "split this track into pieces", "keep only 0:12–0:40", "first 45 seconds", "shorten to 60s for pruna-avatar / heygen-avatar-iv". Modes: one range (start/end); explicit segments in ONE call (segments=[{start_seconds,end_seconds,id?},…]); SMART lyrics split (lyrics_timestamps + target/min/max_segment_seconds — never cuts mid-word, prefers line/chorus ends). Returns NEW asset(s) (url + placeholder_id); original untouched. audio_url: storage URL, var2 share link, or placeholder_id. Making new/longer music (extend, replace a section) → var2_create_audio; voice-overs → var2_create_dialog.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional title for the asset library (single-cut mode). | |
| segments | No | Batch split: several cuts from the same track in ONE call, e.g. [{start_seconds:0,end_seconds:8},{start_seconds:8,end_seconds:16}]. Each returns its own asset. | |
| audio_url | Yes | The track to cut from — storage URL, var2 share link (www.var2.ai/music/<id>), or placeholder_id (auto-resolved). | |
| end_seconds | No | Single cut: end, in seconds. Pass this OR duration_seconds. | |
| start_seconds | No | Single cut: start, in seconds. Default 0. | |
| duration_seconds | No | Single cut: length, in seconds. Pass this OR end_seconds. | |
| lyrics_timestamps | No | Smart split: word-level timestamps [{word,start,end,break?}] (break ∈ line|bar|chorus on a line's LAST word). The server picks cuts that NEVER land mid-word and prefer line/chorus ends, sized by target/min/max_segment_seconds. Returns scene_1..N assets. | |
| max_segment_seconds | No | HARD ceiling in every mode — never exceeded. Smart split cuts INSIDE the limit (mid-verse at a word end if a verse overshoots); explicit/single ranges that overshoot are rejected. Default 60 for lyrics mode (pruna-avatar / heygen-avatar-iv audio cap). | |
| min_segment_seconds | No | Smart split: hard minimum. Default 4. | |
| target_segment_seconds | No | Smart split: preferred segment length. Default 8. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry a title, so the description bears the burden and delivers key behavior: it returns NEW asset(s) with url + placeholder_id while the 'original untouched' (non-destructive). It does not mention auth needs, rate limits, or failure handling, but the non-destructive return contract is the most important trait for this operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the exclusivity claim, then triggers, then modes, then routing — a logical order with no filler. It is dense (a long compound paragraph with many semicolon clauses), which slightly trades readability for completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, no output schema, and no annotations beyond a title, the description still covers return shape (url + placeholder_id), non-destructive behavior, all three modes, segment caps/defaults, and sibling routing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (baseline 3), yet the description adds real meaning beyond the schema: the interplay of start/end vs duration, the SMART lyrics-split guarantee ('never cuts mid-word, prefers line/chorus ends'), and mode defaults. It goes beyond restating field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb(s) and resource ('Cut or SPLIT AUDIO (a song / track / recording) by time') and explicitly claims exclusivity ('the only tool for that'). It also names the sibling tools it is not (var2_create_audio, var2_create_dialog) so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrases ('cut seconds X to Y out of my song', 'first 45 seconds'), enumerates the three operating modes, and explicitly routes alternatives: extend/replace music → var2_create_audio, voice-overs → var2_create_dialog. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
var2_upload_assetAInspect
Upload a file the user ATTACHED to the chat (a photo from their phone, "my logo as a PNG", a voice memo) when NO link exists for it yet. If the message already contains a link or placeholder_id for the file, this tool is WRONG — a www.var2.ai / api.var2.ai / .supabase.co link is already inside var2; hand it to the matching create/modify/get tool. Sole pasted-link exception: NON-var2 link + explicit "import / pull it into var2". Text-only request, no file ("I want a song and cover art") → the matching create_ generator. When it IS an upload: call this FIRST, then pass the returned url verbatim as image_url / first_frame_url / reference_image_urls / audio_url / source_video_url. If your host filled in file (a native attachment object), just send it as-is — no url, no base64. Stores bytes durably in var2 storage; returns a first-party url (no expiry) + placeholder_id for var2_join_videos chaining. ≤100MB per file. base64 data: ALWAYS pass expected_bytes (+ sha256 if known) so truncation is rejected; >1.4M chars → parts via chunk_index/chunk_total/upload_id. Never pre-shrink a file to fit.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public https URL of the asset to rehost/import. Must be reachable from Vercel's egress; private/loopback hostnames are rejected. Provide EITHER `url` or `data` (not both). | |
| data | No | Base64 (or a `data:` URL) of the raw bytes — for a SMALL local file with no public URL when the client has no shell to PUT with. Hard-capped at 1MB; larger files MUST use var2_request_upload. Provide EITHER `url` or `data` (not both). | |
| file | No | NATIVE attachment input. Hosts that support file params (ChatGPT via `_meta["openai/fileParams"]`) fill this in themselves when the user attaches a file — you do NOT construct it. The server reads its `download_url` and imports the bytes directly, so no PUT, no base64 and no browser step is involved. Hosts without file-param support never send this; use `url` or `data` there. | |
| name | No | Optional display name. Stored in the generation row's prompt/title so it shows up cleanly in the user's asset library. | |
| type | Yes | Modality of the asset. The server validates the bytes (Content-Type for `url`, plus a magic-byte signature check either way) match image/* / video/* / audio/*; a mismatch rejects the upload. | |
| sha256 | No | Hex sha256 of the original file — verified end-to-end when provided. | |
| upload_id | No | Chunk-session id. Omit on part 0 (response returns one); pass it on every later part. The final part assembles, validates and stores. | |
| chunk_index | No | Chunked upload for files whose base64 exceeds one call: slice the base64 STRING into parts (~200K chars each recommended — a part is emitted as tool-call tokens, so keep it small enough to produce reliably; 1.4M hard cap; any split point) and send one part per call in `data`. 0-based part number. | |
| chunk_total | No | Total parts. Required with chunk_index. | |
| content_type | No | MIME of the inline `data` (e.g. "image/png"). Optional — the magic-byte check derives the real type regardless. | |
| expected_bytes | No | Size of the ORIGINAL file in bytes. STRONGLY recommended with `data`: a decoded-size mismatch is rejected instead of storing a truncated file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title, so the description bears the full behavioral burden and delivers: durable storage, a no-expiry first-party url plus placeholder_id, a 100MB per-file cap, the requirement to pass expected_bytes/sha256 with base64 so truncation is rejected, and chunking behavior for large base64. This goes well beyond anything in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core distinction from create/modify/get tools and the create_* fallback leads, followed by operational detail. Every sentence is load-bearing for this routing-heavy tool, though the parenthetical-heavy style makes it heavier than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter tool with nested objects and no output schema, the description explains the return values (url, placeholder_id) and the full upload/chunking contract, so an agent has everything needed to invoke it correctly and use its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters including the chunk-session semantics and the native `file` object. The description reinforces usage (send the returned url verbatim as image_url/audio_url, pass expected_bytes) but adds little that isn't already in the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Upload a file the user ATTACHED to the chat") with concrete examples (photo, logo PNG, voice memo) and explicitly distinguishes itself from the create_* generator siblings and the matching create/modify/get tools. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (attached file, no link yet), when-NOT (link or placeholder_id present → hand to create/modify/get tool), the single pasted-link exception, and the text-only alternative (create_* generator). It also states this is called FIRST and how the returned url feeds later calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
var2_estimate_cost1 field changed- added
Input schema / properties / items / items / properties / params / descriptionAdded value: +"Same params as the create/modify call. topaz-upscale: pass image_url (or input_width + input_height) and upscale_factor for an exact quote."
- Changed
var2_modify_image1 field changed- added
Input schema / properties / upscale_factorAdded value: +{ + "description": "topaz-upscale only. Default 2. Output = image × factor per side (max 100 MP); credits are charged per started 8 MP of output.", + "enum": [ + 2, + 3, + 4, + 5, + 6 + ], + "type": "integer" +}
1 tool update
- Changed
var2_create_video1 field changed- added
Input schema / properties / reference_labelsAdded value: +{ + "additionalProperties": false, + "description": "seedance-2 / seedance-2.5 / seedance-2-mini / minimax-h3 — optional short names for the reference media, aligned by index with reference_image_urls / reference_video_urls / reference_audio_urls (e.g. {\"images\": [\"david\", \"castle at night\"], \"videos\": [\"dolly move\"]}). The server prepends them to the prompt as a \"[Reference assets]\" mapping (\"@Image 1: david\") so the model binds each asset; leave an entry null to use the type default. ≤64 per type, ≤80 chars each.", + "properties": { + "audios": { + "items": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "maxItems": 64, + "type": "array" + }, + "images": { + "items": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "maxItems": 64, + "type": "array" + }, + "videos": { + "items": { + "maxLength": 80, + "type": [ + "string", + "null" + ] + }, + "maxItems": 64, + "type": "array" + } + }, + "type": "object" +}
1 tool update
- Changed
var2_create_video12 fields changed- changed
Input schema / properties / duration / descriptionPrevious value: -"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10. minimax-h3: whole seconds 4-15 (default 6). wan-3 / wan-3-prime: whole seconds 2-30 (default 5; reference video + output ≤ 30s)."New value: +"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10. minimax-h3: whole seconds 4-15 (default 6). wan-3 / wan-3-prime: whole seconds 2-30 (default 5; reference video + output ≤ 30s). kling-3-omni: whole seconds 3-15 (default 5; ignored with a video — the output follows the clip)." - changed
Input schema / properties / image_urls / descriptionPrevious value: -"kling-3 only (type=text-to-video): [startFrame] or [startFrame, endFrame] to drive the shot from images."New value: +"kling-3 (type=text-to-video) / kling-3-omni: [startFrame] or [startFrame, endFrame] to drive the shot from images (same as first_frame_url / last_frame_url)." - changed
Input schema / properties / kling_elements / descriptionPrevious value: -"kling-3 only (type=text-to-video): subject reference images for character/object consistency. Each element is a named subject backed by 2+ images."New value: +"kling-3 (type=text-to-video) / kling-3-omni: subject reference images for character/object consistency. Each element is a named subject backed by 2+ images (kling-3-omni: 2–4, ≤3 elements, one-word names, not with a video); write @name in the prompt to place it." - changed
Input schema / properties / last_frame_url / descriptionPrevious value: -"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1, minimax-h3, wan-3, wan-3-prime (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)"New value: +"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1, minimax-h3, wan-3, wan-3-prime, kling-3-omni (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)" - changed
Input schema / properties / model / enumPrevious value: -[ - "veo-3.1", - "ltx-2.3", - "ltx-retake", - "wan-2.7", - "seedance-2", - "seedance-2.5", - "seedance-2-mini", - "happyhorse", - "kling", - "kling-3", - "kling-motion-control", - "kling-3-motion-control", - "gemini-omni-video", - "gemini-omni-flash-1-1", - "minimax-h3", - "wan-3", - "wan-3-prime", - "sora-2", - "grok-imagine", - "pruna-avatar", - "heygen-avatar-iv" -]New value: +[ + "veo-3.1", + "ltx-2.3", + "ltx-retake", + "wan-2.7", + "seedance-2", + "seedance-2.5", + "seedance-2-mini", + "happyhorse", + "kling", + "kling-3", + "kling-motion-control", + "kling-3-motion-control", + "gemini-omni-video", + "gemini-omni-flash-1-1", + "minimax-h3", + "wan-3", + "wan-3-prime", + "kling-3-omni", + "sora-2", + "grok-imagine", + "pruna-avatar", + "heygen-avatar-iv" +] - changed
Input schema / properties / multi_shots / descriptionPrevious value: -"kling-3 only — true to render a multi-shot sequence from `shots`."New value: +"kling-3 / kling-3-omni — true to render a multi-shot sequence from `shots` (kling-3-omni: not with a video)." - changed
Input schema / properties / reference_image_urls / descriptionPrevious value: -"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3 / wan-3 / wan-3-prime) — character/style reference images (plural array; seedance-2 / seedance-2-mini accept up to 9, seedance-2.5 up to 30, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee; wan-3 / wan-3-prime up to 10, free — name them Image1, Image2… in the prompt). veo-3.1 reference mode uses reference_images instead."New value: +"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3 / wan-3 / wan-3-prime / kling-3-omni) — character/style reference images (plural array; seedance-2 / seedance-2-mini accept up to 9, seedance-2.5 up to 30, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee; wan-3 / wan-3-prime up to 10, free — name them Image1, Image2… in the prompt; kling-3-omni up to 7 shared with kling_elements, 4 next to a video). veo-3.1 reference mode uses reference_images instead." - changed
Input schema / properties / reference_video_urls / descriptionPrevious value: -"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation. minimax-h3: up to 3 (each 2-15s, ≤15s combined), their seconds are billed at the same per-second rate as the output. wan-3 / wan-3-prime: up to 5 (each 1-15s, ≤15s combined, + output ≤ 30s), billed like minimax-h3 — name them Video1, Video2… in the prompt."New value: +"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation. minimax-h3: up to 3 (each 2-15s, ≤15s combined), their seconds are billed at the same per-second rate as the output. wan-3 / wan-3-prime: up to 5 (each 1-15s, ≤15s combined, + output ≤ 30s), billed like minimax-h3 — name them Video1, Video2… in the prompt. kling-3-omni: ONE 3-15s clip (+ up to 4 reference_image_urls); the output follows its length, billed at the video-input rate." - changed
Input schema / properties / resolution / descriptionPrevious value: -"grok: 480p | 720p. wan-2.7: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. minimax-h3: 768P (default) | 2K. wan-3 / wan-3-prime: 480p | 720p (default) | 1080p. Others: model-specific."New value: +"grok: 480p | 720p. wan-2.7: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. minimax-h3: 768P (default) | 2K. wan-3 / wan-3-prime: 480p | 720p (default) | 1080p. kling-3-omni: 720p (default) | 1080p | 4k. Others: model-specific." - changed
Input schema / properties / shots / descriptionPrevious value: -"kling-3 multi-shot sequence (when multi_shots=true). Each shot has its own prompt + duration (seconds)."New value: +"kling-3 / kling-3-omni multi-shot sequence (when multi_shots=true). Each shot has its own prompt + duration (seconds). kling-3-omni: ≤6 shots, 1–12s each, ≤512 chars, 3–15s total." - changed
Input schema / properties / sound / descriptionPrevious value: -"kling / kling-3 — generate audio alongside the video. (ltx-2.3 always renders native audio; seedance uses generate_audio.)"New value: +"kling / kling-3 / kling-3-omni — generate audio alongside the video (kling-3-omni: not with a video input). (ltx-2.3 always renders native audio; seedance uses generate_audio.)" - changed
Input schema / properties / video_url / descriptionPrevious value: -"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it). minimax-h3: a 2-15s clip used as the motion/scene reference, billed as input seconds. wan-3 / wan-3-prime: a 1-15s clip used as reference Video1, billed as input seconds."New value: +"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it). minimax-h3: a 2-15s clip used as the motion/scene reference, billed as input seconds. wan-3 / wan-3-prime: a 1-15s clip used as reference Video1, billed as input seconds. kling-3-omni: a 3-15s clip to edit (+ up to 4 reference_image_urls), billed on its seconds at the video-input rate."
1 tool update
- Changed
var2_create_video10 fields changed- changed
Input schema / properties / aspect_ratio / descriptionPrevious value: -"kling/grok: 1:1 | 16:9 | 9:16. veo/sora: portrait | landscape."New value: +"kling/grok: 1:1 | 16:9 | 9:16. veo/sora: portrait | landscape. wan-3 / wan-3-prime: auto (default) | 16:9 | 9:16 | 1:1 | 4:3 | 3:4." - changed
Input schema / properties / duration / descriptionPrevious value: -"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10. minimax-h3: whole seconds 4-15 (default 6)."New value: +"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10. minimax-h3: whole seconds 4-15 (default 6). wan-3 / wan-3-prime: whole seconds 2-30 (default 5; reference video + output ≤ 30s)." - changed
Input schema / properties / generate_audio / descriptionPrevious value: -"seedance-2 / seedance-2.5 / seedance-2-mini — generate audio (default true)."New value: +"seedance-2 / seedance-2.5 / seedance-2-mini / wan-3 / wan-3-prime — generate audio (default true)." - changed
Input schema / properties / last_frame_url / descriptionPrevious value: -"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1, minimax-h3 (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)"New value: +"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1, minimax-h3, wan-3, wan-3-prime (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)" - changed
Input schema / properties / model / enumPrevious value: -[ - "veo-3.1", - "ltx-2.3", - "ltx-retake", - "wan-2.7", - "seedance-2", - "seedance-2.5", - "seedance-2-mini", - "happyhorse", - "kling", - "kling-3", - "kling-motion-control", - "kling-3-motion-control", - "gemini-omni-video", - "gemini-omni-flash-1-1", - "minimax-h3", - "sora-2", - "grok-imagine", - "pruna-avatar", - "heygen-avatar-iv" -]New value: +[ + "veo-3.1", + "ltx-2.3", + "ltx-retake", + "wan-2.7", + "seedance-2", + "seedance-2.5", + "seedance-2-mini", + "happyhorse", + "kling", + "kling-3", + "kling-motion-control", + "kling-3-motion-control", + "gemini-omni-video", + "gemini-omni-flash-1-1", + "minimax-h3", + "wan-3", + "wan-3-prime", + "sora-2", + "grok-imagine", + "pruna-avatar", + "heygen-avatar-iv" +] - changed
Input schema / properties / reference_audio_urls / descriptionPrevious value: -"reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks (≤15s combined); seedance-2.5: up to 10 (≤30s combined); minimax-h3: up to 3 (free; needs a reference image or video alongside)."New value: +"reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks (≤15s combined); seedance-2.5: up to 10 (≤30s combined); minimax-h3: up to 3 (free; needs a reference image or video alongside); wan-3 / wan-3-prime: up to 5 (each 1-15s, ≤15s combined, free) — name them Audio1, Audio2… in the prompt." - changed
Input schema / properties / reference_image_urls / descriptionPrevious value: -"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3) — character/style reference images (plural array; seedance-2 / seedance-2-mini accept up to 9, seedance-2.5 up to 30, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee). veo-3.1 reference mode uses reference_images instead."New value: +"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3 / wan-3 / wan-3-prime) — character/style reference images (plural array; seedance-2 / seedance-2-mini accept up to 9, seedance-2.5 up to 30, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee; wan-3 / wan-3-prime up to 10, free — name them Image1, Image2… in the prompt). veo-3.1 reference mode uses reference_images instead." - changed
Input schema / properties / reference_video_urls / descriptionPrevious value: -"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation. minimax-h3: up to 3 (each 2-15s, ≤15s combined), their seconds are billed at the same per-second rate as the output."New value: +"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation. minimax-h3: up to 3 (each 2-15s, ≤15s combined), their seconds are billed at the same per-second rate as the output. wan-3 / wan-3-prime: up to 5 (each 1-15s, ≤15s combined, + output ≤ 30s), billed like minimax-h3 — name them Video1, Video2… in the prompt." - changed
Input schema / properties / resolution / descriptionPrevious value: -"grok: 480p | 720p. wan: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. minimax-h3: 768P (default) | 2K. Others: model-specific."New value: +"grok: 480p | 720p. wan-2.7: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. minimax-h3: 768P (default) | 2K. wan-3 / wan-3-prime: 480p | 720p (default) | 1080p. Others: model-specific." - changed
Input schema / properties / video_url / descriptionPrevious value: -"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it). minimax-h3: a 2-15s clip used as the motion/scene reference, billed as input seconds."New value: +"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it). minimax-h3: a 2-15s clip used as the motion/scene reference, billed as input seconds. wan-3 / wan-3-prime: a 1-15s clip used as reference Video1, billed as input seconds."
1 tool update
- Changed
var2_create_video3 fields changed- changed
Input schema / properties / reference_audio_urls / descriptionPrevious value: -"reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks; seedance-2.5: up to 10 (≤30s combined); minimax-h3: up to 3 (free; needs a reference image or video alongside)."New value: +"reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks (≤15s combined); seedance-2.5: up to 10 (≤30s combined); minimax-h3: up to 3 (free; needs a reference image or video alongside)." - changed
Input schema / properties / reference_image_urls / descriptionPrevious value: -"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3) — character/style reference images (plural array; seedance-2.5 accepts up to 50, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee). veo-3.1 reference mode uses reference_images instead."New value: +"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3) — character/style reference images (plural array; seedance-2 / seedance-2-mini accept up to 9, seedance-2.5 up to 30, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee). veo-3.1 reference mode uses reference_images instead." - changed
Input schema / properties / sound / descriptionPrevious value: -"kling / kling-3 / ltx-2.3 — generate audio alongside the video."New value: +"kling / kling-3 — generate audio alongside the video. (ltx-2.3 always renders native audio; seedance uses generate_audio.)"
1 tool update
- Changed
var2_create_image2 fields changed- changed
Input schema / properties / image_refs / descriptionPrevious value: -"Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2, gpt-image-2-5, grok-imagine-image-2); ignored by others."New value: +"Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2, gpt-image-2-5, grok-imagine-image-2, seedream-5-pro); ignored by others." - changed
Input schema / properties / resolution / descriptionPrevious value: -"Output size of the NEW generation — does not upscale an existing image (that is var2_modify_image)."New value: +"Output size of the NEW generation — does not upscale an existing image (that is var2_modify_image). seedream-5-pro: 1K or 2K (default 2K)."
1 tool update
- Changed
var2_magic_replace1 field changed- changed
Input schema / properties / analysis / descriptionPrevious value: -"Optional: the `analysis` object returned by a previous analyze_only call for the SAME video_url, passed back verbatim to skip a second scene scan."New value: +"Optional and rarely needed: the `analysis` object from a previous analyze_only call for the SAME video_url, passed back verbatim. The server already saves each clip's analysis and reuses it automatically."
1 tool update
- Changed
var2_magic_replace6 fields changed- added
Input schema / properties / engineAdded value: +{ + "description": "Render engine. seedance-2-5 (default): 4–30s clips, 480p/720p, sound optional. minimax-h3 (MiniMax Hailuo 3): 4–15s clips at 24–60 fps, up to 9 reference images, 768P/2K, always with sound.", + "enum": [ + "seedance-2-5", + "minimax-h3" + ], + "type": "string" +} - changed
Input schema / properties / reference_image_urls / maxItemsPrevious value: -8New value: +9 - changed
Input schema / properties / references / descriptionPrevious value: -"Rich form: up to 8 reference images (combined with reference_image_urls), each with a role, optional label and what it replaces. swap and transfer need at least one."New value: +"Rich form: reference images (combined with reference_image_urls — up to 8 on seedance-2-5, 9 on minimax-h3), each with a role, optional label and what it replaces. swap and transfer need at least one." - changed
Input schema / properties / references / maxItemsPrevious value: -8New value: +9 - changed
Input schema / properties / resolution / descriptionPrevious value: -"Default 720p. 480p costs less than half."New value: +"seedance-2-5: 480p | 720p (default 720p; 480p costs less than half). minimax-h3: 768P | 2K (default 768P)." - changed
Input schema / properties / resolution / enumPrevious value: -[ - "480p", - "720p" -]New value: +[ + "480p", + "720p", + "768P", + "2K" +]
1 tool update
- Changed
var2_create_audio4 fields changed- changed
Input schema / properties / model_version / defaultPrevious value: -"V5_5"New value: +"V6" - changed
Input schema / properties / model_version / descriptionPrevious value: -"Default V5_5 (latest). Older only for a specific sound."New value: +"Default V6 (latest). V6_WILD for bolder, more experimental takes. Older only for a specific sound." - changed
Input schema / properties / model_version / enumPrevious value: -[ - "V4", - "V4_5", - "V4_5PLUS", - "V4_5ALL", - "V5", - "V5_5" -]New value: +[ + "V4", + "V4_5", + "V4_5PLUS", + "V4_5ALL", + "V5", + "V5_5", + "V6", + "V6_WILD" +] - changed
Input schema / properties / prompt / descriptionPrevious value: -"customMode=false: song description ≤500 chars (Suno writes lyrics). customMode=true: full lyrics."New value: +"customMode=false: song description ≤2800 chars on V6/V6_WILD, ≤500 on older (Suno writes lyrics). customMode=true: full lyrics."
1 tool update
- Changed
var2_create_video8 fields changed- changed
Input schema / properties / duration / descriptionPrevious value: -"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10."New value: +"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10. minimax-h3: whole seconds 4-15 (default 6)." - changed
Input schema / properties / last_frame_url / descriptionPrevious value: -"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1 (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)"New value: +"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1, minimax-h3 (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)" - changed
Input schema / properties / model / enumPrevious value: -[ - "veo-3.1", - "ltx-2.3", - "ltx-retake", - "wan-2.7", - "seedance-2", - "seedance-2.5", - "seedance-2-mini", - "happyhorse", - "kling", - "kling-3", - "kling-motion-control", - "kling-3-motion-control", - "gemini-omni-video", - "gemini-omni-flash-1-1", - "sora-2", - "grok-imagine", - "pruna-avatar", - "heygen-avatar-iv" -]New value: +[ + "veo-3.1", + "ltx-2.3", + "ltx-retake", + "wan-2.7", + "seedance-2", + "seedance-2.5", + "seedance-2-mini", + "happyhorse", + "kling", + "kling-3", + "kling-motion-control", + "kling-3-motion-control", + "gemini-omni-video", + "gemini-omni-flash-1-1", + "minimax-h3", + "sora-2", + "grok-imagine", + "pruna-avatar", + "heygen-avatar-iv" +] - changed
Input schema / properties / reference_audio_urls / descriptionPrevious value: -"seedance reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks; seedance-2.5: up to 10 (≤30s combined)."New value: +"reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference audio tracks; seedance-2.5: up to 10 (≤30s combined); minimax-h3: up to 3 (free; needs a reference image or video alongside)." - changed
Input schema / properties / reference_image_urls / descriptionPrevious value: -"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1) — character/style reference images (plural array; seedance-2.5 accepts up to 50, the gemini-omni models up to 7). veo-3.1 reference mode uses reference_images instead."New value: +"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1 / minimax-h3) — character/style reference images (plural array; seedance-2.5 accepts up to 50, the gemini-omni models up to 7, minimax-h3 up to 9 — first 5 free, each extra adds a flat fee). veo-3.1 reference mode uses reference_images instead." - changed
Input schema / properties / reference_video_urls / descriptionPrevious value: -"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation."New value: +"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation. minimax-h3: up to 3 (each 2-15s, ≤15s combined), their seconds are billed at the same per-second rate as the output." - changed
Input schema / properties / resolution / descriptionPrevious value: -"grok: 480p | 720p. wan: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. Others: model-specific."New value: +"grok: 480p | 720p. wan: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. minimax-h3: 768P (default) | 2K. Others: model-specific." - changed
Input schema / properties / video_url / descriptionPrevious value: -"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it)."New value: +"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it). minimax-h3: a 2-15s clip used as the motion/scene reference, billed as input seconds."
1 tool update
- Changed
var2_create_dialog2 fields changed- added
Input schema / properties / auto_tagAdded value: +{ + "description": "ElevenLabs v4 only. true = var2 adds fitting audio tags ([excited], [laughs]…) to every line before generating (free, limited per hour). Omit when you wrote the tags yourself.", + "type": "boolean" +} - added
Input schema / properties / auto_tag_densityAdded value: +{ + "description": "How many tags auto_tag adds: light (≈1 per line), medium (default), rich.", + "enum": [ + "light", + "medium", + "rich" + ], + "type": "string" +}
1 tool update
- Changed
var2_create_image5 fields changed- changed
Input schema / properties / image_refs / descriptionPrevious value: -"Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2, gpt-image-2-5); ignored by others."New value: +"Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2, gpt-image-2-5, grok-imagine-image-2); ignored by others." - added
Input schema / properties / mask_indexesAdded value: +{ + "description": "type=segment-edit: segment index values (from segments[].index) to redraw.", + "items": { + "minimum": 0, + "type": "integer" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / segment_map_idAdded value: +{ + "description": "type=segment-edit: the segment_map_id returned by type=segment-map.", + "type": "string" +} - changed
Input schema / properties / type / descriptionPrevious value: -"Default text-to-image."New value: +"Default text-to-image. grok-imagine-image-2 only: segment-map (FREE — splits image_url into named segments, returns segment_map_id + segments[{index,name,mask_url}]; prompt is ignored) then segment-edit (segment_map_id + mask_indexes + prompt — redraws only those segments)." - changed
Input schema / properties / type / enumPrevious value: -[ - "text-to-image", - "image-to-image" -]New value: +[ + "text-to-image", + "image-to-image", + "segment-map", + "segment-edit" +]
1 tool update
- Changed
var2_create_video7 fields changed- changed
Input schema / properties / duration / descriptionPrevious value: -"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15."New value: +"kling: \"5\" | \"10\" (string). grok: \"6\" | \"10\" (string). ltx-2.3: 6 | 8 | 10 seconds. seedance: 1-15. gemini-omni-video / gemini-omni-flash-1-1: 4 | 6 | 8 | 10." - changed
Input schema / properties / last_frame_url / descriptionPrevious value: -"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7 (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)"New value: +"Optional end frame for image-to-video — kling-3, veo-3.1, ltx-2.3, seedance-2, wan-2.7, gemini-omni-flash-1-1 (the models with last-frame support). Renders a start→end transition. (kling-3 also accepts an explicit image_urls array; kling 2.6 has NO end frame.)" - changed
Input schema / properties / model / enumPrevious value: -[ - "veo-3.1", - "ltx-2.3", - "ltx-retake", - "wan-2.7", - "seedance-2", - "seedance-2.5", - "seedance-2-mini", - "happyhorse", - "kling", - "kling-3", - "kling-motion-control", - "kling-3-motion-control", - "sora-2", - "grok-imagine", - "pruna-avatar", - "heygen-avatar-iv" -]New value: +[ + "veo-3.1", + "ltx-2.3", + "ltx-retake", + "wan-2.7", + "seedance-2", + "seedance-2.5", + "seedance-2-mini", + "happyhorse", + "kling", + "kling-3", + "kling-motion-control", + "kling-3-motion-control", + "gemini-omni-video", + "gemini-omni-flash-1-1", + "sora-2", + "grok-imagine", + "pruna-avatar", + "heygen-avatar-iv" +] - changed
Input schema / properties / reference_image_urls / descriptionPrevious value: -"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse) — character/style reference images (plural array; seedance-2.5 accepts up to 50). veo-3.1 reference mode uses reference_images instead."New value: +"reference-to-video (seedance-2 / seedance-2.5 / seedance-2-mini / happyhorse / gemini-omni-video / gemini-omni-flash-1-1) — character/style reference images (plural array; seedance-2.5 accepts up to 50, the gemini-omni models up to 7). veo-3.1 reference mode uses reference_images instead." - changed
Input schema / properties / reference_video_urls / descriptionPrevious value: -"seedance reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Billed on input + output seconds at the video-input rate."New value: +"seedance / gemini-omni-video reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Seedance is billed on input + output seconds at the video-input rate. gemini-omni-video: up to 3 (or pass one clip as video_url), flat price per generation." - changed
Input schema / properties / resolution / descriptionPrevious value: -"grok: 480p | 720p. wan: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. Others: model-specific."New value: +"grok: 480p | 720p. wan: 1080p. seedance-2: 480p | 720p | 1080p | 4k (1080p/4k pro mode only). seedance-2.5 / seedance-2-mini: 480p | 720p. pruna-avatar: 720p (default) | 1080p. heygen-avatar-iv: 1080p only. gemini-omni-video: 720p (default) | 1080p | 4k. gemini-omni-flash-1-1: 360p | 720p (default) | 1080p | 4k. Others: model-specific." - changed
Input schema / properties / video_url / descriptionPrevious value: -"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2)."New value: +"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2). gemini-omni-video / gemini-omni-flash-1-1: the clip to edit (Flash reads ≤10s of it)."
2 tool updates
- Changed
var2_create_video6 fields changed- added
Input schema / properties / draftAdded value: +{ + "description": "seedance-2.5 only — draft mode: a fast, cheap 480p preview (resolution is forced to 480p). Upgrade a draft you like with type=draft-upgrade.", + "type": "boolean" +} - added
Input schema / properties / draft_generation_idAdded value: +{ + "description": "seedance-2.5 type=draft-upgrade only — the placeholder_id (or share link) of a finished seedance-2.5 draft. Renders that exact video at 1080p; prompt, aspect ratio and length come from the draft. Drafts can be upgraded for 7 days.", + "type": "string" +} - changed
Input schema / properties / mode / descriptionPrevious value: -"kling/kling-3: std | pro. grok: normal | fun | spicy. seedance: pro | fast. ltx-retake: replace_audio | replace_video | replace_audio_and_video. kling-motion-control / kling-3-motion-control: 720p | 1080p."New value: +"kling/kling-3: std | pro. grok: normal | fun | spicy. seedance-2: pro | fast. seedance-2.5: draft (same as draft: true). ltx-retake: replace_audio | replace_video | replace_audio_and_video. kling-motion-control / kling-3-motion-control: 720p | 1080p." - added
Input schema / properties / reference_video_durationsAdded value: +{ + "description": "Seconds per entry of reference_video_urls. Optional — the server measures the files itself for billing; supplying it only makes var2_estimate_cost exact.", + "items": { + "type": "number" + }, + "type": "array" +} - changed
Input schema / properties / reference_video_urls / descriptionPrevious value: -"seedance reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos; seedance-2.5: up to 10 (≤30s combined)."New value: +"seedance reference-to-video only — seedance-2 / seedance-2-mini: up to 3 reference videos (≤15s combined); seedance-2.5: up to 10 (≤30s combined). Billed on input + output seconds at the video-input rate." - changed
Input schema / properties / type / enumPrevious value: -[ - "text-to-video", - "image-to-video", - "reference-to-video", - "video-to-video", - "audio-to-video" -]New value: +[ + "text-to-video", + "image-to-video", + "reference-to-video", + "video-to-video", + "audio-to-video", + "draft-upgrade" +]
- Changed
var2_estimate_cost1 field changed- changed
Input schema / properties / items / items / properties / type / enumPrevious value: -[ - "text-to-image", - "image-to-image", - "text-to-video", - "image-to-video", - "reference-to-video", - "video-to-video", - "audio-to-video", - "create-music", - "extend-music", - "replace-music-section", - "create-dialog", - "image-to-3d", - "upscale", - "remove-bg" -]New value: +[ + "text-to-image", + "image-to-image", + "text-to-video", + "image-to-video", + "reference-to-video", + "video-to-video", + "audio-to-video", + "create-music", + "extend-music", + "replace-music-section", + "create-dialog", + "image-to-3d", + "upscale", + "remove-bg", + "draft-upgrade" +]
1 tool update
- Changed
var2_create_video6 fields changed- changed
Input schema / properties / character_orientation / descriptionPrevious value: -"kling-motion-control only — take orientation from the reference image or the motion video."New value: +"kling-motion-control / kling-3-motion-control only — take orientation from the reference image or the motion video." - changed
Input schema / properties / input_urls / descriptionPrevious value: -"kling-motion-control only — reference image(s) whose subject is driven by the motion video."New value: +"kling-motion-control / kling-3-motion-control only — reference image(s) whose subject is driven by the motion video." - changed
Input schema / properties / mode / descriptionPrevious value: -"kling/kling-3: std | pro. grok: normal | fun | spicy. seedance: pro | fast. ltx-retake: replace_audio | replace_video | replace_audio_and_video. kling-motion-control: 720p | 1080p."New value: +"kling/kling-3: std | pro. grok: normal | fun | spicy. seedance: pro | fast. ltx-retake: replace_audio | replace_video | replace_audio_and_video. kling-motion-control / kling-3-motion-control: 720p | 1080p." - changed
Input schema / properties / model / enumPrevious value: -[ - "veo-3.1", - "ltx-2.3", - "ltx-retake", - "wan-2.7", - "seedance-2", - "seedance-2.5", - "seedance-2-mini", - "happyhorse", - "kling", - "kling-3", - "kling-motion-control", - "sora-2", - "grok-imagine", - "pruna-avatar", - "heygen-avatar-iv" -]New value: +[ + "veo-3.1", + "ltx-2.3", + "ltx-retake", + "wan-2.7", + "seedance-2", + "seedance-2.5", + "seedance-2-mini", + "happyhorse", + "kling", + "kling-3", + "kling-motion-control", + "kling-3-motion-control", + "sora-2", + "grok-imagine", + "pruna-avatar", + "heygen-avatar-iv" +] - changed
Input schema / properties / video_duration / descriptionPrevious value: -"ltx-retake: full trimmed source duration (drives per-second pricing). kling-motion-control: reference video duration (≤30s)."New value: +"ltx-retake: full trimmed source duration (drives per-second pricing). kling-motion-control: reference video duration (≤30s); kling-3-motion-control reads it server-side." - changed
Input schema / properties / video_url / descriptionPrevious value: -"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control: the motion-reference video (must be pre-registered via var2)."New value: +"Source video for video-to-video. wan-2.7 / happyhorse: the clip to edit (must be uploaded to var2 first). ltx-retake: any public video URL to retake a segment of. kling-motion-control / kling-3-motion-control: the motion-reference video (must be pre-registered via var2)."
1 tool update
- Changed
var2_create_image1 field changed- changed
Input schema / properties / image_refs / descriptionPrevious value: -"Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2); ignored by others."New value: +"Optional refs for type=image-to-image. Character/style lock on ref-aware models (nano-banana*, gpt-image-2, gpt-image-2-5); ignored by others."
2 tool updates
- Changed
var2_create_video1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Pick by INPUT: an existing clip / video URL (\"restyle this clip\", \"keep the motion\") → video-to-video (video_url). ONE image to animate → image-to-video (first_frame_url; grok: reference_image_url). 2-3 reference images for a new scene (\"keep this character consistent across these references\") → reference-to-video — CALL IT with the URLs the user gave (var2 share links included) as reference_image_urls[] (veo-3.1: reference_images[]); never decline over which param name fits. Portrait + audio track (talking head, \"character talking\") → audio-to-video — when the user supplies a portrait URL and an audio URL, call immediately (pruna-avatar or heygen-avatar-iv: first_frame_url + audio_url + audio_duration_seconds); any https URL the user pasted is real and usable as-is, whatever its domain. Text only → text-to-video (default). A /video/ URL or \"clip\" means video-to-video, not image-to-video."New value: +"Pick by INPUT: an existing clip / video URL (free-form edit, \"keep the motion\") → video-to-video (video_url); swap / recast / preset restyle of a clip → var2_magic_replace instead. ONE image to animate → image-to-video (first_frame_url; grok: reference_image_url). 2-3 reference images for a new scene (\"keep this character consistent across these references\") → reference-to-video — CALL IT with the URLs the user gave (var2 share links included) as reference_image_urls[] (veo-3.1: reference_images[]); never decline over which param name fits. Portrait + audio track (talking head, \"character talking\") → audio-to-video — when the user supplies a portrait URL and an audio URL, call immediately (pruna-avatar or heygen-avatar-iv: first_frame_url + audio_url + audio_duration_seconds); any https URL the user pasted is real and usable as-is, whatever its domain. Text only → text-to-video (default). A /video/ URL or \"clip\" means video-to-video, not image-to-video."
- Added
var2_magic_replace
25 tool updates
- First observed
var2_check_join_status - First observed
var2_confirm_upload - First observed
var2_create_3d - First observed
var2_create_audio - First observed
var2_create_dialog - First observed
var2_create_image - First observed
var2_create_video - First observed
var2_estimate_cost - First observed
var2_extract_video_endpoints - First observed
var2_get_3d_result - First observed
var2_get_audio_result - First observed
var2_get_character - First observed
var2_get_dialog_result - First observed
var2_get_image_result - First observed
var2_get_results - First observed
var2_get_video_result - First observed
var2_get_voice_list - First observed
var2_join_videos - First observed
var2_list_models - First observed
var2_modify_image - First observed
var2_render_timeline - First observed
var2_request_upload - First observed
var2_save_character - First observed
var2_trim_audio - First observed
var2_upload_asset
Publisher details
- Operator
- Var2 · Publisher source
- Operator website
- https://www.var2.ai/ · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://www.var2.ai/mcp · Publisher source
- Trust center
- Not available
- Restrictions
- custom oauth and api key · Publisher source
Related MCP Servers
- AlicenseNot gradedqualityCmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs113 npm54 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.164 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.