feat(browser_mcp): add browser_list/launch_profile/close lifecycle tools
Three MCP tools to manage the user's Chromium instances by profile, distinct from browser_launch's isolated automation Chrome: - browser_list: enumerate running Chromium master processes by scanning /proc/*/cmdline (has --user-data-dir, no --type=). Returns pid, profile, user_data_dir, cdp_port, has_cdp as a JSON array. - browser_launch_profile: launch a concrete profile using the REAL binary /usr/lib/chromium/chromium (bypassing the /usr/bin/chromium wrapper). No CDP by default so Google keeps the session for human profiles; cdp=true adds --remote-debugging-port + --remote-allow-origins=*. Detects DISPLAY/XAUTHORITY from the XFCE session and launches decoupled via setsid. - browser_close: locate a master by profile/cdp_port/pid, SIGTERM with a 10s wait, then SIGKILL as a last resort. Per-profile instances are NOT registered in the connection pool: they are user-facing and survive the MCP dying; cleanup is explicit via browser_close. Unit tests for cmdline master detection, flag parsing, and close-target matching. Bumps version 0.6.0 -> 0.7.0 (42 -> 45 tools). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
name: browser_mcp
|
||||
lang: go
|
||||
domain: infra
|
||||
version: 0.6.0
|
||||
description: "Servidor MCP que expone control total del navegador via CDP (42 tools: navegación, DOM, cookies, iframes, teclado/scroll, diálogos, estado de sesión, selección determinista de pestaña, lectura compacta texto/AX nativa + bucle percibir→actuar por #ref con auto-observe, percepción y lectura de texto dentro de iframes, click por coordenadas, y screenshot devuelto como image content que el LLM ve) reusando funciones del dominio browser del registry con un pool de conexiones CDP vivas. Por defecto opera sobre un Chrome aislado (puerto 9333) separado del navegador diario."
|
||||
version: 0.7.0
|
||||
description: "Servidor MCP que expone control total del navegador via CDP (45 tools: navegación, DOM, cookies, iframes, teclado/scroll, diálogos, estado de sesión, selección determinista de pestaña, lectura compacta texto/AX nativa + bucle percibir→actuar por #ref con auto-observe, percepción y lectura de texto dentro de iframes, click por coordenadas, screenshot devuelto como image content que el LLM ve, y gestión del ciclo de vida de Chromium por perfil: listar masters en ejecución, lanzar un perfil concreto con o sin CDP, y cerrar limpio) reusando funciones del dominio browser del registry con un pool de conexiones CDP vivas. Por defecto opera sobre un Chrome aislado (puerto 9333) separado del navegador diario."
|
||||
tags: [mcp, browser, cdp, automation, scraping]
|
||||
e2e_checks:
|
||||
- id: build
|
||||
@@ -118,13 +118,33 @@ podría manipular pestañas ajenas del usuario (banca, correo). Para evitarlo:
|
||||
- Para adjuntarte deliberadamente al navegador diario, pasa `port: 9222` explícito en cada
|
||||
tool. Hazlo solo con cuidado.
|
||||
|
||||
## Tools (42)
|
||||
## Tools (45)
|
||||
|
||||
### Sesión (`tools_session.go`)
|
||||
- `browser_launch` (MUTA) — lanza Chrome con CDP. args: port, headless, user_data_dir, url.
|
||||
- `browser_connect` — abre/poolea la conexión CDP del puerto. args: port.
|
||||
- `browser_disconnect` — cierra y descarta la conexión del puerto (no mata Chrome). args: port.
|
||||
|
||||
### Ciclo de vida por perfil (`tools_lifecycle.go`)
|
||||
Gestionan los Chromium del USUARIO por perfil (`Personal`, `Work`, ...), distintos del Chrome
|
||||
de automatización aislado de `browser_launch`. Las instancias lanzadas aquí NO se registran en el
|
||||
pool: son de uso humano y sobreviven a la muerte del MCP; se cierran explícitamente con
|
||||
`browser_close`.
|
||||
- `browser_list` — lista los procesos MASTER de Chromium en ejecución (con `--user-data-dir`,
|
||||
SIN `--type=`). Para cada uno: pid, profile, user_data_dir, cdp_port, has_cdp. Devuelve JSON
|
||||
array. Read-only. args: (ninguno).
|
||||
- `browser_launch_profile` (MUTA) — lanza Chromium para un perfil concreto en la pantalla del
|
||||
usuario, usando el binario REAL `/usr/lib/chromium/chromium` (salta el wrapper). Con `cdp=false`
|
||||
(default) NO añade flags de remote-debugging — necesario para perfiles humanos (Google mantiene
|
||||
la sesión; con CDP la trata como automatizada y la tira). Con `cdp=true` añade
|
||||
`--remote-debugging-port` + `--remote-allow-origins=*`. Detecta DISPLAY/XAUTHORITY de la sesión
|
||||
XFCE y lanza DESACOPLADO (setsid). Si un master ya posee el user_data_dir, Chromium reenvía la
|
||||
apertura a él (`note` en el resultado). args: profile (requerido), user_data_dir
|
||||
(default `~/.config/chromium-cdp`), url, cdp (default false), cdp_port (default 9222).
|
||||
- `browser_close` (MUTA) — cierra un master limpio. Lo localiza por `profile`, `cdp_port` o `pid`.
|
||||
Envía SIGTERM, espera hasta 10s, y SIGKILL como último recurso (indicado en `method`). Devuelve
|
||||
{closed, pid, method}. args: uno de profile, cdp_port o pid.
|
||||
|
||||
### Navegación + tabs (`tools_nav.go`)
|
||||
- `tab_navigate` (MUTA) — `Page.navigate`. args: port, url.
|
||||
- `tab_list` — lista targets via `GET /json`. args: port.
|
||||
@@ -241,11 +261,11 @@ Transporte HTTP (Streamable HTTP):
|
||||
### Flag `--read-only`
|
||||
|
||||
Con `--read-only`, el servidor NO registra las tools mutantes (marcadas MUTA arriba):
|
||||
solo expone las 19 tools de lectura/control (`browser_connect`, `browser_disconnect`, `tab_list`,
|
||||
`tab_activate`, `tab_select`, `page_wait_load`, `page_wait_idle`, `page_get_html`, `page_get_text`,
|
||||
`page_perceive`, `page_screenshot`, `dom_find_by_text`, `dom_find_ref_by_text`, `dom_wait_element`,
|
||||
`cookie_get`, `frame_list`, `frame_get_html`, `frame_get_text`, `storage_save`). Útil para sesiones
|
||||
de inspección sin riesgo de modificar el estado del navegador.
|
||||
solo expone las 20 tools de lectura/control (`browser_connect`, `browser_disconnect`, `browser_list`,
|
||||
`tab_list`, `tab_activate`, `tab_select`, `page_wait_load`, `page_wait_idle`, `page_get_html`,
|
||||
`page_get_text`, `page_perceive`, `page_screenshot`, `dom_find_by_text`, `dom_find_ref_by_text`,
|
||||
`dom_wait_element`, `cookie_get`, `frame_list`, `frame_get_html`, `frame_get_text`, `storage_save`).
|
||||
Útil para sesiones de inspección sin riesgo de modificar el estado del navegador.
|
||||
|
||||
## Omitido en v1
|
||||
|
||||
@@ -266,6 +286,15 @@ Funciones del dominio `browser` que NO se exponen como tools en esta versión, c
|
||||
|
||||
## Capability growth log
|
||||
|
||||
- v0.7.0 (2026-06-10) — Ciclo de vida de Chromium por perfil (`tools_lifecycle.go`). Tres tools
|
||||
nuevas: `browser_list` (enumera los procesos master de Chromium leyendo `/proc/*/cmdline`,
|
||||
filtrando por `--user-data-dir` presente y `--type=` ausente), `browser_launch_profile` (lanza un
|
||||
perfil concreto con el binario REAL `/usr/lib/chromium/chromium` para saltar el wrapper, con/sin
|
||||
CDP — sin CDP por defecto para que Google mantenga la sesión de perfiles humanos; detecta
|
||||
DISPLAY/XAUTHORITY de la sesión XFCE y lanza desacoplado con setsid) y `browser_close` (localiza el
|
||||
master por profile/cdp_port/pid, SIGTERM con espera de 10s, SIGKILL como último recurso). Las
|
||||
instancias por perfil NO se registran en el pool: son de uso humano y sobreviven a la muerte del
|
||||
MCP. 42 → 45 tools.
|
||||
- v0.6.0 (2026-06-06) — Percepción visual y de iframes + perceive nativo. (1) `page_perceive` se
|
||||
generó hasta ahora por subprocess `fn run cdp_perceive_outline` (Python); ahora es **nativo en Go**
|
||||
sobre la conexión CDP viva del pool (`cdp_get_ax_outline_go_browser`) — mata el subprocess, el venv
|
||||
|
||||
Reference in New Issue
Block a user