Saltar al contenido

CrawlForge TeamEquipo de Ingeniería

13 min de lectura

CrawlForge MCP v6.24: un servidor MCP de web scraping confiable

Un agente que lee la web solo es tan útil como la peor respuesta que le devuelven sus herramientas. Una página que vuelve medio vacía, un error que culpa a lo que no es o un enlace citado que nadie descargó cuentan igual. Entre el 29 de septiembre y el 22 de octubre publicamos 24 versiones de CrawlForge MCP, de la v6.12.1 a la v6.24.0, y casi ninguna añadió una función que pondrías en una landing page. Todas iban de una sola cosa: hacer de CrawlForge un servidor MCP de web scraping confiable, uno cuya salida un agente pueda usar sin que una persona la revise.

La mayoría de las correcciones salieron de dos barridos en vivo de las 31 herramientas contra sitios reales. El primero hizo unas 470 llamadas sobre la v6.21.1, y cada defecto lo reprodujo un segundo tester antes de corregirlo. El segundo cubrió la v6.22.3, con al menos tres sitios en vivo por herramienta. Este post es el registro de lo que cambió, agrupado según lo que cambia para ti.

Tabla de contenidos

Qué se publicó, versión a versión

VersiónFechaLa versión en una línea
v6.12.12026-09-29Reintentos de scrape_with_actions desactivados por defecto; los bytes de las capturas de pantalla quedan fuera de los resultados inline
v6.13.02026-09-29Los snapshots esperan a que la página se renderice; las llamadas por encima del límite de navegadores hacen cola en vez de fallar
v6.14.02026-09-29Los snapshots ven dentro de shadow roots e iframes; consent: "reject" responde a los banners de cookies
v6.15.02026-09-29extract_embedded_state recibe escalate, keys_only, window_state y handles de resultado
v6.16.02026-10-03Estado de Nuxt 3, SvelteKit, YouTube, Remix, Inertia y Shopify; find; cada salto de redirección pasa el filtro
v6.17.0–6.17.12026-10-03Cada navegación de una cadena de acciones se revisa en busca de muros; AWS WAF identificado; credenciales de proxy ocultas
v6.18.0–6.18.12026-10-03extract_text y extract_links reciben la escalera de escalado; los fallos silenciosos pasan a ser errores
v6.19.0–6.19.22026-10-04Calidad de salida en las herramientas de texto; pistas de error según la causa; serp_rank con profundidad 30
v6.20.0–6.20.12026-10-06 a 10-11Las rutas de archivos locales quedan fuera de los informes de uso; los clics respetan el Crawl-delay; npm audit limpio
v6.21.0–6.21.12026-10-19Búsqueda web sobre la Brave Search API; serp_rank marca los resultados señuelo; PDFs corregidos en el bundle .mcpb
v6.22.0–6.22.32026-10-19Primer barrido de las 31 herramientas: toda llamada fallida es gratis; agent debe tener fuente para las URLs que cita
v6.23.0–6.23.22026-10-21Segundo barrido y una nueva revisión de seguridad: tráfico del navegador a través de un proxy de guarda; MCP SDK 2.3.1
v6.24.02026-10-22Caché de páginas por sesión, maxAge y fallos de ruta de extract_embedded_state con indicaciones precisas

No se añadió ni renombró ninguna herramienta, y ningún precio de lista cambió. Cada línea de arriba sale del changelog del servidor, y el changelog del sitio web recoge las mismas entradas.

Las llamadas fallidas no se cobran, en ningún sitio

La mayoría de las APIs de scraping responden a la pregunta "¿se cobran las peticiones fallidas?" con una lista de códigos de estado. La respuesta de CrawlForge desde la v6.22.0 es más corta: una llamada fallida cuesta 0 credits, en el MCP server y en la API REST.

Antes de la v6.22.0, el MCP server cobraba la mitad del precio cuando había un error. Tres herramientas tenían además un problema más discreto: extract_structured, extract_with_llm y summarize_content devolvían success: false sin marcar el resultado como error, así que esas llamadas se facturaban completas y se registraban como éxitos. Ahora un fallo es cualquiera de estas tres cosas, y ninguna se factura:

  • un resultado con isError activado
  • un error lanzado
  • un cuerpo con success: false en el nivel superior

