Skip to main content
Glama

Fetch a grab

get_grab
Read-only

Fetch a previously created grab by id: status, hosted image URL, and metadata. Useful for polling async grabs.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesGrab id (UUID)
return_imageNoInline the image too (default false)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesGrab id.
bytesNoImage size in bytes.
widthNoViewport width in pixels.
formatNoImage format.
heightNoViewport height in pixels (3240 in the response for full_page captures).
statusYesLifecycle state. Only done grabs have an image_url.
image_urlNoHosted image URL once status is done (relative for sk_test_ placeholders).
created_atNoISO 8601 creation time.
target_urlNoThe captured URL.
execution_msNoRender time in milliseconds.
error_messageNoWhy a failed grab failed.
credits_remainingNoTeam credits left after this grab (live keys only).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "bytes": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Image size in bytes."
      +    },
      +    "created_at": {
      +      "description": "ISO 8601 creation time.",
      +      "type": "string"
      +    },
      +    "credits_remaining": {
      +      "description": "Team credits left after this grab (live keys only).",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "error_message": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Why a failed grab failed."
      +    },
      +    "execution_ms": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Render time in milliseconds."
      +    },
      +    "format": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "png",
      +            "jpeg",
      +            "webp"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Image format."
      +    },
      +    "height": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Viewport height in pixels (3240 in the response for full_page captures)."
      +    },
      +    "id": {
      +      "description": "Grab id.",
      +      "type": "string"
      +    },
      +    "image_url": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Hosted image URL once status is done (relative for sk_test_ placeholders)."
      +    },
      +    "status": {
      +      "description": "Lifecycle state. Only done grabs have an image_url.",
      +      "enum": [
      +        "pending",
      +        "processing",
      +        "done",
      +        "failed"
      +      ],
      +      "type": "string"
      +    },
      +    "target_url": {
      +      "description": "The captured URL.",
      +      "type": "string"
      +    },
      +    "width": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Viewport width in pixels."
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "status"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, covering the safety profile. The description still adds real value by disclosing the async/polling workflow ('previously created grab', 'polling async grabs'), telling the agent this is a repeated-read pattern rather than a one-shot call.

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 compact sentences with zero filler, and the identity/return-value information is front-loaded before the polling hint. Every clause earns its place.

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?

An output schema exists, so the description is not obligated to explain return values (even though it briefly does). For a simple two-parameter read tool with full annotation coverage, the definition is nearly complete; only explicit sibling routing is absent.

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 both parameters (id, return_image) are fully documented in the schema itself. The description only implies the id-based lookup that the schema already states, adding no syntax, format, or default detail beyond it.

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 ('Fetch a previously created grab by id') and enumerates the payload ('status, hosted image URL, and metadata'), so an agent can tell it apart from list_grabs and grab without opening the schema.

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?

'Useful for polling async grabs' gives one concrete use case, which is genuinely helpful routing context. However, it never names the alternatives (list_grabs for enumeration, grab for creation) or states when not to use this tool, so the guidance is implied rather than explicit.

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.