Skip to main content
AllMCPs
BrowseBestCategoriesStackCompareToolsGuidesBlog Log in Submit MCP

Stay in the loop

Get new MCP servers and top picks in your inbox.

AllMCPs

The open directory for discovering and installing Model Context Protocol servers.

Explore

  • Browse servers
  • Best MCP servers
  • Categories
  • MCP clients
  • Agent prompts
  • Stack Builder
  • Compare servers
  • Tags index
  • Submit a server
  • Pricing

Learn

  • Guides hub
  • What is MCP?
  • Install guide
  • Troubleshooting
  • Security
  • Blog
  • Blog RSS

Tools

  • All tools
  • Config generator
  • Config validator
  • MCP playground
  • OpenAPI β†’ MCP
  • Badge generator

For agents

  • API docs
  • Trust & traffic
  • llms.txt β†— (opens in a new tab)
  • Catalog JSON β†— (opens in a new tab)
  • Remote MCP β†— (opens in a new tab)

Company

  • About
  • Contact
  • X (@AllMCPs) β†— (opens in a new tab)
  • GitHub β†— (opens in a new tab)
  • Terms
  • Privacy
AllMCPs VerifiedAllMCPs VerifiedFeatured on Nick LaunchesFeatured on Nick LaunchesLaunch Llama NewsletterLaunch Llama NewsletterVerified DR - allmcps.comVerified DR - allmcps.comFeatured on SaaSGrowFeatured on SaaSGrowFeatured on Twelve ToolsFeatured on Twelve ToolsFeatured on Saaspa.geFeatured on Saaspa.geFeatured on Findly.toolsFeatured on Findly.toolsFeatured on Startup FameFeatured on Startup FameFeatured on LaunchKiwiFeatured on LaunchKiwiFeatured on ScrollLaunchFeatured on ScrollLaunchFeatured on DailyPingsFeatured on DailyPingsFazier badgeFazier badgeFeatured on NewTool.siteFeatured on NewTool.siteFeatured on saasfame.comFeatured on saasfame.comDR Checker - Domain RatingDR Checker - Domain RatingListed on Turbo0Listed on Turbo0Launched on LaunchBoard - Product Launch PlatformLaunched on LaunchBoard - Product Launch PlatformList on SimilarlabsList on Similarlabshttps://codetrendy.comhttps://codetrendy.comListed on DevTool.ioFeatured on BuildlistFeatured on BuildlistAllMCPs VerifiedAllMCPs VerifiedFeatured on Nick LaunchesFeatured on Nick LaunchesLaunch Llama NewsletterLaunch Llama NewsletterVerified DR - allmcps.comVerified DR - allmcps.comFeatured on SaaSGrowFeatured on SaaSGrowFeatured on Twelve ToolsFeatured on Twelve ToolsFeatured on Saaspa.geFeatured on Saaspa.geFeatured on Findly.toolsFeatured on Findly.toolsFeatured on Startup FameFeatured on Startup FameFeatured on LaunchKiwiFeatured on LaunchKiwiFeatured on ScrollLaunchFeatured on ScrollLaunchFeatured on DailyPingsFeatured on DailyPingsFazier badgeFazier badgeFeatured on NewTool.siteFeatured on NewTool.siteFeatured on saasfame.comFeatured on saasfame.comDR Checker - Domain RatingDR Checker - Domain RatingListed on Turbo0Listed on Turbo0Launched on LaunchBoard - Product Launch PlatformLaunched on LaunchBoard - Product Launch PlatformList on SimilarlabsList on Similarlabshttps://codetrendy.comhttps://codetrendy.comListed on DevTool.ioFeatured on BuildlistFeatured on Buildlist
Β© 2026 Jackalope Digital LLC. All rights reserved.
  1. Home
  2. πŸ—„οΈ Databases
  3. Crawlio Browser
Crawlio Browser logo
Health: ActiveRecent health check succeeded.Last checked 8/10/2026, 11:07:40 PM

Crawlio Browser

Enrichment pendingWe haven’t run our AI enrichment pass on this listing yet, so the overview, use cases, and FAQ below may be sparse or missing. We work through the catalog over time β€” check back soon.
View Repository4 GitHub StarsTotal stargazers on GitHub for the source repository (4 stars).Visit Website

Bridge a live Chrome browser to your agent: 147 CDP tools for capture, extraction, and recording.

Quick Install

Automated & IDE Setup

Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β€” or use 1-click editor setup below.

Add to CursorAdd to VS Code
Not yet automatically verified

We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β€” we're steadily working through the catalog.

Manual Client & Custom JSON ConfigExpand JSON β–Ύ

Install Config Generator

Choose your client
claude_desktop_config.json
{
  "mcpServers": {
    "crawlio-browser": {
      "command": "npx",
      "args": [
        "-y",
        "crawlio-browser"
      ]
    }
  }
}

πŸ’‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

Install Tool Schemas (80) Directory Badge Claim listing AlternativesπŸ—„οΈ More in Databases

Capabilities & Tool Schemas (80) ~1.0k tokensApproximate context cost of this server’s tool schemas (~4 chars/token), before any tool is called. Actual usage depends on your client and model.Self-reported Self-reportedParsed from the repository README, not verified against a live server β€” may be incomplete or out of date.

Inspect callable tools, capabilities, and parameters exposed to AI agents by Crawlio Browser.

connect_tab

Connect to a browser tab by URL, tab ID, or active tab

disconnect_tab

Disconnect from the current tab

list_tabs

List all open tabs with IDs and URLs

get_connection_status

Check CDP connection state

reconnect_tab

Force reconnect to fix stale connections

get_capabilities

Report live browser-bridge availability by tab, CDP domain, and permission state

Documentation Overview

Crawlio Browser

npm version License CI

Documentation | API Reference | Chrome Extension

MCP server that gives AI full control of a live Chrome browser via CDP. 150 tools with framework-aware intelligence, typed evidence infrastructure, tracking pixel analysis, technographic fingerprinting, SEO auditing, and confidence-tracked findings β€” captures what static crawlers can't see.

When to use Crawlio Browser

Use Crawlio Browser when your AI needs to interact with a real browser β€” SPAs, authenticated pages, dynamic content, JS-rendered frameworks. Unlike headless browser tools, Crawlio Browser connects to your actual Chrome via a lightweight extension, giving the AI access to your logged-in sessions, cookies, and full browser state.

