Skip to main content
Glama

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 が設定ファイルを1つ書き出し、初回実行前に手で編集する必要はありません。何かおかしい場合は: escalator doctor

最小限のLinuxでは(ベアコンテナ、新しいVPS)、Chromeはデスクトップがすでに持っているシステムライブラリを必要とします。escalatorはそれらをインストールしません — 正確な apt-get の行を表示し、escalator doctor がそれを繰り返します。1回だけ、1コマンド:

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の宝探しではなく2分の会話にするために存在します。

Related MCP server: Safer Fetch MCP Server

インストール

方法

コマンド

タイミング

uv(インストールなし)

uvx escalator init

試してみる

uv(永続的)

uv tool install escalator

PATHに追加したい場合

pipx

pipx install escalator

すでにpipxを使っている場合

pip

pip install escalator

既存のvenv内

Docker

docker run --rm ghcr.io/ruslanstarikov/escalator doctor

サーバー

コアフローに必要なものはすべてデフォルトインストールに含まれています。ブラウザのラン段も含めて — ブラウザは同梱されず、それが escalator browser install の役割です。追加が1つあります: 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 はその uid から書き込み可能である必要があります。

コマンド

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 ループ以上のものになるのは2つの点です:

200 OK は成功ではありません。 Cloudflareのインタースティシャルを伴うHTTP 200を返すラン段は成功していません。core/detect.py は抽出にすべてのレスポンスを分類します — contentthinblocked — そして content だけが有効です。それがなければラダーは決してエスカレーションせず、キャッシュはジャンクを永遠に配信するドメインに対して「httpが機能する」と学習してしまいます。

キャッシュは忘れます。 学習された開始ラン段が上にしかラチェットしないと、すべてのドメインがブラウザ+プロキシへと漂い、プロキシ料金を静かに膨らませます。エントリは learned_at を保持します。ladder.tier_cache_ttl_hours を過ぎると、ドメインは1段安いラン段を再試行します。

なぜこの形になっているのか、そして意図的に何を拒否しているのかは DESIGN.md を参照してください。

設定

init によって書き込まれる1つのファイルで、プラットフォームの設定ディレクトリにあります(Linuxでは ~/.config/escalator/config.toml、macOSでは ~/Library/Application Support/escalator/config.toml)。場所は --config で上書きできます。

優先順位は、どこでも:

CLI flag  >  environment  >  config.toml  >  default

すべてのキーには環境変数があり、それがファイルがまったく存在しなくてもDockerイメージが設定される方法です:

設定キー

環境変数

デフォルト

機能

browser.path

ESCALATOR_BROWSER_PATH

Chrome/Chromiumバイナリへの絶対パス。空 = 検出。

browser.headless

ESCALATOR_BROWSER_HEADLESS

true

false はディスプレイ(またはXvfb)が必要で、検出が難しくなります。

browser.via_proxy

ESCALATOR_BROWSER_VIA_PROXY

true

レンダリングもプロキシ経由でルーティングします。帯域幅を消費します。

browser.max_concurrent

ESCALATOR_BROWSER_MAX_CONCURRENT

4

小型マシンではChromeがRAMの上限です。

browser.timeout_ms

ESCALATOR_BROWSER_TIMEOUT_MS

30000

ブラウザラン段のフェッチごとの期限。

proxy.enabled

ESCALATOR_PROXY_ENABLED

false

スイッチ。これが false の間は以下はすべて無視されます。

proxy.url

ESCALATOR_PROXY_URL

http://user:pass@host:port、または socks5://...

proxy.list

ESCALATOR_PROXY_LIST

複数の出口。ラウンドロビンで使用。url と組み合わせます。

http.timeout_ms

ESCALATOR_HTTP_TIMEOUT_MS

10000

2つのhttpラン段のフェッチごとの期限。

ladder.min_content_chars

ESCALATOR_LADDER_MIN_CONTENT_CHARS

200

抽出された文字数がこの数未満の場合、ページは「thin」とされ、ラダーが登ります。

ladder.tier_cache_ttl_hours

ESCALATOR_LADDER_TIER_CACHE_TTL_HOURS

72

学習されたラン段が1段安く減衰するまでに生存する時間。

politeness.respect_robots

ESCALATOR_POLITENESS_RESPECT_ROBOTS

true

あなたのマシン、あなたの判断。

politeness.rate_limit_rps

ESCALATOR_POLITENESS_RATE_LIMIT_RPS

1.0

ドメインごと。0 は間隔を完全に無効にします。

politeness.user_agent

ESCALATOR_POLITENESS_USER_AGENT

