Build workflows

Browser sessions

Let an agent drive a headless browser a page at a time, clicking, typing and reading as it goes, and keep a video and a Playwright trace of what it did.

browser.* opens a headless browser that an agent drives one action at a time: it reads the page, clicks or types, and reads the page again. Use it for what screenshots can't do, such as working through a form, checking that a sign-up flow still reaches its last page, or finding something behind a search box.

The browser tools are available to every account with nothing to set up, under the browser. prefix. They are meant for an agent's tools list, and they also work in tool steps.

How an agent sees the page

Every action answers with the page as an accessibility snapshot: its headings, links, buttons and fields as a tree, much as a screen reader would read them. Each element the agent can act on carries a ref:

- heading "Sign up" [level=1] [ref=e2]
- textbox "Email" [ref=e5]
- button "Create account" [ref=e6]

The next action names that ref: browser.fill with ref: e5, then browser.click with ref: e6. Refs belong to the snapshot they came from, so an agent always acts on the latest one. An element with no ref can be named with a Playwright selector such as text=Sign in instead.

steps:
  - key: signup
    kind: agent
    model: balanced
    tools: [ browser.* ]
    prompt: |
      Open https://example.com/signup with record_video and trace. Sign up as
      test+{{ run.number }}@example.com and report whether you reach the welcome page.
      Close the session when you are done.

The tools

Tool What it does
browser.open Opens a session, optionally on a url, with a device (desktop, laptop, tablet, mobile, android or a size such as 1024x768). record_video and trace turn on the recordings.
browser.navigate Loads a url, or goes back, forward or reload.
browser.click, fill, select, check, press Act on an element by ref. fill can submit with Enter; press takes a key such as Enter or Control+A.
browser.scroll, wait Scroll by screens or to an element; wait for text to appear or go, or for a moment.
browser.snapshot Reads the page again without doing anything.
browser.tab Switches tabs, or closes the current one. A link that opens a new tab moves the session to it.
browser.screenshot Keeps a screenshot in the Screenshots gallery, in one set per session.
browser.export_trace Saves the trace so far without closing the session.
browser.close Closes the session and collects its recordings.
browser.read, browser.list Find sessions and their recordings later.

Inside a run, a tool called without a session uses the run's latest open one, so an agent rarely needs to name it.

Video and traces

record_video keeps a video of every tab the session opened. trace keeps a Playwright trace: each action, the page's DOM before and after it, a filmstrip of screenshots, and every network request. Open one from the session's page in Browser sessions and it loads in Playwright's trace viewer, served by Murmurator itself, so the trace never leaves the account.

Both are written as the session goes and collected when it closes, whether the agent closed it, the run finished, or it sat idle. browser.close returns links to them. A trace can also be cut partway through with browser.export_trace; each export holds what happened since the one before.

A trace holds whatever the pages showed and sent, including what was typed into them. Treat traces like the pages themselves.

Limits

  • An account can have 2 sessions open at once.
  • A session left idle for ten minutes is closed, and one is closed after 30 minutes whatever it is doing. Its recordings are kept either way.
  • An action waits up to 15 seconds for its element by default, and up to a minute with timeout_ms.
  • A trace over 100MB is dropped rather than kept.
  • Recordings are kept for as long as your plan keeps run history.

What a page can reach

Pages load from the public internet in a fresh browser that is signed out, through the same gateway as screenshots. Private, loopback and link-local addresses are refused, and so is any port other than 80 and 443. A page that is refused fails the action; anything else a page tries to load from one is left out, and listed under the session's refused addresses.

Over MCP

Your own agents can use the same tools over MCP as browser__open, browser__click and the rest. Over MCP, pass the session that browser__open returned to every other call. Sessions opened this way are recorded against the person the token belongs to.