Skip to main content
Glama
momadhuynh04

ProBrowser

by momadhuynh04

ProBrowser

Servidor MCP de automatización de navegador real para agentes de IA — Anti-detección

29 herramientas · conexión CDP a tu Opera/Chrome real · entrada humanizada · híbrido DOM + Visión

Python MCP PhantomWright CDP Tests Platform License

CaracterísticasPipelineInicio rápidoUsoConfiguraciónArquitecturaEstructura del proyectoAnti-detección

🌐 Idioma: Inglés | Tiếng Việt


[!WARNING] Desarrollado y probado solo en Arch Linux kernel Linux 7.1.5-arch1-2 · Escritorio: KDE Plasma Otras distribuciones y escritorios no están probados: YMMV.


Un servidor MCP que permite a los agentes de IA (Kilo, Claude Code, …) controlar el navegador real del usuario a través del Model Context Protocol. Sin modo headless ni perfiles desechables: el agente se conecta por CDP al Opera/Chrome en ejecución con todas las sesiones, cookies y accesos intactos, y lo maneja con tiempos similares a los humanos y una estrategia DOM-primero / visión-de-respaldo.

✨ Características

Característica

Descripción

🔌 Control de navegador real

connect_over_cdp se conecta al navegador en ejecución en el puerto 9222 — sesiones, cookies y extensiones conservadas. Nunca lanza modo headless ni perfiles nuevos a menos que se le pida.

🧰 29 herramientas MCP

Navegación, pestañas, clic/escribir/hover/teclado, desplazamiento, arrastrar y soltar, extracción de DOM/texto, evaluación de JS, 3 variantes de screenshot, kit de CAPTCHA, detección del sistema.

🕒 Entrada humana

Retardos entre teclas con distribución gaussiana (45–75 PPM), pausas naturales entre mousedown↔mouseup, scroll con ease-out cúbico — implementado como una capa de anticipación, sin inyección de JS.

🔍 Híbrido DOM + Visión

Extracción estructurada del DOM (get_dom, find, get_text) primero; screenshots + clics por coordenadas como respaldo cuando el DOM no es suficiente.

🎯 Validación de posición

Antes de cualquier clic por coordenadas: screenshot anotado con cruces X/Y rojas exactamente en el origen O=(x,y) + sonda del elemento, advertencias (pointer-events:none, disabled, iframe).

🧩 Kit CAPTCHA

Detección automática de reCAPTCHA/hCaptcha/Turnstile/Cloudflare tras la navegación; resolución de rejillas con visión del agente (captcha_grid → seleccionar casillas → solve_captcha); autofirma opcional con la API de 2Captcha.

🗂️ Gestión de pestañas

Lista / Cambia / abre / cierra pestañas — flujos multi-pestaña en un solo navegador real.

🚨 Errores accionables

Cada error devuelve un objeto estructurado {error_code, error, recoverable, suggestion}TIMEOUT, SELECTOR_NOT_FOUND, CDP_CONNECTION_LOST, NETWORK_ERROR

📚 Autodocumentado

browse_help(topic=...) incluye 11 temas dentro del servidor; browse_list_tools refleja el catálogo completo en tiempo de ejecución.

Probado

87 pruebas unitarias (páginas falsas, sin navegador real) + suite de integración real (pytest -m integration).

Related MCP server: selenium-mcp

🏭 Pipeline

 ┌──────────┐   ┌────────────┐   ┌─────────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
 │ CONNECT  │ → │   ORIENT   │ → │     SEE     │ → │   PLAN   │ → │   ACT    │ → │  VERIFY  │
 │ check_   │   │ navigate + │   │ screenshot  │   │ selector │   │ click /  │   │ re-read  │
 │ browser  │   │ wait idle  │   │ get_dom     │   │ or coords│   │ type     │   │ state    │
 └──────────┘   └────────────┘   └─────────────┘   └──────────┘   └──────────┘   └──────────┘
      │                                                    │
      ▼ not running                                        ▼ DOM miss
 ┌──────────────┐                              ┌──────────────────────────┐
 │ open_browser │                              │ validate_position(x, y)  │
 │ (real profile│                              │ → annotated O=(x,y) shot │
 │  + CDP flag) │                              │ → click_position(x, y)   │
 └──────────────┘                              └──────────────────────────┘