Crawlio Browser vs headless browser tools: Headless tools launch a separate browser process. Crawlio Browser connects to your existing Chrome β€” no separate browser, no login flows, full access to your tabs and sessions.

[!WARNING] This is the trade-off, stated plainly: connecting your own Chrome is the feature, and it means an AI agent can act as you on every site you are logged into. It attaches Chrome's debugger to the tab you connect, so it can read cookies, storage, and page content for that session.

Review what you connect it to. Prefer a dedicated Chrome profile for agent work. Nothing is captured until you connect a tab, and you can see the exact tool surface before configuring anything by running npx crawlio-browser tools. Sites can opt out with <meta name="crawlio-agent" content="disable">, which the extension honors.

Quick Start

  1. Install the Chrome Extension
  2. Run the init wizard:
    Terminal
    npx crawlio-browser init
    

That's it. Auto-detects and configures 14 MCP clients: Claude Code, Cursor, VS Code, Codex, Gemini CLI, Claude Desktop, ChatGPT Desktop, Windsurf, Cline, Zed, Goose, OpenCode, MCPorter, and Cline CLI.

Init wizard options

Terminal
npx crawlio-browser init              # Default: code mode, stdio transport
npx crawlio-browser init --full       # Full mode (every tool exposed individually)
npx crawlio-browser init --portal     # Portal mode (persistent HTTP server)
npx crawlio-browser init --cloudflare # Add Cloudflare MCP (89 tools, no wrangler)
npx crawlio-browser init --dry-run    # Show what would happen
npx crawlio-browser init --yes        # Skip prompts (CI / scripted installs)
npx crawlio-browser init -a claude    # Target specific MCP client

As an Agent Plugin

The package is also an Agent Plugins v1 plugin, so a conformant client can load it directly instead of running the wizard β€” plugin.json at the root, the eleven skills under skills/, and the MCP server declared in mcp.json.

