Skip to main content
Glama

Render a video in the cloud

render_video
Idempotent

Export a synced project to MP4 (H.264 or H.265) in the cloud. Returns an owned durable job immediately. When you need the finished video, call wait_for_jobs with the job's id: it waits until the render succeeds, fails or is cancelled, and answers with its download link. read_render reads its progress without waiting. The job freezes the project during preparation; its reported revision identifies the immutable snapshot rendered. Media must be uploaded and ready: a project that cannot be rendered as it is (a range outside the film, a file not ready, a film or component that does not compile) is refused at once with what to change. Rendering uses credits for each output second, about 0.1 credits a second up to 1080p at 30 fps in H.264: a 60-second film uses 7 credits. A second costs 1.25 times as much at 1440p, 2 times at 2160p, 1.4 times at 50 or 60 fps and 1.5 times in H.265, multiplied together. Failed or cancelled jobs give their credits back. Edits after freezing do not change this export.

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": {
      "projectId": "<projectId>",
      "idempotencyKey": "<idempotencyKey>",
      "resolution": "<resolution>",
      "fps": "<fps>",
      "codec": "<codec>",
      "quality": "<quality>",
      "startSeconds": "<startSeconds>",
      "endSeconds": "<endSeconds>"
    },
    "name": "render_video"
  }
}

Input Schema

NameRequiredDescriptionDefault
fpsYes
codecYesThe file's video codec. null: H.264, which plays everywhere. H.265 makes a smaller file of the same quality.
qualityYesHow much detail the file keeps against its size. null: the render's own bitrate for its size, about high.
projectIdYesAn owned synced project ID, or null for the open project.
endSecondsYesRange end in seconds, or null for the whole film.
resolutionYes540p is a quick preview to watch. 2160p is 4K. Free allows up to 720p at 30 fps with a watermark. Paid plans allow up to 2160p at 60 fps.
startSecondsYesRange start in seconds, or null for the whole film. Both range endpoints must be present or both null.
idempotencyKeyYesA UUID for this export. Reuse it to safely repeat submission; use a new UUID for another export.

Output Schema

NameRequiredDescriptionDefault
idYes
notesNo
phaseYes
outputNo
statusYes
endCardNo
artifactYes
attemptsYes
branchIdYes
loudnessNo
progressYes
revisionYes
admissionNo
createdAtYes
errorCodeYes
projectIdYes
streamUrlNo
updatedAtYes
resolutionYes
totalFramesYes
errorMessageNo
phaseProgressYes
framesCompletedYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / endCard
      Added value: +{
      +  "properties": {
      +    "seconds": {
      +      "exclusiveMinimum": 0,
      +      "type": "number"
      +    },
      +    "startSeconds": {
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "startSeconds",
      +    "seconds"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / notes
      Added value: +{
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
  2. Changed3 schema fields changed
    • changedOutput schema / properties / artifact / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "bytes": {
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "type": "integer"
      -      },
      -      "downloadUrl": {
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "expiresAt": {
      -        "format": "date-time",
      -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "bytes",
      -      "expiresAt",
      -      "downloadUrl"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "bytes": {
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "type": "integer"
      +      },
      +      "downloadUrl": {
      +        "format": "uri",
      +        "type": "string"
      +      },
      +      "expiresAt": {
      +        "format": "date-time",
      +        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "bytes",
      +      "expiresAt",
      +      "downloadUrl"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / createdAt / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • changedOutput schema / properties / updatedAt / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
  3. Changed1 schema field changed
    • addedOutput schema / properties / loudness
      Added value: +{
      +  "properties": {
      +    "endSeconds": {
      +      "exclusiveMinimum": 0,
      +      "type": "number"
      +    },
      +    "integratedLufs": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "momentaryLufs": {
      +      "items": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "type": "array"
      +    },
      +    "peakDb": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "rangeLu": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "startSeconds": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "stepSeconds": {
      +      "const": 0.5,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "startSeconds",
      +    "endSeconds",
      +    "stepSeconds",
      +    "momentaryLufs",
      +    "integratedLufs",
      +    "rangeLu",
      +    "peakDb"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare it is a non-read-only, idempotent, non-destructive call; the description goes far beyond with credit pricing per output second, multipliers for resolution/fps/codec, refunds on failure or cancellation, and the fact that the job freezes the project into an immutable revision. That freezing semantics and cost model are behavior an agent cannot infer from structured fields.

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 action and return value, then follow-up routing, then constraints and cost — a sensible order. The pricing sentence is dense and stacks multipliers, which is slightly heavy, but every clause carries operational value.

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 an 8-required-parameter mutation with an output schema, the description still covers what matters: immediate job return, how to obtain the download link, snapshot/freeze semantics, refusal conditions, and full credit accounting including refunds. Nothing an agent needs to invoke it correctly or predict cost is missing.

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

Parameters4/5

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

Schema coverage is 88%, so per-parameter meaning is already documented; the description adds cost consequences that tie resolution, fps and codec choices together (1.25x at 1440p, 2x at 2160p, 1.4x at 50/60 fps, 1.5x for H.265, multiplied) plus a concrete 60-second example. It does not add much about startSeconds/endSeconds or quality beyond the schema, keeping it just short of a 5.

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, "Export a synced project to MP4 (H.264 or H.265) in the cloud," plus the immediate return of an owned durable job. It names the related siblings read_render and wait_for_jobs and assigns them distinct roles, so an agent can separate this submission tool from the polling and inspection tools.

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 routes the agent: use wait_for_jobs when the finished video is needed, read_render to watch progress without waiting, and reuse idempotencyKey to repeat submission safely. It also states the preconditions that cause immediate refusal (range outside the film, file not ready, non-compiling film or component), which is exactly the when-not guidance an agent needs.

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.