ScrapeUnblocker MCP Server
OfficialScrapeUnblocker MCP server lets MCP clients fetch and interact with anti-bot-protected websites and run structured site plugins using their own API key.
Fetch fully rendered HTML from any URL, bypassing Cloudflare, DataDome, PerimeterX, Akamai and Shape.
Convert pages to clean Markdown for cheap reading, quoting or summarising.
Run real-browser interaction steps (wait, click, type, select, press key, scroll) and capture the resulting HTML.
Discover page elements and ready-to-use selectors with
list_elements, then act withbrowse_page.Return AI-parsed structured JSON from product, listing or article pages with
fetch_parsed.Run Google searches, and use
search_and_readto get Google's AI Overview, top result pages as Markdown, and other snippets in one call.List and run 100+ site plugins that return structured JSON for e-commerce, real estate, jobs, reviews, travel, apps, SEO/ads, video/music, local/maps and more.
Use direct tools for popular plugins such as Amazon, Walmart, eBay, Google Shopping/Local/Maps/Images, YouTube, Zillow, Indeed, Trustpilot and Booking.com.
Target markets with optional proxy-country parameters and render-wait controls.
Bypasses Akamai's anti-bot protection to fetch fully rendered HTML of web pages.
Bypasses Cloudflare's anti-bot protection to fetch fully rendered HTML of web pages.
Runs Google searches and returns organic results as JSON.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ScrapeUnblocker MCP ServerGet the HTML of https://example.com which is blocked by Cloudflare."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 the fully rendered HTML of a URL. |
| Run interactive browser |
| List a page's notable elements with a ready-to-use selector for each (selector discovery). |
| Fetch a page and return AI-parsed structured JSON. |
| Run a Google search and return organic results as JSON. |
| 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 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 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 one site plugin and return its structured JSON. |
| The most-used site plugins as tools of their own, each with its parameters in the tool schema - one call, no |
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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@scrapeunblockerSee ScrapeUnblocker/claude-code-plugin.
To add the bare server instead:
claude mcp add scrapeunblocker \
--env SCRAPEUNBLOCKER_KEY=your_api_key_here \
-- npx -y scrapeunblocker-mcpClaude 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-mcpExample 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 serverLicense
MIT
Available Tools
24 toolsamazon_productScrape an Amazon product pageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full 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. | |
| asin | No | Amazon product id (10-char ASIN, e.g. 'B0BSHF7WHW'; books use their ISBN-10). Give either `asin` (with `marketplace`) or a full `url`. | |
| marketplace | No | Regional 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_country | No | Proxy 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
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.
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.
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.
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.
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.
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 pageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full 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. | |
| asin | No | Amazon product id (10-char ASIN, e.g. 'B07PXGQC1Q'; books use their ISBN-10). Give either `asin` (with `marketplace`) or a product `url`. | |
| marketplace | No | Regional 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_country | No | Proxy 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
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.
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.
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.
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.
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.
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.
amazon_searchScrape Amazon search listingsARead-only
Searches any regional Amazon marketplace for keyword and returns the result cards as JSON: asin, title, price + currency, listPrice, rating, reviewCount, a clean product url, image, and the sponsored / prime flags. Filter with min_price / max_price, order with sort (featured, price_asc, price_desc, avg_review, newest), and page with page. Fetch each result's full detail (all fields above plus features and images) through POST /marketplace/amazon-product. Some cards show no price on the search page (Amazon defers it, or the item has buying options); those return price: null and are kept in the list rather than dropped. proxy_country defaults to the marketplace's home country so prices are in the expected currency. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Default: 1. | |
| sort | No | Result order: featured, price_asc, price_desc, avg_review, newest. Default 'featured'. Default: featured. | |
| keyword | Yes | Search phrase, e.g. 'wireless headphones' or a brand + model. | |
| max_price | No | Highest price to include, in the marketplace's currency. | |
| min_price | No | Lowest price to include, in the marketplace's currency. | |
| marketplace | No | Regional Amazon site to search. 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_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to the marketplace's home country so prices come back in the expected currency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations it discloses non-obvious behavior: price-less cards return `price: null` and are retained rather than dropped, `proxy_country` defaults to the marketplace home country to keep currency consistent, and notably the billing model (one unit per result page, keep max_results modest). That cost/rate context is exactly what annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return shape in the first sentence, then layers filtering, pagination, edge-case price behavior and billing, with no filler sentences. It is a dense single paragraph, but each clause adds information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 full burden of describing returns and does so field-by-field, plus it covers the null-price edge case, default currency behavior and cost. Nothing material is missing for a 7-parameter search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, and the description largely restates the sort enum and the proxy/marketplace currency defaults rather than adding new syntax or constraints. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Searches) plus resource (any regional Amazon marketplace listings), and enumerates the returned card fields, so an agent knows exactly what it gets. It also distinguishes itself from the sibling amazon_product by handing off full-detail fetches to that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes detail lookups to `POST /marketplace/amazon-product`, which is genuine sibling differentiation against amazon_product. It also spells out how to filter, order and page, though it never says when to prefer this over ebay_search, walmart_search or google_shopping for product queries.
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 hotelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | No | Number of rooms. | |
| adults | No | Number of adults. | |
| checkin | No | Check-in YYYY-MM-DD (needed for prices). | |
| checkout | No | Check-out YYYY-MM-DD. | |
| children | No | Number of children. | |
| currency | No | Price currency: USD, EUR, GBP, AUD, CAD, CHF, JPY, CNY, INR, BRL, MXN, PLN, SEK, NOK, DKK, AED, SGD, ZAR, TRY, RUB. Default: USD. | |
| location | Yes | City or place to search, e.g. 'Austin' or 'Paris'. | |
| max_results | No | How many properties to collect across pages. Default: 25. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). |
TDQS
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.
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.
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.
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.
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.
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 itADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The absolute URL to open (http/https). | |
| steps | Yes | Ordered browser actions to run in a real browser after the page loads, before the HTML is captured. Use `list_elements` first to find selectors. Runs once (not idempotent). | |
| wait_value | No | The CSS selector or JS expression paired with wait_method. | |
| wait_method | No | Optional render-wait before the steps run: 'css' waits for a selector, 'js' waits for a JS expression to be truthy. | |
| proxy_country | No | Optional ISO 3166-1 alpha-2 country code to route through, e.g. 'US', 'GB', 'DE'. | |
| sleep_seconds | No | Extra seconds to wait after load. | |
| method_timeout_seconds | No | Cap in seconds for the render-wait method. |
TDQS
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.
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.
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.
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.
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.
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.
ebay_searchScrape eBay search listingsARead-only
Searches any regional eBay marketplace for keyword and returns the listings as JSON: title, price + currency, condition (with a normalised conditionCode), seller (username, feedback percentage and score), shippingCost, sold, watchers, bids, image and a clean item url. Filter with condition, listing_type, min_price/max_price, free_shipping, seller or category, sort with sort, and page with page/page_size (60, 120 or 240 per page). Set marketplace to search a specific site - prices, currency and availability differ between ebay.com, ebay.de, ebay.co.uk and the rest. When eBay finds no exact match it still serves a full page of its own loosely-related suggestions. That case is reported honestly: exactMatches is false and a notice explains it, so those listings are never mistaken for real matches. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Default: 1. | |
| sort | No | Ordering: best_match, newly_listed, ending_soon, price_asc, price_desc. Default 'best_match'. Default: best_match. | |
| seller | No | Restrict the search to one seller's username. | |
| keyword | Yes | Search phrase, e.g. 'iphone 13' or a part number like '1K0953519A'. | |
| category | No | eBay category id to search inside, e.g. '131090' for vehicle parts and accessories. | |
| condition | No | Item condition filter: new, open_box, refurbished, used, for_parts. Omit for every condition. | |
| max_price | No | Highest price to include, in the marketplace's currency. | |
| min_price | No | Lowest price to include, in the marketplace's currency. | |
| page_size | No | Listings per page - eBay's own page sizes: 60, 120, 240. Default: 60. | |
| marketplace | No | Regional eBay site to search. Prices, currency and availability differ per marketplace. One of: ebay.com, ebay.co.uk, ebay.de, ebay.fr, ebay.it, ebay.es, ebay.nl, ebay.pl, ebay.at, ebay.ch, ebay.be, ebay.ie, ebay.ca, ebay.com.au, ebay.in, ebay.ph, ebay.com.sg, ebay.com.my, ebay.com.hk. Default: ebay.com. | |
| listing_type | No | Listing format: all, buy_it_now, auction. Default 'all'. Default: all. | |
| free_shipping | No | Only listings eBay marks as free delivery. Default: false. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to a country chosen for the marketplace. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, openWorld, non-destructive), yet the description adds substantial extra behavior: the exactMatches=false plus notice fallback for loosely-related suggestions, and the billing model (per-result-page units, keep max_results modest). This is real context beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then filters, then the exactMatches caveat and billing. Dense but every sentence carries information; the enumeration of return fields is slightly list-heavy but justified since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema, the description adequately covers both input groups and the response shape, and it flags the non-obvious eBay fallback behavior that would otherwise mislead an agent. Nothing essential to correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 13 parameters including defaults and the marketplace enum list. The description restates the filter/sort/paging groups but adds no syntax or format detail beyond the schema, so the baseline 3 applies. It also references a 'max_results' knob that does not exist in the schema, a minor inconsistency.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (searches) and resource (eBay listings), names the scope (any regional marketplace), and enumerates the exact return fields including normalised conditionCode. An agent can distinguish this from amazon_search or walmart_search purely from the definition since it is explicitly eBay-scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for marketplace selection ('prices, currency and availability differ between ebay.com, ebay.de, ebay.co.uk') and how filtering/sorting/paging work. It never states when NOT to use this tool or points to a sibling alternative, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_htmlFetch page HTMLARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The absolute URL to fetch (http/https). | |
| wait_value | No | The CSS selector or JS expression paired with wait_method (e.g. '#price' or 'document.readyState==="complete"'). | |
| wait_method | No | Optional render-wait strategy: 'css' waits for a selector, 'js' waits for a JS expression to be truthy. | |
| proxy_country | No | Optional ISO 3166-1 alpha-2 country code to route through, e.g. 'US', 'GB', 'DE'. | |
| sleep_seconds | No | Extra seconds to wait after load before capturing the HTML. | |
| method_timeout_seconds | No | Cap in seconds for the render-wait method. |
TDQS
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.
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.
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.
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.
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.
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 MarkdownARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The absolute URL to read (http/https). | |
| wait_value | No | The selector/expression paired with wait_method. | |
| wait_method | No | Optional render-wait: 'css' selector or 'js' expression. | |
| proxy_country | No | Optional ISO country code to route through, e.g. 'US'. | |
| sleep_seconds | No | Extra seconds to wait after load. | |
| main_content_only | No | Drop navigation, page header, footer and sidebars (default true). False keeps the whole page. |
TDQS
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.
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.
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.
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.
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.
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 dataARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The absolute URL to fetch and parse. | |
| rules_hint | No | Optional natural-language hint about what to extract, to guide parsing. | |
| proxy_country | No | Optional ISO country code to route through, e.g. 'US'. |
TDQS
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.
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.
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.
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.
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.
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 resultsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Image search term, e.g. 'eiffel tower'. | |
| gl | No | Optional 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. | |
| pages | No | How 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_to | No | Only images Google found on or before this date (YYYY-MM-DD). Works alone or with `date_from`; cannot be combined with `time_range`. | |
| date_from | No | Only images Google found on or after this date (YYYY-MM-DD). Works alone or with `date_to`; cannot be combined with `time_range`. | |
| time_range | No | Only 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_results | No | Optional cap on the number of results returned (default: all results of the fetched pages). | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Image results are market-specific. |
TDQS
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.
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.
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.
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.
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.
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 listingsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| gl | No | Google country of search, ISO-2 lowercase, e.g. 'us', 'de'. | |
| hl | No | Google UI language, e.g. 'en', 'de', 'fr'. Default: en. | |
| keyword | Yes | Search phrase, e.g. 'coffee shops in chicago' or 'plumbers near SW1A'. | |
| proxy_country | No | Proxy 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
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.
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.
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.
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.
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.
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_searchGoogle search resultsARead-only
Run a Google search through ScrapeUnblocker and return the organic results as structured JSON. Use this to discover URLs before fetching them.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | The search query. | |
| proxy_country | No | Optional ISO country code to search from, e.g. 'US'. | |
| pages_to_check | No | How many result pages to collect (default 1). |
TDQS
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 useful scope information that results are organic-only and returned as structured JSON via a third-party unblocker service, but says nothing about rate limits, blocking, cost, or failure modes for that external dependency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core action and output format front-loaded and the usage hint second. Nothing is repeated from the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter read-only search with full schema coverage and annotations, this is nearly complete; the only gap is that with no output schema the description does not sketch what the structured JSON contains beyond 'organic results'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so keyword, proxy_country and pages_to_check are already fully documented in the schema. The description adds no parameter-level meaning beyond hinting that results are organic; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run a Google search) plus the mechanism (ScrapeUnblocker) and output shape (organic results as structured JSON). It positions itself against the fetch_* siblings by framing itself as a URL-discovery step, but does not distinguish itself from search_and_read or the other search-family siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to discover URLs before fetching them' gives a concrete when-to-use and implicitly chains to the fetch tools. There are no explicit exclusions, so an agent still has to infer whether to pick this over search_and_read or google_shopping.
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 listingsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Product search term, e.g. 'wireless headphones'. | |
| gl | No | Market of search, ISO-2, e.g. 'us', 'de'. Sets prices/merchants. Default: us. | |
| max_price | No | Maximum price filter (whole units, gl currency). | |
| min_price | No | Minimum price filter (whole units, gl currency). | |
| max_results | No | How many products to return (v1: first page). Default: 60. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Prices/merchants are market-specific. |
TDQS
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.
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.
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.
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.
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.
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 listingsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Max posting age in days: 1, 3, 7, 14. | |
| sort | No | Ordering: relevance, date. Default: relevance. | |
| query | Yes | What to search, e.g. 'software engineer' or 'nurse'. | |
| start | No | 0-based result offset to start from. Default: 0. | |
| radius | No | Search radius in miles/km around the location. | |
| remote | No | Only remote jobs. Default: false. | |
| country | No | Indeed 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_type | No | Job type: fulltime, parttime, contract, internship, temporary. | |
| location | No | Where, e.g. 'Austin, TX' or 'London'. | |
| max_results | No | How many jobs to collect across pages. Default: 30. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to the country's site. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The absolute URL whose elements you want to list. | |
| proxy_country | No | Optional ISO country code to route through, e.g. 'US'. |
TDQS
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.
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.
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.
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.
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.
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 pluginsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A plugin name, for its full parameter docs. | |
| search | No | Only plugins whose name or description mentions this, e.g. 'zillow' or 'reviews'. | |
| category | No | Only plugins in this category. |
TDQS
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.
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.
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.
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.
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.
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 detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| gl | No | Google country, ISO-2 lowercase, e.g. 'us'. Default: us. | |
| hl | No | Google UI language, e.g. 'en', 'de', 'fr'. Default: en. | |
| raw | No | Include the decoded place core array under `raw`. Default: false. | |
| url | No | A Google Maps place URL (share link or /maps/place/... URL). The feature id or place_id is read out of it. | |
| place_id | No | A Google place_id, e.g. 'ChIJN1t_tDeuEmsRUsoyG83frY4'. | |
| feature_id | No | A Maps feature id '0xHEX:0xHEX', e.g. '0x47e66e2964e34e2d:0x8ddca9ee380ef7e0'. Fastest - no resolve step. | |
| proxy_country | No | Proxy 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
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.
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.
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.
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.
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.
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 pluginARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The plugin to run, as list_plugins names it. | |
| params | No | The plugin's parameters, e.g. {"query": "coffee maker", "max_results": 20}. |
TDQS
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.
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.
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.
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.
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.
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 resultsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | The search query. | |
| results | No | How many top results to read (default 3, max 5). | |
| proxy_country | No | Optional ISO country code to search from and read the pages through, e.g. 'US'. |
TDQS
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.
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.
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.
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.
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.
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 reviewsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Only reviews from a recent window: last30days, last3months, last6months, last12months. Omit for all time. | |
| page | No | 1-based page to start from (20 reviews/page). Default: 1. | |
| sort | No | Ordering: recency, relevancy. Default 'recency' (newest first). Default: recency. | |
| pages | No | How many consecutive pages to fetch from `page` onward (20 reviews each). Stops early at the last page. Default: 1. | |
| stars | No | Only reviews with these star ratings (1, 2, 3, 4, 5). Repeatable, e.g. stars=4&stars=5. | |
| search | No | Keyword to search within the company's reviews. | |
| company | Yes | The 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. | |
| replies | No | Only reviews the company has replied to. Default: false. | |
| language | No | Review language ISO-2 code (e.g. 'en', 'de') or 'all'. Default 'all'. Default: all. | |
| verified | No | Only verified reviews (Trustpilot's verified badge). Default: false. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to a country chosen for the site. |
TDQS
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.
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.
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.
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.
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.
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.
walmart_searchScrape Walmart product searchARead-only
Searches Walmart for query and returns the products as JSON: name, price and wasPrice, rating, reviewCount, brand, seller, availability, image and a product url. Sort with sort, filter with min_price/max_price, and collect up to max_results across pages. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page to start from (~40 per page). Default: 1. | |
| sort | No | Ordering: best_match, price_low, price_high, best_seller, rating_high, new. Default: best_match. | |
| query | Yes | What to search, e.g. 'laptop' or 'coffee maker'. | |
| max_price | No | Highest price to include (USD). | |
| min_price | No | Lowest price to include (USD). | |
| max_results | No | How many products to collect across pages. Default: 40. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to US. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description adds genuinely non-obvious behavior: API-style billing where listing plugins charge one unit per result page fetched, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the verb and resource, then return shape, then controls, then cost. No filler and nothing repeated unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by enumerating the returned product fields and the JSON format. Combined with full schema coverage of all 7 params and the billing note, an agent has what it needs; only cross-sibling selection guidance is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with per-parameter descriptions including defaults and enum-like sort values, so the schema carries the burden. The description only restates sort/min_price/max_price/max_results at a high level and adds no format or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Searches Walmart for `query`') and enumerates the exact return fields (name, price, wasPrice, rating, reviewCount, brand, seller, availability, image, url), which immediately distinguishes it from amazon_search/ebay_search/google_shopping siblings on the same platform-search axis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: sort with `sort`, narrow with `min_price`/`max_price`, and gather up to `max_results` across pages, plus a cost-driven caveat to 'keep max_results modest'. It does not, however, say when to prefer this over the sibling marketplace searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
youtube_searchSearch YouTubeARead-only
Searches YouTube for query and returns the results as JSON. For each video: videoId, title, url, channel (name/id/url), publishedText, viewCount (+ text), lengthSeconds (+ text), thumbnails, descriptionSnippet, badges, verified and isLive. Filter with type (video / channel / playlist / all) and sort (relevance / date / views / rating), and collect up to max_results across pages. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordering: relevance, rating, date, views. Default: relevance. | |
| type | No | Result type: video, channel, playlist, movie, all. Default: video. | |
| query | Yes | Search terms. | |
| max_results | No | How many results to collect across pages (~20 per page). Default: 20. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to US. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/openWorld/non-destructive, so the bar is lower, and the description adds real value beyond them: it discloses billing behavior ('billed like an API request; one unit per result page') and advises keeping max_results modest. It stops short of stating pagination mechanics or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then filtering and billing. The field enumeration is long but each item is informational; the billing sentence earns its place. Minor verbosity in the field list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description admirably enumerates the returned fields, and it covers filtering, pagination, and cost. The only notable gap is the unexplained `proxy_country` parameter, which an agent cannot infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description restates the `type` and `sort` option sets and notes pagination behavior for `max_results`, but adds no syntax or semantics beyond the schema and says nothing about `proxy_country`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Searches YouTube for `query` and returns the results as JSON.' It also enumerates the returned fields, clearly separating it from the sibling youtube_transcript (search results vs. transcript).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it explains how to filter with `type`/`sort` and how to control volume with `max_results` and a billing caution. There is no explicit guidance on when to pick this over siblings like youtube_transcript or google_search, nor any exclusions.
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 transcriptARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Preferred caption language code, e.g. 'en'. Omit for the default/first track. A prefix like 'en' matches 'en-US'. | |
| video | Yes | Video id (dQw4w9WgXcQ) or any YouTube video URL. | |
| format | No | Output shape: text, segments. 'segments' returns timestamps; 'text' returns only the joined plaintext. Default: segments. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE') for the watch page. Defaults to US. |
TDQS
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.
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.
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.
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.
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.
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.
zillow_searchScrape Zillow real-estate listingsARead-only
Searches Zillow for location (a city/state or ZIP) and returns the listings as JSON: price, beds, baths, area, address, homeType, zestimate, rentZestimate, daysOnZillow, coordinates, broker and a clean url. Filter with status (for_sale / for_rent / sold), min_price/max_price, beds, baths and home_type, sort with sort, and collect up to max_results across pages. Rental results can include apartment buildings (isBuilding: true): they have no zpid and carry lotId, buildingName, a rent range (price to maxPrice), units and availableUnits instead. Returns JSON. Billed like an API request; listing plugins bill one unit per result page they fetch, so keep max_results modest.
| Name | Required | Description | Default |
|---|---|---|---|
| beds | No | Minimum bedrooms. | |
| page | No | 1-based results page to start from. Default: 1. | |
| sort | No | Ordering: newest, price_asc, price_desc, relevant, beds, sqft, lot. Default: newest. | |
| baths | No | Minimum bathrooms. | |
| status | No | Listing status: for_sale, for_rent, sold. Default: for_sale. | |
| location | Yes | City/state or ZIP to search, e.g. 'Austin, TX' or '78704'. | |
| home_type | No | Property type filter: houses, condos, townhomes, multi_family, apartments, manufactured, lots_land. Omit for all. | |
| max_price | No | Maximum price (or monthly rent). | |
| min_price | No | Minimum price (or monthly rent). | |
| max_results | No | How many listings to collect across pages (~41 per page). Default: 41. | |
| proxy_country | No | Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Defaults to US. |
TDQS
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 useful behavior: the per-page billing model, the advice to keep max_results modest, and a detailed handling of apartment-building rental results (isBuilding, no zpid, lotId, rent range, units/availableUnits). That is well beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return shape before moving to filters, sorting and the rental edge case, with no filler sentences. It is dense and slightly long, but each clause (billing, building results) carries information an agent would otherwise miss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 burden of describing return fields and does so thoroughly, including the anomalous isBuilding result shape. Combined with the billing note, an agent has everything needed to call this correctly and cheaply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema; the description mostly restates the same filter names without new syntax or format detail. Baseline 3 is appropriate for a fully-covered schema where the description only echoes the fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource (searches Zillow for a location) and enumerates the exact fields returned, so an agent knows precisely what it gets back. It is the only Zillow-family tool among the siblings, and the listing/scraping scope is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear in-tool guidance: which parameters filter (status, price range, beds/baths, home_type), which sorts, and how max_results collects across pages. It does not, however, say when to prefer this over neighbouring tools such as booking_hotels or google_search, so the routing guidance stops short of exclusions.
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.
2 tool updates
v0.8.0- Changed
run_plugin1 field changed- changed
Input schema / properties / name / enumPrevious 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" +]
- Changed
youtube_transcript1 field changed- changed
Input schema / properties / format / descriptionPrevious 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."
4 tool updates
v0.6.0- Added
browse_page - Changed
fetch_html1 field changed- removed
Input schema / properties / stepsRemoved 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" -}
- Added
fetch_markdown - Added
search_and_read
17 tool updates
v0.4.0- Added
amazon_product - Added
amazon_reviews - Added
amazon_search - Added
booking_hotels - Added
ebay_search - Added
google_images - Added
google_local - Added
google_shopping - Added
indeed_jobs - Added
list_plugins - Added
maps_place_details - Added
run_plugin - Added
trustpilot_reviews - Added
walmart_search - Added
youtube_search - Added
youtube_transcript - Added
zillow_search
2 tool updates
v0.2.0- Changed
fetch_html1 field changed- added
Input schema / properties / stepsAdded 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" +}
- Added
list_elements
3 tool updates
v0.1.4- Added
fetch_html - Added
fetch_parsed - Added
google_search
3 tool updates
v0.1.3- Removed
fetch_html - Removed
fetch_parsed - Removed
google_search
3 tool updates
v0.1.2- First observed
fetch_html - First observed
fetch_parsed - First observed
google_search
TDQS
Scored across 24 tools
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.
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.
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.
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
Related MCP Connectors
Fetch bot-protected and JavaScript-heavy pages for AI agents, or parse them to JSON with templates.
Fetch and extract data from any public web page, even JS-rendered or anti-bot protected
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Fetch any page's HTML or AI-parsed JSON, Google results, or 100+ site plugins via ScrapeUnblocker
Related MCP Servers
AlicenseAqualityBmaintenanceEnables 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.312 npm2MIT- AlicenseNot gradedqualityDmaintenanceProvides AI agents with reliable web fetching capabilities, handling retries, caching, and anti-bot bypass automatically.MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search the web, read and extract content from webpages, fetch JSON from REST APIs, and collect links while bypassing anti-bot protections.26 npmISC