Skip to main content
Glama
ScrapeUnblocker

ScrapeUnblocker MCP Server

Official

ScrapeUnblocker MCP server

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.

Tools

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.

Site plugins (structured JSON for known sites)

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.

Browser steps (interact, then capture)

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 (discover selectors first)

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.

Related MCP server: SteadyFetch

Get an API key

Sign up and grab your key at app.scrapeunblocker.com. The server reads it from the SCRAPEUNBLOCKER_KEY environment variable.

Install

Claude Code

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-mcp

Claude Desktop

Add 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.

Any other MCP client

Run the server over stdio:

SCRAPEUNBLOCKER_KEY=your_api_key_here npx -y scrapeunblocker-mcp

Example prompts

  • "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?"

Development

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 server

License

MIT

Available Tools

24 tools
amazon_productScrape an Amazon product pageA
Read-only

Fetches a single Amazon product and returns it as JSON: title, brand, price + currency, listPrice and savingsPercent, availability (+ a boolean inStock), rating, reviewCount, seller, features (bullet points), categories (breadcrumb) and images. Identify the product with either asin (plus marketplace) or a full product url. Amazon prices each page in the currency of the delivery location it infers from the visitor's IP address, so proxy_country defaults to the marketplace's home country (amazon.com -> US) and the call is routed through ISP proxies in that country. The proxy that served the request is reported as exitCountry (its country) and exitProvider (its type: isp, residential or datacenter). Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
urlNoFull Amazon product url, e.g. 'https://www.amazon.de/dp/B0BSHF7WHW'. The ASIN and marketplace are read from it, so `asin`/`marketplace` are not needed when a url is given.
asinNoAmazon product id (10-char ASIN, e.g. 'B0BSHF7WHW'; books use their ISBN-10). Give either `asin` (with `marketplace`) or a full `url`.
marketplaceNoRegional Amazon site the ASIN belongs to. Prices and currency differ per marketplace. One of: amazon.com, amazon.co.uk, amazon.de, amazon.fr, amazon.it, amazon.es, amazon.nl, amazon.se, amazon.pl, amazon.com.be, amazon.com.tr, amazon.ca, amazon.com.mx, amazon.com.br, amazon.co.jp, amazon.in, amazon.ae, amazon.sa, amazon.sg, amazon.com.au. Default: amazon.com.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to the marketplace's home country so the price comes back in the expected currency.

TDQS

A4.3/5.0
Behavior5/5

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

Going well beyond the readOnly/openWorld/non-destructive annotations, it discloses the IP-based currency inference behavior, the automatic ISP-proxy routing by proxy_country, the reported exitCountry/exitProvider metadata, and the unit-based billing model. These are non-obvious operational traits an agent could not derive from annotations or schema.

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?

It is front-loaded with the return payload, then behavior, then args/billing, and most sentences carry weight. The closing sentence about listing plugins billing per result page and keeping 'max_results' modest is irrelevant boilerplate for a single-product tool with no max_results parameter, which is the one clear waste.

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?

With no output schema, the description compensates by enumerating the returned fields (title, brand, price/currency, availability, rating, images, etc.) plus the meta fields exitCountry/exitProvider. Combined with argument selection rules, defaults, currency behavior and billing, an agent has everything needed to call it correctly.

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 description coverage is already 100%, so the baseline is 3, but the description adds real meaning: why proxy_country matters (prices are returned in the currency of the inferred delivery location) and how url subsumes asin/marketplace. It does not, however, document edge cases such as invalid ASIN handling or unsupported marketplaces.

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 names a specific verb and resource ('Fetches a single Amazon product and returns it as JSON') and even enumerates the returned fields, so the agent knows exactly what comes back. The word 'single' implicitly separates it from amazon_search/amazon_reviews, but no sibling is named explicitly, which keeps it short of a 5.

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?

It gives concrete invocation guidance: identify the product with either 'asin' (plus 'marketplace') or a full product 'url', and explains that proxy_country defaults to the marketplace's home country. It never states when to prefer this tool over amazon_search for keyword discovery or amazon_reviews for review data, so it stops short of the explicit when/when-not/alternatives rubric.

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

amazon_reviewsScrape the reviews on an Amazon product pageA
Read-only

Returns the review data an Amazon product page shows to a signed-out visitor, as JSON: the overall rating, total reviewCount (global ratings), the 5..1-star histogram (percent per star), the AI customersSay summary (overall text plus per-aspect sentiment, mentions, positive, negative, summary and the quoted review excerpts Amazon shows for the aspect) and the top reviews (each with id, url, author, rating, title, body, date, country, fromOtherCountry, verified, helpfulVotes, variant and images). Identify the product with asin (plus marketplace) or a product url. Scope: Amazon only shows its full review list to signed-in customers, so this endpoint returns the public slice on the product page - typically 5 to 13 top reviews, local ones first and then reviews from other countries - not a complete review export. When Amazon hides the top reviews behind a sign-in prompt (common on amazon.com), reviewsGated is true and reviews is empty; the rating, histogram and customers-say data, including its review excerpts, are still returned. Every field is always present and is null when the page does not show it. proxy_country defaults to the marketplace's home country; the proxy that served the request is reported as exitCountry (its country) and exitProvider (its type: isp, residential or datacenter). Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
urlNoFull Amazon product url, e.g. 'https://www.amazon.de/dp/B0D1XD1ZV3'. The ASIN and marketplace are read from it, so `asin`/`marketplace` are not needed when a url is given.
asinNoAmazon product id (10-char ASIN, e.g. 'B07PXGQC1Q'; books use their ISBN-10). Give either `asin` (with `marketplace`) or a product `url`.
marketplaceNoRegional Amazon site the ASIN belongs to. Reviews are read from that store. One of: amazon.com, amazon.co.uk, amazon.de, amazon.fr, amazon.it, amazon.es, amazon.nl, amazon.se, amazon.pl, amazon.com.be, amazon.com.tr, amazon.ca, amazon.com.mx, amazon.com.br, amazon.co.jp, amazon.in, amazon.ae, amazon.sa, amazon.sg, amazon.com.au. Default: amazon.com.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to the marketplace's home country. The reviews come from the marketplace itself, so any proxy country returns the same reviews.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior: reviewsGated gating on amazon.com, null-when-absent field semantics, proxy country reporting via exitCountry/exitProvider, and per-page billing. It doesn't cover rate limits or retry/failure behavior, so a 3 is fair against the annotation baseline.

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?

Front-loaded with purpose, and the long field enumeration earns its place because there is no output schema. Some sentences are run-ons, but no content is filler given the missing output schema.

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?

With no output schema, the description must carry the full return-value burden and does: rating, reviewCount, histogram, customersSay aspects/excerpts, and per-review fields are all enumerated, plus gating and null-fill semantics. Nothing an agent needs to interpret the response is missing.

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 coverage is 100% and the four parameter descriptions already document the asin/marketplace/url relationship, the marketplace enum list and the proxy_country default. The description largely restates this ('Identify the product with asin (plus marketplace) or a product url'), so it adds little beyond the schema. 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?

