Skip to main content
Glama
AginxBrowser

AginxBrowser

AginxBrowser

AIエージェントのためのブラウザ。ライブなウェブを見て、操作できます。

skills.sh License MCP Hosted

English | 中文文档

最初のコード行からエージェント向けに作られたブラウザ。自動化に後付けされた人間用ブラウザではありません。世界を見て、読んで、検索して、操作できる——V8を内蔵した単一のRustバイナリで、Chromiumは不要です。

人間にはChrome。エージェントにはAginxBrowser。

単一バイナリ、ゼロ依存、即時起動。HTTP API + ネイテイブ MCP — エージェントは接続するだけですぐ使えます。

なぜエージェント専用ブラウザが必要なのか

既存の「ブラウザ自動化」は人間向けか、一度切りのスクレイピング向けに作られており、エージェント向けではありません。

AginxBrowser

Puppeteer/Playwright

Firecrawl

Browser-use

設計対象

エージェント優先

人間のデバッグ

スクレイピングサービス

LLMラッパー

依存関係

単一バイナリ、Chromium不要

Chromium ~500MB

Docker ~1GB

Chromium

見る(スクリーンショット)

✅ 内蔵ditingレンダリングエンジン

Chromiumが必要

❌

Chromiumが必要

読む

markdown + js_extract

自作

markdown

自作

見つける(検索)

✅ 5エンジンのメタ検索

❌

❌

❌

操作

インデックス化されたセッシォン操作

DevTools API

❌

LLM駆動

プロトコル

HTTP + native MCP

Node API

HTTP

Python

TLSフィンガープリント

✅ Chrome/Firefox/Safari

プラグインが必要

❌

❌

CAPTCHA解決

✅ 自動

自作

❌

❌

インタラクテイブセッシォン

✅ 永続

✅

❌

✅

エージェントがブラウザに求めるものは5つあります。見る、読む、検索する、操作する、展開するです。単一バイナリがすベてをカバーします — systemd対応、Claude Code / Cursor向けのMCPネイテイブ、ゼロ依存。

中核となる利点:Chromium不要。 AginxBrowserは完全なブラウザエンジンを内蔵しています(V8 + Rust HTTPスタック + 独自のditing CSS/レイアウト/ペイントレンダリングエンジン。参昭実装はBlitz/Stylo/Taffy系)。PuppeteerもChromeもDockerも不要。systemdの下で動く単一のRustバイナリが、エージェントのブラウジング基盤になります。

Related MCP server: Pilot

ステートレス・レンダラーにはできない3つのこと

新し「エージェントブラウザ」のほとんどは、ステートレスでフィンガープリントのない一度切りのレンダラーです。公開ページでは問題なく動きますが、Cloudflareやログインフローには歯が立ちません。AginxBrowserは逆の道を行きます。

  • 🔐 本物のTLSフィンガープリント — ステルスモードはBoringSSLを介してChrome145 / Fircfox133 / Safari / Edgeの完全なTLSハンドシェイクを再現します(UA文字列だけではありません)。リクエストごとに切替え可能。Cloudflare Turnstileチャレンジは自動でcf_clearanceを待ちます。フィンガープリントのないエンジンは403を食らいますが、こちらは通り抜けます。

  • 🤝 ステートフルな対話セッシォン — 永続セッシォン(アイドル時8分間キープアライブ)、ログイン状態の注入とエクスポートが可能(session_create(cookies=...) ↔ session_cookies)。ページネーションや複数ステップのフローを生き延びます。一度切りのエンジンは状態を捨ててしまいます。

  • 🔌 MCPネイテイブ — 14のツールを第一級市民として提供(CDPのシムではありません)。Claude Code / Cursor / Claude Desktopが一行で接続できます。HTTP + MCPのデュアル・プトコル。

参考:CloudflareのKitesurfは、本物のTLSフィンガープリント交渉も、永続的な認証セッシォンも明示的には提供していません。アンティボットとログインの領分こそ、AginxBrowserの主戦場です。

Apache-2.0のオープンソース、単一バイナリ — 今すぐセルフホスト。クラウド・ロックインはありません。

