Anyfetch · comparison
MCP fetch server 403: the causes, and which server reads the page
The MCP fetch server returns 403 on many sites because it names itself as a bot and sends the request of a Python library. This page explains the three causes, shows what the flags of the server change, and compares seven MCP fetch servers on the same 97 sites.
Direct answer
The reference MCP fetch server (mcp-server-fetch) gets 403 for three reasons. It sends a user agent that says it is an autonomous bot. Its TLS handshake and its headers are those of a Python library, not of a browser. And it refuses a page itself when robots.txt does not allow bots. In our test of 97 popular sites that block AI agents, it read 39. Anyfetch, a free MCP fetch server that sends the request a browser sends, read 82 from the same machine with no API key.
The three causes of 403 in the MCP fetch server
| Cause | Sites | What happens |
|---|---|---|
| The site refuses the request | 21 | The site answers 403, 401, 402, or 429. The server reports “Failed to fetch … status code 403”. |
| The server refuses the page itself | 16 | robots.txt of the site does not allow bots, so the server does not ask for the page at all. |
| The page arrives with no usable text | 21 | The site sends a bot check, a consent wall, or a page that is empty without its scripts. |
The first cause is the request. The server sends the user agent “ModelContextProtocol/1.0 (Autonomous; +https://github.com/modelcontextprotocol/servers)”. A site that blocks bots needs no more than that line. A site that looks deeper sees the TLS handshake and the headers of a Python HTTP library, sent over HTTP/1.1. No browser sends those.
The second cause is a rule of the server. For a request that comes from the model, it reads robots.txt first. When robots.txt says no, the model gets an error and never sees the page.
What the flags of the server change
| Flag | Effect | Result in our test |
|---|---|---|
| --ignore-robots-txt | The server skips the robots.txt check. | 42 of 97, measured one day before. Most sites that say no in robots.txt also refuse the request. |
| --user-agent with --ignore-robots-txt | The server sends the name you give, for example the name of Chrome, and skips the robots.txt check. | 41 of 97, with the user agent of Chrome. The TLS handshake stays that of a Python library. |
| --proxy-url | The request goes through your proxy. | Not measured. A new address does not change what the request looks like. |
{
"mcpServers": {
"fetch": { "command": "uvx", "args": ["mcp-server-fetch", "--ignore-robots-txt"] }
}
}The flags help on a few sites: 41 or 42 pages read, against 39. They do not change the handshake. For the other sites you need a server that sends a browser request, or a server that drives a real browser.
Seven MCP fetch servers on the same 97 sites
- 82 of 97
- 78 of 97
- 71 of 97
- 69 of 97
- 52 of 97
- 49 of 97
- 39 of 97
We read each of 97 popular sites once with each tool, on 2026-10-12, from one cloud server with no proxy. A page counts as read when the tool returns at least 500 characters of text and the text is not a bot check. Most of the sites refuse AI agents in some way. A few open sites, such as GitHub and Wikipedia, are in the list as a control. We make Anyfetch and we ran this test, so the list of sites, the script, and the result for every site are public. Run it yourself.
Exa is a hosted service. It answers from a stored copy of the page, which is why it reads sites that refuse every direct request. In our test, each answer stopped at about 3,000 characters, and its copy of the New York Times home page was 26 days old. The Firecrawl MCP server is not in this list: its use with no API key reached its rate limit on our test server after a few pages.
| Server | How it reads a page | Needs | Pages read |
|---|---|---|---|
| Anyfetch | A browser-pattern request from your machine. No browser runs. | One 16 MB program, or npx | 82 |
| Exa MCP, no API key | The Exa cloud answers from its index, or fetches the page for you. | Nothing to install: a hosted server. A key for more than the free use | 78 |
| Scrapling MCP, stealth browser | A headless stealth browser on your machine. | Python and a browser download | 71 |
| Scrapling MCP, plain HTTP | A browser-pattern request from your machine. | Python | 69 |
| Playwright MCP, headless | A headless Chromium on your machine. Built to control pages, not to read them. | Node.js and a browser download | 52 |
| DuckDuckGo MCP server | A plain HTTP request from your machine. | Python (uvx) | 49 |
| Reference MCP fetch server | A plain HTTP request with a bot user agent. | Python (uvx) | 39 |
| Site | Anyfetch | Reference fetch | Playwright MCP | Scrapling stealth |
|---|---|---|---|---|
| nytimes.com | ✓read | ✕not read | ✕not read | ✕not read |
| reuters.com | ✓read | ✕not read | ✕not read | ✕not read |
| bloomberg.com | ✓read | ✕not read | ✕not read | ✓read |
| wsj.com | ✕not read | ✕not read | ✕not read | ✕not read |
| washingtonpost.com | ✓read | ✕not read | ✕not read | ✓read |
| ft.com | ✓read | ✕not read | ✕not read | ✕not read |
| economist.com | ✓read | ✕not read | ✕not read | ✕not read |
| forbes.com | ✓read | ✓read | ✓read | ✓read |
| reddit.com | ✓read | ✕not read | ✕not read | ✓read |
| x.com | ✓read | ✕not read | ✕not read | ✓read |
| linkedin.com | ✓read | ✕not read | ✓read | ✓read |
| instagram.com | ✓read | ✕not read | ✓read | ✓read |
| tiktok.com | ✕not read | ✕not read | ✓read | ✓read |
| quora.com | ✓read | ✕not read | ✕not read | ✓read |
| medium.com | ✓read | ✕not read | ✕not read | ✓read |
| youtube.com | ✓read | ✕not read | ✓read | ✕not read |
| amazon.com | ✓read | ✕not read | ✕not read | ✓read |
| ebay.com | ✓read | ✕not read | ✕not read | ✕not read |
| walmart.com | ✓read | ✓read | ✓read | ✓read |
| etsy.com | ✕not read | ✕not read | ✕not read | ✕not read |
| booking.com | ✕not read | ✕not read | ✕not read | ✕not read |
| tripadvisor.com | ✕not read | ✕not read | ✕not read | ✕not read |
| yelp.com | ✕not read | ✕not read | ✕not read | ✕not read |
| zillow.com | ✓read | ✓read | ✕not read | ✓read |
| indeed.com | ✓read | ✕not read | ✕not read | ✕not read |
| glassdoor.com | ✓read | ✕not read | ✕not read | ✕not read |
| stackoverflow.com | ✓read | ✕not read | ✕not read | ✕not read |
| github.com | ✓read | ✓read | ✓read | ✓read |
| en.wikipedia.org | ✓read | ✓read | ✓read | ✓read |
| imdb.com | ✓read | ✕not read | ✕not read | ✕not read |
| sciencedirect.com | ✓read | ✕not read | ✕not read | ✓read |
| scholar.google.com | ✓read | ✕not read | ✕not read | ✓read |
| Read, of all 97 sites | 82 | 39 | 52 | 71 |
Switch from the reference server to Anyfetch
Anyfetch is a stdio MCP server, like the reference server. Change one entry in the MCP file of your client. With Node.js on the machine, there is nothing to install.
{
"mcpServers": {
"fetch": { "command": "uvx", "args": ["mcp-server-fetch"] }
}
}{
"mcpServers": {
"anyfetch": { "command": "npx", "args": ["-y", "@aliasmode/anyfetch", "mcp"] }
}
}| Reference MCP fetch server | Anyfetch | |
|---|---|---|
| Read a page | fetch | web_fetch |
| Read several pages in one call | No | web_fetch_many |
| Search the web | No | web_search, with no API key |
| Characters per call | 5,000 by default (max_length) | 50,000 by default (max_chars) |
| Only the parts that answer a question | No | Yes, with query |
| PDFs | No | Yes, as text |
| Obeys robots.txt | Yes, by default | No. It reads a page as a browser does. |
Do you use Claude Code, Codex, Gemini CLI, or Cursor? The Anyfetch installer adds the server to each of them, so you do not edit a file.
What no fetch server reads
No server in this test read every site. Anyfetch missed 15. A page behind a CAPTCHA, a login, or a subscription stays closed for a fetch server, and Anyfetch reports it with an error code such as challenge_required.
A task that needs a login or a click needs a real browser with a saved session. AliasMode is our free, open-source browser for that work, and its MCP server gives an agent profiles that stay logged in.
Frequently asked questions
Why does the MCP fetch server return 403?
The site refuses the request. The reference server sends a user agent that says it is an autonomous bot, and its TLS handshake is that of a Python library. Sites with bot protection answer such a request with 403.
What does “robots.txt specifies that autonomous fetching is not allowed” mean?
The reference server read robots.txt of the site and found a rule against bots, so it did not ask for the page. Start the server with --ignore-robots-txt to skip the check. Many of those sites then answer 403.
Does changing the user agent fix 403 in the MCP fetch server?
On a few sites. In our test of 97 sites, the reference server with the user agent of Chrome and the robots.txt check off read 41, against 39 with its default settings. The flag does not change the TLS handshake.
Which MCP fetch server reads the most sites?
In our test of 97 popular sites that block AI agents, Anyfetch read 82, the stealth browser of Scrapling read 71, and the reference server read 39. We make Anyfetch, so the script and the result for every site are public.
Is there a free MCP fetch server with no API key?
Yes. Anyfetch, the reference server, the DuckDuckGo MCP server, Scrapling, and Playwright MCP run on your machine and need no key. Anyfetch read the most sites in our test.