Opens with a specific verb+resource: returns Amazon product-page review data as JSON. It clearly delineates scope ('public slice on the product page') versus a full review export, which is exactly the line that separates it from amazon_product (details) and search siblings.

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?

Explains how to invoke it (identify product via asin+marketplace or url) and gives a strong negative-scope statement ('not a complete review export', 5-13 top reviews). It does not explicitly name sibling tools to use instead, but the context of use is unambiguous.

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

booking_hotelsScrape Booking.com hotelsA
Read-only

Searches Booking.com for location and returns the properties as JSON: name, price (with checkin/checkout), reviewScore, address, coordinates, image and a hotel url. Set adults, children, rooms and currency, and collect up to max_results across pages. Prices only appear when check-in/check-out dates are given. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
roomsNoNumber of rooms.
adultsNoNumber of adults.
checkinNoCheck-in YYYY-MM-DD (needed for prices).
checkoutNoCheck-out YYYY-MM-DD.
childrenNoNumber of children.
currencyNoPrice currency: USD, EUR, GBP, AUD, CAD, CHF, JPY, CNY, INR, BRL, MXN, PLN, SEK, NOK, DKK, AED, SGD, ZAR, TRY, RUB. Default: USD.
locationYesCity or place to search, e.g. 'Austin' or 'Paris'.
max_resultsNoHow many properties to collect across pages. Default: 25.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE').

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already carry the safety profile (readOnly, openWorld, non-destructive), so the bar is lower, yet the description adds genuine operational context beyond them: pagination ('across pages') and the billing/rate model ('billed like an API request', 'one unit per result page'). That billing detail materially affects how an agent should size max_results.

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?

Front-loaded with purpose, then return shape, then usage tips and billing caveat in a logical order. Slightly redundant: JSON output is mentioned twice ('returns the properties as JSON' and 'Returns JSON'), which costs a little space.

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?

With no output schema, the description correctly carries the return-value burden by listing the returned fields (name, price, reviewScore, address, coordinates, image, url), plus pagination and billing behavior. Nothing an agent needs to call or interpret this tool is missing.

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 coverage is 100%, so every parameter is already documented in the schema. The description restates the tunable knobs (adults, children, rooms, currency, max_results) and the checkin/checkout-for-prices rule, but adds little syntax or constraint information beyond what the schema provides. 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 ('Searches Booking.com for `location`') and enumerates the returned fields, so an agent immediately knows what this tool produces. It is the only hotel-scraping sibling, so distinction from the amazon/google/zillow tools is unambiguous.

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?

Gives a real usage condition: prices only appear when check-in/check-out dates are provided, so an agent knows what to supply to get pricing. It also advises keeping max_results modest. It stops short of naming alternatives, though no close sibling competes with it.

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

browse_pageInteract with a page, then capture itA
Destructive

Load a web page in a real browser through ScrapeUnblocker, run an ordered list of browser actions on it (accept a cookie banner, click a tab, type into a search box, choose an option, press a key, scroll to trigger lazy loading, wait), then return the resulting HTML. Workflow: first call the list_elements tool to discover the real selectors on the page, then build steps against them. Steps act on the website and are NOT idempotent - they run once per call; never use them to buy, post, delete or change anything unless the user asked for exactly that. 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. Billed as one request.

NameRequiredDescriptionDefault
urlYesThe absolute URL to open (http/https).
stepsYesOrdered 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.
wait_methodNoOptional render-wait before the steps run: '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.
method_timeout_secondsNoCap in seconds for the render-wait method.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive=true, idempotent=false and openWorld=true, so the bar is lower. The description still adds real value: steps run once per call, failures report which step failed plus the page HTML at that moment for retry, and billing is one request — context the annotations do not convey.

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?

Front-loaded purpose sentence followed by a labeled 'Workflow:' segment and failure semantics; every sentence contributes. It is dense but slightly long, and the mid-sentence parenthetical action list is redundant with the step schema.

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 7-param tool with a nested anyOf `steps` array and no output schema, the description covers failure returns, billing, and step-construction workflow. Minor gaps remain: optional knobs like proxy_country and wait_method/sleep_seconds are only explained by the (fully covered) schema, not the prose.

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 schema carries parameter documentation and the baseline is 3. The description adds meaning beyond the schema by explaining how `steps` should be constructed (discover selectors with `list_elements` first) and that steps execute once, which shapes how an agent authors the array.

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?

The first sentence names a specific verb chain (load in a real browser, run ordered actions, return HTML) and the resource (ScrapeUnblocker-backed page render). It clearly differentiates from siblings by emphasizing interaction, and the title reinforces the two-phase behavior.

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

Usage Guidelines5/5

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

Explicit workflow routing: call `list_elements` first to discover selectors, then build `steps`. It also states a when-not ('never use them to buy, post, delete or change anything unless the user asked'), and names the prerequisite tooling, leaving little to inference.

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

fetch_htmlFetch page HTMLA
Read-only

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. To read or summarise a page, fetch_markdown is much smaller. To click, type or scroll before capturing, use browse_page.

NameRequiredDescriptionDefault
urlYesThe absolute URL to fetch (http/https).
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.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, openWorld, and non-destructive behavior. The description adds meaningful context beyond that: anti-bot bypass, real browser rendering, and raw HTML output. It does not contradict the annotations, though it omits rate-limit or failure-mode details.

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 front-loaded with the main action and return format, then gives concise routing guidance for alternatives. Every sentence has a clear purpose with no wasted prose.

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?

The tool is open-world and has six parameters, but the schema fully documents them and annotations cover safety. The description supplies the missing high-level behavior and return type, making it complete enough to call correctly.

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 six parameters thoroughly. The description does not add parameter-specific meaning beyond what is already in the schema, which is acceptable at baseline 3.

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?

The description gives a specific verb and resource: fetching fully rendered HTML of any web page via ScrapeUnblocker. It explicitly states the return format and distinguishes sibling tools like fetch_markdown and browse_page.

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

Usage Guidelines5/5

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

It names concrete conditions for use: normal fetch blocked by 403/429, captcha, access denied, or when a real browser is needed to render. It also routes users away to fetch_markdown for reading/summarising and browse_page for interactions.

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

fetch_markdownFetch page as MarkdownA
Read-only

