playwright-mcp-guarded
playwright-mcp-guarded
Ein domänenbegrenzter, nicht benutzergebundener Wrapper um Microsofts
playwright-mcp – ein allgemeiner
Web-Fetch/Browse-Ersatz für LibreChat-Assistenten (GitHub, Wikipedia,
Google, Google Scholar, ...), beschränkt auf eine Whitelist von Domänen,
erweiterbar durch Bearbeiten einer Umgebungsvariable. Bereitgestellt als
einfacher streamable-HTTP-Docker-Dienst (keine ports: exponiert, kein
benutzerspezifisches OAuth) neben Schwesterprojekten
time-mcp-http und
ews-mcp's Multi-User-Modus, die demselben Muster folgen.
Warum nicht einfach @playwright/mcp direkt ausführen
Es hat bereits --allowed-origins/--blocked-origins genau dafür,
und dieses Projekt implementiert diese Durchsetzung nicht neu – es ist
immer noch das, was eine nicht erlaubte Navigation tatsächlich blockiert.
Zwei Dinge fehlen beim nackten Ausführen:
Die eigene Dokumentation nennt
--allowed-origins„keine Sicherheitsgrenze" – eine bekannte Lücke ist, dass Service-Worker- und WebSocket-Datenverkehr die darauf basierendecontext.route()-Abfangung umgehen.--block-service-workers(auch hier gesetzt, bedingungslos) schließt eine dieser Lücken; für die andere gibt es kein Flag.Die Whitelist erscheint nirgendwo, wo das aufrufende Modell sie sehen kann – weder in den
instructionsvoninitializenoch in derdescriptioneines Tools. Ein Modell hat keine Möglichkeit, im Voraus zu wissen, welche Domänen erreichbar sind, also findet es es durch Ausprobieren heraus, einmal pro blockierter Domäne, jedes Mal.
Related MCP server: Web Search MCP Server
So funktioniert es
Ein Container, ein Prozessbaum, ein Konfigurationswert (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 startet die echte @playwright/mcp-CLI, unverändert, als
Kindprozess, der nur an localhost gebunden ist, verbindet sich als MCP-Client
mit ihr und stellt sie als MCP-Server auf dem öffentlichen Port des Containers
wieder bereit: tools/list und initialize erhalten die Domänenliste zur
Sichtbarkeit angehängt, tools/call wird wörtlich weitergeleitet – keine eigene
Tool-Logik, kein verändertes Verhalten außer diesen beiden Textänderungen.
ALLOWED_ORIGINS wird einmal beim Start gelesen und an beide übergeben: an den
gestarteten Prozess (als --allowed-origins, die eigentliche Durchsetzung) und
an die beiden Antwortumschreibungen (nur Sichtbarkeit). Die Liste später zu
erweitern ist eine einzeilige Änderung an dieser einen Umgebungsvariable, nicht
zwei Konfigurationen, die synchron gehalten werden müssen.
Ausführen
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 ist semikolongetrennt – dasselbe Format, das @playwright/mcp
selbst für PLAYWRIGHT_MCP_ALLOWED_ORIGINS verwendet. Ein leerer Wert blockiert
jede Domäne (beim Start als Warnung protokolliert, kein stiller Bypass).
EXTRA_INSTRUCTIONS (optional, Freitext) wird wörtlich an die instructions
von initialize angehängt, die das Modell sieht. Die Whitelist sagt nur,
welche Domänen erreichbar sind, nicht wie man das verwendet, was dahinter
liegt – z. B. die Abfragesyntax einer selbst gehosteten Suchmaschine. Bewusst
nicht hier fest codiert: Dieser Wrapper bleibt domänenagnostisch, und der
Bereitsteller liefert das nötige Betriebswissen für seine spezifische Whitelist
in eigenen Worten:
-e EXTRA_INSTRUCTIONS="Search: http://searxng:8080/search?q=<term> (general), add &categories=science for Google Scholar results."Kein MCP_API_KEY, kein Auth-Gate an der MCP-Verbindung selbst – bewusst,
aus demselben Grund wie bei ews-mcp/time-mcp-http: Ein 401 von einem Gate
bringt LibreChats Nicht-OAuth-MCP-Client dazu, OAuth zu versuchen (und dabei
hängen zu bleiben). Die Docker-Netzwerkisolation ist die Grenze. Keinerlei
Anmeldedaten passieren diesen Server; er liest nur öffentliche Seiten.
Akzeptierter Kompromiss, kein Versehen: Dies hält die Durchsetzung auf der
Playwright-Anwendungsebene (jetzt mit --block-service-workers), nicht als
unabhängige Grenze auf Netzwerkebene (z. B. ein Egress-Proxy). Das ist eine
bewusste Einfachheitsentscheidung – eine bereitstellbare Einheit, ein
Konfigurationswert – keine Behauptung, dass dies wasserdicht ist. Ein Backstop
auf Netzwerkebene kann später hinzugefügt werden, ohne diese Logik anzufassen.
Überprüfen
curl -s http://127.0.0.1:8080/readyz # "ok" once the upstream browser is upDie Logs sollten die eigene Startzeile des Upstreams zeigen
(Listening on http://localhost:<internal-port>) gefolgt von
playwright-mcp-guarded up, allowed origins=... – diese zweite Zeile ist die
tatsächlich durchgesetzte Liste, nicht nur das, was konfiguriert wurde.
Test
pip install -e '.[dev]'
ALLOWED_ORIGINS="github.com;wikipedia.org" pytestNur Unit-Tests (Umschreiben von Beschreibung/Anweisungen, Argumentdurchreichung) –
sie starten weder Chromium noch Docker. Das Docker-Image wurde manuell
Ende-zu-Ende verifiziert: gebaut, ausgeführt, ein echter MCP-Client verbunden
und Tools aufgelistet (Whitelist sichtbar sowohl in initialize.instructions
als auch in der Beschreibung von browser_navigate), erfolgreich zu einer
erlaubten Domäne navigiert (en.wikipedia.org) und net::ERR_BLOCKED_BY_CLIENT
bei einer nicht erlaubten erhalten (example.com) – Durchsetzung und
Sichtbarkeit beide live bestätigt, nicht nur behauptet.
This server cannot be installed
Maintenance
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
- FlicenseAqualityDmaintenanceProvides web search capabilities to Claude AI using the Anthropic API, allowing LLMs to access up-to-date information from the web with customizable domain filtering.148
- 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.
- AlicenseAqualityDmaintenanceProvides web access capabilities for LLMs including search, fetching, content extraction, PDF reading, image viewing, and screenshots.346MIT
- FlicenseAqualityDmaintenanceProvides local LLMs with web search and page fetching capabilities via MCP, with a focus on OWASP security best practices.2
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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