機能

  • 階層型レンダリング: 通常のHTTPでの静的ページ(約100ms)。JSレンダリングが必要なときだけV8が起動します(約1〜2秒)— 約80%のページで10倍高速

  • マルチエンジンのメタ検索: 一般Web(Baidu / Bing / Sogou / WeChat / Google)、ニュース(Bing News)、コード(Stack Overflow、GitHub)、パッケージ(npm、PyPI)、学術(arXiv)、AIモデル(Hugging Face)— 同時にクエリして、マージして重複排除します。運用者は同じ/searchにプライベートなMeilisearchインデックスを接続できます。検索→読取リが1ステップで完了

  • 画象検索: categories=images でBaidu/Bingの画象インデックスにアクセスし、直接バリナリのimage_urlリンク(jpg/pngにそのままダウンロード可能)とsource_urlの出所を返します。

  • インタラクテイブセッシォン: インデックス化された操作(state/click/input/scroll/eval)を備えた永続ブラウザセッシォン — エージェントは人間のようにブラウズします。

  • CAPTCHA自動解決: タイプ検出とオプションの2captcha連携 — 検索が認証ページで止まることがありません。

  • JSデータ抽出: js_extract は window.__INITIAL_STATE__ などの構造化データをSPAから取リ出します。

  • スクリーンショット描画: /screenshot エンドポイント(オプションの--features screenshot)は、JSで描画されたDOMを独自のditingレンダリングエンジンでPNGに描画します — CPUのみ、Chromium不要。エージェントへの視覚入カ。

  • Cloudflare自動待機: 「Just a moment...」というチャレンジページを検出し、cf_clearance が解消されるまで待機します。

  • TLSフィンガープリント偽装: ステルスモードはChrome145/Firefox133/Safari/Edgeを模倣し、リクエストごとに切替えます。

  • MCPサーバー: --mcp モードは14のツール(fetch/eval/click/search/download + 9のセッシォン用ツール)を公開します — Claude Code / Claude Desktop / Cursorが直接呼び出せます。

  • Firecrawl互換: /v1/scrape エンドポイント — 既存のFirecrawlクライエントはベースURLを変えるだけで移行できます。

  • DNSリバインディング保護: 内蔵のSSRFガード + 解拆後のIPバリデーション

何のためにあるのか

デモではありません — エージェントブラウザが今日実際に担っている仕事です。

  • 管理者コンソールをひたすら操作 — AWS / App Store Connect / Google Playなど、タスクごとに何十ものメニュー階層。エージェントにクリックさせ、認可が必要なときだけ戻ってきます。

  • ログイン後ろの一括操作 — カートに商品を入れる、注文履歴を掘り下げる、ログイン中にしか描画されないページを確認する。クッキーを注入し、操作し、再利用のためにエクスポート。

  • アンティボットの壁を突破 — Cloudflare保護、Turnstileチャレンジ、TLSフィンガープリント検査。403で後退するのではなく、ステルスモードが押し通ります。

  • 中国のインターネット — Baidu / Sogou / WeChatの5エンジンにまたがるメタ検索、正確な中国語ページ描画。英語ウェブだけではありません。

  • その場でのスクリプティング — エージェントがページを読んで、JSを書いて、evalで実行します。強調された比較テーブル、再フローされたコンテンツ、非表示パラメータでの商品フイルタ。GreaseMonkeyを超強化したようなもの。

  • マルチモーダル視覚 — 見て判断するフローのための視覚入カとしてのスクリーンショット:席を選ぶ、レイアウトを認織する、描画を検証する。

クイックスタート

まずはホスト型インスタンスをお試しください:https://browser.aginx.net/

ワンコマンド完全インストール(SKILL.mdトリガーサーフェス + MCPツール + 検証):

# Download -> inspect the contents -> run only after review (never blind-run network scripts)
curl -fsSL https://raw.githubusercontent.com/yinnho/aginxbrowser/main/skill.sh -o skill.sh
less skill.sh
bash skill.sh

MCPのみ登録:

claude mcp add aginxbrowser --transport http https://browser.aginx.net/mcp

スキル・トリガー・サーフェスを skills.sh でインストール:

npx skills add yinnho/aginxbrowser

セルフホスティング:

# Prebuilt binary (one-line installer: platform detect + sha256 + self-check)
curl -fsSL https://raw.githubusercontent.com/yinnho/aginxbrowser/main/install.sh -o install.sh
less install.sh && bash install.sh
aginxbrowser doctor   # features + fonts + egress self-check

# Or build from source (--features stealth,screenshot or you lose both)
cargo build --release --features stealth,screenshot

# Start the service
./target/release/aginxbrowser
# → Listening on 0.0.0.0:8089

# Verify
curl http://127.0.0.1:8089/health
# → {"status":"ok","engine":"diting"}

# Fetch a page
curl -sS -X POST http://127.0.0.1:8089/fetch \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

# Search
curl -sS -X POST http://127.0.0.1:8089/search \
  -H "Content-Type: application/json" \
  -d '{"q":"macbook price","max_results":5}'

# Create an interactive session
curl -sS -X POST http://127.0.0.1:8089/session/create \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'
# → {"session_id":"s_1","url":"https://example.com/"}

# MCP mode (for AI agents)
./target/release/aginxbrowser --mcp

プロジェクト構成