Fetch a web page in a real browser through the ScrapeUnblocker API (https://docs.scrapeunblocker.com) and return it as clean Markdown: the main content with absolute links, without scripts, styles, navigation or footer. Use it to read, quote or summarise a page; it is usually 2-25% the size of the HTML. Works on JavaScript-rendered pages and on pages that refuse ordinary fetches (403/429, captcha). Use fetch_html instead when you need the markup, selectors or browser steps. Billed as one request.

NameRequiredDescriptionDefault
urlYesThe absolute URL to read (http/https).
wait_valueNoThe selector/expression paired with wait_method.
wait_methodNoOptional render-wait: 'css' selector or 'js' expression.
proxy_countryNoOptional ISO country code to route through, e.g. 'US'.
sleep_secondsNoExtra seconds to wait after load.
main_content_onlyNoDrop navigation, page header, footer and sidebars (default true). False keeps the whole page.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/openWorldHint/non-destructive, and the description adds real context beyond them: real browser rendering, the size reduction (2-25% of HTML), that it defeats 403/429/captcha blocks, and the billing unit ('one request'). These are operational traits an agent cannot get from the structured fields.

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?

Four dense sentences, front-loaded with what it returns, then capabilities, then the sibling routing rule, then cost. Every sentence carries distinct information and none repeats the schema or annotations.

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?

Despite no output schema, the description specifies the return format precisely (clean Markdown, absolute links, stripped chrome), covers failure/blocking scenarios, and states the billing model. An agent has everything needed to invoke it correctly and interpret the result.

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% and every parameter is documented in the schema, so the baseline is 3. The description only gestures at the render-wait capability ('browser steps') and adds no syntax or defaults beyond the schema, so it neither helps nor hurts.

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 a web page, return clean Markdown) and immediately specifies the output shape: main content with absolute links, no scripts/styles/nav/footer. It also names the sibling it is not — fetch_html — so an agent can distinguish them without opening 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 Guidelines5/5

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

Gives explicit use cases ('read, quote or summarise a page') and an explicit routing rule with the alternative: 'Use fetch_html instead when you need the markup, selectors or browser steps.' It also names the conditions that select this tool (JS-rendered pages, 403/429, captcha). Nothing is left to inference.

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

fetch_parsedFetch AI-parsed page dataA
Read-only

Fetch a web page through ScrapeUnblocker and return AI-parsed structured JSON instead of raw HTML (e.g. product details, article content). Best for extracting fields from product, listing or article pages without writing your own HTML parsing. If the page holds no structured data, the result says so and returns the rendered HTML instead (billed like fetch_html).

NameRequiredDescriptionDefault
urlYesThe absolute URL to fetch and parse.
rules_hintNoOptional natural-language hint about what to extract, to guide parsing.
proxy_countryNoOptional ISO country code to route through, e.g. 'US'.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, openWorld), and the description adds genuinely non-obvious behavior: the graceful degradation to rendered HTML when no structured data exists, plus a billing implication tied to fetch_html. It does not discuss rate limits, proxy/auth requirements, or latency, so it is strong but not exhaustive.

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?

Three tight sentences: capability and output format first, target use case second, fallback/billing caveat last. Every clause carries information an agent needs, with no restatement of the title or schema.

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?

With no output schema, the description correctly carries the return-value burden by describing structured JSON, its fallback, and cost behavior. The one remaining gap is that the shape of the parsed JSON (field naming, nesting) is left unspecified, though that is arguably discoverable from the response itself.

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 url, rules_hint, and proxy_country are already fully documented in the schema. The description implies rules_hint's guiding role but adds no syntax, format, or edge-case detail beyond the structured fields, so the baseline of 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?

Specific verb (fetch) plus explicit output contract: AI-parsed structured JSON rather than raw HTML, with examples (product details, article content). It implicitly distinguishes itself from fetch_html by naming that alternative's output format, so an agent can tell the two apart without opening a 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?

"Best for extracting fields from product, listing or article pages without writing your own HTML parsing" gives clear positive selection criteria, and the fallback sentence tells the agent what happens on pages lacking structured data. It stops short of an explicit "use fetch_html when you want raw HTML" routing statement, which keeps it from a 5.

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

google_imagesScrape Google Images resultsA
Read-only

Runs the Google Images vertical (udm=2) for q and returns the image results as JSON. Every result carries imageUrl (the full-resolution origin image, not a Google thumbnail; for an image found inside a document such as a PDF, which has no URL of its own, it is Google's thumbnail and sourcePageUrl is the document), sourceDomain and googleImagesUrl (the Google Images viewer link, i.e. the /imgres?... URL a browser copies from the result tile), plus sourcePageUrl, title, sourceName, thumbnailUrl, width, height and fileSize where available. Set proxy_country to target a market: the Google market (gl) follows it automatically, and gl is only an optional override. pages fetches up to 5 result pages of ~100 each; every page fetched is billed as one request. time_range (past hour/day/week/month/year) or date_from/date_to limit the results to images Google found in that period, so a repeated scan returns only what is new. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
qYesImage search term, e.g. 'eiffel tower'.
glNoOptional Google market override (ISO-2, e.g. 'us', 'de'). Leave empty and the market follows `proxy_country` ('us' when neither is set). The market, not the proxy country, is what decides which images rank.
pagesNoHow many Google Images result pages to fetch (1-5, ~100 results each; Google stops at ~400-500 per query). Each page fetched is billed as one request. Default: 1.
date_toNoOnly images Google found on or before this date (YYYY-MM-DD). Works alone or with `date_from`; cannot be combined with `time_range`.
date_fromNoOnly images Google found on or after this date (YYYY-MM-DD). Works alone or with `date_to`; cannot be combined with `time_range`.
time_rangeNoOnly images Google found within this recent period: `hour`, `day`, `week`, `month` or `year` (Google Images' Tools > Time filter). Use it to get just the new results on repeated scans. Cannot be combined with `date_from`/`date_to`.
max_resultsNoOptional cap on the number of results returned (default: all results of the fetched pages).
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Image results are market-specific.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover read-only/safe/open-world status, but the description adds substantial non-obvious behavior beyond them: exact return field semantics (e.g., `imageUrl` is the full-resolution origin, except for PDF-embedded images where it is a Google thumbnail), billing per page, page limits (~400-500 per query), and pagination behavior up to 5 pages.

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?

It is information-dense but front-loads the main purpose and then walks through parameters in a logical order. It is somewhat long and could be tightened, but every sentence carries useful operational detail.

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 an 8-parameter, no-output-schema tool, it covers purpose, output shape, parameter interactions, limits, and billing. An agent has enough information to call it correctly without opening the schema.

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 description coverage is 100%, so the baseline is 3; however, the description adds meaning not fully captured by the schema, such as how `proxy_country` automatically sets `gl` unless overridden, and clarifies `time_range`/`date_from`/`date_to` semantics for repeated scans.

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 ('Runs the Google Images vertical') and resource, and identifies the concrete output artifact (image results as JSON) with field-level detail. It is clearly distinguished from siblings like google_search, google_shopping, and google_local by naming the `udm=2` vertical.

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?

Gives clear context for several parameters: use `time_range`/`date_from`/`date_to` for repeated new-result scans, set `proxy_country` to target a market, and keep `max_results` modest due to billing. It does not explicitly say when to prefer this over google_search or other image-capable siblings, but the vertical-specific purpose largely makes that unnecessary.

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

google_localScrape Google Local business listingsA
Read-only

Runs a Google Local (tbm=lcl) search for keyword and returns up to ~20 businesses as JSON: name, rating, reviews, price, category, address, phone, website, hours, and a top review_snippet. phone and website are null when Google does not render them for that result - service businesses (plumbers, contractors) almost always carry both. Local results are location-sensitive - set proxy_country (and optionally gl/hl) to target a market. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
glNoGoogle country of search, ISO-2 lowercase, e.g. 'us', 'de'.
hlNoGoogle UI language, e.g. 'en', 'de', 'fr'. Default: en.
keywordYesSearch phrase, e.g. 'coffee shops in chicago' or 'plumbers near SW1A'.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'GB'). Local results are location-sensitive, so pick the country you want results for.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, openWorld, non-destructive), and the description adds genuinely new behavior: phone/website come back null when Google doesn't render them, service businesses usually carry both, and billing is one unit per result page fetched. Cost and data-availability disclosure beyond the annotations is exactly the value-add expected.

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?

