Skip to main content
Glama

Combine videos

combine_videos

Join existing clips (job:#0 and upload:, mixed, 1–10 in play order) into ONE video, free (no model runs). Also trims a single clip, retimes it (speed), lays a voiceover or music over it (audio_id / music_id, mix, ducking, fades), or plays 2 clips in one frame as a before/after (layout "side_by_side" / "stacked"). Not for new footage or montages: use it only when shots need different models or locations, or the piece runs past the model's max duration; if one generation can cut it, generate it once. Load load_skill("combining-videos") before the first call: it has every option and value.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "video_ids": "<video_ids>"
    },
    "name": "combine_videos"
  }
}

Input Schema

NameRequiredDescriptionDefault
syncNo
speedNo
layoutNo
duckingNo
audio_idNo
music_idNo
pad_colorNo
video_idsYes
audio_fromNo
audio_modeNo
project_idNoOpaque per-chat project id: "p-" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list.
clip_volumeNo
audio_volumeNo
music_volumeNo
project_nameNoShort human title for the project (2-5 words from the user request, e.g. "Perfume ad campaign"). Pass it on your first generate/ingest_url so the project is not left "Untitled". You may also rename at will later — pass an updated project_name (on a generate/ingest_url, or on set_settings with no other change) whenever the user asks, e.g. "call this project cats".
audio_fade_inNo
canvas_aspectNo
divider_colorNo
divider_widthNo
music_fade_inNo
audio_fade_outNo
music_fade_outNo
max_clip_secondsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • addedInput schema / properties / audio_from
      Added value: +{
      +  "enum": [
      +    "first",
      +    "second",
      +    "mix",
      +    "none"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / canvas_aspect
      Added value: +{
      +  "enum": [
      +    "9:16",
      +    "1:1",
      +    "16:9"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / divider_color
      Added value: +{
      +  "maxLength": 20,
      +  "type": "string"
      +}
    • addedInput schema / properties / divider_width
      Added value: +{
      +  "maximum": 40,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / layout
      Added value: +{
      +  "enum": [
      +    "sequence",
      +    "side_by_side",
      +    "stacked"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / pad_color
      Added value: +{
      +  "maxLength": 20,
      +  "type": "string"
      +}
    • addedInput schema / properties / sync
      Added value: +{
      +  "enum": [
      +    "shortest",
      +    "freeze",
      +    "loop"
      +  ],
      +  "type": "string"
      +}
  2. Changed2 schema fields changed
    • addedInput schema / properties / speed
      Added value: +{
      +  "type": "number"
      +}
    • changedInput schema / properties / video_ids / items / anyOf
      Previous value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "duration": {
      -        "exclusiveMinimum": 0,
      -        "type": "number"
      -      },
      -      "end": {
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "id": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "start": {
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "volume": {
      -        "maximum": 2,
      -        "minimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "id"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "duration": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "end": {
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "id": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "speed": {
      +        "type": "number"
      +      },
      +      "start": {
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "volume": {
      +        "maximum": 2,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "id"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / project_id / description
      Previous value: -"Opaque per-chat project id. Mint one on your first emero action, pass that SAME id every call. One project per chat: NEVER mint a second for a new topic/campaign/subject/vibe — all stay in the one project; a new id is only for a new chat (server folds a stray id back in). A new chat the user says continues an earlier project reuses that project's id (from get_emero_brain's project list)."New value: +"Opaque per-chat project id: \"p-\" plus 6 random letters and digits. Every chat is a new project. Mint one on your first emero call and pass that SAME id on every call in this chat. Never mint a second one in the same chat, even for a new topic, campaign or subject. Only when the user asks to continue an earlier project, reuse its id from get_emero_brain's project list."
  4. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Adds real context beyond the annotations: it is free with no model runs (cost behavior), and a skill must be loaded first. It does not say whether source clips are preserved, where the output lands in the project, or how long the compose takes, so destructiveHint=false and non-readOnly are only partly explained.

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

Conciseness4/5

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

Front-loads the core join operation and the clip format before branching into secondary operations and exclusions. Dense but every clause carries information; the only mild cost is the packed parenthetical enumerations.

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

Completeness3/5

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

For a 23-parameter tool with 9% schema coverage and no output schema, the description covers the headline flows and delegates the rest to load_skill("combining-videos"). That deferral is a reasonable mitigation but means the definition itself is not self-sufficient for the many audio/layout/canvas parameters.

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

Parameters3/5

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

Schema coverage is only 9%, so the description must carry more weight. It does explain the video_ids element format and play-order semantics, plus the concepts behind speed, ducking, fades, audio_mode/mix and the stacked/side_by_side layouts, but leaves sync, audio_from, pad_color, all three volume params, canvas_aspect, divider_color/width and max_clip_seconds undefined except by name.

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

Purpose5/5

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

States a specific verb and resource ("Join existing clips ... into ONE video") and enumerates the distinct operations it covers: trim, retime, voiceover/music overlay, and two-up before/after layouts. It also names the id format (job:<uuid>#0, upload:<id>) and the 1–10 clip bound, which separates it cleanly from generate.

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

Usage Guidelines5/5

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

Explicitly gives when-not-to-use ("Not for new footage or montages") and the deciding rule (only when shots need different models/locations or exceed max duration; if one generation can cut it, generate it once). It also names the prerequisite action: load_skill("combining-videos") before the first call.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.