Skip to main content
Glama

submit_avatar_video

Destructive

Have one of the user's characters present to camera: submit an AI-avatar video batch that creates video assets in the current project library. It does not place clips on the timeline or export.

External MCP spend rule: this tool costs ChatCut credits and starts an async generation job. Only call it when the user's request or confirmation clearly covers this exact generation; do not silently create extra variants, longer durations, higher quality, or additional outputs.

Load the digital-human Skill first. Use it when the shot is the character reading a script to camera, at any length; for acting, moving or changing scenes, use submit_video with the character's images as references instead. The first time a character presents, this tool returns the credit cost of building its look from the main image instead of a video. Tell the user the cost and ask them to confirm they have the right to use this person's likeness; only after an explicit yes, call again with the same arguments and confirmedConsent=true. While a look is being prepared the tool says so and tells you how to continue. Speech is the character's own voice (omit voiceRef), another voice the user chose for this video, or one project audio asset. ChatCut resolves the generation provider and engine; never request or expose them. Pass project audio once as the original asset (see speech): ChatCut prepares over-limit audio and submits the ordered parts as one batch. Do not transcode or split it yourself. Pass speech as a JSON object, never as a quoted or JSON-stringified value. For example: {"type":"audio-asset","assetId":"..."} or {"type":"voice","text":"..."}. After all slots are resolved, this tool obtains a live credit estimate and shows it in the final generation confirmation card before submitting. Never calculate or quote a hardcoded avatar-video price. The result contains generation job IDs. Generation continues in the background and completed videos appear in the project library. Do not add a Bash sleep or read status repeatedly in the same turn. If a follow-up step in this request needs the completed videos and track_progress describes action=wait as registering an automatic follow-up, call it once with the jobIds and a note, then end the turn; otherwise end the turn immediately after submission. In a later user turn, use track_progress only when the user asks for status or resumes a follow-up step that needs the completed asset. Do not quote non-terminal numeric progress to the user because it represents coarse internal stages, not a completion estimate. To redo one part, call this tool again with that text; arrange the clips on the timeline.

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": {
      "speech": "<speech>"
    },
    "name": "submit_avatar_video"
  }
}

Input Schema

