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: 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-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 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