Los rechazos ya eran gratis y lo siguen siendo. Un disallow de robots.txt, un host en la lista de bloqueo, un rechazo por SSRF o un muro anti-bot que frena todos los peldaños de un escalado no cuestan nada. Desde la v6.16.0 eso cubre también las cadenas de scrape_with_actions y browser_session que nuestro propio filtro de cumplimiento detuvo a mitad de camino. El bloque _cost, que informa de lo que se cobró por una llamada, aparece ahora también en structuredContent en las herramientas que declaran un esquema de salida, no solo en el resultado de texto, así que un agente puede leer su propio gasto sin analizar prosa.

Una caché de páginas para lecturas repetidas

Los agentes vuelven a leer páginas. Un modelo hace scraping de una página para obtener markdown, decide que necesita los metadatos y luego pide un solo valor del JSON incrustado, y eso son tres descargas de la misma URL. La v6.24.0 añade una caché de páginas por sesión para que la segunda y la tercera lectura cuesten menos y dejen tranquilo al sitio.

Una petición repetida de la misma página en menos de 10 minutos reutiliza la copia ya descargada y cuesta 1 credit, pida lo que pida esta vez: otros formatos, otra ruta JSON, otros selectores. Las llamadas en paralelo para una misma página comparten una sola petición. Cubre nueve herramientas: fetch_url, scrape, extract_metadata, extract_text, extract_links, scrape_structured, extract_embedded_state, extract_structured y extract_with_llm.

Lo que nunca se guarda en caché importa tanto como lo que sí:

  • respuestas que no son 2xx, muros anti-bot y páginas de desafío
  • respuestas marcadas con Cache-Control: no-store
  • peticiones que llevan cabeceras Authorization o Cookie

Un acierto de caché sigue pasando las comprobaciones de la lista de bloqueo y de robots.txt, así que una página en caché nunca es una forma de saltarse las reglas de un sitio. El tamaño de la caché está limitado (CRAWLFORGE_PAGE_CACHE_MB, 64 por defecto; 0 la desactiva). Solo funciona en una instalación MCP local: está desactivada con --http y para las peticiones a través de la API REST.

Cuando necesites la página en vivo, dilo con maxAge (milisegundos). maxAge: 0 fuerza una descarga nueva:

Json
{
  "name": "scrape",
  "arguments": {
    "url": "https://example.com/pricing",
    "formats": ["markdown"],
    "maxAge": 0
  }
}

Cada resultado de esas nueve herramientas lleva cache: { state, fetchedAt, ageMs, note }, así que el agente sabe si está mirando una copia de hace 3 segundos o una recién descargada.

Dos barridos en vivo hacia un servidor MCP de web scraping confiable

Las correcciones de scrape y crawl_deep de abajo son una muestra; el changelog tiene la lista completa. Lo que tienen en común es que cada una convirtió una respuesta incorrecta presentada como éxito en una respuesta correcta o en un error honesto.

Texto que se lee como la página

  • Las páginas de listas conservan su texto. Readability tomaba al autor de un elemento de la lista por la firma del artículo, así que quotes.toscrape.com perdía "by Albert Einstein". Una página de lista en la que la extracción del contenido principal conserva menos del 60% del texto visible ahora recurre a la página completa. Esto llega a scrape, extract_content, batch_scrape, crawl_deep y scrape_with_actions.
  • Los bloques ya no se sueldan entre sí. Un único aplanador de texto compartido sustituyó a varios, así que "July 2023If you…" se lee como dos líneas, y los enlaces escritos uno detrás de otro tienen cada uno su propia línea.
  • Los bloques de código salen delimitados, con su lenguaje. El código de Sphinx en docs.python.org volvía como prosa escapada.
  • Wikipedia conserva los encabezados de sus secciones y descarta los enlaces "[edit]".

