Skip to main content
Glama
bpweatherill

WebSearchAndCrawl

by bpweatherill

WebSearchAndCrawl

Un servidor MCP para rastreo web autenticado, búsqueda y procesamiento de documentos

---.

🚀 Propósito

WebSearchAndCrawl es un servidor MCP (Model Context Protocol) diseñado para:

  1. Rastrear sitios web (incluidos los autenticados) mediante tokens de sesión de Firefox o automatización del navegador.

  2. Buscar contenido rastreado para hallar coincidencias de regex y almacenar los resultados en un índice estructurado.

  3. Descargar y analizar documentos (PDF, DOCX, XLSX, etc.) de los sitios rastreados.

  4. Transmitir resultados en tiempo real vía HTTP para su integración con clientes MCP.

  5. Respetar robots.txt y aplicar límites de tasa (5 solicitudes/seg, máximo 5 hilos).

Esta herramienta es ideal para:

  • Investigadores que necesitan rastrear sitios web autenticados o dinámicos.

  • Desarrolladores que crean agentes de IA que requieren datos web.

  • Automatización de tareas web repetitivas (p. ej., monitorización, extracción de datos).


Related MCP server: Scout MCP Server

🔧 Características

Característica

Descripción

Rastreo autenticado

Usa tokens de sesión de Firefox para acceder a páginas con inicio de sesión.

Automatización del navegador

Recurre a Playwright para contenido dinámico o formularios de inicio de sesión.

Lista blanca de dominios

Solo rastrea URLs que coinciden con una lista de dominios separados por comas.

Rastreo con profundidad limitada

Profundidad de rastreo configurable (1-9 niveles).

Búsqueda con regex

Busca en el contenido rastreado o en el índice coincidencias con patrones de regex.

Procesamiento de documentos

Extrae texto de archivos PDF, DOCX, XLSX y TXT.

Transmisión en tiempo real

Los resultados se transmiten como JSONL (fragmentados por página).

Indexación

Almacena los resultados en archivos JSON por dominio para búsquedas posteriores.

Límite de frecuencia

Aplica un máximo de 5 solicitudes/seg y 5 hilos.

Reanudación

Puede reanudar rastreos interrumpidos desde puntos de control.

Validación de sesión

Valida los alcances de los tokens para prevenir su uso indebido.


📦 Instalación

Requisitos previos

  1. Python 3.9+ (recomendado: 3.11+).

  2. Firefox (necesario para la automatización del navegador).

  3. Librerías del sistema (para el procesamiento de documentos):

    • PDF: poppler-utils (Linux) o pdfminer.six (multiplataforma).

    • DOCX/XLSX: python-docx, openpyxl.

Pasos

1. Clonar el repositorio

git clone https://github.com/bpweatherill/WebSearchAndCrawl.git
cd WebSearchAndCrawl

2. Configurar un entorno virtual

python -m venv venv
source venv/bin/activate  # Linux/Mac
# OR
venv\Scripts\activate   # Windows

3. Instalar las dependencias

pip install -r requirements.txt

4. Instalar los navegadores de Playwright

playwright install firefox

5. (Opcional) Configurar variables de entorno

Crea un archivo .env en la raíz del proyecto:

# Server
MCP_PORT=8808
MCP_HOST=0.0.0.0

# Crawler
MAX_DEPTH=9
MAX_THREADS=5
RATE_LIMIT=5
REQUEST_TIMEOUT=10
MAX_MEMORY_MB=1024

# Firefox
FIREFOX_PROFILE=my_profile  # Optional: Specific Firefox profile
DEFAULT_SEARCH_ENGINE=google

# Directories
INDEX_DIR=./index
DOWNLOADS_DIR=./downloads
CHECKPOINTS_DIR=./checkpoints

🏃 Uso

1. Iniciar el servidor MCP

python -m server.main

El servidor se iniciará en http://localhost:8808 (o en el puerto especificado en .env).

2. Herramientas MCP (endpoints HTTP)

Todas las herramientas devuelven respuestas JSON y admiten transmisión para obtener resultados en tiempo real.

Endpoint

Método

Descripción

Cuerpo de la solicitud

/crawl_website

POST

Rastrear un sitio y transmitir los resultados.

CrawlRequest

/search_index

POST

Buscar en el índice local coincidencias de regex.

SearchIndexRequest

/download_documents

POST

Descargar documentos que coincidan con un regex.

DownloadRequest

/get_search_results

POST

Usar el motor de búsqueda de Firefox para obtener resultados.

WebSearchRequest

/list_indexed_domains

GET

Listar todos los dominios con contenido indexado.

-

/health

GET

Comprobación de estado.

-


Esquemas de solicitud/respuesta

CrawlRequest
{
  "url": "https://www.nasa.gov",
  "whitelist_domains": "nasa.gov",
  "max_depth": 3,
  "use_token": false,
  "firefox_profile": "my_profile"
}
  • url: URL inicial del rastreo.

  • whitelist_domains: Lista de dominios permitidos separados por comas (p. ej., "nasa.gov,spacex.com").

  • max_depth: Profundidad máxima de rastreo (1-9).

  • use_token: Usa el token de sesión de Firefox si está disponible.

  • firefox_profile: Nombre del perfil de Firefox (opcional).

