Skip to main content
Glama

Video to video

video_to_video

Use when the user wants to restyle existing footage from a text prompt while keeping its length and timing. Creates an editable project and uses team credits. Pass videoFileId from an upload or a public videoUrl, which the run imports itself. Restyles up to 120 seconds per run. For captions, transitions, or other supported edits to an existing VideoGen project, use remix_project instead. This changes the footage's visual treatment; it does not publish or manage an ad campaign.

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": {
      "prompt": "<prompt>"
    },
    "name": "video_to_video"
  }
}

Input Schema

NameRequiredDescriptionDefault
audioNoKEEP_ORIGINAL keeps the source audio under the restyled picture. GENERATE uses newly generated audio. Defaults to KEEP_ORIGINAL.
promptYesHow the restyled video should look.
qualityNoRestyle quality (LOW, STANDARD, HIGH, or MAX). Higher tiers cost more and follow the source more faithfully. Defaults to HIGH.
videoUrlNoPublic http(s) link to a video page or video file to restyle. The run imports it, so no upload is needed. Provide this or videoFileId, not both.
autoExportNoWhen true (the default), the run stays in progress until an MP4 is ready. Use downloadUrl from the result. Set false only if you will call remix_project and then export_project yourself.
videoFileIdNoUploaded video file id to restyle. Provide this or videoUrl, not both.
imageFileIdsNoOptional reference image file ids that guide the look.
trimEndSecondsNoSecond of the video where the restyled part ends. The restyled part must be 2 to 120 seconds long. Defaults to the start plus 120 seconds, capped at the end of the video.
trimStartSecondsNoSecond of the video where the restyled part starts. Defaults to 0.

Output Schema

NameRequiredDescriptionDefault
errorNoError details when status is failed; otherwise null.
statusNoJob status: pending, running, succeeded, failed, or cancelled.
exportIdNoExport id when autoExport succeeded (vg_expo_...).
projectIdYesProject created for this exact workflow attempt (vg_proj_...). A retry creates a different project.
projectUrlYesDeep link to the project created for this exact workflow attempt. Keep it paired with workflowRunId; a retry returns a new URL.
downloadUrlNoSigned MP4 download URL when autoExport succeeded. Give this to the user.
attemptIndexNoCurrent or latest attempt index.
exportFileIdNoFile id of the rendered MP4 when autoExport succeeded.
workflowTypeNoWorkflow type (present after polling).
workflowRunIdYesWorkflow run id (vg_work_...). Keep it paired with this response's projectId and projectUrl; a retry returns a new tuple.
remixActionIdsNoRemix action ids from the start response (empty when none requested).
progressPercentageNoCompletion progress 0-100 (present after polling).
downloadUrlExpiresAtNoUnix expiry for downloadUrl.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • removedInput schema / properties / aspectRatio
      Removed value: -{
      -  "description": "Output aspect ratio as width:height units. With videoFileId, defaults to the closest match to the source. With videoUrl, defaults to 16:9, so pass it for vertical or square videos.",
      -  "properties": {
      -    "height": {
      -      "description": "Aspect-ratio height unit (e.g. 9 for 16:9).",
      -      "exclusiveMinimum": 0,
      -      "type": "number"
      -    },
      -    "width": {
      -      "description": "Aspect-ratio width unit (e.g. 16 for 16:9).",
      -      "exclusiveMinimum": 0,
      -      "type": "number"
      -    }
      -  },
      -  "required": [
      -    "width",
      -    "height"
      -  ],
      -  "type": "object"
      -}
    • removedOutput schema / properties / downloadUrl / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / downloadUrl / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / downloadUrlExpiresAt / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / downloadUrlExpiresAt / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / error / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "code": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Machine-readable error code."
      -      },
      -      "internalErrorCode": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Opaque code for support."
      -      },
      -      "message": {
      -        "description": "Human-readable error description.",
      -        "type": "string"
      -      },
      -      "requirement": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {},
      -            "properties": {
      -              "details": {
      -                "additionalProperties": {
      -                  "type": "string"
      -                },
      -                "propertyNames": {
      -                  "type": "string"
      -                },
      -                "type": "object"
      -              },
      -              "type": {
      -                "description": "Requirement type (e.g. purchase_add_on).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "type"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "What is needed to resolve the error, when applicable."
      -      }
      -    },
      -    "required": [
      -      "message"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "code": {
      +        "description": "Machine-readable error code.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "internalErrorCode": {
      +        "description": "Opaque code for support.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "message": {
      +        "description": "Human-readable error description.",
      +        "type": "string"
      +      },
      +      "requirement": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {},
      +            "properties": {
      +              "details": {
      +                "additionalProperties": {
      +                  "type": "string"
      +                },
      +                "propertyNames": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              },
      +              "type": {
      +                "description": "Requirement type (e.g. purchase_add_on).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "What is needed to resolve the error, when applicable."
      +      }
      +    },
      +    "required": [
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / exportFileId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / exportFileId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / exportId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / exportId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Added

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (non-read-only, open-world, non-idempotent), the description discloses material behavior: it creates an editable project, consumes team credits, imports a public videoUrl itself, caps each run at 120 seconds, and — via the autoExport context — explains that the run blocks until an MP4 is ready with a downloadUrl. The only shortfall is that it doesn't detail failure or partial-import behavior, so 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.

Conciseness4/5

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

The intent and key constraint are front-loaded, and each sentence carries distinct information (trigger, side effects, inputs, limits, alternative, boundary). Slight redundancy: the 120-second cap is stated in the description and again in trimEndSeconds, and the credit/project note could be tighter.

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

Completeness5/5

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

For a nine-parameter, credit-consuming generation tool with an output schema present, the description covers the triggers, cost implication, input sourcing, duration limits, blocking behavior, and the main sibling alternative. Since return values are documented by the output schema, nothing an agent needs to call it correctly is missing.

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 100%, so all nine parameters already carry their own descriptions and both enums are documented. The description adds only light context — that videoFileId comes from an upload — while the videoFileId/videoUrl exclusivity it repeats is already in the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

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?

The opening sentence names a specific verb and resource — restyle existing footage from a text prompt — and states the invariant preserved (length and timing). It also explicitly distinguishes the tool from remix_project and from ad-campaign management, so an agent can place it correctly among 50+ siblings.

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?

Gives the trigger condition (user wants to restyle existing footage), names the alternative for a different intent ('For captions, transitions, or other supported edits... use remix_project instead'), and adds a conditional escape hatch via autoExport=false when chaining to remix_project and export_project. It also states a negative boundary: it does not publish or manage ad campaigns.

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.