Skip to main content
Glama
thekk1

playwright-mcp-guarded

by thekk1

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 именно для этого, и этот проект не перереализует это ограничение — именно оно по-прежнему блокирует неразрешённую навигацию. При запуске без обёртки не хватает двух вещей:

  1. В его собственной документации --allowed-origins назван «не границей безопасности» — известный пробел в том, что трафик Service Worker и WebSocket обходит перехват context.route(), на котором это основано. --block-service-workers (также установлен здесь, безусловно) закрывает один из этих пробелов; для другого флага нет.

  2. Список разрешённых доменов нигде не виден вызывающей модели — ни в 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-guarded

ALLOWED_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) — и ограничение, и видимость подтверждены вживую, а не только утверждены.

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