Flujo de ejecución de herramientas (ejemplo browse_click):

agent call → pre-click Gaussian delay (~80ms)
           → PhantomWright Actionability Engine (visible? enabled? stable? unobscured?)
           → CDP Input.dispatchMouseEvent (trusted gesture, NOT element.click())
           → post-click pause (~150ms)
           → result JSON (+ optional verification screenshot)

La detección automática de CAPTCHA/overlays de anuncios se ejecuta después de cada browse_navigate / browse_wait.

🚀 Inicio Rápido

Requisitos

  • Arch Linux (plataforma de desarrollo/pruebas) — kernel 7.1.5-arch1-2, KDE Plasma

  • Python 3.11+ — comprueba con python --version

  • Un navegador basado en Chromium — Opera (recomendado), Chrome, Chromium o Brave

  • Un cliente MCP — Kilo CLI, Claude Code o cualquier cosa que hable MCP stdio

Instalación

# 1. Clone
git clone https://github.com/YOUR_USER/probrowser.git
cd probrowser

# 2. Setup (venv + deps + verify)
./setup.sh
# ...or manually:
python -m venv .venv
.venv/bin/pip install -r requirements.txt

Regístralo con tu cliente MCP

kilo.json (raíz del proyecto):

{
  "mcp": {
    "probrowser": {
      "type": "local",
      "command": ["/absolute/path/to/probrowser/.venv/bin/python", "-m", "src"],
      "enabled": true,
      "timeout": 120000
    }
  }
}

Para usuarios de Claude Code: el mismo servidor mediante .mcp.json. Reinicia el cliente para que se carguen las 29 herramientas browse_*.

Primera ejecución

# Option A — start Opera yourself with CDP enabled:
opera --remote-debugging-port=9222

# Option B — let the agent do it (real profile, cookies intact):
browse_check_browser()          # → not connected?
browse_open_browser(browser="opera")

Después solo habla con tu agente: "abre YouTube y reproduce One of These Nights" — él se conectará, navegará, hará clic y verificará la reproducción por sí solo.

💻 Uso

Grupos de herramientas

Grupo

Herramientas

Navegación y pestañas

browse_navigate · browse_wait · browse_list_tabs · browse_switch_tab · browse_open_tab · browse_close_tab

Interacción

browse_click · browse_validate_position · browse_click_position · browse_type · browse_hover · browse_keyboard · browse_scroll · browse_drag_drop

Extracción

browse_get_dom · browse_find · browse_get_text · browse_eval

Capturas de pantalla

browse_screenshot · browse_screenshot_viewport · browse_screenshot_save

CAPTCHA

browse_check_captcha · browse_captcha_grid · browse_solve_captcha

Sistema

browse_detect_browsers · browse_check_browser · browse_open_browser

Meta

browse_help · browse_list_tools

Referencia completa de parámetros: docs/tools-reference.md o browse_help(topic="tools-reference") en tiempo de ejecución.

Ejemplo de flujo

→ browse_check_browser()
← { connected: false }                      # nothing on :9222 yet

→ browse_open_browser(browser="opera")
← { launched: true, profile: "~/.config/opera", cdp_url: "...:9222" }

→ browse_navigate(url="https://youtube.com/...")
← { success: true, title: "..." }           # auto CAPTCHA scan ran here

→ browse_get_dom(search="One of These Nights")
← { count: 10, elements: [{type: "link", selector: "a[aria-label=...]"}] }

→ browse_click(selector="a[aria-label=...]")
← { success: true }

→ browse_eval(expression="() => {const v=document.querySelector('video'); return {paused: v.paused, time: v.currentTime}}")
← { paused: false, time: 3.1 }              # verified: audio is playing 🎵

Servidor independiente

PROBROWSER_CDP_URL=http://localhost:9222 .venv/bin/python -m src

⚙️ Configuración

Toda la configuración en tiempo de ejecución se gestiona mediante variables de entorno:

Variable

Por defecto