aginxbrowser/
├── Cargo.toml
├── build.rs              # V8 snapshot generation
├── js/
│   └── bootstrap.js      # V8 bootstrap script
├── README.md
├── docs/
│   └── API.md            # Full API reference (HTTP + MCP)
└── src/
    ├── main.rs              # HTTP service entry & routing
    ├── server.rs            # Business layer (fetch/click/eval/search)
    ├── session.rs           # Interactive browser sessions
    ├── captcha.rs           # CAPTCHA detection & auto-solve
    ├── render.rs            # Tiered rendering (HTTP direct → diting browser engine)
    ├── mcp.rs               # MCP server (14 tools)
    ├── firecrawl_compat.rs  # Firecrawl-compatible /v1/scrape endpoint
    ├── browser.rs           # Top-level API: Browser, BrowserBuilder
    ├── page.rs              # Top-level API: Page, Element
    ├── config.rs            # BrowserConfig
    ├── cookie.rs            # CookieStore
    ├── error.rs             # Error types
    ├── search/              # Native search engines
    │   ├── mod.rs           #   SearchEngine trait, Registry, merge/dedupe, progressive backoff
    │   ├── baidu.rs         #   Baidu (JSON API, wreq stealth)
    │   ├── bing.rs          #   Bing (HTML parsing, plain reqwest)
    │   ├── sogou.rs         #   Sogou web (HTML parsing, plain reqwest)
    │   ├── sogou_wechat.rs  #   Sogou WeChat (HTML parsing + /link resolution)
    │   ├── google.rs        #   Google (HTML parsing, wreq stealth + proxy)
    │   ├── stackexchange.rs #   Stack Overflow (SE API v2.3, code category)
    │   ├── github_repos.rs  #   GitHub repos (api.github.com, code category)
    │   ├── arxiv.rs         #   arXiv (Atom API, academic category)
    │   ├── bing_news.rs     #   Bing News RSS (news category; proxy-first)
    │   ├── huggingface.rs   #   HF Hub models/datasets/spaces (ai category)
    │   ├── npm.rs           #   npm packages (npms.io API, packages category)
    │   ├── pypi.rs          #   PyPI name resolution (JSON API, packages)
    │   └── meilisearch.rs   #   Private-index adapter (env-configured)
    │
    ├── diting_dom/          # HTML parsing, DOM tree, CSS selectors
    ├── diting_net/          # HTTP client, cookies, encoding, proxies
    ├── diting_js/           # V8 runtime, JS ops, module loading
    └── diting_browser/      # Page navigation, lifecycle, browser context

ビルド

# Standard build (no stealth; TLS fingerprint features inactive)
cargo build --release

# With stealth (requires go + cmake + C++ toolchain; enables TLS fingerprint spoofing)
cargo build --release --features stealth

# With screenshot rendering (enables /screenshot; adds the rendering stack, +30-40MB)
cargo build --release --features screenshot

# Full featured (recommended for production)
cargo build --release --features stealth,screenshot

要件:Rust 1.78+。V8静的ライブラリは初回ビルド時に自動的にダウンロードされます。ステルス機能にはさらにgo、cmake、C++コンパイラが必要です。スクリーンショット機能には、バンドルされたCJKフォントサブセット(GB2312 + 一般的な記号)が同梱されており、中国語の正しい描画にシステムフォントは不要です。

実行時環境変数

変数

デフォルト

説明

AGINXBROWSER_BIND

0.0.0:8089

待受アドレス

AGINXBROWSER_STELTH

有効

0 でステルス無効(診断用)

AGINXBROWSER_UA

Linux Chrome145

偽装するUser-Agent

AGINXBROWSER_ACCEPT_LANGUAGE

zh-CN,zh;q=0.9,en;q=0.8

Accept-Language ヘッダー

AGINXBROWSER_PROXY

なし

省略可能なフォールバックプロキシ。ブロックされたソースのエンジン(Google、Bing News、Hugging Face)はまず直接接続し、直接接続に失敗した場合にのみこのプロキシにフォールバックします。海外展開ではプロキシは一切不要です。リクエストごとの use_proxy:true でも fetch/search がこのプロキシ経由になります

AGINXBROWSER_CACHE_TTL_SECS

600

/fetch キャッシュTTL、0 で無効

CAPTCHA_SOLVER_API_KEY

なし

2captcha APIキー。CAPTCHAの自動解決を有効化

CAPTCHA_SOLVER_SERVICE

2captcha

CAPTCHA解決プロバイダー

AGINXBROWSER_MEILI_URL

なし

Meilisearch のベースURL。設定するとプライベートインデックスエンジンを有効化

AGINXBROWSER_MEILI_INDEX

なし

クエリ対象の Meilisearch インデックス uid

AGINXBROWSER_MEILI_KEY

なし

Meilisearch インスタンス用の任意の Bearer キー

APIドキュメント

完全なAPIリファレンス → docs/API.md セキュリティ監査ノート → docs/skills-sh-audit.md — skills.sh が「Critical Risk」と表示する理由、および各警告が対応する実際の製品機能

対象:

  • すべての HTTP エンドポイント(/fetch、/click、/eval、/search、/v1/scrape、8つのセッションエンドポイント)

  • 全14の MCP サーバーツールとそのパラメータ

  • Claude Code / Claude Desktop / Cursor クライアント設定

  • 環境変数、エラーコード、サイト別スクレイピング例