The product-facing crawlio-* workflows are folded into the eleven shipped skills. The similarly named definitions in agents/ remain repo-local development fixtures: they import src/evidence/* and loops/*, neither of which is part of the npm runtime. They are excluded from package.json instead of advertising a second, non-executable product surface.

Point the client at the installed package:

Code
node_modules/crawlio-browser        # after `npm install crawlio-browser`

mcp.json resolves the server through ${PLUGIN_ROOT}/dist/mcp-server/index.js, which is why the plugin has to be an installed package rather than an unpacked tarball β€” the server imports its dependencies at runtime, so a bare extract starts and then dies without answering.

Inspecting what it exposes

Terminal
npx crawlio-browser tools          # What code mode exposes (the default)
npx crawlio-browser tools --full   # Every tool, individually
npx crawlio-browser tools --json   # Machine-readable, for diffing across versions
npx crawlio-browser doctor         # Bridge, portal, native host, client configs
npx crawlio-browser --help         # All commands and options
npx crawlio-browser --version      # Version only

Both are read-only and run without a browser, an extension, or a network connection β€” you can see the whole surface before you configure any client. The numbers come from the same builders the server registers, so they cannot disagree with what your client receives.

Transport Modes

ModeCommand / URLProtocolBest For
stdionpx crawlio-browserJSON-RPC over stdin/stdoutClaude Desktop, Cursor, Windsurf β€” client manages process lifecycle
Portal (HTTP)POST http://127.0.0.1:3001/mcpMCP Streamable HTTPClaude Code, ChatGPT Desktop β€” server survives session restarts
Portal (SSE)GET /sse + POST /messageServer-Sent EventsLegacy clients needing SSE transport

Portal mode is recommended for Claude Code β€” the server persists across context compaction and session restarts. On macOS, --portal installs a launchd agent for auto-start on login.

Manual setup (any client)

Per-client manual config

Claude Desktop β€” add to claude_desktop_config.json:

config.json
{ "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }

Claude Code (Portal Mode) β€” start npx crawlio-browser --portal, then add to .mcp.json:

config.json
{ "mcpServers": { "crawlio-browser": { "type": "http", "url": "http://127.0.0.1:3001/mcp" } } }

Claude Code (stdio):

Terminal
claude mcp add crawlio-browser -- npx -y crawlio-browser

Cursor β€” add to .cursor/mcp.json:

config.json
{ "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }

Windsurf β€” add to Windsurf Settings > MCP:

config.json
{ "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }

Cline (VS Code) β€” add to settings.json:

config.json
{ "cline.mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }

ChatGPT Desktop β€” Settings > Integrations > MCP: URL: http://127.0.0.1:3001/mcp | Type: Streamable HTTP

How It Works

Code
AI Client (stdio/http)  -->  MCP Server (Node.js)  -->  Chrome Extension (MV3)
                             crawlio-browser               WebSocket -> CDP

The MCP server communicates with the Chrome extension via WebSocket. The extension controls the browser through Chrome DevTools Protocol (CDP).

Capabilities

Framework-Aware Intelligence

Every execute call probes the browser for framework signatures and injects a shape-shifting smart object with framework-native accessors. React state, Vue reactivity, Next.js routing, Shopify cart data β€” 17 framework namespaces across 4 tiers, detected at runtime and rebuilt on every navigation. The AI doesn't query a generic DOM; it queries the framework's own data structures.

Evidence-Based Analysis

Method Mode adds higher-order methods and a typed evidence system on top of Code Mode. smart.extractPage() runs 7 parallel operations in a single call β€” page capture, performance metrics, security state, font detection, meta extraction, accessibility audit, and mobile-readiness check. Failed operations produce typed CoverageGap records instead of silent nulls. Findings created with smart.finding() get their confidence automatically adjusted when supporting data is missing. The result: structured, auditable research output with gap tracking and confidence propagation.

Session Recording & Replay

Record browser interactions as structured data, then compile them into reusable SKILL.md automations. 12 interaction tools are automatically intercepted during recording β€” clicks, typing, navigation, scrolling β€” each capturing args, result, timing, and page URL. One compileRecording() call converts the session into a deterministic automation script.

Robot Training

Capture human-guided browser demonstrations as replayable robot-training bundles. The default-mode observe lifecycle starts an event-driven recorder inside the extension; collection keeps running if the MCP process disconnects or restarts. On reconnection, training_stop exports the retained run and materializes the complete 13-file RecordingBundle for replay and API synthesis. Full mode keeps the existing robot_training_* names as compatibility aliases.

Page monitoring is resident for the same reason: an extension-owned background tab and Chrome alarm collect bounded ARIA snapshots while no MCP server is present. Training and monitor history share a 25 MiB local budget, with 20 completed training runs, 50 monitor jobs, 200 snapshots total, and 50 snapshots per monitor as count caps. Old completed data is evicted first; active work is never silently evicted. Work starts only through explicit MCP lifecycle actions; the same actions report status, stop collection, clear monitor snapshots, andβ€”with an exact id plus explicit confirmationβ€”delete a stopped training/recording record from Chrome while preserving its materialized files. The extension popup remains a connection and browser-access status surface. Storage values are keys-only unless the caller explicitly opts in. Monitor snapshots intentionally retain compact ARIA page text locally; starting a monitor should therefore be treated as consent to retain the visible content of that URL until it is cleared.

Auto-Settling & Actionability

Every mutative action (click, type, navigate, select_option) runs actionability checks before acting β€” polling visibility, dimensions, enabled state, and overlay detection. After the action, a progressive backoff settle delay ([0, 20, 100, 100, 500]ms) waits for DOM mutations to quiesce. The AI doesn't need manual sleep() calls between actions.

Several Tabs at Once

Any command that acts on a page takes an optional tabId from list_tabs. Omit it and the command runs on the connected tab, exactly as before; supply one and it runs on that tab instead, with the whole command surface available on each. Commands overlap, so two tabs can be driven at the same time:

server.ts
const [checkout, search] = await Promise.all([
  bridge.send({ type: "browser_snapshot", tabId: 42 }),
  bridge.send({ type: "browser_snapshot", tabId: 57 }),
]);

Targeting a tab never changes which tab connect_tab points at, so an agent working several tabs cannot reassign the one a human is watching. Frame selection, coverage sessions, and framework detection are per tab. Network capture is the exception β€” it records one tab at a time and says which tab holds it rather than interleaving two.

Chrome Profiles

An extension instance is confined to its own Chrome profile and cannot see any other, so with Crawlio enabled in more than one, commands land in whichever profile connected first. list_profiles shows the profiles that have connected and which is being driven; switch_profile moves the connection to another. One profile is driven at a time β€” the released extension reconnects in the background, so switching back is immediate.

Profiles identify themselves with a UUID minted into their own extension storage. It distinguishes a profile without describing it: no account, no email, no path, and no additional permission.

Selecting a profile keeps cooperating extensions out of each other's way β€” it is not a security boundary, since the id is asserted by the extension rather than proved. The bridge's existing protections are unchanged: one extension at a time, and each must prove the server holds the real bridge token before anything executes.

Architecture

A layered execution architecture where each layer absorbs a category of complexity that would otherwise fall on the model. The model sees four primary tools and a clean SDK. Everything beneath that surface is the runtime absorbing reality.

The layer worth understanding is the one that assembles itself. Detection runs against the live page on first use, and the smart object is built to match what that page turned out to be β€” smart.react.* exists only where React does. Nothing about the target is known at startup, so the surface is composed per tab rather than declared up front.

Code
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚        AI Model (LLM)             β”‚
                     β”‚  Writes code, reads errors, loops  β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚  search, execute, observe, connect_tab (+ 3 job tools)
                                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Crawlio Browser runtime                      β”‚
β”‚                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  METHOD MODE                                               β”‚  β”‚
β”‚  β”‚  Behavioral protocol + higher-order methods                β”‚  β”‚
β”‚  β”‚  scrollCapture Β· waitForIdle Β· extractPage Β· comparePages  β”‚  β”‚
β”‚  β”‚  detectTables Β· extractTable Β· waitForNetworkIdle Β·        β”‚  β”‚
β”‚  β”‚  extractData                                               β”‚  β”‚
β”‚  β”‚                                                            β”‚  β”‚
β”‚  β”‚  ↳ Absorbs: behavioral variance, ad-hoc composition,      β”‚  β”‚
β”‚  β”‚    inconsistent output shapes, data extraction patterns    β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  POLYMORPHIC CONTEXT                                       β”‚  β”‚
β”‚  β”‚  17 framework namespaces, injected Just-In-Time            β”‚  β”‚
β”‚  β”‚  react Β· vue Β· angular Β· nextjs Β· shopify Β· ...            β”‚  β”‚
β”‚  β”‚                                                            β”‚  β”‚
β”‚  β”‚  ↳ Absorbs: framework opacity, minified code,             β”‚  β”‚
β”‚  β”‚    devtools hook complexity                                β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  ACTIONABILITY ENGINE                                      β”‚  β”‚
β”‚  β”‚  7 core smart methods with built-in resilience             β”‚  β”‚
β”‚  β”‚  click Β· type Β· navigate Β· waitFor Β· evaluate Β·            β”‚  β”‚
β”‚  β”‚  snapshot Β· rebuild                                        β”‚  β”‚
β”‚  β”‚                                                            β”‚  β”‚
β”‚  β”‚  ↳ Absorbs: DOM timing, hydration delays, CSS animations, β”‚  β”‚
β”‚  β”‚    disabled states, overlapping elements                   β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  TETHERED IPC BRIDGE                                       β”‚  β”‚
β”‚  β”‚  WebSocket ↔ Chrome extension, message queue,              β”‚  β”‚
β”‚  β”‚  heartbeat, auto-reconnect, stale detection                β”‚  β”‚
β”‚  β”‚                                                            β”‚  β”‚
β”‚  β”‚  ↳ Absorbs: connection drops, tab refreshes,              β”‚  β”‚
β”‚  β”‚    port conflicts, extension lifecycle                     β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  COMMAND CHANNEL                                           β”‚  β”‚
β”‚  β”‚  bridge.send β†’ CDP browser control via the extension       β”‚  β”‚
β”‚  β”‚  crawlio.*   β†’ Crawlio HTTP endpoints                      β”‚  β”‚
β”‚  β”‚  Live searchable catalog: browser + Crawlio HTTP           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
                                     β–Ό
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚         Live Chrome Browser        β”‚
                     β”‚   Persistent session, real DOM,    β”‚
                     β”‚   framework runtime, user state    β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

What Each Layer Absorbs

LayerWithout ItWith It
Tethered IPC BridgeScript crashes on tab refresh, pending commands lost on reconnect, port conflicts on startupResilient WebSocket with message queue (100-msg capacity), heartbeat stale detection (15s intervals), auto-reconnect with drain
Actionability Engineclick('#btn') fires before the button renders, during CSS transitions, or while an overlay covers itProgressive polling (exists β†’ has dimensions β†’ visible β†’ not disabled β†’ not obscured) with [0, 20, 100, 100, 500]ms backoff
Polymorphic ContextModel sees minified <div> elements; reading React state requires knowing exact hook paths, renderer maps, and fiber root APIRuntime probes live JS environment, recognizes 64 frameworks and attaches up to 17 matching namespaces (smart.react.getVersion(), smart.nextjs.getData())
Method ModeModel composes primitives ad-hoc β€” inconsistent scroll loops, missed edge cases, varying return shapes18 tested methods encode correct patterns; behavioral protocol constrains workflow

Execution Lifecycle

  1. Discovery β€” Model calls search("page capture performance") and gets documentation for relevant commands
  2. Framework Detection β€” Runtime probes the live DOM, detects active frameworks, constructs polymorphic smart object with appropriate namespaces
  3. Scope Assembly β€” Model's code is compiled into an async function with injected parameters: bridge (the browser command channel), crawlio (HTTP client), sleep, TIMEOUTS, smart (7 core + 18 higher-order methods + up to 17 framework namespaces), compileRecording
  4. Execution β€” Method Mode methods compose the lower layers: extractPage() fires 7 parallel bridge.send() calls; click() runs the actionability engine; react.getVersion() evaluates framework-specific expressions
  5. Error Recovery (Agentic REPL) β€” On failure, the browser stays in the exact state that produced the error. The model reads the structured error, adjusts, and calls execute again. Framework cache persists β€” no re-detection unless URL changed

Design Principles

  1. Absorb complexity downward β€” Every category of difficulty (connection management, DOM timing, framework detection, multi-step composition) is handled by the layer best equipped for it. The model only encounters the clean interface at the top.
  2. Shape the SDK to the target β€” The polymorphic context system detects what the page is and reshapes available methods to match. The model writes against a stable interface; the runtime adapts underneath.
  3. Preserve state across cycles β€” The tethered architecture means the model can fail, learn, and retry against the same live environment β€” transforming error handling from "restart from scratch" into "adjust and continue."

How It Compares

Code Mode is Cloudflare's idea and a good one: present tools as a typed API and let the model write code against it, because models have seen far more code than tool calls. Crawlio Browser applies that pattern to a target it was not built for β€” a live browser holding your session. This is an MCP server, not an alternative to MCP.

DimensionStandard MCPCloudflare Code ModeCrawlio Browser
Tools in context50-100+ schemas2 (search, execute)7 (4 primary + 3 async job tools)
Execution environmentN/A (tool calls)V8 isolate (stateless)Local async sandbox, tethered to a live browser
DOM accessVia individual tool callsNoneLive, persistent, framework-aware
Framework awarenessNoneNoneup to 17 namespaces, attached per page
Action resilienceModel must handle timingN/A (no DOM)Built-in actionability polling + settle delays
Error recoveryRe-call individual toolRe-create isolateRe-run against the state that produced the error
Multi-step patternsModel improvisesModel writes loops18 tested higher-order methods + behavioral protocol

The row that matters is error recovery. An isolate is disposable by design β€” that is what makes it safe to run untrusted code, and it means a failure discards the state that caused it. Here execution is tethered to a real tab, so when code fails the browser is still sitting in exactly the situation that broke it: same scroll position, same modal, same half-filled form. The model reads the error and runs again against that. Neither approach is better in general; they are answers to different problems, and the sandboxing guarantees Cloudflare gets from V8 isolates are genuinely stronger than what a local async sandbox provides.

Read the full architecture guide β†’

Two Modes

Code Mode (4 primary tools) β€” default

Collapses 150 tools into four high-level tools, plus get_job_result, list_jobs, and cancel_job for async execution β€” so tools/list reports

7.

That makes the tools/list payload 85% smaller, measured by serializing the result each mode actually returns rather than estimated from a tool count. Code mode is not free: execute and search carry long descriptions, so the measured reduction is smaller than a naive tools-only ratio suggests. Check it yourself β€” npx crawlio-browser tools --json prints both surfaces without connecting to anything.

ToolDescription
searchDiscover available commands by keyword
executeRun async JS with bridge, crawlio, smart, sleep, and compileRecording in scope
observeStart/query/stop extension-resident training, recording, and page monitors
connect_tabConnect to a browser tab
server.ts
// Navigate and screenshot
await bridge.send({ type: 'browser_navigate', url: 'https://example.com' }, 30000);
await sleep(2000);
const screenshot = await bridge.send({ type: 'take_screenshot' }, 10000);
return screenshot;

Full Mode (150 tools)

Every tool exposed directly to the LLM. Enable with --full:

Terminal
npx crawlio-browser init --full

Smart Object

In Code Mode, the smart object provides framework-aware helpers with auto-waiting and actionability checks.

Core Methods

MethodDescription
smart.evaluate(expression)Execute JS in the page via CDP
smart.click(selector, opts?)Auto-waiting click with 500ms settle
smart.type(selector, text, opts?)Auto-waiting type with 300ms settle
smart.navigate(url, opts?)Navigate with 1000ms settle
smart.waitFor(selector, timeout?)Poll until element is actionable
smart.snapshot()Accessibility tree snapshot
smart.rebuild()Re-detect frameworks and reattach namespaces for the current page

Higher-Order Methods

MethodDescription
smart.scrollCapture(opts?)Scroll to bottom, capturing screenshots at each position. Handles stuck-scroll detection, bottom detection, section capping, and scroll reset.
smart.waitForIdle(timeout?)MutationObserver-based idle detection β€” waits for 500ms quiet window. Timeout hard-capped at 15s. Replaces blind sleep() calls.
smart.extractPage(opts?)7 parallel operations in one call β€” page capture, performance, security, fonts, meta, accessibility, mobile-readiness. Returns typed PageEvidence with CoverageGap[] for anything that failed.
smart.comparePages(urlA, urlB)Navigates to both URLs, runs extractPage() on each, returns a ComparisonScaffold with 11 dimensions, shared/missing fields, and comparable metrics.

Typed Evidence

Methods for structured analysis findings with confidence propagation:

MethodDescription
smart.finding(data)Create a validated Finding with claim, evidence, sourceUrl, confidence, and method. Rejects malformed input with specific errors.
smart.findings()Get all session-accumulated findings (returns a copy)
smart.clearFindings()Reset session findings and coverage gaps

When a finding's dimension matches an active coverage gap, confidence is automatically capped:

Input ConfidenceActive GapOutput
highreducesConfidence: truemedium + confidenceCapped: true
mediumreducesConfidence: truelow + confidenceCapped: true
lowanylow (floor)
anyno matching gapunchanged

Framework Namespaces

When a framework is detected, the smart object exposes framework-specific helpers:

React β€” smart.react
MethodReturns
getVersion()Version string and bundle type
getRootCount()Number of React root components
hasProfiler()Whether profiler is available
isHookInstalled()Whether DevTools hook is installed
Vue.js β€” smart.vue
MethodReturns
getVersion()Vue version string
getAppCount()Number of Vue app instances
getConfig()App config object
isDevMode()Whether DevTools is enabled
Angular β€” smart.angular
MethodReturns
getVersion()ng-version attribute value
isDebugMode()Whether debug APIs available
isIvy()Whether Ivy compiler is active
getRootCount()Number of Angular root elements
getState()Full state object
Svelte β€” smart.svelte
MethodReturns
getVersion()Svelte version string
getMeta()Svelte metadata object
isDetected()Whether Svelte is detected
Redux β€” smart.redux
MethodReturns
isInstalled()Whether Redux DevTools is installed
getStoreState()Full store state
Alpine.js β€” smart.alpine
MethodReturns
getVersion()Alpine version string
getStoreKeys()Store object keys
getComponentCount()Count of [x-data] components
Next.js β€” smart.nextjs
MethodReturns
getData()__NEXT_DATA__ object
getRouter()Router state (pathname, query, asPath)
getSSRMode()SSR mode (hybrid, app-router, static)
getRouteManifest()Current page data
Nuxt β€” smart.nuxt
MethodReturns
getData()__NUXT__ object
getConfig()App config
isSSR()Whether server-rendered
Remix β€” smart.remix
MethodReturns
getContext()__remixContext object
getRouteData()Loader data from state
Shopify β€” smart.shopify
MethodReturns
getShop()Shop metadata (theme, locale, currency)
getCart()Shopping cart object
WordPress β€” smart.wordpress
MethodReturns
isWP()Whether WordPress is present
getRestUrl()REST API endpoint
getPlugins()List of active plugins
More frameworks β€” Gatsby, WooCommerce, Laravel, Django, Drupal, jQuery
NamespaceMethods
smart.gatsbygetData(), getPageData()
smart.woocommercegetParams()
smart.laravelgetCSRF()
smart.djangogetCSRF()
smart.drupalgetSettings()
smart.jquerygetVersion()

Method Mode

Code Mode asks the model to write code. Method Mode gives that code a tested vocabulary:

18 higher-order methods that encode the multi-step patterns a model

would otherwise improvise.

javascript
await smart.extractTable(selector)   // not a hand-rolled scrape loop
await smart.scrollCapture()          // not a guessed scroll cadence

It is a domain layer over Code Mode, not a replacement: the tool surface does not change, the model still sees the same four primary tools, and the same 182-command catalog sits underneath. What changes is what happens inside execute.

The surface is assembled per page. Detection recognizes 64 frameworks and attaches up to 17 matching namespaces, so smart.react.* exists only where React does β€” the model never has to ask what the page is built with, or guess at hook paths and fiber internals to find out.

And because execution is tethered to a live tab rather than a disposable isolate, a failure leaves the browser in the exact state that produced it. The model reads the structured error and runs again against that state, rather than rebuilding the situation from scratch.

The Maturity Ladder

LayerOptimizes ForBehavioral VarianceEvidence Quality
Raw MCP (150 tools)CompletenessHigh β€” flat tool list, no composition guidanceNone β€” unstructured text
Code Mode (7 tools)Token efficiencyMedium β€” right primitives, ad-hoc compositionNone β€” model-defined shapes
Method Mode (+ 18 methods + protocol)ConsistencyLow β€” proper methods, protocol constraintsConvention β€” { finding, evidence, url }
+ typed evidence (gaps + confidence)CorrectnessMinimal β€” typed schemas, tool-enforced findingsStructural β€” typed records, gap tracking, confidence propagation

Architecture

Code
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      execute sandbox                       β”‚
β”‚                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Behavioral Protocol  (web-research skill)           β”‚  β”‚
β”‚  β”‚  Acquire β†’ Normalize β†’ Analyze                       β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Evidence Infrastructure                             β”‚  β”‚
β”‚  β”‚  finding() Β· findings() Β· clearFindings()            β”‚  β”‚
β”‚  β”‚  Typed records Β· Coverage gaps Β· Confidence prop.    β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Higher-Order Methods  [18]                          β”‚  β”‚
β”‚  β”‚  scrollCapture Β· waitForIdle Β· extractPage Β·         β”‚  β”‚
β”‚  β”‚  comparePages Β· detectTables Β· extractTable Β·        β”‚  β”‚
β”‚  β”‚  waitForNetworkIdle Β· extractData Β· detectSections Β· β”‚  β”‚
β”‚  β”‚  detectTechnologies Β· parseTrackingPixels Β· ...      β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Smart Core  [7 methods]                             β”‚  β”‚
β”‚  β”‚  evaluate Β· click Β· type Β· navigate Β· waitFor Β·      β”‚  β”‚
β”‚  β”‚  snapshot Β· rebuild                                  β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  Framework Namespaces  [up to 17, attached per page] β”‚  β”‚
β”‚  β”‚  react Β· vue Β· angular Β· nextjs Β· shopify Β· ...      β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚  bridge.send()  β€” the browser command channel        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Each layer up encodes more domain knowledge. bridge.send({ type: "capture_page" }) captures a page. smart.extractPage() captures a page AND runs performance metrics, security state, font detection, accessibility analysis, and mobile-readiness checks in parallel β€” seven operations, one call, graceful failure on supplementary data, typed gaps for anything that fails.

Evidence Infrastructure

Coverage Gaps β€” When supplementary operations in extractPage() fail, they don't silently return null. A typed gap is recorded with the dimension, reason, impact, and whether it reduces confidence on related findings:

javascript
// Example gap from a failed performance metrics call
{ dimension: "performance", reason: "CDP domain disabled", impact: "method-failed", reducesConfidence: true }

Tool-Enforced Findings β€” smart.finding() validates every field at the tool level. The model cannot produce a finding without meeting the schema β€” it either returns a valid Finding or gets a clear error. Findings accumulate across execute calls within a session via smart.findings().

Session Aggregation β€” Findings and coverage gaps persist across execute calls. A model can make findings across multiple calls, then retrieve the full set with smart.findings(). Reset with smart.clearFindings().

End-to-End Example: Competitive Audit

server.ts
// 1. Extract and compare both sites (scaffold + gaps included)
const comparison = await smart.comparePages(
  'https://acme.com',
  'https://rival.com'
);

// 2. Make findings β€” confidence auto-adjusts based on data availability
smart.finding({
  claim: 'Rival loads 2.3x faster on Largest Contentful Paint',
  evidence: [
    `Acme LCP: ${comparison.siteA.performance?.webVitals?.lcp}ms`,
    `Rival LCP: ${comparison.siteB.performance?.webVitals?.lcp}ms`,
  ],
  sourceUrl: 'https://acme.com',
  confidence: 'high',
  method: 'comparePages + extractPage performance metrics',
  dimension: 'performance',  // if perf data failed, confidence caps to "medium"
});

smart.finding({
  claim: 'Acme has 12 images without alt text; Rival has 0',
  evidence: [
    `Acme imagesWithoutAlt: ${comparison.siteA.accessibility?.imagesWithoutAlt}`,
    `Rival imagesWithoutAlt: ${comparison.siteB.accessibility?.imagesWithoutAlt}`,
  ],
  sourceUrl: 'https://acme.com',
  confidence: 'high',
  method: 'comparePages + extractPage accessibility summary',
  dimension: 'accessibility',
});

// 3. Capture visual evidence
await smart.navigate('https://acme.com');
await smart.waitForIdle();
const acmeVisuals = await smart.scrollCapture({ maxSections: 5 });

// 4. Return accumulated session findings + visual evidence
return {
  findings: smart.findings(),
  scaffold: comparison.scaffold,
  gaps: { acme: comparison.siteA.gaps, rival: comparison.siteB.gaps },
  visualEvidence: { acme: acmeVisuals.sectionCount + ' sections captured' },
};

Examples

Navigate, extract, and analyze

server.ts
// Connect to active tab, extract structured page evidence
const page = await smart.extractPage();
const finding = smart.finding({
  claim: `Site uses ${page.capture.framework?.name || 'no detected framework'}`,
  evidence: [`Framework: ${JSON.stringify(page.capture.framework)}`],
  sourceUrl: page.meta?.canonical || 'active tab',
  confidence: 'high',
  method: 'extractPage framework detection',
});
return { page: page.meta, finding };

Mobile emulation + screenshot

server.ts
// Emulate iPhone and capture
await bridge.send({ type: 'emulate_device', device: 'iPhone 14' }, 10000);
await smart.navigate('https://example.com');
await smart.waitForIdle();
const screenshot = await bridge.send({ type: 'take_screenshot' }, 10000);
return screenshot;

Record and compile automation

server.ts
// Record a browser session, then compile to reusable skill
await bridge.send({ type: 'start_recording' }, 10000);
await smart.navigate('https://example.com');
await smart.click('button.submit');
await smart.type('#email', 'test@example.com');
const session = await bridge.send({ type: 'stop_recording' }, 10000);
return compileRecording(session.session, 'signup-flow');

Intercept and mock network

javascript
// Block analytics, mock API response
await bridge.send({
  type: 'browser_intercept',
  pattern: '*analytics*',
  action: 'block'
}, 10000);
await bridge.send({
  type: 'browser_intercept',
  pattern: '*/api/user',
  action: 'mock',
  body: JSON.stringify({ name: 'Test User' }),
  statusCode: 200
}, 10000);
await smart.navigate('https://example.com');
return await smart.snapshot();

