Cómo alimentar cualquier página a una red neuronal sin publicidad y tokens extra
Cuando le das a un agente LLM el raspado web habitual, montañas de menús de navegación, pies de página, banners y paredes de marcado vuelan instantáneamente al contexto. Junto con un artículo de un par de miles de palabras, el agente recibe un megabyte de basura, la ventana de contexto se llena y la factura de tokens crece.
Hace poco me topé con el proyecto pullmd. Es un servicio autoalojado que toma una URL de página o archivo y devuelve Markdown limpio. Sin bloat extra, sin duplicación de metadatos en el texto, y un par de características que suelen faltar en las bibliotecas de análisis estándar.
Qué hay debajo del capó
Los creadores del proyecto combinaron varias herramientas probadas en batalla. Cuando llega una URL, el servicio primero verifica si hay Markdown nativo de Cloudflare. Si no está, entran en acción Mozilla Readability y Trafilatura.
A veces una página está completamente construida con React o Vue y el HTML puro devuelve una plantilla vacía. En estas situaciones, pullmd inicia un sidecar de Playwright, renderiza la página en Chromium sin cabeza y extrae el contenido de ahí. Si no necesitas el navegador pesado, simplemente puedes desactivar el contenedor de Playwright desde docker-compose.yml, liberando aproximadamente 3.7 GB de espacio en disco. En ese caso, el servicio continuará funcionando mediante análisis estático regular.
Todos los resultados terminan en una base de datos SQLite local. Si solicitas la misma URL dentro de una hora, la respuesta regresa instantáneamente desde la caché. A cada conversión se le asigna un identificador corto permanente, así que un enlace como /s/:id puede usarse como una fuente estable.
Características principales que ahorran tiempo
Hilos de Reddit y Hacker News
Por lo general, los scripts tropiezan con las páginas de comentarios. Aquí el analizador está específicamente entrenado para analizar hilos de Reddit y Hacker News. La salida es un árbol de comentarios estructurado con anidamiento, autores y recuentos de votos positivos preservados.
Búsqueda en página mediante BM25
Uno de los mejores hallazgos en la tercera versión del servicio. Si pasas el parámetro ?query=как настроить базу en la consulta, pullmd no devolverá toda la documentación de múltiples páginas. El servicio descompone el Markdown en secciones por encabezados, las clasifica usando el algoritmo BM25 y entrega solo los bloques que responden a la pregunta. Para páginas grandes, esto reduce el uso de tokens entre 70% y 95%, acelerando notablemente el rendimiento del agente. Las tablas y los bloques de código permanecen intactos.
Documentos, video y audio
El servicio maneja más que solo sitios web. Cuando conectas un sidecar MarkItDown de Microsoft, procesa PDFs, archivos de Word, hojas de cálculo de Excel, presentaciones de PowerPoint y libros electrónicos EPUB.
Si pasas un enlace de YouTube, el servicio extrae la transcripción del video con marcas de tiempo clicables, sin necesidad de claves API. Para reconocimiento de imágenes y audio, puedes configurar un endpoint para cualquier modelo compatible con OpenAI o servidor local como Ollama.
Servidor MCP integrado e integraciones
Hay varias opciones de conexión disponibles para la integración con agentes:
- API REST estándar (
GET /api?url=...) - Servidor MCP para Cursor, Claude Desktop y otros clientes compatibles
- Plugin listo para usar para Claude Code
- Interfaz web PWA con soporte de arrastrar y soltar archivos directamente desde el explorador de archivos
Seguridad y protección contra SSRF
Los servicios que obtienen datos de URLs arbitrarias son vulnerables a ataques SSRF. Un usuario podría alimentar al analizador una dirección de red interna o metadatos del proveedor de la nube.
pullmd incluye validación de direcciones. Antes de cada solicitud y en cada paso de redirección, se resuelven las direcciones IP del host. Si una dirección cae dentro de rangos de red privada, loopback, CGNAT o rangos de metadatos de la nube como 169.254.169.254, la solicitud se bloquea inmediatamente con un error 403. Para acceso intencional a una wiki interna, las direcciones se pueden incluir en lista blanca a través de la variable de entorno PULLMD_ALLOWED_HOSTS.
Cómo desplegar
Para el inicio básico, un solo archivo docker-compose.yml es suficiente:
mkdir pullmd && cd pullmd
curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
docker compose up -d
El servicio se iniciará en el puerto 3000. La autenticación está deshabilitada por defecto, pero puedes configurarla: tanto el modo de administrador único como el modo multiusuario con registro y cookies de sesión son compatibles.
Ejemplo de una solicitud API simple:
curl "http://localhost:3000/api?url=https://news.ycombinator.com/item?id=1"
Para conectar con Claude Code, un solo comando es suficiente:
claude mcp add --transport http pullmd http://localhost:3000/mcp
Para quién es
El proyecto resultó limpio y práctico. Tiene menos de quinientas estrellas en GitHub, pero la base de código se ve madura: estructura modular limpia, archivo de migración detallado y dependencias externas mínimas en el contenedor principal.
La herramienta será útil para quienes construyen pipelines RAG, configuran asistentes de IA locales, o simplemente quieren un lector práctico para artículos largos en formato Markdown. Si usas Cursor o Claude Code y frecuentemente les pides que revisen documentación desde un enlace, una instancia local de pullmd te ahorrará mucho contexto y nervios.
Proyectos relacionados