Skip to main content
Glama

Retry Render

retry_render

Re-render an existing render job's FROZEN composition snapshot — it inherits that job's exact composition/intent/priority and queues a fresh renderJob; it does NOT re-read the project's current composition. So it only helps a TRANSIENT failure (the failed render's retryable:true / category:"transient" — a flaky pipeline/infra fault): re-attempting the same snapshot may succeed. For a DETERMINISTIC failure (retryable:false / category:"authoring" — a bad param, an unresolvable media/brand ref), retry_render reproduces the SAME failure: FIX the composition first via apply_composition, then create_render (a retry alone is futile). Check retryable on getRender / wait_job to pick the path. Returns the new render; then wait_job(kind="render", id=).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
renderIdYesrenderId (path).
projectIdYesprojectId (path).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNo
errorNoHuman-readable failure message. Pair with `errorCode` for a stable, machine-readable code an agent runner can branch on.
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.
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.
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`.
outputExpiresAtNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description goes well beyond them: it discloses the frozen-snapshot inheritance, that a fresh renderJob is queued, the failure-category model, and the follow-up wait_job(kind="render", id=<new id>) call. This is exactly the behavioral context an agent needs to avoid a futile retry.

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?

Dense and front-loaded — the core frozen-snapshot behavior and the transient/deterministic fork come first. Length is justified by the routing complexity, though the parallel parenthetical restatements of the failure categories are slightly redundant.

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?

With an output schema present, return-value explanation isn't required, yet the description still closes the loop by noting it returns the new render and that wait_job should follow. Combined with the annotations, an agent has everything needed to invoke and sequence it correctly.

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% and both params are simple path identifiers, so the schema already documents them. The description adds only implied context (renderId refers to a failed render whose retryable flag should be inspected) but no format or syntax detail. 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?

States a specific verb+resource and immediately pins down the semantics that distinguish it: it re-renders a FROZEN snapshot and explicitly does NOT re-read the project's current composition. This cleanly separates it from create_render (fresh composition) and apply_composition (mutates composition).

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 when to use it (transient failure: retryable:true / category:transient) and when not to (deterministic failure: retryable:false / category:authoring), and names the correct alternative path in that case (fix via apply_composition, then create_render). It even tells the agent how to decide — check `retryable` on getRender / wait_job.

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.