The superFetch MCP Server fetches public web pages and converts HTML into clean, AI-readable Markdown — ideal for feeding web content to LLMs.
Fetch & Convert Web Content: Retrieve content from any public HTTP(S) URL and transform it into clean Markdown, with noise removal (navbars, footers, clutter) applied by default
Code Host Integration: Automatically rewrite GitHub, GitLab, Bitbucket, and Gist URLs to raw content endpoints
Caching: Results are cached for reuse; bypass with
forceRefreshfor fresh content, or access cached content viainternal://cache/{namespace}/{hash}Inline Size Control & Task Mode: Limit returned Markdown size with
maxInlineChars; large or slow fetches can run asynchronously via task mode to avoid truncation/timeoutsStructured Metadata: Responses include
url,resolvedUrl,finalUrl,title,markdown,fromCache,fetchedAt,contentSize, andtruncatedBuilt-in Resources & Help: Access guidance via
internal://instructionsand aget-helpprompt for usage detailsHTTP Server Mode: Optional HTTP server with host/origin validation, authentication (static tokens, OAuth), rate limiting, and health checks
Security: SSRF protections, local/private network blocking, TLS support, and protocol version validation
Read-only: Purely a content fetcher — no JavaScript execution or page interaction
Broad Client Support: Works with VS Code, Cursor, Claude Desktop, LM Studio, and other MCP-compatible clients
Automatically rewrites Bitbucket URLs to their raw content versions to extract clean, readable text from code repositories.
Automatically rewrites GitHub and Gist URLs to their raw content versions to extract clean, readable text from code repositories.
Automatically rewrites GitLab URLs to their raw content versions to extract clean, readable text from code repositories.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@superFetch MCP Serverfetch and clean the content from https://www.wired.com/story/ai-chip-wars/"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Fetch URL MCP Server
A web content fetcher MCP server that converts HTML to clean, AI and human readable markdown.
Overview
The Fetch URL MCP Server provides a standardized interface for fetching public web content and transforming it into Markdown enriched with structured metadata. It validates URLs, applies noise removal heuristics, and caches results for reuse. The server supports both inline and task-based execution modes, making it suitable for a wide range of client applications and LLM interactions.
Key Features
fetch-urlvalidates public HTTP(S) URLs, fetches the page, and returns cleaned Markdown plus structured metadata.The tool advertises optional task support and emits progress updates while fetching and transforming larger pages.
GitHub, GitLab, Bitbucket, and Gist page URLs are rewritten to raw-content endpoints when possible before fetch.
internal://instructionsandinternal://cache/{namespace}/{hash}expose built-in guidance and cached Markdown as MCP resources.HTTP mode adds host/origin validation, auth, rate limiting, health checks, OAuth protected-resource metadata, and cached-download URLs.
Requirements
Node.js >=24 (from
package.json)Docker is optional if you want to run the published container image.
Quick Start
Use this standard MCP client configuration:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}Client Configuration
Add to .vscode/mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}Or install via CLI:
code --add-mcp '{"name":"fetch-url-mcp","command":"npx","args":["-y","@j0hanz/fetch-url-mcp@latest"]}'For more info, see VS Code MCP docs.
Add to .vscode/mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}Or install via CLI:
code-insiders --add-mcp '{"name":"fetch-url-mcp","command":"npx","args":["-y","@j0hanz/fetch-url-mcp@latest"]}'For more info, see VS Code Insiders MCP docs.
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Cursor MCP docs.
For solution-scoped setup, add this to .mcp.json at the solution root:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Visual Studio MCP docs.
Add to ~/.config/goose/config.yaml on macOS/Linux or %APPDATA%\Block\goose\config\config.yaml on Windows:
extensions:
fetch-url-mcp:
name: fetch-url-mcp
cmd: npx
args: ['-y', '@j0hanz/fetch-url-mcp@latest']
enabled: true
type: stdio
timeout: 300For more info, see Goose extension docs.
Add to ~/.lmstudio/mcp.json on macOS/Linux or %USERPROFILE%/.lmstudio/mcp.json on Windows:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see LM Studio MCP docs.
Add to claude_desktop_config.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Claude Desktop MCP docs.
Use the CLI:
claude mcp add fetch-url-mcp -- npx -y @j0hanz/fetch-url-mcp@latestFor project-scoped config, Claude Code writes .mcp.json with:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"],
"env": {}
}
}
}For more info, see Claude Code MCP docs.
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Windsurf MCP docs.
Add to ~/.config/amp/settings.json on macOS/Linux, %USERPROFILE%\.config\amp\settings.json on Windows, or .amp/settings.json for workspace-scoped config:
{
"amp.mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}Or install via CLI:
amp mcp add fetch-url-mcp -- npx -y @j0hanz/fetch-url-mcp@latestFor more info, see Amp docs.
Open the MCP Servers panel, choose Configure MCP Servers, and add this to cline_mcp_settings.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Cline MCP docs.
Use the CLI:
codex mcp add fetch-url-mcp -- npx -y @j0hanz/fetch-url-mcp@latestOr add this to ~/.codex/config.toml or project-scoped .codex/config.toml:
[mcp_servers.fetch-url-mcp]
command = "npx"
args = ["-y", "@j0hanz/fetch-url-mcp@latest"]For more info, see Codex MCP docs.
Add to .vscode/mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see GitHub Copilot MCP docs.
Open Personal > MCP Servers in Warp, choose + Add, and either add a CLI server with:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
Or paste this JSON snippet when using Warp's multi-server import flow:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Warp MCP docs.
Use Kiro's MCP Servers panel or the Add to Kiro install flow. Kiro stores workspace-scoped MCP config in .kiro/settings/mcp.json and user-scoped config in ~/.kiro/settings/mcp.json.
For this server, use:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
For more info, see Kiro MCP docs.
Add to ~/.gemini/settings.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Gemini CLI MCP docs.
Add to ~/.config/zed/settings.json:
{
"context_servers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"],
"env": {}
}
}
}For more info, see Zed MCP docs.
Use the Augment Settings panel and either add the server manually or choose Import from JSON:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}For more info, see Augment MCP docs.
Use Roo Code's MCP Servers UI or marketplace flow.
For this server, use:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
For more info, see Roo Code docs.
Use Kilo Code's MCP Servers UI or marketplace flow.
For this server, use:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
For more info, see Kilo Code docs.
Use Cases
Fetch documentation pages, blog posts, or reference material into Markdown before sending them to an LLM.
Retrieve repository-hosted content from GitHub, GitLab, Bitbucket, or Gists and let the server rewrite page URLs to raw endpoints when possible.
Reuse cached Markdown through
internal://cache/{namespace}/{hash}or bypass the cache withforceRefreshfor time-sensitive pages.Use task mode for large pages or slower sites when the inline response would otherwise be truncated or delayed.
Architecture
[MCP Client]
├─ stdio -> `src/index.ts` -> `startStdioServer()` -> `createMcpServer()`
└─ HTTP (`--http`) -> `src/index.ts` -> `startHttpServer()` -> HTTP dispatcher
├─ `GET /health`
├─ `GET /.well-known/oauth-protected-resource`
├─ `GET /.well-known/oauth-protected-resource/mcp`
├─ `GET /mcp/downloads/{namespace}/{hash}`
└─ `POST|GET|DELETE /mcp`
`createMcpServer()`
├─ registers tool: `fetch-url`
├─ registers prompt: `get-help`
├─ registers resources:
│ - `internal://instructions`
│ - `internal://cache/{namespace}/{hash}`
├─ enables capabilities: completions, logging, resources, prompts, tasks
└─ installs task handlers, log-level handling, and shutdown cleanup
`fetch-url` execution
├─ validate input with `fetchUrlInputSchema`
├─ normalize URL and block local/private targets unless allowed
├─ rewrite supported code-host URLs to raw endpoints when possible
├─ fetch and cache content via the shared pipeline
├─ transform HTML into Markdown in the transform worker path
└─ validate `structuredContent` with `fetchUrlOutputSchema`Request Lifecycle
[Client] -- initialize {protocolVersion, capabilities} --> [Server]
[Server] -- {protocolVersion, capabilities, serverInfo} --> [Client]
[Client] -- notifications/initialized --> [Server]
[Client] -- tools/call {name, arguments} --> [Server]
[Server] -- {content: [{type, text}], structuredContent?, isError?} --> [Client]MCP Surface
Tools
fetch-url
Fetch public webpages and convert HTML into AI-readable Markdown. The tool is read-only, does not execute page JavaScript, can bypass the cache with forceRefresh, and supports optional task mode for larger or slower fetches.
Parameter | Type | Required | Description |
|
| yes | Target URL. Max 2048 chars. |
|
| no | Preserve navigation/footers (disable noise filtering). |
|
| no | Bypass cache and fetch fresh content. |
|
| no | Inline markdown limit (0-10485760, 0=unlimited). Lower of this or the global limit applies. |
The response is returned as MCP text content and, when validation succeeds, as structuredContent containing url, resolvedUrl, finalUrl, title, metadata, markdown, fromCache, fetchedAt, contentSize, and truncated.
1. [Client] -- tools/call {name: "fetch-url", arguments} --> [Server]
2. [Server] -- dispatch("fetch-url") --> [src/tools/fetch-url.ts]
3. [Handler] -- validate(fetchUrlInputSchema) --> normalize / fetch / transform
4. [Handler] -- validate(fetchUrlOutputSchema) --> assemble content + structuredContent
5. [Server] -- result or tool error --> [Client]Resources
Resource | URI | MIME Type | Description |
|
|
| Guidance for using the Fetch URL MCP server. |
|
|
| Read cached markdown generated by previous |
Prompts
Prompt | Arguments | Description |
| none | Return Fetch URL server instructions: workflows, cache usage, task mode, and error handling. |
MCP Capabilities
Capability | Status | Notes |
completions | confirmed | Advertised in |
logging | confirmed | Advertised in |
resources subscribe/listChanged | confirmed | Advertised in |
prompts | confirmed |
|
tasks | confirmed | Advertised in |
progress notifications | confirmed | Tool execution reports |
Tool Annotations
Annotation | Value |
|
|
|
|
|
|
|
|
Structured Output
fetch-urlpublishes an explicitoutputSchemaand returnsstructuredContentwhen the assembled response passes validation.
Configuration
Variable | Default | Applies To | Notes |
|
| HTTP mode | Bind address. Non-loopback bindings also require |
|
| HTTP mode | Listening port for |
|
| HTTP mode | Must be enabled to bind to a non-loopback interface. |
| unset | HTTP mode | Comma- or space-separated static bearer tokens. |
| unset | HTTP mode | Alternate static token source for header auth. |
| unset | HTTP mode | Enables OAuth mode when combined with the other OAuth URLs. |
| unset | HTTP mode | Optional explicit authorization endpoint. |
| unset | HTTP mode | Optional explicit token endpoint. |
| unset | HTTP mode | Optional OAuth revocation endpoint. |
| unset | HTTP mode | Optional OAuth dynamic client registration endpoint. |
| unset | HTTP mode | Required for OAuth token introspection. |
| empty | HTTP mode | Required scopes enforced after auth. |
| unset | HTTP mode | Optional introspection client ID. |
| unset | HTTP mode | Optional introspection client secret. |
| unset | HTTP mode | Enable HTTPS when set together with |
| unset | HTTP mode | TLS certificate path. |
| unset | HTTP mode | Optional custom CA bundle. |
|
| HTTP mode | Optional connection cap. |
| unset | HTTP mode | Optional Node server tuning. |
| unset | HTTP mode | Optional Node server tuning. |
| unset | HTTP mode | Optional keep-alive tuning. |
| unset | HTTP mode | Optional keep-alive tuning buffer. |
| unset | HTTP mode | Optional header count limit. |
|
| HTTP mode | Enables inbound private-network protections. |
|
| HTTP mode | Requires |
| empty | HTTP mode | Additional allowed |
|
| Fetching | Allows loopback and private-network fetch targets. |
|
| Fetching | Network fetch timeout in milliseconds. |
|
| Fetching | Override the outbound user agent string. |
|
| Tool output |
|
|
| Caching | Enables in-memory fetch result caching. |
|
| Tasks | Total task capacity. |
|
| Tasks | Per-owner task cap, clamped to the total cap. |
|
| Tasks | Enables status notifications for tasks. |
|
| Tasks | Requires task interception for task-capable tool execution. |
|
| Transform workers | Cancellation acknowledgement timeout. |
|
| Transform workers | Worker execution mode. |
| unset | Transform workers | Optional worker memory limit. |
| unset | Transform workers | Optional worker memory limit. |
| unset | Transform workers | Optional worker memory limit. |
| unset | Transform workers | Optional worker stack size. |
| empty | Content cleanup | Extra noise-removal tokens. |
| empty | Content cleanup | Extra DOM selectors for noise removal. |
| system default | Content cleanup | Locale override for extraction heuristics. |
| built-in list | Markdown cleanup | Override heading keywords used by cleanup. |
|
| Logging |
|
|
| Logging | Set to |
HTTP Endpoints
Method | Path | Auth | Purpose |
|
| no, unless | Basic health response, with optional diagnostics. |
|
| no | OAuth protected-resource metadata. |
|
| no | OAuth protected-resource metadata for the MCP endpoint. |
|
| yes | Session initialization and JSON-RPC requests. |
|
| yes | Session-bound server-to-client stream handling. |
|
| yes | Session shutdown. |
|
| yes | Download route used by HTTP-mode cached fetch results. |
Security
Control | Status | Notes |
Host and origin validation | implemented | HTTP requests are rejected unless |
Authentication | implemented | HTTP mode supports static bearer tokens locally or OAuth token introspection; remote bindings require OAuth. |
Protocol version checks | implemented | HTTP sessions validate |
Rate limiting | implemented | Requests pass through the HTTP rate limiter before route dispatch. |
Outbound SSRF protections | implemented | Local/private IPs, metadata endpoints, and |
TLS | optional | HTTPS is enabled when both TLS key and certificate files are configured. |
Stdio logging safety | implemented | Server logs are written to stderr, not stdout, so stdio MCP traffic stays clean. |
Development
Script | Command |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Build and Release
The repository includes release automation under
.github/workflows/.Dockerfileanddocker-compose.ymlare available for container-based packaging and local runs.npm run prepublishOnlyruns the release gate: lint, type-check, and build.
Troubleshooting
For stdio mode, avoid writing logs to stdout; keep logs on stderr.
For HTTP mode, verify MCP protocol headers and endpoint routing.
Update client snippets when client MCP configuration formats change.
Credits
Dependency | Registry |
npm | |
npm | |
npm | |
npm | |
npm | |
npm |
Contributing and License
License: MIT
Contributions are welcome via pull requests.