Une extension Chrome et un CLI qui permettent à vos agents de contrôler votre vrai navigateur — avec les sessions, extensions et cookies déjà en place. Pas d'instance headless, pas de détection de bot, pas de mémoire supplémentaire. Star sur GitHub.

Les autres MCP navigateur lancent un nouveau Chrome — pas de sessions, pas d'extensions, détection de bot instantanée, double consommation mémoire. RunBrowser se connecte à votre navigateur en cours d'exécution. Une extension Chrome, un accès CDP complet, tous vos sites déjà connectés.

Démarrage

Trois étapes et votre agent commence à naviguer.

  1. Installez le CLI :
npm i -g @jiweiyuan/runbrowser
  1. Chargez l'extension dans Chrome : ouvrez chrome://extensions/, activez le mode développeur, cliquez Charger l'extension non empaquetée, sélectionnez le dossier packages/extension/dist

  2. Cliquez sur l'icône de l'extension sur un onglet — elle devient verte. Commencez à l'utiliser :

runbrowser navigate https://example.com runbrowser snapshot runbrowser click @e5

Pas de gestion de session nécessaire — les sessions sont créées automatiquement à la première commande. L'extension connecte votre navigateur à un relais WebSocket local sur localhost:19988. Le CLI envoie des commandes CDP à travers le relais. Pas de serveur distant, pas de compte.

Installez ensuite le skill — il apprend à votre agent comment utiliser RunBrowser :

npx -y skills add runbrowser/runbrowser

Icône verte = connecté. Grise = non attachée à cet onglet.

Fonctionnement

Cliquez sur l'icône de l'extension sur un onglet — elle se connecte via chrome.debugger et ouvre un WebSocket vers un relais local. Votre agent (CLI ou MCP) se connecte au même relais. Les commandes CDP transitent directement par l'extension vers Chrome — pas de Playwright, pas d'intermédiaire.