Session Recording

Record browser sessions as structured data, then compile them into reusable automation skills. 12 interaction tools are automatically intercepted during recording (click, type, navigate, scroll, etc.), capturing args, result, timing, and page URL.

server.ts
// In code mode: record, interact, compile
await bridge.send({ type: 'start_recording' }, 10000);
// ... interact with the page ...
const session = await bridge.send({ type: 'stop_recording' }, 10000);
const skill = compileRecording(session.session, 'my-automation');
return skill;

In full mode, recording is available as 4 individual tools: start_recording, stop_recording, get_recording_status, and compile_recording.

Auto-Settling

Mutative tools (browser_click, browser_type, browser_navigate, browser_select_option) use actionability checks:

  1. Pre-flight: Polls element visibility, stability, and enabled state before acting
  2. Action: Dispatches the CDP command
  3. Post-settle: Waits for DOM mutations to quiesce with progressive backoff [0, 20, 100, 100, 500]ms

This means the AI doesn't need to manually add sleep() or waitFor() calls between actions β€” the tools handle SPA rendering delays automatically.

Framework Detection

Detects 64 technologies across 4 tiers using globals, DOM markers, meta tags, HTTP headers, and script URLs:

TierFrameworksSignal Strength
Meta-frameworksNext.js, Nuxt, SvelteKit, Remix, GatsbyUnique globals + parent detection
CoreReact, Vue.js, Angular, Svelte, Astro, Qwik, SolidJS, Lit, PreactGlobals + DOM markers
CMS & PlatformsWordPress, Shopify, Webflow, Squarespace, Wix, Drupal, Magento, Ghost, BubbleMeta tags + globals
Libraries & ToolsjQuery, Bootstrap, Tailwind CSS, Alpine.js, HTMX, Turbo, Stencil, Redux, Ember.js, Backbone.jsDOM + globals

