Skip to main content
Glama

Create Render

create_render

Queue an MP4 render of a project's composition (in a compose session, the session's scratch). Returns { id (renderId), status, warnings? } — warnings[] carries non-fatal advisories (omitted when none). The render themes from the project's brand kit (bind one via create_project / update_project with brandKitId — or PATCH /projects/:id over REST; without one the output is unbranded). Then call wait_job(kind="render", id=renderId, projectId=...) to block until the file is ready and get the download URL, or register a webhook (create_webhook on render.completed — status rides the payload).

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>",
      "body": "<body>"
    },
    "name": "create_render"
  }
}

Input Schema

NameRequiredDescriptionDefault
bodyYesPOST /projects/:id/renders body.
commandIdNoRetry identity. A call repeated with the same commandId returns the first result instead of acting twice.
projectIdYesprojectId (path).

Output Schema

NameRequiredDescriptionDefault
idNo
errorNoHuman-readable failure message. Pair with `errorCode` for a stable, machine-readable code an agent runner can branch on.
engineNoThe render engine the row was minted for. Null on rows minted before the engine was recorded.
formatNoThe resolved output format the render was encoded at (aspectRatio, fps, resolution): the frozen composition's, after any create-time scale override. Null on legacy rows.
statusNo
listUsdNoA2 money stamp: the metered event's LIST price (USD), stamped at the success terminal (exports for deliverable renders, compose_capture for A8 previews). A plan allowance may zero the actual invoice line — this is the list price, never a Stripe charge. Absent while running, on failure, and for x402 orgs (on-chain receipts). Mirrors the get_usage ledger.
previewNoThe scoped preview window when this is a preview_clip render; null for a full deliverable.
categoryNoFailure taxonomy when status is `error`; null otherwise. `authoring` = deterministic defect in YOUR composition/request — fix it, retrying is futile; `transient` = temporary pipeline/infra failure — safe to retry_render; `internal` = unexpected server fault — retry once then escalate. Mirrors the render.failed webhook's `category`.
progressNoNon-terminal render progress; phase is one of the worker's emitted stages.
warningsNoNon-fatal advisories surfaced at render-CREATE (omitted when none, and on GET — create-time only).
createdAtNo
errorCodeNoStable, machine-readable error code (e.g. `render_pipeline_unavailable`, `render_route_missing`, `render_pipeline_failed`). Null when status is not `error` or unavailable for an older render.
outputUrlNo
retryableNoWhether re-attempting the SAME render can succeed (status `error`); null otherwise. true → call retry_render. false → deterministic (category authoring/internal); fix the composition first — retry_render alone reproduces it. Mirrors the render.failed webhook's `retryable`.
updatedAtNoISO-8601 timestamp of the render's most recent progress update. Compute staleness = now − updatedAt to distinguish a wedged render from a slow one and decide whether to wait, cancel, or retry.
completedAtNoISO-8601 instant the render reached its terminal status (complete, error or cancelled); null while it runs. Pair with createdAt for the wall time.
errorDetailsNoStructured failure context — `{ targetUrl?, upstreamStatus?, upstreamCode?, attemptedAt? }`. Surfaced so agent runners can distinguish operator-config issues from upstream-down vs route-missing without parsing `error`.
compositionIdNoThe composition this render froze at create time (the project's active one, or the compositionId the request named). Null on renders minted before this was recorded.
outputExpiresAtNo
outputDurationSecNoThe output's length in seconds (the composition timeline's, or the preview window's), as billed. Null on legacy rows.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • removedInput schema / $defs / __schema3
      Removed value: -{
      -  "additionalProperties": {},
      -  "properties": {
      -    "aspectRatio": {
      -      "enum": [
      -        "16:9",
      -        "9:16",
      -        "1:1",
      -        "4:5"
      -      ],
      -      "type": "string"
      -    },
      -    "fps": {
      -      "anyOf": [
      -        {
      -          "const": 24,
      -          "type": "number"
      -        },
      -        {
      -          "const": 25,
      -          "type": "number"
      -        },
      -        {
      -          "const": 30,
      -          "type": "number"
      -        },
      -        {
      -          "const": 60,
      -          "type": "number"
      -        }
      -      ]
      -    },
      -    "platform": {
      -      "type": "string"
      -    },
      -    "resolution": {
      -      "enum": [
      -        "hd",
      -        "fhd",
      -        "4k"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "aspectRatio"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / body / properties / format / $ref
      Removed value: -"#/$defs/__schema3"
    • addedInput schema / properties / body / properties / format / description
      Added value: +"Call describe_tool_input with tool \"create_render\" and field \"format\" for the exact JSON Schema."
    • addedInput schema / properties / body / properties / format / required
      Added value: +[
      +  "aspectRatio"
      +]
    • addedInput schema / properties / body / properties / format / type
      Added value: +"object"
  2. Changed28 schema fields changed
    • addedInput schema / $defs
      Added value: +{
      +  "__schema0": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "__schema1": {
      +    "description": "Target a specific composition in the project; defaults to the project's active composition.",
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "__schema2": {
      +    "description": "Compose-session id: render that session's SCRATCH composition instead of the active one. Mutually exclusive with `compositionId`. An unknown, foreign or scratch-less session is a 404, never the active composition.",
      +    "type": "string"
      +  },
      +  "__schema3": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "aspectRatio": {
      +        "enum": [
      +          "16:9",
      +          "9:16",
      +          "1:1",
      +          "4:5"
      +        ],
      +        "type": "string"
      +      },
      +      "fps": {
      +        "anyOf": [
      +          {
      +            "const": 24,
      +            "type": "number"
      +          },
      +          {
      +            "const": 25,
      +            "type": "number"
      +          },
      +          {
      +            "const": 30,
      +            "type": "number"
      +          },
      +          {
      +            "const": 60,
      +            "type": "number"
      +          }
      +        ]
      +      },
      +      "platform": {
      +        "type": "string"
      +      },
      +      "resolution": {
      +        "enum": [
      +          "hd",
      +          "fhd",
      +          "4k"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "aspectRatio"
      +    ],
      +    "type": "object"
      +  },
      +  "__schema4": {
      +    "enum": [
      +      "interactive",
      +      "standard",
      +      "background"
      +    ],
      +    "type": "string"
      +  },
      +  "__schema5": {
      +    "enum": [
      +      "preview",
      +      "final"
      +    ],
      +    "type": "string"
      +  },
      +  "__schema6": {
      +    "anyOf": [
      +      {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ]
      +  },
      +  "__schema7": {
      +    "maxLength": 128,
      +    "minLength": 1,
      +    "type": "string"
      +  }
      +}
    • addedInput schema / properties / body / properties / brandKitId / $ref
      Added value: +"#/$defs/__schema6"
    • removedInput schema / properties / body / properties / brandKitId / anyOf
      Removed value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / body / properties / clipSuggestionId / $ref
      Added value: +"#/$defs/__schema0"
    • removedInput schema / properties / body / properties / clipSuggestionId / minLength
      Removed value: -1
    • removedInput schema / properties / body / properties / clipSuggestionId / type
      Removed value: -"string"
    • addedInput schema / properties / body / properties / compositionId / $ref
      Added value: +"#/$defs/__schema1"
    • removedInput schema / properties / body / properties / compositionId / description
      Removed value: -"Target a specific composition in the project; defaults to the project's active composition."
    • removedInput schema / properties / body / properties / compositionId / minLength
      Removed value: -1
    • removedInput schema / properties / body / properties / compositionId / type
      Removed value: -"string"
    • addedInput schema / properties / body / properties / format / $ref
      Added value: +"#/$defs/__schema3"
    • removedInput schema / properties / body / properties / format / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / body / properties / format / properties
      Removed value: -{
      -  "aspectRatio": {
      -    "enum": [
      -      "16:9",
      -      "9:16",
      -      "1:1",
      -      "4:5"
      -    ],
      -    "type": "string"
      -  },
      -  "fps": {
      -    "anyOf": [
      -      {
      -        "const": 24,
      -        "type": "number"
      -      },
      -      {
      -        "const": 25,
      -        "type": "number"
      -      },
      -      {
      -        "const": 30,
      -        "type": "number"
      -      },
      -      {
      -        "const": 60,
      -        "type": "number"
      -      }
      -    ]
      -  },
      -  "platform": {
      -    "type": "string"
      -  },
      -  "resolution": {
      -    "enum": [
      -      "hd",
      -      "fhd",
      -      "4k"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / body / properties / format / required
      Removed value: -[
      -  "aspectRatio"
      -]
    • removedInput schema / properties / body / properties / format / type
      Removed value: -"object"
    • addedInput schema / properties / body / properties / intent / $ref
      Added value: +"#/$defs/__schema5"
    • removedInput schema / properties / body / properties / intent / enum
      Removed value: -[
      -  "preview",
      -  "final"
      -]
    • removedInput schema / properties / body / properties / intent / type
      Removed value: -"string"
    • addedInput schema / properties / body / properties / priority / $ref
      Added value: +"#/$defs/__schema4"
    • removedInput schema / properties / body / properties / priority / enum
      Removed value: -[
      -  "interactive",
      -  "standard",
      -  "background"
      -]
    • removedInput schema / properties / body / properties / priority / type
      Removed value: -"string"
    • addedInput schema / properties / body / properties / session_id / $ref
      Added value: +"#/$defs/__schema2"
    • removedInput schema / properties / body / properties / session_id / description
      Removed value: -"Compose-session id: render that session's SCRATCH composition instead of the active one. Mutually exclusive with `compositionId`. An unknown, foreign or scratch-less session is a 404, never the active composition."
    • removedInput schema / properties / body / properties / session_id / type
      Removed value: -"string"
    • addedInput schema / properties / commandId / $ref
      Added value: +"#/$defs/__schema7"
    • removedInput schema / properties / commandId / maxLength
      Removed value: -128
    • removedInput schema / properties / commandId / minLength
      Removed value: -1
    • removedInput schema / properties / commandId / type
      Removed value: -"string"
  3. Changed2 schema fields changed
    • addedInput schema / properties / body / properties / session_id
      Added value: +{
      +  "description": "Compose-session id: render that session's SCRATCH composition instead of the active one. Mutually exclusive with `compositionId`. An unknown, foreign or scratch-less session is a 404, never the active composition.",
      +  "type": "string"
      +}
    • addedInput schema / properties / commandId
      Added value: +{
      +  "description": "Retry identity. A call repeated with the same commandId returns the first result instead of acting twice.",
      +  "maxLength": 128,
      +  "minLength": 1,
      +  "type": "string"
      +}
  4. Changed7 schema fields changed
    • changedInput schema / properties / body / properties / format / additionalProperties
      Previous value: -falseNew value: +{}
    • addedOutput schema / properties / completedAt
      Added value: +{
      +  "description": "ISO-8601 instant the render reached its terminal status (complete, error or cancelled); null while it runs. Pair with createdAt for the wall time.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / compositionId
      Added value: +{
      +  "description": "The composition this render froze at create time (the project's active one, or the compositionId the request named). Null on renders minted before this was recorded.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / engine
      Added value: +{
      +  "description": "The render engine the row was minted for. Null on rows minted before the engine was recorded."
      +}
    • addedOutput schema / properties / format
      Added value: +{
      +  "description": "The resolved output format the render was encoded at (aspectRatio, fps, resolution): the frozen composition's, after any create-time scale override. Null on legacy rows."
      +}
    • addedOutput schema / properties / outputDurationSec
      Added value: +{
      +  "description": "The output's length in seconds (the composition timeline's, or the preview window's), as billed. Null on legacy rows.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / preview
      Added value: +{
      +  "description": "The scoped preview window when this is a preview_clip render; null for a full deliverable."
      +}
  5. Changed2 schema fields changed
    • removedInput schema / properties / body / properties / format / description
      Removed value: -"Output-format spec per §Format."
    • addedInput schema / properties / body / properties / format / properties / platform
      Added value: +{
      +  "type": "string"
      +}
  6. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare non-readonly, non-idempotent, non-destructive, so the call's mutation profile is known. The description adds real value beyond that: it is asynchronous ('queue'), returns { id, status, warnings? } with warnings semantics, and states that an unknown/foreign/scratch-less session is a 404 rather than silently falling back to the active composition. It stops short of describing failure/rate-limit behaviour beyond the 404 case.

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 core action and the follow-up wait_job call are front-loaded; the branding caveat and webhook alternative come after. It is dense but nearly every clause carries information, with only mild redundancy (return shape is also covered by the output schema).

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?

This is an async creation tool with nested body objects, and the description covers the full lifecycle an agent needs: what is queued, what comes back, how branding is resolved, how errors on the session target surface, and how to await completion. Nothing essential is missing despite the nested 'format' field delegating to describe_tool_input.

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 100%, so a 3 is the baseline. The description compensates on the highest-value ambiguity: brandKitId determines whether the output is branded or unbranded, and how to bind one (create_project/update_project or PATCH /projects/:id). It also clarifies the session_id vs compositionId exclusivity, though that is largely duplicated from the schema.

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+resource+output type: 'Queue an MP4 render of a project's composition' with the compose-session scratch variant. This clearly separates it from get_render, retry_render, cancel_render, and wait_job in the sibling list.

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 to the two follow-up paths: wait_job(kind="render", id=renderId, projectId=...) to block for the URL, or create_webhook on render.completed. It also names the alternative target (compose session scratch vs active composition) and calls them mutually exclusive.

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.