fast-webfetch-mcp
fast-webfetch-mcp
MCP-сервер для получения веб-страниц, который рендерит страницы с помощью настоящего браузера, запущенного на вашей машине, а затем передаёт модели чистый Markdown вместо счёта за токены за 2 МБ JavaScript.
Здесь получение данных ничего не стоит: никаких API-ключей, никакой оплаты за страницу. А когда сайт заявляет, что блокирует вас, это часто просто скрипт обнаружения headless-браузера, который настоящий Chromium обходит без труда.
Как это работает
Две небольшие программы, одна задача:
MCP client (agent)
│ JSON-RPC over stdio
▼
src/index.ts Bun + MCP SDK — tool schemas, budgets, rendering
│ spawns per request
▼
crawl4ai_worker.py Python + Crawl4AI — headless Chromium, markdown extraction
│
▼
The actual internetTypeScript-сервер отвечает за политику: таймауты, разрешения на конкурентность, усечение вывода, опциональную суммаризацию на базе Gemini. Python-воркер отвечает за механику: жизненный цикл браузера, рендеринг, повторы. Ни один не знает работу другого, а контракт между ними — один JSON-документ на stdout.
Related MCP server: crawler-mcp
Установка
Требования: Bun, Python 3.12+ и не зависящее от GPU количество терпения на первую загрузку браузера.
git clone <this repo> ~/.local/share/mcp/fast-webfetch-mcp # or anywhere
cd ~/.local/share/mcp/fast-webfetch-mcp
bun install
uv venv .venv --python 3.12 && uv pip install --python .venv/bin/python crawl4aiПроверьте, что браузерная часть работает:
FAST_WEBFETCH_SMOKE_URL=https://example.com bun run src/index.tsВы должны увидеть Markdown для примера домена. Если вместо этого вы видите стек-трейс о браузерах Playwright, запустите crawl4ai-setup из виртуального окружения и попробуйте снова — он установит нужную сборку Chromium для вас.
Подключите его к своему агенту
{
"mcpServers": {
"fast-webfetch": {
"type": "stdio",
"command": "/usr/bin/mullvad-exclude",
"args": ["/home/you/.bun/bin/bun", "run", "/path/to/fast-webfetch-mcp/src/index.ts"],
"env": { "PATH": "/home/you/.bun/bin:/usr/bin:/bin" }
}
}
}Обёртка mullvad-exclude необязательна; она просто позволяет трафику обходить VPN, чтобы сайты видели ваш реальный IP. Обычный "command": "bun" работает точно так же.
Инструменты
fast_fetch — один URL в Markdown
Аргумент | Тип | По умолчанию | Примечания |
| string | обязательно | |
| string | — | Если задан, то обоснованный ответ вместо полной страницы |
| number | 40,000 | Усечение середины сохраняет начало и конец |
| boolean | false | Поднять лимит до 100 000 символов |
| number | 25,000 | Жёсткий предел, включая рендеринг браузера |
| object | — | Параметры рендеринга для конкретного вызова, см. ниже |
fast_fetch_raw — один URL в сырой HTML
Те же аргументы, кроме prompt. Используйте его, когда Markdown теряет то, что вам нужно: таблицы, data- атрибуты, мета-теги, точную разметку.
Объект options
Все три инструмента принимают необязательный объект options для сайтов, которым нужно больше, чем просто загрузка и захват:
{
"url": "https://example.com/feed",
"options": { "full_page": true, "wait_seconds": 1.5, "drop_overlays": true }
}Ключ | Тип | Эффект |
| boolean | Прокручивает всю страницу перед извлечением — захватывает контент с ленивой загрузкой и бесконечной прокруткой. Медленнее; на бесконечных лентах прокручивается до таймаута |
| number | Задержка перед захватом, например |
| boolean | Включает содержимое iframe в результат |
| boolean | Удаляет баннеры cookie и модальные окна перед извлечением |
Ошибочно набранные ключи молча отбрасываются, а не передаются дальше — полезная нагрузка options становится флагами CrawlerRunConfig на стороне Python.
fast_fetch_multiple — до 15 URL за один пакет
Аргумент | Тип | По умолчанию | Примечания |
| string[] | обязательно | 1–15 абсолютных http(s) URL |
| number | 40,000 | На каждый URL |
| boolean | false | На каждый URL |
| number | 25,000 | Весь пакет, общий |
| object | — | Те же параметры, применяются к каждому URL |
Каждый URL возвращается как отдельный раздел с заголовком метаданных (url, status, elapsed_ms, truncated). Один медленный сайт не может голодать остальные — он просто получает ошибку таймаута для конкретного элемента, пока его товарищи по пакету успешно завершаются.
Конфигурация
Всё необязательно, всё через переменные окружения.
Параметры сервера
Переменная | По умолчанию | Назначение |
|
| Лимит символов на страницу по умолчанию |
|
| Потолок для |
|
| Таймаут получения по умолчанию |
|
| Параллельные слоты браузера (макс. 32) |
| не задано |
|
|
| Интерпретатор воркера |
|
| Путь к воркеру |
| — | Нужен только для суммаризации через |
Параметры браузера
Переменная | По умолчанию | Назначение |
| вкл ( | Патчи против обнаружения: флаг webdriver, плагины, WebGL vendor, Chrome API. Установите |
| выкл | Прокси для исходящего трафика |
|
| Стратегия ожидания Playwright |
| выкл | Прокрутка перед извлечением — также доступно для каждого вызова как |
|
| Время ожидания перед захватом HTML — также доступно для каждого вызова как |
Поведение, о котором стоит знать
Сайты с большим количеством JS часто возвращают пустую оболочку при стратегии ожидания по умолчанию. Когда приходит 200 без содержимого, воркер повторяет попытку один раз с networkidle в том же бюджете таймаута — в худшем случае вы ждёте один раз, а не два. Ошибки соединения и HTTP-ошибки, тем временем, остаются с одной попыткой: повторение попытки для мёртвого хоста — это просто более медленный способ потерпеть неудачу.
fast_fetch и fast_fetch_multiple используют один и тот же пул из 12 слотов браузера, поэтому большой пакет не может голодать одновременный одиночный запрос. Спрос сверх пула ставится в очередь; пакет, запрашивающий больше слотов, чем существует, получает то, что свободно.
Наконец, max_length существует потому, что окно контекста вашего агента — это бюджет, а не свалка.
Когда что-то ломается, вы получаете путь к логу
Сбои делятся на две категории: нестабильность интернета (таймауты, медленные сайты, ошибки дедлайна для отдельных элементов пакета) и реальная поломка инструмента (воркер не запускается, воркер упал, переполнение stdout, неразбираемый вывод). Только вторая категория записывает лог — первая просто получает честный тег ошибки.
Сбой на стороне инструмента заканчивается так:
log: /path/to/fast-webfetch-mcp/logs/2026-08-22T09-02-06-780Z-fast_fetch.jsonВнутри: инструмент, точные аргументы, входные данные воркера и полная запись сбоя (этап, код выхода, сигнал, хвост stderr) — достаточно для воспроизведения запроса дословно:
FAST_WEBFETCH_INPUT='{"url":"https://example.com","max_length":40000}' \
.venv/bin/python crawl4ai_worker.pyПеренаправьте с помощью FAST_WEBFETCH_LOGS_DIR.
Оставаясь в пределах 30 секунд
Агентские обвязки обычно убивают вызовы MCP примерно на 30-й секунде, поэтому этот сервер считает 28 секунд жёсткой стеной. Каждый инструмент отвечает до неё: готовые результаты, если получение удалось, в противном случае структурированные ошибки по элементам, указывающие, какой этап съел время. Пакет, исчерпавший бюджет, всё равно возвращает завершённые элементы.
Устранение неполадок
Симптом | Вероятная причина и исправление |
| Репозиторий перемещён; проверьте, что |
|
|
Всё истекает по таймауту на одном сайте | Сайт действительно медленный или враждебный; попробуйте |
| Ожидаемо: общий бюджет 25 секунд, отстающие получают ошибки по элементам |
Пустой Markdown на SPA | Должно самовосстанавливаться через повтор; если нет, увеличьте |
Разработка
bun install
bun test # 18 tests, no network needed
bun run typecheck # tsc --noEmit, strict + noUncheckedIndexedAccessPython-воркер можно запускать напрямую, что является самым быстрым способом отладить поведение получения без слоя MCP:
FAST_WEBFETCH_INPUT='{"url":"https://example.com","max_length":500}' \
.venv/bin/python crawl4ai_worker.pyСм. также
ddg-search — естественный фронтенд: ищет, затем передаёт URL результатов этому серверу
Crawl4AI — движок обхода под капотом
Model Context Protocol — сетевой протокол
Лицензия
MIT.
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
- AlicenseAqualityBmaintenanceMCP server that lets Claude Code fetch web content using real Chrome browsers. Renders JavaScript-heavy pages, handles bot mitigation, and runs up to 14 parallel browsers locally with zero API keys. Makes outbound HTTP requests only to URLs the user explicitly asks Claude to fetch.21491MIT
- FlicenseAqualityCmaintenanceWeb-crawler MCP server that fetches web pages with static parsing or headless browser fallback, enabling Claude to fetch, extract links, crawl sites, and select content via CSS selectors.4
- AlicenseAqualityCmaintenanceAn MCP server that enables AI assistants to fetch web content in multiple formats (HTML, JSON, text, Markdown) with intelligent content extraction, chunk management, and browser automation support.55215MIT
- AlicenseNot gradedqualityBmaintenanceAn open-source web retrieval MCP server that fetches, crawls, and searches the web, returning clean markdown for AI agents. It integrates with Claude MCP, LangChain, and other frameworks for agentic web access.1MIT
Related MCP Connectors
Zenrows MCP server — Fetch, Extract, Batch, and Browser Sessions for AI coding assistants
Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
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/NikkeTryHard/fast-webfetch-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server