A Model Context Protocol server that lets Claude (and any other MCP client) fetch any web page's HTML - or run one of 100+ ready-made site plugins that return structured JSON - through the ScrapeUnblocker scraping API, bypassing anti-bot protection (Cloudflare, DataDome, PerimeterX, Akamai, Shape).
You bring your own API key. Nothing is shared or proxied through us.
| Tool | What it does |
|---|---|
fetch_html |
Fetch the fully rendered HTML of a URL. |
browse_page |
Run interactive browser steps on a page (click, type, select, scroll, wait), then return the resulting HTML. Not read-only: it acts on the website. |
list_elements |
List a page's notable elements with a ready-to-use selector for each (selector discovery). |
fetch_parsed |
Fetch a page and return AI-parsed structured JSON. |
google_search |
Run a Google search and return organic results as JSON. |
fetch_markdown |
Fetch a page and return it as clean Markdown: the main content with absolute links, without scripts, styles, navigation or footer. Usually 2-25% the size of the HTML, so it is the cheap way for a model to read a page. |
search_and_read |
Search Google and read the top results in one call: Google's AI Overview (when there is one), the first 1-5 result pages as Markdown, and the other results as title, URL and snippet. Billed as one search plus one request per page read. |
list_plugins |
List the ready-made site plugins (100+: Amazon, Walmart, Zillow, Booking.com, Indeed, Google Trends, YouTube, App Store, Ahrefs, ...) with their parameters. Free - it calls nothing. |
run_plugin |
Run one site plugin and return its structured JSON. |
amazon_search, amazon_product, amazon_reviews, walmart_search, ebay_search, google_shopping, google_local, maps_place_details, google_images, youtube_search, youtube_transcript, zillow_search, indeed_jobs, trustpilot_reviews, booking_hotels |
The most-used site plugins as tools of their own, each with its parameters in the tool schema - one call, no list_plugins lookup. Same JSON as run_plugin. |
For many popular sites there is a plugin that returns the data already
parsed - a Target search, a Zillow listing search, an app's App Store reviews,
Google Trends for a few keywords. The model calls list_plugins (optionally
with search: "zillow" or a category) to find the plugin and its
parameters, then run_plugin with name and params (the most-used plugins, listed in
the table above, can also be called directly as their own tools):
{ "name": "target_search", "params": { "query": "coffee maker", "max_results": 20 } }Every plugin and parameter is documented on the plugin pages. Each run is billed like an API request.
Some pages only reveal what you need after you interact with them - accept a
cookie banner, click a tab, type into a search box and submit, or scroll to
trigger lazy loading. Pass a steps array to browse_page and those
actions run in a real browser, in order, after the page loads; the resulting
HTML is then returned.
Available actions:
| Action | Fields |
|---|---|
wait_for |
selector, selector_type? (css/xPath/className/tagName), timeout_ms? |
wait_for_text |
value, timeout_ms? |
wait |
value (ms) |
click |
selector, selector_type?, timeout_ms? |
type |
selector, selector_type?, value, clear?, timeout_ms? (typed human-like) |
select |
selector, selector_type?, value, timeout_ms? |
press_key |
value (Enter, Tab, Escape, Backspace, Delete, Space, Arrow*, Home, End, PageUp, PageDown) |
scroll |
value ("bottom" or a pixel offset) |
Steps are not idempotent - they run once per call - and they act on the
website, so browse_page is the one tool not marked read-only. If a step fails,
browse_page returns which step failed, why, and the page HTML at that moment so
you can fix the selector and retry.
list_elements loads a page and returns a JSON list of its notable elements
(links, inputs, buttons, selects, ...), each with a ready-to-use selector plus
tag, text and useful attributes (name, id, type, placeholder,
aria_label, href, ...):
{ "url": "https://example.com", "count": 42, "elements": [ { "tag": "input", "selector": "#search", "type": "text", "placeholder": "Search", "aria_label": "Search" } ] }The natural workflow is discover, then act: call list_elements to find the
selectors you need, then pass matching steps to browse_page to click/type/
select and capture the resulting HTML.
Sign up and grab your key at app.scrapeunblocker.com. The server
reads it from the SCRAPEUNBLOCKER_KEY environment variable.
The easiest route is the official plugin, which installs this server for you,
prompts for your API key (stored in your OS keychain rather than an environment
variable), and adds a /scrape-url command plus reference skills:
/plugin marketplace add ScrapeUnblocker/claude-code-plugin
/plugin install scrapeunblocker@scrapeunblocker
See ScrapeUnblocker/claude-code-plugin.
To add the bare server instead:
claude mcp add scrapeunblocker \
--env SCRAPEUNBLOCKER_KEY=your_api_key_here \
-- npx -y scrapeunblocker-mcpAdd this to your claude_desktop_config.json
(Settings → Developer → Edit Config):
{
"mcpServers": {
"scrapeunblocker": {
"command": "npx",
"args": ["-y", "scrapeunblocker-mcp"],
"env": {
"SCRAPEUNBLOCKER_KEY": "your_api_key_here"
}
}
}
}Restart Claude Desktop and the ScrapeUnblocker tools appear.
Run the server over stdio:
SCRAPEUNBLOCKER_KEY=your_api_key_here npx -y scrapeunblocker-mcp- "Fetch the HTML of https://www.example-shop.com/product/123 and list the price."
- "This page keeps blocking me: . Use fetch_html to get it."
- "List the elements on , then use browse_page to type 'laptop' into the search box, press Enter, wait for the results, and give me the HTML."
- "Search Google for 'best running shoes 2026' and give me the top 5 links."
- "Read https://en.wikipedia.org/wiki/Web_scraping as Markdown and summarise it in five bullets."
- "Search the web for the current population of Vilnius and cite the pages you read."
- "Find coffee makers on Target under $50 and compare them with Walmart's."
- "Show Google Trends for 'coffee' vs 'tea' in the US over the last year."
- "What are the newest App Store reviews of WhatsApp saying?"
npm install
npm run build # bundles to dist/ with tsup
npm run typecheck
npm test # builds, then runs the tools against a local stand-in API
SCRAPEUNBLOCKER_KEY=... node dist/index.js # run the serverMIT