Rastreos que terminan y cuentan con honestidad

  • crawl_deep resuelve los enlaces respecto a la página en la que terminó. docs.python.org/3/tutorial redirige a /3/tutorial/, y cada enlace a un capítulo se resolvía un nivel por encima y devolvía 404.
  • El análisis de enlaces ya no bloquea el servidor. En una página de 7.3 MB con 16 766 enlaces tardaba 50 segundos y dejaba sin recursos a todas las demás llamadas. Ahora tarda 0.5 segundos.
  • crawl_deep se detiene en max_pages. Antes vaciaba primero todos los enlaces en cola: 232 segundos para 3 páginas en un sitio.
  • map_site incluye la URL de inicio, así que un sitio de una sola página devuelve 1 URL, no 0.

Extracción que dice lo que no pudo encontrar

  • extract_structured devuelve todos los campos que pediste. Un valor que no encuentra es null y aparece en un nuevo array missing_fields, en lugar de que el campo desaparezca sin avisar.
  • analyze_content deja de puntuar otros idiomas con fórmulas del inglés. Un texto en español había puntuado una queja clara con −0.08. El sentimiento usa ahora el léxico AFINN-165 con negación para el inglés, y devuelve not_applicable para otros idiomas, como ya hacía la legibilidad.
  • summarize_content intenta por defecto un resumen abstractivo de longitud media cuando hay un LLM disponible, y elimina las líneas de cookies y los menús de navegación antes de resumir.

Errores que nombran la causa

Un fallo de DNS se leía como un escueto fetch failed, y la pista del siguiente paso sugería stealth_mode, mandando al agente a un navegador stealth para descargar una errata. Ahora los errores llevan la causa (ENOTFOUND, ECONNREFUSED), y la pista dice que revises la URL. Un selector que no coincide con nada se informa como un fallo de selector que nombra el selector, no como un sitio lento. Las propias pistas dependen ahora de la clase de error (robots, lista de bloqueo, SSRF, 404, timeout, validación) en lugar de una pista genérica por herramienta.

Respuestas del agente que puedes comprobar

La herramienta agent responde a una pregunta a partir de la web abierta. Sus correcciones en este ciclo tratan de la procedencia, porque una respuesta solo es útil si puedes ver de dónde salió.

  • Una URL citada debe venir de una fuente. Desde la v6.22.1, cada URL de una respuesta tiene que ser una página que el agente descargó, un enlace de una de ellas o algo escrito en su texto fuente. La que no lo es recibe una reescritura correctiva. La que sobrevive a la reescritura aparece en provenance.unverified_urls y en un aviso dentro de la respuesta. Antes, una respuesta con el título correcto de Hacker News y un enlace a una noticia de 2021 pasaba como verificada.
  • El agente puede enlazar el elemento exacto. Cada fuente aporta ahora hasta ocho de sus enlaces a la síntesis, así que "la noticia más destacada de hoy" llega con la URL de esa noticia.
  • La fuente oficial gana los empates. Un empate en la votación de dominios promovía antes al sitio mejor posicionado, a menudo Wikipedia.
  • "Última actualización" no es una fecha de lanzamiento. Una respuesta que da la fecha de actualización de una página como fecha de lanzamiento se corrige o se marca, en provenance.update_dates.
  • Se ciñe a su límite de 120 segundos. Una ejecución del barrido había tardado 183 segundos. Una ejecución que llega al límite devuelve ahora degraded: true con la evidencia que tiene.

El precio no cambia: 8 credits, más 5 por cada reintento stealth que consigue su página, 18 como máximo.

Estado incrustado de más frameworks

Muchos sitios envían sus datos como JSON dentro del HTML, para que el framework de front-end los hidrate. extract_embedded_state lee ese JSON con una petición simple, sin navegador, por 2 credits. La v6.15.0 y la v6.16.0 ampliaron lo que puede leer:

  • El __NUXT_DATA__ de Nuxt 3, decodificado en objetos como nuxt_data (antes volvía como un array de índices)
  • Los datos de SvelteKit como sveltekit_data, y el data-page de Inertia como inertia_page
  • ytInitialData y ytInitialPlayerResponse de YouTube, así que una página de video devuelve videoDetails con una petición simple
  • Remix, el JSON de producto y los meta de analítica de Shopify, y las variables globales asignadas a un literal de JavaScript en lugar de JSON, leídas por un evaluador estático sin ejecutar código de la página

