search-scrape

Scraping sigiloso autoalojado y búsqueda federada para agentes de IA. Una alternativa 100% privada y gratuita a Firecrawl, Jina Reader y Tavily. Con omisión universal de antibots + memoria de investigación semántica, configuración de copiar y pegar.

Documentación

CortexScout (cortex-scout) — Motor de búsqueda y extracción web para agentes de IA

CortexScout es el módulo de Deep Research y Extracción Web dentro del ecosistema Cortex-Works.

Diseñado para cargas de trabajo de agentes que requieren recuperación web eficiente en tokens, manejo confiable anti-bot y respaldo opcional de Human-in-the-Loop (HITL).

MIT License Built with Rust MCP


Resumen

CortexScout proporciona un único binario Rust autoalojable que expone capacidades de búsqueda, extracción y automatización de navegador con estado a través de MCP (stdio) y un servidor HTTP opcional. Los formatos de salida están estructurados y optimizados para el uso posterior de LLM.

Está construido para manejar los modos de fallo prácticos de la recuperación web (límites de tasa, desafíos de bots, páginas con mucho JavaScript) mediante respaldos progresivos: recuperación nativa → renderizado CDP de Chromium → Pruebas E2E con estado → flujos de trabajo HITL.


Herramientas (Lista de capacidades)