Multi-framework detection returns a primary framework (meta-framework takes priority) plus a subFrameworks array for the full stack.

Tools Reference

The table below is a hand-written guide to the commonly used tools, not the complete set. For the full, current surface β€” all 150 of them, read from the server itself β€” run npx crawlio-browser tools --full.

Tool reference β€” Connection, Capture, Navigation, Network, Storage, Emulation, Tracking, SEO, and more

Connection & Status

ToolDescription
connect_tabConnect to a browser tab by URL, tab ID, or active tab
disconnect_tabDisconnect from the current tab
list_tabsList all open tabs with IDs and URLs
get_connection_statusCheck CDP connection state
reconnect_tabForce reconnect to fix stale connections
get_capabilitiesReport live browser-bridge availability by tab, CDP domain, and permission state

Page Capture

ToolDescription
capture_pageFull capture: framework + network + console + DOM
detect_frameworkDetect JS framework and version
start_network_captureStart recording network requests
stop_network_captureStop recording and return captured requests
get_console_logsGet console logs (errors, warnings, info)
get_cookiesGet cookies (sensitive values redacted)
get_dom_snapshotSimplified DOM tree with shadow DOM and iframe support
take_screenshotViewport/full-page/element image (JPEG default, PNG on request)
get_response_bodyGet response body for a captured network request

