Skip to main content
Glama

Argus

An opinionated MCP server that turns your loaded LLM into a senior human QA tester — for web apps and any macOS app on your screen.

$ python -m argus.bench --target all

  buggytasks    22 / 22  = 100 %  in  20.5s
  darkshop      12 / 12  = 100 %  in   8.4s
  ──────────────────────────────────────────
  total         34 / 34  = 100 %  in  28.9s

The 34 / 34 is reproducible from git clone in two commands. The point of Argus is the prompt + the tool surface: when an Opus-class agent (Claude Code, Cursor, etc.) loads this MCP, it stops being "an assistant with browser tools" and starts behaving like a QA tester — hypothesising, observing, verifying persistence, recording reproducible bugs, and refusing to wander off into "let me just complete your flow for you".

The other thing that makes Argus different from the existing browser-MCP crowd: screen mode. Same description-keyed tools, but the target is whatever app is foreground on macOS — Notes, Cursor, Safari, your in-progress feature. No headless Chrome, no scripted Playwright. Argus sees what you see.

Skip to Quick start · Bench · Tool surface · Philosophy


What it is, in one paragraph

Argus is an MCP server that exposes two things:

  1. A role-binding instructions block that tells whichever agent loaded it: "while I'm here, you are a senior QA tester. Stay in role until end_session."

  2. A mode-agnostic tool surface — observe, click_what, type_into, verify_persistence, record_bug, plus the same again for screen-mode (screen_observe, screen_click_what, …) — that the agent uses to drive whatever you point it at.

That's the whole product. There's no detector library, no AI brain wrapped around static rules, no scoring. The agent is the smart layer. Argus is an opinionated, well-instrumented seat to put that agent in.

Related MCP server: argus-qa

What it isn't

  • Not an assertion library. There's no expect(x).toBe(y). The agent reads page state and decides what's a bug.

  • Not an axe / Lighthouse replacement. We deliberately don't run static a11y / SEO / performance scans — those tools already exist and are excellent. Argus only flags what requires human judgement to see.

  • Not a task-completion agent. If you want it to actually buy the thing or send the email, use Browser-Use or Stagehand. Argus's instructions block specifically refuses task completion in favour of testing the flow.

Quick start

# Web mode (works everywhere)
pip install argus-testing
playwright install chromium

# Screen mode (macOS only, optional)
pip install 'argus-testing[mac]'
brew install cliclick    # for keystroke / coordinate fallback

# Wire it into Claude Code
claude mcp add argus -- argus-mcp

# Confirm the version your MCP host will load
argus-mcp --version

After upgrading Argus, restart your MCP host (Claude Code, Cursor, etc.). MCP hosts cache the tool table at startup, so a fresh pip install -U argus-testing won't expose new tools until the host reconnects to the server. argus-mcp --version is the easy way to verify which version your host is actually running.

Then, in your Claude Code / Cursor / any-MCP session:

"Test my app at http://localhost:3000 — find five real bugs."

For screen mode, say "test whatever is on my screen" or specify the app:

"Test the Notes app in screen mode."

Permission check (screen mode)

Screen mode needs Screen Recording + Accessibility grants. Run:

argus-mcp --doctor

It probes both, reports status, and gives you the x-apple.systempreferences: deep-link for any missing grant.

Reproduce the bench

# Start the seeded fixtures
python test-site/app.py             # BuggyTasks   :5555
python human-eye-fixture/app.py     # DarkShop     :5556

# Run all scenarios
python -m argus.bench --target all \
    --json bench-results/matrix.json \
    --md   bench-results/matrix.md

See bench-results/matrix.md for the checked-in artifact.


Bench method

Argus's headline number — 34 / 34 — measures Argus's capability ceiling. Each scenario is a deterministic Python sequence that exercises the same MCP tools an LLM agent would call. We're answering "what's findable through this surface?" — separate from "how often does any specific LLM remember to call the right tool?"

BuggyTasks (mechanical bugs)

22 seeded bugs in a small task-management app: console errors, dead links, fake delete (UI says "deleted!" but data persists on refresh), auth bypass, NaN dates, count-off-by-one, race conditions, etc. These are the "scripted E2E could find them" bugs.

DarkShop (human-eye bugs)

12 seeded bugs in a polished-looking e-commerce fixture: hardcoded "Only 3 left!" scarcity, fake -50% sale badges where original price equals sale price, "free shipping over $50" banner contradicted by a flat $5 in checkout, visual hierarchy inverted ("Add to Cart" demoted while "Subscribe to Newsletter" gets the prominent green button), cross -page state drift (rename succeeds on /account, navbar greeting still shows the old name), and so on. Static analysis catches roughly none of these. They require an agent that observes the page and reasons about what's wrong.

What an agent has to do per scenario

Take BUG #10 in DarkShop: the navbar greeting goes stale after an account rename. The scenario does:

reset(mode="renamed")              # fixture pre-stages a renamed account
observe()                          # read the rendered /account page
                                   # — page shows "Alex-Renamed" in the form
                                   # — navbar still says "Hi, Alex"
record_bug(
    title="Account name change does not update nav greeting",
    severity="medium",
    evidence={"bug_type": "ux_issue", ...},
)

The judgement ("the navbar saying Alex while the form says Alex-Renamed is wrong") lives in the agent. The bench measures whether Argus's surface gives the agent enough information to make that call.

Screen mode

