Give Claude, Cursor, and Windsurf the ability to scrape any website, extract structured data, and take screenshots — with automatic anti-bot bypass.
Get Started Free → $1 free balance on signup — up to 5,000 scrapes.
--- ## One-Line Install ### Claude Code ```bash claude mcp add alterlab -- npx -y alterlab-mcp-server@latest ``` Then set your API key: `export ALTERLAB_API_KEY=sk_live_...` or add it to `.claude.json` (see [full setup](#install-in-claude-desktop--claude-code) below). ### Cursor ```bash # Add to .cursor/mcp.json — see full config below ``` ### Smithery ```bash npx -y @smithery/cli install alterlab-mcp-server --client claude ``` --- ## Why AlterLab Instead of WebFetch or Browser MCP? Claude's built-in `WebFetch` tool and open-source browser MCP servers fail on most real-world websites. They cannot bypass Cloudflare, render JavaScript SPAs, or extract structured data. AlterLab replaces broken fetch tools with **one MCP server** that actually works: | Capability | WebFetch / fetch() | Browser MCP | AlterLab MCP | |---|---|---|---| | Anti-bot bypass (Cloudflare, DataDome, Akamai) | No | Partial | Yes — automatic | | JavaScript rendering (React, Angular, Vue SPAs) | No | Yes (slow) | Yes — headless Chromium | | Structured data extraction (JSON, Schema.org) | No | No | Yes — built-in profiles | | Smart tier escalation (cheapest method first) | N/A | N/A | Yes — saves 60-80% | | Residential proxy rotation (195+ countries) | No | No | Yes | | Screenshot and PDF capture | No | Screenshot only | Yes — both | | OCR text extraction from images | No | No | Yes | | Cost per request | Free (but fails) | Free (but slow) | From $0.0002 | ## How Does AlterLab Web Scraping Work? AlterLab uses a multi-tier scraping architecture. It automatically selects the cheapest method capable of fetching each URL: 1. **Curl** ($0.0002/req) — Direct HTTP for static pages, RSS feeds, public APIs 2. **HTTP** ($0.0003/req) — TLS fingerprint rotation for moderately protected sites 3. **Stealth** ($0.002/req) — Browser impersonation for Cloudflare/DataDome-protected sites 4. **Light JS** ($0.0025/req) — Lightweight JS extraction from server-rendered HTML 5. **Browser** ($0.004/req) — Full headless Chromium for JavaScript-heavy SPAs Auto mode starts at Tier 1 and escalates only when blocked. Most websites resolve at Tiers 1-2, so **$1 gets you 1,000 to 5,000 scrapes** depending on the sites you target. --- ## Installation ### Install in Claude Desktop / Claude Code Add to your Claude config file (`~/.claude.json` for Claude Code, or Settings for Claude Desktop): ```json { "mcpServers": { "alterlab": { "command": "npx", "args": ["-y", "alterlab-mcp-server@latest"], "env": { "ALTERLAB_API_KEY": "sk_live_your_key_here" } } } } ``` ### Install in Cursor Add to `.cursor/mcp.json` in your project root: ```json { "mcpServers": { "alterlab": { "command": "npx", "args": ["-y", "alterlab-mcp-server@latest"], "env": { "ALTERLAB_API_KEY": "sk_live_your_key_here" } } } } ``` ### Install in Windsurf Add to Windsurf MCP settings (`~/.codeium/windsurf/mcp_config.json`): ```json { "mcpServers": { "alterlab": { "command": "npx", "args": ["-y", "alterlab-mcp-server@latest"], "env": { "ALTERLAB_API_KEY": "sk_live_your_key_here" } } } } ``` ### Install via Smithery ```bash npx -y @smithery/cli install alterlab-mcp-server --client claude ``` ### Get Your API Key 1. [Sign up free](https://app.alterlab.io/signin?redirect=/dashboard/keys&source=mcp&utm_source=mcp&utm_medium=integration&utm_campaign=mcp_server) — $1 free balance on signup 2. Go to **Dashboard → API Keys** and copy your key 3. Paste it into the `ALTERLAB_API_KEY` field in your MCP config --- ## Tools ### `alterlab_scrape` — Scrape Any Webpage Scrape a URL and return its content as markdown, text, HTML, or JSON. Automatically handles anti-bot protection with tier escalation. Returns markdown by default — optimized for LLM context windows. ``` "Scrape https://www.amazon.com/dp/B0BSHF7WHW and summarize the product" ``` | Parameter | Type | Default | Description | |---|---|---|---| | `url` | string | required | URL to scrape | | `mode` | `auto` \| `html` \| `js` \| `pdf` \| `ocr` | `auto` | Scraping mode | | `method` / `body` / `content_type` / `headers` | enum / string / enum / object | `GET` | POST support (1.5x cost) and custom target headers | | `formats` | `(text\|json\|json_v2\|html\|markdown\|rag\|content\|raw)[]` | `["markdown"]` | Output formats | | `extraction_schema` / `extraction_prompt` | object / string | — | LLM extraction (+$0.001) | | `extraction_profile` / `extraction_template` | enum | — | `auto`, `product`, `article`, `job_posting`, `faq`, `recipe`, `event`, `ecommerce_homepage`, `directory_listing` (`template` is a deprecated alias) | | `extraction_provider` / `extraction_model` | enum / string | — | BYOK LLM selection | | `evidence`, `promote_schema_org`, `filter_content` | boolean | — | Extraction behaviour | | `cache`, `cache_ttl`, `force_refresh` | boolean / number / boolean | — | Response caching (`cache_ttl` 60-86400) | | `render_js` | boolean \| `"auto"` | API default | Headless browser (forces Browser tier, $0.004) | | `use_proxy`, `proxy_country` | boolean, string | — | Premium proxy (+$0.0002) and geo-targeting | | `use_own_proxy`, `use_system_proxy`, `proxy_integration_id` | boolean, boolean, string | — | Bring-your-own-proxy selection | | `skip_tls_verification` | boolean | — | Omit (recommended) = verify, fall back on invalid certs; `true` skip, `false` require valid cert | | `wait_for`, `wait_until`, `wait_condition` | string | — | Selector / load-event waits | | `actions` | object[] (max 20) | — | Browser actions: `wait`, `wait_for`, `click`, `fill`, `press`, `scroll`, `infinite_scroll`, `screenshot`, `evaluate` | | `screenshot`, `generate_pdf`, `ocr` | boolean | — | Add-ons (+$0.0002 / +$0.0004 / +$0.001) | | `scroll_to_load`, `scroll_count`, `enable_scroll` | boolean / 1-10 / boolean | — | Lazy-load handling | | `include_iframes`, `flatten_shadow_dom`, `block_images`, `remove_cookie_banners` | boolean | — | Rendering options | | `section_filter` | object | — | Filter for `json_v2` sections | | `session_id`, `cookies`, `session_headers` | UUID, object, object | — | Authenticated scraping | | `sticky_session`, `sticky_session_ttl` | string, 300-7200 | — | Reuse cookies and exit IP across calls (paid plans) | | `location` | `{country, language}` | — | Geo-targeting | | `cost_controls` | object | — | `force_tier`, `max_tier`, `max_credits`, `prefer_cost`, `prefer_speed`, `fail_fast`, `time_budget` (`prefer_cost`, `prefer_speed`, `fail_fast` also accepted at top level) | | `embeddings` | object | — | `enabled`, `model`, `chunk_size`, `chunk_overlap` (+$0.001/page) | | `sync_policy` | `auto` \| `wait_until_deadline` | `auto` | Wait behaviour for long scrapes | | `timeout`, `max_response_bytes`, `include_raw_html` | number, number, boolean | `90`, 5 MB, `false` | Limits and raw output | | `estimate_first` | boolean | `false` | Run a free cost estimate first | Not exposed: `source` (dashboard tracking tag), `sync` (the tool is always synchronous), `webhook_url` (use `alterlab_batch`/`alterlab_crawl` webhooks). If a scrape outlives the ~85s synchronous window the tool returns a `job_id`; fetch it with `alterlab_get_job`. ### `alterlab_extract` — Extract Structured Data Extract structured fields from HTML, text or markdown content using pre-built profiles or custom JSON Schema. Returns clean JSON — ready for databases, spreadsheets, or downstream processing. ``` "Extract the product name, price, and rating from this Amazon page" ``` | Parameter | Type | Default | Description | |---|---|---|---| | `content` | string (max 500,000) | required | HTML, text or markdown you already have (this tool does not fetch a URL) | | `content_type` | `html` \| `text` \| `markdown` | `html` | Type of `content` | | `extraction_profile` / `extraction_template` | enum | — | Profile: `auto`, `product`, `article`, `job_posting`, `faq`, `recipe`, `event`, `ecommerce_homepage`, `directory_listing` | | `extraction_schema` | object | — | Custom JSON Schema for structured output | | `extraction_prompt` | string | — | Natural language extraction instructions | | `extraction_provider` / `extraction_model` | enum / string | — | BYOK LLM selection | | `formats` | enum[] | `["json"]` | Output formats | | `source_url`, `evidence` | string, boolean | — | Context URL and provenance | | `cache`, `cache_ttl` | `auto` \| `skip` \| `only`, number | `auto` | Extraction result cache | To scrape and extract in one step, use `alterlab_scrape` with `extraction_schema`. **Extraction profiles:** - **Product** — name, price, currency, rating, reviews, availability, images, description - **Article** — title, author, published date, body text, featured image - **Job Posting** — title, company, location, salary, description, requirements - **FAQ** — question-answer pairs - **Recipe** — ingredients, instructions, prep time, servings - **Event** — name, date, location, description, organizer ### `alterlab_screenshot` — Screenshot Any Page Take a full-page screenshot of any URL. Returns a PNG image directly in the conversation — no URLs to copy, no files to download. ``` "Take a screenshot of our landing page at https://alterlab.io" ``` | Parameter | Type | Default | Description | |---|---|---|---| | `url` | string | required | URL to screenshot | | `wait_for` | string | — | CSS selector to wait for before capture | | `wait_until` | enum | `networkidle` | `networkidle`, `domcontentloaded`, or `load` | | `timeout` | number | `90` | Timeout in seconds (1-300) | | `use_proxy`, `proxy_country` | boolean, string | — | Premium proxy and geo-targeting | | `session_id`, `cookies` | UUID, object | — | Screenshot pages behind a login | | `location` | `{country, language}` | — | Geo-targeting | ### `alterlab_estimate_cost` — Estimate Before You Scrape Check how much a scrape will cost before running it. Returns the predicted tier, cost per request, and confidence level. ``` "How much would it cost to scrape linkedin.com?" ``` | Parameter | Type | Default | Description | |---|---|---|---| | `url` | string | required | URL to estimate | | `mode` | enum | `auto` | Scraping mode | | `method` | `GET` \| `POST` | `GET` | POST costs 1.5x | | `render_js` | boolean \| `"auto"` | `false` | Include JS rendering cost | | `use_proxy`, `use_own_proxy` | boolean | `false` | Include proxy cost / BYOP discount | | `screenshot`, `generate_pdf`, `ocr` | boolean | — | Include add-on cost | ### `alterlab_get_job` — Fetch an Async Job Fetch the status and result of a scrape that returned a `job_id` (a scrape that outlived the synchronous wait window). Parameter: `job_id` (string, required). ### `alterlab_check_balance` — Check Your Credits Check your account balance, total deposited, and total spent. No parameters needed. ``` "Check my AlterLab balance" ``` ### `alterlab_list_sessions` — List Stored Sessions List all stored sessions for authenticated scraping. Sessions contain cookies for specific domains, allowing you to scrape content behind login walls. ``` "List my stored sessions" ``` ### `alterlab_create_session` — Create a Session Create a new stored session with cookies from a logged-in browser. The session is stored securely and can be reused across multiple scrape requests. ``` "Create an Amazon session with these cookies: session-id=abc123, session-token=xyz789" ``` | Parameter | Type | Default | Description | |---|---|---|---| | `name` | string | required | Human-readable name (e.g., "My Amazon Account") | | `domain` | string | required | Domain (e.g., "amazon.com") | | `consent` | boolean | required | Must be `true`: explicit GDPR consent to store the cookies (the API rejects creation otherwise) | | `cookies` | `Record