Navigation & Interaction

ToolDescription
browser_navigateNavigate to a URL (auto-settle)
browser_clickClick element by CSS selector (auto-settle, left/right/middle, modifiers)
browser_double_clickDouble-click element
browser_typeType text into element (auto-settle)
browser_press_keyPress keyboard key (Enter, Tab, Escape, shortcuts)
browser_hoverHover over element
browser_select_optionSelect <option> by value (auto-settle)
browser_scrollScroll page or element
browser_dragDrag from one element to another
browser_file_uploadUpload files to <input type="file">
browser_waitWait N milliseconds
browser_wait_forWait for element state (visible, hidden, attached, detached)

Network

ToolDescription
browser_interceptBlock, modify headers, or mock responses for URL patterns
emulate_networkThrottle network (offline, 3G, 4G, WiFi presets)
set_cache_disabledDisable/enable browser cache
set_extra_headersAdd custom headers to all requests
get_websocket_connectionsList active WebSocket connections
get_websocket_messagesGet WebSocket message history

Frames & Tabs

ToolDescription
get_frame_treeGet frame hierarchy (main + iframes)
switch_to_frameSwitch execution context to iframe
switch_to_main_frameSwitch back to main frame
create_tabCreate new tab with URL
close_tabClose tab by ID
switch_tabFocus a tab by ID

