# Scrapfly Documentation

## Table of Contents

### Dashboard

- [Intro](https://scrapfly.io/docs)
- [Project](https://scrapfly.io/docs/project)
- [Account](https://scrapfly.io/docs/account)
- [Workspace & Team](https://scrapfly.io/docs/workspace-and-team)
- [Billing](https://scrapfly.io/docs/billing)

### Products

#### MCP Server

- [Getting Started](https://scrapfly.io/docs/mcp/getting-started)
- [Tools & API Spec](https://scrapfly.io/docs/mcp/tools)
- [Authentication](https://scrapfly.io/docs/mcp/authentication)
- [Examples & Use Cases](https://scrapfly.io/docs/mcp/examples)
- [FAQ](https://scrapfly.io/docs/mcp/faq)
##### Integrations

- [Overview](https://scrapfly.io/docs/mcp/integrations)
- [Claude Desktop](https://scrapfly.io/docs/mcp/integrations/claude-desktop)
- [Claude Code](https://scrapfly.io/docs/mcp/integrations/claude-code)
- [ChatGPT](https://scrapfly.io/docs/mcp/integrations/chatgpt)
- [Cursor](https://scrapfly.io/docs/mcp/integrations/cursor)
- [Cline](https://scrapfly.io/docs/mcp/integrations/cline)
- [Windsurf](https://scrapfly.io/docs/mcp/integrations/windsurf)
- [Zed](https://scrapfly.io/docs/mcp/integrations/zed)
- [Roo Code](https://scrapfly.io/docs/mcp/integrations/roo-code)
- [VS Code](https://scrapfly.io/docs/mcp/integrations/vscode)
- [LangChain](https://scrapfly.io/docs/mcp/integrations/langchain)
- [LlamaIndex](https://scrapfly.io/docs/mcp/integrations/llamaindex)
- [CrewAI](https://scrapfly.io/docs/mcp/integrations/crewai)
- [OpenAI](https://scrapfly.io/docs/mcp/integrations/openai)
- [n8n](https://scrapfly.io/docs/mcp/integrations/n8n)
- [Make](https://scrapfly.io/docs/mcp/integrations/make)
- [Zapier](https://scrapfly.io/docs/mcp/integrations/zapier)
- [Vapi AI](https://scrapfly.io/docs/mcp/integrations/vapi)
- [Agent Builder](https://scrapfly.io/docs/mcp/integrations/agent-builder)
- [Custom Client](https://scrapfly.io/docs/mcp/integrations/custom-client)


#### Web Scraping API

- [Getting Started](https://scrapfly.io/docs/scrape-api/getting-started)
- [API Specification]()
- [Monitoring](https://scrapfly.io/docs/monitoring)
- [Customize Request](https://scrapfly.io/docs/scrape-api/custom)
- [Debug](https://scrapfly.io/docs/scrape-api/debug)
- [Anti Scraping Protection](https://scrapfly.io/docs/scrape-api/anti-scraping-protection)
- [Proxy](https://scrapfly.io/docs/scrape-api/proxy)
- [Proxy Mode](https://scrapfly.io/docs/scrape-api/proxy-mode)
- [Proxy Mode - Screaming Frog](https://scrapfly.io/docs/scrape-api/proxy-mode/screaming-frog)
- [Proxy Mode - Apify](https://scrapfly.io/docs/scrape-api/proxy-mode/apify)
- [(Auto) Data Extraction](https://scrapfly.io/docs/scrape-api/extraction)
- [Javascript Rendering](https://scrapfly.io/docs/scrape-api/javascript-rendering)
- [Javascript Scenario](https://scrapfly.io/docs/scrape-api/javascript-scenario)
- [SSL](https://scrapfly.io/docs/scrape-api/ssl)
- [DNS](https://scrapfly.io/docs/scrape-api/dns)
- [Cache](https://scrapfly.io/docs/scrape-api/cache)
- [Batch (Multi-URL Scraping)](https://scrapfly.io/docs/scrape-api/batch)
- [Session](https://scrapfly.io/docs/scrape-api/session)
- [Webhook](https://scrapfly.io/docs/scrape-api/webhook)
- [Schedule](https://scrapfly.io/docs/scrape-api/schedule)
- [Screenshot](https://scrapfly.io/docs/scrape-api/screenshot)
- [Errors](https://scrapfly.io/docs/scrape-api/errors)
- [Timeout](https://scrapfly.io/docs/scrape-api/understand-timeout)
- [Throttling](https://scrapfly.io/docs/throttling)
- [Troubleshoot](https://scrapfly.io/docs/scrape-api/troubleshoot)
- [Billing](https://scrapfly.io/docs/scrape-api/billing)
- [FAQ](https://scrapfly.io/docs/scrape-api/faq)

#### Crawler API

- [Getting Started](https://scrapfly.io/docs/crawler-api/getting-started)
- [API Specification]()
- [Retrieving Results](https://scrapfly.io/docs/crawler-api/results)
- [WARC Format](https://scrapfly.io/docs/crawler-api/warc-format)
- [Data Extraction](https://scrapfly.io/docs/crawler-api/extraction-rules)
- [Webhook](https://scrapfly.io/docs/crawler-api/webhook)
- [Schedule](https://scrapfly.io/docs/crawler-api/schedule)
- [Billing](https://scrapfly.io/docs/crawler-api/billing)
- [Errors](https://scrapfly.io/docs/crawler-api/errors)
- [Troubleshoot](https://scrapfly.io/docs/crawler-api/troubleshoot)
- [FAQ](https://scrapfly.io/docs/crawler-api/faq)

#### Screenshot API

- [Getting Started](https://scrapfly.io/docs/screenshot-api/getting-started)
- [API Specification]()
- [Accessibility Testing](https://scrapfly.io/docs/screenshot-api/accessibility)
- [Webhook](https://scrapfly.io/docs/screenshot-api/webhook)
- [Schedule](https://scrapfly.io/docs/screenshot-api/schedule)
- [Billing](https://scrapfly.io/docs/screenshot-api/billing)
- [Errors](https://scrapfly.io/docs/screenshot-api/errors)

#### Extraction API

- [Getting Started](https://scrapfly.io/docs/extraction-api/getting-started)
- [API Specification]()
- [Rules Template](https://scrapfly.io/docs/extraction-api/rules-and-template)
- [LLM Extraction](https://scrapfly.io/docs/extraction-api/llm-prompt)
- [AI Auto Extraction](https://scrapfly.io/docs/extraction-api/automatic-ai)
- [Webhook](https://scrapfly.io/docs/extraction-api/webhook)
- [Billing](https://scrapfly.io/docs/extraction-api/billing)
- [Errors](https://scrapfly.io/docs/extraction-api/errors)
- [FAQ](https://scrapfly.io/docs/extraction-api/faq)

#### Data API


#### Proxy Saver

- [Getting Started](https://scrapfly.io/docs/proxy-saver/getting-started)
- [Fingerprints](https://scrapfly.io/docs/proxy-saver/fingerprints)
- [Optimizations](https://scrapfly.io/docs/proxy-saver/optimizations)
- [SSL Certificates](https://scrapfly.io/docs/proxy-saver/certificates)
- [Protocols](https://scrapfly.io/docs/proxy-saver/protocols)
- [Pacfile](https://scrapfly.io/docs/proxy-saver/pacfile)
- [Secure Credentials](https://scrapfly.io/docs/proxy-saver/security)
- [Billing](https://scrapfly.io/docs/proxy-saver/billing)

#### Cloud Browser API

- [Getting Started](https://scrapfly.io/docs/cloud-browser-api/getting-started)
- [Proxy & Geo-Targeting](https://scrapfly.io/docs/cloud-browser-api/proxy)
- [Unblock API](https://scrapfly.io/docs/cloud-browser-api/unblock)
- [Captcha Solver](https://scrapfly.io/docs/cloud-browser-api/captcha-solver)
- [File Downloads](https://scrapfly.io/docs/cloud-browser-api/file-downloads)
- [Session Resume](https://scrapfly.io/docs/cloud-browser-api/session-resume)
- [Human-in-the-Loop](https://scrapfly.io/docs/cloud-browser-api/human-in-the-loop)
- [Debug Mode](https://scrapfly.io/docs/cloud-browser-api/debug-mode)
- [Browser Extensions](https://scrapfly.io/docs/cloud-browser-api/extensions)
- [Native Browser MCP](https://scrapfly.io/docs/cloud-browser-api/mcp)
- [DevTools Protocol](https://scrapfly.io/docs/cloud-browser-api/cdp-reference)
##### Integrations

- [Puppeteer](https://scrapfly.io/docs/cloud-browser-api/puppeteer)
- [Playwright](https://scrapfly.io/docs/cloud-browser-api/playwright)
- [Selenium](https://scrapfly.io/docs/cloud-browser-api/selenium)
- [Vercel Agent Browser](https://scrapfly.io/docs/cloud-browser-api/agent-browser)
- [Browser Use](https://scrapfly.io/docs/cloud-browser-api/browser-use)
- [Stagehand](https://scrapfly.io/docs/cloud-browser-api/stagehand)

- [Billing](https://scrapfly.io/docs/cloud-browser-api/billing)
- [Errors](https://scrapfly.io/docs/cloud-browser-api/errors)


### Tools

- [Antibot Detector](https://scrapfly.io/docs/tools/antibot-detector)

### SDK

- [Golang](https://scrapfly.io/docs/sdk/golang)
- [Python](https://scrapfly.io/docs/sdk/python)
- [Rust](https://scrapfly.io/docs/sdk/rust)
- [TypeScript](https://scrapfly.io/docs/sdk/typescript)
- [Scrapy](https://scrapfly.io/docs/sdk/scrapy)

### Integrations

- [Getting Started](https://scrapfly.io/docs/integration/getting-started)
- [LangChain](https://scrapfly.io/docs/integration/langchain)
- [LlamaIndex](https://scrapfly.io/docs/integration/llamaindex)
- [CrewAI](https://scrapfly.io/docs/integration/crewai)
- [Zapier](https://scrapfly.io/docs/integration/zapier)
- [Make](https://scrapfly.io/docs/integration/make)
- [n8n](https://scrapfly.io/docs/integration/n8n)

### Academy

- [Overview](https://scrapfly.io/academy)
- [Web Scraping Overview](https://scrapfly.io/academy/scraping-overview)
- [Tools](https://scrapfly.io/academy/tools-overview)
- [Reverse Engineering](https://scrapfly.io/academy/reverse-engineering)
- [Static Scraping](https://scrapfly.io/academy/static-scraping)
- [HTML Parsing](https://scrapfly.io/academy/html-parsing)
- [Dynamic Scraping](https://scrapfly.io/academy/dynamic-scraping)
- [Hidden API Scraping](https://scrapfly.io/academy/hidden-api-scraping)
- [Headless Browsers](https://scrapfly.io/academy/headless-browsers)
- [Hidden Web Data](https://scrapfly.io/academy/hidden-web-data)
- [JSON Parsing](https://scrapfly.io/academy/json-parsing)
- [Data Processing](https://scrapfly.io/academy/data-processing)
- [Scaling](https://scrapfly.io/academy/scaling)
- [Walkthrough Summary](https://scrapfly.io/academy/walkthrough-summary)
- [Scraper Blocking](https://scrapfly.io/academy/scraper-blocking)
- [Proxies](https://scrapfly.io/academy/proxies)

---

# Cloud Browser MCP Endpoint

 Every Cloud Browser session with `enable_mcp=true` exposes its own streamable-HTTP MCP server. The allocation response carries an `mcp_endpoint` URL that any MCP client (Claude, Cursor, the Python `mcp` SDK, TS `@modelcontextprotocol/sdk`) can connect to directly. The server exposes 17 flat tools: input (`click`, `fill`, `hover`, `press_key`, `type_text`, `drag`, `scroll`), navigation (`navigate_page`, `go_back`, `go_forward`, `refresh`), inspection (`take_snapshot`, `take_screenshot`, `evaluate_script`, `wait_for`), and a WebMCP bridge (`list_webmcp_tools`, `execute_webmcp_tool`). Elements are addressed by uid from the latest snapshot. No CSS/XPath.

 1. [Cloud Browser](https://scrapfly.io/docs/cloud-browser-api/getting-started)
2. MCP Endpoint

  Every Cloud Browser session you launch with `enable_mcp=true` spins up its own [streamable-HTTP MCP server](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) glued directly to the browser. The allocation response carries an `mcp_endpoint` URL that any MCP client (Claude Desktop, Cursor, the Python `mcp` SDK, the TypeScript `@modelcontextprotocol/sdk`, etc.) can connect to. No proxy, no Scrapfly MCP Server in the middle. The agent talks to the browser.

 **Two MCP products, one wire format.** The **Cloud Browser MCP endpoint** (this page) is a per-session server pinned to one browser. The [Scrapfly MCP Server](https://scrapfly.io/docs/mcp/getting-started) is a multi-tenant server that exposes scraping tools plus a managed bridge into Cloud Browser. If you only need an AI agent to drive *one* browser session, this endpoint is the shortest path. If you want scraping + browser tools through a single connection, use the Scrapfly MCP Server.

## Enabling MCP on a Session

 Add `enable_mcp=true` to your Cloud Browser allocation request. The allocation response then includes an `mcp_endpoint` field alongside `web_socket_debugger_url`:

 ```
{
    "browser_version": "Chrome/147.0.7727.55",
    "web_socket_debugger_url": "wss://...",
    "mcp_endpoint": "http://<agent-ip>:1213/mcp",
    "allocation_id": "01HZ..."
}</agent-ip>
```

 The endpoint speaks MCP over streamable HTTP. It lives as long as the browser session lives. It is created when the browser starts and torn down when the session ends. There is one MCP server per session.

### Via WebSocket URL parameter

 ```
wss://browser.scrapfly.io?api_key=&enable_mcp=true
```

### Via SDK

   Python   TypeScript   Go

  ```
from scrapfly import ScrapflyClient, BrowserConfig

client = ScrapflyClient(key='')
allocation = client.cloud_browser(BrowserConfig(enable_mcp=True))

# allocation['mcp_endpoint'] is the streamable-HTTP URL
print(allocation['mcp_endpoint'])
```

 ```
import { ScrapflyClient } from 'scrapfly-sdk';

const client = new ScrapflyClient({ key: '' });
const allocation = await client.cloudBrowser({ enable_mcp: true });

console.log(allocation.mcp_endpoint);
```

 ```
client, _ := scrapfly.New("")
allocation, _ := client.CloudBrowser(&scrapfly.CloudBrowserConfig{EnableMCP: true})
fmt.Println(allocation.MCPEndpoint)
```

## Connecting an MCP Client

 The endpoint speaks plain MCP over streamable HTTP. Use the official SDK for your stack. You do *not* need to touch CDP. The example below allocates a browser, navigates to a page, takes a snapshot, then clicks the first link.

   Python (`mcp` SDK)   TypeScript (`@modelcontextprotocol/sdk`)

  ```
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from scrapfly import ScrapflyClient, BrowserConfig

async def main():
    sf = ScrapflyClient(key='')
    allocation = sf.cloud_browser(BrowserConfig(enable_mcp=True))
    mcp_url = allocation['mcp_endpoint']

    async with streamablehttp_client(mcp_url) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()

            tools = await session.list_tools()
            print('Available:', [t.name for t in tools.tools])

            await session.call_tool('navigate_page', {'url': 'https://web-scraping.dev/products'})
            snapshot = await session.call_tool('take_snapshot', {})
            print(snapshot.content[0].text[:500])

            # Pick a uid from the snapshot, then:
            # await session.call_tool('click', {'uid': '42'})

asyncio.run(main())
```

 ```
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import { ScrapflyClient } from 'scrapfly-sdk';

const sf = new ScrapflyClient({ key: '' });
const allocation = await sf.cloudBrowser({ enable_mcp: true });

const client = new Client({ name: 'my-agent', version: '1.0.0' });
const transport = new StreamableHTTPClientTransport(new URL(allocation.mcp_endpoint));
await client.connect(transport);

const tools = await client.listTools();
console.log('Available:', tools.tools.map(t => t.name));

await client.callTool({ name: 'navigate_page', arguments: { url: 'https://web-scraping.dev/products' } });
const snap = await client.callTool({ name: 'take_snapshot', arguments: {} });
console.log(snap.content[0].text.slice(0, 500));
```

## Tool Reference

 The server exposes **17 tools**, all unprefixed and at the top level. They split into four groups: [input](#tools-input), [navigation](#tools-navigation), [inspection](#tools-inspection), and [WebMCP bridge](#tools-webmcp).

 **How element selection works.** Every tool that targets a DOM element takes a `uid` string. The uid is the AX node id from the most recent `take_snapshot` output (rendered as `id=<uid>`). CSS selectors and XPath are **not** accepted. The agent is expected to read the snapshot first, then act. When the page changes (after a click, a fill, navigation), call `take_snapshot` again to refresh the uids.

### Input Tools

 Mouse and keyboard input goes through the Scrapium `Antibot.*` CDP commands with realistic Bezier-curve mouse paths and human-like key timing. Most input tools refresh the page snapshot after the action and append it to the result.

 | Tool | Required | Optional | Behavior |
|---|---|---|---|
| `click` | `uid` (string) |  | Clicks the element identified by `uid`. Returns a confirmation plus the refreshed page snapshot. |
| `fill` | `uid`, `value` (strings) |  | Clicks the field, clears it, then types `value`. Works for `<input>`, `<textarea>`, and native `<select>`. |
| `hover` | `uid` (string) |  | Hovers over the element. Does **not** refresh the snapshot. Call `take_snapshot` again if hover-revealed menus matter. |
| `press_key` | `key` (string) |  | Presses a key or combination. Examples: `"Enter"`, `"Tab"`, `"Escape"`, `"Control+A"`, `"Control+Shift+R"`. Modifiers: `Control`, `Shift`, `Alt`, `Meta`. |
| `type_text` | `text` (string) | `submitKey` (string) | Types `text` at the current keyboard focus (no element targeting). Optionally presses `submitKey` after typing. Use `"Enter"` to submit forms. |
| `drag` | `from_uid`, `to_uid` (strings) |  | Drags one element onto another with a realistic mouse path. |
| `scroll` |  | `uid`, `deltaX`, `deltaY` (numbers) | If `uid` is given, scrolls that element into view. If `deltaX`/`deltaY` is given, scrolls the viewport by that amount. Both can be combined. |

### Navigation Tools

 Navigation tools change the page URL or history position, then refresh the snapshot.

 | Tool | Required | Behavior |
|---|---|---|
| `navigate_page` | `url` (string) | Issues `Page.navigate`, waits 2 s for load, refreshes the snapshot. |
| `go_back` |  | Calls `history.back()`, waits 2 s, refreshes. |
| `go_forward` |  | Calls `history.forward()`, waits 2 s, refreshes. |
| `refresh` |  | Reloads the page (`Page.reload`), waits 2 s, refreshes the snapshot. |

 **The 2-second wait is a fixed delay**, not a load-event wait. On slow pages you may need to follow up with `wait_for` on an expected text before snapshotting.

### Inspection Tools

 | Tool | Required | Optional | Returns |
|---|---|---|---|
| `take_snapshot` |  | `verbose` (bool) | Page title, URL, and a compact textual rendering of the accessibility tree. Each interactable element is listed as `id=<uid> <role> "<name>"` with optional `value`, `focused`, `required`, `disabled`, `checked` flags. **Prefer this over screenshots** for any LLM reasoning. |
| `take_screenshot` |  | `format` (`"png" \\| "jpeg" \\| "webp"`), `fullPage` (bool), `uid` (string) | Returns an `ImageContent` block plus a short text caption. `uid` and `fullPage` are mutually exclusive. Default: viewport-only PNG. |
| `evaluate_script` | `expression` (string) |  | Evaluates a JS expression in the page's main world via `Runtime.evaluate` with `returnByValue: true`. Returns the result as JSON in a fenced code block. Throws a tool error on JS exceptions. Non-serializable values (DOM nodes, functions) come back as `null`. |
| `wait_for` | `text` (string\[\]) | `timeout` (ms, default 30000) | Polls `document.body.innerText` every 500 ms until any string in `text` appears. Returns success plus a fresh snapshot, or a tool error on timeout. |

#### Example snapshot output

 ```
Page: Products
URL: https://web-scraping.dev/products

Page elements -- to interact, use selector {"type": "axNodeId", "query": "<id>"}:

id=12 RootWebArea "Products"
id=15 link "Home"
id=17 link "Products"
id=23 textbox "Search" required
id=24 button "Search"
id=31 link "Box of Chocolate Candy"
id=32 link "Dark Red Energy Potion"
id=33 link "Teal Energy Potion"
id=40 button "Next page" disabled</id>
```

### WebMCP Bridge Tools

 When a page registers tools via the [WebMCP](https://developer.chrome.com/blog/webmcp-epp) `navigator.modelContext.registerTool()` API, this server lets your agent discover and invoke them through two dedicated tools rather than re-listing them dynamically.

 | Tool | Required | Optional | Behavior |
|---|---|---|---|
| `list_webmcp_tools` |  |  | Enables the `WebMCP` CDP domain, waits up to 3 s for `toolsAdded` events, then returns a JSON list of page-registered tools: `name`, `description`, `inputSchema`, `frameId`. |
| `execute_webmcp_tool` | `toolName` (string) | `input` (JSON-stringified object) | Invokes the named page-registered tool. `input` is a JSON string, e.g. `'{"query": "potion"}'`. Waits up to 30 s for `toolResponded`, then returns the tool's `output` as text. |

 **When to use the bridge.** If a site is WebMCP-aware (rare today, but growing), its registered tools are more reliable than DOM-driven clicks because they're a typed API the site itself exposes. Always call `list_webmcp_tools` first after a navigation. Tool registrations are page-local.

#### Try it on a WebMCP page

 [web-scraping.dev/mcp-tools](https://web-scraping.dev/mcp-tools) registers a few demonstration tools. After connecting to the MCP endpoint and navigating there, run:

 ```
# 1. Discover page-registered tools
await session.call_tool("list_webmcp_tools", {})

# 2. Call one of them
await session.call_tool("execute_webmcp_tool", {
    "toolName": "searchProducts",
    "input": "{"query": "potion"}"
})
```

## Behavior &amp; Limits

- **Lifecycle.** The MCP server is created when the browser starts and dies when the session ends (timeout, explicit close, or stop). The `mcp_endpoint` URL is single-use: it points at a port on the agent VM that hosts your session.
- **Concurrency.** One browser, one MCP server. The streamable-HTTP handler accepts parallel requests but they all hit the same Chrome instance.
- **Element selection.** Selectors are `axNodeId` values from the latest snapshot. No CSS, no XPath. After any state change (click, navigation, fill), call `take_snapshot` again to refresh the uids. Old uids will not resolve.
- **Snapshot scope.** The accessibility tree is fetched to depth 10. Nodes with role `generic`, `none`, `StaticText`, `InlineTextBox`, `LineBreak`, `paragraph`, `LayoutTable*` are filtered out, as are nodes with no name/value unless their role is interactable (`textbox`, `button`, `link`, `checkbox`, `radio`, `combobox`).
- **Wait strategy.** `navigate_page`, `go_back`, `go_forward`, `refresh` use a fixed 2 s sleep before snapshotting. They don't wait for the load event. Pair them with `wait_for` on heavy pages.
- **Server identification.** The server identifies itself as `scrapium-mcp` v`1.0.0` in the MCP `initialize` response.

## vs. Scrapfly MCP Server

 The [Scrapfly MCP Server](https://scrapfly.io/docs/mcp/getting-started) is a different product: a managed, multi-tenant MCP server hosted at `mcp.scrapfly.io` that exposes scraping tools (`web_scrape`, `screenshot`, etc.) plus a managed bridge into Cloud Browser sessions. Its Cloud Browser tools are prefixed (`action_*`, `webmcp_{session}_*`, `browser_*`) because it muxes many sessions over one connection.

The Cloud Browser MCP endpoint documented here is different:

 |  | This endpoint | Scrapfly MCP Server |
|---|---|---|
| Connection | Per browser session | Shared, account-scoped |
| URL | `mcp_endpoint` from the allocation | `https://mcp.scrapfly.io/...` |
| Tool names | Flat: `click`, `fill`, `navigate_page`, … | Prefixed: `action_clickOn`, `webmcp_{session}_*`, `browser_*` |
| Surface | One browser only | Scraping + browser tools through one MCP transport |
| Use when | You want a single-session agent loop | You want one connection for scraping *and* browser automation |

## Compatibility

 The server implements the MCP streamable-HTTP transport. Any client that speaks that transport works. Verified with:

- Python `mcp` SDK (`streamablehttp_client`)
- TypeScript `@modelcontextprotocol/sdk` (`StreamableHTTPClientTransport`)
- Claude Desktop / Cursor (point them at the `mcp_endpoint` URL)

 Scrapium ships Chrome with the `DevToolsWebMCPSupport` and `WebMCPTesting` feature flags enabled, which is what makes the `WebMCP.*` CDP domain. And therefore the `list_webmcp_tools` / `execute_webmcp_tool` bridge. Functional on any page.

 **WebMCP is a moving target.** [WebMCP](https://developer.chrome.com/blog/webmcp-epp) is a proposed standard developed by Google and Microsoft under the [W3C Web Machine Learning Community Group](https://www.w3.org/groups/cg/webmachinelearning/). The bridge tools may change as the spec evolves. The non-bridge tools (click, fill, navigate, …) are stable.

## Connection Parameters

 | Parameter | Required | Default | Description |
|---|---|---|---|
| `enable_mcp` | No | `false` | When `true`, the session boots with Chromium's WebMCP feature flags and the `mcp_endpoint` field is populated on the allocation response. Off by default so sessions that don't need MCP pay no overhead. |

 See the full list of Cloud Browser parameters in the [Getting Started](https://scrapfly.io/docs/cloud-browser-api/getting-started#connection-parameters) guide.