Front-loads purpose and return shape, then tacks on location and billing caveats; every sentence carries information. Minor redundancy in restating 'Returns JSON' after already saying results come back as JSON.

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?

With no output schema, the description compensates by listing all returned fields and flagging which can be null. Combined with location and billing guidance, an agent has everything needed to call and interpret the tool.

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, but the description goes further by explaining the purpose of proxy_country plus gl/hl as a location-targeting mechanism rather than restating their type. It adds intent the schema alone doesn't convey.

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 ('Runs a Google Local (`tbm=lcl`) search for `keyword`') and enumerates the returned fields, which cleanly separates it from google_search and maps_place_details. An agent can tell this is the SERP-scraping local-results tool 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 Guidelines4/5

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

Gives clear operational context: local results are location-sensitive, so set proxy_country and optionally gl/hl to target a market, and keep max_results modest because of billing. It stops short of naming an alternative (e.g., maps_place_details) or stating when not to use this tool.

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

google_shoppingScrape Google Shopping product listingsA
Read-only

Runs the Google Shopping vertical (udm=28) for q and returns the product cards as JSON: title, price, currency, currencyCode, originalPrice, discount, merchant, rating, reviewCount and Google's own ids for the product (productId, catalogId, offerId - stable across searches, for tracking one product). Set proxy_country/gl to target a market (prices/merchants are region-specific) and min_price/max_price to filter. One render returns the first page of products (v1). Note: Google Shopping exposes no per-product URL, so url is omitted and image is best-effort. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
qYesProduct search term, e.g. 'wireless headphones'.
glNoMarket of search, ISO-2, e.g. 'us', 'de'. Sets prices/merchants. Default: us.
max_priceNoMaximum price filter (whole units, gl currency).
min_priceNoMinimum price filter (whole units, gl currency).
max_resultsNoHow many products to return (v1: first page). Default: 60.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Prices/merchants are market-specific.

TDQS

A4/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses pagination limits ('one render returns the first page'), known data gaps ('no per-product URL, so `url` is omitted and `image` is best-effort'), and billing behavior ('billed like an API request... one unit per result page'). These are exactly the constraints an agent needs before calling.

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?

Dense and front-loaded: purpose and return shape come first, then configuration, then caveats and billing. It is a long single paragraph, but nearly every clause carries new information an agent would otherwise have to discover by trial.

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?

With no output schema, the description takes on the job of listing return fields and does so explicitly, plus flags the omitted/approximate fields. Combined with annotations and full schema coverage, an agent has everything needed to call this correctly.

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 coverage is 100%, so all six parameters are already documented, and the description mostly restates the same semantics (region-specific prices, price filters). It adds value on return identifiers (productId/catalogId/offerId stable across searches) but not on parameter meaning, so the baseline 3 applies.

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?

Names the specific vertical (`udm=28`) and resource ('product cards') and enumerates the returned fields, so the agent knows exactly what this produces. It implicitly distinguishes itself from google_search by scoping to the Shopping vertical, but never explicitly names a sibling as the alternative.

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?

Guidance exists for configuring the call ('set proxy_country/gl to target a market', 'min_price/max_price to filter', 'keep max_results modest'), but there is no statement of when to reach for this over amazon_search, walmart_search, or google_search. Usage is implied by context rather than declared.

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

indeed_jobsScrape Indeed job listingsA
Read-only