Tres parámetros hacen manejables los payloads grandes. find devuelve todas las propiedades con un nombre de clave dado, cada una con la ruta que puedes volver a pasar tal cual. keys_only devuelve dos niveles de claves con sus tipos en lugar de los datos. Por encima de max_inline_chars, el resultado es una vista previa más un handle que lees con read_result, en lugar de un payload de 2 MB en la ventana de contexto.

Json
{
  "name": "extract_embedded_state",
  "arguments": {
    "url": "https://shop.example.com/products/widget",
    "find": "price"
  }
}

Una página con muro se puede volver a leer en el navegador stealth con escalate: true, que proyecta 7 credits y cobra 2 cuando la petición simple consiguió la página. Desde la v6.24.0, un path que no se resuelve devuelve las claves dos niveles por debajo del punto donde se detuvo, con un siguiente paso construido a partir de ellas. Antes, le decía al agente que volviera a leer el payload entero.

Automatización de navegador que espera a la página

scrape_with_actions y browser_session manejan un navegador real. Su fallo más común era actuar sobre una página que no había terminado de renderizarse.

  • Los snapshots esperan a que la página se asiente: load (hasta 5 segundos) y luego una ventana tranquila sin cambios en el DOM durante 300 ms y sin peticiones en curso durante 500 ms (hasta 3 segundos). El snapshot de la página de inicio de Amazon pasó de 0 nodos a 236, cuadro de búsqueda incluido.
  • Los snapshots ven dentro de shadow roots e iframes, incluidos los de otro origen, gracias al snapshot de accesibilidad nativo de Playwright.
  • Un elemento reemplazado se vuelve a encontrar. Cuando una página cambia un elemento después del snapshot (el cuadro de búsqueda de Wikipedia lo hace), la ref se busca una vez más por rol y nombre en lugar de fallar como desconectada.
  • Los banners de cookies se responden por ti. browserOptions.consent: "reject" ejecuta el rechazo de autoconsent de DuckDuckGo después de cada navegación. El diálogo de Sourcepoint de The Guardian tardó alrededor de un segundo.
  • Una ráfaga de llamadas hace cola en vez de fallar. "Maximum concurrent sessions (3) reached" desapareció. Las llamadas esperan hasta 60 segundos a que haya un navegador libre e informan de queued_ms.
  • Los fallos cuestan menos tiempo. maxRetries vale ahora 0 por defecto, así que un clic sobre un selector inexistente con un timeout de 4 segundos falla en unos 4 segundos en lugar de 20.8. Los clics stealth en Camoufox pasaron de 12.5–20 segundos a 1.4.

Ahora se revisa cada navegación de una cadena en busca de muros anti-bot, no solo la página final. El resultado enumera cada una en navigations, con AWS WAF y F5 identificados junto a Cloudflare, DataDome y los demás. Para saber qué pasa después de un muro, el post de la v6.12 explica la escalera de escalado.

Seguridad: cada salto pasa por la guarda

Un servidor de scraping descarga URLs que eligió un modelo, y ese modelo puede haberlas leído en una página hostil. La guarda SSRF existe desde la v5. Este ciclo cerró los caminos que la rodeaban:

  • El tráfico del navegador pasa por un proxy de guarda. Desde la v6.23.0, cada contexto de navegador se conecta a través de un proxy de reenvío local que revisa cada conexión (saltos de redirección, iframes, subrecursos, fetch, XHR y WebSockets) y se conecta a la dirección que revisó, así que el DNS rebinding ya no se cuela por la ruta del navegador. Antes, una página que redirigía a 127.0.0.1 llegaba a ella antes de que se informara del bloqueo.
  • [::] está bloqueada. La dirección IPv6 no especificada llega al host local, igual que 0.0.0.0.
  • Cada salto de redirección pasa el filtro como una primera petición. Desde la v6.16.0, la lista de bloqueo y robots.txt se vuelven a comprobar antes de cada salto, y cada salto respeta el Crawl-delay del host. Una redirección a una ruta no permitida nunca se solicita.
  • Las lecturas de archivos locales están limitadas. process_document con una ruta local acepta ahora solo tipos de archivo de documento y rechaza los directorios que empiezan por punto, como ~/.ssh. Define CRAWLFORGE_ALLOWED_DIRS para restringir las lecturas a los directorios que indiques.
  • Tus rutas y credenciales se quedan en tu máquina. Una ruta de archivo local ya no llega al informe de uso. Las credenciales de proxy se ocultan en los resultados, los mensajes de error y los informes de uso, y las credenciales en URLs se ocultan en el registro de auditoría de cumplimiento.
  • MCP SDK 2.3.1, por tres avisos de seguridad en el transporte HTTP y la gestión de autenticación del SDK.

