Cowork Qa logo

Cowork Qa

Goal-driven Playwright browser sessions for LLMs, with full action traces and aria-snapshots.

Install Cowork Qa

Pick your client, then add it in one click or paste the config.

STDIONode.js
~/Library/Application Support/Claude/claude_desktop_config.json
claude_desktop_config.json
{
  "mcpServers": {
    "cowork-qa": {
      "command": "npx",
      "args": [
        "-y",
        "cowork-qa-mcp"
      ]
    }
  }
}

Settings → Developer → Edit Config, merge this into mcpServers, then fully quit and reopen Claude Desktop.

We couldn’t confirm it starts correctly

The install command started, but didn't respond the way we expected when we tried to talk to it.

npx -y cowork-qa-mcp

initialize succeeded but no response to tools/list.

This is an experimental automated check and can have false negatives — missing environment variables, a slow cold install, etc. It doesn’t necessarily mean something’s wrong. Last checked 1d ago.

Overview

Tools5

What Cowork Qa lets your agent do. Expand a tool for its parameters.

Self-reported~100 tokens of context

Security & health

What it can reach and how reliably it runs — from our own checks, not the maintainer’s claims.

ActiveLast checked Today

Recent health check succeeded.

12/12 checks healthy over the last 57d

Supply-chain signal

No high-severity advisories surfaced by our automated scan.

Critical 0High 0Medium 0Low 0

Scanned 13d ago via OSV.dev · cowork-qa-mcp (npm)

Adoption & maintenance

Factual signals from GitHub, npm, and our automated checks — not a rating.

npm downloads135Package downloads in the last 30 days.
Last commit6mo agoMost recent push to the default branch.
Install checkInconclusiveStarted but did not complete the MCP handshake in our test.
Tools exposed5Callable tools this server registers over MCP.

From the project README

cowork-qa-mcp

demo

A Model Context Protocol server that gives an LLM a real Chromium browser, records every action it takes toward a stated goal, and hands back a structured trace so the LLM (or a second LLM) can decide whether the goal was actually achieved.

Built on Playwright. Five tools, one binary, no cloud dependency.

Why

Most browser-tool MCP servers are stateless — the LLM clicks, gets HTML back, repeats. There's no record of what happened, no way to grade the run after the fact, and no goal context.

cowork-qa-mcp flips that:

  • Every session starts with a goal in plain English.
  • Every action (goto, click, fill, press, eval) is recorded with timestamps, the URL after, and the page's aria-snapshot.
  • When the session ends, a JSON trace is persisted to disk and exposed via a single qa_get_trace call.

The orchestrating LLM can then reason over the trace ("did this run actually fulfill the goal, or did it click the wrong button?") instead of trusting the run-time chatter.

Tools

ToolWhat it does
session_startOpen a fresh tab, optional starting URL, return a session id
session_actRun one of: goto, click, fill, press, eval. Records the step.
session_observeReturn current URL + full aria-snapshot of the page
session_endClose the tab, persist the trace to disk, return the file path
qa_get_traceReturn the goal, every step, final URL, and final aria-snapshot — formatted for an LLM to read

Install

Requires Node 20+. The package is on npm — no clone needed.

bash
# Try it once, no install
npx cowork-qa-mcp

# Or install globally
npm install -g cowork-qa-mcp

The first install pulls Chromium via Playwright's postinstall (~150 MB).

Wire into your MCP-compatible client

Claude Code

Terminal
claude mcp add cowork-qa --scope user -- npx -y cowork-qa-mcp

To watch the browser instead of running headless:

Terminal
claude mcp add cowork-qa --scope user \
  -e COWORK_QA_HEADED=1 \
  -- npx -y cowork-qa-mcp

Verify with /mcp inside a fresh claude session — you should see cowork-qa ✓ connected and 5 tools.

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

config.json
{
  "mcpServers": {
    "cowork-qa": {
      "command": "npx",
      "args": ["-y", "cowork-qa-mcp"]
    }
  }
}

Cursor / Windsurf / other MCP clients

Any client that speaks the MCP stdio transport works. Point its server config at npx -y cowork-qa-mcp.

From source (for development)

