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.

VerifiedSTDIODesktop onlyBrowser AutomationDeveloper Tools

Overview

AI-generated 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.
Before you install
The browser acts on live pages: click, fill, press and eval can submit forms, change data or trigger purchases, and eval runs JavaScript in the page. Traces, including page aria-snapshots and visited URLs, are written as JSON files under COWORK_QA_DATA, so point that directory somewhere you are comfortable storing that content. eval does not return its value to the caller, and session_observe calls are not counted in the trace's step count.

Installation

In SourceWeft

  1. Open Cowork Qa in the dashboard and add it to a workspace.
  2. 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

[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 installnpx cowork-qa-mcp
# Or install globallynpm install -g cowork-qa-mcp

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

Wire into your MCP-compatible client

Claude Code

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

To watch the browser instead of running headless:

bash
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):

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.gitcd cowork-qa-mcpnpm installnpm run buildnode 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:

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:

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.

Source: README.md at commit bdf3971

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  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