Respuesta transmitida (JSONL):

{
  "excerpt": "NASA's Perseverance Rover lands on Mars...",
  "full_text": "Full article text here...",
  "url": "https://www.nasa.gov/mars2020",
  "timestamp": "2024-05-20T12:00:00Z",
  "domain": "nasa.gov"
}

---.

SearchIndexRequest

{
  "domain": "nasa.gov",
  "regex": ".*Mars.*",
  "max_results": 10
}
  • domain: Dominio a buscar (p. ej., "nasa.gov").

  • regex: Patrón de regex que se debe coincidir.

  • max_results: Número máximo de resultados a devolver.

Respuesta:

[
  {
    "url": "https://www.nasa.gov/mars2020",
    "excerpt": "NASA's Perseverance Rover lands on Mars...",
    "timestamp": "2024-05-20T12:00:00Z"
  }
]

---.

DownloadRequest

{
  "domain": "nasa.gov",
  "regex": ".*\\.pdf$",
  "output_dir": "./downloads/nasa.gov"
}
  • domain: Dominio del que descargar.

  • regex: Patrón de regex para los archivos a descargar (p. ej., "*.pdf").

  • output_dir: Directorio de salida personalizado (opcional).

Respuesta transmitida (JSONL):

{
  "filename": "./downloads/nasa.gov/mars_rover.pdf",
  "url": "https://www.nasa.gov/pdf/mars_rover.pdf",
  "parsed_text": "Extracted text from PDF..."
}

---.

WebSearchRequest

{
  "query": "NASA Mars missions",
  "search_engine": "google",
  "use_token": false,
  "firefox_profile": "my_profile"
}
  • query: Consulta de búsqueda.

  • search_engine: Motor de búsqueda (predeterminado: el de Firefox).

  • use_token: Usa el token de sesión de Firefox si está disponible.

  • firefox_profile: Nombre del perfil de Firefox (opcional).

Respuesta transmitida (JSONL):

{
  "title": "Mars 2020 Mission - NASA",
  "url": "https://www.nasa.gov/mars2020",
  "snippet": "Learn about the Perseverance Rover..."
}

🔍 Ejemplos

1. Rastrear NASA.gov e indexar resultados

curl -X POST http://localhost:8808/crawl_website \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.nasa.gov",
    "whitelist_domains": "nasa.gov",
    "max_depth": 2,
    "use_token": false
  }'

2. Buscar "Marte" en el contenido indexado

curl -X POST http://localhost:8808/search_index \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "nasa.gov",
    "regex": ".*Mars.*",
    "max_results": 5
  }'

3. Descargar PDFs de NASA.gov

curl -X POST http://localhost:8808/download_documents \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "nasa.gov",
    "regex": ".*\\.pdf$"
  }'

4. Usar Firefox para buscar en Google

curl -X POST http://localhost:8808/get_search_results \
  -H "Content-Type: application/json" \
  -d '{
    "query": "NASA Mars missions",
    "search_engine": "google"
  }'

📁 Estructura del proyecto

WebSearchAndCrawl/
│
├── server/                          # Core server logic
│   ├── __init__.py
│   ├── main.py                       # FastAPI app + MCP tools
│   ├── config.py                     # Configuration settings
│   ├── schemas.py                    # Pydantic request/response models
│   │
│   ├── firefox/                      # Firefox browser automation
│   │   ├── __init__.py
│   │   ├── controller.py              # Playwright Firefox management
│   │   └── token_manager.py           # Session token handling
│   │
│   ├── crawler/                     # Web crawling logic
│   │   ├── __init__.py
│   │   ├── crawler.py                # Main crawling logic
│   │   └── rate_limiter.py            # Thread/rate limiting
│   │
│   ├── indexer/                     # Indexing and search
│   │   ├── __init__.py
│   │   ├── indexer.py                 # JSON index management
│   │   └── search_engine.py           # Regex search
│   │
│   ├── downloader/                  # Document downloading and parsing
│   │   ├── __init__.py
│   │   ├── downloader.py              # Download logic
│   │   └── parsers/                  # File type parsers
│   │       ├── __init__.py
│   │       ├── pdf_parser.py
│   │       ├── docx_parser.py
│   │       └── xlsx_parser.py
│   │
│   └── streamer.py                   # Chunked JSON streaming
│
├── tests/                           # Unit and integration tests
│   ├── __init__.py
│   ├── test_firefox.py
│   └── test_crawler.py
│
├── index/                           # Index files (auto-generated)
│   ├── nasa.gov.json
│   └── ...
│
├── downloads/                       # Downloaded documents (auto-generated)
│   ├── nasa.gov/
│   │   ├── document1.pdf
│   │   └── ...
│   └── ...
│
├── checkpoints/                     # Crawl checkpoints (auto-generated)
│   └── ...
│
├── requirements.txt                 # Python dependencies
├── .env.example                     # Example environment variables
└── README.md                        # This file

