The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Cowork Qa listing page.

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.
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:
goto, click, fill, press, eval) is recorded with timestamps, the URL after, and the page's aria-snapshot.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.
| Tool | What it does |
|---|---|
session_start | Open a fresh tab, optional starting URL, return a session id |
session_act | Run one of: goto, click, fill, press, eval. Records the step. |
session_observe | Return current URL + full aria-snapshot of the page |
session_end | Close the tab, persist the trace to disk, return the file path |
qa_get_trace | Return the goal, every step, final URL, and final aria-snapshot — formatted for an LLM to read |
Requires Node 20+. The package is on npm — no clone needed.
The first install pulls Chromium via Playwright's postinstall (~150 MB).
To watch the browser instead of running headless:
Verify with /mcp inside a fresh claude session — you should see cowork-qa ✓ connected and 5 tools.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Any client that speaks the MCP stdio transport works. Point its server config at npx -y cowork-qa-mcp.
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.
| Variable | Default | Purpose |
|---|---|---|
COWORK_QA_HEADED | unset (headless) | Set to 1 to launch Chromium with a visible window |
COWORK_QA_DATA | <cwd>/.cowork-qa | Directory where <session-id>.json traces are written |
A typical end-to-end loop the orchestrating LLM runs:
Each trace is a JSON file:
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.button:has-text("Send")), and role= selectors all work.MIT — see LICENSE.
PRs welcome. Keep it small: this is meant to stay a thin, auditable server.