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: Web Search MCP Server

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.

F
license - not found
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

View all related MCP servers

Related MCP Connectors

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

  • Read a URL as clean markdown, screenshot a website, url to PDF. Web access for agents, no signup.

  • Live web access for agents: scrape, SERP search, crawl/map, 74 collectors, datasets, proxies.

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/thekk1/playwright-mcp-guarded'

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