⚙️ Configuración

Variables de entorno

Variable

Por defecto

Descripción

MCP_PORT

8808

Puerto del servidor HTTP.

MCP_HOST

0.0.0.0

Host del servidor HTTP.

MAX_DEPTH

9

Profundidad máxima de rastreo (1-9).

MAX_THREADS

5

Máximo de hilos concurrentes.

RATE_LIMIT

5

Máximo de solicitudes por segundo.

REQUEST_TIMEOUT

10

Tiempo de espera de solicitudes (segundos).

MAX_MEMORY_MB

1024

Uso máximo de memoria (MB).

FIREFOX_PROFILE

None

Nombre del perfil de Firefox (opcional).

DEFAULT_SEARCH_ENGINE

google

Motor de búsqueda predeterminado.

INDEX_DIR

./index

Directorio para los archivos de índice.

DOWNLOADS_DIR

./downloads

Directorio para los archivos descargados.

CHECKPOINTS_DIR

./checkpoints

Directorio para los puntos de control de rastreo.


🛡️ Consideraciones de seguridad

  1. Tokens de sesión:

    • Los tokens solo se almacenan en memoria (no se persisten en disco).

    • Los alcances de los tokens se validan para evitar usos indebidos (p. ej., un token para nasa.gov no puede usarse para evil.com).

  2. Desinfección de entradas:

    • Todas las entradas (URLs, regex, etc.) se desinfectan para prevenir ataques de inyección.

  3. Límite de tasa:

    • Aplica 5 solicitudes/seg y 5 hilos como máximo para no saturar los servidores.

  4. Cumplimiento de robots.txt:

    • El rastreador respeta robots.txt y omite las URLs no permitidas.

  5. Lista blanca:

    • Solo se rastrean las URLs que coinciden con los dominios permitidos.


🚀 Mejoras (hoja de ruta)

Mejora

Descripción

Prioridad

Tokens persistentes

Almacenar tokens en un archivo cifrado para persistir entre reinicios.

Media

Análisis completo de robots.txt

Parsear correctamente las reglas de robots.txt en lugar de comprobaciones simples.

Media

Manejo avanzado de paginación

Detectar y seguir enlaces de paginación (p. ej., botones "Siguiente").

Alta

Soporte de lazy-loading

Detectar y activar contenido de carga diferida (p. ej., scroll infinito).

Alta

Checkpointing (puntos de control)

Guardar el estado del rastreo para reanudar rastreos interrumpidos.

Alta

Búsqueda de texto completo

Admitir búsqueda de texto completo además de regex.

Baja

Backend de base de datos

Sustituir archivos JSON por SQLite/PostgreSQL para escalar.

Baja

Rastreo distribuido

Admitir escalado horizontal con múltiples workers.

Baja

Soporte de Docker

Añadir un Dockerfile para despliegue en contenedores.

Media

Asistentes de autenticación

Soporte incorporado para métodos de autenticación habituales (OAuth, SAML).

Media

Soporte de proxy

Añadir soporte de proxy para rastrear detrás de firewalls.

Baja

Cabeceras personalizadas

Permitir a los usuarios especificar cabeceras personalizadas en las solicitudes.

Media

Notificaciones webhook

Notificar a una URL webhook cuando se encuentren nuevos resultados.

Baja


🤝 Contribución

  1. Haz un fork del repositorio.

  2. Crea una rama de características (git checkout -b feature/your-feature).

  3. Haz commit de tus cambios (git commit -m "Add your feature").

  4. Empuja la rama (git push origin feature/your-feature).

  5. Abre una Pull Request.


📜 Licencia

Este proyecto está licenciado bajo la Licencia MIT. Consulta LICENSE para obtener más detalles.


📞 Soporte


🏆 Agradecimientos

  • Playwright: por la automatización del navegador.

  • FastAPI: por el servidor HTTP.

  • pdfminer.six: por el análisis de PDFs.

  • python-docx/openpyxl: por el procesamiento de archivos de Office.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    C
    quality
    C
    maintenance
    Provides browser automation and web scraping as MCP tools, enabling autonomous URL ingestion, crawling, extraction, and anti-bot handling with interactive browser control.
    62
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only Python MCP server for authorized website research, structured data extraction, downloadable-document analysis, and content auditing inside OpenCode. It crawls authorized public domains with safety constraints including robots.txt respect, SSRF defenses, bounded concurrency, and content-type allowlists.
    MIT

View all related MCP servers

Related MCP Connectors

  • Stealth web browser for agents: search, fetch, click and type through persistent sessions over MCP.

  • Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.

  • Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.

View all MCP Connectors

Latest Blog Posts

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/bpweatherill/WebSearchAndCrawl'

If you have feedback or need assistance with the MCP directory API, please join our Discord server