cdpfleet Pre-launch Get early access

cdpfleet / AI agents

For AI agents

Give your AI a real browser.

Let Claude, ChatGPT, Gemini, Cursor or your own agent browse with a real browser on our fleet: the browser and exit country the site should see, a person who can step in for a captcha or a login, and a video of what the agent did.

  • 1 URLto connect an assistant
  • 12real desktop browsers
  • OAuthno key to paste

Connect an assistant: one URL

Add https://cdpfleet.com/mcp as an MCP server or connector in Claude, ChatGPT, Gemini, Claude Code, Codex or Cursor. When the assistant opens a cdpfleet window, sign in and click Allow (OAuth) — nothing to install or copy, and you can disconnect it any time in the dashboard. Scripts and agents without OAuth send an API key as Authorization: Bearer. Step by step for each app: MCP setup.

The assistant then has tools to launch a browser (any of the fleet's browsers, headful by default, with a residential exit by country or your own proxy), navigate, read the page as an accessibility snapshot, click and type, take screenshots, and hand the browser to a person. Each MCP connection gets its own browser; one left idle for 30 minutes is closed.

claude mcp add --transport http cdpfleet https://cdpfleet.com/mcp

Coding agents: skill.md

An AI coding agent writing a scraper or a test doesn't need MCP — it needs the rules. /skill.md is one page for it: how to launch, connect and close, the browser list from the live fleet, proxies, limits, errors and the gotchas. Point the agent at it, or at /llms.txt for the full index of docs, cases and comparisons.

Read https://cdpfleet.com/skill.md, then write a Playwright script that opens news.ycombinator.com
through a cdpfleet browser and prints the top 5 story titles. My API key is in CDPFLEET_API_KEY.

What a real browser gives an agent

Headful, real builds

Real Chrome, Edge, Brave and Firefox-based browsers with a display, without the headless tells sites check for (case 16). Headful takes 2 threads, headless 1.

The browsers →

A person can take over

A captcha, a login or a one-time code: the agent hands the browser to a person in live view and waits, then carries on in the same page.

Live view →

A video of every run

Headful sessions are recorded: replay what the agent saw and did, step by step — the first 15 minutes of each session free on paid plans.

Recordings →

Stays logged in

A persistent profile keeps cookies, localStorage and IndexedDB between sessions: log in once by hand, and the agent starts signed in next time.

Profiles →

Long runs and logins from code

  • Stay logged in: launch with "profile": "agent-login" and work in browser.contexts()[0] — that context is saved when the session ends (case 40). On Camoufox the profile also keeps the device fingerprint (case 49).
  • Hand over and take back: a start_url session can be driven by a person in live view while your code joins later and finds the same page (case 58).
  • Find out what went wrong: fetch the recording of a failed run by its session id (case 41).
  • Survive a restart: on dedicated threads keep_alive keeps the browser running when the agent disconnects; reconnect to the same wsUrl within inactivity_timeout (up to 24 h) and its pages are where they were.
  • Feed the model less: an accessibility snapshot is a fraction of the page's HTML (case 32).
Headful Chrome that keeps the agent's login between sessions
// npm install [email protected]
// Browsers run on cdpfleet, so no `npx playwright install` is needed.
import { chromium } from 'playwright';

const KEY = process.env.CDPFLEET_API_KEY;

// 1. Launch the browser
const res = await fetch('https://starter.cdpfleet.com/chrome/session', {
  method: 'POST',
  headers: { 'x-api-key': KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    proxy: 'http://user:[email protected]:8080',
    headless: false,
    profile: 'agent-login',
  }),
});
if (!res.ok) throw new Error(`launch failed: ${res.status} ${await res.text()}`);
const { wsUrl } = await res.json();

// 2. Connect and drive it
const browser = await chromium.connect(wsUrl, { headers: { 'x-api-key': KEY } });
const context = browser.contexts()[0]; // the saved profile — a new context isn't saved
const page = context.pages()[0] ?? await context.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close(); // ends the session and stops billing

Try it free, and when not to

  • Try it on the Community plan: 2 threads, 60 browser-minutes each a day, the MCP server included. It has no recordings, profiles or keep_alive, and request data may be used to improve the service — don't sign in to real accounts on it.
  • Not for every page: if a plain HTTP request returns the data, an agent doesn't need a browser at all (fetch first).
  • Not a crawler farm: an MCP connection drives one browser at a time. For thousands of pages, have the agent write code that runs many sessions in parallel (worker pool).