Intercept
Dale a tu IA la capacidad de leer la web. Obtiene URLs como markdown limpio con 9 estrategias de respaldo. Maneja tweets, YouTube, arXiv, PDFs y páginas regulares.
Documentación
intercept-mcp
Dale a tu IA la capacidad de leer la web. Un solo comando, sin necesidad de claves API.
Sin él, tu IA accede a una URL y recibe un 403, un muro, o un muro de HTML crudo. Con intercept, casi siempre obtiene el contenido — markdown limpio, listo para usar.
Maneja tweets, videos de YouTube (con transcripciones cuando están disponibles), artículos de arXiv, PDFs, artículos de Wikipedia y repositorios de GitHub. Si la primera estrategia falla, intenta hasta 14 más antes de rendirse.
Funciona con cualquier cliente MCP: Claude Code, Claude Desktop, Codex, Cursor, Windsurf, Cline y más.
Instalación
Claude Code
claude mcp add intercept -s user -- npx -y intercept-mcp
Codex
codex mcp add intercept -- npx -y intercept-mcp
Cursor
Configuración → MCP → Añadir servidor:
{
"mcpServers": {
"intercept": {
"command": "npx",
"args": ["-y", "intercept-mcp"]
}
}
}
Windsurf
Configuración → MCP → Añadir servidor → misma configuración JSON que arriba.
Claude Desktop
Añade a tu claude_desktop_config.json:
{
"mcpServers": {
"intercept": {
"command": "npx",
"args": ["-y", "intercept-mcp"]
}
}
}
Otros clientes MCP
Cualquier cliente que soporte servidores MCP stdio puede ejecutar npx -y intercept-mcp.
No se necesitan claves API para la herramienta fetch.
Cómo funciona
Las URLs se procesan en cuatro etapas:
1. Manejadores específicos por sitio
Los patrones de URL conocidos se enrutan a manejadores dedicados antes del pipeline de respaldo:
| Patrón | Manejador | Lo que obtienes |
|---|---|---|
twitter.com/*/status/*, x.com/*/status/* | Twitter/X | Texto del tweet, autor, medios, estadísticas de interacción (vía APIs de terceros) |
youtube.com/watch?v=*, youtu.be/* | YouTube | Título, canal, duración, vistas, descripción, transcripción (cuando hay subtítulos disponibles) |
arxiv.org/abs/*, arxiv.org/pdf/* | arXiv | Metadatos del artículo, autores, resumen, categorías |
*.pdf | Texto extraído (solo PDFs con capa de texto) | |
*.wikipedia.org/wiki/* | Wikipedia | Contenido limpio del artículo vía API REST de Wikimedia |
github.com/{owner}/{repo} | GitHub | Contenido crudo del README.md |
github.com/{o}/{r}/blob/{ref}/{path} | GitHub | Contenido crudo del archivo, con bloques de código según el lenguaje |
github.com/{o}/{r}/issues/{n}, /pull/{n} | GitHub | Título de issue/PR, estado, cuerpo, estadísticas de diff, comentarios (vía API de GitHub) |
github.com/{o}/{r}/releases/tag/{t}, /releases/latest | GitHub | Notas de versión (vía API de GitHub) |
Los endpoints de la API de GitHub funcionan sin autenticación (60 solicitudes/hora). Configura GITHUB_TOKEN para aumentar el límite.
2. Caché compartida (agentsweb.org)
Antes de usar cualquier buscador, cada solicitud consulta agentsweb.org — una caché global compartida de markdown para agentes de IA respaldada por un pipeline de búsqueda paralela de 9 fuentes con renderizado JS/SPA (React, Vue, Angular vía Cloudflare Browser Run). Si otro agente ya obtuvo esta URL, recibes el resultado en menos de 50 ms.
Cada búsqueda exitosa contribuye automáticamente. Las entradas ganan confianza mediante un modelo de consenso auto-reparable: cuando instancias independientes obtienen la misma URL y confirman el mismo contenido, la confianza aumenta.
Exclúyete por completo con INTERCEPT_SHARED_CACHE=false, o usa el modo de solo lectura (consumir pero nunca contribuir) con INTERCEPT_CACHE_READ_ONLY=true.
API de agentsweb.org
agentsweb.org también expone endpoints independientes para uso directo:
/web?q=— buscar en la web/research?q=— buscar + obtener + almacenar en caché en una sola llamada/fetch?url=— obtener bajo demanda, con caché automática
Consulta agentsweb.org/docs para la documentación completa de la API.
3. Pipeline de respaldo
Si ningún manejador coincide (o el manejador no devuelve nada), la URL entra al pipeline de múltiples niveles:
| Nivel | Buscador | Estrategia |
|---|---|---|
| 0 | agentsweb.org | Caché global compartida de markdown — instantáneo si otro agente ya obtuvo esta URL |
| 1 | Cloudflare Browser Run | Renderizado JS/SPA + extracción de markdown — también impulsa agentsweb.org (opcional, necesita token API) |
| 1 | Jina Reader | Servicio limpio de extracción de markdown |
| 2 | Wayback Machine | Versión archivada de archive.org |
| 2 | Arquivo.pt | Archivo web portugués (amplia cobertura internacional) |
| 2 | Common Crawl | Archivo web de petabytes leído desde el índice de Common Crawl + S3 — no sujeto a los límites de tasa del origen, detección de bots o muros de pago |
| 2 | Codetabs | Proxy CORS |
| 3 | Endpoint de markdown | Solicita al sitio una versión nativa de markdown (<path>.md + Accept: text/markdown) |
| 3 | archive.ph | Instantáneas archivadas vía API timemap + búsqueda TLS sigilosa |
| 3 | Búsqueda cruda | GET directo con cabeceras de navegador + conversión a markdown con Turndown |
| 3 | Búsqueda sigilosa | Suplantación de huella TLS de navegador vía got-scraping (opt-in, ver abajo) |
| 3 | FlareSolverr | Solucionador de desafíos con navegador real para Cloudflare/DDoS-Guard (opt-in, necesita una instancia de FlareSolverr) |
| 3 | Desbloqueador web | API comercial de desbloqueo — rotación residencial + renderizado + CAPTCHA (opt-in, trae tu propia clave, pago por solicitud) |
| 4 | RSS, CrossRef, Semantic Scholar, HN, Reddit | Respaldo de metadatos / discusión |
| 5 | OG Meta | Etiquetas Open Graph (respaldo garantizado) |
Los buscadores del nivel 2 se ejecutan en paralelo. Cuando varios tienen éxito, gana el resultado de mayor calidad. Todos los demás niveles se ejecutan secuencialmente.
Todos los buscadores devuelven Markdown adecuado (encabezados, enlaces, negritas, tablas, bloques de código) vía Turndown — no texto plano.
4. Almacenamiento en caché
Los resultados se almacenan en caché en memoria con TTL (60 min para éxitos, 5 min para fallos). Máximo 250 entradas con evicción LRU. Las URLs fallidas se almacenan en caché para evitar reintentar URLs conocidas como muertas. Los tres parámetros son configurables vía INTERCEPT_CACHE_TTL_MS, INTERCEPT_CACHE_FAILURE_TTL_MS y INTERCEPT_CACHE_SIZE.
Herramientas
fetch
Obtiene una URL y devuelve su contenido como markdown limpio.
url(cadena, obligatorio) — URL a obtenermaxTier(número, opcional, 1-5) — Detente en este nivel para casos sensibles a la velocidadmaxLength(número, opcional, predeterminado 50000) — Máximo de caracteres a devolverstartIndex(número, opcional, predeterminado 0) — Desplazamiento de caracteres para paginar contenido largonoCache(booleano, opcional) — Omitir cachés de sesión y compartidas y obtener en vivo
Las páginas largas se truncan en maxLength con un aviso que indica al agente qué startIndex continúa el contenido. La salida estructurada informa source, quality, contentLength, truncated, nextStartIndex y cacheAgeSeconds para que los agentes puedan ramificar programáticamente.
Las URLs de imágenes directas (.png, .jpg, .gif, .webp, hasta 5 MB) se devuelven como un bloque de imagen MCP en lugar de texto, para que el modelo de visión del propio agente pueda leer gráficos, diagramas, capturas de pantalla y documentos escaneados. La salida estructurada informa source: "image", mimeType y bytes.
fetch_batch
Obtiene hasta 10 URLs en paralelo, cada una a través de la misma cadena de manejador/respaldo.
urls(cadena[], obligatorio, 1-10) — URLs a obtenermaxTier,noCache— como enfetchmaxLength(número, opcional, predeterminado 20000) — Presupuesto de caracteres por URL
research
Busca en la web y obtiene los mejores resultados en una sola llamada — reemplaza una búsqueda seguida de varias búsquedas.
query(cadena, obligatorio) — Consulta de búsquedacount(número, opcional, 1-5, predeterminado 3) — Resultados a obtenermaxLength(número, opcional, predeterminado 20000) — Presupuesto de caracteres por resultadosite(cadena, opcional) — Restringir a un dominiofreshness(cadena, opcional) —day,week,monthoyear
search
Busca en la web y devuelve resultados.
query(cadena, obligatorio) — Consulta de búsquedacount(número, opcional, 1-20, predeterminado 5) — Número de resultadossite(cadena, opcional) — Restringir resultados a un dominiofreshness(cadena, opcional) —day,week,monthoyearpage(número, opcional, 1-10) — Página de resultados para paginación
Usa la API de Brave Search si BRAVE_API_KEY está configurado, luego SearXNG si SEARXNG_URL está configurado, luego DuckDuckGo como último recurso poco fiable. freshness y page son ignorados por el respaldo de DuckDuckGo.
extract
Extrae valores específicos de una página como JSON en lugar de prosa markdown — para cuando necesitas datos particulares, no la página completa. Respeta la autenticación y los proxies por dominio.
url(cadena, obligatorio) — La URL de la que extraerselectors(objeto, opcional) — Mapa de nombre de campo → selector CSS. Cada valor es una cadena de selector (devuelve el texto de la primera coincidencia) o{ selector, attr?, all? }—attrextrae un atributo (p. ej.href),all: truedevuelve cada coincidencia como un array.tables(booleano, opcional) — Convierte cada tabla HTML en un array de objetos de fila (predeterminado a true cuando no se danselectors).
{
"url": "https://shop.example.com/item",
"selectors": {
"title": "h1",
"price": ".price",
"images": { "selector": "img.gallery", "attr": "src", "all": true }
}
}
Devuelve los fields y/o tables extraídos como salida estructurada.
Recursos
intercept://session/recent
Lista markdown de URLs obtenidas y almacenadas en caché en esta sesión, más recientes primero. Volver a obtener cualquiera de ellas es instantáneo.
Prompts
research-topic
Busca un tema y obtiene los mejores resultados para un resumen de múltiples fuentes.
topic(cadena) — El tema a investigardepth(cadena, predeterminado "3") — Número de mejores resultados a obtener
extract-article
Obtiene una URL y extrae los puntos clave del contenido.
url(cadena) — La URL a obtener y resumir
Variables de entorno
| Variable | Obligatoria | Descripción |
|---|---|---|
BRAVE_API_KEY | No | Clave de API de Brave Search para búsqueda |
SEARXNG_URL | No | URL de instancia SearXNG autoalojada (recomendado) |
GITHUB_TOKEN | No | Token de GitHub que aumenta los límites de tasa de API para el manejador de issues/PR/releases |
INTERCEPT_AUTH | No | Mapa JSON de dominio → cabeceras/cookies, para obtener contenido al que has iniciado sesión (ver Autenticación por dominio) |
CF_API_TOKEN | No | Token API de Cloudflare con permiso "Browser Rendering - Edit" |
CF_ACCOUNT_ID | No | ID de cuenta de Cloudflare (obligatorio si CF_API_TOKEN está configurado) |
USE_STEALTH_FETCH | No | Configúralo a true para habilitar el buscador sigiloso (ver advertencia abajo) |
FLARESOLVERR_URL | No | URL de una instancia de FlareSolverr (p. ej. http://localhost:8191) para resolver desafíos de Cloudflare/DDoS-Guard |
WEB_UNLOCKER_URL | No | Plantilla GET (con un marcador de posición {url} y tu clave API) para un desbloqueador web comercial como ScrapingBee/ScraperAPI/ZenRows — el último recurso de pago para los sitios más difíciles |
INTERCEPT_SHARED_CACHE | No | Configúralo a false para deshabilitar la caché compartida de agentsweb.org |
INTERCEPT_CACHE_READ_ONLY | No | Configúralo a true para consumir pero nunca contribuir a la caché compartida |
INTERCEPT_CACHE_TTL_MS | No | TTL de caché en memoria para búsquedas exitosas en ms (predeterminado 3600000 = 60 min) |
INTERCEPT_CACHE_FAILURE_TTL_MS | No | TTL de caché en memoria para búsquedas fallidas en ms (predeterminado 300000 = 5 min) |
INTERCEPT_CACHE_SIZE | No | Máximo de entradas de caché en memoria (predeterminado 250) |
HTTPS_PROXY / HTTP_PROXY | No | Paso estándar de proxy — enruta todas las búsquedas salientes (incluida la sigilosa) a través del proxy. Respeta NO_PROXY. |
INTERCEPT_PROXIES | No | Lista separada por comas/espacios de proxies HTTP(S) para rotar, con reintento automático a través del siguiente proxy en una respuesta bloqueada. Tiene prioridad sobre HTTPS_PROXY. |
Búsqueda: Tiene un respaldo de DuckDuckGo pero está limitado por tasa y es poco fiable. Para uso en producción, autoaloja SearXNG y configura SEARXNG_URL (ver abajo), u obtén una clave de API de Brave Search.
Búsqueda: Funciona sin ninguna clave. Configura CF_API_TOKEN + CF_ACCOUNT_ID para habilitar Cloudflare Browser Run (anteriormente Browser Rendering) para páginas con mucho JavaScript (SPAs, sitios React).
Búsqueda sigilosa (USE_STEALTH_FETCH)
Úselo bajo su propio riesgo. Cuando está habilitado, añade un fetcher que suplanta las huellas TLS de navegadores reales (conjuntos de cifrado de Chrome/Firefox, configuración HTTP/2, orden de cabeceras) usando got-scraping. Esto puede evadir la detección de bots y los disparadores de CAPTCHA en sitios que de otro modo bloquearían las solicitudes automatizadas.
Este fetcher se ejecuta en el nivel 3 después del fetch directo normal. Si el fetch directo es bloqueado (CAPTCHA, desafío de Cloudflare, 403), el fetcher sigiloso reintenta con suplantación de navegador.
Esto puede violar los términos de servicio de algunos sitios web. Los autores de intercept-mcp no asumen ninguna responsabilidad por el uso de esta función. Está deshabilitada por defecto y debe activarse explícitamente.
Resolución de desafíos (FLARESOLVERR_URL)
El fetcher sigiloso suplanta la huella TLS de un navegador, pero no puede ejecutar un desafío JavaScript — por lo que los sitios protegidos por un intersticial de Cloudflare "Comprobando su navegador" / DDoS-Guard siguen bloqueándolo. FlareSolverr ejecuta un navegador real sin interfaz que resuelve el desafío y devuelve el HTML de la página.
Ejecútelo (Docker):
docker run -d -p 8191:8191 ghcr.io/flaresolverr/flaresolverr:latest
Luego establezca FLARESOLVERR_URL=http://localhost:8191. Se ejecuta en el nivel 3 como último recurso después de los fetchers directo y sigiloso, y solo cuando esta variable está establecida. Resolver un desafío puede tardar 30–60 s, por lo que es el fetcher más lento — pero recupera páginas que nada más puede.
Desbloqueador web comercial (WEB_UNLOCKER_URL)
Para los objetivos más difíciles — sitios que necesitan rotación de IP residencial y renderizado de navegador real y manejo de CAPTCHA a la vez — un desbloqueador comercial es la respuesta pragmática. intercept-mcp admite cualquier desbloqueador que exponga un endpoint de "obtén esta URL, devuelve el HTML", mediante una plantilla con un marcador de posición {url} que contiene su clave API:
# ScrapingBee
WEB_UNLOCKER_URL='https://app.scrapingbee.com/api/v1/?api_key=KEY&render_js=true&url={url}'
# ScraperAPI
WEB_UNLOCKER_URL='https://api.scraperapi.com/?api_key=KEY&render=true&url={url}'
# ZenRows
WEB_UNLOCKER_URL='https://api.zenrows.com/v1/?apikey=KEY&js_render=true&url={url}'
intercept sustituye el objetivo (codificado en URL) por {url} y convierte el HTML devuelto (o JSON que lo envuelve) a markdown. Se ejecuta en el nivel 3 como último recurso de pago después de los fetchers gratuitos, solo cuando esta variable está establecida — y sus credenciales en la plantilla solo se envían al desbloqueador, nunca al objetivo. El Web Unlocker basado en proxy de Bright Data es solo un proxy autenticado, así que use HTTPS_PROXY / INTERCEPT_PROXIES para eso en su lugar. Esto factura por solicitud.
Traiga su propio proxy (HTTPS_PROXY)
Si los fetches directos empiezan a ser marcados, la solución más efectiva suele ser una IP de salida limpia — no una huella más sofisticada. intercept-mcp respeta las variables de entorno estándar HTTPS_PROXY / HTTP_PROXY / NO_PROXY, por lo que puede enrutar todo el tráfico saliente a través del proxy que ya tenga:
HTTPS_PROXY=http://user:pass@proxy.example.com:8080 npx intercept-mcp
Esto funciona con cualquier proxy HTTP(S) — un Squid autoalojado, un nodo de salida de Tailscale, un VPS de $5 ejecutando 3proxy, o proxies residenciales comerciales (Bright Data, Oxylabs, etc.). El fetcher sigiloso y las llamadas a got-scraping también lo detectan automáticamente.
Rotación de proxy (INTERCEPT_PROXIES)
Un solo proxy sigue presentando una sola IP, que puede ser marcada bajo carga. Establezca INTERCEPT_PROXIES a una lista separada por comas o espacios e intercept-mcp alterna entre ellos, reintentando automáticamente a través del siguiente proxy cuando una solicitud vuelve bloqueada (HTTP 403, 429, 451, 503) o con errores:
INTERCEPT_PROXIES="http://user:pass@p1.example.com:8080,http://user:pass@p2.example.com:8080,http://p3.example.com:8080" npx intercept-mcp
Las solicitudes se distribuyen por la lista, y una respuesta bloqueada se reintenta a través de una salida diferente (hasta 3 intentos) antes de rendirse — así que un puñado de proxies baratos, o un endpoint residencial rotatorio listado varias veces, se comportan como un grupo. INTERCEPT_PROXIES tiene prioridad sobre HTTPS_PROXY, se aplica por solicitud (por lo que las llamadas sigilosas y de archive.ph got-scraping también rotan), y acepta proxies HTTP(S). Las entradas inválidas se ignoran.
Autenticación por dominio (INTERCEPT_AUTH)
La mayor parte de la web está detrás de un inicio de sesión. INTERCEPT_AUTH le permite adjuntar sus propias cabeceras o cookies a las solicitudes para un origen específico, de modo que las herramientas de fetch puedan leer contenido al que está legítimamente conectado — una suscripción de pago, un panel privado, una intranet, una API autenticada.
Es un objeto JSON que mapea un dominio a un mapa de cabeceras. Un dominio también coincide con sus subdominios:
INTERCEPT_AUTH='{
"nytimes.com": { "Cookie": "nyt-s=...; nyt-a=..." },
"api.acme.com": { "Authorization": "Bearer eyJ..." }
}' npx intercept-mcp
Para obtener una cookie: abra el sitio con sesión iniciada, abra DevTools → Red, copie la cabecera de solicitud Cookie de cualquier solicitud a ese dominio.
Modelo de seguridad — léalo antes de usarlo
- Las credenciales solo van al origen configurado. Las cabeceras se asignan al host real que se contacta. Cuando intercept obtiene una página a través de Jina, un archivo web, un proxy CORS, FlareSolverr o la caché compartida, esos intermediarios se conectan a un host diferente, por lo que su cookie/token nunca se les envía — solo un fetch directo del origen la lleva.
- Las respuestas autenticadas nunca tocan la caché compartida. Cuando una solicitud coincide con una entrada de
INTERCEPT_AUTH, intercept no lee ni escribe en la caché pública de agentsweb.org para esa URL — por lo que su contenido privado/de pago nunca se publica, y siempre obtiene su vista autenticada en lugar de una copia anónima de un extraño. (La caché de sesión en proceso sigue aplicándose.) - Trate el valor como un secreto. Contiene tokens de sesión activos. Las variables de entorno son visibles para el proceso y sus hijos y pueden capturarse en el historial del shell o en listados de procesos — prefiera un gestor de secretos o un archivo de entorno no versionado, y nunca lo confirme en el repositorio. Las cookies caducan, por lo que deberá actualizarlas periódicamente.
- Usted es responsable del uso autorizado. Solo proporcione credenciales para cuentas que posea o que tenga permiso de usar, y respete los términos de servicio de cada sitio. intercept simplemente reenvía las cabeceras que usted proporciona.
Autoalojamiento de SearXNG
Para una búsqueda fiable, autoaloje SearXNG con Docker. Se incluye una configuración en el repositorio:
git clone https://github.com/bighippoman/intercept-mcp.git
cd intercept-mcp/searxng && docker compose up -d
Luego establezca SEARXNG_URL=http://localhost:8888. Sin límites de tasa, sin CAPTCHAs, agrega Google + Bing + DuckDuckGo + Wikipedia + Brave.
O use cualquier instancia SearXNG existente — solo establezca SEARXNG_URL a su URL.
Normalización de URL
Las URL entrantes se limpian automáticamente:
- Elimina más de 60 parámetros de seguimiento (UTM, IDs de clic, analítica, pruebas A/B, etc.)
- Elimina fragmentos de hash
- Actualiza a HTTPS
- Limpia artefactos AMP
- Conserva parámetros funcionales (
ref,format,page,offset,limit)
Protección SSRF
Los agentes pasan URL tomadas de contenido web no confiable, por lo que las herramientas de fetch rechazan cualquier cosa que apunte a infraestructura local o interna: rangos de bucle local e IPv4/IPv6 privados, direcciones link-local (incluido el endpoint de metadatos de nube 169.254.169.254), CGNAT, rangos multicast/reservados, y nombres de host locales (localhost, *.local, *.internal, *.home.arpa). Se verifican las IP literales, incluidas notaciones alternativas (decimal, hexadecimal) normalizadas por el analizador de URL; no se resuelve DNS, por lo que los nombres de host públicos que apuntan a IP privadas no se detectan.
Detección de calidad de contenido
Cada resultado del fetcher se puntúa por calidad. Fallo automático en:
- CAPTCHA / desafíos de Cloudflare
- Muros de inicio de sesión
- Páginas de error HTTP en el cuerpo
- Contenido de menos de 200 caracteres
Requisitos
- Node.js >= 20
- No se requieren claves API para uso básico