ÁreaHerramientas MCP / Capacidades
Búsquedaweb_search (descubrimiento de URL) o web_search(include_content=true) (búsqueda+contenido en una sola llamada)
Obtención y rastreo`web_fetch(mode="single"
Extracciónextract_fields (extracción estructurada primaria)
Automatizaciónscout_browser_automate / browser_automate (omni-herramienta con estado), scout_agent_profile_auth, scout_browser_close
Manejo anti-botrenderizado CDP, rotación de proxy, reintentos conscientes de bloqueo
HITLvisual_scout, `hitl_web_fetch(auth_mode="challenge"
Memoriamemory_search (historial de investigación respaldado por LanceDB)
Investigación profundadeep_research (búsqueda de múltiples saltos + raspado + síntesis)

Los nombres heredados siguen siendo invocables como alias de compatibilidad (web_search_json, web_fetch_batch, web_crawl, fetch_then_extract, human_auth_session). Los agentes deben preferir las herramientas primarias unificadas anteriores.

Integración con el ecosistema

Aunque CortexScout funciona como una herramienta independiente hoy, está diseñado para integrarse con CortexDB y CortexStudio para escalado multi-agente, artefactos de recuperación compartidos y gobernanza centralizada.


🎭 El "Playwright Killer" (Automatización de navegador con estado)

CortexScout incluye un motor de automatización CDP integrado y con estado, diseñado específicamente para agentes de IA, reemplazando por completo marcos pesados como Playwright o Cypress para flujos de trabajo de pruebas E2E.

  • La Omni-Herramienta Silenciosa (scout_browser_automate): En lugar de llamar a docenas de herramientas de navegador, los agentes pasan un array de steps. El runtime ahora cubre familias de acciones estilo Playwright en una sola llamada: navegación, hover/clic/escribir/esperar, acciones basadas en localizadores, aserciones, pestañas, capturas de pantalla/PDF, carga de archivos, relleno de formularios, política de diálogos, acciones de ratón por coordenadas, simulación de rutas, captura de consola/red y CRUD de cookies/almacenamiento.
  • Perfil de Agente Persistente: La automatización se ejecuta silenciosamente en segundo plano (--headless=new) usando un perfil aislado dedicado (~/.cortex-scout/agent_profile). Mantiene cookies, localStorage y estado de sesión entre llamadas de herramientas sin causar colisiones de SingletonLock con tu navegador de escritorio activo.
  • Motor de Simulación, Trazado y Verificación de QA: Los agentes pueden instalar simulaciones de rutas (mock_api, route_list, unroute) con anulaciones/eliminación de encabezados de respuesta, flujos de trazado (trace_start, trace_stop, trace_export), capturar registros de consola/red, verificar el estado del navegador y ejecutar aserciones basadas en CSS y localizadores, además de ayudantes de verificación estilo Playwright.
  • El Portal de Autenticación del Agente (scout_agent_profile_auth): Si el agente silencioso encuentra un CAPTCHA o un inicio de sesión OAuth complejo (como Google/Microsoft) en un nuevo dominio, esta herramienta lanza el perfil del agente en una ventana visible. Resuelves el CAPTCHA una vez, las cookies se guardan y el agente vuelve a la automatización silenciosa para siempre.

Mapa de cobertura estilo Playwright

Área de capacidadAcciones de Cortex Scout
Navegación y entradanavigate, navigate_back, click, hover, type, press_key, scroll, wait_for, wait_for_selector, wait_for_locator
Localizador y verificaciónclick_locator, type_locator, assert, assert_locator, generate_locator, verify_element_visible, verify_text_visible, verify_list_visible, verify_value
Pestañas y mediostabs, resize, screenshot, snapshot, pdf_save, file_upload, fill_form, handle_dialog
Red y simulacionesnetwork_tap, network_dump, network_state_set, mock_api, route_list, unroute
Estado del navegadorstorage_clear, storage_state_export, storage_state_import, storage_checkpoint, storage_rollback, cookie_*, localstorage_*, sessionstorage_*
Control de puntero de bajo nivelmouse_click_xy, mouse_down, mouse_move_xy, mouse_drag_xy, mouse_up, mouse_wheel

La principal compensación frente al Playwright MCP puro es el empaquetado, no la forma de las capacidades: Cortex Scout mantiene la superficie del navegador dentro de una omni-herramienta con estado, de modo que los agentes gastan menos turnos y menos tokens coordinando flujos de múltiples pasos.

Eficacia anti-bot y validación

Este repositorio incluye artefactos de evidencia capturados que validan flujos de extracción y HITL contra objetivos protegidos representativos.

ObjetivoProtecciónEvidenciaNotas
LinkedInCloudflare + AuthJSON · FragmentoExtracción de listados con autenticación
TicketmasterCloudflare TurnstileJSON · FragmentoExtracción con manejo de desafíos
AirbnbDataDomeJSON · FragmentoConjuntos de resultados grandes bajo controles de bots
UpworkreCAPTCHAJSON · FragmentoRecuperación de listados protegidos
AmazonAWS ShieldJSON · FragmentoExtracción de resultados de búsqueda
nowsecure.nlCloudflareJSONRuta de retorno manual validada

Consulta proof/README.md para la metodología y los resultados sin procesar.


Inicio rápido

Opción A — Binarios precompilados

Descarga los últimos archivos de lanzamiento desde GitHub Releases y ejecuta uno de:

  • cortex-scout-mcp — servidor MCP stdio (recomendado para VS Code / Cursor / Claude Desktop)
  • cortex-scout — servidor HTTP opcional (puerto predeterminado 5000; anular mediante --port, PORT o CORTEX_SCOUT_PORT)

Verificación de salud (servidor HTTP):

./cortex-scout --port 5000
curl http://localhost:5000/health

Opción B — Compilar desde el código fuente

Instala protoc primero. lance-encoding usa Protocol Buffers durante la compilación de lanzamiento, por lo que protoc debe estar en tu PATH.

  • macOS: brew install protobuf
  • Ubuntu/Debian: sudo apt-get install -y protobuf-compiler
  • Fedora: sudo dnf install -y protobuf-compiler

Compilación básica (búsqueda, raspado, investigación profunda, memoria):

git clone https://github.com/cortex-works/cortex-scout.git
cd cortex-scout
cargo build --release --manifest-path mcp-server/Cargo.toml --bin cortex-scout-mcp

Esto funciona desde la raíz del repositorio porque la ruta del manifiesto es explícita.

Compilación completa (incluye hitl_web_fetch / HITL con navegador visible):

cargo build --release --manifest-path mcp-server/Cargo.toml --all-features --bin cortex-scout-mcp

Si también deseas el binario del servidor HTTP opcional, compílalo explícitamente con cargo build --release --bin cortex-scout.

Prueba de humo local de MCP:

python3 publish/ci/smoke_mcp.py

Esto ejecuta una sesión stdio JSON-RPC delimitada por nuevas líneas contra el binario local cortex-scout-mcp y ejercita las principales herramientas públicas con entradas de ejemplo seguras.


Integración MCP (VS Code / Cursor / Claude Desktop)

Agrega una entrada de servidor a tu configuración MCP.

VS Code (mcp.json — global, o settings.json bajo mcp.servers):

Las variables de protección de tiempo de espera estricto a continuación son obligatorias en las configuraciones MCP. Son la barandilla de seguridad que evita que una página defectuosa, un lanzamiento de navegador atascado o una etapa de raspado bloqueada mantengan toda la sesión MCP abierta indefinidamente.

// mcp.json (global): top-level key is "servers"
// settings.json (workspace): use "mcp.servers" instead
{
  "servers": {
    "cortex-scout": {
      "type": "stdio",
      "command": "env",
      "args": [
        "RUST_LOG=warn",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS=90",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS_SCRAPE_URL=90",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS_SEARCH_STRUCTURED=120",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS_VISUAL_SCOUT=45",
        "CORTEX_SCOUT_BROWSER_LAUNCH_TIMEOUT_SECS=12",
        "CORTEX_SCOUT_BROWSER_TAB_PROBE_TIMEOUT_SECS=4",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS=20",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_CDP_INITIAL_ATTEMPT=25",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_CDP_RETRY_ATTEMPT=25",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_FORCED_CDP_ATTEMPT=25",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_NATIVE_CDP_FALLBACK=25",
        "SEARCH_ENGINES=google,bing,duckduckgo,brave",
        "LANCEDB_URI=/YOUR_PATH/cortex-scout/lancedb",
        "HTTP_TIMEOUT_SECS=30",
        "MAX_CONTENT_CHARS=10000",
        "/YOUR_PATH/cortex-scout/mcp-server/target/release/cortex-scout-mcp"
      ]
    }
  }
}

El comportamiento predeterminado es directo/sin proxy. Agrega IP_LIST_PATH y PROXY_SOURCE_PATH solo si deseas que las herramientas de proxy estén disponibles. Si deseas que proxy_control esté disponible sin enrutar el tráfico normal a través de proxies, apunta IP_LIST_PATH a un archivo ip.txt vacío y deja que los agentes lo llenen bajo demanda.

Importante: Usa siempre RUST_LOG=warn, no info. A nivel de info, el servidor emite cientos de líneas de registro por solicitud a stderr, lo que puede confundir a los clientes MCP que monitorean stderr.

Windows: Windows no tiene el comando env. Usa el formato de objeto command+env en su lugar — consulta docs/IDE_SETUP.md.

Con investigación profunda (síntesis LLM a través de OpenRouter / cualquier API compatible con OpenAI):

{
  "servers": {
    "cortex-scout": {
      "type": "stdio",
      "command": "env",
      "args": [
        "RUST_LOG=warn",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS=90",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS_SCRAPE_URL=90",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS_SEARCH_STRUCTURED=120",
        "CORTEX_SCOUT_TOOL_TIMEOUT_SECS_VISUAL_SCOUT=45",
        "CORTEX_SCOUT_BROWSER_LAUNCH_TIMEOUT_SECS=12",
        "CORTEX_SCOUT_BROWSER_TAB_PROBE_TIMEOUT_SECS=4",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS=20",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_CDP_INITIAL_ATTEMPT=25",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_CDP_RETRY_ATTEMPT=25",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_FORCED_CDP_ATTEMPT=25",
        "CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_NATIVE_CDP_FALLBACK=25",
        "SEARCH_ENGINES=google,bing,duckduckgo,brave",
        "LANCEDB_URI=/YOUR_PATH/cortex-scout/lancedb",
        "HTTP_TIMEOUT_SECS=30",
        "MAX_CONTENT_CHARS=10000",
        "OPENAI_BASE_URL=https://openrouter.ai/api/v1",
        "OPENAI_API_KEY=sk-or-v1-...",
        "DEEP_RESEARCH_LLM_MODEL=moonshotai/kimi-k2.5",
        "DEEP_RESEARCH_ENABLED=1",
        "DEEP_RESEARCH_SYNTHESIS=1",
        "DEEP_RESEARCH_SYNTHESIS_MAX_TOKENS=4096",
        "/YOUR_PATH/cortex-scout/mcp-server/target/release/cortex-scout-mcp"
      ]
    }
  }
}

Guía multi-IDE: docs/IDE_SETUP.md


Configuración (cortex-scout.json)

Crea cortex-scout.json en el mismo directorio que el binario (o la raíz del repositorio). Todos los campos son opcionales; las variables de entorno actúan como respaldo.

{
  "deep_research": {
    "enabled": true,
    "llm_base_url": "http://localhost:1234/v1",
    "llm_api_key": "",
    "llm_model": "lfm2-2.6b",
    "synthesis_enabled": true,
    "synthesis_max_sources": 3,
    "synthesis_max_chars_per_source": 800,
    "synthesis_max_tokens": 1024
  }
}

Variables de entorno clave

Núcleo

VariablePredeterminadoDescripción
RUST_LOGwarnNivel de registro. Mantén warn para MCP stdioinfo inunda stderr y confunde a los clientes MCP
HTTP_TIMEOUT_SECS30Tiempo de espera de lectura por solicitud (segundos)
HTTP_CONNECT_TIMEOUT_SECS10Tiempo de espera de conexión TCP (segundos)
OUTBOUND_LIMIT16Máximo de conexiones HTTP salientes concurrentes
MAX_CONTENT_CHARS10000Máximo de caracteres devueltos por página raspada
CORTEX_SCOUT_TOOL_TIMEOUT_SECSespecífico de herramientaLímite superior estricto para cada llamada de herramienta MCP/HTTP. Cuando se excede, Cortex Scout cancela la herramienta y devuelve una respuesta de tiempo de espera estructurada en lugar de quedarse colgado
CORTEX_SCOUT_TOOL_TIMEOUT_SECS_<TOOL>sin establecerAnulación por herramienta, por ejemplo CORTEX_SCOUT_TOOL_TIMEOUT_SECS_SCRAPE_URL=90 o CORTEX_SCOUT_TOOL_TIMEOUT_SECS_VISUAL_SCOUT=20
CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECSespecífico de etapaTiempo de espera compartido para etapas de raspado pesadas como obtención CDP, raspado nativo, recorte semántico y registro de historial
CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_<STAGE>sin establecerAnulación por etapa, por ejemplo CORTEX_SCOUT_SCRAPE_STAGE_TIMEOUT_SECS_CDP_INITIAL_ATTEMPT=30

Navegador / Anti-bot

VariablePredeterminadoDescripción
CHROME_EXECUTABLEauto-detectadoAnular la ruta al binario de Chromium/Chrome/Brave
SEARCH_CDP_FALLBACKtrueReintentar las búsquedas del motor de búsqueda mediante CDP nativo de Chromium cuando esté bloqueado
SEARCH_TIER2_NON_ROBOTsin establecerEstablece 1 para permitir hitl_web_fetch como escalada de búsqueda de último recurso
MAX_LINKS100Máximo de enlaces seguidos por rastreo de página

Búsqueda

VariablePor defectoDescripción
SEARCH_ENGINESgoogle,bing,duckduckgo,braveMotores activos (separados por comas)
SEARCH_MAX_ENGINES_PER_QUERY3Máximo de motores consultados por búsqueda antes de que la rotación basada en salud elija el siguiente conjunto
SEARCH_MAX_RESULTS_PER_ENGINE10Resultados por motor antes de fusionar/eliminar duplicados
SEARCH_ENGINE_STAGGER_MS125Retraso entre lanzamientos por motor para reducir disparadores anti-bot ráfaga
SEARCH_COMMUNITY_TRIGGER_RESULTS4Solo ejecutar la expansión de comunidad Reddit/HN cuando la búsqueda principal devuelva menos de esta cantidad de resultados
SEARCH_SHARED_CACHEtrueCompartir resultados de búsqueda exitosos entre procesos concurrentes de Cortex Scout en el mismo host
SEARCH_SHARED_CACHE_TTL_SECS300TTL para la caché de búsqueda compartida entre procesos
SEARCH_HOST_MIN_GAP_MSengine-tunedEspaciado mínimo entre procesos entre solicitudes a motores de búsqueda desde la misma IP de host
SEARCH_HOST_MAX_GAP_MSengine-tunedEspaciado máximo/fluctuación entre procesos entre solicitudes a motores de búsqueda desde la misma IP de host
SCRAPE_HOST_MIN_GAP_MS900Espaciado mínimo entre procesos entre solicitudes de raspado al mismo host
SCRAPE_HOST_MAX_GAP_MS1800Espaciado máximo/fluctuación entre procesos entre solicitudes de raspado al mismo host
CORTEX_SCOUT_HOST_GUARD_DISABLEDfalseEstablece 1 solo si deseas deshabilitar explícitamente la limitación compartida a nivel de host

Proxy

VariablePor defectoDescripción
IP_LIST_PATHRuta opcional a ip.txt (un proxy por línea: http://, socks5://). Déjalo sin establecer para deshabilitar el soporte de proxy por completo, o apunta a un archivo vacío para mantener las herramientas de proxy disponibles pero inactivas por defecto
PROXY_SOURCE_PATHRuta opcional a proxy_source.json (usado por proxy_control grab)

Memoria Semántica (LanceDB)

VariablePor defectoDescripción
LANCEDB_URIRuta de directorio para la memoria de investigación persistente. Omítelo para deshabilitar
CORTEX_SCOUT_MEMORY_DISABLED0Establece 1 para deshabilitar la memoria incluso cuando LANCEDB_URI esté establecido
MODEL2VEC_MODELbuilt-inID de modelo de HuggingFace o ruta local para incrustación (p. ej. minishlab/potion-base-8M)

Investigación Profunda

VariablePor defectoDescripción
DEEP_RESEARCH_ENABLED1Establece 0 para deshabilitar la herramienta deep_research en tiempo de ejecución
OPENAI_API_KEYClave API para síntesis LLM. Omítela para endpoints locales sin clave (Ollama)
OPENAI_BASE_URLhttps://api.openai.com/v1Endpoint compatible con OpenAI (OpenRouter, Ollama, LM Studio, etc.)
DEEP_RESEARCH_LLM_MODELgpt-4o-miniIdentificador de modelo (debe ser compatible con el endpoint)
DEEP_RESEARCH_SYNTHESIS1Establece 0 para omitir la síntesis LLM (solo búsqueda+raspado)
DEEP_RESEARCH_HOP_TIMEOUT_SECS90Tiempo de espera de raspado por salto. Cuando se excede, deep_research devuelve resultados parciales en lugar de colgarse hasta que el llamador MCP agote el tiempo
DEEP_RESEARCH_SYNTHESIS_MAX_TOKENS1024Máximo de tokens para la respuesta de síntesis. Usa 4096+ para modelos de contexto grande
DEEP_RESEARCH_SYNTHESIS_MAX_SOURCES8Máximo de documentos fuente alimentados a la síntesis LLM
DEEP_RESEARCH_SYNTHESIS_MAX_CHARS_PER_SOURCE2500Máximo de caracteres extraídos por fuente para la síntesis

Solo servidor HTTP

VariablePor defectoDescripción
CORTEX_SCOUT_PORT / PORT5000Puerto de escucha para el binario del servidor HTTP (cortex-scout)

Mejores Prácticas del Agente

Flujo operativo recomendado:

  1. Llama a memory_search antes de cualquier nueva ejecución de investigación: omite la obtención en vivo si la similitud ≥ 0.60 y skip_live_fetch es true.
  2. Para descubrimiento de temas usa web_search para descubrimiento solo de URL, o web_search(include_content=true) para buscar y raspar los mejores resultados en un solo viaje de ida y vuelta.
  3. Para URLs conocidas usa web_fetch(mode="single") con output_format="clean_json", y establece query + strict_relevance=true para conservar solo las secciones relevantes.
  4. En 403/429: llama a proxy_control con action:"grab" para actualizar la lista de proxies, luego reintenta con use_proxy:true.
  5. Para páginas con autenticación: ejecuta visual_scout cuando auth_risk_score >= 0.4, luego usa hitl_web_fetch(auth_mode="challenge") para muros CAPTCHA o hitl_web_fetch(auth_mode="auth") para muros de inicio de sesión.
  6. Para investigación profunda: deep_research maneja búsqueda multi-salto + raspado + síntesis LLM automáticamente. Ajusta depth (1–3) y max_sources según el presupuesto de costo por ejecución.
  7. Para automatización de UI y pruebas E2E: usa scout_browser_automate con arreglos de pasos para pestañas, aserciones de localizadores, capturas de pantalla/PDF, mocks de rutas, subidas de archivos y configuración del estado del navegador. Si estás bloqueado por inicio de sesión/CAPTCHA por primera vez, llama a scout_agent_profile_auth y luego reanuda la automatización.

Preguntas Frecuentes

¿Por qué deep_research con Ollama o qwen3.5 a veces falla o vuelve al modo heurístico?

Algunos modelos locales con capacidad de razonamiento devuelven respuestas /v1/chat/completions compatibles con OpenAI con message.reasoning poblado pero message.content vacío. Cortex Scout ahora reintenta endpoints locales de Ollama a través de /api/chat nativo con think:false cuando se detecta ese patrón.

Configuración recomendada para modelos locales de clase 4B de Ollama:

  • llm_api_key: "" en cortex-scout.json es válido y significa "no se requiere autenticación"
  • Mantén synthesis_max_sources en 1-2
  • Mantén synthesis_max_chars_per_source alrededor de 600-1000
  • Mantén synthesis_max_tokens alrededor de 512-768

Si aún ves síntesis lenta o inestable, reduce synthesis_max_sources antes de aumentar los límites de tokens.

¿Por qué veo errores de bloqueo de perfil de Chromium?

Cada solicitud sin cabeza usa un perfil temporal único, por lo que el raspado normal y deep_research están a salvo de carreras de bloqueo de perfil. Solo los flujos HITL (como hitl_web_fetch) que usan un perfil de navegador real pueden encontrar un bloqueo si los ejecutas concurrentemente o tienes Brave/Chrome abierto en el mismo perfil. Para evitarlo: ejecuta llamadas HITL una a la vez y cierra todas las ventanas del navegador antes de reutilizar un perfil.

Lista de verificación:

  1. Usa una compilación reciente (2026-03-05 o posterior)
  2. Evita rutas de perfil persistentes a menos que necesites una sesión iniciada
  3. Ejecuta flujos HITL/perfil secuencialmente
  4. Cierra todas las ventanas del navegador antes de reutilizar un perfil
  5. Deja que Cortex Scout use sus propios perfiles temporales para investigación concurrente

Mi cliente MCP se conecta pero las herramientas fallan o agotan el tiempo inmediatamente. ¿Qué debo revisar primero?

Revisa esto antes que cualquier otra cosa:

  1. Usa RUST_LOG=warn, no info.
  2. En configuraciones estilo env en macOS/Linux, pasa la ruta del binario directamente después de las asignaciones de entorno. No insertes "--" en los argumentos de mcp.json.
  3. En Windows, no uses env; usa command más un objeto env.
  4. Asegúrate de que la ruta del binario apunte a una compilación actual.

Versionado y Registro de Cambios

Consulta CHANGELOG.md.


Licencia

MIT. Consulta LICENSE.