fast-webfetch-mcp
fast-webfetch-mcp
Un servidor MCP de captura web que renderiza páginas con un navegador real que se ejecuta en tu propia máquina y luego entrega al modelo Markdown limpio en lugar de una factura de tokens por 2 MB de JavaScript.
Capturar aquí no cuesta nada: sin claves de API, sin precios por página. Y cuando un sitio afirma bloquearte, a menudo es solo un script de detección de headless que un Chromium real atraviesa sin problema.
Cómo funciona
Dos programas pequeños, un solo trabajo:
MCP client (agent)
│ JSON-RPC over stdio
▼
src/index.ts Bun + MCP SDK — tool schemas, budgets, rendering
│ spawns per request
▼
crawl4ai_worker.py Python + Crawl4AI — headless Chromium, markdown extraction
│
▼
The actual internetEl servidor TypeScript controla la política: tiempos de espera, permisos de concurrencia, truncamiento de salida, resumen opcional impulsado por Gemini. El worker Python controla la mecánica: ciclo de vida del navegador, renderizado, reintentos. Ninguno conoce el trabajo del otro, y el contrato entre ellos es un documento JSON en stdout.
Related MCP server: crawler-mcp
Instalación
Requisitos: Bun, Python 3.12+ y una cantidad de paciencia independiente de la GPU para la primera descarga del navegador.
git clone <this repo> ~/.local/share/mcp/fast-webfetch-mcp # or anywhere
cd ~/.local/share/mcp/fast-webfetch-mcp
bun install
uv venv .venv --python 3.12 && uv pip install --python .venv/bin/python crawl4aiVerifica que el lado del navegador funciona:
FAST_WEBFETCH_SMOKE_URL=https://example.com bun run src/index.tsDeberías ver Markdown para el dominio de ejemplo. Si en su lugar ves un stack trace sobre los navegadores de Playwright, ejecuta crawl4ai-setup desde el venv e inténtalo de nuevo: instala la compilación correcta de Chromium para ti.
Conéctalo a tu agente
{
"mcpServers": {
"fast-webfetch": {
"type": "stdio",
"command": "/usr/bin/mullvad-exclude",
"args": ["/home/you/.bun/bin/bun", "run", "/path/to/fast-webfetch-mcp/src/index.ts"],
"env": { "PATH": "/home/you/.bun/bin:/usr/bin:/bin" }
}
}
}El envoltorio mullvad-exclude es opcional; solo permite que el tráfico de captura evite una VPN para que los sitios vean tu IP real. Un simple "command": "bun" funciona de manera idéntica.
Herramientas
fast_fetch — una URL a Markdown
Argumento | Tipo | Predeterminado | Notas |
| string | requerido | |
| string | — | Si se establece, una respuesta fundamentada en lugar de la página completa |
| number | 40,000 | El truncamiento medio conserva cabeza y cola |
| boolean | false | Eleva el límite a 100,000 caracteres |
| number | 25,000 | Límite máximo, incluye el renderizado del navegador |
| object | — | Ajustes de renderizado por llamada, ver más abajo |
fast_fetch_raw — una URL a HTML crudo
Mismos argumentos menos prompt. Úsalo cuando Markdown pierde lo que necesitas: tablas, atributos data-, metaetiquetas, marcado exacto.
El objeto options
Las tres herramientas aceptan un objeto options opcional para sitios que necesitan más que una simple carga y captura:
{
"url": "https://example.com/feed",
"options": { "full_page": true, "wait_seconds": 1.5, "drop_overlays": true }
}Clave | Tipo | Efecto |
| boolean | Desplaza toda la página antes de la extracción: captura contenido de carga diferida y scroll infinito. Más lento; en feeds interminables se desplaza hasta el tiempo de espera |
| number | Retraso de asentamiento antes de la captura, p. ej. |
| boolean | Incluye el contenido de iframes en el resultado |
| boolean | Elimina banners de cookies y modales antes de la extracción |
Las claves mal escritas se descartan silenciosamente en lugar de pasarse: la carga útil de opciones se convierte en banderas de CrawlerRunConfig en el lado de Python.
fast_fetch_multiple — hasta 15 URLs en un lote
Argumento | Tipo | Predeterminado | Notas |
| string[] | requerido | 1–15 URLs absolutas http(s) |
| number | 40,000 | Por URL |
| boolean | false | Por URL |
| number | 25,000 | Lote completo, compartido |
| object | — | Mismos ajustes, aplicados a cada URL |
Cada URL regresa como su propia sección con un encabezado de metadatos (url, status, elapsed_ms, truncated). Un sitio lento no puede privar a los demás: solo recibe un error de tiempo de espera por elemento mientras sus compañeros de lote tienen éxito.
Configuración
Todo opcional, todas variables de entorno.
Ajustes del servidor
Variable | Predeterminado | Propósito |
|
| Límite de caracteres por página predeterminado |
|
| Tope para |
|
| Tiempo de espera de captura predeterminado |
|
| Ranuras de navegador en paralelo (máx. 32) |
| sin establecer |
|
|
| Intérprete del worker |
|
| Ruta del worker |
| — | Solo necesario para el resumen con |
Ajustes del navegador
Variable | Predeterminado | Propósito |
| activado ( | Parches de detección anti-headless: bandera de webdriver, plugins, proveedor de WebGL, APIs de Chrome. Establece |
| desactivado | Proxy para el tráfico de salida |
|
| Estrategia de espera de Playwright |
| desactivado | Desplazar antes de la extracción: también disponible por llamada como |
|
| Tiempo de asentamiento antes de la captura de HTML: también por llamada como |
Comportamiento que vale la pena conocer
Los sitios con mucho JavaScript a menudo devuelven una cáscara vacía bajo la estrategia de espera predeterminada. Cuando llega un 200 sin contenido, el worker reintenta una vez con networkidle, dentro del mismo presupuesto de tiempo: en el peor caso esperas una vez, no dos. Los fallos de conexión y los errores HTTP, mientras tanto, permanecen con un solo intento: reintentar un host muerto es solo una forma más lenta de fallar.
fast_fetch y fast_fetch_multiple se alimentan del mismo grupo de 12 ranuras de navegador, por lo que un lote grande no puede privar a una captura única concurrente. La demanda más allá del grupo se pone en cola; un lote que pide más ranuras de las que existen obtiene lo que está libre.
Finalmente, max_length existe porque la ventana de contexto de tu agente es un presupuesto, no un vertedero.
Cuando algo se rompe, obtienes una ruta de registro
Los fallos se clasifican en dos montones: que internet sea inestable (tiempos de espera, sitios lentos, errores de plazo por elemento en lotes) y que la herramienta realmente se rompa (el worker no se inicia, el worker se bloquea, desbordamiento de stdout, salida no analizable). Solo el segundo montón escribe un registro: el primero solo recibe una etiqueta de error honesta.
Un fallo del lado de la herramienta termina con:
log: /path/to/fast-webfetch-mcp/logs/2026-08-22T09-02-06-780Z-fast_fetch.jsonDentro: la herramienta, argumentos exactos, entrada del worker y el registro completo del fallo (etapa, código de salida, señal, cola de stderr), suficiente para reproducir la solicitud textualmente:
FAST_WEBFETCH_INPUT='{"url":"https://example.com","max_length":40000}' \
.venv/bin/python crawl4ai_worker.pyRedirige con FAST_WEBFETCH_LOGS_DIR.
Mantenerse por debajo de 30 segundos
Los entornos de agentes tienden a matar las llamadas MCP alrededor de la marca de 30 segundos, por lo que este servidor trata 28s como el muro duro. Cada herramienta responde antes: resultados terminados si la captura llegó a buen puerto, de lo contrario errores estructurados por elemento que indican qué etapa consumió el tiempo. Un lote que se queda sin presupuesto aún devuelve los elementos que terminaron.
Solución de problemas
Síntoma | Causa probable y solución |
| El repositorio se movió; verifica que |
| Falta |
Todo agota el tiempo en un sitio | El sitio es genuinamente lento u hostil; prueba |
| Esperado: presupuesto compartido de 25s, los rezagados reciben errores por elemento |
Markdown vacío en SPAs | Debería auto-repararse mediante reintento; si no, aumenta |
Desarrollo
bun install
bun test # 18 tests, no network needed
bun run typecheck # tsc --noEmit, strict + noUncheckedIndexedAccessEl worker Python se puede ejecutar directamente, que es la forma más rápida de depurar el comportamiento de captura sin la capa MCP:
FAST_WEBFETCH_INPUT='{"url":"https://example.com","max_length":500}' \
.venv/bin/python crawl4ai_worker.pyVer también
ddg-search — el front-end natural: busca y luego entrega las URLs de resultados a este servidor
Crawl4AI — el motor de rastreo subyacente
Model Context Protocol — el protocolo de cable
Licencia
MIT.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server that lets Claude Code fetch web content using real Chrome browsers. Renders JavaScript-heavy pages, handles bot mitigation, and runs up to 14 parallel browsers locally with zero API keys. Makes outbound HTTP requests only to URLs the user explicitly asks Claude to fetch.21491MIT
- FlicenseAqualityCmaintenanceWeb-crawler MCP server that fetches web pages with static parsing or headless browser fallback, enabling Claude to fetch, extract links, crawl sites, and select content via CSS selectors.4
- AlicenseAqualityCmaintenanceAn MCP server that enables AI assistants to fetch web content in multiple formats (HTML, JSON, text, Markdown) with intelligent content extraction, chunk management, and browser automation support.55215MIT
- AlicenseNot gradedqualityBmaintenanceAn open-source web retrieval MCP server that fetches, crawls, and searches the web, returning clean markdown for AI agents. It integrates with Claude MCP, LangChain, and other frameworks for agentic web access.1MIT
Related MCP Connectors
Zenrows MCP server — Fetch, Extract, Batch, and Browser Sessions for AI coding assistants
Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/NikkeTryHard/fast-webfetch-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server