Skip to main content
Glama

Check a recording request

estimate_recording
Read-only

Check a recording request without recording or using up any quota. Takes the same arguments as record_html. Returns what to fix (invalidIssues, limitIssues, capacity.reasons), the resource estimate, your limits and your usage: recordings in progress and recordings started in the last 24 hours, plus credits: what the recording would use and what the account has.

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": {
      "width": "<width>",
      "height": "<height>",
      "durationSec": "<durationSec>"
    },
    "name": "estimate_recording"
  }
}

Input Schema

NameRequiredDescriptionDefault
crfNoQuality for mp4 and webm, from 10 (best, largest) to 35 (smallest). Not together with bitrateMbps; not for gif or mov.
fitNoHow the frame fills outputSize: fill (stretch), contain (letterbox in background) or cover (crop to fill).
fpsNoFrame rate: one of 15, 23.976, 24, 25, 29.97, 30, 59.94, 60 (default 30). For gif, a whole number from 1 to 30.
urlNoPublic http(s) URL of the page or creative to record. The recorder runs on the internet: localhost, private networks and pages behind a sign-in (such as claude.ai/chat links) are out of reach. Pass url or html, not both.
cropNoRecord only this region of the viewport: { x, y, width, height } in pixels, even values, inside the viewport.
htmlNoA complete HTML document to record instead of a url, e.g. a banner you just wrote or an artifact from this conversation. One file: inline the CSS and JavaScript, and load images, fonts and libraries from public https URLs or data: URIs. It is published at an unlisted public URL and recorded from there.
loopNogif only: whether the gif loops.
syncNoHow trim markers are used: auto (default: markers when the page calls trim_start(), else the load event), load (ignore markers) or markers (fail when trim_start() is not called within markerWaitSec).
audioNoRecord the page’s audio too. Not for gif.
widthYesViewport width in CSS pixels: even, 16–7680. Use the creative’s size, e.g. 300 for a 300×250 banner or 1920 for a full HD page.
formatNomp4 (default, H.264), webm (VP9), mov (ProRes, for video editors) or gif.
heightYesViewport height in CSS pixels: even, 16–7680.
actionsNoClicks, for a page that waits for a Play or Start button: [{"type":"click","text":"Play"}]. A click finds its element by selector (CSS), text (visible text, aria-label, title or alt; case and symbols such as ▶ ignored) or point ({x, y} in the viewport), afterMs after load or the previous click. The video starts at the first click unless startsVideo is false. An element that is not on screen within 10 s fails the recording.
startAtNoWhere the video starts: "load" (default: the load event, or the first trim_start() call) or that many milliseconds after it (0–120000).
rendererNoauto (default), cpu or gpu. Leave it on auto.
maxSizeMbNoKeep the file under this many megabytes (decimal: 0.6 = 600 KB), e.g. a platform’s upload limit or an email gif. The quality is lowered only as much as needed; frames, size and duration stay as requested. Not with bitrateMode cbr or format mov.
backgroundNoLetterbox colour for fit: contain, as #rrggbb.
outputSizeNoScale the video to { width, height } (even values); see fit.
bitrateMbpsNoA target bitrate in Mbps (1–100) instead of crf, for platforms with a bitrate spec (e.g. DOOH). Not for gif or mov.
bitrateModeNovbr (default) or cbr. Needs bitrateMbps.
durationSecYesLength of the video in seconds (1–300; your account limit applies). With trim_end() it is the maximum.
pixelFormatNoyuv420p (default; plays everywhere), yuv422p or yuv444p. For mov, yuv444p picks ProRes 4444, otherwise 422 HQ.
transparentNoKeep what the page draws without its background, as an alpha channel: webm (VP9 with alpha), mov (ProRes 4444) or gif (one transparent colour). Not for mp4. For stickers, overlays, lower thirds and Lottie or Rive style animations; the page’s html and body background is removed. Width up to 3840.
markerWaitSecNoHow long to wait for trim_start() after load, in seconds (0–60, default 10).
markerLatencyMsNoOverrides the measured delay between a marker call and the frame it marks (0–1000 ms). Rarely needed.

Output Schema

