Skip to main content
Glama

A unified dev-loop tool: it drives a browser and your dev server, pushing both sides into one timestamped buffer so you can correlate a browser console error with the backend stack trace from the same moment. It runs two ways from a shared core:

  • Headless (stdio) — drives Chrome via Puppeteer, served over stdio. The lightweight mode Claude Code spawns per session. Run devloop-mcp daemon to instead serve one shared, long-running instance over HTTP/SSE that many agents/sessions connect to (see Daemon mode).

  • Cockpit (Electron) — a single desktop window: tabbed browser panes (embedded WebContentsViews driven via CDP) with a browser bar (back/forward/reload + address) beside a collapsible side panel that toggles between logs and a repro builder. Project picker, auto-navigate, pop-out targets. The renderer is React 19 + Tailwind v4 + Radix + lucide-react. Serves the same tools over HTTP.

Because every event (browser console/network/page-errors and server stdout/stderr) shares one monotonic clock, get_logs_around / repro return a correlated, cross-source slice of the timeline.

Native targets — Expo / React Native (iOS + Android)

The cockpit also drives Expo/React Native projects, not just web. Open a native project and you get one pane with a Web · iOS · Android target switcher, a bundler toggle (Metro) separate from a Build button (expo run:ios / expo run:android, with @expo/fingerprint staleness detection), and:

  • JS console + errors over CDP via Metro's Hermes inspector (both platforms) — with source-mapped stacks (your bundled index.bundle:1:… resolves to original .tsx).

  • RN network capture — an injected XMLHttpRequest hook turns the app's fetch/XHR traffic into the same network timeline rows as web (so get_network / export_har / the network chip work for native too).

  • Native device logs merged onto the timeline as a native source — iOS simctl log stream, Android logcat.

  • A live, interactive device embedded in the pane — iOS via serve-sim (MJPEG, tap/scroll/type), Android via a polled screencap mirror (~2fps) with click→tap + key input. Screenshots on both.

  • Agent-drivable interactionsbrowser_snapshot reads the native accessibility tree (iOS via idb's UIKit a11y tree; Android via uiautomator dump) and browser_click/type/scroll/press drive the device by an element's pt:x,y ref (from the snapshot) or its label — replayable through repro, openable over MCP via native_open / native_build. The same agent tools as web, mapped onto native.

All of it lands on the same correlated timeline, app-scoped — the web dev-loop experience, for a native app. (macOS + Apple Silicon for the embedded iOS simulator; Android works wherever the Android SDK + an emulator do.)

iOS interactions need idb: brew install facebook/fb/idb-companion and pipx install fb-idb (use Python <3.14 — newer Python breaks fb-idb). Android interactions need the Android SDK platform-tools (adb) + a booted emulator. The cockpit's Settings → native readiness runs a per-platform preflight (iOS: idb · companion · booted sim; Android: adb · booted device) and shows the exact fix for anything missing; observation (logs/screenshots) works without the interaction tooling.

serve-sim is vendored into the cockpit and run via Electron's own Node, so the embedded simulator works out of the box — offline, no bun/node/npx or first-run fetch. (Running from source uses the copy in node_modules instead.)

Architecture

Three transports expose one shared core, which drives one of several substrates (a real browser, or — in the cockpit — a native device). Everything pushes onto a single timestamped timeline.

%%{init: {"flowchart": {"wrappingWidth": 700}}}%%
flowchart TD
  clients["<b>MCP clients</b><br/>Claude Code · agents · mcporter"]
  clients --> stdio & daemon & cockpit

  stdio["<b>stdio</b><br/><i>spawned per session</i>"]
  daemon["<b>daemon</b><br/><i>HTTP/SSE · one shared instance</i>"]
  cockpit["<b>cockpit</b><br/><i>HTTP/SSE · Electron app</i>"]

  stdio --> mcp
  daemon --> mcp
  cockpit --> mcp
  mcp(["<b>MCP Server</b><br/><i>stdio transport, or HTTP/SSE for the daemon + cockpit</i>"])
  mcp --> core

  core["<b>shared core</b> · <i>transport- and substrate-agnostic</i><br/>the MCP tool layer + one unified, correlated timeline"]

  core --> iface(["<b>IBrowserController · IBrowserManager · ITargetController</b><br/><i>capability-gated by the active target</i>"])
  iface --> pup & elec & rn

  pup["<b>web</b> · Puppeteer / Chrome<br/><i>stdio + daemon</i>"]
  elec["<b>web</b> · Electron CDP panes<br/><i>cockpit · per-project partitions</i>"]
  rn["<b>native</b> · React Native (Hermes)<br/><i>JS + network over Metro CDP</i>"]

  rn -->|"idb / adb"| nd["<b>NativeDriver</b><br/>iOS idb · Android adb<br/>taps · snapshot · screens · logs"]

The tool layer never knows what's behind it — Puppeteer or Electron, stdio or HTTP, web page or native app. It's wired once at startup. The browser sits behind a single IBrowserController interface; the cockpit's pane manager implements the richer IBrowserManager (multiple panes, delegating browser_* to the active one — or to the native controller when an iOS/Android target is open). A capability layer gates tools by the active target, so an agent gets a clear message instead of a substrate error.

stdout is reserved for the MCP protocol in stdio mode; all human-facing output goes to stderr.

The layers

  • Transports — three entrypoints over two protocols: stdio (one server per session) and HTTP/SSE (the long-running daemon, and the cockpit). All build the same MCP server bound to the tool layer; only the HTTP transports are multi-client (each connecting client gets its own session, one shared backend).

  • Shared core — the tool layer (the MCP tools + a capability-gated dispatcher) over one unified, correlated timeline (server output, browser console/network/errors, native logs), backed by a separate full-capture network ring. The cross-cutting features the tools expose — a project registry, error diagnostics, source-map resolution, HAR export, and bug-report bundles — live here too.

  • Browser substrates — a shared controller interface with two web implementations (Puppeteer/Chrome for headless; Electron WebContentsView panes over CDP in the cockpit) and a native one (React Native over Hermes/Metro). Shared page-action + accessibility-snapshot logic and device/throttle emulation sit above them.

  • Native targets — an RN controller (JS/errors/network over Metro CDP) delegates taps + snapshots to a NativeDriver (idb on iOS, adb on Android); native logs (simctl / logcat), screenshots + live mirrors, build orchestration (expo run), and a readiness preflight round it out.

  • State & isolation — an on-disk registry (projects / session / panes), per-project session partitions, and Chrome-extension management.

  • Cockpit (Electron) — the desktop shell: a pane manager (per-project partitions, native routing), the React UI (timeline, browser bar, repro builder, target switch, Android mirror), the vendored serve-sim iOS mirror, the in-store "Add to Devloop" injection, and the in-app updater.

Related MCP server: chrome-devtools-mcp

Install

Headless MCP (stdio) — no clone needed, register it with Claude Code:

claude mcp add devloop --scope user -- npx -y devloop-mcp

(Published as devloop-mcp on npm; Puppeteer fetches Chromium on first install.)

Cockpit (desktop app) — grab the installer for your OS from Releases (.dmg / .exe / .AppImage). macOS ships both Apple Silicon (arm64) and Intel (x64) builds. The app checks GitHub for a newer release on launch and prompts before downloading or installing — or trigger it yourself from settings → updates → check for updates.

From source (dev) — requires bun:

bun install
bun run app          # build + launch the Electron cockpit
bun run start        # or run the stdio MCP directly

Use it from your coding agent

Once it's registered, drop this into your CLAUDE.md (or any agent's rules file) so the agent drives features through Devloop and verifies them live instead of reasoning from the code alone:

## Devloop — use it for any web/mobile feature work

When you build, test, or debug a feature that runs in a **browser** or an **Expo /
React Native** app, drive it through **devloop** instead of reasoning from the code
alone. It puts the dev-server logs and the live browser/device on one correlated
timeline, so you can see what actually happened.

- **Start the loop:** `dev_start` (auto-detects the dev command), then
  `browser_navigate` to the page — or `native_open` for an iOS/Android target.
- **Act, then verify — don't assume:** after a change, reproduce it with `repro`
  (a navigate/click/type sequence) and read the result. Never claim a fix works
  without exercising it in the running app.
- **Find/target elements** with `browser_snapshot` (returns clickable `ref`
  selectors) — prefer it over screenshots.
- **When something breaks:** `diagnose` first (groups errors + failed requests),
  then `get_logs_around` a timestamp to line up the browser console error with the
  matching server stack trace from the same moment. `get_network` / `export_har`
  for request detail.
- **Definition of done:** the feature is verified live in devloop — no console or
  page errors, the expected network calls succeeded, the UI reflects the change —
  not just "the code looks right."
- **Setup stays yours:** if a native build needs a toolchain that isn't installed,
  devloop tells you exactly what's missing and the command to fix it — it
  **diagnoses, it never installs or touches your toolchain.** Run the fix, then rebuild.

Register once: `claude mcp add devloop --scope user -- npx -y devloop-mcp`

Tools (46)

