npx -y @zenrows/mcp). On its first tool call without a key, it creates a Free account with 5,000 credits for its first billing period, and you can claim that account later, keeping its key and its usage. An unclaimed account is not renewed after that first period. See Agent signup and unclaimed accounts.
View on GitHub
Zenrows MCP is open source. Star the repository, file issues, or contribute.
Why Zenrows MCP
- Reach sites that normally block bots: Get access to any website at scale without getting blocked by anti-bot systems.
- Managed scraping infrastructure: Proxy rotation, headless browser orchestration, anti-bot evasion, and session management run on Zenrows infrastructure.
- Plug into any AI you already use: Works with any MCP client, including AI assistants, agent frameworks, AI SDKs, IDE plugins, and custom applications.
- Plain English, no scraping code: Describe the task naturally and the AI picks the right tool. No selectors, no proxy management, no anti-bot tuning.
What you can do
Once connected, your AI assistant can:- Scrape any webpage by describing the task in plain English
- Extract structured data from e-commerce sites, news pages, job boards, and more
- Render pages as Markdown, plain text, HTML, or PDF
- Take above-the-fold or full-page screenshots
- Access geo-restricted, JavaScript-heavy, or bot-protected pages
- Automate multi-step browser workflows: navigate, click, fill forms, scroll, drag, and extract across pages
- Queue a large set of URLs as one asynchronous job, then come back for the results
- Start from one page and collect the URLs linked from it, with each page’s HTML when you ask for it
- Run JavaScript in a live browser context
- Manage cookies, local storage, multiple tabs, and persistent sessions
- Check the plan’s remaining credits before starting a large job
Before you start
Whether you need an account first depends on the server you connect to:
The local server also needs Node.js for
npx.
An agent can also pay per request with no Zenrows account at all: it buys and calls Fetch and Extract on its own over x402, MPP or a card at
https://agents.zenrows.com/llms.txt. See Agentic Payments.Connection options
The Zenrows MCP server supports two transport options. Pick the one that fits your client.
Both options expose the same set of tools and capabilities. The choice is purely about how your client connects to the server. The one exception is
account_signup_answer: only the local server signs up on its own, so only it has that tool.
Remote MCP server
The hosted Zenrows MCP server is the recommended path for any AI application that calls an LLM API directly. The server runs on Zenrows’ infrastructure, so there is nothing to install, configure, or update.- Server URL:
https://mcp.zenrows.com/mcp - Transport:
Streamable HTTP - Authentication:
OAuth 2.1 sign-in, or your Zenrows API key as a Bearer token. See Authentication for details.
Python
Most MCP clients accept either an
authorization shorthand field that automatically wraps the value as a Bearer token, or a free-form headers field where you set the Authorization header yourself. Either approach works with Zenrows MCP.
No key yet, no browser. The remote server never creates an account itself. A tool call without a key gets a 401 whose body carries an agent_signup field with the signup URL (https://app.zenrows.com/api/agent/signup). A headless agent can POST there to create a Free account (the endpoint may first ask one short question for the agent to answer), then retry with the returned apiKey as the Bearer token. The same endpoint is listed in the agent_auth block of https://mcp.zenrows.com/.well-known/oauth-authorization-server. See Agent signup and unclaimed accounts.
Local MCP server
If your AI client runs the MCP server as a local subprocess instead of calling a remote URL, use the@zenrows/mcp npm package. This is the standard configuration for desktop AI clients.
The exact location of the configuration file varies by client, but every supported client uses a similar MCP server config shape. To use an account you already have, replace YOUR_ZENROWS_API_KEY with your key:
JSON
Start without an API key
LeaveZENROWS_API_KEY out and the server gets its own key:
JSON
- The
ZENROWS_API_KEYenvironment variable. - A key it stored earlier in
~/.zenrows/secrets.json. - Auto-signup. With neither, the server still starts. On the first tool call it creates a Zenrows account on the Free plan (5,000 credits for its first billing period), saves the key to
~/.zenrows/secrets.jsonand the account’s claim details to~/.zenrows/account.json(both readable only by your user), and writes a claim link to its log (stderr).
402 AUTH005 until it is claimed. Claiming keeps the same key and the usage so far, and if the first period has ended, it starts a new billing period. When an unclaimed account runs out of credits, the tool error includes the claim link, so your agent can hand it to you. See Agent signup and unclaimed accounts.
Before it shows a claim link, the server checks whether the account has been claimed and asks for a fresh link when the stored one is missing or 25 days old or more (links expire after 30 days). Once the account is claimed, tool errors stop carrying a claim link.
Signup may first ask one short question that the agent answers itself. The tool call that triggers signup then returns the question instead of a result. Answer it with the account_signup_answer tool, passing {"answer": "..."}, then retry the original tool call. A wrong or expired answer returns a new question. See Answer the signup question.
Each network can create 3 accounts this way in 24 hours. If signup is refused (that cap, signup turned off on the Zenrows side, or a network error), the server keeps running and the tool call returns an error that gives the reason, when to retry, and the fix: set ZENROWS_API_KEY to a key you already have, persist ZENROWS_HOME between CI runs, or set ZENROWS_AUTO_SIGNUP to false. Until that retry time, tool calls return the same error without asking Zenrows again.
To turn auto-signup off, set ZENROWS_AUTO_SIGNUP to false. The server then never creates an account. It still starts, but tool calls return an error asking for a key until you set ZENROWS_API_KEY (or a key is already in ~/.zenrows/secrets.json):
JSON
claude-code or cursor). Set ZENROWS_TELEMETRY to off to leave both out.
Run the local server in CI
A CI runner starts from a clean home directory, so without a key every run creates a new account, and the fourth run from the same network within 24 hours is refused. Give CI one key instead:- Store your API key as a CI secret and pass it as
ZENROWS_API_KEY. - Or keep the server’s key between runs: cache
~/.zenrows, or setZENROWS_HOMEto a cached directory. The server reads and writessecrets.jsonandaccount.jsonin a.zenrowsfolder inside it (or in it directly, when the path ends in.zenrows).
ZENROWS_AUTO_SIGNUP to false in CI as well, so a missing secret never creates an account: the server still starts, and every tool call returns an error asking for a key.
Per-client setup guides
For step-by-step instructions including the exact config file path and restart steps for each client:Authentication
The remote Zenrows MCP server accepts either OAuth 2.1 sign-in or your Zenrows API key sent directly as a Bearer token. With OAuth, the access token it issues is your account’s API key, so every tool runs with that key’s permissions either way. See Authentication and permissions for the OAuth flow.- Remote MCP server
- Local STDIO MCP server
Send the key in the HTTP OpenAI’s MCP tool, Anthropic’s MCP tool, and most other MCP clients expose this through a single
Authorization header on every request:authorization field on the tool config and forward it as the Bearer token automatically. Some clients use a free-form headers field instead. Both approaches are valid.Tools
A tool in MCP terms is a named capability the server exposes. For example,scrape or browser_navigate.
When you ask your AI to fetch a webpage or fill a form, the AI sees the available tools, picks the one that fits the task, and invokes it. You don’t call tools yourself in code. You set up the MCP connection once, and the AI handles tool selection and invocation from there.
The Zenrows MCP exposes five groups of tools, plus one standalone tool for checking credits. The local server adds account_signup_answer, which answers the signup question when it creates its own account. The extract group includes the two tools that prepare a domain for it: prepare_domain and prepared_domain_status.
The scrape tool
The scrape tool fetches a webpage in a single request and returns its content in the format you specify: clean Markdown (default), plain text, raw HTML, a screenshot, a PDF, or structured JSON. It uses Fetch under the hood.
By default, scrape uses Adaptive Stealth Mode (mode=auto): Zenrows enables JavaScript rendering and premium proxies only when a page needs them, and you pay only for the configuration that succeeds. Set js_render or premium_proxy only to force a fixed configuration, which turns Adaptive Stealth Mode off.
Best for quick data extraction where the AI doesn’t need to interact with the page.
The extract tool
The extract tool returns a page as structured JSON rather than as a body of text. Prefer it over scrape when the answer is a set of fields, such as a product’s name and price, an article’s author and date, or the rows of a listing: it returns a fraction of the tokens a full page costs.
It runs in one of three modes:
Like
scrape, extract uses Adaptive Stealth Mode by default, and so do the Batch tools. Set js_render or premium_proxy only to force a fixed configuration, or mode_auto: false to turn Adaptive Stealth Mode off.
extract returns the extracted fields only. In auto mode, set include_html: true to also get the page HTML, which is most of the response size.
For a full page as Markdown, HTML, or a screenshot, use scrape instead.
Preparing a domain
Whenextract returns REQS007 with reason domain_not_prepared, prepare the domain yourself:
- Call
prepare_domainwith the domain and 1 to 5 example URLs. One works; we recommend 3 or more of the same page type (e.g. 3 product pages), because Extract compares pages of one type to check the fields it found and fill in fields one page is missing. It returns at once withstatus: "preparing". - Call
prepared_domain_statusabout every 30 seconds untilstatusisready. Preparation takes a few minutes and costs no credits; each new domain uses one slot of your monthly allowance, whichprepared_domain_statusshows. - Call
extractagain.
REQS007 with reason page_not_recognised is different: the domain is already prepared, and preparing it again does not change the answer. See REQS007 for what to do.
Crawl tools
Thecrawl_* tools start and read a Crawl: one start URL, then the URLs it finds behind that page, and each page’s HTML when output_format is html.
crawl_create returns as soon as the crawl is accepted, so a crawl that runs for a while does not block the call. Poll with crawl_get, or hand the waiting to crawl_wait. crawl_wait returns the status, the counts, and the first 20 URLs. Save every result with crawl_download, or page through them with crawl_results.
depth is optional. Leave it out and the crawl follows links until max_pages or max_items stops it. Both default to 100 and cap at 100,000. Each page fetched is one Fetch request. See Crawl pricing.
Crawl tools are in the Zenrows MCP server from version 2.6.1. The hosted server at https://mcp.zenrows.com/mcp and npx -y @zenrows/mcp both expose them.
Batch tools
batch_content, batch_list, batch_pause, batch_resume, batch_rerun and batch_delete are in the Zenrows MCP server from version 2.13.0. The hosted server at https://mcp.zenrows.com/mcp and npx -y @zenrows/mcp both expose them.
The batch_* tools submit and manage Batch jobs: one job that fans out many URLs asynchronously, so the AI doesn’t hold a connection open per URL. Best when the URL set is large enough that waiting on each request in turn is impractical, or when the assistant should submit work now and collect it later.
batch_create returns as soon as the job is accepted, so a job that runs for hours doesn’t block a synchronous tool call. The usual flow is batch_create, then batch_wait until the run ends, batch_results to page through the rows, and batch_content to read one task’s page.
batch_cancel, batch_pause and batch_resume are idempotent: on a run that already ended they answer with its final state and already_ended: true.
A run that ends failed answers ok: false. Its error.code is the one the matching HTTP error gets: BATCH_INSUFFICIENT_CREDITS (out of credits), BATCH_KEY_CAP_REACHED (the key reached a credit cap), AUTH_INVALID with server_code subscription_inactive (fix Billing), or BATCH_RUN_FAILED. error.server_code is the run’s failure_reason, and error.job_id names the job. Fix the cause, then call batch_rerun.
Errors also carry
message, detail, server_code (the Batch API’s own error code) and, for a call about one job, job_id.
Reads and polls retry 429, 500, 502, 503, 504 and network errors up to 3 times, honoring Retry-After up to 30 seconds. batch_create and batch_rerun retry 500, 502, 503, 504, network errors and a 429 with Retry-After, always with the same Idempotency-Key, and never the job-limit 429. On BATCH_IDEMPOTENCY_CONFLICT for the same request, check batch_list first. If the job is there, use its job_id: a 503 that arrived after the job was created leaves no stored answer, so that key returns the conflict every time. If it isn’t, retry later with the same key, because a new key can create a second, billed job.
browser_batch is a different tool. It sequences several browser actions into one call against a browser session and has nothing to do with the Batch API. See Available browser tools.Browser tools
Thebrowser_* tools give your AI assistant control of a cloud-hosted browser session powered by the Zenrows Browser. The browser comes with built-in residential proxies and anti-bot bypass.
The browser_* tools cover tasks that involve:
- Navigation across multiple pages in a single session
- Form fills, button clicks, and other element interactions
- Waiting for dynamically loaded content
- JavaScript execution in the browser context
- Cookies, local storage, and multi-tab management
browser_navigate, which opens a session and returns a session_id. All subsequent browser calls use this session_id. Call browser_close when done.
Available browser tools
Session
Session
Interaction
Interaction
Extraction
Extraction
Visual
Visual
Wait
Wait
JavaScript
JavaScript
Storage
Storage
Tabs
Tabs
Batch
Batch
The account_usage tool
The account_usage tool reports the current plan’s credit allowance and how much of it is spent. It is free and does not consume a concurrency slot, so an assistant can call it safely before fanning out a large job, or after a request fails for credits.
Credit cost per request: 1 basic, 5 with js_render, 10 with premium_proxy, 25 with both.
AUTH004 means the allowance is spent. It renews at the end of the billing period, so it is not a permanent block and should never be retried in a loop. An unclaimed agent account is the exception: it is not renewed, and once its first period ends, requests answer AUTH005 until a person claims it. AUTH006 is the concurrency limit, which is a different thing.
AUTH014 means the API key reached one of its credit caps, while your other keys keep working. Raise or remove the cap, or wait for its window to reset, instead of retrying.
Pricing
The Zenrows MCP server itself is free. There is no separate fee for connecting, listing tools, or using the integration. Each tool call is billed against your Zenrows subscription using the standard pricing of the underlying product:- Calls to the
scrapetool follow Fetch pricing. - Calls to the
extracttool use Extract, which is currently free. Billing may apply later. prepare_domainandprepared_domain_statuscost no credits. Each new domainprepare_domainsubmits uses one slot of your monthly allowance.- Calls to
crawl_*tools follow Crawl pricing. Each page a crawl fetches is one Fetch request. - Calls to
batch_*tools follow Batch pricing: the same credits as Fetch per successful task, plus tasks whose target answered404or410. - Calls to
browser_*tools follow Zenrows Browser pricing. account_usageis free and is not billed.
Troubleshooting
Connection issues
Scraped content issues
If your AI is connecting and invoking tools correctly but the scraped content comes back missing, blocked, or incomplete, the issue is with the target page rather than the MCP connection. Common causes include JavaScript-loaded content, anti-bot protection, geo-restrictions, and dynamic loading. See the Fetch troubleshooting guide for fixes you can ask your AI to apply. For example, “scrape with JavaScript rendering enabled” or “use Premium Proxies.”Example prompts
Once Zenrows MCP is connected, describe the task to your AI assistant in plain English and it handles the scraping automatically.- Scrape tool
- Crawl tools
- Browser tools
Docs MCP server
These docs have their own MCP server athttps://docs.zenrows.com/mcp. It searches and reads the Zenrows documentation, so an agent can look up parameters, error codes, and setup steps without leaving the conversation. It needs no API key and spends no credits.
The two servers do different jobs. Connect the Zenrows MCP server to fetch and extract web data; connect the docs MCP server to answer questions about Zenrows. Most agents benefit from both.
zenrows-docs, as above, so it sits next to the zenrows server rather than replacing it.
Related resources
Fetch Reference
Full parameter reference for the
scrape tool’s underlying API.Zenrows Browser Introduction
Learn more about the browser powering the
browser_* tools.Zenrows Dashboard
Monitor usage, manage your API key, and track quota.
NPM Package
@zenrows/mcp on npm for local STDIO deployments.Contributing
The Zenrows MCP server is open source. If you want to modify the server, fix a bug, or suggest an improvement, clone the GitHub repository and run it locally:Bash