Skip to main content
Glama
thekk1

playwright-mcp-guarded

by thekk1

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:

  1. 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ón context.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.

  2. La lista de permitidos nunca aparece en ningún lugar que el modelo que llama pueda ver — ni en las instructions de initialize, ni en la description de 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-guarded

ALLOWED_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 up

Los 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" pytest

Solo 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.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to search the web, fetch news, and retrieve page content via DuckDuckGo or Brave Search, with domain whitelisting and audit logging.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLM agents to safely search and fetch content from a single configured domain, preventing data exfiltration through deterministic enforcement.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    7
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    15
    805 npm
    2
    MIT