┌─────────────────────┐ ┌──────────────────────┐ ┌─────────────────┐ │ BROWSER │ │ LOCALHOST │ │ CLIENT │ │ │ │ │ │ │ │ ┌───────────────┐ │ │ WebSocket Server │ │ ┌───────────┐ │ │ │ Extension │<───────┬───> :19988 │ │ │ CLI / MCP │ │ │ └───────┬───────┘ │ WS │ │ │ └───────────┘ │ │ │ │ │ /extension │ │ │ │ │ chrome.debugger │ │ │ │ │ v │ │ v │ │ v │ │ ┌────────────┐ │ │ ┌───────────────┐ │ │ CDPExecutor │ │ │ HTTP API │ │ │ │ Tab 1 (green) │ │ │ (direct CDP) │ │ │ /api/* │ │ │ │ Tab 2 (green) │ │ └──────────────────────┘ │ └────────────┘ │ │ │ Tab 3 (gray) │ │ │ │ └─────────────────────┘ Tab 3 not controlled └─────────────────┘

Le relais multiplexe les sessions, plusieurs agents ou instances CLI peuvent travailler sur le même navigateur simultanément. Toutes les commandes passent directement par CDP — pas de dépendance Playwright.

Collaboration

L'agent travaille dans votre navigateur, donc vous pouvez collaborer. Vous voyez tout en temps réel — chaque clic affiche un surlignage vert sur l'élément ciblé, chaque commande produit un flash lumineux subtil. Quand un CAPTCHA apparaît, vous le résolvez. Quand un mur de consentement surgit, vous cliquez. Quand l'agent est bloqué, vous désactivez l'extension sur cet onglet, corrigez manuellement, la réactivez, et l'agent reprend là où il s'est arrêté.

Vous partagez un navigateur — l'agent fait le travail répétitif, vous intervenez quand il a besoin d'un humain.

Snapshots d'accessibilité

Votre agent doit voir la page avant d'agir. Les snapshots d'accessibilité retournent chaque élément interactif en texte, avec des labels @ref. 5–20 Ko au lieu de 100 Ko+ pour une capture d'écran — moins cher, plus rapide, analysable sans vision.

runbrowser snapshot # Sortie : # - banner: # - link "Home" @e1 # - navigation: # - link "Docs" @e2 # - link "Blog" @e3 # - main: # - heading "Welcome" @e4 # - button "Get started" @e5

Chaque @ref est directement utilisable dans les commandes. Utilisez les snapshots comme méthode principale pour lire les pages.

# Interagir avec les refs du snapshot runbrowser click @e5 runbrowser fill @e3 "terme de recherche" runbrowser get text @e4 # Filtrer les éléments interactifs uniquement runbrowser snapshot -i # Limiter à un sélecteur CSS runbrowser snapshot -S "main"

Commandes CLI

RunBrowser fournit 50+ commandes organisées par catégorie. Chaque commande supporte la sortie --json et la création automatique de session.

# Navigation runbrowser navigate https://example.com runbrowser back runbrowser forward runbrowser reload runbrowser close # Observation runbrowser snapshot # arbre d'accessibilité avec @refs runbrowser snapshot -i # éléments interactifs uniquement runbrowser screenshot shot.png # capture d'écran runbrowser get url # URL actuelle runbrowser get title # titre de la page runbrowser get text @e5 # texte de l'élément runbrowser is visible @e5 # vérifier l'état # Interaction runbrowser click @e5 # cliquer runbrowser fill @e3 "hello world" # vider + remplir runbrowser type "recherche" # taper au focus actuel runbrowser press Enter # touche runbrowser select @e5 "option-value" # sélectionner option runbrowser check @e5 # cocher runbrowser scroll down # défiler runbrowser hover @e5 # survoler runbrowser viewport 1280 720 # taille du viewport # Attente runbrowser wait @e5 # attendre élément visible runbrowser wait 2000 # attendre millisecondes runbrowser wait --text "Bienvenue" # attendre texte # Localisateurs sémantiques runbrowser find role button click --name "Soumettre" runbrowser find text "Connexion" click # Gestion onglets & cadres runbrowser tab list runbrowser tab new https://example.com runbrowser frame "iframe#embed" runbrowser frame main # Exécution runbrowser eval 'document.title' # exécuter JS dans le navigateur runbrowser cdp Page.captureScreenshot '{}' # commande CDP brute

Commandes plates pour le chemin chaud. Sous-groupes pour la gestion. eval pour tout le reste.

Commandes de site

Transformez n'importe quel site en commande CLI. Les commandes de site sont des plugins TypeScript qui encapsulent navigation, scraping et extraction de données. Un seul commande pour obtenir du JSON structuré.

# Repos tendance GitHub en données structurées runbrowser github trending --limit 5 # RANK NAME STARS LANGUAGE # --- ---- ----- -------- # 1 denoland/deno 5.2k Rust # 2 tauri-apps/tauri 3.8k Rust # Sortie JSON pour les agents runbrowser github trending --limit 3 --json

Créez vos propres commandes en déposant un fichier .ts dans ~/.runbrowser/commands/. TypeScript complet, support IDE complet.

// ~/.runbrowser/commands/github/trending.ts export const description = 'GitHub trending repositories' export const columns = ['rank', 'name', 'stars', 'language'] export const args = { limit: { type: 'number', default: 20, description: 'Number of items' }, } export async function run(ctx, args) { await ctx.navigate('https://github.com/trending') const data = await ctx.evaluate(` [...document.querySelectorAll('article.Box-row')].map(el => ({ name: el.querySelector('h2 a')?.textContent?.trim(), stars: el.querySelector('.octicon-star')?.parentElement?.textContent?.trim(), language: el.querySelector('[itemprop="programmingLanguage"]')?.textContent?.trim(), })) `) return data.slice(0, args.limit).map((item, i) => ({ rank: i + 1, ...item })) }

Plugins TypeScript. Données structurées. Une commande au lieu de naviguer → snapshot → parser.

Extensions de commandes

Installez des commandes maintenues par la communauté depuis le dépôt runbrowser/commands. Pas de clonage, pas d'étape de build — installez et utilisez.

# Lister les extensions de commandes disponibles runbrowser commands list # Available command extensions: # # reddit # youtube # x ✓ installed # hackernews # producthunt # Installer une extension runbrowser commands install reddit # ✓ Installed reddit/ # → ~/.runbrowser/commands/reddit/hot.ts # → ~/.runbrowser/commands/reddit/search.ts # Utiliser immédiatement runbrowser reddit hot --limit 5 runbrowser reddit search "automatisation navigateur" # Désinstaller runbrowser commands uninstall reddit # ✓ Uninstalled reddit/

Les commandes communautaires sont téléchargées comme fichiers TypeScript dans ~/.runbrowser/commands/<site>/. Elles suivent le même format que les commandes de site personnalisées — vous pouvez les lire, modifier ou forker.

Fonctionnement : Le CLI récupère les fichiers .ts depuis le dépôt GitHub runbrowser/commands et les sauvegarde localement. Le serveur relais les charge via jiti à l'exécution — pas de compilation nécessaire. Chaque extension est un répertoire avec un ou plusieurs fichiers de commandes.

Contribuez vos propres commandes : Créez un répertoire dans le dépôt runbrowser/commands avec vos fichiers .ts et soumettez une PR. Vos commandes deviennent disponibles pour tous via runbrowser commands install.

Modèle de sous-commandes cohérent. Maintenu par la communauté. Même format TypeScript que les commandes personnalisées.

Sessions

Les sessions sont créées automatiquement — exécutez une commande et ça fonctionne. Pour un usage avancé, gérez les sessions explicitement.

runbrowser session new # créer session, affiche l'id runbrowser session list # afficher sessions et clés d'état runbrowser session delete 1 # supprimer session

Exécutez plusieurs agents simultanément sans interférence. Chaque session est un bac à sable isolé. Les onglets sont partagés, l'état de session ne l'est pas.

# Ciblage de session explicite runbrowser navigate https://a.com -s 1 runbrowser navigate https://b.com -s 2 # Ou définir une session par défaut export RUNBROWSER_SESSION=1 runbrowser snapshot

Enregistrement vidéo

L'agent enregistre ses actions en vidéo MP4. L'enregistrement utilise chrome.tabCapture dans le contexte de l'extension, donc il survit à la navigation.

# Démarrer l'enregistrement runbrowser record start -o recording.mp4 # Naviguer, interagir — l'enregistrement continue entre les pages runbrowser navigate https://example.com runbrowser click @e5 # Arrêter et sauvegarder runbrowser record stop

Capture native d'onglet. Persiste à travers la navigation. Transcodage automatique H.264 MP4.

Intégration MCP

RunBrowser utilise un modèle MCP à 2 outilsskill et run. Pas de prolifération d'outils, pas de schéma volumineux.

{ "mcpServers": { "runbrowser": { "command": "npx", "args": ["-y", "@jiweiyuan/runbrowser-mcp@latest"] } } }

L'agent appelle skill pour découvrir les commandes, puis run pour les exécuter :

skill() → retourne la documentation CLI complète + commandes de site run({ command: "navigate https://example.com" }) run({ command: "snapshot" }) run({ command: "click @e1" }) run({ command: "eval document.title" })

L'outil run suit la même syntaxe que le CLI. L'agent n'a pas besoin d'apprendre une API séparée.

┌──────────────────────────────────────────────────────────────────────┐ │ Client MCP │ │ (Claude, Cursor, Windsurf...) │ └──────────────┬──────────────────────────────┬────────────────────────┘ │ │ skill() run(command) │ │ v v ┌──────────────────────────────────────────────────────────────────────┐ │ Serveur MCP RunBrowser │ │ │ │ ┌─────────────────┐ ┌──────────────────────────┐ │ │ │ outil skill │ │ outil run │ │ │ │ │ │ │ │ │ │ Retourne docs │ │ Parse la commande │ │ │ │ CLI + liste │ │ Envoie au relais │ │ │ │ de commandes │ │ Retourne le résultat │ │ │ └─────────────────┘ └────────────┬─────────────┘ │ │ │ │ └─────────────────────────────────────────────────┼───────────────────┘ │ HTTP / WS │ v ┌─────────────────────────┐ │ Relais :19988 │ │ CDPExecutor │ └────────────┬────────────┘ │ chrome.debugger │ v ┌─────────────────────────┐ │ Votre navigateur │ │ Chrome │ └─────────────────────────┘

Comparaison

Pourquoi choisir RunBrowser.

vs Playwright MCP
Playwright MCPRunBrowser
NavigateurLance un nouveau ChromeUtilise votre Chrome
ExtensionsAucuneVos extensions existantes
État de connexionNouveauDéjà connecté
Détection botToujours détectéPeut contourner
CollaborationFenêtre séparéeMême navigateur
vs BrowserUse
BrowserUseRunBrowser
LangagePythonTypeScript / Node.js
NavigateurLance un nouveau Chrome (Playwright)Utilise votre Chrome
ApprocheFramework agent IA (LLM décide)CLI + outils MCP (agent envoie commandes)
État de connexionNouveauDéjà connecté
CLINonOui — 50+ commandes
vs Agent Browser
Agent BrowserRunBrowser
NavigateurLance Chromium headlessVotre Chrome en cours
Commandes~90 (trop)~50 (ciblées)
Extensions de commandesNonOui — installer des commandes communautaires
CLIRust CLI → Node daemonNode CLI → relais (simple)
Détection botToujours détectéPeut contourner
Vrais ongletsNonOui

Accès distant

Contrôlez Chrome sur une machine distante — Mac mini headless, VM cloud, devcontainer. Démarrez le serveur relais avec un bind public et un token.

# Sur la machine hôte — démarrer le serveur relais runbrowser serve --host 0.0.0.0 --token <secret> # De n'importe où — définir les variables d'environnement export RUNBROWSER_HOST=192.168.1.10 export RUNBROWSER_TOKEN=<secret> runbrowser navigate https://example.com

Fonctionne aussi pour devcontainers et Docker — utilisez RUNBROWSER_HOST=host.docker.internal.

Sécurité

Tout fonctionne sur votre machine. Le relais est lié à localhost:19988 et n'accepte que les connexions de l'extension. Pas de serveur distant, pas de compte, pas de télémétrie.

  • Local uniquement — Le serveur WebSocket est lié à localhost. Rien ne quitte votre machine.
  • Validation d'origine — seule l'origine de l'extension RunBrowser est acceptée. Les sites malveillants ne peuvent pas se connecter.
  • Consentement explicite — seuls les onglets où vous avez cliqué sur l'icône sont contrôlés.
  • Automatisation visible — Chrome affiche une bannière sur les onglets contrôlés. Chaque action de l'agent a un retour visuel (surlignage vert).
RunBrowser - Extension Chrome et CLI pour que vos agents utilisent votre vrai navigateur