Dev server — runtime, no per-project registration needed

  • dev_start({ project?, cmd?, cwd? }) — start a dev server and tee its logs. Specify it three ways: a saved registry project; explicit cmd+cwd; or neither (cwd defaults to the server's dir, cmd auto-detected from package.json scripts: dev/develop/web/start/serve).

  • dev_stop() — stop it. Kills the whole process group (so next dev/metro grandchildren die too).

  • dev_status() — running?, plus cmd/cwd/pid.

Native targets — Expo/React Native (cockpit only; needs Electron + a simulator/emulator)

  • native_open({ platform }) — open the iOS simulator or Android device mirror for the active pane; browser_* then drive the native app (idb/adb) and JS + native logs stream to the timeline. Returns ok:false with a reason if the device/tooling isn't ready.

  • native_close() — back to the pane's web content.

  • native_build({ platform, cwd? })expo run:ios / expo run:android, streamed to the timeline (cwd defaults to the active pane's project). Android returns a toolchain checklist instead of building if the SDK/JDK isn't set up.

  • native_doctor() — re-check native readiness without building or opening: iOS + Android interactions + the Android build toolchain, each a ✓/✗ checklist with the fix for anything missing. Run it after installing a missing tool to confirm it's resolved.

  • In headless stdio/daemon mode these report that the cockpit is required (Puppeteer is web-only).

Browser control — act on the active pane

  • browser_navigate({ url })

  • browser_back() · browser_forward() · browser_reload({ hard? }) — history nav + reload (the browser bar's ←/→/⟲; hard ignores cache).

  • browser_screenshot({ fullPage? }) → PNG image

  • browser_click({ selector })

  • browser_type({ selector, text })

  • browser_hover({ selector }) · browser_scroll({ selector? | x?, y? }) · browser_select({ selector, value }) · browser_press({ key, selector? }) — keys like Enter/Escape/Tab/ArrowDown.

  • browser_wait_for_idle({ idleMs?, timeoutMs? }) — wait until network settles.

  • browser_clear_storage({ allOrigins? }) — clear cookies / localStorage / IndexedDB / cache / service workers for the current origin (or the whole session) — log out / test a fresh user.

  • browser_emulate({ device? | width?, height?, mobile?, deviceScaleFactor?, userAgent?, reset? }) — emulate a device/viewport (device: iphone/ipad/pixel, or custom; reset → desktop).

  • browser_throttle({ profile }) — network conditions: slow-3g / fast-3g / offline / none.

  • browser_eval({ expression }) — runs in page context (not blocked by CSP)

  • browser_snapshot() — structured page snapshot: url, title, and interactive/landmark elements (role, accessible name, value/state, heading level) each with a CSS selector ref usable by browser_click/browser_type. Prefer this over a screenshot to find/target elements reliably.

  • browser_wait_for({ selector?, text?, timeoutMs? }) — wait until a selector appears or text is present (after a navigation/async render). Returns { ok, waitedMs }.

Logs & correlation

  • get_logs({ source?, stream?, grep?, app?, sinceSeq?, limit? }) — unified tail. source is server|browser; stream is stdout/stderr/console/network/pageerror. app scopes to one project's logs — it matches a pane's label (project name) or id (see pane_list) and filters both that pane's server and browser logs, regardless of which pane is active. Pass the last seq as sinceSeq to tail incrementally.

  • get_logs_around({ ts, windowMs?, source?, app? })the correlation tool: all events within ±windowMs of a timestamp, time-ordered across both sources (optionally scoped to one app).

  • The timeline shows network events that are failures or status ≥ DEVLOOP_NET_THRESHOLD (set it to 0 to surface everything inline), carrying rich detail on all substrates (Puppeteer / CDP / React Native): method, status, resource type, mime, duration, request + response headers, and capped request/response bodies.

  • get_network({ grep?, app?, limit? }) — every request from the full capture ring, independent of the threshold (vs get_logs, which shows only the curated timeline). Use it when a fast 200 you care about isn't on the timeline.

  • export_har({ app? }) — export the full network ring as a HAR 1.2 document (import into Chrome DevTools / Charles); complete regardless of the threshold. Scope to one app if you like.

  • diagnose({ windowMs?, app? })triage what's broken right now: groups/dedupes repeated errors (console / page / server) with counts, lists failed/4xx-5xx network requests, and returns a one-line summary. Start here before digging through get_logs.

  • Page errors carry a resolvedStack — minified browser stack traces are mapped back to original source via the bundle's source map (the browser only de-minifies in its DevTools UI; error.stack stays compiled, so we resolve it for you). On the entry's detail.

  • export_bundle({ app?, windowMs? }) — a shareable bug-report bundle (JSON): diagnose summary + timeline + screenshots + HAR + repro. The cockpit's report button saves it as a self-contained HTML page.

  • clear_logs() — reset before reproducing an issue.

  • repro({ actions | action, waitFor?, settleMs?, stepSettleMs?, idleMs?, timeoutMs?, continueOnError?, clear? })reproduce-and-correlate: clears the buffer, performs one action or a sequence, waits, and returns everything that happened on both sides across the sequence — with per-step results (steps[]), a byStream count, and a pre-filtered errors list.

    • actions: [{kind, ...}] — kinds: navigate/click/type/hover/scroll/select/press/eval/wait/none. action (singular) = one-step convenience.

    • Waits stepSettleMs (default 300) between steps, settleMs (default 1000) after the last. waitFor: "networkidle" waits until no network activity for idleMs (default 500) up to timeoutMs (default 10000) — use it for slow/streaming responses (Expo's first web bundle takes ~12s). On timeout you still get what landed, with a waitNote.

    • continueOnError (default false) — otherwise stops at the failing step (stoppedAtStep).

Project registry — saved projects, persisted to ~/.devloop/projects.json

  • project_list() — list saved projects (name, cwd, cmd, url, steps).

  • project_add({ name, cwd, cmd?, url?, steps? }) — save/replace a project (incl. a saved repro steps sequence), so you can dev_start({ project }) by name.

  • project_remove({ name }).

Panes — multi-target (cockpit only; stdio mode is single-pane and reports so)

  • pane_list() — each pane: { id, url, active, popped }. The active pane is what browser_*/repro target; events are tagged with their pane id.

  • pane_new({ url? }) — open a new pane and make it active.

  • pane_select({ id }) — make a pane active.

  • pane_close({ id }).

  • pane_pop({ id }) — detach a pane into its own standalone window (side-by-side targets).

  • pane_set_label({ id, label }) — rename a pane (same as double-clicking the tab).

Extensions — Chrome extension management (cockpit only)

  • ext_list() — installed extensions: { id, name, version, enabled }.

  • ext_install({ idOrUrl }) — install by Chrome Web Store id/URL.

  • ext_remove({ id }) — uninstall.

  • ext_set_enabled({ id, enabled }) — enable/disable without uninstalling.

Console arguments

console.log(obj) is captured with arguments resolved to real values (e.g. [log] user {"id":7}), not JSHandle@object. The Electron substrate renders them synchronously from CDP previews; the Puppeteer substrate uses a reserve-then-fill pattern (stamp seq/ts synchronously at arrival, patch resolved args in afterward) so ordering matches emit order and interleaves correctly with server logs.

Headless mode (stdio)

Register once, at user scope — works for every project:

claude mcp add devloop --scope user -- npx -y devloop-mcp

Then, in any project: "dev_start and repro a navigate to /projects". dev_start defaults cwd to the project you're in and auto-detects the command.

Var

Default

Meaning

DEVLOOP_HEADLESS

false

"true" runs Chrome headless; default headful so you can watch.

DEVLOOP_CHROME_PATH

(bundled)

Explicit Chrome executable path.

DEVLOOP_NET_THRESHOLD

400

Log network responses with status >= this (failures always logged).

DEVLOOP_ACTION_TIMEOUT

10000

Cap (ms) on interactions — a wedged page fails fast instead of hanging.

DEVLOOP_NAV_TIMEOUT

30000

Cap (ms) on navigations.

DEVLOOP_LOG_CAPACITY

5000

Max buffered events.

DEVLOOP_NET_RING

3000

Max requests held in the full-capture network ring (get_network / export_har), independent of DEVLOOP_NET_THRESHOLD.

DEVLOOP_DEV_CMD / DEVLOOP_DEV_CWD

(none)

Optional dev-server auto-start on boot (normally use dev_start).

DEVLOOP_HOME

~/.devloop

Registry location.

Daemon mode (shared HTTP/SSE)

Instead of every agent/session spawning its own stdio server (its own browser + timeline), run one long-running daemon they all connect to over HTTP/SSE — many clients, one Devloop instance (one browser, one dev server, one correlated timeline):

devloop-mcp daemon                 # headless; serves MCP at http://localhost:7333/mcp
# then point any number of MCP clients at it:
claude mcp add --transport http devloop http://localhost:7333/mcp

Same backend + env vars as stdio (defaults headless; set DEVLOOP_HEADLESS=false to watch), and it auto-picks a free port from DEVLOOP_HTTP_PORT (default 7333). Each client gets its own MCP session but shares the same backend, so one agent's dev_start / navigation shows up on another's get_logs. (The Electron cockpit serves the very same HTTP transport — the daemon is just the headless version of it.)

Manage the daemon's lifecycle:

devloop-mcp daemon --status        # is one running? (pid + url)
devloop-mcp daemon --stop          # SIGTERM the running daemon
DEVLOOP_DAEMON_IDLE_MS=60000 devloop-mcp daemon   # auto-exit 60s after the last client disconnects

Shared mode — auto-connect from stdio (no separate daemon step)

Don't want to manage a daemon by hand? Launch the stdio server in shared mode and it will bridge to a daemon automatically — connecting to a running one, or spawning + detaching one if none exists — instead of starting its own browser. So every session transparently shares one browser/timeline:

claude mcp add devloop --scope user -- npx -y devloop-mcp --shared
# or set DEVLOOP_DAEMON=1 in the MCP server env

The stdio process becomes a thin proxy (it speaks stdio to the client, forwarding tools to the daemon over HTTP). The daemon advertises itself in $DEVLOOP_HOME/daemon.json so other sessions find it. If anything goes wrong (daemon won't start, etc.) it falls back to a normal local instance, so a session never just dies. Without --shared / DEVLOOP_DAEMON=1, behavior is unchanged: one browser per session.

When MCP is blocked (enterprise sandbox) — drive Devloop via mcporter

Some sandboxed/enterprise setups don't let an agent register or spawn MCP servers (or block the MCP transport) but do allow running shell commands. mcporter bridges that gap: it calls any MCP server's tools as plain CLI commands, so the agent invokes Devloop through Bash instead of an MCP client.

The robust pattern is daemon + mcporter over HTTP — run one Devloop daemon (once, outside or alongside the sandbox), then call its tools as shell commands:

devloop-mcp daemon                                          # one shared instance on :7333

# point mcporter at it ad-hoc (no config); --allow-http since it's localhost cleartext
npx mcporter list  --allow-http --http-url http://localhost:7333/mcp --name devloop
npx mcporter call  --allow-http --http-url http://localhost:7333/mcp 'devloop.dev_start(cwd: "/repo")'
npx mcporter call  --allow-http --http-url http://localhost:7333/mcp 'devloop.browser_navigate(url: "http://localhost:3000")'
npx mcporter call  --allow-http --http-url http://localhost:7333/mcp 'devloop.diagnose()'

Or skip the daemon and let mcporter spawn the stdio server per call (if process spawning is allowed):

npx mcporter list --stdio "npx devloop-mcp" --name devloop
npx mcporter call --stdio "npx devloop-mcp" 'devloop.get_logs(limit: 50)'

Notes:

  • Persist it so you don't repeat the descriptor: add Devloop to ~/.mcporter/mcporter.json (or pass --persist). mcporter also auto-imports servers already configured in Claude Code/Desktop, Cursor, Codex, etc. — so a prior claude mcp add devloop … is picked up automatically, and you can just npx mcporter call devloop.<tool> ….

  • npx mcporter list devloop --schema prints every tool with TypeScript-style signatures — handy for the agent to discover args.

  • For a fully self-contained CLI, npx mcporter generate-cli devloop emits a standalone binary; mcporter serve re-exposes servers as one bridged endpoint. See the mcporter docs.

(Exact ad-hoc flags can vary by mcporter version — npx mcporter --help is authoritative.)

Agent skill: skills/devloop/SKILL.md packages this as an installable Agent Skill — drop it in (cp -r skills/devloop ~/.claude/skills/, or into a project's .claude/skills/) and the agent knows to drive Devloop over mcporter when MCP is blocked, with the daemon setup + tool recipes built in.

Cockpit mode (Electron)

bun run app          # build + launch the cockpit
bun run app:selftest # headless integration test (no visible windows)

One window (React 19 + Tailwind v4 with @theme tokens + Radix Dialog/Tooltip + lucide-react icons), laid out as:

  • Top bar — the pane tabs, then the active pane's dev controls + window toggles:

    • dev controls (act on the active pane): a status chip (● project green when running, ✗ exited (code N) red on a non-zero exit, else dev: stopped/not configured), ▶/⏹ start-stop the dev server, restart it (Power), 📷 screenshot the pane into the timeline.

    • settings · pop out the active pane into its own window.

    • Tabs are auto-named from the project (package.json name, else folder basename), carry a green running dot when that pane's server is up, show when popped; click to switch (the timeline follows the active pane), double-click to rename, × to close, + pane to add. Live-updates whether panes change from the UI or from Claude.

  • Browser bar (above the pane) — ←/→ back/forward (disabled when there's no history), reload, hard-reload (ignore cache), ⌫ clear site data (cookies/localStorage + reload), and an address bar showing the active pane's live URL — it follows link clicks / SPA route changes (the manager listens to did-navigate); accepts a bare port (3000http://localhost:3000) or any http(s):// URL; Enter navigates (⌘L focuses).

  • Browser area — the active pane: a real Chromium WebContentsView driven via CDP. Other panes keep running in the background (their logs keep flowing); the active one is positioned over this region and reflows when you collapse panels or resize.

  • Settings (behind , collapsed by default so the top bar stays clean) — labeled rows:

    • project — dropdown of saved projects; picking one opens it immediately (fills cmd/cwd/url + repro steps, then dev-starts + navigates). 💾 save snapshots the active pane as a project named by its tab label (rename on the tab).

    • devcmd (blank = auto-detect) + 📁 folder picker + cwd. Auto-saved to the active pane on blur (and on folder pick) — no separate "apply" button; after that the top-bar is pre-wired.

    • ext — load Chrome extensions into the panes (React/Redux DevTools, or your own under dev): install by Chrome Web Store id/URL, or 📁 load an unpacked folder. Extensions persist and reload on launch, and live in the panes' session (isolated from the cockpit UI). Powered by electron-chrome-web-store; Electron's extension API is partial (MV3 mostly works; some chrome.* gaps).

  • Side panel (collapsible) — a segmented logs / repro control:

    • logs — the live event list (per-source coloring, timestamps, pane tags, click-to-expand long rows, screenshot thumbnails → Radix-Dialog lightbox). Network rows are status-tier colored (2xx/3xx/4xx/5xx) and expand to show method/status/duration + request/response headers and bodies. Sticky filter bar: substring filter + chips (server/console/network/errors/repro), a ↓ latest pill, HAR export, and clear. Always scoped to the active pane.

    • repro — the repro builder (+ step / pick / run); pick lets you click an element in the page to capture a stable selector straight into a click step; results land in the logs timeline (it auto-switches there) with per-step ✓/✗ and the correlated error list.

    • Collapse via the in the panel header; re-expand via a small hover handle on the right edge. Popping the active pane into its own window fills the freed space with the timeline. Drag the divider to resize.

  • Pop-out window (right of the URL bar) detaches the active pane into its own browser window with its own bar (back/forward/reload/hard-reload/address/screenshot), driving that pane by id; the live URL tracks navigations and ⌘R reloads the page. Closing it re-docks the pane.

  • Keyboard: ⌘L address bar · ⌘R/⌘⇧R reload/hard-reload · ⌘K clear · ⌘B toggle panel · ⌘, settings · ⌘1–9 switch panes.

Per-pane projects: each pane has its own dev server and config (cmd/cwd) — so different panes run different projects (on different ports) at once, and the controls act on whichever pane is active.

Auto-navigate: on dev-start (or opening a project), the cockpit watches that pane's server output and opens the first http://localhost:PORT it announces in the pane — no port-typing.

Persistence & restore: open panes (each pane's URL, project label, and dev config) are saved to ~/.devloop/panes.json and restored on relaunch; the form state (repro steps + selected project) is saved to ~/.devloop/session.json. Restore does not assume a dev server is running — a pane whose saved URL is a dev (localhost) URL comes back as a "press ▶ to start" placeholder (its real URL preserved), and hitting starts the server and auto-navigates.

The cockpit serves the same tools over MCP-over-HTTP (stateful sessions). It auto-picks a free port starting at DEVLOOP_HTTP_PORT (default 7333) and logs the URL. Point Claude at the running cockpit:

claude mcp add --transport http devloop-cockpit http://localhost:7333/mcp

(Only connected while bun run app is running.)

Clean teardown: closing the window (or quit / SIGTERM / SIGINT) tears down everything — the dev-server process group, all browser panes, and the HTTP server — with a hard-exit fallback if graceful quit stalls. And the dev server runs under a parent-pid watchdog, so even a crash/SIGKILL of the cockpit can't orphan it (no next dev left holding :3000).

Cockpit-only env: DEVLOOP_HTTP_PORT (default 7333), plus the shared DEVLOOP_NET_THRESHOLD / DEVLOOP_ACTION_TIMEOUT / DEVLOOP_LOG_CAPACITY / DEVLOOP_HOME.

Project layout

src/
  logBuffer.ts          source-aware, timestamped ring buffer (+ live onPush)
  devServer.ts          runtime dev-server manager (process-group kill) + detectDevCommand
  registry.ts           persisted project registry
  browserController.ts  IBrowserController + IBrowserManager interfaces
  browser.ts            PuppeteerBrowserController (headless/stdio)
  electronBrowser.ts    ElectronBrowserController (cockpit; CDP debugger)
  toolLayer.ts          TOOLS + handleTool, bound via configureTools(deps)
  index.ts              stdio entry (Puppeteer + stdio)
cockpit/
  main.ts               Electron main: windows, BrowserManager, MCP-over-HTTP, lifecycle
  browserManager.ts     multi-pane manager (IBrowserManager)
  preload.ts            contextBridge IPC surface
  renderer/             React UI — main.tsx (app) + global.d.ts (IPC types) +
                        styles.css (Tailwind v4 @theme) + index.html
  build.ts              Bun build for main/preload/renderer + Tailwind CLI step

Test & checks

CI gates every push and PR — lint/format, types, unit, smoke, daemon, mcporter CLI, the cockpit selftest, and the GUI end-to-end. Run the whole gate locally with bun run test:all, or piece by piece:

bun run check           # Biome lint + format check (the CI gate; `bun run format` to auto-fix)
bun run typecheck       # tsc across core + renderer + gui
bun test                # unit tests (pure logic)
bun run test-smoke.ts   # headless Puppeteer: structured args, networkidle, repro sequence, abort
bun run test:daemon     # HTTP/SSE daemon: two clients sharing one backend
bun run test:mcporter   # the mcporter CLI path: `mcporter call devloop.<tool>` over HTTP
bun run app:selftest    # headless Electron: substrate→buffer, tool layer, MCP-over-HTTP,
                        # renderer IPC, registry, multi-target panes + pop-out, auto-navigate,
                        # derived project name, per-pane dev (server-log tagging), app-scoped
                        # get_logs, inline repro builder, pane persistence/restore, teardown
bun run mcp-drive.ts    # live smoke test: drives a RUNNING cockpit over its MCP-over-HTTP
                        # endpoint (start dev server → auto-navigate → verify the live app via
                        # browser_eval → app-scoped get_logs → screenshot). Cockpit must be up.

New features are built test-first against this harness. Code is linted + formatted with Biome (bun run check / bun run format), and commits follow Conventional Commits. See CONTRIBUTING.md for the full workflow, and SECURITY.md to report a vulnerability. Release history lives in CHANGELOG.md.

Gotchas learned in the field

  • Port conflicts surface as browser 500s. Wiring against an Expo app while another held port 8081 produced a browser-side 500; the server logs showed Expo had skipped starting. Pin a free port per app — and a good example of why the unified timeline helps.

  • bun run dev spawns the real server as a grandchild. Killing the shell orphans next dev/metro; that's why the dev server is spawned detached and stopped by process group.

  • Don't pass CI=1 for interactive use — it disables Metro watch/HMR.

Where to take it next

  • EAS Build fallback — an eas build path for native builds when there's no local toolchain (Android especially), surfaced in the Settings → native readiness preflight.

  • Configurable snapshot depth — let browser_snapshot override the 250-element cap for dense UIs (data tables, long forms).

Done: unified browser+server timeline · get_logs_around correlation · repro one-shot + action sequences (results rendered inline) · waitFor: networkidle · structured console args · bounded interaction timeouts · self-healing re-acquire (Puppeteer and Electron panes — recover from renderer crash) · network request/response bodies (capped, base64-decoded, on logged Electron entries) · project registry (with saved repro steps) · session persistence · single-window Electron cockpit — tabbed panes, collapsible toolbar + timeline, pop-out, project-named tabs · per-pane dev servers, configure-once (auto-saved) · auto-navigate from logs · pane persistence + restore (no "assume running") · React 19 + Tailwind v4 + Radix + lucide-react renderer · browser bar (back/forward/reload + live address) · segmented logs/repro panel · pop-out windows with their own browser chrome · screenshot → timeline (thumbnail + lightbox) · dev failed-state indicator · project picker (open-on-pick) + folder browse · visual repro builder · MCP-over-HTTP · clean process-group teardown + crash watchdog · Electron security-warning suppression · native targets (Expo / React Native iOS) — Web·iOS switcher, separate bundler/build (expo run:ios with @expo/fingerprint staleness), source-mapped Hermes JS logs over CDP, simctl native device logs on the timeline, and a vendored, offline live interactive iOS simulator embedded in the pane · agent-driven native interactionsbrowser_snapshot of the UIKit a11y tree + browser_click/type/scroll/press via idb (by pt:x,y ref or label), replayable through repro, with a Settings → native readiness preflight · per-pane Chrome extension load/toggle + an in-store "Add to Devloop" install button · in-app update banner (download progress + restart) · Android target (Web·iOS·Android switch, adb-driven snapshot/tap via uiautomator, logcat on the timeline, a live screencap mirror, expo run:android) · RN network capture (injected XHR hook → network rows) · full network-capture ring (complete HAR + get_network, threshold-independent) · viewport/throttle picker UI · per-project session partitions (same-origin isolation) · shared HTTP/SSE daemon (devloop-mcp daemon — many agents, one instance) · native open/build over MCP (native_open/native_close/native_build) · shared-mode stdio auto-connect (the stdio entry bridges to a running daemon — or spawns one — and falls back to a local instance) · full MCP parity (extension management ext_*, browser_back/forward/reload, pane_set_label).

Available Tools

46 tools
browser_backA

Go back one entry in the active pane's history (no-op if there's nothing to go back to). Pairs with browser_forward; use browser_navigate to go to a new URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it is a no-op when there is nothing to go back to. Annotations already provide safety profile (openWorldHint, non-idempotent), and description adds useful behavioral detail without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences that front-load the core action and provide necessary usage hints with no superfluous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully explains operation, boundary condition, and relationship to siblings. No output schema needed; description covers all needed context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so baseline of 4 applies. The description adds no parameter-specific information beyond what schema provides (empty schema), but this is acceptable due to zero parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Go back one entry in the active pane's history', with a specific verb and resource. It distinguishes from siblings like browser_forward and browser_navigate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states it pairs with browser_forward and advises using browser_navigate for new URLs, providing clear context for when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_clear_storageA
Destructive

Clear the active page's storage — cookies, localStorage, IndexedDB, cache, service workers — for the current origin. Set allOrigins to wipe the whole browser session. Use to log out or test a fresh-user flow; reload afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
allOriginsNoWipe the entire session, not just the current origin.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Lists specific storage types cleared and explains the allOrigins parameter effect. Annotations already indicate destructiveHint=true, but the description adds valuable detail on what exactly gets destroyed without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main action, no unnecessary words. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage scenario, parameter effect, and a post-action note (reload). No output schema needed; annotations and description together provide full context for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already describes the single boolean parameter well. Description adds context about using it to wipe the session, but schema coverage is 100%, so baseline is 3; the extra usage context raises it to 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Clear' and specifies the resources (cookies, localStorage, IndexedDB, cache, service workers) and the scope (current origin or whole session via allOrigins). Distinct from sibling tools like browser_reload or browser_navigate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases: 'log out or test a fresh-user flow' and advises to 'reload afterward'. Does not explicitly mention when not to use, but gives clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_clickA

Click the element matching a CSS selector (real mouse click). For keyboard keys use browser_press; to only hover use browser_hover.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the element to click (e.g. a `ref` from browser_snapshot).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide openWorldHint=true (mutating) and destructiveHint=false (non-destructive). The description adds 'real mouse click', indicating it performs a full mouse click event, which is additional behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—two short sentences. The first states the primary action, the second provides usage guidance for alternatives. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter, the description combined with input schema and annotations fully informs the agent. It covers purpose, usage, and behavior without missing critical details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes the 'selector' parameter with a clear description in the schema itself (100% coverage). The description does not add new semantic meaning beyond what the schema already provides, so baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool clicks an element matching a CSS selector, using a specific verb (click) and resource (CSS selector). It also distinguishes itself from sibling tools like browser_press (keyboard) and browser_hover (hover only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly guides when to use this tool for clicking, and when to use alternatives: 'For keyboard keys use browser_press; to only hover use browser_hover.' This provides clear context and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_emulateA
Idempotent

Emulate a device/viewport on the active page. Pass a device preset, or custom width+height. reset: true restores a desktop viewport. For network conditions use browser_throttle instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
resetNoRestore the default desktop viewport and clear emulation.
widthNoCustom viewport width in CSS pixels (with height).
deviceNoDevice preset to emulate. Use this OR width+height.
heightNoCustom viewport height in CSS pixels (with width).
mobileNoEmulate a mobile device (touch + mobile UA hints). Default false.
userAgentNoOverride the User-Agent string.
deviceScaleFactorNoDevice pixel ratio (e.g. 2 for retina). Default 1.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotency and limited open-world side effects. The description adds that reset restores desktop viewport, but doesn't elaborate on other behavioral aspects like the default state or persistence after navigation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, no filler. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters and no output schema, the description covers core use cases (preset, custom, reset) and mentions one sibling. Could note that it only affects viewport/UA, not network, but that is implied via the sibling mention.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description does not add significant insight beyond what the schema already documents; it restates the relationship between device and width+height.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool emulates a device/viewport, specifies using a device preset or custom width+height, and distinguishes its purpose from browser_throttle for network conditions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (device emulation) and when-not-to-use (network conditions) with a direct sibling reference to browser_throttle, plus mentions reset functionality.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evalA

Evaluate a JavaScript expression in the active page (via CDP) and return its value. Runs in the page's main world and can mutate page state. Prefer browser_snapshot for reading structure and browser_click/type for interactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionYesA JavaScript expression evaluated in the page; its result is returned (JSON-serializable values).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant context beyond the annotations (openWorldHint=true, destructiveHint=false). It details that evaluation runs in the page's main world and can mutate page state, which helps the agent understand the tool's impact on the environment.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first clearly states the action, the second provides guidance on alternatives. Every sentence is essential and front-loaded, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is quite complete for a simple tool: it covers core behavior, mutation potential, and usage alternatives. Minor omissions like error handling or async nature are acceptable given the straightforward nature, but it could be slightly more thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the schema already describes the 'expression' parameter. However, the description adds value by clarifying that the expression is evaluated in the active page via CDP and mentioning the return type, which aids correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Evaluate a JavaScript expression in the active page (via CDP) and return its value,' which is a specific verb-resource pair. It also distinguishes itself from siblings by advising alternatives for reading and interaction (browser_snapshot, browser_click/type).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage guidelines: it recommends browser_snapshot for reading structure and browser_click/type for interactions, implying when not to use this tool. It also mentions it can mutate page state, cautioning about unintended side effects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_forwardA

Go forward one entry in the active pane's history (no-op if there's nothing to go forward to). Pairs with browser_back; use browser_navigate to go to a new URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses no-op behavior for empty history, which adds value beyond annotations. Annotations already indicate possible side effects (openWorldHint=true) and idempotency not guaranteed (idempotentHint=false). Description complements these well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: one sentence for action and no-op, one sentence for sibling pairing. No redundant words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity (0 parameters, no output schema, simple navigation), the description covers the essential behavior. However, it lacks mention of return value or state changes beyond the no-op, which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no parameters; schema coverage is 100%. Description doesn't need to add parameter semantics, and baseline for 0 params is 4. No additional information needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool's purpose: 'Go forward one entry in the active pane's history' and distinguishes from siblings like browser_back and browser_navigate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (navigate forward), when it's a no-op (nothing to go forward to), and provides alternative: 'use browser_navigate to go to a new URL'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_hoverA

Hover the pointer over an element to trigger hover menus/tooltips. Does not click — use browser_click for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector of the element to hover over.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the tool is open-world and non-destructive. The description adds value by clarifying that it only hovers (no click), which is a key behavioral trait not fully captured by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with two sentences. The first sentence front-loads the action and purpose, the second provides a critical clarification. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (one parameter, no output schema, no nested objects), the description covers all essential aspects: what it does, when to use, and distinguishing guidance. It is complete for effective agent usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself describes the parameter adequately ('CSS selector of the element to hover over'). The tool description does not add additional parameter-level information beyond what the schema provides, resulting in a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('hover the pointer') and the resource ('an element') with a specific purpose ('to trigger hover menus/tooltips'). It also explicitly distinguishes from the sibling tool 'browser_click' by stating it does not click.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use (to trigger hover menus/tooltips) and when not to use ('Does not click'), and provides the alternative tool ('use browser_click for that').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigateA

Navigate the active pane to a URL (full page load). Returns the resolved URL and HTTP status. Use browser_back / browser_forward to move through history, browser_reload to refresh the same URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute URL to load (e.g. http://localhost:3000/path).

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-destructive side effect. Description adds 'full page load' context and return info, but does not disclose additional traits like timeouts or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no extraneous words. Front-loaded with action and return value, followed by sibling guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple one-param tool with annotations. Description covers purpose, return, and alternatives adequately for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a clear description of the url parameter. Description adds no extra meaning beyond the schema, so baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'Navigate' and resource 'URL', specifies return values (resolved URL, HTTP status), and distinguishes from siblings like browser_back/forward/reload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives (browser_back, browser_forward, browser_reload) and their use cases, guiding when to use this tool vs. others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_pressA

Press a single key (e.g. Enter, Escape, Tab, ArrowDown) on the page. For typing text use browser_type.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesKey name to press, e.g. Enter, Escape, Tab, ArrowDown.
selectorNoOptional CSS selector to focus before pressing the key.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (openWorldHint: true, destructiveHint: false) already indicate side-effect potential and safety. Description does not add details beyond the basic action, such as focus requirements or possible side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with purpose and a clear alternative reference, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple action: mentions single key press, alternative for typing, and optional selector. Could mention if keys cause navigation or default actions, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters with descriptions; description adds concrete examples for 'key' (e.g., Enter, Escape), enhancing clarity beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it presses a single key on the page, with examples (Enter, Escape, Tab, ArrowDown), and explicitly distinguishes from browser_type for typing text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for use (pressing single keys) and mentions browser_type as alternative for typing, but lacks explicit when-not-to-use or eligibility criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_reloadA
Idempotent

Reload the active pane's current page. Use browser_navigate to change URL instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
hardNoIgnore the cache (hard reload). Default false. Cockpit only; ignored under Puppeteer.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds context beyond annotations: default cache behavior and Cockpit/Puppeteer difference for hard reload. Annotations already cover idempotency and open world.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences with essential information front-loaded; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Sufficient for a simple reload tool with one parameter; could mention what happens after reload (e.g., new page renders), but not critical given annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; description does not add parameter details beyond schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes specific action ('Reload the active pane's current page') with verb and resource, clearly distinguishing from sibling 'browser_navigate'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (reload) and when not (use browser_navigate for URL change), providing clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_screenshotA
Read-only

Capture a PNG screenshot of the active page. To find/target elements, prefer browser_snapshot (returns selectors).

ParametersJSON Schema
NameRequiredDescriptionDefault
fullPageNoCapture the full scrollable page, not just the viewport (default false).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true (no side effects). Description adds that it captures a screenshot of the active page, implying no destructive behavior. However, it does not detail performance implications of fullPage or exact visual fidelity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: first states the main action, second provides usage guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one boolean parameter and no output schema, the description covers the purpose, usage context, and sibling differentiation completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the fullPage parameter already described. The description adds no additional meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Capture' and resource 'PNG screenshot of the active page', and distinguishes from sibling browser_snapshot by noting it returns selectors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use an alternative: 'To find/target elements, prefer browser_snapshot (returns selectors).' This guides the agent to choose the right tool for different tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_scrollA

Scroll an element into view (pass selector), or scroll the window to coordinates (pass x and y). Provide a selector OR x+y, not both.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoWindow scroll-x in pixels (used when no selector).
yNoWindow scroll-y in pixels (used when no selector).
selectorNoCSS selector to scroll into view. Omit to scroll the window instead.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the two distinct behaviors (element scroll vs window scroll) and the mutual exclusivity constraint. Annotations indicate openWorldHint and non-destructive nature, which aligns with the description. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loading the key information about the two modes and the constraint. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple scrolling tool, the description covers all necessary information: two modes, parameter constraint, and behavior. No output schema exists, but the return is likely minimal; the description is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for each parameter. The description adds the crucial rule of mutual exclusivity (selector OR x+y), which is not evident from the schema alone, providing meaningful guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states two specific actions: scrolling an element into view using a selector, or scrolling the window to coordinates. It distinguishes itself from sibling tools like browser_click and browser_navigate by focusing solely on scrolling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the constraint 'Provide a selector OR x+y, not both,' guiding proper usage. While it doesn't compare to alternative tools, the tool is unique among siblings, so no exclusion is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_selectA

Set the value of a (or input) and fire input/change events. For typing free text use browser_type.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesThe option's value attribute (not its visible label) to select.
selectorYesCSS selector of the <select> or input.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds that the tool 'fire[s] input/change events', which goes beyond the annotations. However, annotations already declare openWorldHint and destructiveHint, so the bar is lower. The description does not detail other behaviors like waiting for events or preconditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundancy. The first sentence states the core purpose, and the second provides a usage alternative. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description is complete. It covers the action, how to use it (selector and value), and distinguishes from a sibling. No output schema exists, so no need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3 is appropriate. The description does not add new information about parameters beyond what is already in the schema; the schema descriptions are sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Set' and resource '<select> (or input)', clearly stating the action and target. It also explicitly distinguishes this tool from 'browser_type' by noting 'For typing free text use browser_type.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear alternative ('browser_type') for free text input, guiding the agent on when to use this tool. It implies this tool is for selecting options from dropdowns or setting values on inputs, but does not mention other potential alternatives like 'browser_click' for non-select interactions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_snapshotA
Read-only

Capture a structured snapshot of the active page: url, title, and the interactive + landmark elements (role, accessible name, value/state, heading level), each with a CSS selector ref. Pass a returned ref to browser_click / browser_type. Caps at 250 elements by default (raise limit for dense pages); truncated:true means the cap was hit. Prefer this over browser_screenshot to find and target elements reliably.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax elements to return (default 250). Raise it for dense pages (large tables / long forms) where the default truncates the snapshot.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true (safe read) and openWorldHint=false. Description adds valuable details: default cap at 250 elements, truncated flag, and that elements include CSS selector refs for interaction. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. First sentence packs essential purpose and output details. Second sentence adds usage nuance. Every word earns its place, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description fully explains what is returned (url, title, elements with specific properties plus refs). Covers behavior (cap, truncated). For a read-only snapshot tool with one optional parameter, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a well-described `limit` parameter. Description reinforces its purpose by explaining when to raise it (dense pages with large tables/long forms) and the consequence of truncation (truncated:true meaning cap hit). Adds context beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Explicitly states capturing a structured snapshot with specific details (url, title, interactive elements with role, name, state, heading, CSS selector ref). Clearly distinguishes from sibling browser_screenshot by saying 'Prefer this over browser_screenshot to find and target elements reliably.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear when-to-use guidance (find and target elements reliably) and when to adjust limit (dense pages). No explicit when-not-to-use, but comparison with browser_screenshot implies alternatives. Could be more explicit about other siblings like browser_eval, but sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_throttleA
Idempotent

Throttle the active page's network conditions to a named profile. Use none to clear. For viewport/device emulation use browser_emulate.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileYesNetwork profile to apply; `none` removes throttling.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide idempotentHint=true and openWorldHint=false. Description adds the ability to clear with 'none', but does not elaborate on further behavioral aspects like impact on future navigations or return state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no fluff. Each sentence adds essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple tool with one parameter and no output schema. The description covers purpose, usage, and clearing, making it complete for its context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage with enum and description for the sole parameter. Description reiterates 'Use `none` to clear' but adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'Throttle' and resource 'active page's network conditions'. Distinguishes from sibling 'browser_emulate' by noting it is for viewport/device emulation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (throttle network) and when not to use (for viewport/device emulation, use browser_emulate). Provides a clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_typeA

Type text into the element matching a CSS selector (focuses, then types). For single keys use browser_press; for use browser_select.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to type into the focused element.
selectorYesCSS selector of the input/textarea to type into.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate non-destructive and open-world intent. The description adds the focusing behavior, which is useful beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences covering purpose, behavior, and alternatives. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool, no output schema, and sufficient annotations, the description provides all necessary context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully described in the schema (100% coverage). The description does not add additional parameter details, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it types text into an element via CSS selector, highlighting the focus-then-type behavior. Explicitly distinguishes from browser_press (single keys) and browser_select (select elements).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use alternatives: browser_press for single keys, browser_select for <select> elements. This helps the agent choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_wait_forA
Read-onlyIdempotent

Wait until a CSS selector appears or text is present on the page (e.g. after a navigation or async render). Returns { ok, waitedMs } — ok=false on timeout. To wait for the network to go quiet instead, use browser_wait_for_idle.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoSubstring of page text to wait for (if no selector).
selectorNoCSS selector to wait for.
timeoutMsNoMax time to wait before giving up, in ms (default 10000).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return format ({ ok, waitedMs }) and that ok=false on timeout. Annotations already indicate readOnly and idempotent; description adds behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with primary purpose, zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, return, timeout behavior, and sibling alternative for a tool with 3 optional params and no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 3 parameters with descriptions. The tool description does not add new parameter-level details beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool waits for a CSS selector or text to appear, with an example context (after navigation/async render). It distinguishes from sibling browser_wait_for_idle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when not to use this tool by directing to browser_wait_for_idle for network idle waits, providing clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_wait_for_idleA
Read-onlyIdempotent

Wait until network activity settles (no requests for idleMs). Returns { ok }. To wait for a specific element/text use browser_wait_for.

ParametersJSON Schema
NameRequiredDescriptionDefault
idleMsNoQuiet period with no requests that counts as idle, in ms (default 500).
timeoutMsNoMax time to wait before giving up, in ms (default 10000).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. Description adds valuable behavioral context: it waits for network quiet period and returns { ok }, which is beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, front-loaded with purpose and alternative. Perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with only two optional parameters, the description covers purpose, behavior, and alternative comprehensively. No missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are fully described in the schema. Description does not add extra parameter details beyond mentioning the idle condition, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool waits for network activity to settle, distinguishing it from browser_wait_for which waits for specific elements. The verb 'wait' and resource 'network idle' are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use (to wait for network idle) and when not (for specific element/text, use browser_wait_for), providing clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_logsA
DestructiveIdempotent

Clear the event buffer (irreversible). Call before reproducing an issue for a clean window. Note: repro clears for you unless clear=false.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds value by emphasizing 'irreversible' and noting the interaction with repro, which provides context beyond the annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first states the action and irreversibility, the second gives usage context. No redundant words. Well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema), the description covers all necessary context: purpose, irreversibility, and when to use. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, and schema coverage is 100% (empty). With no parameters, the baseline is 4. The description adds no further parameter detail, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Clear' and the resource 'event buffer', and explicitly notes it is irreversible. It distinguishes itself from sibling tools like get_logs (read) and repro (related but different).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Call before reproducing an issue for a clean window.' It also notes an alternative (repro clears unless clear=false), helping the agent decide when to use this tool vs. the repro tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dev_startA

Start a dev server and tee its logs into the buffer. Three ways to specify it: (1) project — a saved registry project (resolves cmd/cwd); (2) explicit cmd+cwd; (3) neither — cwd defaults to the server's directory and cmd is auto-detected from package.json. Explicit cmd/cwd override the project's. Stop it with dev_stop; check it with dev_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
cmdNoFull dev command. If omitted, auto-detected from package.json.
cwdNoProject directory. Defaults to the server's cwd.
projectNoName of a saved project (see project_list).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (openWorldHint=true, idempotentHint=false) already indicate side effects and non-idempotency. The description adds that logs are teed into the buffer and explains auto-detection and override rules. It does not contradict annotations and provides useful behavioral context beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph of five sentences, front-loaded with the core purpose, then efficiently detailing usage modes and sibling references. Every sentence adds distinct value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers the main functionality well. It mentions log tee-ing and references siblings for stop/status. However, it lacks explicit information about what happens if the server is already running (e.g., error or restart) or the return value/content. Still sufficiently complete for a dev tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant semantic value: it explains the three modes of specifying the server, default behavior when cmd/cwd are omitted, and that explicit parameters override project settings. This goes well beyond the schema's property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Start a dev server and tee its logs into the buffer' using a specific verb and resource. It distinguishes from siblings by referencing dev_stop and dev_status, and details three usage modes (project, explicit cmd+cwd, auto-detected).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly describes three ways to specify the server and explains fallback behavior. It also directs the agent to sibling tools (dev_stop to stop, dev_status to check), providing clear context for when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dev_statusA
Read-only

Report whether the dev server is running, plus its cmd/cwd/pid. Start/stop with dev_start/dev_stop.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that it is a read-only report (consistent with readOnlyHint annotation) and specifies the information returned (cmd/cwd/pid), providing behavioral clarity beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with two sentences, front-loading the purpose and immediately directing to sibling tools. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter tool without output schema, the description adequately covers its behavior and relationships to siblings. Could note that status includes 'not running' case, but currently implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist and schema coverage is 100%, so the description does not need to add parameter details. Baseline 3 applies as description adds no param-specific value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports whether the dev server is running and provides cmd/cwd/pid, distinguishing it from siblings dev_start and dev_stop which handle starting/stopping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use this tool (to check status) and points to dev_start/dev_stop for start/stop actions, but does not explicitly state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dev_stopA
Idempotent

Stop the running dev server (SIGTERM). Returns whether one was running. Start one with dev_start.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return value (whether one was running) and signal method (SIGTERM), adding value beyond idempotentHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with main action, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Explains return value and method, sufficient for a parameterless tool with annotations; could mention behavior when no server is running.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in schema; description appropriately omits parameter details. Baseline 4 due to zero parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool stops the running dev server via SIGTERM, explicitly distinguishes from sibling dev_start.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use (stop dev server) and references sibling dev_start, but lacks explicit when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnoseA
Read-only

Triage what's broken right now: group repeated errors (browser console/page errors + server errors) with counts, list failed/4xx-5xx network requests, and return a one-line summary. Start here before digging through get_logs.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoScope to one app/project (pane label or id).
windowMsNoOnly consider events from the last N ms (default: all).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is clear. The description adds behavioral details: grouping repeated errors, listing failed network requests, and returning a one-line summary. It does not contradict annotations and adds value beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main action, no wasted words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately describes the return format (grouped errors with counts, list of failed requests, one-line summary). It is complete for the tool's purpose, though lacks mention of edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters already described. The description does not add significant new meaning to the parameters; it focuses on the tool's output. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear verb (triage) and resource (broken state), and differentiates from sibling get_logs by stating 'Start here before digging through get_logs.' It details what it does: group errors, list failed requests, return summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Start here before digging through get_logs,' providing clear guidance on when to use this tool over alternatives. This is a strong usage directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_bundleA
Read-only

Export a shareable bug-report bundle as one JSON object: the diagnose summary, the timeline (logs), captured screenshots, a HAR of network, and repro steps if provided. For just the network log use export_har; for a quick triage use diagnose.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoScope to one app/project (pane label or id; see pane_list). Omit for all.
windowMsNoOnly include events from the last N ms (default: the whole buffer).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the tool is read-only. The description adds value by detailing the bundle contents (diagnose summary, timeline, screenshots, HAR, repro steps), which goes beyond the annotation's binary signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The first sentence front-loads the core purpose and contents, the second provides usage alternatives. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description explains the return value as 'one JSON object' and lists its components. This is sufficient for a tool with clear annotations and parameters. Could mention potential size or permissions, but not necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters ('app' and 'windowMs'), so the baseline is 3. The description does not add additional meaning to these parameters beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Export' and resource 'shareable bug-report bundle', listing its contents explicitly. It distinguishes itself from sibling tools by naming alternatives (export_har, diagnose).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly states what the tool does and provides explicit guidance for when to use alternatives: 'For just the network log use export_har; for a quick triage use diagnose.' This helps the agent choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_harA
Read-only

Export captured network requests as a HAR 1.2 document (importable into Chrome DevTools / Charles). Covers ALL requests (the full network ring, independent of DEVLOOP_NET_THRESHOLD — bodies kept for the curated subset: failures + status ≥ threshold). To browse requests in JSON use get_network.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoScope to one app/project (pane label or id; see pane_list). Omit for all.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true, and the description adds that bodies are kept for a curated subset, which is behavioral context beyond annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with main action, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and no output schema, the description covers purpose, usage, behavioral nuance, and alternative, making it fully informative.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description does not add significant meaning beyond the existing property descriptions (the app parameter details are already clear in the schema).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Export' and the resource 'captured network requests' in HAR 1.2 format, and distinguishes from sibling 'get_network' by noting that the latter is for browsing JSON.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly describes the scope (ALL requests, independent of threshold) and provides an alternative tool ('To browse requests in JSON use get_network'), guiding when to use each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ext_installA
Idempotent

Install a Chrome extension from a Web Store id or URL (downloads from the Web Store). Returns the updated list. (Cockpit only.) Remove with ext_remove.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesExtension id (32 chars) or a Chrome Web Store URL.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds detail beyond annotations: specifies that it downloads from Web Store and returns updated list. Annotations already indicate idempotent and open world behavior; no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences covering purpose, source, output, context, and sibling tool. No superfluous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers what it does, what it returns, where it works, and how to reverse. Could mention potential errors or prerequisites but sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes the parameter as extension id or URL. Description merely echoes this without adding new semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'Install' with specific resource 'Chrome extension' and source 'Web Store id or URL'. Distinguishes from sibling 'ext_remove' by mentioning removal as separate operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context 'Cockpit only' and hints at paired usage with ext_remove, but does not explicitly state when to use versus alternatives like ext_list or ext_set_enabled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ext_listA
Read-only

List Chrome extensions (loaded + disabled): id, name, version, enabled. (Cockpit only.) Install with ext_install, toggle with ext_set_enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes exactly what the tool returns (id, name, version, enabled) and that it includes both loaded and disabled extensions. Annotations confirm readOnlyHint=true, so no contradiction. Adds context about Cockpit-only availability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: first states purpose and output, second provides context and related tool references. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description fully covers what the tool does, what it returns, its context (Cockpit only), and relevant sibling tools. Complete and self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters and the schema is empty with 100% coverage. The description adds no parameter details, but none are needed. The context 'Cockpit only' adds value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists Chrome extensions, specifying both loaded and disabled types and the fields returned (id, name, version, enabled). It also differentiates from siblings like ext_install and ext_set_enabled.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states it is for Cockpit only, and provides direct references to alternatives: 'Install with ext_install, toggle with ext_set_enabled.' This tells the agent when to use this tool versus others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ext_removeA
DestructiveIdempotent

Remove (uninstall/unload) a Chrome extension by id (irreversible for store extensions). (Cockpit only.) To keep it but turn it off, use ext_set_enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExtension id to remove (see ext_list).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true. Description adds context: 'irreversible for store extensions' and 'Cockpit only', providing extra behavioral nuance beyond the structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no unnecessary words, front-loaded with action and key constraint (irreversible). Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description covers all essential aspects: action, uniqueness of id, irreversibility for store extensions, scope (Cockpit only), and referral to alternative. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter, which already describes 'id' as needed. Description adds a reference to 'ext_list' for obtaining the id, but this is marginal additional value beyond the schema, warranting baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Remove (uninstall/unload) a Chrome extension by id' with specific verb and resource. Distinguishes from sibling 'ext_set_enabled' by noting irreversibility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use this tool vs alternative: 'To keep it but turn it off, use ext_set_enabled.' Also notes it's Cockpit only.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ext_set_enabledA
Idempotent

Enable or disable a Chrome extension by id without uninstalling. Returns the updated list. (Cockpit only.) To uninstall entirely, use ext_remove.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExtension id to toggle (see ext_list).
enabledYestrue to enable, false to disable.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds behavioral details: 'without uninstalling' and 'Returns the updated list.' Annotations indicate idempotentHint=true, and description aligns. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with action, no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple toggle tool with 2 params and no output schema, the description covers all needed information, including usage context and alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and description restates the schema without adding new meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb (enable/disable) and resource (Chrome extension), and explicitly distinguishes from sibling tool ext_remove.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (toggling extension state) and when-not (uninstall, use ext_remove). Also notes 'Cockpit only' restriction. Could mention other alternatives but adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_logsA
Read-only

Return recent events from the unified buffer (server stdout/stderr + browser console/network/pageerror), newest last. Filter by source, stream, grep, and tail incrementally with sinceSeq. Scope to one project's logs with app. For events around a specific moment use get_logs_around; to triage errors first use diagnose.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoScope to a specific app/project — matches a pane's label (project name) or id (see pane_list). Omit for all apps.
grepNoCase-insensitive regex (or substring if invalid).
limitNoMax events (default 200).
sourceNoLimit to one source: server, browser, or native.
streamNoLimit to one stream, e.g. stdout, stderr, console, network, pageerror.
sinceSeqNoOnly events with seq >= this (for incremental tailing).

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so no mutation. The description adds behavioral context: events are ordered newest last, the buffer composition includes server and browser events, and incremental tailing is supported via sinceSeq. It doesn't discuss rate limits or exact return format, but adds value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the core purpose and ordering, the second covers filtering, scoping, and alternatives. It is concise, front-loaded, and every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 6 parameters, no output schema, and is a log retrieval tool, the description covers the main use cases, filtering options, and differentiation from siblings. It does not detail the return format, but the schema descriptions and the term 'events' provide adequate context for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context like 'Scope to one project's logs with `app`' and explains the purpose of filtering parameters (source, stream, grep) and incremental tailing (sinceSeq). This provides meaning beyond the individual schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns recent events from a unified buffer (server stdout/stderr + browser console/network/pageerror) with newest last ordering. It distinguishes from siblings 'get_logs_around' and 'diagnose' by mentioning their specific use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: for filtering by source, stream, grep, and incremental tailing with sinceSeq, and scoping to a project. It also clearly states when to use alternatives: 'For events around a specific moment use get_logs_around; to triage errors first use diagnose.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_logs_aroundA
Read-only

Return ALL events (server + browser) within +/- windowMs of a timestamp, time-ordered — the correlation tool. E.g. the browser console error and the backend stack trace from the same moment. Timestamps come from the ts field on any event.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYesCenter timestamp (ms since epoch).
appNoOptional: scope to one app/project (pane label or id; see pane_list).
sourceNoOptional: limit to one side.
windowMsNoHalf-window in ms (default 500).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds context beyond annotations by specifying scope (server+browser) and filtering options, though lacks details on limits or edge cases. Annotations already cover read-only safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences; first front-loads core purpose and scope, second provides a concrete example and points to the timestamp field.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description adequately explains return content (events, time-ordered) and usage, though more details on event structure could be beneficial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions. The tool description reinforces the windowMs concept and source enum but adds limited new meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it returns all events within a time window, time-ordered, and positions it as a correlation tool with a concrete example differentiating it from other log tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for correlating events across server/browser, but does not explicitly state when not to use or compare to siblings like get_logs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_networkA
Read-only

List captured network requests (the full ring — every request, independent of DEVLOOP_NET_THRESHOLD). Each row has method/url/status/timing/headers (bodies for the curated subset). Unlike get_logs (curated timeline only); for an importable HAR file use export_har.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoScope to one app/project (pane label or id).
grepNoSubstring match on the request line (status/method/url).
limitNoMax rows (most recent), default 200.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations show readOnlyHint=true, description adds data format details (method/url/status/timing/headers, bodies for curated subset). No contradictions, but lacks side-effect disclosure beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus parenthetical, front-loaded with purpose, no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with 3 optional params, no output schema, and clear annotations, the description covers purpose, return format, and sibling differentiation adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, description does not add extra meaning beyond the schema's parameter descriptions. Baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists captured network requests, specifying full ring vs threshold, and details row contents. Distinguishes from get_logs and export_har.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts with get_logs for curated timeline and points to export_har for HAR file. Also mentions independence from threshold, guiding when to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

native_buildA

Build + launch the native dev build for the active pane (expo run:ios / expo run:android); output streams to the timeline. Cockpit-only, local build. Needs the native toolchain (Xcode for iOS; Android SDK + adb + a JDK + $ANDROID_HOME for Android). If the Android toolchain isn't set up it returns started:false with a checklist of exactly what to install, instead of failing cryptically. After it boots, use native_open to drive it.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoProject directory to build; defaults to the active pane's project.
platformYesWhich platform to build: ios or android.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide openWorldHint=true and idempotentHint=false. The description adds valuable behavioral context: output streams to timeline, failure behavior returns a checklist for missing Android dependencies. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise: two sentences. First sentence front-loads the purpose and key behavior. Second sentence covers prerequisites, failure case, and next steps. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers prerequisites, failure behavior, and follow-up tool (native_open). However, it does not describe the return format on success (e.g., what 'started:true' looks like) or detailed output structure. Given no output schema, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully described in schema (100% coverage). The description adds extra meaning by mapping platform to specific Expo commands and mentioning that cwd defaults to active pane. This enhances understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Build + launch the native dev build for the active pane' with specific commands (expo run:ios/android). It distinguishes from siblings by mentioning native_open as a follow-up step, implying this tool is for building and launching while native_open is for driving after boot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Cockpit-only, local build' and lists required toolchains for each platform. It also explains behavior when Android toolchain is missing (returns started:false with checklist). However, it does not explicitly state when not to use this tool or mention alternatives beyond native_open.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

native_closeA
Idempotent

Close the active native target; browser_* route back to the pane's web content. (Cockpit only.) Open one with native_open.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and openWorldHint=false, so the description adds no significant behavioral traits beyond the Cockpit scope restriction. It doesn't contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: first states the action, second provides scope and related tool. No excess verbiage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters, annotations, and no output schema, the description is complete: it explains the action, constraints (Cockpit only), and a related tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the description need not add parameter info. Baseline score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it closes the active native target, distinguishes from browser_* tools which route back to web content, and mentions it's Cockpit only. Also references native_open for opening.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context that it's Cockpit only and implies when to use it vs browser tools, but does not explicitly list when not to use or provide alternative tools beyond native_open.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

native_doctorA
Read-only

Report native readiness without building or opening anything: iOS simulator interactions, Android device interactions, and the Android local build toolchain — each a ✓/✗ checklist with the fix for anything missing. Cockpit-only, read-only. Re-probes live each call — run it after installing a missing tool to confirm it's resolved before native_build / native_open, or proactively before a long build. Returns { ios, androidInteractions, androidBuild }, each { ready, checks, summary }. native_build to build; native_open to drive a device.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true. Description adds value by explaining 're-probes live each call' and details the return structure ('{ ios, androidInteractions, androidBuild }' with nested fields). No contradiction; adds behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences that front-load the core purpose, then provide usage guidance, then output structure. Every sentence is informative with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description fully explains what it does, when to use, and what it returns (including the shape of the result). No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so description has no param info. Baseline is 4 for zero-param tools. The description does not need to add parameter meanings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'report native readiness without building or opening anything' and lists the specific areas (iOS simulator, Android device interactions, Android build toolchain). It distinguishes itself from siblings like native_build and native_open by being a read-only health check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (after installing missing tool, before native_build/native_open, proactively before long build) and contrasts with native_build and native_open. Also notes 'cockpit-only, read-only' to clarify scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

native_openA
Idempotent

Open a native target for the active pane (Expo/React Native): the iOS simulator or the Android device mirror. browser_* (snapshot/click/type/scroll/press/screenshot) then drive the native app via idb/adb, and JS + native logs stream to the timeline. Cockpit-only (needs the Electron app + a booted simulator/emulator). Returns ok:false with a reason if the device/tooling isn't ready. Build the app first with native_build; close with native_close.

ParametersJSON Schema
NameRequiredDescriptionDefault
platformYesWhich native target to open: ios (simulator) or android (emulator mirror).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (openWorldHint, idempotentHint), the description discloses that it returns 'ok:false with a reason if the device/tooling isn't ready', that JS and native logs stream to the timeline, and that browser_* tools drive the native app via idb/adb. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with multiple sentences, packing necessary information efficiently. It is front-loaded with the core action. While not overly terse, it earns its sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description covers return behavior, prerequisites, sibling relationship, and lifecycle (build first, close after). The annotations provide additional context, making it complete for an agent to decide when to use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with enum description. The description adds context by stating the platform values ('ios (simulator) or android (emulator mirror)') and tying to the active pane, reinforcing the schema. No additional param semantics needed beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Open' and the resource 'native target for the active pane (Expo/React Native): the iOS simulator or the Android device mirror'. It distinguishes from browser_* tools which drive web pages, and notes that browser_* tools can then drive the native app, providing clear purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states prerequisites ('Cockpit-only (needs the Electron app + a booted simulator/emulator)'), instructs to build first with 'native_build' and close with 'native_close'. It also implies usage context by differentiating from browser_* tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pane_closeA
DestructiveIdempotent

Close a browser pane by id (irreversible). To detach a pane into its own window instead, use pane_pop. (Cockpit only.)

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the pane to close (from pane_list).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint and idempotentHint; the description adds 'irreversible' which confirms and emphasizes the destructive nature. No contradiction. Good additional context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main action and irreversibility, followed by the alternative. Every word earns its place. Very concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter, no output schema, and no nested objects, the description is complete. It covers the action, irreversibility, alternative, and context (Cockpit only). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a clear parameter description. The tool description does not add new information about the parameter beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Close' and the resource 'browser pane', and it distinguishes itself from the sibling tool pane_pop by noting the alternative for detaching. The irreversibility is also highlighted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells when to use this tool (to close a pane) and when to use the alternative pane_pop (to detach). The '(Cockpit only.)' adds a constraint. This provides clear guidance for selecting the correct tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pane_listA
Read-only

List browser panes (multi-target): each has id, url, active. The active pane is what browser_*/repro act on. Switch with pane_select. (Cockpit only.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is consistent with readOnlyHint annotation and adds useful context that the active pane is used by browser_*/repro tools. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with purpose, no unnecessary words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with no output schema, the description is complete: it explains output, relationships to other tools, and scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters; schema covers all. Description adds value by listing output fields (id, url, active), which aids understanding of what the tool returns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists browser panes with specific output fields (id, url, active). It distinguishes itself from sibling tools like pane_select which is for switching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context on when to use (to see panes) and mentions pane_select as an alternative for switching. Also notes scope (Cockpit only). Lacks explicit when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pane_newA

Open a new browser pane and make it active. Optionally navigate it to a URL and/or scope it to a project. Pass a saved project (resolves cwd/cmd/url/name), or explicit cwd/cmd/label, to scope the pane — cwd isolates its storage partition and names it. With none of these it's a blank, unscoped pane. To switch panes use pane_select; to close use pane_close. (Cockpit only.)

ParametersJSON Schema
NameRequiredDescriptionDefault
cmdNoDev command to associate with the pane (used by a later dev_start).
cwdNoProject directory to scope the pane to (isolates its storage partition).
urlNoOptional URL to open (else the project's URL, else a blank pane).
labelNoDisplay name for the pane (defaults to the project name or cwd basename).
projectNoName of a saved project to scope this pane to (see project_list).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide openWorldHint=true and idempotentHint=false. Description adds that the pane becomes active and that blank/unscoped behavior occurs when no scoping params are given. No contradiction, but could mention side effects like creating a new pane ID.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences that are front-loaded with purpose, then scoping options, then alternatives. No unnecessary words; each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description could mention the return value (e.g., pane ID). However, it covers essential behavioral aspects and alternatives. Sibling tools are listed, providing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema description coverage is 100%, the description adds value by explaining parameter relationships: 'Pass a saved project (resolves cwd/cmd/url/name), or explicit cwd/cmd/label' and how cwd isolates storage and names the pane. This exceeds the schema's individual descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool opens a new browser pane, makes it active, and optionally navigates to a URL or scopes to a project. It distinguishes from siblings pane_select (switch) and pane_close (close).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use alternatives: 'To switch panes use pane_select; to close use pane_close.' Also explains when to use project vs explicit cwd/cmd/label, and the 'Cockpit only' context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pane_popA

Detach a pane into its own standalone window (to view targets side-by-side). Closing that window re-docks the pane. pane_close removes it. (Cockpit only.)

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the pane to pop out (from pane_list).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral traits beyond annotations: the re-docking behavior on window close, the non-removal aspect (contrasted with pane_close), and the restriction to Cockpit. This adds value over the annotations which only provide idempotent and open world hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences) and front-loaded with the main action. Every sentence adds necessary context without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single parameter, no output schema), the description covers all essential aspects: action, side-effects, relationship to sibling, and scope. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is already documented. The description does not add additional meaning or constraints beyond what the schema provides for the 'id' parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Detach a pane into its own standalone window,' with a specific purpose (viewing targets side-by-side). It distinguishes from sibling tool pane_close by noting that closing the window re-docks rather than removes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use (to view panes side-by-side) and contrasts with pane_close. However, it does not explicitly state when not to use or provide alternatives like pane_new.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pane_selectA
Idempotent

Make a pane active so subsequent browser_*/repro calls target it. Find ids with pane_list. (Cockpit only.)

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the pane to activate (from pane_list).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the tool makes a pane active and that subsequent calls target that pane. This adds context beyond annotations (openWorldHint=false, idempotentHint=true) by explaining the state change and flow. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the action and effect. Every sentence is necessary and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description fully explains purpose, effect, and source of IDs. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers the single parameter 'id' with description. The description adds 'Find ids with pane_list,' which reinforces but doesn't add new meaning. Baseline 3 for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Make a pane active', the resource 'pane', and the effect on subsequent browser_*/repro calls. Distinguishes from sibling tools like pane_list and pane_close.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use when targeting a pane for subsequent actions, mentions source of IDs (pane_list), and notes the constraint '(Cockpit only.)' Does not explicitly state when not to use, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pane_set_labelA
Idempotent

Set a pane's display label (the tab name). Also what app filters match in get_logs/diagnose. (Cockpit only.)

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId of the pane to label (from pane_list).
labelYesNew display label (e.g. the project name).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotentHint=true annotation, the description discloses a side effect: the label also affects which `app` filters match in get_logs/diagnose. This adds behavioral context without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary action, no redundant words. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple setter nature, the description covers core usage, side effects, and context, which is sufficient. No output schema needed, and annotations fill in safety/retry behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions, and the tool description adds extra context: 'from pane_list' for id, and 'e.g. the project name' for label, enhancing understanding beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Set a pane's display label', giving a specific verb and resource. It also notes an additional effect on app filtering, which distinguishes it from sibling pane tools like pane_list or pane_close.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions '(Cockpit only)', implying a context restriction, but does not provide explicit when-to-use or when-not-to-use guidance, nor alternatives. The extra effect on filtering is noted but not framed as a usage condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_addA
Idempotent

Save (or replace) a project in the registry so you can dev_start it by name. Replaces any existing project with the same name.

ParametersJSON Schema
NameRequiredDescriptionDefault
cmdNoDev command (optional; auto-detected if omitted).
cwdYesProject directory.
urlNoDefault URL to open in the browser pane (optional).
nameYesUnique project name (used to dev_start it later).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds that it replaces any existing project with the same name, which is useful behavioral context beyond the annotations (idempotentHint=true, destructiveHint=false). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, front-loaded with the core action and purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple save/replace tool with few parameters and no output schema, the description is fully adequate—covers purpose, behavior, and implied usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. The description does not add substantial meaning beyond the already detailed parameter descriptions in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool saves/replaces a project in the registry for later use with dev_start, distinguishing it from sibling tools like project_remove and project_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to save a project for dev_start), but does not explicitly list when not to use it or mention alternatives. However, the context with siblings makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_listA
Read-only

List saved projects (name, cwd, cmd, url) from the registry. Add with project_add, remove with project_remove.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description does not need to reinforce safety. It adds minor context ('from the registry') and lists returned fields, which is helpful but not extensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, only two sentences, with the key action and context front-loaded. Every sentence earns its place without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool, the description is complete. It covers purpose, output format, and sibling relationships, leaving no ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and the schema coverage is 100%, so the description does not need to explain parameters. It adds value by detailing the output fields, which helps the agent understand what information will be returned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'List saved projects' and specifies the output fields (name, cwd, cmd, url). It distinguishes itself from siblings by explicitly mentioning project_add and project_remove.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: to list projects, and mentions alternatives for adding or removing projects. It could be improved by explicitly stating when not to use it, but the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

project_removeA
DestructiveIdempotent

Remove a saved project from the registry by name (irreversible; doesn't stop a running server). List names with project_list.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the saved project to remove (see project_list).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint and idempotentHint. Description adds 'irreversible' and clarifies it doesn't stop a running server, which adds behavioral context beyond annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with no wasted words. Purpose is front-loaded, and all information is relevant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter removal tool with no output schema, the description fully covers purpose, behavioral traits, and parameter guidance. Complete and sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear description. Tool description also clarifies 'by name' and references project_list for obtaining names, adding value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Directly states 'Remove a saved project from the registry by name' with specific verb and resource, and distinguishes from siblings by noting it doesn't stop a running server.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context for when to use (removing a project) and when not (irreversible, doesn't stop server), and hints at alternative project_list for listing names. No explicit exclusions but clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reproA

One-shot reproduce-and-correlate: clear the buffer (unless clear=false), perform one action OR a sequence in order, wait for async console/network/server events to land, then return EVERYTHING that happened on both sides plus per-step results and an errors summary. Use a sequence for flows like navigate → click → type → click submit.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear the buffer first (default true).
actionNoA single action (convenience for a one-step sequence). Ignored if `actions` is given.
idleMsNoQuiet period that counts as idle for waitFor=networkidle (default 500).
actionsNoSequence of actions performed in order. Use this OR `action`.
waitForNoHow to wait after each action: 'settle' = fixed sleep; 'networkidle' = wait until no network activity (more reliable for slow/streaming). Default 'settle'.
settleMsNoFixed wait after the FINAL action for waitFor=settle (default 1000).
timeoutMsNoMax wait for waitFor=networkidle before giving up (default 10000).
stepSettleMsNoFixed wait BETWEEN steps for waitFor=settle (default 300).
continueOnErrorNoKeep going if a step fails (default false: stop after the failing step).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Descriptors go beyond annotations: discloses buffer clearing, waiting for async events, returning both browser and console/network data plus per-step results and errors. No contradiction with readOnlyHint and openWorldHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence packed with key information: buffer clearing, action types, event waiting, return contents. No redundant phrases; every part contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given complexity (9 params, nested objects, no output schema), description covers main behavior and return structure. Missing details on idleMs, waitFor, timeoutMs etc., but schema fills those. Sufficient for agent to decide when to use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so description adds context by explaining the high-level flow (clear, single action vs sequence, event waiting). Reinforces clear parameter behavior and the action/actions choice. Adds moderate value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it's a one-shot reproduce-and-correlate tool: clears buffer, performs action(s), waits for async events, returns full logs, per-step results, and errors. Distinguishes from sibling browser_* tools by emphasizing aggregation and correlation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly recommends using sequences for multi-step flows like 'navigate → click → type → click submit'. Implicitly suggests alternatives: single actions can use browser_* tools, but this provides correlation. Lacks explicit when-not-to-use but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.10.0
    • Changedpane_new5 fields changed
      • addedInput schema / properties / cmd
        Added value: +{
        +  "description": "Dev command to associate with the pane (used by a later dev_start).",
        +  "type": "string"
        +}
      • addedInput schema / properties / cwd
        Added value: +{
        +  "description": "Project directory to scope the pane to (isolates its storage partition).",
        +  "type": "string"
        +}
      • addedInput schema / properties / label
        Added value: +{
        +  "description": "Display name for the pane (defaults to the project name or cwd basename).",
        +  "type": "string"
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "description": "Name of a saved project to scope this pane to (see project_list).",
        +  "type": "string"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"Optional URL to open in the new pane (else a blank pane)."New value: +"Optional URL to open (else the project's URL, else a blank pane)."
  2. 2 tool updatesv0.8.1
    • Changednative_build1 field changed
      • removedInput schema / properties / eas
        Removed value: -{
        -  "description": "Build in the EAS cloud (`eas build`, development profile) instead of a local `expo run` — the fallback when there's no local native toolchain.",
        -  "type": "boolean"
        -}
    • Addednative_doctor
  3. 1 tool updatev0.8.0
    • Changedbrowser_snapshot1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max elements to return (default 250). Raise it for dense pages (large tables / long forms) where the default truncates the snapshot.",
        +  "type": "number"
        +}
  4. 1 tool updatev0.7.1
    • Changednative_build1 field changed
      • addedInput schema / properties / eas
        Added value: +{
        +  "description": "Build in the EAS cloud (`eas build`, development profile) instead of a local `expo run` — the fallback when there's no local native toolchain.",
        +  "type": "boolean"
        +}
  5. 33 tool updatesv0.6.1
    • Addedbrowser_back
    • Changedbrowser_click1 field changed
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector of the element to click (e.g. a `ref` from browser_snapshot)."
    • Changedbrowser_emulate7 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Device preset to emulate. Use this OR width+height."
      • addedInput schema / properties / deviceScaleFactor / description
        Added value: +"Device pixel ratio (e.g. 2 for retina). Default 1."
      • addedInput schema / properties / height / description
        Added value: +"Custom viewport height in CSS pixels (with width)."
      • addedInput schema / properties / mobile / description
        Added value: +"Emulate a mobile device (touch + mobile UA hints). Default false."
      • addedInput schema / properties / reset / description
        Added value: +"Restore the default desktop viewport and clear emulation."
      • addedInput schema / properties / userAgent / description
        Added value: +"Override the User-Agent string."
      • addedInput schema / properties / width / description
        Added value: +"Custom viewport width in CSS pixels (with height)."
    • Changedbrowser_eval1 field changed
      • addedInput schema / properties / expression / description
        Added value: +"A JavaScript expression evaluated in the page; its result is returned (JSON-serializable values)."
    • Addedbrowser_forward
    • Changedbrowser_hover1 field changed
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector of the element to hover over."
    • Changedbrowser_navigate1 field changed
      • addedInput schema / properties / url / description
        Added value: +"Absolute URL to load (e.g. http://localhost:3000/path)."
    • Changedbrowser_press2 fields changed
      • addedInput schema / properties / key / description
        Added value: +"Key name to press, e.g. Enter, Escape, Tab, ArrowDown."
      • addedInput schema / properties / selector / description
        Added value: +"Optional CSS selector to focus before pressing the key."
    • Addedbrowser_reload
    • Changedbrowser_screenshot1 field changed
      • changedInput schema / properties / fullPage / description
        Previous value: -"Capture the full scrollable page (default false)."New value: +"Capture the full scrollable page, not just the viewport (default false)."
    • Changedbrowser_scroll3 fields changed
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector to scroll into view. Omit to scroll the window instead."
      • addedInput schema / properties / x / description
        Added value: +"Window scroll-x in pixels (used when no selector)."
      • addedInput schema / properties / y / description
        Added value: +"Window scroll-y in pixels (used when no selector)."
    • Changedbrowser_select2 fields changed
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector of the <select> or input."
      • addedInput schema / properties / value / description
        Added value: +"The option's value attribute (not its visible label) to select."
    • Changedbrowser_throttle1 field changed
      • addedInput schema / properties / profile / description
        Added value: +"Network profile to apply; `none` removes throttling."
    • Changedbrowser_type2 fields changed
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector of the input/textarea to type into."
      • addedInput schema / properties / text / description
        Added value: +"Text to type into the focused element."
    • Changedbrowser_wait_for1 field changed
      • changedInput schema / properties / timeoutMs / description
        Previous value: -"Default 10000."New value: +"Max time to wait before giving up, in ms (default 10000)."
    • Changedbrowser_wait_for_idle2 fields changed
      • changedInput schema / properties / idleMs / description
        Previous value: -"default 500"New value: +"Quiet period with no requests that counts as idle, in ms (default 500)."
      • changedInput schema / properties / timeoutMs / description
        Previous value: -"default 10000"New value: +"Max time to wait before giving up, in ms (default 10000)."
    • Changedexport_bundle2 fields changed
      • addedInput schema / properties / app / description
        Added value: +"Scope to one app/project (pane label or id; see pane_list). Omit for all."
      • addedInput schema / properties / windowMs / description
        Added value: +"Only include events from the last N ms (default: the whole buffer)."
    • Changedexport_har1 field changed
      • addedInput schema / properties / app / description
        Added value: +"Scope to one app/project (pane label or id; see pane_list). Omit for all."
    • Addedext_install
    • Addedext_list
    • Addedext_remove
    • Addedext_set_enabled
    • Changedget_logs4 fields changed
      • changedInput schema / properties / app / description
        Previous value: -"Scope to a specific app/project's logs — matches a pane's label (project name) or id (see pane_list). Filters both that pane's server and browser logs. Omit for all apps."New value: +"Scope to a specific app/project — matches a pane's label (project name) or id (see pane_list). Omit for all apps."
      • changedInput schema / properties / sinceSeq / description
        Previous value: -"Only events with seq >= this."New value: +"Only events with seq >= this (for incremental tailing)."
      • addedInput schema / properties / source / description
        Added value: +"Limit to one source: server, browser, or native."
      • changedInput schema / properties / stream / description
        Previous value: -"e.g. stdout, stderr, console, network, pageerror"New value: +"Limit to one stream, e.g. stdout, stderr, console, network, pageerror."
    • Changednative_build2 fields changed
      • addedInput schema / properties / cwd / description
        Added value: +"Project directory to build; defaults to the active pane's project."
      • addedInput schema / properties / platform / description
        Added value: +"Which platform to build: ios or android."
    • Changednative_open1 field changed
      • addedInput schema / properties / platform / description
        Added value: +"Which native target to open: ios (simulator) or android (emulator mirror)."
    • Changedpane_close1 field changed
      • addedInput schema / properties / id / description
        Added value: +"Id of the pane to close (from pane_list)."
    • Changedpane_new1 field changed
      • addedInput schema / properties / url / description
        Added value: +"Optional URL to open in the new pane (else a blank pane)."
    • Changedpane_pop1 field changed
      • addedInput schema / properties / id / description
        Added value: +"Id of the pane to pop out (from pane_list)."
    • Changedpane_select1 field changed
      • addedInput schema / properties / id / description
        Added value: +"Id of the pane to activate (from pane_list)."
    • Addedpane_set_label
    • Changedproject_add1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Unique project name (used to dev_start it later)."
    • Changedproject_remove1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Name of the saved project to remove (see project_list)."
    • Changedrepro5 fields changed
      • changedInput schema / properties / action / properties / key / description
        Previous value: -"for kind=press"New value: +"for kind=press (e.g. Enter, Escape, Tab)"
      • addedInput schema / properties / action / properties / kind / description
        Added value: +"The action to perform."
      • removedInput schema / properties / action / required
        Removed value: -[
        -  "kind"
        -]
      • addedInput schema / properties / actions / items / properties / kind / description
        Added value: +"The action to perform."
      • changedInput schema / properties / waitFor / description
        Previous value: -"How to wait after each action. 'settle' = fixed sleep. 'networkidle' = wait until the page has no network activity (more reliable for slow/streaming responses). Default 'settle'. Applied between steps too, so the next step's target is ready."New value: +"How to wait after each action: 'settle' = fixed sleep; 'networkidle' = wait until no network activity (more reliable for slow/streaming). Default 'settle'."
  6. 37 tool updatesv0.6.0
    • First observedbrowser_clear_storage
    • First observedbrowser_click
    • First observedbrowser_emulate
    • First observedbrowser_eval
    • First observedbrowser_hover
    • First observedbrowser_navigate
    • First observedbrowser_press
    • First observedbrowser_screenshot
    • First observedbrowser_scroll
    • First observedbrowser_select
    • First observedbrowser_snapshot
    • First observedbrowser_throttle
    • First observedbrowser_type
    • First observedbrowser_wait_for
    • First observedbrowser_wait_for_idle
    • First observedclear_logs
    • First observeddev_start
    • First observeddev_status
    • First observeddev_stop
    • First observeddiagnose
    • First observedexport_bundle
    • First observedexport_har
    • First observedget_logs
    • First observedget_logs_around
    • First observedget_network
    • First observednative_build
    • First observednative_close
    • First observednative_open
    • First observedpane_close
    • First observedpane_list
    • First observedpane_new
    • First observedpane_pop
    • First observedpane_select
    • First observedproject_add
    • First observedproject_list
    • First observedproject_remove
    • First observedrepro

TDQS

A4.2/5.0
Disambiguation4/5

Most tools have clearly distinct purposes, especially within prefixed groups (browser_*, pane_*, etc.). A few pairs like export_bundle/export_har and get_logs/get_network could be confused, but thorough descriptions mitigate ambiguity.

Naming Consistency4/5

The naming follows a mostly consistent pattern with verb_noun and prefixed groups (browser_*, dev_*, pane_*, etc.). A few standalone tools like 'diagnose' and 'repro' break the pattern, but overall it's predictable.

Tool Count3/5

With 45 tools, the count is on the high side for a single server. However, each tool serves a distinct function within the broad domain of dev debugging and reproduction, so it's borderline but not excessive.

Completeness5/5

The tool surface is exceptionally complete, covering browser automation, dev server lifecycle, logging and diagnostics, network capture, pane management, project registry, extensions, and native build support. No obvious gaps for the stated purpose.

Maintenance

ActivityActive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vincentvella/devloop'

If you have feedback or need assistance with the MCP directory API, please join our Discord server