Chrome UA

robots.txt のマッチングに使用。

server.api_keys

ESCALATOR_SERVER_API_KEYS

escalator serve のBearerキー。このリストが真実です:1つ削除すると失効します。

server.host

ESCALATOR_SERVER_HOST

127.0.0.1

127.0.0.1 はローカルネットワークから遮断します。コンテナは 0.0.0.0 を必要とします。

server.port

ESCALATOR_SERVER_PORT

8000

escalator serve のポート。

storage.data_dir

ESCALATOR_STORAGE_DATA_DIR

データベースと管理されたブラウザ。空 = 以下のプラットフォームデフォルト。

storage.request_log_limit

ESCALATOR_STORAGE_REQUEST_LOG_LIMIT

5000

request_log に保持される行数。挿入時にトリミングされます。

データ — SQLiteデータベースとダウンロードされたブラウザ — はプラットフォームのデータディレクトリに置かれ、ESCALATOR_STORAGE_DATA_DIR で上書きできます。その外には何も書き込まれません。

ブラウザの入手先

escalator browser list は検索を順に表示します:

  1. 明示的なパス — --browser-path、次に ESCALATOR_BROWSER_PATH、次に browser.path。設定されていて間違っている場合は、パスを指定したエラーになります。黙ってフォールスルーすることはありません。

  2. このマシンにインストールされているブラウザ: 本物のGoogle Chromeが最初、次にChromium、次にEdgeとBrave。

  3. 以前に escalator browser install がダウンロードしたブラウザ。

どれも見つからない場合は、それを修正する2つのコマンドを指定したエラーが表示されます。解決は自動でダウンロードしません — サーバーリクエストやcronジョブが副作用としてソフトウェアをインストールすべきではありません。

サーバーの使用

escalator serve   # 127.0.0.1:8000 by default
POST /scrape   {url, markdown?, min_tier?, max_tier?, timeout_ms?}  -> FetchResult
GET  /healthz                                                       -> {status, version}

Authorization: Bearer <key> で認証します。ここで key は server.api_keys の1つです。そのリスト 真実です:キーを削除すると、次の起動時に失効されます。新しいキーを発行するエンドポイントはありません。

壁はHTTPエラーではなく、200 OK{"status": "challenged"} で返ってきます。これは意図的です:エージェントの側がそれに反応できるように。ループで再試行しても役に立ちません — escalatorは設計上CAPTCHAを解決しません。

[mcp] エクストラを使用すると、同じラダーが /mcp で1つのツールとして公開されます: scrape_url(url, force_browser=False)

トラブルシューティング

まずここから:

escalator doctor

Python、設定ファイル、データディレクトリ、ブラウザの解決、実際のヘッドレス起動、そして — プロキシが設定されている場合 — それを通した1回の実際のリクエストをチェックし、パスワードをマスクした状態で出口のIPと国を報告します。すべての❌にはそれを修正する1行が付属し、何かが失敗した場合は終了コードが非ゼロになるため、スクリプトでも使用できます。マシン向けには escalator doctor --json

症状

通常の原因

no Chrome-family browser found

escalator browser install

Linux で error while loading shared libraries

doctor がインストールするパッケージを指定します

すべてが challenged を返す

住宅用プロキシが必要です: escalator init

/scrape が401を返す

キーが設定されていない、または server.api_keys から削除された

最初のブラウザフェッチが遅い

Chromeのコールドスタート。escalatorは起動を1回再試行します

それでも動作しない場合は、escalator doctor の出力全体をissueに貼り付けてください — それがその最後の行が求めているものであり、回答への最速の道です。

開発

CONTRIBUTING.md を参照してください。要するに: uv syncuv run pytest

ライセンス

パブリックドメインとして公開されています — UNLICENSE を参照してください。保証なし、帰属表示不要、好きなように使ってください。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)

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

  • A
    license
    Not graded
    quality
    C
    maintenance
    Scrapes 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.
    15
    48
    Apache 2.0
  • A
    license
    B
    quality
    D
    maintenance
    Enables fetching and converting web content to markdown with built-in prompt injection safeguards that detect and block malicious content attempting to manipulate the LLM.
    1
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables LLM agents to read any website by scraping and crawling into clean Markdown, automatically bypassing bot detection with residential proxies.
    3
    42
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Fetches and renders web pages using a headless Chromium browser, returning clean Markdown or HTML content even for JavaScript-heavy single-page applications.
    207
    MIT

View all related MCP servers

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.

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/ruslanstarikov/escalator'

If you have feedback or need assistance with the MCP directory API, please join our Discord server