Descripción

PROBROWSER_CDP_URL

http://localhost:9222

Endpoint de CDP al que conectarse al inicio

PROBROWSER_TOOL_TIMEOUT_MS

120000

Límite duro por llamada de herramienta (protección del bucle de eventos compartido)

PROBROWSER_CAPTCHA_ENABLED

1

Interruptor principal del subsistema de CAPTCHA

PROBROWSER_CAPTCHA_AUTO_DETECT

1

Escaneo de CAPTCHA/anuncios después de navegar

CAPTCHA_API_KEY

Clave de API de 2Captcha (auto-resolución de retos de texto; la rejilla se resuelve con visión del agente)

PROBROWSER_CAPTCHA_MAX_AWAIT_MS

60000

Tiempo máximo de espera para la resolución asistida por API

La configuración del lado del cliente MCP (timeout, enabled) vive en kilo.json — deliberadamente fuera de git (ver .gitignore).

🏛️ Arquitectura

┌──────────────────────────────────────────────────────────┐
│                AI Agent (Kilo / Claude Code)              │
│        plan → browse_* tool call → evaluate → repeat      │
└───────────────────────┬──────────────────────────────────┘
                        │ MCP Protocol (stdio, JSON-RPC)
                        ▼
┌──────────────────────────────────────────────────────────┐
│              ProBrowser MCP Server (Python)               │
│   tool registry (29) → action coordinator → humanize.py   │
│        (Gaussian delays · WPM typing · scroll easing)     │
│   analyzer/: dom_parser · hybrid_strategy · captcha       │
└───────────────────────┬──────────────────────────────────┘
                        │ CDP — Input.dispatch* events only
                        ▼
┌──────────────────────────────────────────────────────────┐
│         User's Real Browser (Opera/Chrome, port 9222)     │
│            sessions · cookies · logins preserved          │
└──────────────────────────────────────────────────────────┘

Decisiones clave de diseño

Decisión

Justificación

Todo en Python

PhantomWright + mcp SDK son ambos Python: un solo lenguaje, un solo proceso, cero IPC.

PhantomWright en lugar de entrada de SO

Sin hacks de ydotool/xdotool/KWin; los eventos a nivel de CDP funcionan en Wayland y nunca bloquean la entrada del usuario.

Entrada CDP en lugar de inyección JS

Input.dispatchMouseEvent es un gesto confiable; element.click() es detectable y frágil.

connect_over_cdp en lugar de lanzar navegadores

La sesión del usuario ES el producto: sin re-login, sin cookies perdidos.

La visión la decide el agente

El servidor extrae geometría/capturas; el propio modelo de visión del agente decide las coordenadas.

📁 Estructura del proyecto

probrowser/
├── main entry
│   ├── src/__main__.py            # python -m src → stdio MCP loop
│   └── src/server.py              # registry (29 tools) + dispatch + timeouts + captcha hooks
├── core
│   ├── src/browser/connection.py  # connect_over_cdp, session persistence, page recovery
│   ├── src/browser/tab_manager.py # tab discovery / switching
│   ├── src/humanize.py            # Gaussian timing middleware
│   ├── src/errors.py              # classify_exception → structured error codes
│   ├── src/config.py              # env-driven configuration
│   └── src/logging.py             # per-action latency/success logging
├── tools (src/tools/, 29 modules)
│   ├── navigate · wait · list_tabs · switch_tab · open_tab · close_tab
│   ├── click · validate_position · click_position · type · hover · keyboard
│   ├── scroll · drag_drop
│   ├── get_dom · find · get_text · eval_js
│   ├── screenshot · screenshot_viewport · screenshot_save
│   ├── check_captcha · captcha_grid · solve_captcha
│   └── detect_browsers · check_browser · open_browser · help · list_tools
├── analyzer (src/analyzer/)
│   ├── dom_parser.py              # DOM → simplified JSON (interactive + visible only)
│   ├── hybrid_strategy.py         # DOM-first, vision fallback
│   └── captcha.py                 # CAPTCHA/ad-overlay detection
├── captcha (src/captcha/)
│   ├── grid.py                    # grid geometry + cropped screenshot extraction
│   └── solver.py                  # tile clicking + verify flow
├── docs/                          # 11 topics served via browse_help()
├── tests/                         # 87 unit tests + integration suite
├── AGENTS.md / CLAUDE.md          # operating guide injected into agents
└── dev-phase-mcp-server.md        # dev-phase principles

