Verify-first, human-like browser control for AI agents. Exposes Tsaagan's browser automation capabilities via Model Context Protocol over stdio, with accessibility-tree perception, self-healing stable-ref grounding, structural post-condition verification, and autonomous planner→navigator→validator loop.
Tsaagan demonstrates strong naming conventions (verb_noun pattern: tsaagan_navigate, tsaagan_click, tsaagan_snapshot) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 13 tools have clear, actionable descriptions explaining WHAT, WHEN, and WHY. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present and correct. Input schemas are complete with proper types and descriptions for all parameters. However, output schemas are NOT documented, the tool descriptions mention what verify blocks or accessibility trees are returned, but the actual response structure is not formally specified. This forces LLMs to infer output shape. Error handling is implicit (tools mention 'connection error' but no structured error taxonomy). Parameter descriptions are strong (avg 85 chars), with good use of enums (direction in tsaagan_scroll) and defaults (full=false, timeout=15000). Composition is excellent: each tool has one clear responsibility, and tool chains are well-designed (snapshot → click/type → verify pattern). No security issues detected in parameter design (no secrets exposed). Missing: formal output schema documentation and explicit error recovery guidance.
Assert the current page state without acting: expected text present, URL match, or a selector visible. Use as a final proof-of-success check after a sequence of actions.
Click an element by stable ref, CSS selector, or visible text. Returns a verify block (urlChanged, console errors, failed requests, optional expected-text) so you know it worked without a separate snapshot. Prefer ref (from tsaagan_snapshot) — it survives DOM re-renders where selectors break.
Extract structured data from the current page using a natural-language query, from the accessibility tree (no vision needed).
Fill multiple fields in one call, each by ref/selector/role+name, then optionally submit. Returns a verify block (urlChanged, console errors, failed requests, optional expected-text) so you know it worked without a separate snapshot.
Navigate the browser to a URL. Returns a verify block (urlChanged, console errors, failed requests, optional expected-text) so you know it worked without a separate snapshot. Use tsaagan_snapshot afterward to read the page.
Output schemas not formally documented. Tool descriptions mention 'verify block' and 'accessibility tree' but response structure is not specified in JSON Schema. LLMs must infer output shape from description text alone.
Error handling lacks structured taxonomy. Tools mention 'connection error' and 'failed requests' but do not define error categories (retryable vs fatal) or recovery guidance. LLMs cannot determine next steps on failure.
tsaagan_fill_form fields array items lack required constraint. The 'fields' array has items with properties {ref, selector, role, name, value}, but only 'value' is marked required. LLMs may pass incomplete field specs without a locator (ref/selector/role+name).
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2025-06-18+ | v2 |
Press a key or chord (e.g. "Enter", "Escape", "Control+A"). Returns a verify block (urlChanged, console errors, failed requests, optional expected-text) so you know it worked without a separate snapshot.
Capture a PNG screenshot of the page. Use only as a fallback when tsaagan_snapshot cannot identify an element (canvas/WebGL UIs). For normal pages, tsaagan_snapshot is cheaper and more reliable.
Scroll the page up or down, or until a target text is in view. Use when content is below the fold and missing from the snapshot.
Select an option in a dropdown by value (or label). Returns a verify block (urlChanged, console errors, failed requests, optional expected-text) so you know it worked without a separate snapshot.
Capture the current page as an accessibility tree with stable element refs (e1, e2...). No screenshot, no vision model needed — cheaper and more reliable than pixels. Pass full=true for the complete tree; default returns the interactive/condensed view.
Report whether the Tsaagan daemon is running, the active mode (Playwright CDP / macOS native / MV3 extension), and the current page URL/title. Call this first if other tools return a connection error.
Type text into an element (by ref/selector) with human-cadence keystrokes. Set submit=true to press Enter after. Returns a verify block (urlChanged, console errors, failed requests, optional expected-text) so you know it worked without a separate snapshot.
Wait for a condition before proceeding: text to appear, a selector, a URL substring, or network idle. Prefer this over fixed sleeps after async actions.
tsaagan_extract query parameter lacks format guidance. Description says 'natural-language query' but does not specify expected response structure (JSON object, array, key-value pairs). LLMs cannot reliably parse unstructured extraction results.
tsaagan_wait_for parameters are mutually exclusive (text, selector, url, networkidle) but schema does not enforce this. LLMs may pass multiple conditions, creating ambiguous behavior.