他のシステムへの組み込み

AginxBrowser は純粋な併設型インフラです。実際のブラウザと同様に、ホストコードを埋め込んだりホスト設定を汚したりすることなく、あらゆるものから呼び出せる独立サービスとして動作します。1台のマシンにつき1インスタンスを(systemd 配下で)デプロイすれば、「レンダリング+スクレイピング」機能を必要とするすべてのアプリがそれを共有できます。

統合: 環境変数 AGINXBROWSER_URL=http://127.0.0.1:8089 を読み取ります。未設定 → 動作は変わりません。設定 → リスク管理対象サイトは自動的に AginxBrowser 経由でレンダリングされ、失敗時には正常にフォールバックします。

既知の制限事項

  1. スクリーンショットはオプトイン: /screenshot には cargo build --release --features screenshot が必要です(レンダリングスタックが追加され、+30〜40MB)。デフォルトのレンダリングエンジンは diting(独自の CSS+レイアウト+ペイントスタック)です。engine: "blitz" を渡すと、Blitz リファレンスパイプラインに戻せます。複雑なサイトの CSS はどちらでも近似であり、Chromium のようなピクセル完全ではありません。

  2. 要素座標は(ブロックレベルで)サポート: selector 付きの /screenshot は要素のページ座標(selector_rects、CSS px)を返します。selector のみの場合はその要素に直接クロップします。純粋なインライン要素(<a>text</a>)には独立したボックガないため、ブロックレベルの祖先を選択してください。

  3. JS 操作は広く動作しますが、フインガープリントが厳しいページでは失敗する可能性があります: React/Vue のイベントデリゲーションは正常に動作します(src/href などの URL リフレクション属性は絶対 URL に解決されるため、Next.js/webpack はハイドレーションし、クリックでハンドラが起動します)。navigator.plugins や WebGL canvas などを調査する厳重なフインガープリント認証ページ(WorkOS/Cloudflare)は、ステルスフインガープリント対応が完了するまで壊れる可能性があります。

  4. プロキシ対応: AGINXBROWSER_PROXY による HTTP/HTTPS/SOCKS5

  5. リスク管理が厳しいサイト: Baidu Wenku は非対応。Zhihu の記事には有効な __zse_ck が必要

ライセンス

OpenCarrier メインプロジェクトと同一。Apache-2.0。

Available Tools

40 tools
account_deleteAInspect

Delete a named login identity: stored record AND live jar. Cookie values are credentials — delete means gone. Sessions currently running as the account keep their in-process jar handle, but nothing writes back. Returns {deleted: name}, or an error naming the account if it does not exist.

Inputs: name (required).

account_listA
Read-only
Inspect

List named login identities (the multi-account layer) with metadata only: name, cookie domains, cookie count, updated_at, the last account_verify verdict, and the identity's persona User-Agent (each account is one stable device: its own UA and hardware fingerprint, drawn once and reused). Cookie values are credentials and never leave the server. Use to see which identities exist before session_create {account} picks one.

Inputs: no named parameters.

account_loginAInspect

