Skip to main content
Glama
ScrapeUnblocker

ScrapeUnblocker MCP Server

Official

Fetch page HTML

fetch_html

Fetch fully rendered HTML from any web page while bypassing anti-bot protections like Cloudflare and DataDome. Use when standard requests are blocked or pages require a real browser.

Instructions

Fetch the fully rendered HTML of any web page through ScrapeUnblocker, bypassing anti-bot protection (Cloudflare, DataDome, PerimeterX, Akamai, Shape). Use this when a normal fetch is blocked (403/429, captcha, 'access denied') or when the page needs a real browser to render. Returns the raw HTML as text.

For pages that need interaction (accept a cookie banner, click a tab, type into a search box, scroll to trigger lazy loading) pass steps: an ordered list of browser actions run in a real browser AFTER the page loads, then the resulting HTML is returned. Workflow: first call the list_elements tool to discover the real selectors on the page, then build steps against them. Steps are NOT idempotent - they run once per call. If a step fails, this tool returns which step failed, why, and the page HTML at that moment so you can fix the selector and retry.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesThe absolute URL to fetch (http/https).
stepsNoOptional ordered browser actions to run in a real browser after the page loads, before the HTML is captured. Use `list_elements` first to find selectors. Runs once (not idempotent).
wait_valueNoThe CSS selector or JS expression paired with wait_method (e.g. '#price' or 'document.readyState==="complete"').
wait_methodNoOptional render-wait strategy: 'css' waits for a selector, 'js' waits for a JS expression to be truthy.
proxy_countryNoOptional ISO 3166-1 alpha-2 country code to route through, e.g. 'US', 'GB', 'DE'.
sleep_secondsNoExtra seconds to wait after load before capturing the HTML.
method_timeout_secondsNoCap in seconds for the render-wait method.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changedv0.2.0
    • addedInput schema / properties / steps
      Added value: +{
      +  "description": "Optional ordered browser actions to run in a real browser after the page loads, before the HTML is captured. Use `list_elements` first to find selectors. Runs once (not idempotent).",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "additionalProperties": false,
      +        "description": "Wait until an element matching `selector` exists.",
      +        "properties": {
      +          "action": {
      +            "const": "wait_for",
      +            "type": "string"
      +          },
      +          "selector": {
      +            "description": "Selector to wait for (until present).",
      +            "type": "string"
      +          },
      +          "selector_type": {
      +            "description": "How `selector` is interpreted. Defaults to 'css'.",
      +            "enum": [
      +              "css",
      +              "xPath",
      +              "className",
      +              "tagName"
      +            ],
      +            "type": "string"
      +          },
      +          "timeout_ms": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "selector"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Wait until the given text appears on the page.",
      +        "properties": {
      +          "action": {
      +            "const": "wait_for_text",
      +            "type": "string"
      +          },
      +          "timeout_ms": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "value": {
      +            "description": "Text to wait for anywhere on the page.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Pause for a fixed number of milliseconds.",
      +        "properties": {
      +          "action": {
      +            "const": "wait",
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "Fixed pause in milliseconds.",
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Click the element matching `selector`.",
      +        "properties": {
      +          "action": {
      +            "const": "click",
      +            "type": "string"
      +          },
      +          "selector": {
      +            "description": "Selector of the element to click.",
      +            "type": "string"
      +          },
      +          "selector_type": {
      +            "$ref": "#/properties/steps/items/anyOf/0/properties/selector_type",
      +            "description": "How `selector` is interpreted. Defaults to 'css'."
      +          },
      +          "timeout_ms": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "selector"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Type text into an input, character by character.",
      +        "properties": {
      +          "action": {
      +            "const": "type",
      +            "type": "string"
      +          },
      +          "clear": {
      +            "description": "Clear the field before typing.",
      +            "type": "boolean"
      +          },
      +          "selector": {
      +            "description": "Selector of the field to type into.",
      +            "type": "string"
      +          },
      +          "selector_type": {
      +            "$ref": "#/properties/steps/items/anyOf/0/properties/selector_type",
      +            "description": "How `selector` is interpreted. Defaults to 'css'."
      +          },
      +          "timeout_ms": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "value": {
      +            "description": "Text to type (entered human-like).",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "selector",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Choose an option in a <select> dropdown by value.",
      +        "properties": {
      +          "action": {
      +            "const": "select",
      +            "type": "string"
      +          },
      +          "selector": {
      +            "description": "Selector of the <select> element.",
      +            "type": "string"
      +          },
      +          "selector_type": {
      +            "$ref": "#/properties/steps/items/anyOf/0/properties/selector_type",
      +            "description": "How `selector` is interpreted. Defaults to 'css'."
      +          },
      +          "timeout_ms": {
      +            "exclusiveMinimum": 0,
      +            "type": "integer"
      +          },
      +          "value": {
      +            "description": "The option value to select.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "selector",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Press a single keyboard key.",
      +        "properties": {
      +          "action": {
      +            "const": "press_key",
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "The key to press.",
      +            "enum": [
      +              "Enter",
      +              "Tab",
      +              "Escape",
      +              "Backspace",
      +              "Delete",
      +              "Space",
      +              "ArrowUp",
      +              "ArrowDown",
      +              "ArrowLeft",
      +              "ArrowRight",
      +              "Home",
      +              "End",
      +              "PageUp",
      +              "PageDown"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "description": "Scroll the page to the bottom or by a pixel amount.",
      +        "properties": {
      +          "action": {
      +            "const": "scroll",
      +            "type": "string"
      +          },
      +          "value": {
      +            "anyOf": [
      +              {
      +                "const": "bottom",
      +                "type": "string"
      +              },
      +              {
      +                "type": "integer"
      +              }
      +            ],
      +            "description": "'bottom' to scroll to the end, or a pixel offset."
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "value"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "type": "array"
      +}
  2. Addedv0.1.4
  3. Removedv0.1.3
  4. First observedv0.1.2

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses important behaviors: bypasses anti-bot protection, steps are not idempotent and run once per call, and failed steps return the failing step, reason, and page HTML at that moment. This is strong behavioral disclosure, though it omits potential costs, rate limits, or output size caveats.

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?

The description is dense but every sentence serves a purpose: the main behavior, the bypass value, the step workflow, the selector discovery guidance, and the failure semantics. It front-loads the core purpose and keeps related operational details together. No filler or repetition.

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?

For a tool with no annotations and no output schema, the description is remarkably complete. It covers the main use case, the fallback trigger, step semantics, failure behavior, return format, and the recommended workflow with list_elements. The 100% schema coverage for parameters fills the remaining gaps, so nothing critical is missing.

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 the baseline is 3. The description adds meaningful semantics beyond the schema by explaining that `steps` are an ordered list run after page load, that selectors should be discovered via list_elements, and that steps are non-idempotent. Other parameters like `wait_method` and `proxy_country` are adequately covered by the schema itself.

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 ('Fetch the fully rendered HTML of any web page') and immediately distinguishes itself by naming the anti-bot bypass use case. The scope is unambiguous and clearly separates it from the sibling tools like fetch_parsed and google_search.

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?

Explicitly tells the agent when to use it: when a normal fetch is blocked (403/429, captcha, 'access denied') or when a real browser is needed for rendering. It also gives a workflow for interactive pages (use list_elements first, then build steps). It doesn't explicitly name the alternative tool for parsed content or state when not to use it, but the usage context is clear.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ScrapeUnblocker/scrapeunblocker-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server