bash
git clone https://github.com/inSideos-designs/cowork-qa-mcp.git
cd cowork-qa-mcp
npm install
npm run build
node dist/server.js   # stdio server, expects an MCP client

MCP Registry

This server is also published on the official MCP Server Registry as io.github.inSideos-designs/cowork-qa — clients that auto-discover from the registry will find it without any manual config.

Environment variables

VariableDefaultPurpose
COWORK_QA_HEADEDunset (headless)Set to 1 to launch Chromium with a visible window
COWORK_QA_DATA<cwd>/.cowork-qaDirectory where <session-id>.json traces are written

Usage example

A typical end-to-end loop the orchestrating LLM runs:

Code
session_start({ goal: "find the cheapest 14\" MacBook Pro on apple.com",
                url: "https://www.apple.com/shop/buy-mac/macbook-pro" })
  → { session_id: "abc-123" }

session_observe({ session_id: "abc-123" })
  → URL + aria-snapshot

session_act({ session_id: "abc-123", action: "click",
              target: "button:has-text('Continue')" })

# ... more acts / observes ...

session_end({ session_id: "abc-123" })
  → { steps: 7, trace_path: "~/.cowork-qa/abc-123.json" }

qa_get_trace({ session_id: "abc-123" })
  → Goal: ...
    Steps (7 total): ...
    Final URL: ...
    Final aria-snapshot: ...

Trace format

Each trace is a JSON file:

config.json
{
  "session_id": "abc-123",
  "goal": "...",
  "steps": [
    {
      "t": 142,
      "action": "click",
      "args": { "target": "...", "value": null },
      "url_after": "...",
      "aria_after": "..."
    }
  ],
  "final": { "url": "...", "aria": "..." },
  "path": "/.../abc-123.json"
}

Limitations / known quirks

  • session_observe calls don't show up in the trace's step count — only session_act calls do. The final aria-snapshot is captured at session_end.
  • eval runs the JS expression but doesn't return the value to the caller — only side effects on the page are observable.
  • One Chromium process is shared across all sessions in a server instance; each session gets its own context (cookies, etc. are isolated).
  • Selectors are passed straight to Playwright. CSS, text-selectors (button:has-text("Send")), and role= selectors all work.

License

MIT — see LICENSE.

Contributing

PRs welcome. Keep it small: this is meant to stay a thin, auditable server.

Reviews

No reviews yet — be the first to share how it worked for you.

Frequently Asked Questions about Cowork Qa

cowork-qa is an MCP server that gives an LLM a real Chromium browser for goal-driven Playwright sessions. It starts each session with a plain-English goal, records browser actions with timestamps, resulting URLs, and aria-snapshots, then persists a structured JSON trace for evaluating whether the goal was achieved. It runs without a cloud dependency.

cowork-qa provides five tools: session_start opens a fresh tab, session_act performs goto, click, fill, press, or eval actions, session_observe returns the current URL and aria-snapshot, session_end closes the tab and saves the trace, and qa_get_trace returns the recorded session results.

Run cowork-qa with npx using `npx -y cowork-qa-mcp`, or install it globally with `npm install -g cowork-qa-mcp`. It requires Node 20 or newer, and the Playwright installation downloads Chromium.

cowork-qa records each browser action with its timestamp, resulting URL, and page aria-snapshot. When the session ends, it writes a JSON trace containing the goal, steps, final URL, and final aria-snapshot to the configured data directory.

Yes. Set `COWORK_QA_HEADED=1` when starting the server to launch Chromium with a visible window; otherwise, the default mode is headless.

Related MCP servers

Add a badge to your READMEShow it’s listed — live SVG, Markdown or HTML.

AllMCPs Directory Badge

Full Badge Customizer

Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.

Badge Style:
Live Dynamic SVG PreviewCowork Qa AllMCPs Directory Badge
Markdown (GitHub README)
[![AllMCPs](https://allmcps.com/api/badge/cowork-qa?style=directory)](https://allmcps.com/mcp/cowork-qa)
HTML Embed
<a href="https://allmcps.com/mcp/cowork-qa"><img src="https://allmcps.com/api/badge/cowork-qa?style=directory" alt="Cowork Qa on AllMCPs" /></a>