Screen mode is not in the recall matrix — that needs a seeded macOS app with intentional bugs, which is out of scope for v1. Screen mode is validated separately via python -m argus.screen.validate, which walks the AX tree of any running app and reports the elements

  • round-trip identity probes. The checked-in artifact at bench-results/screen_validation.json walks Notes (8 menu-bar items, all localised OS strings — 5 / 5 unique probes).

To exercise screen mode against your own apps:

python -m argus.screen.validate Finder Notes "Google Chrome" \
    --json /tmp/screen.json

The script is read-only — it does not click, type, or move the mouse. Output element counts vary by app: simple system apps expose a few items at the menu-bar level; richer apps (browsers, IDEs) typically expose tens to hundreds.


Tool surface

Web mode

Tool

Purpose

start_session(url)

Launch a Playwright session at url.

observe()

URL + title + interactive elements (description-keyed, no integer indices) + counts + visible feedback + ARIA tree + viewport state.

click_what(description)

Click the element best matching description. Returns the top candidates if ambiguous, rather than guessing.

type_into(description, text)

Resolve a text input by description, then type.

select_into(description, value)

Resolve a <select> by description, then choose.

verify_persistence(expect, target_text, after_url)

Force a fresh GET on after_url and report whether target_text is present or absent. The "Saved!" toast is not proof of persistence; this is.

inspect_element(description)

Computed styles + ARIA + outerHTML + truncation detection for one element.

screenshot(name, element?)

Full viewport, full page, or a tight crop of one element.

screenshot_diff(before, after)

Pillow-based pixel diff with red-tint overlay.

eval_js(code)

Arbitrary JS in the page context. Off by default; enable with --unsafe or ARGUS_UNSAFE_EVAL=1.

record_bug(title, severity, evidence)

The agent calls this after it confirms a real bug. Required: severity in {critical, high, medium, low, info}.

get_errors()

Drain captured console + network events (the only channels not visible in observe).

check_links() / check_performance() / crawl_site()

Probe-style helpers — return raw data, no auto-bug.

end_session()

Close session, write the HTML report.

Screen mode (macOS)

Tool

Purpose

start_screen_session(target_app="")

Bind to the foreground app or to a named running app. Refuses cleanly with deep-link permission instructions if grants are missing.

screen_observe()

Foreground app + window title + AX tree (capped at 200 elements / 6-deep) + screen-coords for every element + screenshot.

screen_click_what(description)

Resolve via AX tree; click via kAXPressAction first, fall back to cliclick coordinate click at the element centre.

screen_type_into(description, text)

Resolve via AX tree; set kAXValue first, fall back to focus + cliclick keystrokes.

screen_press_key(key)

cliclick kp:<key> for return, esc, space, cmd-s, etc.

screen_session_status()

Elapsed time vs cap, action count, abort-file state, last 30 trail entries.

Safety

Screen mode runs against the user's actual machine, so:

  • Per-call timeout — every action wraps in a 15-second budget (ARGUS_SCREEN_PER_CALL_TIMEOUT_S to override). A hung AX query doesn't lock up the agent.

  • Session cap — 30-minute default (ARGUS_SCREEN_SESSION_MAX_SECONDS). After expiry, all screen tools refuse with a clear "start a new session" message.

  • Abort file — touch ~/.argus/abort blocks every subsequent screen action in the current session. Robust panic button that works from any second terminal.

  • Action trail — every screen action records a paired before/after screenshot, automatically.


Philosophy

This section exists because the design choices are opinionated.

Trust the agent, don't simulate intelligence

The agent loaded into Argus is assumed to be Opus-class or stronger. Static rules that pretend to be the smart layer are subtractive: they add maintenance, produce false positives, and pull attention away from what the agent actually saw. So Argus's detector.py is 130 lines — it only captures the two channels the agent literally cannot see (the console event stream and the HTTP layer).

Everything else — "is the page text broken", "is there a count mismatch", "is this a misleading success toast", "is the visual hierarchy wrong" — the agent reads from observe() and decides.

Lock the role; don't bake a checklist

The MCP's instructions block does not tell the agent to fire every XSS payload from a textbook. Smart agents don't need that and benefit from being kept in role rather than handed instructions. The block defines a senior-tester worldview (Map → Hypothesize → Act → Observe → Verify → Record → Cover), bug bar (reproducible, user-affecting, persistent), severity calibration, and a hunting list of "things humans notice that machines miss" — and gets out of the way.

Description-keyed tools

click_what("Login button"), not click(7). Element indices are how dumb LLMs were prompted in 2023; they're a leaky abstraction even within a single observe. A smart agent describes what it wants to interact with by what it is, and Argus's resolver maps that to the right element — refusing to misclick on ambiguity rather than guessing.

Test anything on screen

The web is one target. Real software is hundreds of native macOS apps, Electron things, IDEs, design tools, mobile simulators. Argus's screen backend uses the macOS Accessibility tree as its structured surface and screencapture for pixels — same description-keyed tools, no framework lock-in. v1 is macOS-only; Win/Linux is v2.


Project layout