Cookies & Storage

ToolDescription
set_cookieSet cookie (supports httpOnly via CDP)
delete_cookiesDelete cookies by name/domain/path
get_storageRead localStorage or sessionStorage
set_storageWrite storage item
clear_storageClear all storage items
get_databasesList IndexedDB databases
query_object_storeQuery IndexedDB object store
clear_databaseClear or delete IndexedDB database

Dialogs

ToolDescription
get_dialogGet pending JS dialog (alert/confirm/prompt)
handle_dialogAccept or dismiss dialog

Emulation

ToolDescription
set_viewportSet viewport dimensions
set_user_agentOverride User-Agent string
emulate_deviceEmulate device (iPhone, iPad, Pixel, Galaxy, Desktop)
set_geolocationOverride geolocation coordinates
set_stealth_modeAnti-detection mode (opt-in, patches webdriver fingerprint)

Security

ToolDescription
get_security_stateTLS certificate details, protocol, cipher
ignore_certificate_errorsIgnore cert errors for staging environments

Service Workers

ToolDescription
list_service_workersList all service worker registrations
stop_service_workerStop/unregister a service worker
bypass_service_workerBypass service workers for network requests

DOM Manipulation

ToolDescription
set_outer_htmlReplace element's HTML
set_attributeSet element attribute
remove_attributeRemove element attribute
remove_nodeRemove element from DOM

CSS & JS Coverage

ToolDescription
start_css_coverage / stop_css_coverageTrack which CSS rules are used
start_js_coverage / stop_js_coverageTrack which JS code is executed
get_computed_styleGet resolved CSS properties for element
force_pseudo_stateForce :hover, :focus, :active states

Performance & Memory

ToolDescription
get_performance_metricsChrome metrics + Web Vitals (LCP, CLS, FID)
get_dom_countersCount DOM nodes, documents, event listeners
force_gcForce garbage collection
take_heap_snapshotV8 heap snapshot summary

PDF & Accessibility

ToolDescription
print_to_pdfGenerate PDF (custom paper, margins, orientation)
get_accessibility_treeAccessibility tree for screen-reader audit

Targets & Contexts

ToolDescription
get_targetsList all Chrome targets (pages, workers, extensions)
attach_to_targetAttach CDP session to any target
create_browser_contextCreate isolated (incognito-like) context

Visual Debug

ToolDescription
highlight_elementHighlight element with colored overlay
show_layout_shiftsVisualize CLS regions
show_paint_rectsVisualize paint/repaint areas

Session Recording

ToolDescription
start_recordingBegin recording browser session
stop_recordingStop recording and return session data
get_recording_statusCheck recording state
compile_recordingCompile session into SKILL.md automation

Robot Training

ToolDescription
robot_training_startStart a fresh monitored demonstration run
robot_training_statusQuery extension-retained runs and recording state
robot_training_stopStop/export a resident run and persist all bundle artifacts
robot_training_clearConfirm deletion of one stopped extension-retained run; preserve artifact files
robot_training_artifactsList files in a robot-training artifact directory
monitor_pageStart/query/stop extension-resident recurring page monitors

Crawlio App Integration

Optional β€” requires Crawlio.app running locally.

ControlServer authentication is automatic and local-only: the MCP reads CRAWLIO_MCP_TOKEN when explicitly set, otherwise Crawlio.app's mode-0600 ~/Library/Logs/Crawlio/mcp.token, and sends it only to the discovered 127.0.0.1 ControlServer. The value is never returned in MCP results or written to logs.

