Comment alimenter un réseau de neurones avec n'importe quelle page sans pollution publicitaire ni tokens supplémentaires
Lorsqu'on donne à un agent LLM du web scraping classique, des tas de menus de navigation, pieds de page, bannières et murs de balisage s'invitent instantanément dans le contexte. Alongside a few-thousand-word article, the agent gets a megabyte of garbage, the context window gets filled up, and the token bill grows.
Récemment, je suis tombé sur le projet pullmd. C'est un service auto-hébergé qui prend une URL de page ou de fichier et renvoie du Markdown propre. Pas de bloat supplémentaire, pas de duplication de métadonnées dans le texte, et quelques fonctionnalités qui manquent souvent dans les bibliothèques de parsing standard.
Ce qui se cache sous le capot
Les créateurs du projet ont combiné plusieurs outils éprouvés. Lorsqu'une URL arrive, le service vérifie d'abord la présence de Markdown natif depuis Cloudflare. S'il n'y est pas, Mozilla Readability et Trafilatura prennent le relais.
Parfois une page est entièrement construite avec React ou Vue et le HTML brut retourne un modèle vide. Dans ces situations, pullmd lance un sidecar Playwright, rend la page dans Chromium headless, et en extrait le contenu. Si vous n'avez pas besoin du navigateur lourd, vous pouvez simplement désactiver le conteneur Playwright depuis docker-compose.yml, libérant ainsi environ 3,7 Go d'espace disque. Dans ce cas, le service continuera à fonctionner via le parsing statique classique.
Tous les résultats atterrissent dans une base SQLite locale. Si vous demandez la même URL dans l'heure, la réponse retourne instantanément depuis le cache. Chaque conversion se voit attribuer un identifiant court permanent, ainsi un lien comme /s/:id peut être utilisé comme un flux stable.
Fonctionnalités principales qui font gagner du temps
Threads Reddit et Hacker News
Habituellement les scripts trébuchent sur les pages de commentaires. Ici le parser est spécifiquement entraîné pour parser les threads Reddit et Hacker News. La sortie est un arbre de commentaires structuré avec l'imbrication, les auteurs et les comptages de votes préservés.
Recherche page via BM25
Une des meilleures trouvailles dans la troisième version du service. Si vous passez le paramètre ?query=как настроить базу dans la requête, pullmd ne retournera pas toute la documentation multi-pages. Le service décompose le Markdown en sections par les headers, les classe en utilisant l'algorithme BM25, et livre uniquement les blocs qui répondent à la question. Pour les grandes pages, cela réduit l'utilisation des tokens de 70% à 95%, accélérant заметно les performances de l'agent. Les tableaux et les blocs de code restent intacts.
Documents, vidéo et audio
Le service gère bien plus que les sites web. Lorsque vous connectez un sidecar MarkItDown de Microsoft, il traite les PDFs, fichiers Word, tableurs Excel, présentations PowerPoint et ebooks EPUB.
Si vous passez un lien YouTube, le service extrait la transcription de la vidéo avec des horodatages cliquables—aucune clé API requise. Pour la reconnaissance d'images et audio, vous pouvez configurer un endpoint pour n'importe quel modèle compatible OpenAI ou serveur local comme Ollama.
Serveur MCP intégré et intégrations
Plusieurs options de connexion sont disponibles pour l'intégration des agents :
- API REST standard (
GET /api?url=...) - Serveur MCP pour Cursor, Claude Desktop et autres clients compatibles
- Plugin prêt à l'emploi pour Claude Code
- Interface web PWA avec support du glisser-déposer de fichiers directement depuis l'explorateur de fichiers
Sécurité et protection SSRF
Les services qui récupèrent des données depuis des URL arbitraires sont vulnérables aux attaques SSRF. Un utilisateur pourrait fournir au parser une adresse de réseau interne ou des métadonnées de fournisseur cloud.
pullmd inclut une validation des adresses. Avant chaque requête et à chaque étape de redirection, les adresses IP de l'hôte sont résolues. Si une adresse tombe dans les plages d'adresses réseau privées, loopback, CGNAT, ou les plages de métadonnées cloud comme 169.254.169.254, la requête est bloquée immédiatement avec une erreur 403. Pour un accès intentionnel à un wiki interne, les adresses peuvent être mises en liste blanche via la variable d'environnement PULLMD_ALLOWED_HOSTS.
Comment déployer
Pour un démarrage basique, un seul fichier docker-compose.yml suffit :
mkdir pullmd && cd pullmd
curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
docker compose up -d
Le service se lancera sur le port 3000. L'authentification est désactivée par défaut, mais vous pouvez la configurer : le mode administrateur unique et le mode multi-utilisateur avec inscription et cookies de session sont tous deux supportés.
Exemple d'une requête API simple :
curl "http://localhost:3000/api?url=https://news.ycombinator.com/item?id=1"
Pour se connecter à Claude Code, une seule commande suffit :
claude mcp add --transport http pullmd http://localhost:3000/mcp
À qui c'est destiné
Le projet s'est avéré propre et pratique. Il a moins de cinq cents étoiles GitHub, mais la base de code semble mature : structure modulaire propre, fichier de migration détaillé, et dépendances externes minimales dans le conteneur principal.
L'outil conviendra à ceux qui construisent des pipelines RAG, configurent des assistants IA locaux, ou veulent simplement un lecteur pratique pour les longs articles en format Markdown. Si vous utilisez Cursor ou Claude Code et leur demandez souvent de revoir la documentation depuis un lien, une instance pullmd locale vous fera économiser beaucoup de contexte et de nerfs.
Projets similaires