argus/
├── argus/
│   ├── mcp_server.py          # tool surface + role instructions
│   ├── browser.py             # Playwright web backend
│   ├── detector.py            # console + network event capture (only)
│   ├── differ.py              # state diff for compute_changes
│   ├── resolver.py            # description → element resolver (web + screen)
│   ├── reporter.py            # HTML session report
│   ├── models.py              # Bug / PageState / etc.
│   ├── bench/
│   │   ├── runner.py          # fixture-agnostic harness
│   │   ├── scenarios_buggytasks.py
│   │   └── scenarios_darkshop.py
│   └── screen/
│       ├── permissions.py     # Screen Recording / Accessibility probes
│       ├── backend.py         # AX tree + cliclick + screencapture
│       ├── safety.py          # timeouts, abort file, action trail
│       └── validate.py        # read-only walker for real apps
│
├── test-site/                 # BuggyTasks fixture (22 mechanical bugs)
├── human-eye-fixture/         # DarkShop fixture (12 human-eye bugs)
├── tests/                     # 45 unit tests (resolver, detector, safety, …)
└── bench-results/             # checked-in artifacts (json + md)

Fixture convention

Argus benchmarks against fixtures that expose two HTTP endpoints:

GET  /api/test/state           # full in-memory state JSON
POST /api/test/reset?mode=...  # restore to a known starting state

mode is fixture-defined. BuggyTasks supports seeded / empty / all_done / one_pending. DarkShop supports seeded / with_items / renamed. See docs/FIXTURE_CONVENTION.md for the full spec.

Roadmap

Concrete next-up:

  • Real-world OSS PR — file a real bug report on a real OSS web app, with Argus's run as the evidence trail.

  • Live LLM bench mode — python -m argus.bench --agent <model> swaps the scripted driver for a real LLM, so we measure variance on top of capability ceiling.

  • Screen-mode seeded fixture — a deterministic macOS app with intentional bugs, so the matrix becomes 2 × 2 and screen-mode recall is measurable.

  • VLM resolver fallback — for apps with empty AX trees (some Electron things), use vision to resolve descriptions to coordinates.

License

MIT. See LICENSE.

Author

Built by Yichen Wu. Issues and PRs welcome.

Available Tools

18 tools
capsule_restoreRestore Browser State CapsuleA
Destructive

Restore a saved capsule onto this session and verify it is still live.

Sets the cookies + storage, navigates to the captured URL, then checks the saved liveness marker. Returns whether the restored state is LIVE or STALE. A STALE capsule (the server session expired) cannot be trusted — any bug you record afterwards is flagged unreliable until you re-mint the state.

Args: name: Capsule name to restore (looked up for the current origin).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructive and non-readonly. Description adds detailed behavior: sets cookies+storage, navigates to URL, checks liveness, returns LIVE/STALE, and explains implications of STALE (unreliable bugs until re-mint). This goes well beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise description with front-loaded purpose, clear process steps, and relevant warning. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter, annotations, and existence of output schema, the description fully explains the tool's behavior, return values, and state implications. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter 'name' with 0% schema description coverage. Description adds 'looked up for the current origin', which provides meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool restores a saved capsule onto the session and verifies liveness, with explicit actions (sets cookies+storage, navigates, checks marker). This distinguishes it from sibling tools like start_session or verify_persistence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes the restore-and-verify workflow and warns about STALE capsules. Provides clear context for use, but does not explicitly mention when not to use or compare to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_performanceCheck Browser PerformanceA
Read-onlyIdempotent

Read raw performance metrics from the browser's Performance API (load time, TTFB, request count, large resources).

Argus does not auto-record bugs here — Lighthouse already owns the performance-audit space. Only call record_bug if the page is so slow or so heavy that it materially blocks a real user (multi-second TTFB on a primary flow, multi-MB hero asset, etc).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description confirms it is a read-only operation (consistent with readOnlyHint annotation) and adds context that it does not auto-record bugs. However, it could mention any potential side effects or performance overhead, though none expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise three-sentence description. First sentence front-loads purpose, subsequent sentences provide usage context. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an output schema, the description provides sufficient context: what metrics are read, when to use it, and when to use an alternative tool. Covers all key aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description adds meaning by listing the specific metrics returned, which helps the agent understand the output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads raw performance metrics from the browser's Performance API, listing specific metrics. It distinguishes from sibling tool 'record_bug' by noting that performance auditing is owned by Lighthouse.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool versus record_bug: only call record_bug if performance issues materially block users. No unnecessary use of this tool for auto-recording.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

click_whatClick Element by DescriptionA
Destructive

Click the element best matching the natural-language description.

Examples: "Login button", "Add Task", "the email field", "Delete near Buy groceries". Argus matches against visible text, aria-label, placeholder, name, id, and the parent context. Trailing kind hints ("button" / "field" / "link" / "dropdown") narrow the candidate pool.

If the description is ambiguous, this returns the top candidates with their distinguishing properties so you can rephrase. It does not guess and click — that's how testers misclick.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses matching criteria (visible text, aria-label, placeholder, name, id, parent context) and the non-guessing behavior when ambiguous. This adds significant value beyond annotations, which already indicate destructiveness. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise but includes necessary details like examples and ambiguity handling. It could be slightly more structured, but it is clear and front-loaded with the action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of an NL click tool, the description is comprehensive: it explains the action, matching sources, ambiguity resolution, and safety note. Despite an output schema existing, the description does not need to explain return values further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'description' has 0% schema description coverage, so the description fully compensates by explaining it is natural-language, providing examples, and detailing how it is matched. This is highly informative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool clicks the element best matching a natural-language description. Examples ('Login button', 'Add Task') make the purpose immediately obvious. It distinguishes from siblings like hover_what by focusing on clicking action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use (natural-language description) and how ambiguity is handled (returns top candidates for rephrasing). It does not explicitly mention when not to use or compare to alternatives like hover_what, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

