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.

intercept-mcp MCP server

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ónManejadorLo que obtienes
twitter.com/*/status/*, x.com/*/status/*Twitter/XTexto del tweet, autor, medios, estadísticas de interacción (vía APIs de terceros)
youtube.com/watch?v=*, youtu.be/*YouTubeTítulo, canal, duración, vistas, descripción, transcripción (cuando hay subtítulos disponibles)
arxiv.org/abs/*, arxiv.org/pdf/*arXivMetadatos del artículo, autores, resumen, categorías
*.pdfPDFTexto extraído (solo PDFs con capa de texto)
*.wikipedia.org/wiki/*WikipediaContenido limpio del artículo vía API REST de Wikimedia
github.com/{owner}/{repo}GitHubContenido crudo del README.md
github.com/{o}/{r}/blob/{ref}/{path}GitHubContenido crudo del archivo, con bloques de código según el lenguaje
github.com/{o}/{r}/issues/{n}, /pull/{n}GitHubTítulo de issue/PR, estado, cuerpo, estadísticas de diff, comentarios (vía API de GitHub)
github.com/{o}/{r}/releases/tag/{t}, /releases/latestGitHubNotas 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:

NivelBuscadorEstrategia
0agentsweb.orgCaché global compartida de markdown — instantáneo si otro agente ya obtuvo esta URL
1Cloudflare Browser RunRenderizado JS/SPA + extracción de markdown — también impulsa agentsweb.org (opcional, necesita token API)
1Jina ReaderServicio limpio de extracción de markdown
2Wayback MachineVersión archivada de archive.org
2Arquivo.ptArchivo web portugués (amplia cobertura internacional)
2Common CrawlArchivo 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
2CodetabsProxy CORS
3Endpoint de markdownSolicita al sitio una versión nativa de markdown (<path>.md + Accept: text/markdown)
3archive.phInstantáneas archivadas vía API timemap + búsqueda TLS sigilosa
3Búsqueda crudaGET directo con cabeceras de navegador + conversión a markdown con Turndown
3Búsqueda sigilosaSuplantación de huella TLS de navegador vía got-scraping (opt-in, ver abajo)
3FlareSolverrSolucionador de desafíos con navegador real para Cloudflare/DDoS-Guard (opt-in, necesita una instancia de FlareSolverr)
3Desbloqueador webAPI comercial de desbloqueo — rotación residencial + renderizado + CAPTCHA (opt-in, trae tu propia clave, pago por solicitud)
4RSS, CrossRef, Semantic Scholar, HN, RedditRespaldo de metadatos / discusión
5OG MetaEtiquetas 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 obtener
  • maxTier (número, opcional, 1-5) — Detente en este nivel para casos sensibles a la velocidad
  • maxLength (número, opcional, predeterminado 50000) — Máximo de caracteres a devolver
  • startIndex (número, opcional, predeterminado 0) — Desplazamiento de caracteres para paginar contenido largo
  • noCache (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 obtener
  • maxTier, noCache — como en fetch
  • maxLength (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úsqueda
  • count (número, opcional, 1-5, predeterminado 3) — Resultados a obtener
  • maxLength (número, opcional, predeterminado 20000) — Presupuesto de caracteres por resultado
  • site (cadena, opcional) — Restringir a un dominio
  • freshness (cadena, opcional) — day, week, month o year

search

Busca en la web y devuelve resultados.

  • query (cadena, obligatorio) — Consulta de búsqueda
  • count (número, opcional, 1-20, predeterminado 5) — Número de resultados
  • site (cadena, opcional) — Restringir resultados a un dominio
  • freshness (cadena, opcional) — day, week, month o year
  • page (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 extraer
  • selectors (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? } — attr extrae un atributo (p. ej. href), all: true devuelve 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 dan selectors).
{
  "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 investigar
  • depth (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

VariableObligatoriaDescripción
BRAVE_API_KEYNoClave de API de Brave Search para búsqueda
SEARXNG_URLNoURL de instancia SearXNG autoalojada (recomendado)
GITHUB_TOKENNoToken de GitHub que aumenta los límites de tasa de API para el manejador de issues/PR/releases
INTERCEPT_AUTHNoMapa JSON de dominio → cabeceras/cookies, para obtener contenido al que has iniciado sesión (ver Autenticación por dominio)
CF_API_TOKENNoToken API de Cloudflare con permiso "Browser Rendering - Edit"
CF_ACCOUNT_IDNoID de cuenta de Cloudflare (obligatorio si CF_API_TOKEN está configurado)
USE_STEALTH_FETCHNoConfigúralo a true para habilitar el buscador sigiloso (ver advertencia abajo)
FLARESOLVERR_URLNoURL de una instancia de FlareSolverr (p. ej. http://localhost:8191) para resolver desafíos de Cloudflare/DDoS-Guard
WEB_UNLOCKER_URLNoPlantilla 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_CACHENoConfigúralo a false para deshabilitar la caché compartida de agentsweb.org
INTERCEPT_CACHE_READ_ONLYNoConfigúralo a true para consumir pero nunca contribuir a la caché compartida
INTERCEPT_CACHE_TTL_MSNoTTL de caché en memoria para búsquedas exitosas en ms (predeterminado 3600000 = 60 min)
INTERCEPT_CACHE_FAILURE_TTL_MSNoTTL de caché en memoria para búsquedas fallidas en ms (predeterminado 300000 = 5 min)
INTERCEPT_CACHE_SIZENoMáximo de entradas de caché en memoria (predeterminado 250)
HTTPS_PROXY / HTTP_PROXYNoPaso estándar de proxy — enruta todas las búsquedas salientes (incluida la sigilosa) a través del proxy. Respeta NO_PROXY.
INTERCEPT_PROXIESNoLista 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