La búsqueda pasó a la Brave Search API

El 19 de octubre, la API de CrawlForge pasó search_web de Google Custom Search, que Google dejará de ofrecer el 1 de enero de 2027, a la Brave Search API. Los resultados vienen del índice independiente de Brave, y provider.backend indica qué backend atendió la llamada. total_results es null porque Brave no informa de un total, y un 0 se leería como "sin resultados". La paginación es exacta: un offset que no es múltiplo del tamaño de página devuelve ahora la ventana que pediste.

serp_rank ganó una comprobación de señuelos. Google sirve ahora a algunas consultas automatizadas una página de resultados realista que no tiene nada que ver con la consulta. Cuando menos de 1 de cada 5 de los primeros resultados menciona la palabra clave, el resultado lleva suspect: true e indica cuántos lo hacían. La profundidad por defecto es ahora 30 tanto en el MCP server como en la API REST, y sigue costando 5 credits.

Cambios incompatibles que revisar antes de actualizar

La mayoría de las 24 versiones no cambian nada de lo que llamas. Estas sí:

CambioDesdeQué hacer
read_result json_path empieza en el resultado almacenado completov6.23.0Antepón body. a las rutas de fetch_url (body.items[0])
Los registros de extract_links pierden is_externalv6.18.0Lee type: internal, external u other
scrape acepta un formato highlights y uno questionv6.20.0Haz una segunda llamada para una segunda consulta
maxRetries de scrape_with_actions vale 0 por defectov6.12.1Defínelo explícitamente si quieres la repetición
enable/disable de stealth_mode eliminados; waited_for_render_ms sustituidov6.19.0, v6.23.0Pasa la configuración en cada llamada; lee waited_ms y render_grace_ms
Los valores @href/@src de scrape_structured son absolutosv6.23.0Elimina tu propia resolución de URLs
serp_rank revisa 30 resultados por defectov6.19.2Pasa depth (hasta 200) para objetivos más profundos
Las peticiones HTTP de la era 2026-07-28 necesitan MCP-Protocol-Versionv6.23.1El cliente oficial del SDK ya lo envía

Cómo actualizar

Bash
npm install -g crawlforge-mcp-server@latest
crawlforge --version   # 6.24.0

# Optional: size the session page cache in MB (default 64), or 0 to turn it off
export CRAWLFORGE_PAGE_CACHE_MB=64

Un cliente MCP que arranca el servidor con npx coge la v6.24.0 en el siguiente reinicio. Si instalaste las Agent Skills, actualízalas con crawlforge install-skills --target claude-code --force para que sus notas sobre las herramientas coincidan con el servidor.

¿Quieres ver la diferencia en las páginas que lee tu agente? Empieza gratis con 1.000 credits, apunta tu agente a los sitios que le dieron problemas y revisa lo que costó cada llamada en su bloque _cost. Las llamadas fallidas mostrarán 0. Los precios de cada herramienta están en la página de precios.

Pruébalo tú mismo — sin necesidad de registrarte

Explora las 31 herramientas de scraping y extracción de CrawlForge en el playground y luego empieza gratis con 1,000 credits.

1,000 credits gratis • Por única vez • No se requiere tarjeta de crédito

Etiquetas

  • release
  • v6.24.0
  • reliability
  • page cache
  • billing
  • agent
  • security
  • MCP
  • web scraping
  • changelog

Sobre el autor

CrawlForge Team

Equipo de Ingeniería

Construimos el MCP server de web scraping más completo. Creamos herramientas que ayudan a los desarrolladores a extraer, analizar y transformar datos web para aplicaciones de IA.

