Web Scraping MCP Server
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
A hosted Model Context Protocol (MCP) server that gives Claude, Cursor, Windsurf and any other MCP client one read-only tool for fetching any public web page. It goes out through managed proxies, renders JavaScript when a page needs it, and returns clean markdown, plain text, raw HTML or structured JSON, with nothing to host and no browser in your stack.
This is the fallback for sites with no dedicated API. When a site does have one in the HasData catalogue, that tool returns parsed fields and this one returns a page.
**1,000 free credits every month, no card required.** A plain fetch costs 1 credit, so the free tier covers 1,000 of them.
- Prompts and resources
Contents
- What you need
- Quick start
- Example prompts
- Tools
- Output formats
- Errors and failure paths
- Pricing, free tier and limits
- How it compares
- FAQ
- HasData links
- Development
- Contributing
- License
What you need
An MCP client and a HasData API key from the dashboard, free to create with no card. This is a remote server, so the simplest path is a URL and an x-api-key header, with no container to run. A client that only speaks stdio reaches it through a thin launcher, published as @hasdata/web-scraping-mcp on npm and hasdata-web-scraping-mcp on PyPI, shown below.
Quick start
The server URL is the same for every client. We run it hands-on in Claude Code and Claude Desktop. The other blocks follow each client's own documented format for a remote server.
| Field | Value |
| :--- | :--- |
| URL | https://mcp.hasdata.com/mcp?apis=web_scraping |
| Transport | HTTP, streamable |
| Auth header | x-api-key: HASDATA_API_KEY |
Clients with OAuth support can add the same URL as a connector and sign in without putting a key in a config file.
Claude Code
Claude Desktop
Settings, then Connectors, then Add custom connector, then paste https://mcp.hasdata.com/mcp?apis=web_scraping and sign in.
For the config-file route, Claude Desktop loads only local (stdio) servers, so it reaches a remote server through a stdio launcher. The @hasdata/web-scraping-mcp package is that launcher, and it reads the key from the environment. Add this to claude_desktop_config.json:
For Python instead of Node, swap the launcher for the PyPI package, which uvx runs without a manual install:
Cursor
~/.cursor/mcp.json for every project, or .cursor/mcp.json for one:
Windsurf
~/.codeium/windsurf/mcp_config.json. Windsurf calls the field serverUrl, not url:
VS Code
.vscode/mcp.json in the workspace:
Example prompts
- Fetch this page as markdown and summarise it.
- Read this documentation page and pull out every code block.
- Get the titles and links from the front page of this site as JSON.
- This page loads its content with JavaScript, so render it and wait for the results list before reading.
- Fetch this page through a German residential proxy and tell me whether the pricing differs.
- Take a screenshot of this page.
One call answers each of these. What changes between them is how much of the browser you asked for, and that is what the call costs.
Tools
| Tool | What it returns |
| --- | --- |
| hasdata_web_scraping_web_scraping_scrapeWebPage | HTML, text, markdown, and/or JSON along with status code, extracted emails and links, CSS-selector extractions, and AI-structured fields per schema. 1 credit a call for a plain fetch, 10 with JS rendering |
One tool. The cost depends on what you turn on, and the table is in Pricing.
Scrape web page
hasdata_web_scraping_web_scraping_scrapeWebPage
Fetch one URL.
| Parameter | Type | Required | Notes |
| :--- | :--- | :--- | :--- |
| url | string | yes | The page to fetch |
| outputFormat | array | | Any of markdown, text, html, json. See Output formats |
| jsRendering | boolean | | Render the page in a browser. On by default, and the main cost lever |
| proxyType | string | | datacenter or residential |
| proxyCountry | string | | US, UK, DE, IE, FR, IT, SE, BR, CA, JP, SG, IN or ID |
| headers | object | | Custom request headers |
| wait | number | | Milliseconds to wait after load |
| waitFor | string | | CSS selector to wait for before reading |