playwright-mcp-guarded
playwright-mcp-guarded
Доменно-ограниченная, не привязанная к пользователю обёртка вокруг
playwright-mcp от Microsoft — универсальная
замена для веб-запросов/просмотра для ассистентов LibreChat (GitHub, Wikipedia, Google,
Google Scholar, ...), ограниченная списком разрешённых доменов, расширяемая изменением
одной переменной окружения. Развёрнута как обычный потоковый HTTP-сервис на Docker
(без открытых ports:, без OAuth на пользователя) вместе с соседними проектами
time-mcp-http и многопользовательским
режимом ews-mcp, которые следуют той же схеме.
Почему бы не запускать @playwright/mcp напрямую
У него уже есть --allowed-origins/--blocked-origins именно для этого, и этот проект
не перереализует это ограничение — именно оно по-прежнему блокирует неразрешённую
навигацию. При запуске без обёртки не хватает двух вещей:
В его собственной документации
--allowed-originsназван «не границей безопасности» — известный пробел в том, что трафик Service Worker и WebSocket обходит перехватcontext.route(), на котором это основано.--block-service-workers(также установлен здесь, безусловно) закрывает один из этих пробелов; для другого флага нет.Список разрешённых доменов нигде не виден вызывающей модели — ни в
instructionsизinitialize, ни вdescriptionкакого-либо инструмента. Модель не может заранее узнать, какие домены доступны, поэтому она выясняет это методом проб, каждый раз по одному разу на каждый заблокированный домен.
Related MCP server: Airlock
Как это работает
Один контейнер, одно дерево процессов, одно значение конфигурации (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 запускает настоящий CLI @playwright/mcp без изменений как дочерний
процесс, привязанный только к localhost, подключается к нему как MCP клиент и повторно
предоставляет его как MCP сервер на публичном порту контейнера: tools/list и initialize
получают список доменов для видимости, tools/call пересылается дословно — никакой
собственной логики инструментов, никакого изменённого поведения, кроме этих двух правок
текста. ALLOWED_ORIGINS читается один раз при запуске и передаётся обоим: дочернему
процессу (как --allowed-origins, фактическое ограничение) и двум переписанным ответам
(только для видимости). Расширение списка позже — это изменение одной строки в этой
единственной переменной окружения, а не двух конфигов, которые нужно синхронизировать.
Запуск
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 разделяется точкой с запятой — тот же формат, который @playwright/mcp
использует для PLAYWRIGHT_MCP_ALLOWED_ORIGINS. Пустое значение блокирует все домены
(при запуске регистрируется предупреждение, а не тихий обход).
EXTRA_INSTRUCTIONS (необязательно, произвольный текст) добавляется дословно к instructions
из initialize, которые видит модель. Список разрешённых доменов говорит только какие
домены доступны, а не как использовать то, что за ними — например, синтаксис запросов
самостоятельного поискового движка. Здесь намеренно не захардкожено: эта обёртка остаётся
доменно-независимой, и развёртывающий предоставляет любые рабочие знания, необходимые для
его конкретного списка, своими словами:
-e EXTRA_INSTRUCTIONS="Search: http://searxng:8080/search?q=<term> (general), add &categories=science for Google Scholar results."Нет MCP_API_KEY, нет шлюза аутентификации на самом MCP-соединении — намеренно, по той же
причине, что и ews-mcp/time-mcp-http: 401 от любого шлюза заставляет не-OAuth MCP-клиент
LibreChat пытаться использовать OAuth (и застревать на нём). Границей является изоляция сети
Docker. Через этот сервер не передаются никакие учётные данные; он только читает публичные
страницы.
Принятый компромисс, а не упущение: это оставляет ограничение на уровне приложения
Playwright (теперь с --block-service-workers), а не на независимой сетевой границе
(например, исходящем прокси). Это осознанный выбор в пользу простоты — один развёртываемый
модуль, одно значение конфигурации — а не утверждение, что это непроницаемо. Сетевой
предохранитель можно добавить позже, не затрагивая эту логику.
Проверка
curl -s http://127.0.0.1:8080/readyz # "ok" once the upstream browser is upВ логах должна появиться собственная строка запуска вышестоящего процесса
(Listening on http://localhost:<internal-port>), за которой следует
playwright-mcp-guarded up, allowed origins=... — эта вторая строка содержит фактический
список, применяемый в данный момент, а не только то, что было настроено.
Тестирование
pip install -e '.[dev]'
ALLOWED_ORIGINS="github.com;wikipedia.org" pytestТолько модульные тесты (переписывание описаний/инструкций, передача аргументов) — они не
запускают Chromium или Docker. Docker-образ был проверен вручную от начала до конца: собран,
запущен, реальный MCP-клиент подключился и перечислил инструменты (список разрешённых доменов
виден и в initialize.instructions, и в описании browser_navigate), успешно перешёл на
разрешённый домен (en.wikipedia.org) и получил net::ERR_BLOCKED_BY_CLIENT на запрещённом
(example.com) — и ограничение, и видимость подтверждены вживую, а не только утверждены.
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