
Web Fetcher
io.github.vojtisprime11Published by GitHub account vojtisprime11v0.1.0Updated Oct 24, 2026
Turns any web page into clean Markdown, page metadata and classified links for LLMs.
The publisher's own server: App Store data for agents
Overview
A local MCP server that fetches web pages and returns clean Markdown, structured metadata and classified links for an assistant to read.
- What you can do
- Fetch a page and return clean, paginated Markdown with optional links, images and a metadata summary, using startIndex to continue long pages across calls. Extract page metadata such as title, description, canonical URL, language, author, dates, Open Graph, Twitter cards, JSON-LD, headings, feeds and HTTP headers. Extract links with anchor text, rel and nofollow flags, internal versus external classification, scope filters, de-duplication and a limit. Failures return typed error codes with a retryability flag and a recovery hint.
- When to use it
- Useful when an assistant needs to read or summarize web articles, classify a page from its metadata, or map outbound links without pulling raw HTML into context. It suits static HTML pages; client-rendered single-page apps, PDFs and login-walled sites are out of scope.
- Requirements
- Runs locally over stdio as an npm package (mcp-server-web-fetcher), requiring Node.js 20.18.1 or newer; a Docker image and source build are also documented. No accounts or API keys. Outbound HTTPS network access is needed. All configuration is optional, via environment variables such as WEB_FETCHER_TIMEOUT_MS, WEB_FETCHER_MAX_BYTES, WEB_FETCHER_RESPECT_ROBOTS, WEB_FETCHER_USER_AGENT and WEB_FETCHER_ALLOW_PRIVATE_HOSTS.
Installation
In SourceWeft
- Open Web Fetcher in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
mcp-server-web-fetcher
[CI] [npm version] [License: MIT] [TypeScript] [Node.js] [MCP] [MCP Registry]
A fast, dependency-light Model Context Protocol server that turns any web page into something a language model can actually read: clean Markdown, structured metadata, and a classified list of links.
Web pages are 90% chrome. Scripts, cookie banners, navigation, sidebars and tracking pixels burn context and derail reasoning. This server strips all of that on the way in, so the model sees the article and nothing else.
Features
- Clean Markdown output. Readability-style main-content detection, GFM tables, language-tagged code fences, absolute links. No leftover HTML, even for gnarly nested tables.
- Context-window aware. Long pages are paginated with
startIndex/nextStartIndexinstead of being silently cut in half. - Structured metadata. Title, description, canonical,
lang, author, publish/modify dates, Open Graph, Twitter cards, JSON-LD,hreflangalternates, RSS/Atom feeds, h1–h6 outline and raw HTTP headers. - Link intelligence. Absolute URLs, anchor text,
rel,nofollow, internal vs external classification, scope filters, de-duplication. - SSRF hardening. Loopback, private, link-local and cloud-metadata addresses are blocked on every redirect hop, not just the first request. Credentials in URLs are stripped.
- Predictable failures. Every error carries a stable machine-readable
code(TIMEOUT,HTTP_ERROR,BLOCKED_HOST,RESPONSE_TOO_LARGE, …), a retryability flag and a recovery hint, so the model can self-correct instead of guessing. - Typed end to end. Strict Zod input schemas plus published
outputSchema, so clients get validatedstructuredContent, not prose they have to re-parse. - Well behaved. Byte caps, timeouts, redirect limits, charset sniffing (including legacy
encodings), a small TTL cache, transient-failure retries and optional
robots.txtenforcement. - 115 tests, no network required. Vitest unit tests plus in-memory MCP protocol tests.
Quickstart
Requires Node.js 20.18.1 or newer (inherited from cheerio, which needs undici 7).
The server speaks MCP over stdio, so on its own it just waits for a client. Point a client at it:
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json on macOS,
%APPDATA%\Claude\claude_desktop_config.json on Windows:
With configuration, using a global install:
Restart Claude Desktop, then ask it to summarise a URL.
Claude Code
Kiro, Cursor, Windsurf and other MCP clients
Same shape, in .kiro/settings/mcp.json / the client's MCP config file:
MCP Registry
The server is listed in the official MCP Registry
as io.github.vojtisprime11/web-fetcher, so clients that read the registry can discover it
directly:
Docker
The image runs as the unprivileged node user and carries production dependencies only. CI builds
it and drives it with a real MCP client, so it is verified to start and answer introspection.
From source
Tools
All three tools are read-only, idempotent and open-world (annotated as such in the protocol), and
all take an absolute http(s) URL.
fetch_page_markdown
Downloads a page and returns clean, LLM-friendly Markdown.
Request:
structuredContent:
To read the rest, call again with "startIndex": 7984. Keep going while nextStartIndex is not
null.
extract_metadata
Everything a model needs to classify a page, without spending context on its body.
structuredContent (abridged):
extract_links
structuredContent:
www.example.com and example.com count as the same site; blog.example.com does not.
Error handling
Failures come back as MCP tool errors (isError: true), never as silent empty results:
structuredContent.error carries the same information as JSON: { code, message, retryable, url, status }.
Timeouts, 5xx, 408 and 429 responses are retried once automatically before the error surfaces.
Configuration
Everything is optional; the defaults are safe.
Security
- SSRF guard on by default. Hostnames are resolved and checked against loopback, RFC 1918,
CGNAT, link-local (including
169.254.169.254), multicast and IPv4-mapped IPv6 ranges — for the initial URL and every redirect target.localhost,*.localhostand*.internalare refused outright. Turning the guard off is an explicit opt-in. - Byte and time caps. Responses are streamed and cut at the byte cap; every request is aborted at the timeout. Content-Length larger than the cap is rejected before download.
- No code execution. JavaScript is never run;
<script>,<style>,<iframe>and friends are removed before conversion. Fetched content is data, not instructions — treat page text reaching a model as untrusted input. - Credentials stripped.
user:pass@is removed from URLs before the request is made. - Read-only. The server has no write, filesystem or shell surface, and no authentication state.
Found a vulnerability? See SECURITY.md.
Architecture
Tool handlers take an injectable fetchImpl, so every test runs offline against a scripted HTTP
stub. The library is also importable directly:
Development
The minimum supported Node.js version is 20.18.1, which comes from cheerio (it depends on undici 7,
and undici 7 needs the File global that landed in Node 20). CI runs the suite on Node 20/22/24 and
has a separate job that completes an MCP handshake against the built server on exactly 20.18.1, so
the declared floor is verified rather than assumed.
Contributions welcome — see CONTRIBUTING.md and CODE_OF_CONDUCT.md.
Limitations
- Static HTML only. Client-rendered SPAs return whatever the server sends; no headless browser.
- No PDF or Office document extraction.
- Sites behind bot protection (Cloudflare challenges, login walls) will return 403.
- Main-content detection is a text-density heuristic. Use
mainContentOnly: falsewhen a page has an unusual structure.
Roadmap
search_pagetool: return only the sections matching a query.- Optional headless rendering behind a flag, for JS-only pages.
- Streamable HTTP transport in addition to stdio.
- Conditional requests (
ETag/If-Modified-Since) in the cache layer.
Acknowledgements
Built on the MCP TypeScript SDK, cheerio, turndown and zod.
License
MIT © Vojta Holes and contributors
Source: README.md at commit 3458d5e
Tools
0Version history
1- v0.1.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
Other Fetcher integrations
App Store data for agents
sh.fetcher.appstoreOfficial publisher
A remote MCP server that gives an assistant live App Store data — apps, bundles, reviews, similar items and developers — paid per call in USDC via x402.

Web Page Fetcher
Published by GitHub account paimonchan
Lets an assistant fetch a web page by URL and receive clean, readable markdown with headings, lists, tables and code blocks preserved.