Open a site's login page AS a named account and close the login loop. Creates the session as the account (private jar, device persona), navigates to url, and reports which generic login gates the page shows — needs: password | sms | qr | slider (QR scan like xiaohongshu, SMS code, password form, slider/captcha) — plus a session_verdict classification and, when a human step is needed, the session_id and a /live handoff so a person can finish it in the live view (the engine detects and describes; it never fills credentials or solves challenges). With predicate and no human gates detected, waits for the automatic bounce, then teaches + stamps the account's verify spec — later account_verify calls re-check it bare. Cookies write back after every action, so a login finished in /live is already persisted. status is "logged_in" (verify stamped), "waiting" (drive session_wait/session_input on session_id, or re-call account_login after the human finishes — the account's shared jar already holds it), or "opened" (no predicate given).

Inputs: url (required), name (required), predicate, use_proxy, +1 more.

account_verifyAInspect

Check whether a named account is still logged in. Teach-once: the first call passes url + predicate (a JS expression truthy on a logged-in page, e.g. !!document.querySelector('.user-nick')); the spec is remembered and later calls can be bare. Runs in a scratch session AS the account (private jar), so the probe doubles as a cookie refresh. Returns {name, logged_in, url, checked_at}.

Inputs: name (required), url, predicate.

cacheAInspect

Query the LOCAL CACHE of every page this server has fetched and every search it has run. Check here BEFORE re-fetching or re-searching — a hit is instant and free while a fresh fetch costs 5-60s. Use query for full-text search (works for Chinese substrings and English words), get to pull a page's full cached content, stats for counts, clear to delete rows.

Inputs: all, get, url, kind, +5 more.

clickAInspect

Click an element on a one-off page: loads url in a fresh browser context (stateless — no cookies unless passed, no shared state with other calls), waits wait_secs after load before clicking, then fires a DOM click on the first CSS-selector match. The click may trigger navigation (link, form submit) — the response url and text_after are read after that navigation lands. Returns clicked:false when the selector matches nothing. For multi-step interaction on a shared page use session_click instead.

Inputs: url (required), selector (required), wait_secs.

downloadAInspect

Download a file over HTTP(S) with streaming to disk (no memory buffering), SHA-256 integrity hash, and optional resume of interrupted transfers. Filename resolution: explicit param → Content-Disposition → URL tail. Use for binaries, archives, datasets, documents - anything where the agent wants the FILE saved, not its text content read.

Inputs: url (required), resume, cookies, filename, +1 more.

evalAInspect

Execute JavaScript on a one-off page: loads url in a fresh browser context, optionally waits wait_secs for the page to settle, evaluates script (async/Promise supported) and returns {url, result}. Script-driven navigation (location.href, form submit) is drained and reflected in the returned url. Stateless — no cookies or page state shared with other calls; when the script needs prior page state or a login, use session_eval.

Inputs: url (required), script (required), wait_secs.

fetchA
Read-only
Inspect

Fetch a webpage and return clean markdown/html/text. Use whenever the agent needs to READ any web page - blogs, docs, articles, JS-rendered SPAs, Cloudflare-protected sites. Static pages are served over plain HTTP (~100ms tier:"http"); pages that need JS get the full browser (tier:"browser"). render_tier selects auto (default) / http (pure HTTP, refuses the upgrade) / browser (always the JS browser).

Inputs: url (required), format, sanitize, selector, +8 more.

flow_runAInspect

Run a flow — a recorded, editable JSON browser-session script — deterministically, with zero model tokens. Steps are {op, args, expect?, save?}: ops cover navigate/click/click_xy/input/scroll/eval/wait/screenshot/state/cookies; {{var}} placeholders in args are filled from vars; expect asserts (url_contains | selector | text_contains | eval_truthy) abort with evidence on failure; save collects a step's output into the receipt. Source the flow inline via "flow", or by "name" from the server's workflow//flow.json (unknown name → error lists installed workflows). Pass session_id to reuse a live session (e.g. from import_curl) so login state and flows compose. The receipt carries status ok/failed, saved outputs, the session_id (kept alive), and on failure the failing step, reason and a diagnostic screenshot — fix the flow or take the session over from there.

Inputs: flow, name, vars, max_steps, +1 more.

import_curlAInspect

Import login state from a real browser in one paste. The human logs into a site in their own Chrome (solving the CAPTCHA/SMS once), opens DevTools → Network, right-clicks any authenticated request → "Copy as cURL", and passes the command here. Returns a live session_id already carrying that site's cookies and sitting on the copied request's URL — the agent continues from where the human left off, no password or second login needed. Works with bash, PowerShell and cmd copy flavors.

Inputs: curl (required), account, use_proxy.

render_markdownAInspect

Render a markdown document into a deterministic, self-contained HTML artifact - the document layer, so the agent never writes HTML by hand. Prose rides a plain offline shell (no fonts, no scripts); archify fenced code blocks carry typed zero-coordinate diagram JSON (sequence, workflow, architecture, dataflow, lifecycle families) and render to inline SVG via the layout engine. Same input, same bytes: the receipt carries the sha256 so determinism is verifiable. theme picks light (default) or dark; preset picks the palette family — classic (default), signal-flow, blueprint, editorial — orthogonal to theme; colors bake at generation time (presentation attributes, not CSS variables), and the receipt records both preset and theme. quality picks the composition audit profile — standard (default) or showcase, the delivery gate: the receipt's diagrams[].composition grades route crossings, ambiguous corridors, label clearance (2px standard / 4px showcase), route rhythm, and node text projected to the 930px reader width; the audit never changes the artifact bytes. Mermaid sources are the agent's job to translate, not the engine's: flowchart/graph → workflow (lanes + columns), sequenceDiagram → sequence, stateDiagram-v2 → lifecycle (bands), erDiagram/class → architecture (grid + boundaries) — read the topology and emit the matching zero-coordinate archify JSON; the engine accepts only archify JSON. A broken diagram degrades to a visible code block and lands in receipt.diagnostics; an authored route preset that cannot be honored is self-repaired to a verified semantic substitute and disclosed in receipt diagrams[].repairs - the document still renders. A fence may also carry views: [{id,label,nodes,note?}] (node ids of the active family), emitted as guided-view tabs above the diagram plus an inlined viewer script - clicking a tab lights the member nodes and the routes between them (subgraph), clicking a node lights it with its direct neighbors (ego graph), everything else dims; a view's optional note shows as a caption while it is active (the story layer). window.agxViewer in a session drives and reads the same state programmatically: {focus,view,state} as before, plus route(i,from,to) which returns and lights the shortest authored directed path between two nodes (null when unreachable, state untouched), and reach(i,id,down|up) which returns and lights the authored downstream/upstream closure ({nodes,links}); both dim the rest of the diagram. diagrams[].views in the receipt lists the tabs. motion: true bakes an entrance choreography into the artifact: pure-declarative CSS animation with zero scripts - headings split into per-glyph (CJK) / per-word (latin) spans that rise in with expo easing, prose blocks stagger up an nth-child delay ladder, diagram figures grow in with a back ease (GSAP's easing math as public cubic-bezier equivalents, nothing embedded); the diagrams themselves play a flow story on the same clock - nodes land beat by beat, solid edges draw in (dash-offset), dashed returns fade, sequence messages arrive as sent - with a timed caption strip under each figure as the subtitles, which becomes a static transcript under prefers-reduced-motion; the file itself animates in any browser and the receipt records motion plus diagrams[].story (beat times and captions - the hook for muxing voice later). With session_id the artifact is also loaded into that session (local, free) and the reply carries viewport acceptance: scroll extents measured in the live session and graded fits/tall/wide/oversized, telling the agent how to read the page back. Diagram vocabulary adapted from archify (MIT).

Inputs: markdown (required), theme, motion, preset, +2 more.

render_pdfAInspect

Cut a rendered page into pages and package as PDF, PNGs, PPTX or DOCX. Print mode (no selector) paginates the document into fixed-height pages (default 794x1123, A4 @96dpi), breaking at top-level block boundaries — no half-cut text where a break can land on a block edge. Slides mode (selector set) makes one page per match, sized to that element — generate an HTML deck with one .slide per page and each becomes a deck page. format "pdf" (default) returns base64 image-based PDF; "png" returns one base64 PNG per page in pages_base64; "pptx" returns a base64 PPTX (one slide per page, deck-sized to the largest page); "docx" returns a base64 DOCX (one page-sized section per page, each section keeps its own height). Returns page count and packaging.

Inputs: url (required), width, format, height, +5 more.

render_videoAInspect

Render a page's animation timelines to an MP4 video. The page's scripts must expose window.__timelines — objects with duration() and pause(t) (a paused gsap.timeline registered there works as-is). Each frame seeks every timeline to t=i/fps and paints the viewport, so the output is deterministic — no wall clock in the pixel values. Audio: narration[] places TTS/voice clips at start times (mixed into one AAC track), audio adds looped background music, and subtitles_srt muxes an SRT as a soft mov_text track and (by default, burn_subtitles: false to opt out) burns the same cues into the frame pixels — QuickTime, WeChat and most social embeds ignore the soft track. Requires ffmpeg on the server. Returns base64 MP4 (H.264, yuv420p) plus frame count and durations.

Inputs: url (required), fps, audio, width, +10 more.

session_challengesA
Read-only
Inspect

One-call risk-control report: did this session hit an anti-bot wall? Taobao/tmall's x5 risk control answers 200 like a normal response — either a redirect onto a punish page (tmd/punish, punish.taobao.com) or an MTop API body carrying FAIL_SYS_USER_VALIDATE / RGV587 / x5secdata. Returns {total, events:[{url,method,status,kind,via}]} where via says whether the wall was navigated into ("url") or swallowed by an API response ("body"). When there are hits, the response also carries the account name (which identity got walled) and a handoff instruction: the engine detects and surfaces but does not auto-bypass — a human opens the live view (/live?session= on the engine's HTTP port), solves the challenge in this session, and the retry rides the cookie that solving sets. Detection only; no automated solving or bypass.

Inputs: session_id (required).

session_clickAInspect

Click an interactive element by its index (from session_state output) inside a live browser session: scrolls it into view and fires a DOM click on the session's current page. Before clicking it re-verifies the element in the same frame — if the page changed since session_state (element detached, disabled, hidden, or covered by an overlay), it returns clicked:false with a reason ("detached"/"disabled"/"not_visible"/"covered_by") and, when covered, a covered_by description of the element that would eat the click — never a silent no-op. A submit click may navigate the session — the returned url/text_after reflect the page after the action, and session state (cookies, localStorage, globals) persists for follow-up calls. Indexes come from the most recent session_state; re-list after navigation.

Inputs: index (required), session_id (required).

session_click_xyAInspect

Click at viewport coordinates (CSS pixels) via real mouse events — pointerdown/mousedown, pointerup/mouseup, then click on whatever element is hit there. For canvas/map surfaces with no DOM element to index. click_count 2 adds dblclick.

Inputs: x (required), y (required), session_id (required), button, +1 more.

session_cloneAInspect

Derive a new browser session from a live one, carrying the full login state: cookies, localStorage/sessionStorage, viewport pin, dialog policy, proxy and keepalive flags. The source session stays untouched. Use to snapshot a logged-in state before risky actions, or to run the same login in parallel tabs. Returns {session_id (new), cloned_from, url, viewport}.

Inputs: session_id (required).

session_closeAInspect

Close a browser session and free its resources. For a persistent session this also drops the on-disk login snapshot - idle expiry keeps it, an explicit close does not.

Inputs: session_id (required).

session_consoleA
Read-only
Inspect

Read the session's recent page console output (log/info/warn/error) as {url, total, matched, messages:[{ts_ms, level, text, url}]}, newest last. Ring buffer of 500 entries; captures output from page scripts, clicks, evals and navigation alike. Optional filters: level (exact, e.g. "error"), since_ts (epoch ms), url_contains (page URL substring), limit (most recent N matches). The fastest way to see WHY a page misbehaves: click the button, call this, read the error.

Inputs: session_id (required), level, limit, since_ts, +1 more.

session_cookiesA
Read-only
Inspect

Export the session's current cookies as ["name=value", ...] for the page's URL. Use to persist a logged-in session and replay it later via session_create with cookies. Round-trips with session_create's cookies field.

Inputs: session_id (required).

session_createAInspect

Create a persistent interactive browser session for multi-step interaction - clicking, typing, scrolling, reading state across page transitions. Use when the agent must INTERACT with a page (login flows, forms, pagination, click-through) rather than read it once. Returns session_id; persists 8 min idle. With persistent:true the login state survives idle eviction and server restarts - the same session_id revives logged-in.

Inputs: url, width, height, mobile, +7 more.

session_dialogAInspect

Inspect or flip the session's dialog policy for window.alert/confirm/prompt. Dialogs never block the page: each is auto-answered (default dismiss) and logged into session_console at level "dialog". action "list" reports {policy, prompt_text, dialogs}; "accept" makes subsequent confirm() true and prompt() return prompt_text (or the call's default argument); "dismiss" restores the default.