Newsletter

Mantente al día con los últimos artículos

Recibe tutoriales, novedades del producto y consejos de web scraping en tu bandeja de entrada.

Sin spam. Cancela tu suscripción cuando quieras.

FAQ

Preguntas frecuentes

01¿Qué cambió en CrawlForge MCP v6.24.0?

La v6.24.0 añade una caché de páginas por sesión: una petición repetida de la misma página en menos de 10 minutos reutiliza la copia descargada y cuesta 1 credit, en nueve herramientas, entre ellas scrape, fetch_url y extract_embedded_state. Añade un parámetro maxAge (maxAge: 0 fuerza una descarga nueva), un campo cache en cada resultado de esas herramientas y fallos de ruta de extract_embedded_state que devuelven las claves donde se detuvo la ruta. Es la última de 24 versiones desde la v6.12.1, que juntas corrigieron los defectos encontrados en dos barridos en vivo de las 31 herramientas.

02¿CrawlForge cobra por las peticiones fallidas?

No. Desde la v6.22.0, toda llamada fallida cuesta 0 credits, en el MCP server y en la API REST. Un fallo es un resultado marcado con isError, un error lanzado o un cuerpo con success: false en el nivel superior. Los rechazos por robots.txt, la lista de bloqueo o la guarda SSRF, y los muros anti-bot que frenan todos los peldaños del escalado, también son gratis. Cada resultado informa de lo que se cobró en su bloque _cost.

03¿CrawlForge MCP guarda en caché las páginas que descarga?

Sí, desde la v6.24.0, en una instalación MCP local. Una petición repetida de la misma página en menos de 10 minutos reutiliza la copia descargada y cuesta 1 credit, y las llamadas en paralelo para una misma página comparten una sola petición. Las respuestas que no son 2xx, los muros anti-bot, las respuestas Cache-Control: no-store y las peticiones con cabeceras Authorization o Cookie nunca se guardan en caché, y un acierto de caché sigue pasando las comprobaciones de robots.txt y de la lista de bloqueo. CRAWLFORGE_PAGE_CACHE_MB define su tamaño (64 por defecto; 0 la desactiva). Está desactivada con --http y para las peticiones a la API REST.

04¿Cómo evita la herramienta agent de CrawlForge citar enlaces que nunca leyó?

Desde la v6.22.1, cada URL de una respuesta de agent debe ser una página que el agente descargó, un enlace de una de ellas o algo escrito en su texto fuente. La URL que no lo es recibe una reescritura correctiva, y la que sobrevive aparece en provenance.unverified_urls y en un aviso dentro de la respuesta. Las respuestas que dan la fecha de última actualización de una página como fecha de lanzamiento se corrigen o se marcan en provenance.update_dates. El precio no cambia: 8 credits más 5 por cada reintento stealth que consigue su página, 18 como máximo.

05¿Hay cambios incompatibles entre CrawlForge MCP v6.12 y v6.24?

Unos pocos. json_path de read_result empieza ahora en el resultado almacenado completo, así que las rutas de fetch_url empiezan por body. Los registros de extract_links usan type en lugar de is_external. scrape acepta un formato highlights y uno question por llamada. maxRetries de scrape_with_actions vale 0 por defecto. scrape_structured devuelve URLs absolutas para @href y @src. serp_rank revisa 30 resultados por defecto. No se renombró ni eliminó ninguna herramienta y ningún precio de lista cambió.

06¿Cómo actualizo a CrawlForge MCP v6.24.0?

Ejecuta npm install -g crawlforge-mcp-server@latest y comprueba que crawlforge --version muestra 6.24.0. Un cliente MCP que arranca el servidor con npx coge la nueva versión en el siguiente reinicio. Si instalaste las Agent Skills de CrawlForge, actualízalas con crawlforge install-skills --target claude-code --force.

Sigue leyendo

Artículos relacionados

Novedades del producto

11m

CrawlForge MCP v5.2.0: Shopify Product Data Without Parsing HTML

v5.2.0 adds a shopify-product template that reads the store's own JSON instead of its markup, rebuilds the Amazon template against live pages after it passed six tests while returning nulls, and fixes price monitoring that never fired.