capture is the expensive step; after it, run is pure dispatch and verify tells you whether the page still matches. What makes verify more than a status check is that capture ranks four sources by trust — JSON-LD and schema.org first, then the API JSON the page itself fetches, then semantic HTML, then CSS classes — so a plan built on a canonical source can be re-checked against it later. Two edges to know: verify reaches the live site even though it changes nothing there, and a run that aborts mid-act parks at intent_uncertain until mark closes it.
A browser action layer built on saved taps. A capture step reads the page under the browser session already signed in on your machine and compiles a plan; a replay step repeats that task with no model involved. Taps are addressed as tap://{site}/{name} resources whose argument schema and provenance come from a resource read.
- capture turns a URL plus an intent written in plain language into a saved tap, working out selectors, fields and return shape at that moment.
- run replays a saved tap in your authenticated browser with cache mode, cache TTL and field selection, and costs no model tokens because the compilation already happened.
- verify runs a tap's observe phase alone and reports live, drifted or unreachable, derived from status codes, op expectations and parse results — without executing the act phase or touching the target.
- mark settles an intent_uncertain record as committed or aborted once you have checked what actually happened on the site.
Node to launch it — `npx -y @taprun/cli mcp stdio` — or `npx -y @taprun/cli embed cursor` (also vscode, claude-desktop, claude-code, codebuddy, qwen) to write the client config for you. Public pages need nothing else; `--no-extension` runs a Playwright runtime on its own isolated profile. Reusing your live logins takes the Chrome extension, and adding it from the Chrome Web Store is the one step that happens outside the chat. capture calls a model you supply: Claude, OpenAI, DeepSeek or any OpenAI-compatible endpoint, including a local Ollama or LM Studio through `tap config set ai.baseUrl`.
One command — npx -y @taprun/cli mcp stdio
