
Cowork Qa
io.github.inSideos-designsPublished by GitHub account inSideos-designsv0.1.1Updated Oct 24, 2026
Goal-driven Playwright browser sessions for LLMs, with full action traces and aria-snapshots.
Overview
Gives an assistant a real Chromium browser via Playwright, records every action toward a stated goal, and returns a structured trace for review.
- What you can do
- Runs goal-driven browser sessions with five tools: session_start opens a tab and returns a session id, session_act performs goto, click, fill, press or eval, session_observe returns the current URL and full aria-snapshot, session_end closes the tab and persists the trace, and qa_get_trace returns the goal, every step, the final URL and final aria-snapshot. Each action is recorded with timestamps, the URL after it, and the page's aria-snapshot, so the orchestrating model can judge after the fact whether the goal was met.
- When to use it
- Useful when an assistant needs to drive a real browser toward a stated goal and you want an auditable record of what it did, rather than stateless click-and-read loops. Suited to scripted web checks and post-run grading of a browsing session.
- Requirements
- Local process over stdio; Node 20 or newer, installed via npx or npm (cowork-qa-mcp). The first install pulls Chromium through Playwright's postinstall (about 150 MB). Optional environment variables: COWORK_QA_DATA sets the trace output directory (default /.cowork-qa) and COWORK_QA_HEADED=1 shows the browser window instead of running headless. Desktop only; no authentication declared.
Installation
In SourceWeft
- Open Cowork Qa in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
cowork-qa-mcp
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_tracecall.
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
Install
Requires Node 20+. The package is on npm — no clone needed.
The first install pulls Chromium via Playwright's postinstall (~150 MB).
Wire into your MCP-compatible client
Claude Code
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.
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
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)
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
Usage example
A typical end-to-end loop the orchestrating LLM runs:
Trace format
Each trace is a JSON file:
Limitations / known quirks
session_observecalls don't show up in the trace's step count — onlysession_actcalls do. The final aria-snapshot is captured atsession_end.evalruns 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")), androle=selectors all work.
License
MIT — see LICENSE.
Contributing
PRs welcome. Keep it small: this is meant to stay a thin, auditable server.
Source: README.md at commit bdf3971
Tools
0Version history
1- v0.1.1LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts