Sponsored by Deepsite.site

Crawlio Browser

Created By
Crawlio-app11 days ago
100-tool browser automation for AI agents via MCP. Screenshots, DOM inspection, network capture, form filling, cookie management, tab orchestration, session recording, and structured data extraction via Chrome extension. One-command setup: npx crawlio-browser init auto-configures 14 MCP clients.recording + 1 compiler) with framework-aware intelligence, typed evidence infrastructure, and confidence-tracked findings — captures what static crawlers can't see.
Content

Crawlio Agent

npm version License: MIT

Documentation | API Reference | Chrome Extension

MCP server that gives AI full control of a live Chrome browser via CDP. 100 tools (93 browser + 3 extraction + 3 recording + 1 compiler) with framework-aware intelligence, typed evidence infrastructure, and confidence-tracked findings — captures what static crawlers can't see.

Note: This repo supersedes crawlio-browser-mcp. All development now happens here.

Links:

When to use Crawlio Agent

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

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

Quick Start

  1. Install the Chrome Extension
  2. Run the init wizard:
    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

npx crawlio-browser init              # Default: code mode, stdio transport
npx crawlio-browser init --full       # Full mode (100 individual tools)
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

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:

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

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

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

Claude Code (stdio):

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

Cursor — add to .cursor/mcp.json:

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

Windsurf — add to Windsurf Settings > MCP:

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

Cline (VS Code) — add to settings.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

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.

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.

Architecture: JIT Context Runtime

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

                     ┌───────────────────────────────────┐
                     │        AI Model (LLM)             │
                     │  Writes code, reads errors, loops  │
                     └───────────────┬───────────────────┘
                                     │  3 tools: search, execute, connect_tab
┌─────────────────────────────────────────────────────────────────┐
│                    JIT Context MCP 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 · screenshot                                     │  │
│  │                                                            │  │
│  │  ↳ 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                     │  │
│  ├────────────────────────────────────────────────────────────┤  │
│  │  133 RAW COMMANDS  (bridge.send)                           │  │
│  │  CDP-level browser control via Chrome extension            │  │
│  └────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
                     ┌───────────────────────────────────┐
                     │         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, detects 17 frameworks, injects namespace methods (smart.react.getVersion(), smart.nextjs.getData())