Searches Indeed for query in location and returns the job listings as JSON: title, company, location, salary (with parsed min/max), jobTypes, companyRating, a snippet, datePosted (YYYY-MM-DD), sponsored (Indeed's paid placement) and a clean job url. Filter with country, job_type, days (posting age), remote, sort with sort (date returns the collected jobs newest first, sponsored ones included), and collect up to max_results across pages. Indeed sits behind Cloudflare + PerimeterX - handled for you. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
daysNoMax posting age in days: 1, 3, 7, 14.
sortNoOrdering: relevance, date. Default: relevance.
queryYesWhat to search, e.g. 'software engineer' or 'nurse'.
startNo0-based result offset to start from. Default: 0.
radiusNoSearch radius in miles/km around the location.
remoteNoOnly remote jobs. Default: false.
countryNoIndeed country site: us, uk, ca, au, in, ie, de, fr, nl, es, it, at, ch, be, pl, se, sg, za, nz, mx. Default: us.
job_typeNoJob type: fulltime, parttime, contract, internship, temporary.
locationNoWhere, e.g. 'Austin, TX' or 'London'.
max_resultsNoHow many jobs to collect across pages. Default: 30.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to the country's site.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly/openWorld/non-destructive), and the description adds substantially more: Cloudflare + PerimeterX anti-bot handling, that sponsored placements appear in results, and the billing model (per result page fetched, billed like an API request). The cost/cadence disclosure is exactly the kind of behavior annotations cannot express.

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?

A single dense, front-loaded paragraph with no filler sentences; outputs are listed before filter/sort guidance. The run-on style and stacked parentheticals make it slightly harder to scan than a bulleted alternative, but nothing is wasted.

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?

With 11 parameters and no output schema, the description carries the return-shape burden and does so by naming every returned field, plus discloses cost, anti-bot handling, and pagination behavior. Nothing an agent needs to call it correctly 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 schema already defines every parameter; baseline would be 3. The description still adds meaning beyond the schema by glossing `days` as posting age, explaining that sort='date' returns collected jobs newest-first with sponsored included, and noting max_results spans pages.

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?

Opens with a specific verb+resource ('Searches Indeed for `query` in `location`') and enumerates the returned fields, so the agent immediately knows what comes back. No sibling tool covers job listings, so it is unambiguously the right pick among the search scrapers.

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?

Gives concrete guidance on how to narrow results (country, job_type, days, remote) and ordering (sort), plus a cost-motivated caution to keep max_results modest. It lacks explicit when-not-to-use or alternative-tool routing, but there is no competing sibling for this resource.

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

list_elementsList page elements (selector discovery)A
Read-only

Load a page through ScrapeUnblocker and return a JSON list of its notable elements (links, inputs, buttons, selects, etc.) with a ready-to-use selector for each, plus tag, text and useful attributes (name, id, type, placeholder, aria_label, href, ...). Read-only and does not interact with the page. This is the discovery half of interactive scraping: 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.

NameRequiredDescriptionDefault
urlYesThe absolute URL whose elements you want to list.
proxy_countryNoOptional ISO country code to route through, e.g. 'US'.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces with 'Read-only and does not interact with the page' while adding non-obvious context: fetching happens via ScrapeUnblocker (an external proxy service) and the response is a JSON element list with selectors and attributes. It stops short of covering failure behavior (blocked pages, non-HTML content) or proxy fallback, so it is strong but not exhaustive.

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 sentences, both front-loaded: the first states the action and the return shape, the second supplies the workflow linkage. No filler, and the discovery-only constraint is stated before the sibling hand-off.

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?

With no output schema, the description carries the burden and does describe the return payload (element kinds, selector, tag/text/attributes). What an agent would still want — behavior on blocked or non-HTML pages, and whether element listing is capped — is absent, keeping it just below a 5.

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% and both parameters (`url`, `proxy_country`) are documented in-schema, so the description need only not contradict them. It mentions loading 'a page' but adds no format or semantics beyond the schema, which lands at the baseline of 3.

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 concrete verb and resource ('Load a page ... return a JSON list of its notable elements') and enumerates what is returned, including the ready-to-use `selector` per element. The opening verb+resource pair makes it immediately distinguishable from sibling fetch tools such as fetch_html or browse_page.

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

Usage Guidelines5/5

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

Explicitly frames the tool as the 'discovery half of interactive scraping' and names the follow-up path: pass matching `steps` to `browse_page`. This gives an agent both when-to-use and the concrete alternative it complements, with no inference required.

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

list_pluginsList site pluginsA
Read-only

List ScrapeUnblocker's ready-made site plugins: scrapers for specific sites that return clean structured JSON (Amazon, Walmart, Target, eBay, Zillow, Redfin, Booking.com, Airbnb, Indeed, Glassdoor, Google Trends / Shopping / Maps, YouTube, Spotify, App Store, Google Play, Trustpilot, Yelp, Ahrefs, Semrush and 100+ more). Check here before scraping a known site with fetch_html - a plugin returns the data already parsed. Without arguments it lists every plugin with its parameters (* = required); category or search narrow the list; name returns one plugin's full parameter docs. Free - it calls nothing.

NameRequiredDescriptionDefault
nameNoA plugin name, for its full parameter docs.
searchNoOnly plugins whose name or description mentions this, e.g. 'zillow' or 'reviews'.
categoryNoOnly plugins in this category.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds genuinely new behavioral context: 'Free - it calls nothing', which tells the agent there is no network cost or side effect, plus the no-argument default behavior.

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?

Front-loaded with purpose and routing guidance before the long enumeration of supported sites. The site list is somewhat bloated but serves real discovery value for an agent judging coverage. Every sentence carries information.

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?

There is no output schema, so the description must convey returns; it does, describing the listing format, the required-parameter marker, and the single-plugin docs mode. Combined with full schema coverage, an agent has enough to call it correctly, though the handoff to run_plugin is not spelled out.

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 baseline is 3. The description goes further by explaining the interaction of the three optional params: no arguments lists all plugins, `category`/`search` narrow the list, and `name` returns one plugin's full parameter docs, plus the '* = required' convention used in the output.

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 ('List ScrapeUnblocker's ready-made site plugins') and immediately clarifies what a plugin is ('scrapers for specific sites that return clean structured JSON'). It also differentiates from the sibling fetch_html by noting a plugin returns data already parsed.

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 routes the agent: 'Check here before scraping a known site with fetch_html'. That is a clear when-to-use with a named alternative. It does not, however, mention run_plugin, which is the sibling that actually executes a discovered plugin, leaving the discovery-to-execution step implicit.

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

maps_place_detailsScrape Google Maps place detailsA
Read-only

Returns the full data for one Google Maps place as JSON: name, address (+ addressLines), phone, website, rating, categories, latitude/longitude, plusCode, hours + openNow, description, photo, cid, featureId, googleMapsUrl and relatedPlaces. Identify the place with place_id (ChIJ...), a Maps url, or a raw feature_id (0xHEX:0xHEX). Location-neutral - the feature id resolves the place directly; proxy_country defaults to a US proxy to clear Google's consent wall. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
glNoGoogle country, ISO-2 lowercase, e.g. 'us'. Default: us.
hlNoGoogle UI language, e.g. 'en', 'de', 'fr'. Default: en.
rawNoInclude the decoded place core array under `raw`. Default: false.
urlNoA Google Maps place URL (share link or /maps/place/... URL). The feature id or place_id is read out of it.
place_idNoA Google place_id, e.g. 'ChIJN1t_tDeuEmsRUsoyG83frY4'.
feature_idNoA Maps feature id '0xHEX:0xHEX', e.g. '0x47e66e2964e34e2d:0x8ddca9ee380ef7e0'. Fastest - no resolve step.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to US - an EU country hits Google's consent wall. Default: us.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover readOnly/openWorld/destructive, so the description is free to add operational context - the billing model ('billed like an API request', one unit per result page) and the consent-wall proxy behavior. These are genuinely beyond the annotations. The stray 'keep max_results modest' advice references a parameter this tool doesn't expose, which slightly muddies the picture.

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?

Front-loads the payoff (the field list) and is dense with no filler, so the long enumeration earns its place given there is no output schema. Minor redundancy in stating 'as JSON' then 'Returns JSON', and the max_results sentence refers to something outside this tool's schema.

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?

With no output schema, the description correctly compensates by enumerating return fields, and it covers identification methods, proxy/consent behavior, and billing. The only gap is the irrelevant max_results note, but nothing needed to call the tool correctly is missing.

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 gl, hl, raw, url, place_id, feature_id, and proxy_country. The description mostly restates the identification parameters (place_id 'ChIJ...', feature_id '0xHEX:0xHEX') rather than adding syntax or constraints beyond the schema, so the 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 action and resource: 'Returns the full data for one Google Maps place as JSON', and enumerates the returned fields. The 'one place' scope cleanly distinguishes it from the search-oriented siblings (google_local, google_search) without needing to name them.

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?

Explains the three ways to identify a place (place_id, url, feature_id) and notes feature_id is fastest, which is useful invocation context, but never states when to reach for this tool versus a sibling like google_local or when-not to use it. Usage is implied rather than routed.

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

run_pluginRun a site pluginA
Read-only

Run one ScrapeUnblocker site plugin and return its JSON - e.g. a Target or Walmart search, a Zillow listing search, Google Trends for some keywords, an app's App Store reviews. Find the plugin and its parameters with list_plugins first. params uses the parameter names list_plugins shows (snake_case); a list value is fine where a parameter takes several. Each run is billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
nameYesThe plugin to run, as list_plugins names it.
paramsNoThe plugin's parameters, e.g. {"query": "coffee maker", "max_results": 20}.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only, non-destructive, open-world behavior, but the description adds the pricing model that no structured field carries: 'Each run is billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.' It also states the return type (JSON) and how to discover parameter names, which meaningfully reduces misuse risk.

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?

Roughly sixty words in four sentences, front-loaded with the action and its output, then the prerequisite, then the param convention, then the cost warning. No sentence is filler; the billing note directly shapes a calling decision.

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?

Covers action, discovery path, param conventions, return type and cost for a meta-dispatch tool over 100+ enum values, which is substantial. Remaining gaps are failure modes (invalid plugin/param handling) and the sibling-overlap question; with no output schema, a brief note on response shape would also have helped.

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 baseline would be 3, and the description earns above that by explaining that `params` keys must match the snake_case names list_plugins reports and that list values are acceptable where a parameter takes several — a naming contract the schema's generic `additionalProperties` object cannot express. It stops short of describing what happens on unknown parameter names.

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 ('Run one ScrapeUnblocker site plugin and return its JSON') and immediately grounds it with four concrete examples spanning search, listings, trends and reviews. It also names its companion tool (list_plugins) so an agent can distinguish discovery from execution without opening a 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?

Gives a clear prerequisite workflow: 'Find the plugin and its parameters with list_plugins first.' That is explicit and actionable. However, it never resolves the obvious overlap with siblings that share plugin names (amazon_search, walmart_search, zillow_search, indeed_jobs, google_images) — an agent cannot tell from this text whether to call run_plugin(name="amazon_search") or the dedicated amazon_search tool.

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

search_and_readSearch Google and read the top resultsA
Read-only

Search Google through the ScrapeUnblocker API (https://docs.scrapeunblocker.com) and read the top results in one call: returns Google's AI Overview when there is one, each of the first results pages (default 3, max 5) as Markdown, and the other organic results as title, URL and snippet. Use it to answer a question from the live web. Billed as one request for the search plus one per page read.

NameRequiredDescriptionDefault
keywordYesThe search query.
resultsNoHow many top results to read (default 3, max 5).
proxy_countryNoOptional ISO country code to search from and read the pages through, e.g. 'US'.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint. The description adds real context beyond them: the response composition (AI Overview, per-page Markdown, organic title/URL/snippet) and the cost model (one request plus one per page read). It stops short of noting auth, rate limits, or failure modes.

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?

Three sentences, fully front-loaded with the action and the return shape before the usage hint and billing note. Every clause carries information; the docs link earns its place as a reference.

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?

With no output schema, the description does the work of describing returns (AI Overview, Markdown pages, snippets) and pairing that with the billing model. Combined with annotations covering the safety profile, nothing critical for correct invocation is missing.

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 coverage is 100%, so the schema already documents all three parameters, including min/max bounds. The description restates the `results` default and cap but adds nothing about `proxy_country` or query formatting, so baseline 3 is appropriate.

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 compound verb (search Google + read top results) and the exact resource, and crisply describes what it returns. The 'in one call' phrasing implicitly distinguishes it from the search-only and fetch-only siblings like google_search and fetch_markdown.

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?

"Use it to answer a question from the live web" gives a clear use context, and the compound nature of the tool implies when it beats a plain search. However, it never names an alternative such as google_search or fetch_markdown, nor states when not to use it, so it lacks explicit exclusions.

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

trustpilot_reviewsScrape Trustpilot company reviewsA
Read-only

Returns a company's Trustpilot profile and reviews as JSON. company is the reviewed domain (e.g. www.nike.com). The response has a company summary (trustScore, totalReviews, ratingDistribution 1-5, categories, contact) and a reviews array - each with rating, title, text, verified, author (name, country, review count), reply (the company's response) and dates. Page with page/pages (20 reviews per page), and filter with stars, sort (recency/relevancy), language, date, search, verified or replies. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
dateNoOnly reviews from a recent window: last30days, last3months, last6months, last12months. Omit for all time.
pageNo1-based page to start from (20 reviews/page). Default: 1.
sortNoOrdering: recency, relevancy. Default 'recency' (newest first). Default: recency.
pagesNoHow many consecutive pages to fetch from `page` onward (20 reviews each). Stops early at the last page. Default: 1.
starsNoOnly reviews with these star ratings (1, 2, 3, 4, 5). Repeatable, e.g. stars=4&stars=5.
searchNoKeyword to search within the company's reviews.
companyYesThe reviewed company's domain, e.g. 'www.nike.com' or 'nike.com'. A full site URL or a pasted Trustpilot review URL is also accepted.
repliesNoOnly reviews the company has replied to. Default: false.
languageNoReview language ISO-2 code (e.g. 'en', 'de') or 'all'. Default 'all'. Default: all.
verifiedNoOnly verified reviews (Trustpilot's verified badge). Default: false.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to a country chosen for the site.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld, so safety is covered. The description adds meaningful behavioral detail beyond that: the billing model ('billed like an API request'), that listing plugins bill per result page fetched, and how pagination interacts with cost. It does not mention rate limits or auth, but the cost/pagination behavior is a genuine value-add.

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

Conciseness3/5

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

Front-loaded with purpose and response shape, which is good, but the middle sentence is a dense run-on packing pagination and seven filters into one line. It is informative but not tightly structured, and the filter list partly duplicates the schema.

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?

With 11 params, no output schema, and no annotations for return shape, the description appropriately documents the response structure (company summary fields, reviews array fields) and pagination mechanics. The billing note covers a real concern for a scraping tool. It could mention rate limits or failure modes, but it is largely complete.

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 coverage is 100%, so parameters are already documented. The description reinforces the key semantics - page/pages with 20 reviews per page, stars/sort/language/date/search/verified/replies as filters - but adds little syntax beyond the schema. Baseline 3 is appropriate.

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 (scrape/returns) and resource (a company's Trustpilot profile and reviews) and names the required identifier. Clearly distinct from siblings like amazon_reviews, which target a different source.

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?

Implied usage is scraping Trustpilot reviews for a domain, but the description never says when to prefer this over alternatives or when not to use it. It does add the billing note about keeping max_results modest, which offers practical guidance on volume rather than tool selection.

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

youtube_transcriptGet a YouTube video transcriptA
Read-only

Returns a YouTube video's captions as JSON: timestamped segments (start, dur, text) and a joined text, plus availableLanguages, the picked language, isAutoGenerated, and the video's title, author and lengthSeconds. Pass a video id or any YouTube video URL; choose a caption language with lang. Ideal for LLM/RAG pipelines, subtitles and content analysis. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.

NameRequiredDescriptionDefault
langNoPreferred caption language code, e.g. 'en'. Omit for the default/first track. A prefix like 'en' matches 'en-US'.
videoYesVideo id (dQw4w9WgXcQ) or any YouTube video URL.
formatNoOutput shape: text, segments. 'segments' returns timestamps; 'text' returns only the joined plaintext. Default: segments.
proxy_countryNoProxy country the request is sent from (ISO-2, e.g. 'US', 'DE') for the watch page. Defaults to US.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the read-only/safe profile, and the description adds real behavioral context beyond them: the billing model ('Billed like an API request'), the output shape, and the language-prefix matching behavior. The closing clause 'listing plugins bill one unit per result page they fetch, so keep max_results modest' is a copy-paste artifact — this tool has no max_results parameter — which injects mild noise, keeping it from a 5.

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?

A single dense paragraph that front-loads the return contract, then input forms, then use cases, then cost — a sensible order with no wasted sentences. It loses a point for the trailing `max_results` billing clause, which belongs to a different tool family and should have been trimmed.

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?

With no output schema, the description does the heavy lifting by enumerating returned fields, and it discloses billing and language-fallback behavior for a 4-parameter read-only tool. What's missing is error/empty behavior (no captions available, region-blocked video) and whether cost scales with video length or segments, which matters given the stated per-request billing.

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 coverage is 100%, so all four parameters are already documented in the schema, establishing a baseline of 3. The description reinforces the `video` and `lang` semantics ('Pass a video id or any YouTube video URL', 'choose a caption language with lang') but adds no format or proxy_country guidance beyond what the schema already says.

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?

States a specific verb and resource upfront: 'Returns a YouTube video's captions as JSON', then enumerates the exact return fields (segments, text, availableLanguages, isAutoGenerated, title, author, lengthSeconds). The purpose is unmistakable, though it never explicitly contrasts itself with youtube_search or browse_page, so the sibling differentiation comes mostly from the tool name.

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?

It gives usage contexts ('Ideal for LLM/RAG pipelines, subtitles and content analysis') and tells the agent what input forms are accepted ('Pass a video id or any YouTube video URL'), plus how to pick a language. But there is no explicit when-to-use-this-vs-youtube_search guidance and no statement of what happens when a video has no caption tracks at all, which is the main failure branch an agent must anticipate.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.8.0
    • Changedrun_plugin1 field changed
      • changedInput schema / properties / name / enum
        Previous value: -[
        -  "skyscanner_flights",
        -  "skyscanner_hotels",
        -  "skyscanner_carhire",
        -  "booking_hotels",
        -  "booking_reviews",
        -  "airbnb_search",
        -  "airbnb_room",
        -  "airbnb_reviews",
        -  "tripadvisor_list",
        -  "tripadvisor_reviews",
        -  "google_local",
        -  "google_images",
        -  "maps_place_details",
        -  "google_trends",
        -  "google_shopping",
        -  "google_jobs",
        -  "bing_search",
        -  "bing_images",
        -  "duckduckgo_search",
        -  "yahoo_search",
        -  "yahoo_images",
        -  "brave_search",
        -  "brave_images",
        -  "amazon_product",
        -  "amazon_search",
        -  "amazon_bestsellers",
        -  "amazon_reviews",
        -  "walmart_search",
        -  "target_search",
        -  "bestbuy_search",
        -  "homedepot_search",
        -  "etsy_search",
        -  "shein_search",
        -  "zalando_search",
        -  "aliexpress_search",
        -  "alibaba_search",
        -  "alibaba_product",
        -  "alibaba1688_search",
        -  "alibaba1688_product",
        -  "tiktok_shop_search",
        -  "tiktok_shop_product",
        -  "tiktok_shop_store",
        -  "oopbuy_search",
        -  "ebay_search",
        -  "vinted_search",
        -  "leboncoin_search",
        -  "woolworths_search",
        -  "woolworths_category",
        -  "woolworths_specials",
        -  "woolworths_product",
        -  "coles_search",
        -  "coles_category",
        -  "coles_specials",
        -  "coles_product",
        -  "aldi_au_search",
        -  "aldi_au_category",
        -  "aldi_au_specials",
        -  "aldi_au_product",
        -  "zillow_search",
        -  "zillow_detail",
        -  "redfin_search",
        -  "redfin_detail",
        -  "rightmove_search",
        -  "idealista_search",
        -  "idealista_detail",
        -  "immobilienscout24_search",
        -  "mobile_de",
        -  "autoscout24_search",
        -  "indeed_jobs",
        -  "glassdoor_jobs",
        -  "glassdoor_reviews",
        -  "glassdoor_salaries",
        -  "naukri_jobs",
        -  "wellfound_jobs",
        -  "wellfound_job",
        -  "wellfound_company",
        -  "wellfound_company_search",
        -  "career_site_jobs",
        -  "trustpilot_reviews",
        -  "g2_reviews",
        -  "g2_search",
        -  "capterra_reviews",
        -  "capterra_search",
        -  "product_hunt",
        -  "crunchbase_company",
        -  "crunchbase_search",
        -  "yelp_search",
        -  "yelp_business",
        -  "yelp_reviews",
        -  "naver_place_search",
        -  "naver_place_details",
        -  "google_play_app",
        -  "google_play_search",
        -  "app_store_app",
        -  "app_store_search",
        -  "app_store_reviews",
        -  "youtube_channel",
        -  "youtube_search",
        -  "youtube_transcript",
        -  "spotify_search",
        -  "spotify_artist",
        -  "spotify_album",
        -  "spotify_track",
        -  "spotify_playlist",
        -  "similarweb_overview",
        -  "ahrefs",
        -  "semrush_overview",
        -  "meta_ad_library"
        -]New value: +[
        +  "skyscanner_flights",
        +  "skyscanner_hotels",
        +  "skyscanner_carhire",
        +  "booking_hotels",
        +  "booking_reviews",
        +  "airbnb_search",
        +  "airbnb_room",
        +  "airbnb_reviews",
        +  "tripadvisor_list",
        +  "tripadvisor_reviews",
        +  "google_local",
        +  "google_images",
        +  "maps_place_details",
        +  "google_trends",
        +  "google_shopping",
        +  "google_jobs",
        +  "google_hotels",
        +  "google_hotels_property",
        +  "google_news",
        +  "google_ads_transparency",
        +  "google_ads_transparency_advertisers",
        +  "bing_search",
        +  "bing_images",
        +  "duckduckgo_search",
        +  "yahoo_search",
        +  "yahoo_images",
        +  "brave_search",
        +  "brave_images",
        +  "amazon_product",
        +  "amazon_search",
        +  "amazon_bestsellers",
        +  "amazon_reviews",
        +  "walmart_search",
        +  "target_search",
        +  "bestbuy_search",
        +  "homedepot_search",
        +  "etsy_search",
        +  "shein_search",
        +  "zalando_search",
        +  "aliexpress_search",
        +  "alibaba_search",
        +  "alibaba_product",
        +  "alibaba1688_search",
        +  "alibaba1688_product",
        +  "tiktok_shop_search",
        +  "tiktok_shop_product",
        +  "tiktok_shop_store",
        +  "oopbuy_search",
        +  "smyths_inventory",
        +  "smyths_details",
        +  "smyths_search",
        +  "smyths_category",
        +  "wish_search",
        +  "wish_product",
        +  "shopee_search",
        +  "shopee_product",
        +  "taobao_search",
        +  "taobao_product",
        +  "ebay_search",
        +  "vinted_search",
        +  "leboncoin_search",
        +  "woolworths_search",
        +  "woolworths_category",
        +  "woolworths_specials",
        +  "woolworths_product",
        +  "coles_search",
        +  "coles_category",
        +  "coles_specials",
        +  "coles_product",
        +  "aldi_au_search",
        +  "aldi_au_category",
        +  "aldi_au_specials",
        +  "aldi_au_product",
        +  "zillow_search",
        +  "zillow_detail",
        +  "redfin_search",
        +  "redfin_detail",
        +  "rightmove_search",
        +  "idealista_search",
        +  "idealista_detail",
        +  "immobilienscout24_search",
        +  "mobile_de",
        +  "autoscout24_search",
        +  "indeed_jobs",
        +  "glassdoor_jobs",
        +  "glassdoor_reviews",
        +  "glassdoor_salaries",
        +  "naukri_jobs",
        +  "wellfound_jobs",
        +  "wellfound_job",
        +  "wellfound_company",
        +  "wellfound_company_search",
        +  "career_site_jobs",
        +  "upwork_jobs",
        +  "trustpilot_reviews",
        +  "g2_reviews",
        +  "g2_search",
        +  "capterra_reviews",
        +  "capterra_search",
        +  "product_hunt",
        +  "crunchbase_company",
        +  "crunchbase_search",
        +  "yelp_search",
        +  "yelp_business",
        +  "yelp_reviews",
        +  "naver_place_search",
        +  "naver_place_details",
        +  "google_play_app",
        +  "google_play_search",
        +  "app_store_app",
        +  "app_store_search",
        +  "app_store_reviews",
        +  "youtube_channel",
        +  "youtube_search",
        +  "youtube_transcript",
        +  "spotify_search",
        +  "spotify_artist",
        +  "spotify_album",
        +  "spotify_track",
        +  "spotify_playlist",
        +  "similarweb_overview",
        +  "ahrefs",
        +  "semrush_overview",
        +  "meta_ad_library"
        +]
    • Changedyoutube_transcript1 field changed
      • changedInput schema / properties / format / description
        Previous value: -"Output shape: segments, text. 'segments' returns timestamps; 'text' returns only the joined plaintext. Default: segments."New value: +"Output shape: text, segments. 'segments' returns timestamps; 'text' returns only the joined plaintext. Default: segments."
  2. 4 tool updatesv0.6.0
    • Addedbrowse_page
    • Changedfetch_html1 field changed
      • removedInput schema / properties / steps
        Removed 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"
        -}
    • Addedfetch_markdown
    • Addedsearch_and_read
  3. 17 tool updatesv0.4.0
    • Addedamazon_product
    • Addedamazon_reviews
    • Addedamazon_search
    • Addedbooking_hotels
    • Addedebay_search
    • Addedgoogle_images
    • Addedgoogle_local
    • Addedgoogle_shopping
    • Addedindeed_jobs
    • Addedlist_plugins
    • Addedmaps_place_details
    • Addedrun_plugin
    • Addedtrustpilot_reviews
    • Addedwalmart_search
    • Addedyoutube_search
    • Addedyoutube_transcript
    • Addedzillow_search
  4. 2 tool updatesv0.2.0
    • Changedfetch_html1 field changed
      • 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"
        +}
    • Addedlist_elements
  5. 3 tool updatesv0.1.4
    • Addedfetch_html
    • Addedfetch_parsed
    • Addedgoogle_search
  6. 3 tool updatesv0.1.3
    • Removedfetch_html
    • Removedfetch_parsed
    • Removedgoogle_search
  7. 3 tool updatesv0.1.2
    • First observedfetch_html
    • First observedfetch_parsed
    • First observedgoogle_search

TDQS

A4/5.0

Scored across 24 tools

Disambiguation3/5

Most tools target clearly distinct resources (Trustpilot reviews vs. Amazon reviews vs. Zillow listings), and the fetch family (fetch_html / fetch_markdown / fetch_parsed / browse_page) is carefully differentiated in the descriptions. However, run_plugin overlaps heavily with the ten dedicated site scrapers — an agent can run the Amazon or Zillow plugin through run_plugin instead of amazon_search / zillow_search — and google_search partly overlaps with search_and_read, so several genuine misselection paths exist.

Naming Consistency4/5

There is a readable two-family convention: generic utilities use verb_noun (fetch_html, list_plugins, run_plugin, browse_page) and site scrapers use domain_action (amazon_search, walmart_search, ebay_search, zillow_search, youtube_search). Deviations like google_shopping, google_local, google_images, maps_place_details and youtube_transcript (domain_noun rather than domain_action) are minor but break the pattern enough to cost a point.

Tool Count4/5

24 tools is on the heavy side, but each of the site scrapers maps to a genuinely different data schema and market, and splitting them keeps argument lists understandable versus one giant run_plugin call. The count is defensible for a multi-vertical scraping API, though a couple of the marketplace endpoints (amazon_search / amazon_product / amazon_reviews) could plausibly be consolidated.

Completeness4/5

The surface is broad and coherent for a scraping service: search (Google web/images/shopping/local), read modes (HTML, markdown, AI-parsed, interactive), plugin discovery/execution, and dedicated scrapers across retail, real estate, jobs, travel and reviews. Gaps remain — there is no Maps search tool to obtain a place_id for maps_place_details, and despite constant billing references there is no usage/credit-check tool.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to fetch bot-protected web pages, run structured Google searches, and check domain authority through UnblockingAPI's anti-detection engine and residential proxies.
    3
    12 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI agents with reliable web fetching capabilities, handling retries, caching, and anti-bot bypass automatically.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to fetch any web page (including those behind Cloudflare or CAPTCHAs), extract clean markdown, structured data, crawl sites, and map URLs via BypassAPI.
    MIT