Oxylabs Web Scraper API (oxylabs.io) — MCP server for web scraping with rotating proxies, anti-bot handling, and structured data extraction
Three tools with complete input schemas and detailed descriptions. All tools follow verb_noun naming (oxylabs_scrape, oxylabs_google_search, oxylabs_amazon_product). Descriptions are 200-300 chars, well above the 10-char minimum and within the 194-char baseline average. All required parameters are documented. However, output schemas are completely undocumented, the code comments mention response envelope structure but no formal schema is exposed to the LLM. Error handling is present (oxylabsError function) with HTTP status-specific guidance, but lacks structured error classification (retryable vs fatal). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all three being read-only operations. Parameters lack enum constraints where applicable (e.g., domain in oxylabs_amazon_product could be an enum). No pagination support documented, though MAX_CONTENT_CHARS cap suggests awareness of response size limits.
Fetch structured Amazon product data by ASIN via the Oxylabs Web Scraper API — Amazon structured scraping: title, price, currency, rating, reviews count, stock/availability. Calls are synchronous proxying and can take 10-30 seconds. BYOK: _apiKey is "username:password" from the Oxylabs dashboard. Example: oxylabs_amazon_product({ asin: "B08N5WRWNW", domain: "com", _apiKey: "myuser:mypass" })
Run a Google search through the Oxylabs Web Scraper API and return structured organic results (position, title, url, description) — Google structured scraping with geo-targeting. Calls are synchronous proxying and can take 10-30 seconds. BYOK: _apiKey is "username:password" from the Oxylabs dashboard. Example: oxylabs_google_search({ query: "best espresso machine", geo_location: "United States", _apiKey: "myuser:mypass" })
Scrape any URL via the Oxylabs Web Scraper API (rotating proxies, anti-bot handling) and return the page HTML with its upstream status code. Set render_js:true to load the page in a headless browser first — use for JS-heavy sites. Calls are synchronous proxying and can take 10-30 seconds. BYOK: _apiKey is "username:password" from the Oxylabs dashboard. Example: oxylabs_scrape({ url: "https://example.com", _apiKey: "myuser:mypass" })
Output schemas completely undocumented. Code comments describe response envelope (results array with content, status_code, url) but no formal schema is exposed to LLMs. LLMs cannot plan downstream operations or extract fields reliably.
Missing tool annotations. All three tools are read-only (no state modification), but lack readOnlyHint annotation. This prevents agents from understanding safety properties and optimizing retry logic.
Parameter 'domain' in oxylabs_amazon_product accepts free-form string but should be an enum (com, co.uk, de, co.jp, etc.). Free-form invites hallucinated invalid domains.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
No pagination or result-limiting guidance in tool descriptions. Code caps HTML at 20K chars, but LLMs are not told this limit exists or how to handle truncation.
Error messages reference dashboard URLs and docs URLs, which is helpful, but error classification (retryable vs user-fixable vs fatal) is implicit in HTTP status codes. No structured guidance for agent recovery.