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

Как это работает

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

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