local-web-mcp
local-web-mcp
Версия 0.3.0 · AGPL-3.0
Этот инструмент разработан при поддержке ИИ, но перед публикацией он был проверен человеком.
MCP-сервер, который даёт Claude запасной веб-загрузчик, работающий на вашей собственной машине. Когда встроенный загрузчик заблокирован, этот попробует выполнить запрос с вашего IP-адреса, через ваше соединение и, опционально, с вашей авторизованной сессией.
Один инструмент: fetch_url_locally.
Какую проблему он решает
Размещённые загрузчики работают с IP-диапазонов дата-центров, которые многие сайты отклоняют сразу. Локальный stdio-MCP-сервер — нет: клиент запускает процесс на вашей машине, поэтому запросы исходят из вашего обычного подключения.
Проверено и работает на сайтах, которые размещённый загрузчик не мог прочитать, включая CNBC, Politiken и Bloomberg.
Related MCP server: auth-fetch-mcp
Что он не меняет
Это стоит сказать прямо, потому что такая постановка вопроса провоцирует преувеличения.
Вывод модели по-прежнему выполняется на серверах Anthropic.
Текст загруженной страницы по-прежнему отправляется модели как выходные данные инструмента. Всё, что прочитано через авторизованную сессию, уходит вместе с ним.
Меняется кто общается с сайтом, а не где выполняется модель.
Жёсткая граница
Можно ли прочитать страницу без выполнения JavaScript?
Если да, этот инструмент справится. Если нет, ничто на уровне заголовков, TLS или cookie туда не проберётся, и никакая настройка User-Agent не поможет. Сайты, использующие DataDome, Cloudflare Turnstile, PerimeterX и подобные, выдают проверку (challenge), которую нужно выполнить, чтобы пройти. Для таких используйте инструмент на основе браузера или откройте страницу сами.
Это граница, о которой нужно знать, а не ошибка, которую нужно исправлять.
Вердикты
Каждый ответ помечается. Опасный случай — не явная ошибка 403, а 200, который не является страницей: промежуточная страница для ботов, баннер согласия на обработку данных, пустая оболочка, отрисованная на клиенте. Они попадают в сводку так, будто это статья.
Вердикт | Значение | Что делать |
| Реальный контент | Используйте |
| Обнаружена защита от ботов | Нужен браузер, остановитесь |
| Полный отказ (403), обычно обнаружение ботов | Нужен браузер, остановитесь |
| Оболочка, отрисованная на клиенте, без JS контента нет | Нужен браузер, остановитесь |
| 401, логин-стена или платный барьер | Могут помочь cookie |
| Любой другой статус не 2xx (404, 429, 5xx) | Повторите позже только для 429/5xx |
| Извлечено менее 200 символов | Сбой чтения, а не пустая страница |
Всё, что не является ok, сопровождается явным предупреждением, которое сообщает модели не рассматривать тело ответа как контент.
Доказательства из тела ответа важнее кода статуса. Издатель, который отдаёт статью за платным барьером с HTTP 403, будет помечен как login_required, а не blocked, потому что в этом случае полезный совет — экспортировать cookie, а не тянуться за браузером.
Детектирование опирается на инфраструктуру вендора, а не на формулировки: страницы проверки локализованы, поэтому captcha-delivery.com — надёжный сигнал там, где «проверка вашего устройства» — нет. Cookie вендора в заголовках ответа считаются доказательством в сочетании со статусом отказа.
Инструмент
fetch_url_locally(url, max_chars=20000, use_session=true)
Параметр | Тип | По умолчанию | Назначение |
| string | обязательно | Страница для загрузки. Только |
| integer |
| Ограничение возвращаемого текста, не более 200000. Об усечении сообщается в заголовке |
| boolean |
| Отправлять cookie. Передайте |
Ответ состоит из короткого заголовка и извлечённого текста:
URL: https://example.com/article
Status: 200
Verdict: ok
Title: The headline
Session: authenticated (the user's cookies were sent)
The article text...Session: появляется только тогда, когда cookie действительно загружены и ограничены этим хостом. Вердикт, отличный от ok, добавляет строку WARNING: с указанием модели не рассматривать тело ответа как контент.
Сбои возвращаются как ошибка с указанием причины, например [blocked_host] Host '192.168.1.5' resolves to a private or internal address. Коды: invalid_url, blocked_scheme, blocked_host, dns_failure, timeout, too_many_redirects, upstream_error, invalid_argument.
Требования
Python 3.11+ (использует
asyncio.timeout). С uv вам не нужно устанавливать его самостоятельно; uv подберёт подходящий интерпретаторClaude Desktop или Claude Code. Stdio-серверы не работают в браузере или мобильном приложении, которым требуется публично доступный HTTPS-эндпоинт.
Установка
С помощью uv, который сам подбирает подходящий Python и зависимости:
uv --directory /absolute/path/to/local-web-mcp run local-web-mcpВыполните это один раз в терминале перед регистрацией сервера. Первый запуск разрешает зависимости и создаёт окружение; это занимает достаточно много времени, поэтому клиент, запускающий его без предварительной подготовки, может сдаться и сообщить об ошибке, даже если конфигурация верна.
Он выводит Starting local-web и затем ждёт клиента в stdin — так выглядит работающий сервер. Как только вы увидите эту строку, окружение создано: нажмите Ctrl+C и продолжайте.
Или с обычным виртуальным окружением:
python3 -m venv .venv
.venv/bin/pip install -r requirements.txtРегистрация в Claude Desktop
Добавьте в claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Linux: ~/.config/Claude/):
{
"mcpServers": {
"local-web": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/local-web-mcp",
"run",
"local-web-mcp"
]
}
}
}Если uv отсутствует в PATH, который видит клиент, укажите его абсолютный путь как command. Эквивалент для виртуального окружения:
{
"mcpServers": {
"local-web": {
"command": "/absolute/path/to/.venv/bin/python",
"args": ["/absolute/path/to/local_web_mcp.py"]
}
}
}Claude Code:
claude mcp add local-web -- uv --directory /absolute/path/to/local-web-mcp run local-web-mcpКонфигурация
Всё необязательно. У каждого параметра есть рабочий вариант по умолчанию.
Переменная | По умолчанию | Назначение |
| не задана | Путь к хранилищу cookie |
| не задана | Домены, для которых может использоваться хранилище. Устанавливайте это всегда, когда задаёте файл cookie |
|
| Разрешить частные, loopback и link-local адреса |
| пусто | Имена хостов, исключённые из проверки IP |
| Chrome UA | Отправляется с каждым запросом |
|
| Языковые предпочтения. Сайты используют их для выбора языка, а иногда и региональной версии |
|
| Секунды |
|
| Секунды |
|
| Жёсткий предел на один вызов |
|
| Максимальный размер тела ответа |
|
| Количество переходов по редиректам, общее с meta-обновлениями |
Значение Accept-Language по умолчанию запрашивает сначала датский. Это осознанный выбор по умолчанию, а не нейтральный, поэтому задайте LOCALWEB_ACCEPT_LANGUAGE, если вам нужен английский или любой другой язык:
"env": { "LOCALWEB_ACCEPT_LANGUAGE": "en-GB,en;q=0.9" }Сессионные cookie
Укажите LOCALWEB_COOKIE_FILE на экспорт из браузерного расширения. Загрузчик принимает Netscape cookies.txt с любым заголовком или без него, а также JSON-экспорты из распространённых расширений. См. cookies.txt.example.
Всегда задавайте LOCALWEB_COOKIE_DOMAINS. Без него будет активно всё хранилище, и любой запрос может нести постороннюю сессию. С ним все cookie вне этих доменов отбрасываются при загрузке, до того как хранилище попадёт к клиенту. Совпадение охватывает поддомены (example.com покрывает www.example.com), но не похожие имена (evil-example.com).
Три вещи, о которых стоит помнить:
Контент, прочитанный через вашу сессию, отправляется модели как выходные данные инструмента.
Файл cookie — это файл с учётными данными.
chmod 600, и он здесь в .gitignore.Cookie истекают. Источник, который раньше работал и теперь возвращает
login_required, обычно означает устаревший экспорт, а не потерю доступа.
Передайте use_session=false, чтобы проверить, действительно ли страница публичная.
Доступ к локальной сети
Частные адреса заблокированы по умолчанию, и это сделано намеренно. Модель выбирает URL частично из только что прочитанного текста, поэтому загруженная страница может попытаться направить её на 192.168.1.1. Блокировка означает, что инъекция промпта в содержимое страницы не сможет превратить этот инструмент в сканер сети.
Предпочитайте узкий список разрешённых хостов безусловному переключателю:
"env": { "LOCALWEB_ALLOWLIST": "nas.local,nas" }Безопасность
Схема ограничена http и https; URL с учётными данными отклоняются
Имя хоста разрешается, и каждый возвращённый адрес проверяется перед запросом
IPv6-отображённый IPv4 (
::ffff:10.0.0.1) преобразуется перед проверкойОблачные metadata-эндпоинты блокируются безусловно: имя хоста разрешается до применения и списка разрешений, и
ALLOW_PRIVATE, так что ни один из них не может их открытьРедиректы и meta-обновления обрабатываются вручную, с повторной проверкой на каждом шаге
Логируется количество cookie, но никогда их имена, значения или домены
Известные ограничения
Нет JavaScript. Жёсткая граница, описанная выше.
DNS-ребиндинг. Имя хоста разрешается для проверки, а затем снова при подключении. Чтобы закрыть эту брешь, нужно привязать соединение к проверенному IP. Это стоит сделать перед включением
ALLOW_PRIVATEв недоверенной сети.Обнаружение проверок основано на сигнатурах и будет устаревать по мере изменения разметки вендорами. Запустите
inspect_response.py, если вердикт выглядит неверным.Извлечение текста из HTML не использует зависимостей и довольно грубое. Для серьёзного извлечения статей
trafilaturaбыла бы заметно лучше.
Файлы
Файл | Назначение |
| Сервер |
| Гибкий загрузчик cookie. Обязателен, импортируется сервером |
| Диагностика: показывает, что именно получает загрузчик |
| Вердикты, проверка целей, загрузка и ограничение cookie |
| Заблокированные цели и один реальный запрос через stdio |
| Аннотированный шаблон для хранилища cookie |
| Метаданные пакета и точка входа |
| Зафиксированные версии зависимостей для воспроизводимых установок |
| Зависимости времени выполнения для обычного виртуального окружения |
| Исключает виртуальное окружение, кэши и любые файлы cookie |
| Полный текст AGPL-3.0 |
Диагностика неверного вердикта
uv run python inspect_response.py https://example.com/articleВыводит статус, значимые заголовки, начало тела, а затем прогоняет это через собственную детекцию сервера. Всегда проверяйте это перед изменением логики детекции. Браузеру и этому загрузчику часто отдаются совершенно разные ответы, поэтому то, что вы видите на экране, не является доказательством того, что получил инструмент.
Тесты
uv run python unit_test.py
uv run python smoke_test.pyunit_test.py работает офлайн и при сбое завершается с ненулевым кодом возврата, поэтому он работает как
шлюз pre-commit. smoke_test.py управляет сервером через stdio и выполняет один реальный
запрос, поэтому ему требуется сетевое соединение. Запустите оба из корня репозитория.
В варианте plain-venv замените uv run python на .venv/bin/python.
Лицензия
Copyright (C) 2026 David Lindholm.
GNU Affero General Public License v3.0 или более поздняя версия. См. LICENSE.
Эта программа распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.
This server cannot be installed
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
- AlicenseNot gradedqualityAmaintenanceFetches content from authenticated web pages by driving your signed-in Chrome/Edge browser via DevTools Protocol, automatically handling login redirects and reusing sessions across domains.8MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to access content from authenticated web pages by opening a real browser for manual login and session capture. It saves browser profiles locally so users only need to log in once per service for future automated access.46935MIT
- AlicenseAqualityDmaintenanceEnables AI agents to control the user's Chrome or Firefox browser, leveraging existing sessions for tasks requiring authentication and user handoff.181715MIT
- FlicenseNot gradedqualityCmaintenanceUnlimited, session-authenticated web search and fetch for AI tools using your own browser. Supports authenticated/paywalled pages without API keys.
Related MCP Connectors
Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Provides cloud browser automation capabilities using Stagehand and Browserbase, enabling LLMs to i…
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/davidwlindholm/local-web-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server