Inputs: action (required), session_id (required), prompt_text.

session_dragAInspect

Drag the mouse from one viewport position to another: press at from, steps mousemove events, release at to. The trajectory is humanized by default (eased velocity, wobble, jittered timing, overshoot) — the shapes anti-bot checks score for; pass humanize:false for exact linear interpolation. Moves AMarker-style drag targets, canvas selections and captcha sliders that only track while the pointer travels.

Inputs: to (required), from (required), session_id (required), steps, +2 more.

session_evalAInspect

Execute arbitrary JavaScript in a live browser session and return the result. Runs in the session's current page, so DOM mutations, globals and storage persist across calls — unlike the stateless eval tool, which loads its own throwaway page each call. Script-driven navigation moves the session's URL. JS exceptions are reported with name, line/column and stack.

Inputs: script (required), session_id (required), timeout_ms.

session_exportA
Read-only
Inspect

Export a browser session's recorded action log. Format "bash" (default) returns a runnable curl script that replays every recorded action (navigate/click/input/scroll/eval) against a fresh session on this server — hand it to a shell or cron, zero model tokens. Format "jsonl" returns the raw action log, one JSON object per line. Format "json" returns a flow.json document — the same recording as editable ops ({op, args}) with cookies/storage stripped — that flow_run replays server-side.

