{"protocolVersion":"0.3.0","name":"AlterLab","description":"Web data extraction for agents: scrape, search, crawl, map, extract and estimate the cost of any public URL.","url":"https://mcp.alterlab.io/a2a","preferredTransport":"JSONRPC","supportedInterfaces":[{"url":"https://mcp.alterlab.io/a2a","protocolBinding":"JSONRPC","protocolVersion":"0.3.0"}],"version":"1.0.0","provider":{"organization":"AlterLab","url":"https://alterlab.io"},"documentationUrl":"https://alterlab.io/docs/integrations/mcp","capabilities":{"streaming":true,"pushNotifications":false,"stateTransitionHistory":false},"x-alterlab":{"reliabilityFeed":"https://alterlab.io/.well-known/alterlab-reliability.json","billing":{"chargedOnlyOnSuccess":true,"preCallQuoteTool":"alterlab_estimate_cost","failedRequestNextAction":"next_action"}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"OAuth 2.1 access token; authorization server discovery via https://mcp.alterlab.io/.well-known/oauth-protected-resource"},"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"}},"security":[{"bearer":[]},{"apiKey":[]}],"defaultInputModes":["application/json"],"defaultOutputModes":["text/plain","application/json"],"skills":[{"id":"alterlab_scrape","name":"Scrape","description":"Use when a normal fetch returns 403/429, a bot-protection challenge page, a CAPTCHA, or an empty JavaScript shell. Fetch any URL and return clean markdown, text, HTML, or JSON. Website challenges and JavaScript-heavy pages are handled automatically by a 5-tier system that starts at the cheapest tier that works and escalates only when needed. Returns markdown by default, ready for LLM context. Supports GET and POST via method, structured extraction via extraction_schema or extraction_prompt, and cost caps via cost_controls. Supports browser actions via actions, plus screenshot and generate_pdf; the response includes action_results, one entry per action with index, type, success, error, result (evaluate) and screenshot_url (screenshot actions).","tags":["alterlab","scrape"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_extract","name":"Extract","description":"Extract structured data (prices, product info, contact details, custom fields) as JSON from HTML, text or markdown you already hold. Use when you have content and need specific fields. Does not fetch a URL: to fetch and extract in one step, use alterlab_scrape with extraction_schema.","tags":["alterlab","extract"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_screenshot","name":"Screenshot","description":"Use when a normal fetch returns 403/429, a bot-protection challenge page, a CAPTCHA, or an empty JavaScript shell. Capture a full-page PNG screenshot of any URL, including anti-bot-protected sites, rendered in a real headless browser. Use wait_for to wait for an element and wait_until to control load timing. Pass actions (for example dismiss_consent or evaluate) to prepare the page; the screenshot is captured after they run and action_results is returned.","tags":["alterlab","screenshot"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_crawl","name":"Crawl","description":"Crawl a whole website and return the content of every page, for RAG, indexing or site-wide export. Use when you need many pages from one domain; for one URL use alterlab_scrape, for a URL list only use alterlab_map. Works on JavaScript-heavy and protected sites, with anti-bot handling on every page. Returns a crawl_id immediately; results are available from GET /api/v1/crawl/{crawl_id}.","tags":["alterlab","crawl"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_search","name":"Search","description":"Search the web and get structured results (URLs, titles, snippets). Use when you have a question or topic but no URL yet; follow up with alterlab_scrape to read a page, or set scrape_results=true to read every result in one call. Use domain to restrict to one site and time_range to filter by recency.","tags":["alterlab","search"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_map","name":"Map","description":"List every URL on a site via sitemap parsing and link extraction, without fetching page content. Use before alterlab_crawl or alterlab_batch to choose pages; to read the content itself use alterlab_crawl. Works on JavaScript-heavy and protected sites.","tags":["alterlab","map"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_batch_scrape","name":"Batch scrape","description":"Use when a normal fetch returns 403/429, a bot-protection challenge page, a CAPTCHA, or an empty JavaScript shell. Scrape 2-20 URLs in parallel and get all results back in one call, no polling required. Failed URLs report their error; successful ones return content. For 20+ URLs use alterlab_batch.","tags":["alterlab","batch","scrape"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_batch","name":"Batch","description":"Use when a normal fetch returns 403/429, a bot-protection challenge page, a CAPTCHA, or an empty JavaScript shell. Scrape large URL sets (up to 100 per call) asynchronously. Each URL can have its own mode, formats and extraction_schema. Returns a batch_id immediately; results are available from GET /api/v1/batch/{batch_id}.","tags":["alterlab","batch"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_estimate_cost","name":"Estimate cost","description":"Estimate the credit cost of scraping a URL before you run it. Use when cost matters or before a large job; no credits are charged. Returns the predicted tier, estimated cost and confidence. Full machine-readable price list: GET https://alterlab.io/api/v1/pricing (public, no auth).","tags":["alterlab","estimate","cost"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]},{"id":"alterlab_create_account","name":"Create account","description":"Create an AlterLab account and API key for your user. Use only when no ALTERLAB_API_KEY exists yet; skip it if a key is already configured. Signup is on behalf of your user (agent signup with human approval). Nothing is created until the human approves: they get an email (and you get a verification_url and user_code to show them) describing what the agent can do. After approval you receive a scoped API key labeled with agent_name, with a default daily spend cap, revocable from the dashboard. No extra free credit is granted; the usual welcome rules apply to the human's account. If the human has not approved yet, the result contains the signup_id, verification_url and user_code; poll GET /api/v1/agent/signup/{signup_id} or call this tool again.","tags":["alterlab","create","account"],"inputModes":["application/json"],"outputModes":["text/plain","application/json"]}]}