Method ModeModel composes primitives ad-hoc — inconsistent scroll loops, missed edge cases, varying return shapes8 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 (133 commands), crawlio (HTTP client), sleep, TIMEOUTS, smart (7 core + 8 higher-order + 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

DimensionStandard MCPCloudflare Code ModeJIT Context Runtime
Tools in context50-100+ schemas2 (search, execute)3 (search, execute, connect_tab)
Execution environmentN/A (tool calls)V8 isolate (stateless)Local async sandbox (stateful, tethered to live browser)
DOM accessVia individual tool callsNoneLive, persistent, framework-aware
Framework awarenessNoneNone17 namespaces, injected JIT
Action resilienceModel must handle timingN/A (no DOM)Built-in actionability polling + settle delays
Error recoveryRe-call individual toolRe-create isolateRe-execute against same live state (Agentic REPL)
Multi-step patternsModel improvisesModel writes loops8 tested higher-order methods + behavioral protocol

Read the full architecture guide →

Two Modes

Code Mode (3 tools) — default

Collapses 100 tools into 3 high-level tools with ~95% schema token reduction:

ToolDescription
searchDiscover available commands by keyword
executeRun async JS with bridge, crawlio, smart, sleep, and compileRecording in scope
connect_tabConnect to a browser tab
// 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 (100 tools)

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

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.screenshot()Full-page screenshot (base64 PNG)

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:

Reactsmart.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.jssmart.vue
MethodReturns
getVersion()Vue version string
getAppCount()Number of Vue app instances
getConfig()App config object
isDevMode()Whether DevTools is enabled
Angularsmart.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
Sveltesmart.svelte
MethodReturns
getVersion()Svelte version string
getMeta()Svelte metadata object
isDetected()Whether Svelte is detected
Reduxsmart.redux
MethodReturns
isInstalled()Whether Redux DevTools is installed
getStoreState()Full store state
Alpine.jssmart.alpine
MethodReturns
getVersion()Alpine version string
getStoreKeys()Store object keys
getComponentCount()Count of [x-data] components
Next.jssmart.nextjs
MethodReturns
getData()__NEXT_DATA__ object
getRouter()Router state (pathname, query, asPath)
getSSRMode()SSR mode (hybrid, app-router, static)
getRouteManifest()Current page data
Nuxtsmart.nuxt
MethodReturns
getData()__NUXT__ object
getConfig()App config
isSSR()Whether server-rendered
Remixsmart.remix
MethodReturns
getContext()__remixContext object
getRouteData()Loader data from state
Shopifysmart.shopify
MethodReturns
getShop()Shop metadata (theme, locale, currency)
getCart()Shopping cart object
WordPresssmart.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

Method Mode is a domain layer built on top of Code Mode. It adds higher-order methods, a typed evidence system, and a behavioral protocol to the execute sandbox — without changing the tool surface. The model still sees three tools. The same smart object. The same 133-command catalog underneath. What changes is what happens inside execute.

The Maturity Ladder

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

Architecture

┌────────────────────────────────────────────────────────────┐
│                      execute sandbox                       │
│                                                            │
│  ┌──────────────────────────────────────────────────────┐  │
│  │  Behavioral Protocol  (web-research skill)           │  │
│  │  Acquire → Normalize → Analyze                       │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │  Evidence Infrastructure                             │  │
│  │  finding() · findings() · clearFindings()            │  │
│  │  Typed records · Coverage gaps · Confidence prop.    │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │  Higher-Order Methods  [8]                           │  │
│  │  scrollCapture · waitForIdle · extractPage ·         │  │
│  │  comparePages · detectTables · extractTable ·        │  │
│  │  waitForNetworkIdle · extractData                    │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │  Smart Core  [7 methods]                             │  │
│  │  evaluate · click · type · navigate · waitFor ·      │  │
│  │  snapshot · screenshot                               │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │  Framework Namespaces  [up to 17, injected JIT]      │  │
│  │  react · vue · angular · nextjs · shopify · ...      │  │
│  ├──────────────────────────────────────────────────────┤  │
│  │  bridge.send()  — 133 raw commands                   │  │
│  └──────────────────────────────────────────────────────┘  │
└────────────────────────────────────────────────────────────┘

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:

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

Tool-Enforced Findingssmart.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

// 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

// 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

// 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 smart.screenshot();
return screenshot;

Record and compile automation

// 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

// 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.

// 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

All 100 tools — Connection, Capture, Navigation, Network, Storage, Emulation, 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_capabilitiesList all tools and their availability

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_screenshotScreenshot as base64 PNG
get_response_bodyGet response body for a captured network request
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

Crawlio App Integration

Optional — requires Crawlio.app running locally.

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 Agent extension installed
  • Crawlio.app (optional) — for site crawling and enrichment

Resources

License

MIT

Server Config

{
  "mcpServers": {
    "crawlio-browser": {
      "command": "npx",
      "args": [
        "-y",
        "crawlio-browser"
      ]
    }
  }
}
Recommend Servers
TraeBuild with Free GPT-4.1 & Claude 3.7. Fully MCP-Ready.
Y GuiA web-based graphical interface for AI chat interactions with support for multiple AI models and MCP (Model Context Protocol) servers.
RedisA Model Context Protocol server that provides access to Redis databases. This server enables LLMs to interact with Redis key-value stores through a set of standardized tools.
Serper MCP ServerA Serper MCP Server
Jina AI MCP ToolsA Model Context Protocol (MCP) server that integrates with Jina AI Search Foundation APIs.
ChatWiseThe second fastest AI chatbot™
DeepChatYour AI Partner on Desktop
Howtocook Mcp基于Anduin2017 / HowToCook (程序员在家做饭指南)的mcp server,帮你推荐菜谱、规划膳食,解决“今天吃什么“的世纪难题; Based on Anduin2017/HowToCook (Programmer's Guide to Cooking at Home), MCP Server helps you recommend recipes, plan meals, and solve the century old problem of "what to eat today"
MCP AdvisorMCP Advisor & Installation - Use the right MCP server for your needs
WindsurfThe new purpose-built IDE to harness magic
Tavily Mcp
CursorThe AI Code Editor
Amap Maps高德地图官方 MCP Server
Playwright McpPlaywright MCP server
Zhipu Web SearchZhipu Web Search MCP Server is a search engine specifically designed for large models. It integrates four search engines, allowing users to flexibly compare and switch between them. Building upon the web crawling and ranking capabilities of traditional search engines, it enhances intent recognition capabilities, returning results more suitable for large model processing (such as webpage titles, URLs, summaries, site names, site icons, etc.). This helps AI applications achieve "dynamic knowledge acquisition" and "precise scenario adaptation" capabilities.
Baidu Map百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
MiniMax MCPOfficial MiniMax Model Context Protocol (MCP) server that enables interaction with powerful Text to Speech, image generation and video generation APIs.
AiimagemultistyleA Model Context Protocol (MCP) server for image generation and manipulation using fal.ai's Stable Diffusion model.
Visual Studio Code - Open Source ("Code - OSS")Visual Studio Code
BlenderBlenderMCP connects Blender to Claude AI through the Model Context Protocol (MCP), allowing Claude to directly interact with and control Blender. This integration enables prompt assisted 3D modeling, scene creation, and manipulation.
EdgeOne Pages MCPAn MCP service designed for deploying HTML content to EdgeOne Pages and obtaining an accessible public URL.