escalator
escalator
Дайте ему URL — получите чистый Markdown. Он поднимается по самой дешёвой ступени, которая работает: обычный HTTP-запрос, тот же запрос через резидентный прокси, затем скрытый браузер — и останавливается на первой, которая возвращает реальный контент.
$ escalator scrape https://en.wikipedia.org/wiki/Web_scraping | head -3
# Web scraping
**Web scraping**, **web harvesting**, or **web data extraction** is [data scraping](...)Быстрый старт
# 1. install uv (https://docs.astral.sh/uv/getting-started/installation/)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. configure this machine -- finds your browser, or fetches one
uvx escalator init
# 3. use it
uvx escalator scrape https://en.wikipedia.org/wiki/Web_scrapingЭто весь вход. init создаёт один файл конфигурации, и перед первым запуском ничего не нужно редактировать вручную. Если что-то выглядит не так: escalator doctor.
На минимальном Linux (голый контейнер, свежий VPS) Chrome требует системные библиотеки, которые на десктопе уже есть. escalator не устанавливает их за вас — он выводит точную команду
apt-get, иescalator doctorповторяет её. Одна команда, один раз:sudo apt-get update && sudo apt-get install -y \ libnss3 libnspr4 libatk1.0-0t64 libatk-bridge2.0-0t64 libcups2t64 libdrm2 \ libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 \ libgbm1 libglib2.0-0t64 libpango-1.0-0 libcairo2 libasound2t64 \ libatspi2.0-0t64 libxcb1 libdbus-1-3 libexpat1
Никаких батареек — осознанно. escalator поставляется без конфигурации — без встроенного браузера, без встроенных прокси, без телеметрии, ничего не записывается за пределами его собственных каталогов. init существует для того, чтобы настройка была двухминутным разговором, а не поиском по README.
Related MCP server: Safer Fetch MCP Server
Установка
как | команда | когда |
uv (без установки) |
| для ознакомления |
uv (постоянно) |
| если нужен в PATH |
pipx |
| если уже используете pipx |
pip |
| внутри существующего venv |
Docker |
| для серверов |
Всё необходимое для основного процесса есть в стандартной установке, включая ступень браузера — она не приносит с собой браузер, для этого и существует escalator browser install. Есть одно дополнение: escalator[mcp] добавляет интерфейс MCP, и Docker-образ включает его.
Docker
docker run --rm \
-e ESCALATOR_SERVER_API_KEYS=your-key \
-p 8000:8000 -v ./data:/data \
ghcr.io/ruslanstarikov/escalator serveОбраз содержит зафиксированный браузер и настраивается полностью через переменные окружения — см. docker-compose.example.yml для настройки прокси. Он работает под uid 1000, поэтому примонтированный ./data должен быть доступен для записи.
Команды
escalator init [--yes] configure this machine; --yes for scripts
escalator doctor [--json] check everything, one fix per failure
escalator browser list every browser found, and which one wins
escalator browser install download Chrome for Testing into the data dir
escalator scrape URL one page to stdout, so it pipes
escalator serve the HTTP API and the MCP face
escalator --version tool, python, platformЛестница
policy robots.txt (cached) + rate limit → may short-circuit (skip/deny/wait)
http curl_cffi, impersonate=chrome → ~100ms; clears undefended sites
http_proxy same, routed via residential IP → beats datacenter-IP bans
browser nodriver, headless Chrome → JS/SPA + Cloudflare-class defenses
│
└─ walled on the last rung? → status="challenged". Surrender.Две вещи делают это не просто циклом for:
200 OK — это не успех. Ступень, возвращающая HTTP 200 с промежуточной страницей Cloudflare, не достигла успеха. core/detect.py классифицирует каждый ответ после извлечения — content, thin или blocked — и только content считается. Без этого лестница никогда бы не поднималась, и кэш навсегда запомнил бы «http работает» для домена, который отдаёт мусор.
Кэш забывает. Выученная стартовая ступень, которая только повышалась, со временем уводила бы каждый домен к браузеру+прокси и незаметно раздувала счёт за прокси. Записи содержат learned_at; после ladder.tier_cache_ttl_hours домен пробует на одну ступень дешевле.
См. DESIGN.md о том, почему она устроена именно так — и о том, что она сознательно отказывается делать.
Конфигурация
Один файл, создаваемый init, в системном каталоге конфигурации (~/.config/escalator/config.toml на Linux, ~/Library/Application Support/escalator/config.toml на macOS). Переопределите расположение с помощью --config.
Приоритет везде:
CLI flag > environment > config.toml > defaultКаждый ключ имеет переменную окружения, именно так Docker-образ настраивается без файла вообще:
ключ конфигурации | переменная окружения | по умолчанию | что делает |
|
| — | Абсолютный путь к бинарнику Chrome/Chromium. Пусто = найти автоматически. |
|
|
| false требует дисплея (или Xvfb) и его сложнее обнаружить. |
|
|
| Рендеринг также идёт через прокси. Расходует трафик. |
|
|
| Chrome — потолок по RAM на небольшой машине. |
|
|
| Тайм-аут на один запрос для ступени браузера. |
|
|
| Переключатель. Всё ниже игнорируется, пока это false. |
|
| — | http://user:pass@host:port или socks5://... |
|
| — | Несколько выходов, используются по кругу. Комбинируется с url. |
|
|
| Тайм-аут на один запрос для двух http-ступеней. |
|
|
| Если извлечено меньше этого количества символов, страница считается 'тонкой', и лестница поднимается. |
|
|
| Как долго выученная ступень живёт, прежде чем деградировать на одну ступень дешевле. |
|
|
| Ваша машина — ваше решение. |
|
|
| На домен. 0 полностью отключает паузу. |
|
| a Chrome UA | Используется для сопоставления с robots.txt. |
|
| — | Bearer-ключи для |
|
|
| 127.0.0.1 держит его вне локальной сети. Контейнерам нужен 0.0.0.0. |
|
|
| Порт для |
|
| — | База данных и управляемые браузеры. Пусто = системный каталог по умолчанию ниже. |
|
|
| Строк хранится в request_log; обрезается при вставке. |
Данные — база SQLite и любой загруженный браузер — хранятся в системном каталоге данных, который можно переопределить через ESCALATOR_STORAGE_DATA_DIR. Ничего не записывается за его пределами.
Откуда берётся браузер
escalator browser list показывает поиск по порядку:
явный путь —
--browser-path, затемESCALATOR_BROWSER_PATH, затемbrowser.path. Если он задан и неверен, это ошибка с указанием пути, а не молчаливый переход дальше.браузеры, установленные на этой машине: сначала настоящий Google Chrome, затем Chromium, затем Edge и Brave.
браузер, загруженный ранее командой
escalator browser install.
Если ни один из них ничего не находит, вы получаете ошибку с указанием двух команд, которые это исправляют. Разрешение никогда не загружает само — серверный запрос или cron-задача не должны устанавливать программное обеспечение как побочный эффект.
Использование сервера
escalator serve # 127.0.0.1:8000 by defaultPOST /scrape {url, markdown?, min_tier?, max_tier?, timeout_ms?} -> FetchResult
GET /healthz -> {status, version}Аутентифицируйтесь с помощью Authorization: Bearer <key>, где ключ — один из server.api_keys. Этот список есть истина: удалите ключ — и он будет отозван при следующем запуске. Нет конечной точки для создания нового.
Стена возвращается как 200 OK с {"status": "challenged"}, а не как HTTP-ошибка. Это осознанно: агент на другом конце может на это отреагировать. Повторные попытки в цикле не помогут — escalator не решает CAPTCHA, по замыслу.
С дополнением [mcp] та же лестница доступна на /mcp как один инструмент, scrape_url(url, force_browser=False).
Устранение неполадок
Начните здесь:
escalator doctorОн проверяет Python, файл конфигурации, каталог данных, разрешение браузера, реальный запуск в headless-режиме и — если прокси настроен — один реальный запрос через него, сообщая исходящий IP и страну с замаскированным паролем. Каждый ❌ сопровождается одной строкой, которая это исправляет, и код выхода ненулевой, если что-то не удалось, так что скрипты тоже могут это использовать. escalator doctor --json для машин.
симптом | обычно это |
|
|
| doctor называет пакет для установки |
всё возвращает | нужен резидентный прокси: |
| не настроен ключ, или он был удалён из |
медленный первый запрос браузера | холодный старт Chrome; escalator повторяет запуск один раз |
Если всё ещё не работает, вставьте весь вывод escalator doctor в issue — именно об этом просит его последняя строка, и это самый быстрый путь к ответу.
Разработка
См. CONTRIBUTING.md. Кратко: uv sync, uv run pytest.
Лицензия
Выпущено в общественное достояние — см. UNLICENSE. Без гарантий, без обязательного указания авторства, делайте что хотите.
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
- AlicenseNot gradedqualityCmaintenanceScrapes webpages and converts them to markdown using AI-powered interaction to automatically handle cookie banners, CAPTCHAs, paywalls, and other blocking elements before extracting clean content.1548Apache 2.0
- AlicenseBqualityDmaintenanceEnables fetching and converting web content to markdown with built-in prompt injection safeguards that detect and block malicious content attempting to manipulate the LLM.12MIT

HatFetchofficial
AlicenseAqualityAmaintenanceEnables LLM agents to read any website by scraping and crawling into clean Markdown, automatically bypassing bot detection with residential proxies.342MIT- AlicenseNot gradedqualityBmaintenanceFetches and renders web pages using a headless Chromium browser, returning clean Markdown or HTML content even for JavaScript-heavy single-page applications.207MIT
Related MCP Connectors
Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.
Fetch any URL and get clean Markdown. Web scraping for AI agents.
Read any web page as clean Markdown for AI agents: fetch, search, metadata, links. SSRF-safe.
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/ruslanstarikov/escalator'
If you have feedback or need assistance with the MCP directory API, please join our Discord server