# Browserless (npm · @browserless.io/mcp)

Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.

- Trust score: 76/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-24

## Components

- remote · `mcp.browserless.io`: 36/100, [markdown](https://verifymcp.io/servers/io-browserless-mcp/mcp.md), [page](https://verifymcp.io/servers/io-browserless-mcp/mcp)
- npm · `@browserless.io/mcp`: 76/100 (this document), [markdown](https://verifymcp.io/servers/io-browserless-mcp/browserless-io-mcp.md), [page](https://verifymcp.io/servers/io-browserless-mcp/browserless-io-mcp)

## Channel facts

- Registry: `npm`
- Package: `@browserless.io/mcp`
- Version: `1.39.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-24.

- **Supply Chain Security**: 92/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Declares code that runs automatically (postinstall) and that we could not recognise. It may be perfectly ordinary, but we have not established what it does.
  - 95 of 325 dependencies flagged as unhealthy (4 deprecated).
- **Provenance & Transparency**: 87/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to browserless/browserless-mcp).
  - License check failed: the license (SSPL-1.0) isn't a recognized OSI-approved license.
  - Actively maintained (last published 7 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 52/100
  - 50% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 11406 tokens (~600/item across 19 items; 17 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 95% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 19 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Browserless MCP server?

Browserless runs locally as an npm package, launched with npx -y @browserless.io/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add io-browserless-mcp -- npx -y @browserless.io/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "io-browserless-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@browserless.io/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-browserless-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@browserless.io/mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add io-browserless-mcp -- npx -y @browserless.io/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-browserless-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@browserless.io/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-browserless-mcp --command npx --arg -y --arg @browserless.io/mcp
```

### Hermes

```yaml
mcp_servers:
  io-browserless-mcp:
    command: "npx"
    args: ["-y", "@browserless.io/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "io-browserless-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@browserless.io/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-browserless-mcp -t stdio -c npx -a -y @browserless.io/mcp
```

### Other

```json
{
  "mcpServers": {
    "io-browserless-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@browserless.io/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-24 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-16 (score 72)

First indexed and scored.

## MCP tools (17)

### `browserless_export` (~333 tokens)

Export a webpage from a URL via the Browserless /export API. Fetches the URL and returns its content in the native format (HTML, PDF, image, etc.). Automatically detects the content type. Set includeResources=true to bundle all page assets (CSS, JS, images) into a ZIP archive for offline use.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `bestAttempt` (boolean): When true, proceed even if awaited events fail or timeout.
- `gotoOptions` (object): Puppeteer Page.goto() options for navigation
- `includeResources` (boolean): When true, bundle all linked resources (CSS, JS, images) into a ZIP file.
- `profile` (string): Optional name of an authentication profile to hydrate into the browser before the page is exported. The profile's cookies, localStorage, and IndexedDB are restored into the session before the request…
- `timeout` (integer): Request timeout in milliseconds
- `url` (string, required): The URL to export (must be http or https)
- `waitForTimeout` (integer): Milliseconds to wait after page load before exporting

### `browserless_skill` (~716 tokens)

Load a Browserless agent skill on demand, or discover site-specific recipes.

Two uses:
\- **{ site: "<host>" }** — list any **site-specific recipes** tuned for that host (e.g. `{ site: "ebay.com" }`), returned as pointers. Do this as soon as you know the host you're about to drive; if one matches your task, load it by id. Returns a "no recipe" note when there's none.
\- **{ id: "<id>" }** — load a skill body: an in-house skill id (list below) OR a site recipe id `host/slug` from a `site` lookup.

Use the in-house skills below when you suspect the page exhibits a non-trivial mechanic but no SKILL block was auto-injected. The auto-injection heuristics are conservative; calling this tool is the explicit fallback.

Available in-house skills:
\- **shadow-dom** — deep selectors, iframe URL-pattern syntax, what works through deep-ref
\- **cookie-consent** — vendor-specific dismiss recipes (OneTrust, Cookiebot, Didomi, etc.)
\- **modals** — close-button heuristics, ESC handling, alertdialog vs. dialog
\- **snapshot-misses** — truncated/empty snapshots, image-rendered content
\- **dynamic-content** — choosing the right `wait*` method after async triggers
\- **screenshots** — when to screenshot vs. snapshot, scope and format choices
\- **vision-fallback** — click by coordinate when a "< " deep selector still can't surface the element (shadow DOM, nested iframe, canvas)
\- **tabs** — multi-tab workflows, peek-without-switching
\- **autonomous-login** — load before authenticating: when the user asked you to log in, when a wall blocks the task, or as soon as a password input appears. Covers the don't-login-by-default posture, contextual credential matching, MFA/captcha branches, and the required final JSON response shape.
\- **autonomous-registration** — load before creating an account: when the user asked you to sign up / register, or as soon as a Create-account form appears. Covers the don't-register-by-default posture, identity and credential-sink rules, save-first-then-loadSecret pass…

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `id` (string): The skill to load: an in-house skill id (see tool description) OR a site recipe id "host/slug" returned by a prior `site` lookup.
- `site` (string): A page host (e.g. "ebay.com"). Lists any site-specific recipes tuned for that host as pointers — then load one with its id.

### `browserless_agent` (~5355 tokens)

READ CAREFULLY: Execute browser commands in an agent session.

\## Core Loop (ReAct: Reason → Act → Observe)
0\. **Plan + check for a site recipe** — restate the goal, decide the target host, then `browserless_skill { site: "<host>" }` (see above). Load and follow any matching recipe before writing your own plan. Never jump straight to `goto`.
1\. **goto** — waits "domcontentloaded"
2\. **snapshot** — returns interactive + informational elements (button, link, textbox, combobox, checkbox, heading, img+alt) with ref= selectors
3\. **Plan** all actions from snapshot
4\. **Batch** execute
5\. **Re-snapshot** only if page changed
6\. Repeat → **close** when done

\## Ending the session (REQUIRED)
\**One-shot vs. multi-step (session lifetime).** Sessions are **one-shot by default**: when your `commands` batch and download drain finish, the browser closes and frees its slot. Decide on your FIRST call:
\- **One batch finishes the whole task** (e.g. `goto` + `text`/`html`/`evaluate` to read something): leave it one-shot; it closes automatically.
\- **You must look, then act on what you see** — any first batch that ends on a `snapshot` so you can plan later clicks/typing: set `keepSessionAlive: true` on that first call. The observe-then-act loop spans calls, so this covers most interactive work.
\- **Unsure? Set `keepSessionAlive: true`.** A kept session still auto-reaps when idle; a wrongly-closed one loses your page, login and progress.
After a `keepSessionAlive: true` call, pass the returned `sessionId` back on every later call — it stays alive, no need to repeat the flag. Set `keepSessionAlive: false` to force-close even when continuing. Profile creation and attached sessions manage their lifetimes separately.

An open session holds one of the account's concurrent browsers until it idles out — leaving it open is not free, and stacking them starves the next task.
\**Report the outcome (only if you loaded a site recipe).** Near the end of the run, send `{ method: "reportSkillOutcome",…

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `allowedDomains` (array): Origins where a resolved secret may be filled, e.g. ["https://gymshark.com"]. Only meaningful with `integrationId`. Defaults to the integration's configured origins; set it to fill on additional site…
- `commands` (array): Optional: batch multiple commands in one call. When provided, "method" and "params" are ignored and commands are executed sequentially. Only the final result is returned. Use this to batch actions th…
- `createProfile` (object): Open this session in profile-creation mode. The MCP tool POSTs /profile with these params, attaches the agent WS to the returned creation session (non-headless, 10-minute keepalive), and expects a sa…
- `deviceScaleFactor`: Desktop device pixel ratio. Ignored for Android.
- `deviceSlot` (integer): Stable desktop device slot. The server validates the account-specific upper bound.
- `emulatedDevice` (string): Android device slug, used only with emulationOs="android". Unknown slugs select a seeded device.
- `emulationOs` (string): OS persona for platform spoofing. Set on the first call before navigation.
- `humanlike` (boolean): Human-like cursor movement + pacing for clicks/scrolls. Improves the passive score of invisible anti-bot challenges (which weight real mouse/interaction signals). Defaults on. Forwarded as ?humanlike…
- `integrationId` (string): Optional 1Password integration id (e.g. "op_int_…") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Get it from browserless_sessions { a…
- `keepSessionAlive` (boolean): One-shot by default: after the command batch and download drain the browser closes and frees its concurrency slot. For a multi-step task, set true on your FIRST call; then pass the returned sessionId…
- `method` (string): The BQL method to execute (used for single-command calls). When using "commands" array, this field is ignored.
- `os` (string): Desktop OS to spoof for the stealth fingerprint (navigator.platform, UA, UA-CH client hints, GPU/font signals). Defaults to "windows" so the agent presents a coherent, low-risk desktop identity inste…
- `params` (object): Parameters for the method (used for single-command calls).
- `profile` (string): Optional name of an authentication profile to hydrate into the browser when the agent session connects. The profile's cookies, localStorage, and IndexedDB are restored into the session before the req…
- `proxy` (object): Residential, datacenter, or external proxy config. Read once at session creation. Changing requires close() + a new session call.
- `rationale` (string): A short user-facing reason for this call. HARD BUDGET: 50 characters. Surfaced live in interactive UIs as the progress label. Write it for a human watching, in present-continuous form ("Logging in",…
- `record` (boolean): Arm screen-video recording at session launch. Use `startRecording` / `stopRecording`; stopping returns a single-use WebM link, never bytes.
- `requiredCapabilities` (array): Capabilities the planned flow requires (for example "vision", "os-spoofing", "datacenter-proxy", or "secret-capture"). Browserless checks the selected route and plan before opening a browser and name…
- `screen` (string): Desktop screen as WIDTHxHEIGHT, with each dimension from 640 through 7680. Ignored for Android.
- `sessionId` (string): The `sessionId` returned by your previous browserless_agent call in this conversation. Echo it back on EVERY subsequent call — it binds this conversation to its live browser and its page state (curre…

### `browserless_performance` (~488 tokens)

Run a Lighthouse performance audit on any URL via the Browserless /performance API. Returns scores and metrics for accessibility, best practices, performance, PWA, and SEO. Optionally filter by category, emulate a mobile or desktop device, supply a custom Lighthouse config, or supply performance budgets. Returns category scores inline and saves the full JSON report outside the conversation. Use the local path (stdio) or download URL (HTTP) to inspect only the audits you need. Note: audits can take 30s–120s depending on the site.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `budgets` (array): Lighthouse performance budgets array. See https://developer.chrome.com/docs/lighthouse/performance/performance-budgets
- `categories` (array): Lighthouse categories to audit: "accessibility", "best-practices", "performance", "pwa", "seo". Omit for all categories.
- `config` (object): Custom Lighthouse config object, sent as the /performance "config" field. Defaults to { extends: "lighthouse:default" }. "categories" and "device" override the matching keys in config.settings. See h…
- `device` (string): Device to emulate during the audit: "mobile" or "desktop". Applies Lighthouse's matching form factor, screen size, network/CPU throttling and user agent. Omit for the Lighthouse default (mobile).
- `profile` (string): Optional name of an authentication profile to hydrate into the browser before the Lighthouse audit runs. The profile's cookies, localStorage, and IndexedDB are restored into the session before the re…
- `timeout` (integer): Request timeout in milliseconds (audits can take 30s–120s)
- `url` (string, required): The URL to audit (must be http or https)

### `browserless_account` (~170 tokens)

Read the Browserless account behind the current API token: plan, unit balance, billing period, and the names of the account API keys. Use it to answer "what plan am I on", "how many units are left", or "which keys exist". Read-only, and never returns API token values.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `action` (string, required): Which part of the account to read. `billing` returns the plan, unit balance and billing period; `keys` lists the account API keys by name.

### `browserless_usage` (~205 tokens)

Read request and unit consumption for the Browserless account behind the current API token: successes, errors, timeouts, queueing, peak concurrency, captchas, proxy bytes and units. Use it to answer "how much have I used" or "why is my bill high". For per-request detail on failures, use browserless_logs instead. Read-only.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `apiKeyIds` (array): Restrict the numbers to specific API keys, by id. Omit for the whole account. Get ids from browserless_account with action "keys".
- `timeframe` (string): Window the usage counts cover: the last hour, day, or week. Defaults to day.

### `browserless_sessions` (~382 tokens)

Inspect the sessions on the Browserless account behind the current API token: browsers running right now, persistent sessions saved on dedicated workers, recorded session replays, and 1Password credential integrations. Use it to answer "what is running", "did my session survive", or "what got recorded". Read-only — it never stops a session. Action `replay` downloads one recording and returns a fully self-contained playable rrweb page, needing no network to render: display it inline if you can render HTML, otherwise build an artifact from the returned instructions so the user can watch it. Always show the replay — never just summarise it in words.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `action` (string, required): Which session data to read. `active` = browsers running right now; `persistent` = saved sessions on dedicated workers, running or not; `replays` = list recorded session replays; `replay` = download o…
- `limit` (integer): Maximum rows to return (max 50). Applies to every action.
- `page` (integer): Page number for `replays` (1-based).
- `search` (string): Filter `replays` by website or session id.
- `sessionId` (string): Which replay to download, for action `replay`. Get ids from action `replays`.
- `skip` (integer): Rows to skip, for paging through `active` or `integrations`.

### `browserless_logs` (~466 tokens)

Read Browserless's own record of the account's recent requests: what was attempted, whether it failed, why it stopped, how long it took and what it cost. This is the tool for diagnosing a run that failed on the Browserless side rather than in your own code. The window available depends on the account plan; the server reports the limit if a range is refused. Read-only.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `apiKeyId` (string): Restrict to one API key, by id. Get ids from browserless_account with action "keys".
- `category` (string): Filter by failure category, e.g. `browserless_refused`, `browserless_killed`, `target_error`.
- `cursor` (string): Opaque cursor returned as `nextCursor` by the previous page.
- `endTime` (string): Exclusive RFC 3339 end time. Defaults to now when omitted.
- `endpoint` (string): Filter by endpoint, e.g. `/chromium/bql` or `/screenshot`.
- `eventNames` (array): Filter by lifecycle event name, e.g. `request.failed`, `bql.*.failed`.
- `levels` (array): Severity levels to include. Omit for all levels.
- `limit` (integer): Maximum entries to return, 1-100. Defaults to 50.
- `order` (string): Timestamp order. Defaults to newest first.
- `outcome` (string): Filter by request outcome, e.g. `failed` or `succeeded`.
- `reason` (string): Filter by the specific failure reason within a category.
- `requestId` (string): Return only entries for one request id.
- `startTime` (string): Inclusive RFC 3339 start time. Omit to let the account’s plan decide how far back to look — the available window is plan-dependent and the server rejects a range that exceeds it.
- `url` (string): Filter by the target URL of the request.

### `browserless_smartscraper` (~545 tokens)

Scrape a SINGLE webpage and return HTML, markdown, raw DOM text, links, screenshots, or PDFs plus page metadata. Handles JavaScript-heavy pages and anti-bot measures automatically. For content across MULTIPLE pages of a site, use browserless_crawl; to list a site's URLs, use browserless_map.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `excludeTags` (array): Up to 100 CSS selectors to remove from HTML webpage outputs. Malformed selectors are ignored. Cannot be combined with includeTags.
- `formats` (array): Output formats to include: "markdown", "html", "rawText", "screenshot", "pdf", "links". PDFs are saved outside the conversation and returned as a local path (stdio) or a single-use download URL (HTTP…
- `headers` (object): Custom HTTP headers sent to the target site. host, authorization, proxy-authorization, cookie, set-cookie, x-forwarded-for, x-real-ip, and forwarded are removed by the API.
- `includeTags` (array): Up to 100 CSS selectors to keep in HTML webpage outputs. Malformed entries are ignored; if no selector matches, the scraper returns unfiltered content. Cannot be combined with excludeTags or onlyMain…
- `onlyMainContent` (boolean): For HTML webpages, remove nav, footer, aside, role=navigation, script, style, and noscript elements from DOM-derived outputs. Parsed JSON and PDF content are unchanged. Defaults to false.
- `profile` (string): Optional name of an authentication profile to hydrate into the browser before scraping. The profile's cookies, localStorage, and IndexedDB are restored into the session before the request runs. The p…
- `timeout` (integer): Request timeout in milliseconds
- `url` (string, required): The URL to scrape (must be http or https)
- `waitFor` (integer): Milliseconds to wait after page load, from 0 to 30000. A positive value forces browser rendering.

### `browserless_function` (~433 tokens)

Execute custom Puppeteer JavaScript code on the Browserless cloud. Your function receives a Puppeteer `page` object and optional `context` data. Return { data, type } to control the response payload and Content-Type. 

For binary outputs, set `type` to a real MIME so the bytes come back as a proper content block instead of base64 text:
  \- `image/png` / `image/jpeg` / `image/webp` → vision content block (~1.5K tokens)
  \- `audio/mpeg` / `audio/wav` → audio content block
  \- `application/pdf` and other binaries → resource content block (attachment)

Text responses are capped at 200,000 characters (~50K tokens). Larger text payloads will be rejected — filter or summarize inside your function, or switch to a binary type if you actually meant to return bytes.

Useful for complex scraping, form filling, or any browser automation that requires custom code.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `code` (string, required): JavaScript (ESM) code to execute. The default export receives { page, context } and should return { data, type } where data is the response payload and type is the Content-Type string.
- `context` (object): Optional context object passed to the function as the second argument.
- `profile` (string): Optional name of an authentication profile to hydrate into the browser before the function executes. The profile's cookies, localStorage, and IndexedDB are restored into the session before the reques…
- `timeout` (integer): Request timeout in milliseconds

### `browserless_map` (~262 tokens)

Discover and map all URLs on a website using Browserless. Scans a site via sitemaps and link extraction to find all pages. Returns a list of URLs with optional titles and descriptions. Use the search parameter to order results by relevance to a query. Useful for site audits, content discovery, and building site maps.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `ignoreQueryParameters` (boolean): Exclude URLs with query parameters (default: true)
- `includeSubdomains` (boolean): Include URLs from subdomains (default: true)
- `limit` (integer): Maximum number of links to return (default: 100, max: 5000)
- `search` (string): Search query to order results by relevance
- `sitemap` (string): Sitemap handling: "include" (default), "skip", "only"
- `timeout` (integer): Request timeout in milliseconds
- `url` (string, required): The base URL to start mapping from (must be http or https)

### `browserless_crawl` (~529 tokens)

Crawl a website and scrape every discovered page using Browserless. Starts from a seed URL and follows links up to a configurable depth. Supports sitemap discovery, path filtering, subdomain handling, and custom scrape options. Returns scraped content (markdown/HTML) for each page along with metadata. Useful for comprehensive site analysis, content extraction, and data gathering.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `allowExternalLinks` (boolean): Whether to follow links to external domains
- `allowSubdomains` (boolean): Whether to follow links to subdomains
- `delay` (integer): Delay between requests in milliseconds (default: 200)
- `excludePaths` (array): Regex patterns for URL paths to exclude
- `includePaths` (array): Regex patterns for URL paths to include
- `limit` (integer): Maximum number of pages to crawl (default: 100)
- `maxDepth` (integer): Maximum link-follow depth from the root URL (default: 5)
- `maxRetries` (integer): Number of retry attempts per failed page (default: 1)
- `maxWaitTime` (integer): Maximum time in ms to wait for crawl completion when waitForCompletion is true (default: 300000 = 5 minutes)
- `pollInterval` (integer): Polling interval in ms when waiting for completion (default: 5000)
- `profile` (string): Optional name of an authentication profile to hydrate into the browser before each page is scraped. The profile's cookies, localStorage, and IndexedDB are restored into the session before the request…
- `scrapeOptions` (object): Options controlling how each page is scraped
- `sitemap` (string): Sitemap handling: "auto" (default), "force", "skip"
- `timeout` (integer): HTTP request timeout in milliseconds for API calls (default: 30000)
- `url` (string, required): The URL to crawl (must be http or https)
- `waitForCompletion` (boolean): Whether to wait for crawl completion (default: true). If false, returns immediately with crawl ID.

### `browserless_live_url` (~267 tokens)

Create, inspect, or close a live viewer link for an existing browser through REST, without an agent connection. Create options default on the server: view-only, jpeg, quality 70, not resizable, browser interface shown. Status returns status, reason, interactable, viewerCount, and expiresAt (epoch ms). Ended links remain inspectable until their browser closes; closing an ended link returns not found.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `action` (string, required)
- `browserId` (string, required): Running browser ID from browserless_sessions action active, not an agent sessionId.
- `instructions` (string)
- `interactable` (boolean)
- `liveURLId` (string): Required for status and close.
- `quality` (integer)
- `resizable` (boolean)
- `showBrowserInterface` (boolean)
- `timeout` (integer): Link lifetime in ms; server clamps to remaining session time and 15 minutes.
- `type` (string)

### `browserless_profiles` (~194 tokens)

List the authentication profiles saved for the current token. A profile is a saved logged-in browser state (cookies + storage) that can be replayed by passing its name as `profile` to other tools. Call this before a task that needs the browser to start signed in, to discover which profiles already exist and pick one by name. Returns each profile name plus cookie/origin counts and last-used time.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `limit` (integer): Maximum number of profiles to return (default: 100, max: 1000)
- `offset` (integer): Number of profiles to skip for pagination (default: 0)

### `browserless_search` (~302 tokens)

Search the web using Browserless and optionally scrape each result. Performs web searches via SearXNG and can return results from web, news, or images. Optionally scrape each result URL to get markdown, HTML, links, or screenshots. Useful for research, gathering information, and finding relevant web pages.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `categories` (array): Filter by categories: "github", "research", "pdf"
- `country` (string): Country code for geo-targeted results
- `lang` (string): Language code for search results (default: "en")
- `limit` (integer): Maximum number of results to return (default: 10, max: 100)
- `location` (string): Location string for geo-targeted results
- `query` (string, required): The search query string
- `scrapeOptions` (object): Options for scraping each search result
- `sources` (array): Search sources: "web", "news", "images" (default: ["web"])
- `tbs` (string): Time-based filter: "day", "week", "month", "year"
- `timeout` (integer): Request timeout in milliseconds

### `browserless_link_connect` (~174 tokens)

Manage the Browserless Stripe Link wallet. Use action "status" to check availability; it never returns a URL. Use "connect" to mint a Stripe-owned authorization URL to give the user, or "disconnect" to remove the connection. When "status" is not_connected, call "connect" to obtain that URL — the status instruction alone has no link. Never ask the user for raw card details.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `action` (string, required): Check Stripe Link status, start the connection flow, or disconnect the wallet.

### `browserless_link_checkout` (~426 tokens)

Create, resume, cancel, or report a Stripe Link checkout in the exact active browser session. Create requires the latest browserless_agent sessionId. Pass payment-field deep selectors whenever a card form is shown, including Stripe-hosted checkout; omit them only for a pure Link Pay Token handoff. Resume retrieves and fills only after Link approval; payment credentials never reach this tool.

Input parameters:

- `_prompt` (string): The end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, A…
- `action` (string, required): Checkout step to run.
- `amount_minor` (integer): Required for create.
- `browser_session_handle` (string, required): Opaque sessionId returned by the browserless_agent call that has the active checkout page
- `cart` (array): Required for create.
- `checkout_id` (string): Required for resume, cancel, and report.
- `currency` (string): Required for create; must be "usd". The Link card is billed in USD, so switch a geo-localized checkout (e.g. RSD/EUR) to USD with its currency selector before creating when the option exists — a non-…
- `merchant` (object): Required for create.
- `outcome` (string): Required for report.
- `selectors` (object): Required whenever a card form is shown, including Stripe-hosted checkout — its Link CLI one-time-card variant shows an AI-agent steering checkbox yet still renders a card form. Omit only for a pure L…
- `step` (string): Optional for report.
- `tags` (array): Optional for report.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/io-browserless-mcp/browserless-io-mcp#diagnostics

## Score history

- 2026-10-24: 76
- 2026-10-23: 75
- 2026-10-22: 75
- 2026-10-21: 75
- 2026-10-20: 74
- 2026-10-19: 74
- 2026-10-18: 73
- 2026-10-17: 73
- 2026-10-16: 72

## Common questions

### What is the Browserless MCP server?

Browserless is an MCP server listed in the public MCP registry as io.browserless/mcp. Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents. This page covers its npm package (@browserless.io/mcp).

### Is the Browserless MCP server safe to use?

Browserless scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Browserless MCP server expose?

Browserless exposes 17 tools: browserless_export, browserless_skill, browserless_agent, browserless_performance, browserless_account, and 12 more. Their descriptions and schemas cost roughly 11,247 tokens of context every time the server is loaded.

### Is the Browserless MCP server still maintained?

Browserless is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Browserless MCP server under?

Browserless declares the SSPL-1.0 licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@browserless.io/mcp
- Socket report: https://socket.dev/npm/package/@browserless.io/mcp
- Repository: https://github.com/browserless/browserless-mcp
- Website: https://docs.browserless.io/mcp/browserless-mcp-server/setup
- Changelog RSS feed: https://verifymcp.io/servers/io-browserless-mcp/browserless-io-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-browserless-mcp/browserless-io-mcp.json
- HTML version of this page: https://verifymcp.io/servers/io-browserless-mcp/browserless-io-mcp
