playwright-mcp-guarded
playwright-mcp-guarded
Un envoltorio con dominio restringido y no vinculado a usuarios alrededor de
playwright-mcp de Microsoft — un
reemplazo general de fetch/navegación web para los asistentes de LibreChat (GitHub, Wikipedia,
Google, Google Scholar, ...), limitado a una lista de dominios permitidos, extensible
editando una variable de entorno. Desplegado como un servicio Docker HTTP streamable
(sin ports: expuestos, sin OAuth por usuario) junto a los proyectos hermanos
time-mcp-http y
el modo multiusuario de ews-mcp, que siguen la misma forma.
Por qué no ejecutar @playwright/mcp directamente
Ya tiene --allowed-origins/--blocked-origins exactamente para esto,
y este proyecto no reimplementa esa aplicación — sigue siendo
lo que realmente bloquea una navegación no permitida. Faltan dos cosas al ejecutarlo
desnudo:
Su propia documentación llama a
--allowed-origins"no es un límite de seguridad" — una brecha conocida es que el tráfico de Service Worker y WebSocket evita la intercepcióncontext.route()sobre la que se construye.--block-service-workers(también establecido aquí, incondicionalmente) cierra una de esas brechas; no hay una bandera para la otra.La lista de permitidos nunca aparece en ningún lugar que el modelo que llama pueda ver — ni en las
instructionsdeinitialize, ni en ladescriptionde ninguna herramienta. Un modelo no tiene forma de saber de antemano qué dominios son accesibles, así que lo descubre probando, una vez por dominio bloqueado, cada vez.
Related MCP server: Airlock
Cómo funciona
Un contenedor, un árbol de procesos, un valor de configuración (ALLOWED_ORIGINS):
LibreChat --(streamable-http, /mcp)--> guardian (Python, PID 1)
|
| spawns as child process,
| on loopback only
v
@playwright/mcp (Node, --allowed-origins)guardian/app.py lanza el CLI real de @playwright/mcp, sin modificar, como un
proceso hijo vinculado solo a localhost, se conecta a él como un cliente MCP,
y lo re-expone como un servidor MCP en el puerto público del contenedor:
tools/list e initialize reciben la lista de dominios añadida para visibilidad,
tools/call se reenvía textualmente — sin lógica de herramientas propia,
sin comportamiento cambiado más allá de esas dos ediciones de texto. ALLOWED_ORIGINS se lee
una vez, al inicio, y se entrega a ambos: al proceso generado (como
--allowed-origins, la aplicación real) y a las dos reescrituras de respuesta
(solo visibilidad). Extender la lista más tarde es un cambio de una línea
en esa única variable de entorno, no dos configuraciones que mantener sincronizadas.
Ejecutar
docker build -t playwright-mcp-guarded .
docker run --rm -p 8080:8080 \
-e ALLOWED_ORIGINS="github.com;raw.githubusercontent.com;wikipedia.org;en.wikipedia.org;google.com;scholar.google.com" \
playwright-mcp-guardedALLOWED_ORIGINS está separada por punto y coma — el mismo formato que @playwright/mcp
usa para PLAYWRIGHT_MCP_ALLOWED_ORIGINS. Un valor vacío bloquea
todos los dominios (registrado como advertencia al inicio, no como un bypass silencioso).
EXTRA_INSTRUCTIONS (opcional, texto libre) se añade textualmente a las
instructions de initialize que el modelo ve. La lista de permitidos solo dice qué
dominios son accesibles, no cómo usar lo que hay detrás de ellos — por ejemplo, la
sintaxis de consulta de un motor de búsqueda autoalojado. Deliberadamente no está
codificado aquí: este envoltorio permanece agnóstico al dominio, y el desplegador
proporciona el conocimiento operativo que su lista específica necesite, en sus propias
palabras:
-e EXTRA_INSTRUCTIONS="Search: http://searxng:8080/search?q=<term> (general), add &categories=science for Google Scholar results."Sin MCP_API_KEY, sin puerta de autenticación en la conexión MCP en sí —
deliberadamente, mismo razonamiento que ews-mcp/time-mcp-http: un 401 de cualquier
puerta hace que el cliente MCP no-OAuth de LibreChat intente (y se atasque en) OAuth.
El aislamiento de red de Docker es el límite. Ninguna credencial de ningún tipo pasa
por este servidor; solo lee páginas públicas.
Compensación aceptada, no un descuido: esto mantiene la aplicación en la capa de
aplicación de Playwright (ahora con --block-service-workers), no un límite
independiente a nivel de red (por ejemplo, un proxy de salida). Esa es una
elección deliberada de simplicidad — una unidad desplegable, un valor de configuración — no
una afirmación de que esto sea hermético. Un respaldo a nivel de red puede superponerse
más tarde sin tocar ninguna de esta lógica.
Verificar
curl -s http://127.0.0.1:8080/readyz # "ok" once the upstream browser is upLos registros deberían mostrar la línea de inicio del upstream
(Listening on http://localhost:<internal-port>) seguida de
playwright-mcp-guarded up, allowed origins=... — esa segunda línea es la lista
realmente aplicada, no solo lo que se configuró.
Probar
pip install -e '.[dev]'
ALLOWED_ORIGINS="github.com;wikipedia.org" pytestSolo pruebas unitarias (reescritura de descripción/instrucciones, paso de argumentos) —
no inician Chromium ni Docker. La imagen Docker se verificó de extremo a extremo
manualmente: se construyó, se ejecutó, un cliente MCP real se conectó y listó
herramientas (la lista de permitidos visible tanto en initialize.instructions como en
la description de browser_navigate), navegó con éxito a un dominio
permitido (en.wikipedia.org), y obtuvo net::ERR_BLOCKED_BY_CLIENT en uno
no permitido (example.com) — tanto la aplicación como la visibilidad se
confirmaron en vivo, no solo se afirmaron.
This server cannot be deployed
Maintenance
Related MCP Connectors
Live web checks for AI agents: sitemaps, robots.txt, URL status, broken links, feeds, citations.
Web data for agents: YouTube transcripts, screenshots, Google News, WHOIS, jobs, tech stack, more.
Live web access for agents: scrape, SERP search, crawl/map, 100+ collectors, datasets, proxies.
Reliable web fetching for AI agents with retry, circuit breaker, caching, and anti-bot bypass
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to search the web, fetch news, and retrieve page content via DuckDuckGo or Brave Search, with domain whitelisting and audit logging.-
- AlicenseNot gradedqualityDmaintenanceEnables LLM agents to safely search and fetch content from a single configured domain, preventing data exfiltration through deterministic enforcement.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to automate browsers through Playwright behind multi-layer safety guards, restricting navigation to allowed domains, defaulting to read-only actions, and recording all behavior in audit logs.7MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to fetch and process web content securely, including HTML-to-markdown conversion, reader mode, metadata extraction, RSS/sitemap parsing, and robots.txt-aware requests with SSRF protection.15805 npm2MIT