🕶️ Ce que tu reçois : les commandes d'install (Mac Intel et Apple Silicon), la config MCP pour Claude Desktop et Claude Code, la liste des outils browser_* et les cas où il vaut mieux rester sur Chrome.
Dix minutes d'install. À la fin, ton Claude navigue sur le web sans lancer un Chrome complet à chaque page, et il lit les sites en markdown propre au lieu d'avaler du HTML brut.
Le problème qu'il règle
Quand tu donnes un accès navigateur à un agent (Playwright, Puppeteer, la plupart des MCP browser), tu lances un vrai navigateur de bureau. Chrome headless, c'est 200 Mo et plus de RAM par instance et environ deux secondes de démarrage. Pour lire une page de texte.
Deux conséquences concrètes :
- Tu ne peux pas paralléliser. Dix agents qui scrapent en même temps, c'est 2 Go de RAM juste pour les navigateurs.
- Ton contexte part en fumée. L'agent récupère la page en HTML brut. Sur un site moderne, tu as des milliers de tokens de
div, de classes Tailwind et de scripts avant d'arriver au premier mot utile.
Obscura attaque les deux : 30 Mo par instance, démarrage instantané, et une sortie markdown native.
C'est quoi exactement
Un moteur de navigateur headless écrit en Rust, avec V8 embarqué pour exécuter le JavaScript pour de vrai. Il implémente le Chrome DevTools Protocol, donc il se branche en remplacement de Chrome sur Puppeteer et Playwright sans toucher à ton code.
Et surtout, pour ce qui nous intéresse ici : il embarque son propre serveur MCP. Pas de wrapper à installer, pas de dépendance Node. Une commande et ton agent a des mains.
Licence Apache 2.0, pas de version payante, pas de fonctionnalité bloquée.
⚠️ Sois lucide sur les chiffres. Les 30 Mo contre 200 Mo et le « démarrage instantané » viennent du README du projet, pas d'un benchmark indépendant. L'écart est réel et évident à l'usage, mais prends les valeurs exactes pour ce qu'elles sont. Le projet est aussi jeune : compte quelques rugosités sur les sites les plus tordus.
Prérequis
- Un terminal : rien d'autre à installer, le binaire est autonome.
- Claude Desktop ou Claude Code : pour brancher le MCP. Les deux marchent.
- Savoir ton processeur : menu Pomme → À propos. « Puce M1/M2/M3/M4 » = Apple Silicon.
Installation sur Mac
1. Télécharger et extraire
Apple Silicon (M1 à M4)
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz
Intel
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-macos.tar.gz
tar xzf obscura-x86_64-macos.tar.gz
2. Lever le blocage Gatekeeper
macOS bloque les binaires téléchargés hors App Store. Une commande :
xattr -d com.apple.quarantine ./obscura
3. Le rendre disponible partout
sudo mv ./obscura /usr/local/bin/
4. Vérifier
obscura --version
which obscura
Garde bien le chemin que te renvoie which, tu en as besoin à l'étape suivante. Normalement /usr/local/bin/obscura.
💡 Sur Linux : même procédé avecobscura-x86_64-linux.tar.gz, sans l'étape Gatekeeper. Sur Arch,yay -S obscura-browserfait tout. Et il y a une image Docker si tu préfères :docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura.
Brancher le MCP sur Claude
Claude Desktop
Ouvre ~/Library/Application Support/Claude/claude_desktop_config.json et ajoute l'entrée obscura :
{
"mcpServers": {
"obscura": {
"command": "/usr/local/bin/obscura",
"args": ["mcp"]
}
}
}
Si tu as déjà d'autres serveurs MCP, ajoute juste le bloc "obscura" à l'intérieur de mcpServers sans écraser les autres. Redémarre Claude Desktop complètement (Cmd+Q, pas juste fermer la fenêtre).
Claude Code
claude mcp add obscura /usr/local/bin/obscura mcp
Vérifier que ça a pris
Demande simplement à Claude : « quels outils navigateur tu as ? ». Tu dois voir apparaître la famille browser_*.
Ce que ton agent récupère
| Famille | Outils | À quoi ça sert |
|---|---|---|
| Navigation | browser_navigate, browser_back, browser_forward, browser_reload, browser_close | Se déplacer sur le web |
| Lecture | browser_markdown, browser_snapshot, browser_links, browser_extract | Récupérer le contenu. browser_markdown est celui que tu veux dans 90 % des cas |
| Interaction | browser_click, browser_fill, browser_fill_form, browser_type, browser_press_key, browser_select_option, browser_scroll | Cliquer, remplir des formulaires, naviguer dans une interface |
| Repérage | browser_interactive_elements, browser_detect_forms, browser_search, browser_count, browser_get_attribute | Trouver quoi cliquer avant de cliquer |
| Attente | browser_wait_for, browser_wait_for_text, browser_evaluate | Gérer les pages qui chargent en JavaScript |
| Onglets | browser_tab_new, browser_tab_list, browser_tab_switch, browser_tab_close | Travailler sur plusieurs pages en parallèle |
| Session | browser_get_cookies, browser_set_cookie, browser_storage_state, browser_set_storage_state | Rester connecté entre deux sessions |
| Debug | browser_network_requests, browser_console_messages | Voir ce qui se passe quand ça foire |
Tester en ligne de commande
Avant de laisser ton agent jouer avec, prends deux minutes pour voir ce que ça donne.
Le titre d'une page
obscura fetch https://example.com --eval "document.title"
Une page en markdown
obscura fetch https://news.ycombinator.com --dump markdown
Le même site en HTML brut, pour comparer
obscura fetch https://news.ycombinator.com --dump html
Compare la taille des deux sorties. C'est exactement l'écart que tu économises sur ton contexte à chaque page que ton agent visite.
Ne garder que le contenu utile
obscura fetch https://docs.example.com/page --selector "main" --dump markdown --quiet -o page.md
--selector prend un sélecteur CSS et jette la nav, la sidebar et le footer. --quiet enlève les logs pour ne garder que le markdown.
Attendre une page qui charge en JS
obscura fetch https://mon-spa.example --wait-until load --dump markdown
Plusieurs pages d'un coup
obscura scrape url1 url2 url3 --concurrency 25 --format json
Le remplacer dans un projet Puppeteer existant
Si tu as déjà du code Puppeteer ou Playwright, tu n'as rien à réécrire. Lance le serveur CDP :
obscura serve --port 9222
Puis connecte-toi dessus au lieu de laisser Puppeteer lancer son Chrome :
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser',
});
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');
Quand ça vaut le coup, quand non
| Situation | Verdict |
|---|---|
| Un agent qui lit de la doc, des articles, des fiches produit | ✅ C'est exactement pour ça. La sortie markdown change tout sur la conso de contexte |
| Scraper des centaines de pages en parallèle | ✅ L'écart de RAM devient énorme dès que tu montes en volume |
| Remplir des formulaires, cliquer dans une interface web | ✅ Les outils sont là et couvrent le nécessaire |
| Une app web très lourde en rendu (canvas, WebGL, vidéo) | ⚠️ Reste sur Chrome. Le moteur de rendu d'Obscura est jeune |
| Tester visuellement ton propre site avant livraison | ⚠️ Garde un vrai navigateur. Tu veux voir ce que voit ton client, pas une approximation |
Le projet embarque aussi un mode furtif avec randomisation d'empreinte. Je ne le documente pas ici : ça sert à contourner les protections anti-bot, et sur un projet client ça t'expose plus que ça ne te sert. Si tu as besoin d'accéder à une donnée, cherche d'abord l'API officielle.
Récap
| Étape | Commande |
|---|---|
| Télécharger (Mac M1-M4) | curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz |
| Extraire | tar xzf obscura-aarch64-macos.tar.gz |
| Débloquer Gatekeeper | xattr -d com.apple.quarantine ./obscura |
| Installer | sudo mv ./obscura /usr/local/bin/ |
| Vérifier | obscura --version |
| Brancher sur Claude Code | claude mcp add obscura /usr/local/bin/obscura mcp |
| Tester | obscura fetch https://example.com --dump markdown |
Ressources
- 📦 Dépôt GitHub : github.com/h4ckf0r0day/obscura
- 📖 Wiki et guides : github.com/h4ckf0r0day/obscura/wiki
- 🏷️ Dernières versions : github.com/h4ckf0r0day/obscura/releases