Inputs: session_id (required), format.

session_inputAInspect

Type text into an input/textarea element by its index (from session_state output), focusing it and dispatching input/change events. events:"full" is the complete human typing gesture: per-character keydown/keypress/input/keyup cycles, trailing change, then blur — the tail blur commits on forms that save in onBlur (React capture listeners, #100). A disabled, readonly, or detached field answers filled:false with a reason instead of a silent write. Hidden inputs are legitimate targets and are filled normally.

Inputs: text (required), index (required), session_id (required), events.

session_listA
Read-only
Inspect

List live browser sessions with idle age and the time left before auto-eviction. Use to discover a session to reuse instead of creating a new one; sessions expire after 8 min idle.

Inputs: no named parameters.

session_navigateAInspect

Navigate a browser session to a new URL.

Inputs: url (required), session_id (required).

session_networkA
Read-only
Inspect

Read the session's network request log. filter="media" extracts playback/stream URLs (m3u8/HLS, mp4, dash, flv...) actually requested by the page's player at runtime - the reliable way to get a real video link, since links embedded in page HTML are often decoys. Media elements and player iframes the engine never fetches (video/audio/source/iframe src) are merged in as candidates: via="network" entries are confirmed requests, via="dom" entries are candidates carrying their tag (iframes = kind "iframe", navigate into them to sniff). Default returns every request as compact rows (method/url/status/type/size). Navigate to the video page first, let it load, then call this.

Inputs: session_id (required), filter, url_contains, body_max_chars, +1 more.

session_preloadAInspect

Replace the session's document-start preload group (empty array clears). Sources run before each new document's own scripts — including inline tags — which is the only hook that beats pages whose signing layer captures window.fetch/XHR natives at parse time (xhs's inline jsvmp). Set before the first navigate; applies to every navigation from then on.

Inputs: session_id (required), scripts.

session_screenshotAInspect

Screenshot the session's CURRENT DOM state (mutations from clicks/evals included) as a base64 PNG via the built-in renderer. Width/height default to the session's viewport, so session_viewport + session_screenshot shows the responsive layout. Returns {url, width, height, image_base64, format}.

Inputs: session_id (required), width, height, selector, +2 more.

session_scrollAInspect

Scroll the page up or down by a number of viewport-heights.

Inputs: session_id (required), amount, direction.

session_set_filesAInspect

Select files on a file input programmatically (Playwright setInputFiles semantics): builds File objects from base64 content, assigns them to input.files, then dispatches input+change so framework onChange handlers fire. Selector-addressed because file inputs are often hidden and absent from the session_state index.

Inputs: files (required), selector (required), session_id (required).

session_stateA
Read-only
Inspect

Get the current page state as an indexed list of interactive elements. Returns compact text with [N] indexes for use with click/input tools.

Inputs: session_id (required).

session_storageA
Read-only
Inspect

Snapshot the session's localStorage/sessionStorage for the current origin: {url, local_storage, session_storage}. Feed it back via session_create's storage field to restore a logged-in state in a new session — the half of login state that cookies can't carry (many sites keep the session token in localStorage). Call before the session idles out.

Inputs: session_id (required).

session_verdictA
Read-only
Inspect

One call answers "where did this session land": verdict is one of challenge (risk control engaged — punish page or a 200-status API body that swallowed the wall; the response carries a handoff instruction for a human to solve it in the live view), captcha (explicit CAPTCHA interstitial), login (bounced to a login form — auth expired), empty, landed (normal 2xx content page), or unknown (couldn't classify — read facts; a non-2xx main document lands here with facts.doc_status carrying the number, so a zhihu-style burst 403 is branchable). The facts sheet also carries challenge_events, requests, console_errors and the fired signals. Pure code over signals the engine already holds (current URL, risk-control rows, main document status/size, console errors) — no screenshots, no page evals, single-digit milliseconds. Verdict observes, it never bypasses.

Inputs: session_id (required).

session_viewportAInspect

Set the session's viewport (device emulation): scripts see innerWidth/innerHeight move, media queries like (max-width: 600px) re-evaluate, element rects re-anchor, and mobile=true flips pointer/hover matchMedia answers to coarse/none. Omitted width/height keeps the current value.

Inputs: session_id (required), width, height, mobile.

session_waitA
Read-only
Inspect

Wait until a CSS selector matches or a JS predicate turns truthy, with a timeout. The page's event loop keeps running while waiting (fetches, timers, promise chains progress), so this replaces blind sleeps for async content: navigate, session_wait for '.price-card', then click/read. Returns {matched, elapsed_ms, detail:{tag,text} or the predicate value}; errors with timeout ... naming the selector/predicate on expiry. Exactly one of selector/predicate.

Inputs: session_id (required), selector, predicate, timeout_ms.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 40 tools

    Disambiguation4/5

    Tool families are cleanly separated: stateless fetch/eval/click are explicitly distinguished from their session_* counterparts, and account_*/render_*/session_* names signal intent. The main fuzzy boundaries are session_challenges vs session_verdict (both report anti-bot/risk status) and the three render_* tools, though descriptions usually resolve them.

    Naming Consistency4/5

    Most tools follow predictable families—account_<verb>, session_<operation>, render_<format>—and bare stateless verbs (fetch, search, eval, click) are easy to read. Deviations such as flow_run instead of run_flow and noun-style read tools like session_state/session_network/session_cookies keep it from being perfectly uniform.

    Tool Count2/5

    40 tools is a heavy surface, especially with 26 session_* variants; even though each is a real browser action, the set will tax an agent's selection and context budget. The server's broad scope explains the count, but it still exceeds what most MCP clients handle gracefully.

    Completeness4/5

    The surface covers the full browser workflow: read/search/download, session lifecycle and input, login-state persistence, risk-control verdicts, flow replay, and render/export targets. Minor gaps such as no explicit multi-tab/window management or standalone proxy/user-agent configuration are workaroundable.

    Maintenance

    ActivityActive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      A high-performance browser automation MCP server that provides AI agents with a fast, persistent Chromium instance via Playwright. It features reference-based element interaction, snapshot diffing, and manual handoff capabilities to handle complex tasks like CAPTCHAs.
      61
      22 npm
      32
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Multi-session browser MCP server that gives AI agents up to 15 fully-isolated browsers running in parallel. 36 tools including navigation, extraction, network intercept, stealth, and self-improvement. Each session has its own cookies, storage, and fingerprint so agents never collide.
      37
      151 npm
      5
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Browser automation MCP server that uses a real browser to give agents eyes and hands—open pages, click, fill, screenshot, and run scripts via accessibility-tree snapshots.
      22
      26 npm
      MIT