NameRequiredDescriptionDefault
speechYesSpeech source object. Pass an object such as {"type":"audio-asset","assetId":"..."} or {"type":"voice","text":"..."}; never JSON.stringify it.
segmentsNoOptional explicit ordered text segments. Omit for automatic segmentation. Not valid for audio-asset speech.
projectIdNoFull project UUID. Required for external browser work; internal agents may omit. Execution/explicit-timeline calls never change later calls' target.
identityIdNoOnly for an avatar id from an older conversation or from manage_avatar on a connector, when no character applies. Prefer characterId.
resolutionNoDefaults to 1080p.
timelineIdNoFull timeline UUID, not a prefix. Required for browser work, even unplaced assets. Get it from read_project or manage_timelines action="list". Never switches visible timeline.
aspectRatioNoOutput aspect ratio. Explicit user choice wins; otherwise omit it so ChatCut preserves the main image's original ratio.
characterIdNoThe character who presents: an id from manage_character or the <assets> list, or a unique prefix.
motionPromptNoOptional performance direction, only when live capabilities support it.
idempotencyKeyNoStable key for this browser execution. Reuse only with identical scope and parameters after a lost acknowledgement; applies only to this call.
browserProfileIdNoOptional browser profile override. Omit to select automatically; do not ask the user to choose.
confirmedConsentNotrue only after the user explicitly confirmed, for a character's first presentation, that they have the right to use this person's likeness and accepted the cost.
removeBackgroundNoTransparent-background preference. Omit by default. Set true only when the user explicitly requests transparency or background removal; set false when they explicitly want the original background.
identityRevisionIdNoSpecific ready revision id. Omit to use the identity's active revision.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / aspectRatio / description
      Previous value: -"Output aspect ratio. Explicit user choice wins; otherwise omit it so ChatCut preserves the selected avatar's original ratio."New value: +"Output aspect ratio. Explicit user choice wins; otherwise omit it so ChatCut preserves the main image's original ratio."
    • addedInput schema / properties / characterId
      Added value: +{
      +  "description": "The character who presents: an id from manage_character or the <assets> list, or a unique prefix.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / confirmedConsent
      Added value: +{
      +  "description": "true only after the user explicitly confirmed, for a character's first presentation, that they have the right to use this person's likeness and accepted the cost.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / identityId / description
      Previous value: -"Ready user-saved ChatCut avatar identity ID, an exact unique saved avatar name, or an attached Digital Humans reference."New value: +"Only for an avatar id from an older conversation or from manage_avatar on a connector, when no character applies. Prefer characterId."
    • changedInput schema / properties / speech / description
      Previous value: -"Speech source object. Pass an object such as {\"type\":\"audio-asset\",\"assetId\":\"...\"} or {\"type\":\"voice\",\"voiceRef\":\"...\",\"text\":\"...\"}; never JSON.stringify it."New value: +"Speech source object. Pass an object such as {\"type\":\"audio-asset\",\"assetId\":\"...\"} or {\"type\":\"voice\",\"text\":\"...\"}; never JSON.stringify it."
    • changedInput schema / properties / speech / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "assetId": {
      -        "description": "The original ChatCut audio asset id. Submit it once without inspecting its container, transcoding it, splitting it, importing derived parts, or making separate generation calls; ChatCut automatically prepares over-limit audio and submits the ordered parts as one batch.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "audio-asset",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "assetId",
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "text": {
      -        "description": "The complete user-confirmed narration text.",
      -        "maxLength": 250000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "voice",
      -        "type": "string"
      -      },
      -      "voiceRef": {
      -        "description": "Opaque ChatCut voice reference returned by manage_avatar as defaultVoiceRef, or by manage_voice action=list use=avatar after the user chooses another voice.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "text",
      -      "type",
      -      "voiceRef"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "assetId": {
      +        "description": "The original ChatCut audio asset id. Submit it once without inspecting its container, transcoding it, splitting it, importing derived parts, or making separate generation calls; ChatCut automatically prepares over-limit audio and submits the ordered parts as one batch.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "audio-asset",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "assetId",
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "text": {
      +        "description": "The complete user-confirmed narration text.",
      +        "maxLength": 250000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "voice",
      +        "type": "string"
      +      },
      +      "voiceRef": {
      +        "description": "Omit to speak with the character's own voice. Pass one returned by manage_voice action=list use=avatar only when the user chose a different voice for this video.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "text",
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / required
      Previous value: -[
      -  "identityId",
      -  "speech"
      -]New value: +[
      +  "speech"
      +]
  2. First observed

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare this is a destructive, non-idempotent, non-open-world write, and the description goes well beyond that by disclosing credit spend, async generation, the provider/engine being resolved internally, background completion into the library, and the ban on sleep-polling or quoting non-terminal progress. The consent/confirm flow and control of follow-up behavior via track_progress are also disclosed. That is substantial added context for a mutation tool.

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

Conciseness3/5

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

Purpose and the alternative-routing rule are front-loaded, which is good, but the remainder is a dense wall of operational rules mixing spend policy, consent, audio handling, provider secrecy, confirmation UX, and follow-up polling guidance. Several items duplicate the input schema (the speech JSON examples, audio pass-once rule), so the block is longer than its unique value requires.

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

Completeness4/5

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

For a 14-parameter generative mutation with no output schema, the description covers what an agent needs: cost/consent gating, async job behavior, that results carry job IDs and finished videos land in the library, timeline placement being out of scope, and the exact-vs-extra-output spend boundary. Remaining gaps, such as what a partially failed batch looks like or how to redo a segment key, are minor against the schema's completeness.

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 description coverage is 100%, so the schema already documents all 14 parameters, including the oneOf speech shapes, segments ineligibility for audio-asset, and aspect-ratio defaulting. The description reinforces a few high-risk points (pass speech as a JSON object, never stringify; submit project audio once as the original asset), but these largely restate schema text rather than adding new semantics, so baseline 3 is appropriate.

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?

Opens with a specific verb and resource (submit an AI-avatar video batch that creates video assets in the project library) and immediately bounds scope by stating it does not place clips on the timeline or export. It also names the sibling submit_video and the condition that separates the two, so an agent can route correctly without opening either schema.

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 states the selecting condition (character reading a script to camera, at any length) and the alternative for other cases (acting, moving or changing scenes -> submit_video with the character's images as references). It adds a prerequisite (load the digital-human Skill first) and a spend gate (only call when the request or confirmation covers this exact generation; no silent extra variants), leaving little to inference.

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.