emulate_deviceEmulate Mobile DeviceA

Re-open the current page as a real MOBILE DEVICE — touch, mobile user-agent, device-pixel-ratio, and viewport — not just a viewport resize.

resize() only changes width/height; many mobile bugs need the full device identity: touch-only interactions, mobile-only nav, content gated on a mobile UA, or a broken viewport-meta layout. Session state (cookies/login) carries over, so you can log in on desktop then switch to mobile. Common device names: "iPhone 13", "iPhone SE", "Pixel 5", "iPad Pro 11", "Galaxy S9+". Use resize() for a plain breakpoint sweep; use this for true device emulation. observe() after to see the mobile layout.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate not read-only, but description adds that session state (cookies/login) carries over and that the page is re-opened. This provides useful behavioral context beyond the basic annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: first sentence states core purpose, second explains distinction from resize, third covers state carry-over, fourth gives examples, fifth suggests observation. No redundancy, well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 param, output schema present, annotations provided), the description covers purpose, usage context, behavioral effects, and follow-up actions. It is complete for an agent to correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has a single string parameter with 0% description coverage. The description provides example device names and explains the parameter's role, adding meaning beyond the schema. However, no formal restrictions or enum values are given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool re-opens the page as a mobile device with full device identity (touch, UA, DPR, viewport), distinguishing it from resize() which only changes dimensions. It lists common device names, making the purpose specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts with resize() for plain breakpoints vs true device emulation, recommends using observe() after, and mentions session state carry-over. Provides clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

end_sessionFinish Test and Write ReportsA
Destructive

End the testing session, close the browser, and generate an HTML error report.

Returns the path to the generated report and a summary of findings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set destructiveHint=true. Description adds that the tool generates an HTML error report and returns its path and summary, providing behavioral context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, clear sentences front-load the main action and return value. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and annotations indicating destructiveness, the description provides sufficient context about actions and return values, especially given an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist in the input schema. With 0 parameters, the baseline is 4, and the description does not need to add parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'End the testing session, close the browser, and generate an HTML error report.' It uses a specific verb ('End') and resource ('testing session'), distinguishing it from sibling tools like 'start_session'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use or avoid this tool. Usage is implied as the counterpart to 'start_session', but no alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hover_whatHover over Element by DescriptionA

Hover the mouse over the element best matching description.

Real :hover (not synthetic): triggers tooltips, dropdown-on-hover menus, hover-only action buttons. Use after the element shows up in observe — for divs that observe filters out (figures, plain <div>s with :hover rules), introspect via inspect_element or fall back to eval_js.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond annotations: it states the hover is 'real :hover (not synthetic)' and lists triggered effects like tooltips, dropdown menus, and hover-only buttons. Annotations already indicate non-read-only, non-idempotent, and open-world, and the description enriches this without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise with two sentences plus a usage note. No unnecessary words. The key information is front-loaded (purpose and behavioral trait).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one parameter and an output schema exists, the description provides complete context: what the tool does, when to use it, behavioral details, and alternatives for edge cases. No missing critical information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter `description` has no schema description (0% coverage) and the tool description does not explain what format the description should take (e.g., CSS selector, text, or other). While the tool's purpose is clear, the semantics of the parameter are under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Hover the mouse over the element best matching `description`.' It specifies the verb 'hover' and the resource 'element by description'. Among siblings like click_what and type_into, it distinguishes itself by the hover action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use after the element shows up in observe' and provides alternatives: 'introspect via inspect_element or fall back to eval_js' for elements observe filters out. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

observeObserve Current TargetA
Read-onlyIdempotent

Observe the current target — page, app, or screen. Read this first.

Returns the URL/window, the visible text, every interactive element keyed by description (no integer indices), feedback messages, counts, and any list-shaped repeating content. After every action, observe() again and reason about what changed before acting.

The agent decides what's a bug from this output. Argus does not auto-flag content quality, validation behaviour, or visual issues here — that's your judgment to make.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false. Description adds that Argus does not auto-flag issues, clarifying limitations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences and a line, front-loaded with purpose. Every sentence adds value, no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with output schema, the description fully explains what it returns, when to use it, and what it does not do. Complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters; schema coverage 100%. Baseline 4 as no additional info needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it observes the current target (page, app, or screen) and lists all returned elements. Distinct from sibling tools like screenshot or record_observation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Read this first' and recommends calling after every action. Lacks explicit when-not-to-use or alternative suggestions, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

press_keyPress Browser KeyA
Destructive

Press a keyboard key — the web-mode equivalent testers reach for constantly.

key is a Playwright key name: "Escape" (dismiss a modal/overlay), "Enter" (submit a focused field), "Tab" / "Shift+Tab" (keyboard navigation / focus order), "ArrowDown"/"ArrowUp"/"ArrowLeft"/"ArrowRight" (menus, sliders, listboxes), "Backspace", "Delete", "PageDown", "Home", or a chord like "Control+a". Optionally pass description to focus that element first (e.g. press ArrowRight on "the volume slider"); omit it to press at the page level (e.g. Escape to close whatever modal is open).