🛡️ Anti-detección

Pila de evasión del navegador

Capa

Implementación

Detalle

Motor

PhantomWright (controlador Playwright parcheado)

navigator.webdriver oculto a nivel de dicho motor

Parches

Parches de sigilo antes de ejecutar JS de página

window.chrome, plugins, proveedor WebGL, codecs de audio

Entrada

Gestos confiables CDP Input.dispatch*

Ni element.click(), ni simulación a nivel de SO

Sesión

Perfil real del usuario + IP real + extensiones

No cambia nada de la huella

Timing

Middleware humanizado en cada acción

Retrasos gaussianos, PPM natural, desplazamiento suave

Lo que sigue funcionando

Tus inicios de sesión, cookies, estado de las extensiones, reputación de IP, huellas de canvas/WebGL/audio: todo se mantiene original o intacto porque el navegador es suyo.

Limitaciones

Servicios antibot agresivos (Cloudflare Turnstile, análisis de comportamiento de hCaptcha) pueden seguir detectando algo por la reputación de la IP. Ruta alternativa: capturas de pantalla + validate_positionclick_position, junto con el kit de herramientas de CAPTCHA.

🧪 Pruebas

# Unit suite — fake pages, no browser required (87 tests)
.venv/bin/python -m pytest tests/ -q

# Integration suite — needs Opera running with CDP
.venv/bin/python -m pytest tests/test_integration.py -m integration

Tính năng

Característica

Descripción

🌐 Control del navegador real

Se conecta a Opera/Chrome en ejecución mediante CDP — conserva sesión, cookies e inicio de sesión

🧰 29 herramientas MCP

Navegación, pestañas, clic/escribir/hover/teclado, desplazamiento, arrastrar y soltar, extracción de DOM/texto, JS, capturas, CAPTCHA

🕒 Simulación humana

Retardo gaussiano entre teclas (45–75 PPM), ritmo de clic natural, desplazamiento con ease-out

🔍 DOM híbrido + Visión

Prioriza el DOM estructurado; solo recurre a capturas de pantalla + coordenadas si falta

🎯 Verificación de coordenadas

La imagen anota los ejes X/Y que se cruzan exactamente en O=(x,y) antes de hacer clic en las coordenadas

🧩 Procesador de CAPTCHA

Detección automática tras la navegación; resuelve rejillas con la visión del agente; auto-resolución mediante 2Captcha

🚨 Errores accionables

Cada error devuelve {error_code, suggestion} — el agente sabe qué hacer a continuación

✅ Probado

87 pruebas unitarias + suite de integración en navegador real

Instalación rápida

git clone https://github.com/YOUR_USER/probrowser.git && cd probrowser
./setup.sh                                   # venv + dependencies + verify
opera --remote-debugging-port=9222           # hoặc để agent tự mở

Declara el servidor en kilo.json (consulta Quick Start), reinicia el cliente, y listo.


Hecho con 🎵 en Arch Linux · MIT License

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    B
    quality
    F
    maintenance
    Enables AI agents to directly control your real Chrome browser with full context including login sessions, cookies, and open tabs. It provides tools for page scanning, JavaScript execution, CDP control, screenshots, and physical mouse/keyboard input for authentic browser automation.
    20
    239
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to create and control real, isolated browser profiles with engine-level fingerprinting and per-profile proxies, providing antidetect browsing capabilities through a Model Context Protocol interface.
    MIT

View all related MCP servers

Related MCP Connectors

  • Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.

  • Live browser debugging for AI assistants — DOM, console, network via MCP.

  • A paid remote MCP for AI agent browser approval MCP, built to return verdicts, receipts, usage logs,

View all MCP Connectors

Latest Blog Posts

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/momadhuynh04/probrowser'

If you have feedback or need assistance with the MCP directory API, please join our Discord server