WebSearchAndCrawl
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:
Rastrear sitios web (incluidos los autenticados) mediante tokens de sesión de Firefox o automatización del navegador.
Buscar contenido rastreado para hallar coincidencias de regex y almacenar los resultados en un índice estructurado.
Descargar y analizar documentos (PDF, DOCX, XLSX, etc.) de los sitios rastreados.
Transmitir resultados en tiempo real vía HTTP para su integración con clientes MCP.
Respetar
robots.txty 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
Python 3.9+ (recomendado: 3.11+).
Firefox (necesario para la automatización del navegador).
Librerías del sistema (para el procesamiento de documentos):
PDF:
poppler-utils(Linux) opdfminer.six(multiplataforma).DOCX/XLSX:
python-docx,openpyxl.
Pasos
1. Clonar el repositorio
git clone https://github.com/bpweatherill/WebSearchAndCrawl.git
cd WebSearchAndCrawl2. Configurar un entorno virtual
python -m venv venv
source venv/bin/activate # Linux/Mac
# OR
venv\Scripts\activate # Windows3. Instalar las dependencias
pip install -r requirements.txt4. Instalar los navegadores de Playwright
playwright install firefox5. (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.mainEl 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 |
| POST | Rastrear un sitio y transmitir los resultados. | |
| POST | Buscar en el índice local coincidencias de regex. | |
| POST | Descargar documentos que coincidan con un regex. | |
| POST | Usar el motor de búsqueda de Firefox para obtener resultados. | |
| GET | Listar todos los dominios con contenido indexado. | - |
| 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 |
|
| Puerto del servidor HTTP. |
|
| Host del servidor HTTP. |
|
| Profundidad máxima de rastreo (1-9). |
|
| Máximo de hilos concurrentes. |
|
| Máximo de solicitudes por segundo. |
|
| Tiempo de espera de solicitudes (segundos). |
|
| Uso máximo de memoria (MB). |
|
| Nombre del perfil de Firefox (opcional). |
|
| Motor de búsqueda predeterminado. |
|
| Directorio para los archivos de índice. |
|
| Directorio para los archivos descargados. |
|
| Directorio para los puntos de control de rastreo. |
🛡️ Consideraciones de seguridad
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.govno puede usarse paraevil.com).
Desinfección de entradas:
Todas las entradas (URLs, regex, etc.) se desinfectan para prevenir ataques de inyección.
Límite de tasa:
Aplica 5 solicitudes/seg y 5 hilos como máximo para no saturar los servidores.
Cumplimiento de
robots.txt:El rastreador respeta
robots.txty omite las URLs no permitidas.
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 | Parsear correctamente las reglas de | 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 | 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
Haz un fork del repositorio.
Crea una rama de características (
git checkout -b feature/your-feature).Haz commit de tus cambios (
git commit -m "Add your feature").Empuja la rama (
git push origin feature/your-feature).Abre una Pull Request.
📜 Licencia
Este proyecto está licenciado bajo la Licencia MIT. Consulta LICENSE para obtener más detalles.
📞 Soporte
Issues: Informa de errores o solicita funciones en la pestaña GitHub Issues.
Discussions: Únete a los GitHub Discussions para preguntas y respuestas.
🏆 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.
This server cannot be installed
Maintenance
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
- AlicenseCqualityCmaintenanceProvides browser automation and web scraping as MCP tools, enabling autonomous URL ingestion, crawling, extraction, and anti-bot handling with interactive browser control.625MIT

Scout MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables web search, scraping, extraction, and crawling through an MCP interface, allowing coding agents to access real-time web data.1MIT- AlicenseNot gradedqualityCmaintenanceA 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
- AlicenseNot gradedqualityBmaintenanceEnables web search and scraping through MCP, running locally with courtesy rate limiting and caching.4ISC
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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