Real users hit keys — a modal you can only close with Esc, a form that submits on Enter, arrow-key menu nav, focus-order bugs — none of which click/type can exercise. After it, observe() to see what changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint and openWorldHint. Description adds context about key effects and focusing elements, but does not fully expand on behaviors beyond the action. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured and front-loaded with purpose. Somewhat lengthy but each sentence adds value. Minor redundancy but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given two simple parameters and an output schema, the description is complete. Covers purpose, parameter details, use cases, and next steps (observe). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description carries full burden. It lists valid Playwright key names and explains the description parameter for focusing elements. Adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it presses a keyboard key, lists examples like Escape, Enter, Arrow keys, and distinguishes from click/type. Specific verb+resource with sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when to use (modal close, form submit, arrow navigation, focus-order bugs) and that click/type cannot exercise these. Recommends using observe after. No explicit exclusions but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_bugRecord Confirmed BugA
Destructive

Record a confirmed bug you have identified during testing.

Call this only after you have observed something that meets the bug bar: reproducible, user-affecting, persistent. Do not record speculation or polish nits. The session report is built from these records — be specific.

Args: title: One-line headline, specific. Bad: "Form has issues." Good: "Login form accepts any password — no authentication." severity: "critical" | "high" | "medium" | "low" | "info". HIGH = data loss / security / payment / blocked flow. MEDIUM = workflow friction / confusing UX / cross-page bug. LOW = polish / suggestion-grade. verify: Optional reproduction clause. When the bug has a machine-checkable symptom (something present/absent on a fresh page load), pass it and Argus will INDEPENDENTLY re-load the page and confirm the symptom before recording — turning the bug into a verified, reproducible finding instead of your unverified say-so. This is Argus's anti-false-positive guard; use it whenever the symptom is text-checkable. Shape: {"expect": "present"|"absent", "target_text": "the text that proves the bug", "at_url": "/path"} # optional, defaults to current page Examples: - Fake delete (item survives): {"expect":"present", "target_text":"Buy groceries","at_url":"/tasks"} - Save didn't persist (new value missing): {"expect":"absent", "target_text":"EDITED-XYZ","at_url":"/tasks/1/edit"} IMPORTANT — the target must PROVE the symptom, not a nearby fact. target_text has to be the exact string whose presence/absence ALONE is the bug. For a COUNT or LOGIC inconsistency ("7 pending + 2 done != 8 total") no single text check establishes it — verifying that "8 total" merely EXISTS does not confirm the inconsistency and would stamp a misleading VERIFIED on tangential evidence. Record those as observation-based (omit verify), or verify the specific wrong value that should not be there. For a broken URL or API response whose HTTP status is the proof, use {"expect_status": 404, "at_url": "/missing"} instead of matching error-page copy. Status verification and text verification are alternatives and cannot be combined in one clause. For a MULTI-STEP bug (the symptom only appears after a journey), add "replay": true — Argus re-drives the recorded action trace (click_what/type_into/select_into/navigate) in a fresh cold context and checks the symptom there, giving a stronger "reproduced by replaying N steps from a cold start" receipt (or INCONCLUSIVE if a step no longer resolves). Shape: {"replay": true, "expect": "present"|"absent", "target_text": "the text that proves the bug"} CAUTION: replay re-EXECUTES the journey's steps against the live backend, so any Save/Delete/Add/checkout in the trace runs a second time (real side effect; the receipt reports writes_replayed). Use the plain clean-load verify (no replay) for destructive flows, or accept the re-run. Add "minimize": true to also narrow a confirmed reproduction to the minimal sufficient steps ("you don't need all 7 — 2 and 5 suffice"). Minimization runs ONLY for a write-free journey (it re-runs subsets, which would repeat any writes); it is skipped with a note otherwise. Omit verify entirely for visual/layout/UX-judgment bugs that no single text check captures — those record as observation-based. evidence: Optional dict with extra context. Recommended keys: description (str): Longer explanation including user impact. Default = same as title. steps (list[str]): Reproduction steps. Default = current session step log (everything you did so far). url (str): Page or screen URL. Default = current page URL. screenshot (str): One of "auto" (default — take one now and attach), "skip" (no screenshot), or a label to use as the screenshot filename. Pre-existing screenshot paths are also accepted. bug_type (str): A category for the report. Default "ux_issue". One of: console_error, network_error, visual_anomaly, ux_issue, crash, broken_link, form_error, state_verification, misleading_success, count_mismatch, text_anomaly, broken_image, seo_issue, accessibility, performance, mixed_content. Pick the SPECIFIC type, not the generic ux_issue: a "Saved!" / success toast that lied -> misleading_success; a delete or edit that did not persist -> state_verification; a wrong/inconsistent count or total -> count_mismatch; a JS exception or dead page -> crash; a form losing data / rejecting valid input -> form_error. Reserve ux_issue for genuine usability friction with no better fit — a data-loss or persistence bug labeled "ux_issue" reads as cosmetic next to its HIGH severity.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
verifyNo
evidenceNo
severityYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, and description adds detail: affects session report, verify/replay re-executes steps with side effects, warns about writes_replayed. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structure is good: intro, usage condition, then parameter details. But somewhat verbose; however, each sentence adds necessary value for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, all parameters with examples, behavioral implications, and implicit alternative tools. Complete given tool complexity and output schema existence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully compensates with detailed explanations for all 4 parameters: title with examples, severity with criteria, verify with complex options and warnings, evidence with optional fields and bug_type choices. Adds immense meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states purpose: recording a confirmed bug. Distinguishes from speculation and polish nits, and implicitly from sibling record_observation for unconfirmed observations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call: only after confirming bug bar (reproducible, user-affecting, persistent). Tells when not to call: speculation or polish nits. Provides detailed usage conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_observationRecord QA ObservationA