NameRequiredDescriptionDefault
okYes
usageYes
limitsYes
capacityYes
estimateYes
limitIssuesYes
invalidIssuesYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / maxSizeMb
      Added value: +{
      +  "description": "Keep the file under this many megabytes (decimal: 0.6 = 600 KB), e.g. a platform’s upload limit or an email gif. The quality is lowered only as much as needed; frames, size and duration stay as requested. Not with bitrateMode cbr or format mov.",
      +  "maximum": 10000,
      +  "minimum": 0.05,
      +  "type": "number"
      +}
  2. Changed6 schema fields changed
    • changedInput schema / properties / bitrateMbps / description
      Previous value: -"A target bitrate in Mbps (1–100) instead of crf, for platforms with a bitrate spec (e.g. DOOH). Not for gif."New value: +"A target bitrate in Mbps (1–100) instead of crf, for platforms with a bitrate spec (e.g. DOOH). Not for gif or mov."
    • changedInput schema / properties / crf / description
      Previous value: -"Quality for mp4 and webm, from 10 (best, largest) to 35 (smallest). Not together with bitrateMbps; not for gif."New value: +"Quality for mp4 and webm, from 10 (best, largest) to 35 (smallest). Not together with bitrateMbps; not for gif or mov."
    • changedInput schema / properties / format / description
      Previous value: -"mp4 (default, H.264), webm or gif."New value: +"mp4 (default, H.264), webm (VP9), mov (ProRes, for video editors) or gif."
    • changedInput schema / properties / format / enum
      Previous value: -[
      -  "mp4",
      -  "webm",
      -  "gif"
      -]New value: +[
      +  "mp4",
      +  "webm",
      +  "mov",
      +  "gif"
      +]
    • changedInput schema / properties / pixelFormat / description
      Previous value: -"yuv420p (default; plays everywhere), yuv422p or yuv444p."New value: +"yuv420p (default; plays everywhere), yuv422p or yuv444p. For mov, yuv444p picks ProRes 4444, otherwise 422 HQ."
    • addedInput schema / properties / transparent
      Added value: +{
      +  "description": "Keep what the page draws without its background, as an alpha channel: webm (VP9 with alpha), mov (ProRes 4444) or gif (one transparent colour). Not for mp4. For stickers, overlays, lower thirds and Lottie or Rive style animations; the page’s html and body background is removed. Width up to 3840.",
      +  "type": "boolean"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / actions
      Added value: +{
      +  "description": "Clicks, for a page that waits for a Play or Start button: [{\"type\":\"click\",\"text\":\"Play\"}]. A click finds its element by selector (CSS), text (visible text, aria-label, title or alt; case and symbols such as ▶ ignored) or point ({x, y} in the viewport), afterMs after load or the previous click. The video starts at the first click unless startsVideo is false. An element that is not on screen within 10 s fails the recording.",
      +  "items": {
      +    "oneOf": [
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "afterMs": {
      +            "maximum": 60000,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "point": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "x": {
      +                "maximum": 7680,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "y": {
      +                "maximum": 7680,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "x",
      +              "y"
      +            ],
      +            "type": "object"
      +          },
      +          "selector": {
      +            "maxLength": 500,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "startsVideo": {
      +            "type": "boolean"
      +          },
      +          "text": {
      +            "maxLength": 100,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "click",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
  4. Changed2 schema fields changed
    • changedInput schema / properties / html / description
      Previous value: -"A complete HTML document to record instead of a url, e.g. a banner you just wrote. One file: inline the CSS and JavaScript, and load images, fonts and libraries from public https URLs or data: URIs. It is published at an unlisted public URL and recorded from there."New value: +"A complete HTML document to record instead of a url, e.g. a banner you just wrote or an artifact from this conversation. One file: inline the CSS and JavaScript, and load images, fonts and libraries from public https URLs or data: URIs. It is published at an unlisted public URL and recorded from there."
    • changedInput schema / properties / url / description
      Previous value: -"Public http(s) URL of the page or creative to record. The recorder runs on the internet: localhost and private networks are out of reach. Pass url or html, not both."New value: +"Public http(s) URL of the page or creative to record. The recorder runs on the internet: localhost, private networks and pages behind a sign-in (such as claude.ai/chat links) are out of reach. Pass url or html, not both."
  5. Changed8 schema fields changed
    • addedInput schema / properties / crop / properties / height / multipleOf
      Added value: +2
    • addedInput schema / properties / crop / properties / width / multipleOf
      Added value: +2
    • addedInput schema / properties / crop / properties / x / multipleOf
      Added value: +2
    • addedInput schema / properties / crop / properties / y / multipleOf
      Added value: +2
    • addedInput schema / properties / height / multipleOf
      Added value: +2
    • addedInput schema / properties / outputSize / properties / height / multipleOf
      Added value: +2
    • addedInput schema / properties / outputSize / properties / width / multipleOf
      Added value: +2
    • addedInput schema / properties / width / multipleOf
      Added value: +2
  6. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real value beyond them: no quota is consumed, and it enumerates the diagnostic outputs (invalidIssues, limitIssues, capacity.reasons), the resource estimate, current limits, recordings in progress, last-24h usage, and credit cost. It does not claim any side effects, so there is no conflict with the read-only annotation.

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

Conciseness5/5

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

Two tight sentences, zero filler, with the no-quota guarantee and the record_html comparison front-loaded before the return-value enumeration. The parenthetical field names are dense but each earns its place by naming a failure category the agent must act on.

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 25-parameter validation tool with an output schema, the description covers purpose, side-effect profile, and what categories of result come back, which is enough for an agent to call it and interpret the response. Minor omissions exist (how closely the estimate predicts the real recording, behavior on hard failures), but the output schema carries the detail.

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% across all 25 parameters, so the schema does the heavy lifting on argument semantics. The description contributes only the meta-hint that the argument set mirrors record_html, which is useful but adds no per-parameter meaning; baseline 3 applies.

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 and resource ("Check a recording request") and immediately defines the scope: validation only, with no recording and no quota consumption. It also anchors itself to the sibling record_html by saying it takes the same arguments, so an agent can tell the two apart without reading 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The "without recording or using up any quota" phrasing clearly implies this is the dry-run to call before record_html, and the argument parity with record_html routes the agent correctly. It stops short of an explicit when-to-use/when-not statement or naming what to do with a failed check, so it is strong but not complete.

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.

Resources