Integrations
Playwright
No Morrow-specific SDK — any stock Playwright client attaches straight to a profile's persistent browser.
Connect
import { firefox } from "playwright";
const browser = await firefox.connect(
"ws://localhost:3000/playwright/research-eu?token=" + process.env.MORROW_API_KEY
);
const context = browser.contexts()[0]; // the profile's persistent context
const page = await context.newPage();
await page.goto("https://example.com");The token is your MORROW_API_KEY, passed as a query parameter because the WebSocket handshake has no header for it.
contexts()[0] is the persistent context
Unlike a fresh Playwright launch, browser.contexts()[0] is not empty — it's the profile's real persistent context, with whatever cookies, storage, and logins already exist on disk. Open pages, navigate, and interact with it exactly like any other Playwright context; everything you do lands in the profile and is still there tomorrow.
Lazy start
You don't need to call POST /api/v1/profiles/:name/start first — firefox.connect(...) auto-starts the target profile if it's stopped, then attaches to its running browser.
Version pinning
1.60.x. A version mismatch between client and server Playwright is a common source of connection errors with remote browser protocols; pin your dependency accordingly.Works alongside the other surfaces
A page you open over Playwright is the same page the live viewer shows, and the same context an MCP tool call or a scrape request with profile set will act on.