Record a qualitative review note without classifying it as a bug.

Use this for visual polish, hierarchy, readability, content, responsive, or usability observations that are useful evidence but do not meet the reproducible user-affecting bug bar.

Args: title: Short, specific observation headline. evidence: What is visible and why it matters. category: visual, usability, content, responsive, or accessibility. screenshot: "auto", "skip", an existing image path, or a screenshot label.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
categoryNovisual
evidenceYes
screenshotNoauto

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description correctly indicates a write operation (recording a note), matching the annotation 'readOnlyHint: false'. It adds context about the type of note but does not disclose potential side effects, authentication requirements, or rate limits. However, for a simple observation recording tool, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear purpose statement, usage guidance, and structured parameter descriptions. No unnecessary words; every sentence contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and the presence of an output schema, the description covers all necessary aspects: purpose, usage context, parameter semantics, and differentiation from siblings. It is complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description provides thorough Args section explaining each parameter: title (headline), evidence (what is visible and why it matters), category (with list of possible values), and screenshot (with valid options). This adds significant value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool records a qualitative review note without classifying it as a bug. It explicitly distinguishes from the sibling 'record_bug' by specifying this is for observations that do not meet the bug bar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool (for visual polish, hierarchy, readability, content, responsive, or usability observations that aren't bugs) and implies when not to (for actual bugs, use record_bug).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

regression_checkReplay Regression ChecksA
Destructive

Re-test previously-recorded findings for this site against the CURRENT build — "did my fix land, and did anything I'd fixed come back?".

Findings with a clean-load verify clause are journaled at end_session (per origin). This re-runs each one's INDEPENDENT clean-load check now and classifies it: STILL-PRESENT (the bug is still there), NO-LONGER-REPRODUCES (the symptom is gone — likely fixed; confirm the surface still exists), or INCONCLUSIVE. Each carried finding is treated as a hypothesis and re-checked from scratch — nothing is trusted from the prior run. Read-only (clean GETs); replay-mode findings are not auto-re-driven (that would re-execute writes).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotation contradiction: description claims 'Read-only (clean GETs)' while annotations set destructiveHint=true and readOnlyHint=false. This inconsistency undermines trust. Despite rich behavioral detail, the contradiction is critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Detailed but well-organized with clear sections. Slightly lengthy for a no-param tool, but each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully explains behavior (independent re-checks, classification outcomes, read-only nature) despite no parameters. Output schema exists to cover return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so schema coverage is 100%. Description adds value by explaining the nullary operation's scope and classification logic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool re-tests previously-recorded findings against the current build to verify fixes and detect regressions. Distinct from siblings like 'record_bug' or 'observe' by focusing on replay and classification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes when to use (post-deployment regression check) and implicitly when not to (not for new captures). Lacks explicit alternatives but context from siblings provides enough guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resizeResize Browser ViewportA

Resize the viewport mid-session to test RESPONSIVE layouts.

Real users are on phones, tablets and desktops, and mobile-only bugs (a hamburger that never appears, content that doesn't reflow, an overlay that covers the page, tap targets that overlap) are exactly the class scripted E2E misses. Unlike opening a fresh session at a mobile width, this keeps your current state (logged in, cart filled, form typed) so you can compare the SAME page across breakpoints and test the transition itself. Common widths: 375 (mobile), 414 (large phone), 768 (tablet), 1280/1440 (desktop). After it, observe() to see the reflowed layout.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYes
heightYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false (mutation), openWorldHint=true (not deterministic). The description adds behavioral context: it keeps current state (logged in, cart, form) and allows testing transitions. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with purpose, then practical usage details. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema and annotations, the description covers the main behavioral aspects, use case, and post-action. It lacks minimum/maximum constraints but is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description compensates by providing common width values (375, 414, 768, 1280/1440) and implying pixel units. It could also suggest common height values or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool resizes the viewport mid-session for testing responsive layouts, with a specific verb and resource. It distinguishes from siblings like emulate_device by focusing on viewport size only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool (to test transitions and keep state) versus opening a fresh session. It also suggests post-resize action (observe). However, it does not explicitly compare to emulate_device or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotCapture ScreenshotA

Capture a screenshot — full viewport, full page, or one element.

Use this whenever something looks visually off and you want evidence for a record_bug call, or when you want a before/after pair to feed into screenshot_diff.

Args: name: Filename label (no extension). element: Optional element description (same syntax as click_what). If given, crops the screenshot to that element's bounds. Use for visual hierarchy / truncation / contrast checks. full_page: If True, capture the entire scrollable page rather than just the viewport. Ignored when element is set.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoscreenshot
elementNo
full_pageNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes cropping behavior (element), full_page vs viewport, and that full_page is ignored when element is set. Annotations provide safety hints; description adds valuable context beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficient two-sentence summary plus well-structured parameter list. No wasted words; front-loaded with main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully covers all parameters, usage guidance, and behavioral nuances. No missing information for a screenshot capture tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are explained in detail: name as filename label, element for cropping with reference to click_what syntax, full_page behavior and interaction with element. Adds meaning despite 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Capture a screenshot' with specific modes (full viewport, full page, one element), distinguishing it from sibling tools like screenshot_diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: for visual evidence or before/after pairs, and mentions alternative tools (record_bug, screenshot_diff).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshot_diffCompare ScreenshotsA

Compare two screenshots and produce a third image with changed regions highlighted in red, so you can see what visually changed between two states.

Useful for detecting layout shifts, content updates that should not have happened, focus-ring changes after a click, modal overlays appearing, theme switches, etc. Argus does not auto-judge whether a diff is a bug — you read the side-by-side and decide.

Args: before: Path or filename of the earlier screenshot (returned from a previous screenshot() call). after: Path of the later screenshot. name: Label for the output diff image. threshold: 0-255 per-channel pixel difference above which a pixel is considered "changed". Default 25 (mild). Lower = more sensitive.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNodiff
afterYes
beforeYes
thresholdNo

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations show readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false. The description says it 'produce[s] a third image', implying a new file is created. It does not specify whether this tool modifies any existing files or requires specific permissions, but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear summary paragraph followed by an Args section. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters, no output schema, and 17 sibling tools, the description covers purpose, parameters, use cases, and limitations. It is complete enough for an agent to decide when and how to invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description fully explains all four parameters: 'before' and 'after' as screenshot paths, 'name' as output label, and 'threshold' with range (0-255) and default (25). It adds meaning beyond the schema's titles and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as comparing two screenshots and producing a diff image with highlights. It uses specific verbs ('compare', 'produce') and distinguishes itself from sibling tools like 'screenshot' (capture) and 'observe' (check existence).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete use cases (layout shifts, content updates, focus-ring changes, modal overlays, theme switches) and explicitly states what the tool does NOT do ('does not auto-judge whether a diff is a bug'). It lacks explicit alternatives or conditions to avoid using it, but offers strong contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_sessionStart Browser TestA
Destructive

Start a browser testing session and navigate to the given URL.

Args: url: The URL to test (e.g. http://localhost:3000) headless: Run browser without visible window (default True) viewport_width: Browser viewport width in pixels viewport_height: Browser viewport height in pixels include_observation: Return the initial page observation in this call. review_mode: exploratory, visual, or regression.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
headlessNo
review_modeNoexploratory
viewport_widthNo
viewport_heightNo
include_observationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true and readOnlyHint=false, but the description does not elaborate on what destructive behavior occurs (e.g., terminating previous sessions). It adds context about navigating to a URL but omits details about session lifecycle or async behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: one sentence for purpose followed by a brief bullet list of parameters. Every sentence adds value, and the structure is clean and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's role as a session starter, the description covers core purpose and parameters. Output schema exists, so return values need not be described. However, it could mention that this tool is required before using other browser tools. Overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds clear meaning to each parameter beyond the schema titles, including example URL format, default values for headless and viewport, and the purpose of review_mode. Even though schema coverage is 0%, the description compensates well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title 'Start Browser Test' and description 'Start a browser testing session and navigate to the given URL' clearly state the verb (start), resource (browser test session), and specific action (navigate to URL). This distinguishes it from sibling tools like end_session or click_what.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives (e.g., capsule_restore) or when not to use it. The description implies it is the entry point for browser testing but does not state prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

type_intoType into Field by DescriptionA
Destructive

Type text into the input element best matching description.

Examples: type_into("email", "alice@x.com"), type_into("confirm password", "...") , type_into("the search box", "buy"). Resolution rules are the same as click_what — see that tool for ambiguity behaviour.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, making the mutation behavior transparent. The description adds no additional behavioral context beyond the action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with purpose, and includes essential examples and cross-references without extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple parameter set and presence of output schema and annotations, the description is largely complete, though it could add detail on behavior when no match is found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description only provides examples for 'text' and 'description' but does not explain the matching resolution or constraints for 'description', leaving parameter semantics underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Type `text`') and the resource ('input element best matching `description`'), with examples that differentiate from sibling tool 'click_what' by referencing its resolution rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Examples and cross-reference to 'click_what' for ambiguity behavior provide clear usage guidance, though it lacks explicit 'when not to use' context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_fileUpload File to Matching InputA
Destructive

Attach one or more local files to the file <input> matching description.

Wraps Playwright's set_input_files — works on both visible and hidden file inputs (most modern UIs hide the real input behind a styled label). For drag-drop upload zones that don't have an underlying <input type=file>, this won't work; use drop_file.

Args: description: Match the file input. "file", "upload", or the visible label text. paths: List of absolute paths to files to attach. Single file: pass a one-element list.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and openWorldHint=true. Description adds that it wraps Playwright's set_input_files and works on hidden inputs, providing useful context beyond annotations. No contradiction; slight gap on side effects or file overwriting not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs with no extraneous content. First paragraph states purpose and mechanism, second lists arguments. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers input parameters, alternative tool, and underlying mechanism. Missing explicit mention that paths must be absolute and files must exist, but given output schema exists (not shown), overall adequate. Could be slightly more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully explains both parameters: description (how to match input) and paths (list of absolute paths, single file as one-element list). Adds practical value beyond schema structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it attaches files to a file input element, with specific verb 'attach'. Differentiates from sibling drop_file by specifying it works on file inputs (visible/hidden) and not on drag-drop zones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (file inputs, visible or hidden) and when not (drag-drop zones without underlying input, use drop_file). Provides practical guidance on description argument: 'file', 'upload', or visible label text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_persistenceVerify State after ReloadA
Destructive

Force a fresh page load and report whether target_text is present or absent — your tool for catching the "Saved!" toast that lied.

After any destructive or persistence-changing action (delete, edit, save, submit, toggle, payment, etc.), the success toast is not proof. Only a fresh GET on the relevant page is. This tool does that GET and reports presence — you decide whether the result matches what you expected.

Examples: verify_persistence("absent", "Buy groceries", "/tasks") — after deleting "Buy groceries", confirm it's gone from the list. verify_persistence("present", "EDITED-VALUE-XYZ", "/tasks/1/edit") — after editing, confirm the new value reloads.

Argus does not auto-record a bug here. If presence does not match your expectation, call record_bug.

Args: expect: "present" or "absent" — what state the target_text should be in after the fresh page load. target_text: The text or value you're checking for. after_url: Page to load and inspect. Defaults to the current URL. clear_storage: When True, wipe localStorage/sessionStorage before the reload so you test TRUE server persistence — a "Save" that only wrote client storage will read absent (data would be lost on another device/browser). Default False keeps client storage (proves server-backed truth without logging out). Use True when the feature is supposed to persist to a server/account. If clearing logs the app out, the result is unreliable — re-check without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
expectYes
after_urlNo
target_textYes
clear_storageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, but description adds critical details: it forces a fresh GET, clears storage optionally (with explanation of impact including potential logout), and states that Argus does not auto-record bugs. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections, examples, and front-loaded essential information. Every sentence adds value; no fluff. Length is justified by the need to explain parameters and usage nuances.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With output schema present, description covers all necessary aspects: purpose, usage guidelines, parameter semantics, behavioral effects, and fallback to record_bug. Handles edge cases like clear_storage causing logout. Highly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully explains each parameter: expect (present/absent), target_text (what to check), after_url (page to load, defaults to current URL), clear_storage (wipes client storage with detailed effect implications). Compensates completely for missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states 'Force a fresh page load and report whether target_text is present or absent', clearly identifying verb (verify) and resource (state after reload). Distinguishes itself from siblings by positioning as the tool for catching misleading success toasts after persistence-changing actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context: use after destructive/persistence-changing actions, and when not to trust success toasts. Includes two examples and directs to call record_bug on mismatch. Lacks explicit 'when not to use' statement, but context is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 30 tool updatesv0.5.1
    • Addedcapsule_restore
    • Removedcheck_links
    • Removedclick
    • Addedclick_what
    • Removedcrawl_site
    • Addedemulate_device
    • Removedget_errors
    • Removedget_page_state
    • Removedgo_back
    • Addedhover_what
    • Removednavigate
    • Addedobserve
    • Addedpress_key
    • Addedrecord_bug
    • Addedrecord_observation
    • Addedregression_check
    • Addedresize
    • Changedscreenshot3 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "default": "",
        +  "title": "Element",
        +  "type": "string"
        +}
      • addedInput schema / properties / full_page
        Added value: +{
        +  "default": false,
        +  "title": "Full Page",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "screenshotOutput",
        -  "type": "object"
        -}New value: +null
    • Addedscreenshot_diff
    • Removedscroll_down
    • Removedselect_option
    • Changedstart_session2 fields changed
      • addedInput schema / properties / include_observation
        Added value: +{
        +  "default": true,
        +  "title": "Include Observation",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / review_mode
        Added value: +{
        +  "default": "exploratory",
        +  "title": "Review Mode",
        +  "type": "string"
        +}
    • Removedtest_action
    • Removedtest_crud
    • Removedtest_form
    • Addedtype_into
    • Removedtype_text
    • Addedupload_file
    • Removedverify_action
    • Addedverify_persistence
  2. 18 tool updatesv0.4.0
    • First observedcheck_links
    • First observedcheck_performance
    • First observedclick
    • First observedcrawl_site
    • First observedend_session
    • First observedget_errors
    • First observedget_page_state
    • First observedgo_back
    • First observednavigate
    • First observedscreenshot
    • First observedscroll_down
    • First observedselect_option
    • First observedstart_session
    • First observedtest_action
    • First observedtest_crud
    • First observedtest_form
    • First observedtype_text
    • First observedverify_action

TDQS

A4.4/5.0

Scored across 18 tools

Disambiguation5/5

Each tool has a clear, distinct purpose covering different aspects of testing: session management, interactions, observation, verification, and bug recording. No two tools overlap in functionality.

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern (e.g., click_what, upload_file, verify_persistence). The naming is predictable and informative.

Tool Count5/5

With 18 tools, the set is well-scoped for a testing framework. Each tool provides essential functionality without unnecessary redundancy or clutter.

Completeness4/5

The tool surface covers the full testing lifecycle from session start to end, including interaction, observation, verification, and bug reporting. Minor gaps like explicit scroll or reload tools are absent but can be worked around.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Browser-based QA testing for AI-built software. Agents open real browsers (via Selenium), navigate pages, fill forms, click buttons, and report findings. Two modes: targeted tests (30-90s) and full-site discovery scans (3-15min).
    -
  • A
    license
    A
    quality
    C
    maintenance
    Point your coding agent at a URL and get a real-browser QA audit: broken signup/login/checkout flows, JS console errors, missing analytics, consent + security headers, mobile tap targets, and accessibility — returned as machine-verified findings graded A-F.
    44
    2
    Apache 2.0
  • F
    license
    A
    quality
    D
    maintenance
    Enables AI agents to perform comprehensive web application testing including visual, functional, performance, accessibility, and SEO analysis using browser automation without requiring API keys.
    7
    -