ToolDescription
extract_siteStart a Crawlio crawl of the active tab's URL
get_crawl_statusGet crawl progress and status
get_enrichmentGet browser enrichment data
get_crawled_urlsGet crawled URLs with status and pagination
enrich_urlNavigate + capture + submit enrichment in one call

Requirements

  • Node.js >= 18
  • Chrome (or Chromium) with the Crawlio for Chrome extension installed
  • Crawlio.app (optional) β€” for site crawling and enrichment

Permission floor

The production extension has no standing host access. Its required permissions are debugger (the CDP control plane), storage (bridge/session settings and durable resident metadata), and alarms (reconnect, idle-release, and resident monitor wakeups). The dedicated onboarding page asks once for every optional capability declared by the active build. In production that is tabs, nativeMessaging, and http://127.0.0.1/*, covering tab discovery/adoption, authenticated local token provisioning, and loopback bridge discovery.

Onboarding is the only surface that can open Chrome's permission prompt. The extension popup and MCP tools only report missing access and route the user back to onboarding. connect_tab({url}), agent-owned tabs, robot training, and resident monitoring can still create and control their own tabs if the tabs metadata grant is denied. Crawlio does not request <all_urls>, activeTab, tabGroups, or unlimitedStorage.

Build from Source

bash
git clone https://github.com/Crawlio-app/crawlio-browser.git
cd crawlio-browser
npm install
npm run build          # selectors β†’ semantic-grounding β†’ MCP server β†’ extension

Build output lands in dist/mcp-server/ (ESM bundle) and dist/extension/ (the unpacked MV3 extension).

To develop against the extension, build the dev variant and load it unpacked:

Terminal
npm run build:dev      # β†’ dist/extension-dev, with __DEV__ logging enabled

Then open chrome://extensions, enable Developer mode, choose Load unpacked, and select dist/extension-dev. Reload the extension there after each rebuild.

Terminal
npm test               # vitest
npm run typecheck      # server + extension TypeScript projects

Resources

  • Documentation
  • API Reference
  • Product Page
  • Chrome Extension
  • npm Package
  • Source
  • Changelog | Releases

Contributing

Contributions are welcome β€” see CONTRIBUTING.md for the build and development loop, and CODE_OF_CONDUCT.md for community expectations. Please report security vulnerabilities privately via SECURITY.md rather than in a public issue.

License

Apache-2.0 β€” see LICENSE.

The selector kernel in packages/selectors is MIT-licensed: it contains code ported from Selector Forge (MIT) and Chromium DevTools (BSD-3-Clause). See packages/selectors/LICENSE and THIRD_PARTY_NOTICES.md for full attributions.

Related MCP Servers

View all in Databases View all alternatives
  • AllMCPs Server logoAllMCPs Server
    β˜… Featured

    The official MCP server for AllMCPs.com - submit and manage tools directly from your AI. The open directory for MCP servers. Connect Claude, Cursor, Windsurf, and AI agents to databases, tools, files, and APIs. Explore 3,181+ servers. AllMCPs is the premier, open directory for discovering, evaluating, and installing Model Context Protocol (MCP) servers to equip AI agents and LLMs with real-world superpowers.

    πŸ—„οΈ Databases7 views
    Compare vs AllMCPs Server β†’
  • Genai Toolbox logoGenai Toolbox

    Open source MCP server specializing in easy, fast, and secure tools for Databases.

    πŸ—„οΈ Databases3 views
    Compare vs Genai Toolbox β†’
  • Mcp Server Duckdb logoMcp Server Duckdb

    DuckDB database integration with schema inspection and query capabilities

    πŸ—„οΈ Databases2 views
    Compare vs Mcp Server Duckdb β†’
  • Monitor logoMonitor

    Valkey-first observability with Redis compatibility. Query real-time metrics, analyze slow commands, detect hot keys, and investigate performance issues directly from AI coding assistants.

    πŸ—„οΈ Databases4 views
    Compare vs Monitor β†’

Frequently Asked Questions about Crawlio Browser

Add the following block to your claude_desktop_config.json under mcpServers: "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } }

AllMCPs Directory Badge

Full Badge Customizer

Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.

Badge Style:
Live Dynamic SVG PreviewCrawlio Browser AllMCPs Directory Badge
Markdown (GitHub README)
[![AllMCPs](https://allmcps.com/api/badge/crawlio-browser?style=directory)](https://allmcps.com/mcp/crawlio-browser)
HTML Embed
<a href="https://allmcps.com/mcp/crawlio-browser"><img src="https://allmcps.com/api/badge/crawlio-browser?style=directory" alt="Crawlio Browser on AllMCPs" /></a>

Technical Specs & Signals

CategoryπŸ—„οΈDatabases
More technical detailsExpand β–Ύ
TransportSTDIO
RuntimeNode.js
Views0
Unique ViewsTotal visits recorded for this listing page on AllMCPs.
Installs0
Installs & Copy ActionsTotal times users copied install commands or configuration snippets for this server.
GitHub stars4
GitHub Star CountTotal stargazers on GitHub representing community popularity (4 stars).
Last commit1d ago
Last Repository CommitThe most recent commit or push recorded for this server's GitHub repository.Last commit on Aug 10, 2026
53Quality signal: Good Β· 53/100How this signal is calculated β–Ύ
Server availabilityNot measured

Not scored for repo-hosted servers β€” we can't reach the running server, only its GitHub page. Hosted MCP endpoints are health-checked live.

Verified ownership10/20
Documentation & tools25/30
Adoption & activity5/15
Community engagement0/10

A guidance signal from public completeness & health data β€” not a user rating. New listings start lower and rise as they add docs, get verified, and grow adoption. Signals we can't observe for a listing are skipped, not counted against it.

β˜… FeaturedMoxie Docs MCP logo

Moxie Docs MCP

MCP & Agent Skills for Automated Documentation, and codebase conventions + context

Explore Server β†’

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge.

Free dofollow backlink: after claiming, verify your product site and place a dofollow AllMCPs badge β€” we recheck it stays live.

Claim & get free dofollow

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.

Explore more

More in πŸ—„οΈ Databases β†’Best MCP servers for Databases β†’Alternatives to Crawlio Browser β†’Install in Claude DesktopInstall in CursorInstall in VS Code