Skip to main content
Glama

record_video

Record a professional demo video of a multi-step browser automation sequence. Produces MP4/WebM/GIF with cursor highlighting, click effects, smooth movement, step notes, browser frame (macOS/Windows), gradient/glass backgrounds, and more.

Instructions

Record a professional demo video of a multi-step browser automation sequence. Produces MP4/WebM/GIF with cursor highlighting, click effects, smooth movement, step notes, browser frame (macOS/Windows), gradient/glass backgrounds, and more. Costs 3 API requests. Saves to disk. BEST PRACTICE: Keep videos concise (5-15 action steps). Do NOT add wait steps between every action — the pace parameter handles timing. Only use wait for page loads or narration holds. Do NOT use zoom unless the user explicitly asks for it.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paceNoControls how deliberate the video feels. Number (0.25–6.0, higher = slower) or preset: "fast" (0.5×), "normal" (1×), "slow" (2×), "dramatic" (3×), "cinematic" (4.5×). Default: "normal".
zoomNoGlobal zoom settings. Only use when the user explicitly requests zoom. Do NOT enable by default.
asyncNoRender via an async job for reliability. The video is enqueued (202 + job_id) and this tool polls until it finishes, so long recordings do not hit the API's per-request timeout. The finished video is delivered as a private hosted URL (its bytes cannot be pulled back via the API key). Set false to force a single blocking synchronous request that returns the video INLINE (base64 embedded + saved to saveTo). DEFAULT: true, except when you pass saveTo (then sync is used so the file is actually produced on disk). If async is unavailable on your plan, it automatically falls back to sync. Quota is charged only on success; max 5 pending jobs per account.
frameNoBrowser chrome frame around the video. Adds a macOS/Windows-style title bar.
stepsYesArray of action steps to record. Keep concise: 5-15 steps is ideal. Do NOT pad with wait steps — pace handles timing.
cursorNoCursor appearance settings
formatNoVideo format (default: mp4). webm/gif require Starter+ plan.
saveToNoOutput file path (default: ./recording.mp4)
cookiesNoCookies to set before the first navigation — "name=value" strings or full cookie objects (domain, path, secure, httpOnly, sameSite, expires). Up to 100. Domain defaults to the first navigate step's host.
autoZoomNoEnable auto-zoom on all clicks (default: false). Only use when user explicitly requests zoom.
blockAdsNoBlock advertisements on the page
darkModeNoEmulate dark color scheme (default: false)
viewportNoBrowser viewport size
authStateNoAuthenticated recording/capture: cookies + localStorage injected BEFORE the first navigation, so protected pages (dashboards, admin panels) render logged-in. Prefer this over scripting a login flow. Values are never logged.
framerateNoFrames per second: 24, 30, or 60 (default: 30)
variablesNoKey-value map for variable substitution in step URLs/values. E.g. { "base_url": "https://example.com" } replaces {{base_url}} in steps.
audioGuideNoAudio Guide TTS settings. Two modes: (1) Per-step — add "narration" to individual steps. (2) Script — provide "script" with {{N}} markers for continuous narration synchronized to steps.
backgroundNoStyled background behind the video. Adds gradient/solid background with padding and rounded corners — creates a "floating window" effect.
blockChatsNoBlock live chat widgets
clickEffectNoVisual click effect settings
blockBannersNoHide cookie consent banners (default: true for videos)
blockTrackersNoBlock tracking scripts
pollTimeoutMsNoMax time to wait for an async video job to finish, in milliseconds (default: 240000 = 4 min). If the job is still running when this elapses, the job_id is returned so you can check it later with get_job.
deviceScaleFactorNoDevice pixel ratio (default: 1)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv1.17.1
    • addedInput schema / properties / audioGuide / properties / elevenlabs
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Settings for provider \"elevenlabs\". The key comes from ELEVENLABS_API_KEY (MCP server env); PageBolt checks key, voice and credits before recording, so a bad key fails fast without charging a render.",
      +  "properties": {
      +    "apiKey": {
      +      "description": "Avoid: prefer the ELEVENLABS_API_KEY env var so the key never enters the conversation. If given, it is sent only as a header and never stored by PageBolt.",
      +      "type": "string"
      +    },
      +    "modelId": {
      +      "description": "ElevenLabs model. Default eleven_multilingual_v2 (best narration quality). eleven_turbo_v2_5 / eleven_flash_v2_5 are faster and cost half the credits.",
      +      "type": "string"
      +    },
      +    "similarityBoost": {
      +      "description": "0-1 (ElevenLabs default 0.75).",
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "speakerBoost": {
      +      "description": "Speaker boost.",
      +      "type": "boolean"
      +    },
      +    "stability": {
      +      "description": "0-1. 0.45-0.6 gives an even explainer read. Default: the voice's own setting.",
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "style": {
      +      "description": "0-1 style exaggeration; keep 0 for product demos.",
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "voiceId": {
      +      "description": "ElevenLabs voice ID from the user's account (see list_elevenlabs_voices). Required unless voiceName is given.",
      +      "type": "string"
      +    },
      +    "voiceName": {
      +      "description": "Voice name in the user's ElevenLabs account, e.g. \"Rachel\"; resolved server-side.",
      +      "maxLength": 100,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / audioGuide / properties / pronunciations
      Added value: +{
      +  "additionalProperties": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "alias": {
      +            "type": "string"
      +          },
      +          "caseSensitive": {
      +            "type": "boolean"
      +          },
      +          "ipa": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "description": "Word -> how to say it, e.g. {\"PageBolt\": \"page bolt\"}. Works with every provider (IPA is Azure only).",
      +  "type": "object"
      +}
    • changedInput schema / properties / audioGuide / properties / provider / description
      Previous value: -"TTS provider (default: azure)"New value: +"TTS provider (default: azure). \"elevenlabs\" = the user's OWN ElevenLabs account (bring your own key): any voice in it incl. cloned voices, billed to their ElevenLabs credits, does not use PageBolt's narration allowance. Needs audioGuide.elevenlabs.voiceId (or voiceName) and the ELEVENLABS_API_KEY env var on this MCP server."
    • changedInput schema / properties / audioGuide / properties / provider / enum
      Previous value: -[
      -  "azure",
      -  "openai"
      -]New value: +[
      +  "azure",
      +  "openai",
      +  "elevenlabs"
      +]
    • changedInput schema / properties / audioGuide / properties / script / description
      Previous value: -"Script mode: a single narration script with {{N}} step markers (0-indexed) for synchronized narration. Steps execute when narration reaches each marker. When provided, per-step \"narration\" fields are ignored."New value: +"Script mode: a single narration script with {{N}} step markers (0-indexed) for synchronized narration. Steps execute when narration reaches each marker. When provided, per-step \"narration\" fields are ignored. Best for an even tempo (one voice track); start it with {{0}}. With provider \"elevenlabs\" markers land on the exact word (character timestamps)."
    • changedInput schema / properties / audioGuide / properties / speed / description
      Previous value: -"Speech rate (default: 1.0)"New value: +"Speech rate (default: 1.0). With provider \"elevenlabs\": 0.7-1.2."
    • changedInput schema / properties / audioGuide / properties / voice / description
      Previous value: -"Voice preset. Azure voices (default provider): ava (female), andrew (male), emma (female), brian (male), aria (female), guy (male), jenny (female), davis (male), christopher (male), michelle (female). Default: ava. OpenAI voices (only if provider:\"openai\"): alloy, echo, fable, nova, onyx, shimmer. Do NOT use OpenAI voices with Azure provider."New value: +"Voice preset. Azure voices (default provider): ava (female), andrew (male), emma (female), brian (male), aria (female), guy (male), jenny (female), davis (male), christopher (male), michelle (female). Default: ava. OpenAI voices (only if provider:\"openai\"): alloy, echo, fable, nova, onyx, shimmer. Do NOT use OpenAI voices with Azure provider. Not used with provider \"elevenlabs\" (use elevenlabs.voiceId)."
    • changedInput schema / properties / steps / items / properties / style / description
      Previous value: -"highlight action: outline = animated line circling the element (default), pulse = expanding rings, glow = breathing glow, spotlight = dims everything else, arrow = bobbing arrow pointing at it"New value: +"highlight action: spotlight = dims everything else (default), outline = animated line circling the element, pulse = expanding rings, glow = breathing glow, arrow = bobbing arrow pointing at it"
  2. Changed16 schema fields changedv1.17.0
    • addedInput schema / properties / async
      Added value: +{
      +  "description": "Render via an async job for reliability. The video is enqueued (202 + job_id) and this tool polls until it finishes, so long recordings do not hit the API's per-request timeout. The finished video is delivered as a private hosted URL (its bytes cannot be pulled back via the API key). Set false to force a single blocking synchronous request that returns the video INLINE (base64 embedded + saved to saveTo). DEFAULT: true, except when you pass saveTo (then sync is used so the file is actually produced on disk). If async is unavailable on your plan, it automatically falls back to sync. Quota is charged only on success; max 5 pending jobs per account.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / audioGuide / properties / pacing
      Added value: +{
      +  "description": "overlap (default): narration plays while the video continues (highlights and next steps run alongside it); sequential: each narrated step waits for its clip to finish.",
      +  "enum": [
      +    "overlap",
      +    "sequential"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / authState
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Authenticated recording/capture: cookies + localStorage injected BEFORE the first navigation, so protected pages (dashboards, admin panels) render logged-in. Prefer this over scripting a login flow. Values are never logged.",
      +  "properties": {
      +    "cookies": {
      +      "description": "Session cookies (up to 100). Objects may include domain, path, secure, httpOnly, sameSite, expires. Chrome-extension exports (sameSite: no_restriction/lax/strict, expirationDate) are accepted as-is.",
      +      "items": {
      +        "$ref": "#/properties/cookies/items"
      +      },
      +      "maxItems": 100,
      +      "type": "array"
      +    },
      +    "localStorage": {
      +      "description": "localStorage entries to set before the page loads (for token-in-localStorage apps)",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "items": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "name": {
      +                  "type": "string"
      +                },
      +                "value": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "name",
      +                "value"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "origin": {
      +            "description": "Origin the items belong to, e.g. \"https://app.example.com\"",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "origin",
      +          "items"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / cookies
      Added value: +{
      +  "description": "Cookies to set before the first navigation — \"name=value\" strings or full cookie objects (domain, path, secure, httpOnly, sameSite, expires). Up to 100. Domain defaults to the first navigate step's host.",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "additionalProperties": true,
      +        "properties": {
      +          "domain": {
      +            "type": "string"
      +          },
      +          "expirationDate": {
      +            "type": "number"
      +          },
      +          "expires": {
      +            "type": "number"
      +          },
      +          "httpOnly": {
      +            "type": "boolean"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "path": {
      +            "type": "string"
      +          },
      +          "sameSite": {
      +            "enum": [
      +              "Strict",
      +              "Lax",
      +              "None",
      +              "strict",
      +              "lax",
      +              "no_restriction",
      +              "unspecified"
      +            ],
      +            "type": "string"
      +          },
      +          "secure": {
      +            "type": "boolean"
      +          },
      +          "url": {
      +            "type": "string"
      +          },
      +          "value": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "value"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "maxItems": 100,
      +  "type": "array"
      +}
    • addedInput schema / properties / pollTimeoutMs
      Added value: +{
      +  "description": "Max time to wait for an async video job to finish, in milliseconds (default: 240000 = 4 min). If the job is still running when this elapses, the job_id is returned so you can check it later with get_job.",
      +  "maximum": 600000,
      +  "minimum": 10000,
      +  "type": "integer"
      +}
    • changedInput schema / properties / steps / items / properties / action / description
      Previous value: -"The action to perform (no screenshot/pdf — the whole sequence is recorded as video)"New value: +"The action to perform (\"highlight\" draws an animated attention effect around `selector`; no screenshot/pdf — the whole sequence is recorded as video)"
    • changedInput schema / properties / steps / items / properties / action / enum
      Previous value: -[
      -  "navigate",
      -  "click",
      -  "dblclick",
      -  "fill",
      -  "select",
      -  "hover",
      -  "scroll",
      -  "wait",
      -  "wait_for",
      -  "evaluate"
      -]New value: +[
      +  "navigate",
      +  "click",
      +  "dblclick",
      +  "fill",
      +  "select",
      +  "hover",
      +  "scroll",
      +  "wait",
      +  "wait_for",
      +  "evaluate",
      +  "press_key",
      +  "highlight"
      +]
    • addedInput schema / properties / steps / items / properties / color
      Added value: +{
      +  "description": "highlight action: hex color, e.g. \"#818cf8\" (default soft indigo)",
      +  "pattern": "^#[0-9A-Fa-f]{6}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / steps / items / properties / duration
      Added value: +{
      +  "description": "highlight action: how long the effect shows, in ms (default 3500; extended automatically when a note is present)",
      +  "maximum": 15000,
      +  "minimum": 200,
      +  "type": "integer"
      +}
    • addedInput schema / properties / steps / items / properties / key
      Added value: +{
      +  "description": "Key to press (for press_key action). Use Escape to dismiss a dropdown/popover/modal that a previous step opened — the cleanest way to avoid a stuck-open overlay obscuring later steps.",
      +  "enum": [
      +    "Escape",
      +    "Enter",
      +    "Tab",
      +    "Backspace",
      +    "Delete",
      +    "Space",
      +    "ArrowUp",
      +    "ArrowDown",
      +    "ArrowLeft",
      +    "ArrowRight",
      +    "Home",
      +    "End",
      +    "PageUp",
      +    "PageDown"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / steps / items / properties / label
      Added value: +{
      +  "description": "highlight action: short caption shown next to the element",
      +  "maxLength": 80,
      +  "type": "string"
      +}
    • addedInput schema / properties / steps / items / properties / padding
      Added value: +{
      +  "description": "highlight action: space between element and outline in px (default 10)",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / steps / items / properties / pauseAfter
      Added value: +{
      +  "description": "Milliseconds to hold after THIS step completes (0-10000). Overrides the default inter-step pause — use it to linger on important moments or speed through boring ones.",
      +  "maximum": 10000,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / steps / items / properties / selector / description
      Previous value: -"CSS selector for the target element"New value: +"CSS selector for the target element (optional for press_key to focus a field first)"
    • addedInput schema / properties / steps / items / properties / style
      Added value: +{
      +  "description": "highlight action: outline = animated line circling the element (default), pulse = expanding rings, glow = breathing glow, spotlight = dims everything else, arrow = bobbing arrow pointing at it",
      +  "enum": [
      +    "outline",
      +    "pulse",
      +    "glow",
      +    "spotlight",
      +    "arrow"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / steps / items / properties / thickness
      Added value: +{
      +  "description": "highlight action: line thickness in px (default 2)",
      +  "maximum": 20,
      +  "minimum": 1,
      +  "type": "number"
      +}
  3. First observedv1.8.1

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full disclosure burden. It usefully adds two behavioral facts not in the schema: 'Costs 3 API requests' and 'Saves to disk'. But it omits auth/permission requirements, failure modes, and the async-vs-inline delivery tradeoff (that detail lives only in the schema), so disclosure is partial.

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?

Well front-loaded: purpose and output formats come first, then cost/save facts, then the BEST PRACTICE block. The feature list ('cursor highlighting, click effects... and more') is slightly listy but each clause is short and the document has no filler sentences.

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 24-parameter, deeply nested tool with no annotations and no output schema, the description supplies the key 'don't over-engineer the sequence' guidance an agent needs to call it well. It leaves return-value behavior to the async parameter's schema text, which is acceptable but not ideal given the missing output schema.

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%, so the schema already documents all 24 parameters thoroughly; baseline is 3. The description only echoes a couple of parameters ('the pace parameter handles timing', zoom guidance) without adding syntax or meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Record a professional demo video of a multi-step browser automation sequence,' and enumerates the output formats (MP4/WebM/GIF). The purpose is unambiguous, but it never names the sibling it differs from (e.g. run_sequence, which presumably executes the same steps without recording, or take_screenshot). Clear but lacking explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

Strong operational guidance is given for how to build the sequence ('keep videos concise 5-15 steps', 'do NOT add wait steps', 'do NOT use zoom unless the user explicitly asks'), which is real usage guidance. However, it offers no guidance on when to choose record_video over alternatives like run_sequence or take_screenshot, so tool-selection context is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.