Skip to main content
Glama

Why acrawl?

Most browser agents stop at navigate and click. acrawl goes further: the agent can also inspect network requests, analyze console errors, measure page performance, audit accessibility, and intercept network calls — the full DevTools surface, available as first-class agent tools.

It ships as a single Rust binary. No Python runtime, no Node runtime, no Docker. Drop it into any server or CI pipeline and describe a goal; the agent figures out what to visit, what to click, what to inspect, and when it's done.

  • One binary, zero runtimes. cargo build --release produces a self-contained executable. No Python, no Node runtime — just Rust and a Chromium download for browser automation.

  • Acts and observes. The agent has the full DevTools surface as first-class tools: inspect network requests with timing, analyze and deduplicate console logs, stream WebSocket messages, measure page performance (TTFB, resource breakdown), audit cookies and browser storage, measure JS/CSS coverage, run axe-core WCAG accessibility audits, and intercept or mock network calls. No other agent framework exposes this.

  • Deterministic where you can, AI where you must. Define loops, conditionals, and parallel branches as JSON scripts — executed without any LLM calls. Fall back to the agent when pages behave unexpectedly. Best of both worlds.

  • No code required. Describe the goal in plain English. The agent plans, navigates, and extracts.

  • Smart fetching. Static pages are served over HTTP (fast). When JavaScript or interaction is needed, acrawl detects JS framework markers (__next_data__, __nuxt, __vue, ng-app, React roots), auth redirects, and short <noscript> bodies — then transparently escalates to a headless browser.

  • Sub-agent parallelism. Fork child agents onto separate browser tabs with independent state and step budgets. A URL-claiming registry prevents siblings from crawling the same page twice.

  • MCP client and server. Extend the agent with custom tools via Model Context Protocol servers. Or flip it: acrawl mcp exposes 38 browser and DevTools tools plus run_goal to Claude Code, Cursor, VS Code, Zed, and 13 other clients.

  • 25 LLM providers. Anthropic, OpenAI, Google Gemini, DeepSeek, AWS Bedrock, Azure OpenAI, Vertex AI, GitHub Copilot, Groq, Mistral, xAI, Cohere, Alibaba DashScope, OpenRouter, and more. Or bring your own via any OpenAI-compatible endpoint.

How does it compare?

vs. AI web agents and scraping tools

acrawl

browser-use

Stagehand

Skyvern

Firecrawl

Playwright MCP

Scrapy

Playwright scripts

No code needed

Yes

No

No

Partial

No

No

No

No

Single binary

Yes

No

No

No

No

No

No

No

JS rendering

Yes

Yes

Yes

Yes

Yes

Yes

No

Yes

LLM-powered navigation

Yes

Yes

Yes

Yes

Limited

No

No

No

No Python / Node needed

Yes

No

No

No

No

No

No

No

Form filling / interaction

Yes

Yes

Yes

Yes

No

Yes

No

Yes

Sub-agent parallelism

Yes

No

No

Partial

Partial

No

Partial

No

25 LLM providers

Yes

Via LiteLLM

Partial

Partial

N/A

N/A

N/A

N/A

MCP client (use tools)

Yes

No

No

No

No

No

No

No

MCP server (expose as tools)

Yes

No

No

No

Yes

Yes

No

No

Stealth browser built-in

Yes

Cloud only

Via Browserbase

Cloud only

No

No

No

No

DevTools observability (network, console, perf, a11y)

Yes

No

No

No

No

No

No

No

Deterministic script layer (zero LLM calls)

Yes

No

Partial

No

No

No

Yes

Yes

Open source

Yes

Yes (MIT)

Yes (MIT)

Yes (Apache)

Engine only

Yes (MIT)

Yes (BSD)

Yes (Apache)

Notes:

  • browser-use (85k+ GitHub stars): Python + Playwright, DOM + screenshots, supports GPT/Claude/Gemini/Ollama via LiteLLM, 89.1% WebVoyager. No single binary — requires Python and pip install. Every action calls an LLM: 2-5s/step, ~$0.02-0.30/task. Cloud tier adds stealth; self-hosted is bare Playwright.

  • Stagehand (Browserbase, 21k+ stars): TypeScript + CDP (v3), mixes deterministic Playwright with AI primitives (act(), extract(), observe()). Action caching reuses successful clicks without re-calling the LLM. Requires Node and, for production, Browserbase cloud hosting.

  • Skyvern (21k+ stars, Apache 2.0): vision-first (screenshot-only, no DOM), handles legacy portals and government forms that DOM tools struggle with. No-code cloud UI available. Each step costs vision-model tokens — ~$0.10-0.50/task. 85.85% WebVoyager.

  • Firecrawl (82k+ stars): managed scraping API. Returns LLM-ready Markdown, JSON extraction, site-wide crawl. Not an agentic tool — minimal multi-step interaction. Ships an official MCP server. Per-page pricing from $19/month.

  • Playwright MCP (Microsoft, 29k+ stars): MCP server that exposes browser control via the accessibility tree. Sub-100ms actions, zero vision tokens. Drives an LLM client's browser rather than having its own reasoning — no autonomous goal navigation. Used in GitHub Copilot Agent.

vs. native LLM provider browsing

Most AI providers offer some form of browsing, but it is designed for conversational information retrieval, not programmatic web automation. Key constraints:

acrawl

ChatGPT Agent

Claude Computer Use

Claude in Chrome

Gemini Deep Research

Copilot / Edge

Real JS-rendered browser

Yes

Yes (sandboxed cloud VM)

Indirect (dev provides env)

Yes (your Chrome)

No (search API only)

Limited (Bing retrieval)

Click / fill forms

Yes

Yes (requires user confirmation)

Yes

Yes

No

Limited

Programmable / scriptable

Yes

No

Yes (API beta)

No

No

No

Sub-agent parallelism

Yes

No

No

No

No

No

MCP server (expose as tools)

Yes

No

No

No

No

No

Returns structured data

Yes

No (text summaries)

No (screenshots)

No

No

No

Stealth / anti-bot

Yes

No

No

No

No

No

No vendor lock-in

Yes (25 providers)

OpenAI only

Anthropic only

Anthropic only

Google only

OpenAI / Bing only

Runs without paid subscription

Yes (OSS; LLM key needed)

No (Plus/Pro/Business)

No (API cost)

No (Max plan)

Partial

Yes (free tier)

Notes:

  • ChatGPT Agent (OpenAI, July 2025): runs in a sandboxed cloud virtual machine with its own Chromium instance. Can browse, click, and fill forms but pauses for user confirmation on sensitive actions (purchases, logins). Uses two modes: a fast text browser for research queries and a visual browser for interaction. Cannot run code in the browser, install extensions, or access your local file system. Susceptible to prompt injection. Available to Plus/Pro/Business subscribers.

  • ChatGPT Atlas (OpenAI, October 2025): a full Chromium browser with ChatGPT integrated as a sidebar + agent. Agent mode drives the same sandboxed cloud VM as ChatGPT Agent; core limitations are identical.

  • Claude Computer Use (Anthropic API, beta since October 2024): screenshot + mouse/keyboard API for any desktop application, not just browsers. Vision-only — no DOM access. Developers must provide and manage the entire computing environment (typically a Docker container with Xvfb + Firefox). Not a ready-to-use binary. Requires significant infrastructure to operate in production.

  • Claude in Chrome (Anthropic Chrome extension, beta November 2025+): lets Claude operate within your existing Chrome session using your real cookies and logins. Available to Max plan subscribers. Not an open API — no programmatic control. Good for interactive personal tasks; not suitable for batch automation.

  • Gemini / Deep Research (Google): browsing is grounded via Google Search API calls, not a live browser session. Deep Research synthesizes across many searches but cannot interact with pages (click, fill forms, navigate dynamically). Project Mariner (experimental computer use) is a separate, limited research preview.

  • Copilot / Edge (Microsoft): Edge's Copilot Mode uses Bing retrieval with some ability to navigate pages. Real-world tests show high latency (6+ minutes for multi-page comparison tasks) and frequent interruptions for user confirmation. Not a developer API.

Related MCP server: crw-mcp

Quick Start

Install

Linux / macOS (x64 / ARM64):

curl -fsSL https://raw.githubusercontent.com/Mingye-Lu/AgenticCrawler/main/install.sh | bash

Windows (x64, PowerShell):

irm https://raw.githubusercontent.com/Mingye-Lu/AgenticCrawler/main/install.ps1 | iex

This downloads the latest binary, verifies its SHA256 checksum, and sets up CloakBrowser for stealth browser automation. Requires Node.js 20+ for browser features.

acrawl checks for updates on startup and shows a notification when a new version is available.

git clone https://github.com/Mingye-Lu/AgenticCrawler.git
cd AgenticCrawler
cargo build --release

# Install CloakBrowser (required for browser automation — binary auto-downloads on first use)
npm install

Browser Extension (optional)

The acrawl Bridge extension lets acrawl control your real browser (with your sessions, cookies, and existing extensions) instead of a headless CloakBrowser instance. Download acrawl-extension.zip from the latest release, unzip it, then load it into your browser:

Browser

Extensions page

Developer mode toggle

Chrome

chrome://extensions

Top-right

Edge

edge://extensions

Bottom-left

Brave

brave://extensions

Top-right

Arc / Vivaldi / Opera

<browser>://extensions

Varies

Enable Developer mode, click Load unpacked, and select the unzipped folder. Then run /extension in the acrawl REPL to connect. See extension/README.md for full setup details.

Configure

# Set up your LLM provider (interactive prompt)
./target/release/acrawl auth anthropic   # or: openai, other

Credentials are stored in ~/.acrawl/credentials.json. Override the config directory with ACRAWL_CONFIG_HOME.

Run

# Interactive REPL
./target/release/acrawl

# One-shot mode
./target/release/acrawl prompt "scrape all book titles and prices from books.toscrape.com"

# Resume a saved session
./target/release/acrawl --resume session.json /status /compact

Examples

Scrape a product catalog:

acrawl > scrape all book titles, prices, and ratings from books.toscrape.com

The agent navigates to the site, reads the page, extracts the data, paginates through all 50 pages, and returns structured JSON.

Fill and submit a form:

acrawl > go to example.com/contact, fill in name "Jane Doe", email "jane@example.com",
         message "Hello", and submit the form

The agent locates form fields, fills them in, clicks submit, and confirms the result.

Monitor a price:

acrawl > check the current price of "Rust in Action" on books.toscrape.com

Single-page extraction — the agent fetches, reads, and returns the price without unnecessary navigation.

Extract from JS-rendered pages:

acrawl > get all repository names and star counts from github.com/trending

Static HTTP won't work here. acrawl detects React/Next.js markers and automatically escalates to a headless browser to render the JavaScript.

Parallel multi-page crawl:

acrawl > scrape the title, author, and price of every book across all 50 pages on books.toscrape.com.
         Fork a sub-agent for each page to speed this up.

The agent spawns up to 5 concurrent sub-agents, each on its own browser tab, to crawl pages in parallel. Results are merged when all sub-agents finish.

Features

42-Tool Toolbox

Navigation

Tool

Description

navigate

Go to a URL (supports format: markdown/text/html/fit_markdown). Uses HTTP first, auto-escalates to browser when JS is detected. Returns structured content with a page_map. fit_markdown prunes boilerplate DOM nodes before conversion, saving tokens.

go_back

Browser back button. Returns page_state with the resulting page structure.

scroll

Scroll up or down by pixel amount (pixels, default: 500). Returns page_state after scrolling.

switch_tab

Switch to a different browser tab by index. Returns page_state of the new tab.

wait

Wait for a CSS selector to reach a given state (visible, hidden, attached, detached) or a fixed timeout (up to 300s). Set silent: true on a time-only wait to skip the page_state diff and save tokens. Returns page_state after the condition is met.

refresh

Reload the current page. Returns page_state after reload. Use after setting intercept rules to replay the page load with rules active. Seq counter increments for temporal observation queries.

Content Formats

The navigate tool's format parameter controls how the page is returned:

Format

Description

markdown

Full HTML → markdown conversion. All content preserved.

fit_markdown

Recommended. Prunes boilerplate before conversion, saving 30-60% tokens on typical pages.

text

Plain text, no markdown.

html

Raw HTML.

fit_markdown works in two passes:

  1. Hard-block removal, elements whose class or id attribute contains any of these strings are removed immediately: nav, footer, header, sidebar, ads, comment, promo, advert, social, share.

  2. Score-based pruning, remaining elements are scored; anything below 0.48 is removed. The score is:

    0.4 × text_density
    + 0.2 × (1 − link_density)
    + 0.2 × tag_weight
    + 0.1 × class_id_score
    + 0.1 × ln(text_length + 1)

    Tag weights: article = 1.5 · h1 = 1.2 · h2 = 1.1 · h3/p/section = 1.0 · h4 = 0.9 · h5/table = 0.8 · h6 = 0.7 · span = 0.3 · div/li/ul/ol = 0.5.

Use markdown instead of fit_markdown when: the page has important content inside elements named sidebar, nav, or similar, for example, metadata panels, related-article links, or author info stored in a sidebar div.

If fit_markdown prunes all content (empty result), the tool automatically falls back to plain text.

Interaction

Tool

Description

click

Click an element by CSS selector, @eN ref, or visible label text. Use text (with optional role/region) to activate a button, tab, or link by its label — handy for SPA admin UIs and modals where CSS paths are fragile. Returns page_state after the click.

click_at

Click at specific viewport coordinates (x, y). Use for canvas, maps, or SVGs. Returns page_state.

fill_form

Fill form fields by selector, name, @eN ref, or visible label text — labels resolve page-wide, so fields in modals and div-based UIs without a <form> boundary work too. Optional auto-submit; on a submit-triggered redirect, waits for SPA readiness (DOM ready, visible text, hydration buffer) before returning page_state.

select_option

Select a dropdown option by value, label, or index. Works on native <select> and custom ARIA/portal dropdowns; omit value/label/index to list the available options without selecting. Returns page_state.

hover

Hover over an element to reveal tooltips or menus. Returns page_state.

press_key

Press a keyboard key (Enter, Escape, Tab, etc.), optionally targeting an element. Returns page_state.

set_device

Switch browser device emulation (mobile/desktop). Supports 10 presets (iphone_15, pixel_7, ipad_pro, desktop, etc.) or custom viewport/UA/touch parameters. Returns differential page_state showing responsive layout changes.

execute_js

Run arbitrary JavaScript in the page context and return the result. Optional hover_selector hovers an element (CSS selector or @eN ref) before evaluation, for inspecting :hover styles. Optional settle_ms (max 5000) delays capturing the result so reactive frameworks (Vue/React) can flush DOM mutations first.

Content Extraction

Tool

Description

page_map

Get the page's YAML accessibility tree (primary structural view). Each node: - role "name" [state...] [ref=eN]:. Scope by [ref=eN] or semantic token. depth controls tree depth.

read_content

Extract text by heading name or CSS selector, with offset/limit pagination for large pages.

list_resources

List all links, images, and forms on the current page.

screenshot

Capture a full-page screenshot (base64 PNG).

save_file

Download a URL to the output directory (path traversal protected).

DevTools & Observation

Tool

Description

list_network_activity

List observed network requests buffered during this browser session. Supports temporal filtering by seq window, request-state filters, URL substring filtering, and adjective-based sorting such as slowest/fastest or newest/oldest. Returns stable @rN refs for follow-up inspection with inspect_request.

inspect_request

Inspect a previously listed network request by its @rN id from list_network_activity. Returns the captured request metadata, coarse timing summary, initiator type, and notes about unavailable headers/bodies.

list_page_logs

List buffered console logs for the current page with optional level filtering and seq-based temporal filtering. Group by exact message text (default, deduplicated with @logN IDs), source, or level.

inspect_log

Inspect a deduplicated console log group from list_page_logs and return concrete instances with timestamps, stack traces, and source locations.

list_websocket_activity

Overview of WebSocket connections and message counts. Returns connections with @wsN IDs. Use inspect_websocket to see actual message content.

inspect_websocket

Inspect actual WebSocket messages for a connection. Provide @wsN ID from list_websocket_activity. Supports direction filter, pattern search, and sort_by (newest/oldest).

get_page_performance

Get page performance metrics using Navigation Timing and Resource Timing APIs. Returns TTFB, DOM timings, and a breakdown of the top 20 resources by transfer size. Works on both browsers and SPAs.

inspect_cookies

Inspect cookies on the current page with security analysis. Returns all cookies with domain, path, expiry, secure/httponly flags, and detected security issues. Includes third-party detection and filtering options.

inspect_storage

Inspect browser storage (localStorage and sessionStorage) on the current page. Returns all key-value pairs with size information. Supports filtering by storage type and key pattern.

measure_coverage

Measure JavaScript and CSS code coverage on the current page. Returns per-file byte usage showing how much code was actually executed/applied versus total loaded. Useful for identifying unused bundles, oversized dependencies, and performance optimization opportunities.

audit_accessibility

Run axe-core WCAG accessibility audit on the current page. Returns violations grouped by impact level with selectors and descriptions. Use scope to limit to a specific DOM subtree.

intercept_network

Manage network interception rules. Block or mock requests matching URL glob patterns. Rules are additive — each call adds a rule. Use refresh() after adding rules to replay the page load with rules active.

Agent Control

Tool

Description

fork

Spawn a sub-agent on a new browser tab with its own goal and step budget.

wait_for_subagents

Wait for specific or all sub-agents to finish and collect results.

subagent_status

Check the status and results of one or all active sub-agents without blocking.

cancel_subagent

Cancel a running sub-agent by ID.

Script Management

Tool

Description

run_script

Execute a deterministic multi-step script (loops, conditionals, parallel branches) without per-step LLM calls. Returns a script_id for async tracking.

save_script

Persist a script definition to disk for reuse across sessions.

list_scripts

List all previously saved scripts with metadata.

read_script

Read the full JSON definition of a saved script.

wait_for_scripts

Block until one or more running scripts complete and return results.

script_status

Check execution status of a running script without blocking.

cancel_script

Abort a running script immediately.

page_state Reference

Interaction tools (click, click_at, fill_form, hover, press_key, go_back, scroll, switch_tab, select_option, set_device, refresh) all return a page_state object. There are two variants:

Full page_state, returned after the first interaction on a URL, or when changes are too extensive to diff:

url: https://example.com/page
title: Page Title
page_map: |
  - main "" [ref=e1]:
    - navigation "Primary" [ref=e2]:
      - link "Docs" [ref=e3]:
        /url: https://example.com/docs
    - heading "Platform" [level=1] [ref=e4]:
    - button "Get Started" [ref=e5]:
    - iframe "Demo" [ref=e6]:
      - button "Play" [ref=e7]:

Diff page_state, returned on subsequent interactions on the same URL, showing only what changed:

url: https://example.com/page
title: Page Title
changed: true
changes: |
  + [ref=e5] added:
    - dialog "Confirm" [ref=e5]:
      - button "OK" [ref=e6]:
      - button "Cancel" [ref=e7]:
  - [ref=e3] removed:
    - button "Old Button" [ref=e3]:
  ~ button "Submit" [ref=e2]: [] → [disabled]

If nothing changed, { "url": "...", "title": "...", "changed": false } is returned. On bridge failure, { "url": "unknown", "title": "unknown", "page_map": null }. Post-action page_state returns YAML tree-diffs showing only what changed. If changes are extensive, a full YAML snapshot is returned instead.

Sub-Agent Parallelism

The agent can fork child agents to crawl multiple pages concurrently. Each child gets its own browser tab, step budget, and independent state.

Setting

Default

Description

max_concurrent_per_parent

5

Max children running in parallel per parent

max_fork_depth

3

Max nesting depth (agents forking agents)

max_total_agents

10

Global cap across all parents

fork_child_max_steps

15

Step budget per child agent

fork_wait_timeout_secs

60

Timeout waiting for sub-agents

URL Claiming

Before a child agent is spawned, its scope is registered in a shared claim registry. This prevents two sibling agents from crawling the same URL simultaneously.

Rules:

  • First-claimer-wins, if a second agent tries to claim a URL already claimed by a sibling, the fork fails immediately with a conflict message naming the owner agent. The parent LLM sees this conflict and can adjust scope.

  • Three scope types: SinglePage (exact URL), UrlList (all-or-nothing batch), UrlPattern (regex, checked for overlap with all existing claims).

  • RAII lifetime, a claim is held for the life of the child. When the child finishes, is cancelled, or its parent aborts setup, the claim is released automatically and the URL becomes available again.

  • Cross-type checking, an exact URL conflicts with any already-claimed regex that matches it, and a new regex conflicts with any already-claimed exact URL it would match.

  • Intra-list deduplication, if the same URL appears twice in a UrlList, it is silently deduplicated (the LLM sometimes produces duplicates).

Claiming is automatic, it happens inside fork before the child starts, not inside navigate. The agent does not call it explicitly.

Smart Fetch Routing

Every navigate call goes through a two-tier fetch router:

  1. HTTP first — fast reqwest-based fetch (30s timeout, follows up to 10 redirects).

  2. Auto-escalation — if any of the following are detected, the request is transparently replayed in a headless browser:

    • HTTP 403, 429, or 503 responses

    • JS framework markers: __next_data__, __nuxt, __vue, ng-app, _react, data-reactroot

    • Auth redirects: URLs containing /login, /signin, /auth, /oauth, accounts.google.com

    • Short response body (< 500 chars) with a <noscript> tag

    • Empty SPA shell detection (multi-signal scoring): framework asset paths without embedded data (/_next/static/, /_nuxt/, ng-version=), empty mount-point divs, noscript "enable JavaScript" messages, bundler hash patterns, and structural signals (sparse visible text with no semantic elements). Pages with embedded data blobs (__NEXT_DATA__, window.__NUXT__, data-reactroot) are explicitly excluded — their content is already server-rendered.

When --no-headless / --headed is set, all fetches go directly through the browser.

25 LLM Providers

Custom / Local Providers

To use any OpenAI-compatible endpoint (Ollama, LMStudio, vLLM, a local proxy, etc.):

acrawl auth other

You'll be prompted for a base URL and an optional API key. Examples:

Setup

Base URL

Model string

Ollama (local)

http://localhost:11434/v1

other/llama3.2

LMStudio

http://localhost:1234/v1

other/local-model

vLLM

http://localhost:8000/v1

other/meta-llama/Llama-3.1-8B

Any OpenAI-compatible API

Your endpoint

other/<model-id>

This creates a credentials.json entry with auth_method: "api_key" and your base_url. Leave the API key blank if your server doesn't require one.

Models use the provider/model-id format: anthropic/claude-sonnet-4-6, openai/gpt-4o, amazon-bedrock/anthropic.claude-sonnet-4-6-20250514-v1:0, etc.

Providers With Non-Standard Auth

GitHub Copilot, device code flow:

acrawl auth copilot
  1. acrawl prints a URL (https://github.com/login/device) and an 8-character user code, and attempts to open your browser automatically.

  2. Paste the code at the GitHub page and authorize the app.

  3. acrawl polls GitHub until authorization completes, then exchanges the GitHub token for a short-lived Copilot API token, which is stored in credentials.json.

No API key is needed, the entire flow is interactive. If authorization succeeds, credentials are stored automatically.

GitLab Duo, API key:

acrawl auth gitlab

Prompts for a GitLab Personal Access Token (PAT). Paste your token and press Enter. No browser redirect required. Note: GitLab Duo does not support tool calling.

Amazon Bedrock, AWS credentials:

acrawl auth amazon-bedrock

Prompts for AWS Access Key ID, AWS Secret Access Key, and region (default: us-east-1). These are stored directly in credentials.json and used to sign requests with AWS SigV4.

Azure OpenAI:

acrawl auth azure

Prompts for Resource Name (e.g. myresource), Deployment Name (e.g. gpt-4o), and API key.

Interactive TUI

The default interface is a full terminal UI with:

  • Markdown rendering with syntax highlighting and streaming output

  • Slash command overlay — type / to see all commands with Tab completion

  • Model picker/model opens a searchable list grouped by provider category

  • Auth modal/auth walks through provider setup interactively

  • Session header — shows current model, session ID, cost, and context usage in real time

  • Debug mode/debug toggles raw tool call input/output in the transcript

  • Reasoning effortCtrl+T cycles through high/medium/low for reasoning models (o3, o4-mini)

Keybindings:

Key

Action

Enter

Submit prompt

Shift+Enter / Ctrl+J

Insert newline

PageUp / PageDown

Scroll transcript

Ctrl+T

Cycle reasoning effort

Ctrl+C

Interrupt task (busy) or exit (idle)

Esc Esc

Interrupt task (double-tap while busy)

Tab

Auto-complete slash command

Running acrawl without a TTY on stdout (e.g. piped or redirected) exits with an error pointing at acrawl prompt for one-shot use and acrawl --resume for session maintenance.

Session Management

  • Auto-save — sessions are saved automatically on exit.

  • Resume--resume session.json reloads a conversation. Resume-safe slash commands (/status, /compact, /cost, /config, /version, /export, /help, /clear) can be appended to the command line.

  • Export/export [file] writes a human-readable markdown transcript.

  • Auto-compaction, when cumulative input tokens exceed the threshold (default 200K), acrawl compacts the session:

    • Preserved verbatim: the most recent ~80K tokens of messages (always at least 2 messages), with tool call pairs kept intact, no ToolResult is ever left without its matching ToolUse.

    • Preserved as metadata: message counts, deduplicated tool list, last 3 user requests (160 chars each), pending work items (inferred from messages containing "todo", "next", "pending", "follow up", "remaining"), up to 10 key URLs, and the most recent non-empty message as "current work".

    • Tool output pruning: tool outputs older than the innermost 40K-token window are truncated to 2,000 chars with a [… output truncated from N chars] marker before the preserved window is calculated.

    • Summary generation: template-based by default (no LLM call). Opt in to LLM summarization via compaction_llm_summarization: true in settings.json, this sends the removed messages to the model and uses its output as the summary, with a fallback to the template if the LLM fails.

    • Continuation prompt: the compacted session prepends a system message instructing the agent to resume directly without recapping or asking questions.

    • Browser state is unaffected, compaction only modifies message history; the current browser tab, URL, cookies, and page state are unchanged.

  • Multiple sessions/session list to browse, /session switch <id> to switch.

Tool Allowlist

Use --allowedTools to restrict which tools the agent can invoke (comma-separated, flag is repeatable):

acrawl prompt "scrape titles" --allowedTools navigate,read_content,screenshot

Omit --allowedTools to allow all 42 tools. Useful for locking down a crawl to read-only tools or excluding fork/wait_for_subagents when sub-agent parallelism is not desired.

MCP Extensibility

acrawl supports Model Context Protocol servers as a client, allowing you to extend the agent with custom tools. MCP tools are namespaced as server_name__tool_name and available alongside the built-in 42.

Supported transports: stdio, SSE, HTTP, WebSocket.

MCP Server (expose acrawl as a tool)

acrawl mcp starts a built-in MCP server that exposes acrawl's browser automation capabilities to external agents like Claude Code, Cursor, VS Code, Zed, JetBrains, TRAE, Gemini CLI, or any MCP-compatible client.

The server provides 39 tools in three modes:

Direct browser tools (31) — fine-grained control for clients that orchestrate themselves: navigate, click, click_at, fill_form, page_map, read_content, screenshot, go_back, scroll, wait, select_option, execute_js, hover, press_key, switch_tab, list_resources, save_file, set_device, refresh, list_network_activity, inspect_request, list_page_logs, inspect_log, list_websocket_activity, inspect_websocket, get_page_performance, inspect_cookies, inspect_storage, measure_coverage, audit_accessibility, intercept_network

Script tools (7) — deterministic multi-step automation without per-step LLM calls: run_script, save_script, list_scripts, read_script, wait_for_scripts, script_status, cancel_script

Autonomous agent (1) — delegate a full crawl task:

  • run_goal — Execute a high-level crawl goal autonomously. The agent plans, navigates, and extracts data using its own LLM loop. Requires ~/.acrawl/credentials.json configured with a model.

Transport: stdio only (no SSE / HTTP / WebSocket in this release).

Quick install

acrawl mcp install

Interactive installer that auto-detects your IDEs, lets you toggle which to configure (Space to select, Enter to confirm), and writes the correct config for each. Supports global (user-level) and project-level scopes.

Supported clients: Claude Code, Claude Desktop, Cursor, Windsurf, VS Code (Copilot), OpenCode, Zed, TRAE, JetBrains IDEs, Gemini CLI, Qwen Code, Codex CLI, Hermes, OpenClaw, Goose, Crush, Aider.

Manual configuration

If you prefer to configure manually, add this to your IDE's MCP config file:

{
  "mcpServers": {
    "acrawl": {
      "command": "acrawl",
      "args": ["mcp"]
    }
  }
}
{
  "servers": {
    "acrawl": {
      "command": "acrawl",
      "args": ["mcp"]
    }
  }
}
{
  "mcp": {
    "acrawl": {
      "type": "local",
      "command": ["acrawl", "mcp"]
    }
  }
}
{
  "context_servers": {
    "acrawl": {
      "command": {
        "path": "acrawl",
        "args": ["mcp"],
        "env": {}
      },
      "settings": {}
    }
  }
}

Or via the Claude Code CLI directly:

claude mcp add acrawl -- acrawl mcp

The browser tools share a persistent session across calls. run_goal creates its own isolated agent and browser.

Requirements: The 38 browser and script tools work without any configuration. run_goal requires ~/.acrawl/credentials.json (via acrawl auth) for its internal LLM.

Usage

acrawl [OPTIONS] [COMMAND]

Commands:
  prompt <text>      Run a single goal non-interactively
  mcp                Start MCP server (stdio transport)
  mcp install        Install MCP config into your IDEs interactively
  auth [provider]    Configure provider credentials
  system-prompt      Print the system prompt (for debugging)

Options:
  --model MODEL            Model in provider/id format (e.g. anthropic/claude-sonnet-4-6)
  --output-format FORMAT   text | json
  --resume FILE            Resume a saved session (with optional /commands)
  --compact                Compact history on resume
  --headless[=BOOL]        Force browser headless on/off
  --no-headless, --headed  Launch browser in visible mode
  --allowedTools TOOLS     Restrict available tools (comma-separated, repeatable)
  -p TEXT                  Shorthand for prompt mode
  -V, --version            Print version

Slash Commands

Command

Description

Resume-safe

/help

List available commands

Yes

/status

Session info — model, tokens, cost

Yes

/model [name]

Show or switch the active model

No

/compact

Compact conversation history

Yes

/clear

Start a fresh session

Yes

/cost

Detailed cost breakdown

Yes

/sessions

Open the session picker (TUI)

No

/export [file]

Export conversation to markdown

Yes

/config [model]

View acrawl config

Yes

/auth [provider]

Configure credentials

No

/headed

Switch to visible browser

No

/headless

Switch to headless browser

No

/extension [stop]

Start/show the extension bridge, or stop it

No

/cloakbrowser

Switch back to CloakBrowser mode

No

/debug

Show debug details for the last browser tool call

No

/version

Version and build info

Yes

/exit

Exit and save session

No

Non-interactive / Agent use

Configure once

acrawl auth anthropic --api-key sk-ant-... acrawl auth openai --api-key sk-... acrawl auth amazon-bedrock --access-key AKIA... --secret-key ... --region us-east-1 acrawl auth other --base-url http://localhost:11434/v1 # Ollama, no key acrawl config set model anthropic/claude-sonnet-4-6

Verify setup

acrawl auth status --check anthropic # exits 0 if configured, 3 if not acrawl auth status --json # full credential table (secrets masked)

Run

acrawl prompt "scrape all titles from example.com" --output-format json

Settings

acrawl config set headless false acrawl config set optimization.html_diff_mode true acrawl config get model --effective

MCP install

acrawl mcp install --client opencode --scope user acrawl mcp install --all --yes

Configuration

All config lives in ~/.acrawl/ (override with ACRAWL_CONFIG_HOME).

credentials.json

Managed via acrawl auth. Stores per-provider:

Field

Description

active_provider

Currently selected provider

auth_method

api_key, oauth, or aws_sigv4

api_key

Provider API key

oauth

OAuth tokens — access, refresh, expiry, scopes

default_model

Default model for this provider

base_url

Custom API endpoint (e.g. local Ollama, Azure resource)

Azure additionally requires resource_name and deployment_name. Bedrock requires aws_access_key_id, aws_secret_access_key, and region. Vertex requires gcp_project_id and gcp_region.

settings.json

Created with defaults on first run.

Field

Default

Description

headless

true

Run browser without a visible window

max_steps

50

Max agent loop iterations per goal

output_dir

"output"

Where save_file writes output

auto_compact_input_tokens

200000

Token threshold for auto-compaction

reasoning_effort

"high"

For reasoning models: high / medium / low

max_concurrent_per_parent

5

Max concurrent sub-agents per parent

max_fork_depth

3

Max nesting depth for forked agents

max_total_agents

10

Global cap on total agents

fork_child_max_steps

15

Step budget for each child agent

fork_wait_timeout_secs

60

Timeout for wait_for_subagents

browser_backend

null

Active browser backend: "extension" or null (CloakBrowser)

extension_bridge_port

19876

Port for Chrome extension bridge WebSocket server

All fields are optional; omitting a field uses the default. The optimization block accepts a nested object with the following fields (all default to false/0/null, safe to omit entirely):

Field

Default

Description

html_diff_mode

false

On repeated visits to the same URL, returns only changed content sections with [unchanged: N sections] markers. 50 to 70% token reduction on multi-turn sessions. No behavior change on first visit.

content_aware_profiles

false

Auto-selects a cleaning profile based on the task keyword: ReadingMode for extraction tasks, Minimal for interaction tasks, Aggressive for content > 50KB.

loop_detection

false

Detects repeated identical actions and injects escalating nudges (soft, medium, strong). Also detects page stagnation.

loop_detection_window

20

Rolling window size for action hash comparison.

loop_nudge_threshold

5

Number of repeated actions before first nudge fires.

page_fingerprinting

false

Enables lightweight page fingerprints used by loop detection and action caching.

failure_classification

false

Classifies errors into 16 categories (SelectorNotFound, CaptchaDetected, RateLimited, etc.) using keyword matching. Zero LLM cost.

self_healing

false

On SelectorNotFound/SelectorAmbiguous, fetches a fresh page_map and text-matches to a replacement element ref. Logs [healed: @eOLD -> @eNEW]. Zero LLM calls.

self_healing_max_retries

2

Max healing attempts per failed action.

action_caching

false

Caches results of read-only tools (page_map, read_content, list_resources, execute_js) keyed by tool + input + page fingerprint. Cache is invalidated when the page changes.

action_cache_ttl_secs

30

Cache entry TTL in seconds.

planning_interval

0

Every N steps, injects a planning checkpoint into the system prompt. 0 = disabled.

confidence_tracking

false

Asks the LLM to self-report confidence after each action ([confidence: HIGH/MEDIUM/LOW]). Two consecutive LOWs trigger a stagnation alert.

compound_enrichment

false

Adds enrichment metadata to complex form controls in page_map: date format hints, range min/max/value, select option lists (max 20 + overflow count), file accept types, textarea maxlength. Max 200 bytes per element.

budget_max_session_cost_usd

null

Session cost limit in USD. Null = no limit.

budget_enforcement

null

How to enforce the budget: warn injects a warning into the prompt; block terminates the session when the limit is reached.

budget_warn_threshold_pct

80

Percentage of budget at which warnings start.

per_agent_cost_tracking

false

When ON, /cost shows a per-child-agent cost breakdown.

Environment Variables

Variable

Description

ACRAWL_CONFIG_HOME

Override config directory (default: ~/.acrawl/)

Provider-specific env vars (see provider table above) are read as fallbacks when no credentials.json entry exists.

Performance Optimizations

acrawl ships 14 vendor-derived optimizations (sourced from browser-use, Stagehand, crawl4ai, Skyvern, Spider, nanobrowser, and ZeroClaw). All are disabled by default, enable selectively via settings.json.

Example settings.json with a cost-optimized profile:

{
  "optimization": {
    "html_diff_mode": true,
    "action_caching": true,
    "page_fingerprinting": true,
    "loop_detection": true,
    "self_healing": true,
    "budget_max_session_cost_usd": 0.50,
    "budget_enforcement": "warn"
  }
}

Optimization

Flag

Benefit

HTML Diff Mode

html_diff_mode

Reduces tokens by 50 to 70% on repeated visits by returning only changed content.

Content-Aware Profiles

content_aware_profiles

Auto-selects cleaning profiles (ReadingMode, Minimal, Aggressive) based on task.

Loop Detection

loop_detection

Prevents infinite loops by detecting repeated actions and injecting nudges.

Page Fingerprinting

page_fingerprinting

Generates lightweight page fingerprints for loop detection and action caching.

Failure Classification

failure_classification

Classifies errors into 16 categories using keyword matching with zero LLM cost.

Self-Healing

self_healing

Automatically heals broken selectors using text-matching with zero LLM calls.

Action Caching

action_caching

Caches read-only tool results to avoid redundant LLM calls.

Planning Interval

planning_interval

Injects periodic planning checkpoints to keep the agent focused.

Confidence Tracking

confidence_tracking

Tracks LLM self-reported confidence to alert on stagnation.

Compound Enrichment

compound_enrichment

Enriches complex form controls in the page map with metadata.

Budget Limit

budget_max_session_cost_usd

Sets a hard session cost limit in USD to prevent runaway costs.

Budget Enforcement

budget_enforcement

Controls whether to warn or block when the session budget is reached.

Budget Warning

budget_warn_threshold_pct

Triggers warnings when a percentage of the budget is consumed.

Per-Agent Cost Tracking

per_agent_cost_tracking

Breaks down costs per child agent in the /cost command.

Known Limitations

acrawl works well on most public web content, but some situations are outside what the agent can reliably handle:

Scenario

Behavior

CAPTCHA / bot challenges

CloakBrowser uses stealth techniques to avoid bot detection, but unsolvable CAPTCHAs (image puzzles, Cloudflare Turnstile requiring proof-of-work) will block progress. Use the real-browser extension (/extension) where your browser already has a trusted session. reCAPTCHA v3 is invisible (no widget) — if a form submit produces no page change while v3 is present, acrawl heuristically detects the likely silent rejection and returns a CaptchaDetected error rather than a misleading success. This is a best-effort heuristic; acrawl cannot read the server-side score. The error message names the remedy: acrawl config set headless false (or --headed), or /extension.

SMS / TOTP 2FA

The agent can fill in a 2FA code if you paste it into the REPL, but it cannot receive or generate codes itself.

Login-walled content

For sites where you must be logged in, use the extension mode so the agent operates in your existing authenticated browser session.

Single-page apps that load content on scroll

The agent can scroll to trigger lazy loading, but infinite-scroll feeds with no end condition may require explicit step limits.

PDF and binary file content

save_file downloads any URL to disk. The agent cannot read the text content of a saved PDF, use navigate on a URL that serves HTML, or pipe the download through a text extractor externally.

WebGL / canvas fingerprinting

Some anti-bot systems fingerprint the GPU via WebGL. CloakBrowser mitigates common checks but cannot spoof hardware-level fingerprints.

Sites that require a real mouse trajectory

Bot-detection systems that analyse mouse movement patterns may flag headless browser interactions. Switch to extension mode for these sites.

How It Works

flowchart LR
    Goal([Goal\nnatural language]) --> Plan
    Plan --> Navigate --> Observe --> Act --> Extract
    Extract -->|repeat until done| Plan
    Extract --> Output([Output\nJSON / CSV])
  1. The agent receives a goal and builds a multi-step plan via a 7-section system prompt covering identity, operating procedure, data integrity, constraints, error recovery, completion protocol, and parallel exploration guidance.

  2. Each turn, it picks from its 42 tools based on what it observes on the page.

  3. navigate hits the FetchRouter, which tries HTTP first and auto-escalates to a headless Chromium browser when JavaScript, auth redirects, or framework markers are detected.

  4. The browser is driven by an embedded Node.js subprocess (the PlaywrightBridge) speaking newline-delimited JSON over stdio — uses CloakBrowser for stealth browsing, not stock Playwright. Alternatively, acrawl can drive the user's real browser via a Chrome extension (/extension command) using CDP over a local WebSocket bridge.

  5. For multi-page tasks, the agent can fork child agents onto separate browser tabs, each with independent state and step budgets. wait_for_subagents collects results; cancel_subagent aborts a running child; subagent_status polls without blocking.

  6. When context grows large, auto-compaction summarizes older messages while preserving recent turns, tool usage, and pending work items.

  7. The agent stops when the goal is met and all sub-agents have finished, or when the step limit is reached.

Architecture

crates/
  core/         Shared types, traits, error hierarchy (acrawl-core)
  api/          25 provider clients (Anthropic, OpenAI, Gemini, DeepSeek, Bedrock, Azure, ...), SSE streaming
  browser/      PlaywrightBridge, ExtensionBridge, FetchRouter, BrowserContext, WsBridgeServer
  agent/        42 tools, agent loop, sub-agent fork/join, CrawlState
  runtime/      ConversationRuntime, config, sessions, MCP client stack, OAuth PKCE
  render/       Markdown rendering, tool output formatting, OutputSink
  mcp-server/   Built-in MCP server (JSON-RPC over stdio), IDE installer
  tui/          Ratatui terminal UI (acrawl-tui)
  ui/           Shared application layer (LiveCli, session management, tool executor, auth)
  cli/          Thin binary entry point (main.rs, self_update.rs, uninstall.rs)
  commands/     17 slash commands with resume-safety annotations

11 crates, ~40K lines of Rust, 1,097 tests.

Development

cargo build --release                                     # build
cargo test --workspace                                    # run all tests
cargo clippy --workspace --all-targets -- -D warnings     # lint (pedantic)
cargo fmt --check                                         # format check

See CONTRIBUTING.md for the full development guide.

Changelog

See CHANGELOG.md.

Security

See SECURITY.md for the security policy and how to report vulnerabilities.

License

MIT

Available Tools

39 tools
audit_accessibilityA

Run axe-core WCAG accessibility audit on the current page. Returns violations grouped by impact level with selectors and descriptions. Use scope to limit to a specific DOM subtree.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoCSS selector to limit audit (e.g. '#main-content')
impactNoall
standardNowcag2aa

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description must carry the burden of behavioral disclosure. It indicates the tool returns violations grouped by impact level but does not detail potential side effects (none expected for a read-only audit), performance impact, or permission requirements. The behavior is adequately implied but not fully transparent.

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 two sentences long, no redundancy, and the most critical information (what the tool does) is front-loaded. Every sentence serves a purpose.

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 three parameters, no output schema, and no annotations, the description covers the core functionality well. It could be slightly more complete by mentioning that the audit follows WCAG standards or that output includes actionable details, but it suffices for context.

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

Parameters3/5

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

Schema description coverage is only 33% (only 'scope' has a description). The description adds meaningful context for 'scope' by explaining its purpose. However, it does not elaborate on the 'impact' enum values or the 'standard' options, leaving room for ambiguity despite the schema providing enums 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 states it runs an axe-core WCAG accessibility audit on the current page, specifying the verb ('Run'), resource ('WCAG accessibility audit'), and scope ('on the current page'). It distinguishes itself from sibling tools like 'get_page_performance' and 'measure_coverage' by focusing specifically on accessibility.

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 explicitly advises using the 'scope' parameter to limit the audit to a specific DOM subtree, providing clear usage guidance. However, it does not mention when not to use the tool or suggest alternatives, though no direct alternative exists among siblings.

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

cancel_scriptA

Abort a running script immediately, closing its browser tab and discarding any partial results not yet yielded. The script transitions to 'cancelled' status. Use when a script is stuck, taking too long, or its results are no longer needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesScript ID to cancel (format: scr_XXXXXXXX). Obtain from the run_script response or list_scripts.

TDQS

A4.2/5.0
Behavior4/5

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

Discloses behavioral traits: closes browser tab, discards partial results, transitions to 'cancelled' status. No annotations provided, so description carries full burden. Lacks mention of side effects or reversibility, but sufficient.

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 concise sentences, front-loaded with action and effects, followed by usage guidance. No redundant or extraneous information.

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 simplicity (single parameter, no output schema), the description explains behavior and usage adequately. However, it does not mention the expected response or confirmation after cancellation, leaving a minor gap.

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

Parameters3/5

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

Schema coverage is 100%; the schema already describes the parameter with format and source. Description adds no additional parameter info, so baseline 3 is appropriate.

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 action (abort a running script) and resource (running script). It specifies immediate closure of browser tab and discarding partial results. Distinguishes from siblings like run_script and script_status.

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 states when to use: 'Use when a script is stuck, taking too long, or its results are no longer needed.' Does not mention when not to use, but provides clear context.

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

clickA

Click on a page element identified by CSS selector, @eN reference, or visible label text. May trigger navigation, form submission, or dynamic content changes. Returns post-action page_state. Use 'selector' for CSS/ref-based targeting; use 'text' (with optional 'role' and 'region') to activate a button, tab, checkbox, or link by its visible label — useful for SPA admin UIs and modals where CSS paths are fragile.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoOptional ARIA role filter when using 'text' (e.g. 'button', 'tab', 'checkbox', 'menuitem'). Narrows the match.
textNoActivate by visible label text instead of a selector. Finds the interactive element whose accessible name best matches this text. Mutually exclusive with 'selector'.
widenNoWhen true, return the full-page diff instead of scoping to the interacted container. Default: false.
regionNoOptional [ref=eN] or semantic token to constrain label matching.
selectorNoCSS selector or @eN element reference from page_map (e.g. "@e3", "button.submit", "#login-btn"). Mutually exclusive with 'text'.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries full burden: it discloses potential side effects (navigation, form submission, dynamic content changes) and states the return value ('post-action page_state'). It also explains the 'widen' parameter's effect. Could mention scroll-into-view behavior, but overall satisfactory.

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 two sentences: first states the core action and targeting methods, second provides usage guidance. Every sentence earns its place; no fluff.

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 5 parameters and no output schema, the description covers the action, parameter usage, side effects, and return value. It does not explain error behavior (e.g., missing element), but is otherwise sufficiently complete for an agent to use correctly.

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 100%, so the baseline is 3. The description adds significant value by explaining parameter usage concretely (e.g., 'Use selector for CSS/ref-based targeting') and describing the role and region parameters, which goes beyond the schema's field 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?

The description starts with a specific verb ('Click') and resource ('a page element'), then details two distinct targeting methods (CSS selector/@eN reference vs visible label text), which clearly distinguishes it from sibling tools like 'click_at' that use coordinates.

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 explicitly advises when to use 'selector' vs 'text' with roles and regions, and notes that text-based targeting is useful for SPAs and modals. It does not, however, contrast with sibling tools like 'click_at' or 'hover', so some usage guidance is implicit.

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

click_atA

Click at specific viewport coordinates (x, y) using a real mouse event. Use exclusively for elements without stable CSS selectors: canvas drawings, interactive maps, SVG regions, or coordinate-based UIs. Returns post-action page_state. Prefer the selector-based 'click' tool for normal DOM elements — it is more reliable and does not require coordinate calculation.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate in viewport pixels (0 = left edge). Obtain via execute_js with getBoundingClientRect() on the target element.
yYesY coordinate in viewport pixels (0 = top edge). Obtain via execute_js with getBoundingClientRect() on the target element.
widenNoWhen true, return the full-page diff instead of scoping to the interacted container. Default: false.

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description fully carries the burden. It discloses it uses a 'real mouse event', returns 'post-action page_state', and notes it is 'less reliable' than the selector-based click. It does not discuss rate limits or permissions, but for a clicking action this is adequate transparency.

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 two sentences, front-loaded with the primary action, then usage guidelines. Every sentence adds value with no wasted words. It is highly concise and well-structured.

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 no output schema, the description mentions 'post-action page_state' which is sufficient for a click tool. It also references sibling tools. It might implicitly assume coordinates are within viewport, but overall it is complete for the tool's complexity.

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 100%, but the description adds significant extra context: for 'widen' it explains default and full-page diff effect; for 'x' and 'y' it explains how to obtain them via getBoundingClientRect. This goes well beyond the schema definitions.

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 'Click at specific viewport coordinates (x,y) using a real mouse event' and distinguishes itself from the sibling 'click' tool by specifying exclusive use for elements without stable CSS selectors like canvas, maps, SVG regions. It provides a clear verb-resource pair and differentiates use cases.

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 gives explicit when-to-use ('exclusively for elements without stable CSS selectors') and when-not-to-use ('prefer the selector-based click tool for normal DOM elements'), along with instructions for obtaining coordinates via execute_js with getBoundingClientRect.

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

execute_jsA

Execute arbitrary JavaScript in the page context and return the evaluation result. The script runs synchronously in the browser's main frame with full access to the DOM, window, and page APIs. Use as a last resort when CSS selectors and other tools cannot achieve the interaction — prefer click, fill_form, and select_option for standard interactions. Optionally accepts hover_selector to hover over an element before executing the script, enabling inspection of CSS :hover styles and hover-triggered DOM changes. When the script triggers reactive DOM changes (e.g., .click() on a toggle), the return value may reflect pre-mutation state because frameworks schedule updates asynchronously. Set settle_ms (e.g., 50) to wait for reactivity to flush before capturing the result.

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesJavaScript code to execute in the page context. The return value of the last expression is serialized as JSON and returned. For async operations, use 'await' (the script is wrapped in an async function). Example: "document.title" or "await fetch('/api/data').then(r => r.json())".
settle_msNoMilliseconds to wait after script execution before capturing the return value (max 5000). Use when the script triggers DOM mutations that a reactive framework (Vue, React, etc.) processes asynchronously — a value of 50-100ms allows framework reactivity to flush before reading state. Default: 0 (no delay).
hover_selectorNoOptional CSS selector or @eN ref (from page_map) of an element to hover over BEFORE executing the script. When provided, the mouse is moved over the element (triggering :hover CSS pseudo-class), then the script is evaluated. This allows inspecting hover-dependent computed styles (e.g. getComputedStyle(el).color after hover) or verifying hover-triggered DOM changes.

TDQS

A5/5.0
Behavior5/5

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

Discloses that the script runs synchronously in the browser's main frame with full DOM/API access, and that return values may reflect pre-mutation state due to async framework updates. Suggests settle_ms to wait for reactivity. With no annotations provided, the description fully covers behavioral traits.

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 well-organized paragraphs: first covers main function and usage guideline, second details optional parameters. Every sentence adds value, no 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 three parameters, no output schema, and moderate complexity, the description is complete. It covers all parameters with purpose and behavior, explains return value serialization, and addresses common pitfalls (async reactivity). 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?

Adds significant meaning beyond the schema: explains that script's last expression is JSON-serialized, supports async with await, specifies settle_ms defaults and max, and clarifies how hover_selector works (hovers before execution, useful for inspecting :hover styles). Schema coverage is 100% but description enhances understanding.

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 it executes arbitrary JavaScript in the page context and returns the evaluation result. It distinguishes itself from sibling tools like click, fill_form, and select_option by positioning itself as a last resort for non-standard interactions.

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 advises when to use: 'as a last resort when CSS selectors and other tools cannot achieve the interaction' and directs to prefer click, fill_form, and select_option. Also provides context for optional parameters like hover_selector and settle_ms.

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

fill_formA

Fill one or more form fields with values and optionally submit the form. Accepts field identifiers as CSS selectors, field names/IDs, or @eN references from page_map. Also resolves fields by visible label text page-wide — works in modals and div-based UIs without a boundary. Returns post-action page_state with the resulting URL and structural diff. Use form_selector to disambiguate when the page contains multiple forms.

ParametersJSON Schema
NameRequiredDescriptionDefault
widenNoWhen true, return the full-page diff instead of scoping to the interacted container. Default: false.
fieldsYesMap of field identifiers to values. Keys can be CSS selectors ("input[name='email']"), field name/ID attributes ("email"), or @eN refs from page_map ("@e5"). Values are the text to type into each field.
submitNoIf true, submit the form after filling all fields (triggers form submission event). Default: false.
form_selectorNoCSS selector or @eN ref targeting a specific <form> element. Required when the page has multiple forms to disambiguate which form to fill.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses that fields are resolved by label text, works in modals and div-based UIs, and returns page_state with URL and structural diff. 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.

Conciseness5/5

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

The description is concise and front-loaded with the main action. Every sentence adds value, with no wasted words. Well-structured.

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 complexity (4 parameters, nested object, no output schema), the description covers usage, behavioral traits, and parameter semantics well. It could detail return values more but is sufficient.

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 100%, but the description adds meaning: explains field identifier types, when form_selector is needed, and defaults for submit and widen. Adds value 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?

The description clearly states it fills form fields and optionally submits, with a specific verb and resource. It distinguishes from sibling tools like click, select_option, etc. by focusing on form filling.

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 the tool and how to disambiguate multiple forms using form_selector. It doesn't explicitly state when not to use, but the guidance is sufficient.

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

get_page_performanceA

Get page performance metrics using Navigation Timing and Resource Timing APIs. Returns TTFB, DOM timings, and a breakdown of the top 20 resources by transfer size. Works on both browsers and SPAs.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must cover behavioral traits. It accurately describes the output (specific metrics, top 20 resources). However, it does not mention any side effects, prerequisites (e.g., page must be loaded), or limitations (e.g., only works after page load). 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.

Conciseness5/5

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

The description is two sentences, front-loads the purpose, and every sentence adds value. No redundancy or fluff.

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 zero parameters and no output schema, the description is largely complete. It specifies the metrics returned and the environment. Minor omission: could clarify unit (e.g., milliseconds) or confirm the tool returns data from the current page state.

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 input schema has zero parameters, and schema coverage is 100%. According to the guidelines, 0 parameters yields a baseline of 4. The description adds no parameter info but compensates by clearly describing the return data.

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 gets page performance metrics, names the APIs used (Navigation Timing and Resource Timing), and lists specific metrics (TTFB, DOM timings, top 20 resources). This effectively distinguishes it from sibling tools like list_resources or inspect_request, which provide different detail.

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?

The description states it works on both browsers and SPAs, implying its usage for page-level performance analysis. However, it does not explicitly guide when to prefer this tool over alternatives like list_resources or inspect_request, nor does it mention 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.

go_backA

Navigate the browser back to the previous page in history (equivalent to the browser back button). Returns the URL navigated to and a page_state object with headings, landmarks, and links of the resulting page. Use after clicking into a page to return to a listing or search results without re-navigating by URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

No annotations exist, so description carries full burden. Discloses return values (URL and page_state) and behavior (equivalent to browser back). Could mention error cases (e.g., no history) but 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?

Three concise sentences with main action first. No redundant information. 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?

No output schema, but description explains return values (URL and page_state). Could detail page_state structure further, but given context signals, it's reasonably 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 is 100% (none). Baseline for 0 params is 4. Description adds no param info because none 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?

The description clearly states the tool navigates back in browser history, equivalent to the back button. It distinguishes from siblings like 'navigate' by specifying it returns to the previous page.

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 'Use after clicking into a page to return to a listing or search results without re-navigating by URL,' providing clear when-to-use and implicit alternatives.

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

hoverA

Hover the mouse over a page element to trigger hover-dependent UI such as tooltips, dropdown menus, or expandable content. Returns post-action page_state showing any newly revealed elements. Use this before click when content only appears on mouseover; use click instead if the element needs activation rather than hover.

ParametersJSON Schema
NameRequiredDescriptionDefault
widenNoWhen true, return the full-page diff instead of scoping to the interacted container. Default: false.
selectorYesCSS selector or @eN element reference from page_map targeting the element to hover over (e.g. "@e2", ".menu-trigger", "nav li").

TDQS

A4/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It states that hover triggers UI and returns page_state with revealed elements. However, it does not disclose hover duration, potential side effects (e.g., persistent menus), or error handling. Adequate but leaves gaps.

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 concise sentences plus a usage tip. All sentences are meaningful and front-loaded with core purpose. No wasted words.

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 simplicity and lack of output schema, the description covers the main functionality: triggering hover-dependent UI and returning page_state. It differentiates from siblings. Missing details like error handling or asynchronous behavior, but these are acceptable for a straightforward tool.

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

Parameters3/5

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

Schema coverage is 100%, and the description does not add extra meaning to parameters. The schema already describes 'selector' and 'widen' adequately. No additional parameter context is provided in the description, so baseline of 3 is appropriate.

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 function: 'Hover the mouse over a page element to trigger hover-dependent UI such as tooltips, dropdown menus, or expandable content.' It distinguishes itself from sibling tools like click by specifying when to use hover instead. Strong verb+resource combination.

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 guidance: 'Use this before click when content only appears on mouseover; use click instead if the element needs activation rather than hover.' This clearly contrasts with the click sibling. However, no exclusions for other scenarios (e.g., dynamic elements) are mentioned.

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

inspect_cookiesA

Inspect cookies on the current page with security analysis. Returns all cookies with domain, path, expiry, secure/httponly flags, and detected security issues (missing_secure, missing_httponly, sameSite_none_without_secure, excessive_lifetime, overly_broad_domain). Includes third-party detection and filtering options.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoFilter by domain substring
issues_onlyNoIf true, return only cookies with detected security issues

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It explicitly lists what the tool returns (domain, path, expiry, flags, security issues) and mentions capabilities (third-party detection, filtering). It does not claim any side effects, which is consistent with an inspection tool. A minor gap is not stating read-only behavior explicitly, but the context implies it.

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 two sentences, front-loading the core purpose and then detailing the return content. Every phrase adds value: 'security analysis', the enumerated issues list, 'third-party detection', 'filtering options'. No redundant or filler text.

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 read-only inspection tool with two optional parameters and no output schema, the description is sufficiently complete. It covers the return value comprehensively, mentions filtering, and lists specific security issues. The context (current page, security analysis) sets proper expectations. No additional information is needed for correct usage.

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

Parameters3/5

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

The input schema describes both parameters (domain and issues_only) with clear descriptions. The tool description adds 'filtering options' but does not elaborate beyond what the schema already covers. Since schema coverage is 100%, the baseline is 3. The description provides no additional semantic nuance 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?

The description clearly identifies the tool's action ('Inspect cookies'), resource ('the current page'), and the specific value-added feature ('with security analysis'). It enumerates the output fields including security issues, which distinguishes it from any potential generic cookie getter. Since there are no direct sibling tools for cookies, it is unambiguous.

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 states the tool inspects cookies on the current page, implying it should be used when cookie inspection is needed. It mentions filtering options (domain, issues_only) and third-party detection, providing context for use. However, it does not explicitly exclude when not to use it (e.g., if only basic cookies are needed) or name alternatives, but the absence of sibling cookie tools makes this less critical.

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

inspect_logA

Inspect a deduplicated console log group from list_page_logs and return concrete instances with timestamps, stack traces, and source locations.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes@logN ID from list_page_logs when group_by='message'.
limitNoMaximum number of individual log instances to return. Default: 5.

TDQS

A4.2/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses that the tool returns concrete instances with specific data. While it doesn't explicitly state it's read-only or non-destructive, the inspection nature is clear and no side effects are implied.

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 a single, focused sentence of 18 words. It is front-loaded with the purpose and contains no unnecessary information, making it highly concise and effective.

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?

For a simple inspection tool with 2 parameters and no output schema, the description adequately explains the input (id from list_page_logs) and output (instances with details). Minor omission: no mention of pagination or behavior when limit is exceeded, but likely not critical.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description adds minimal semantic value beyond the schema, as it reiterates the id source (list_page_logs) and limit behavior which are already in 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 clearly states the verb 'inspect', the resource 'a deduplicated console log group', and specifies the returned details (timestamps, stack traces, source locations). It distinguishes from sibling tool list_page_logs by indicating this tool inspects a specific group from that output.

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?

Description implies usage after list_page_logs with group_by='message', providing clear context. It does not explicitly state when not to use or name alternatives, but the guidance is sufficient for typical use.

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

inspect_requestA

Inspect a previously listed network request by its @rN id from list_network_activity. Returns the captured request metadata, coarse timing summary, initiator type, and notes about unavailable headers/bodies.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes@rN ID from list_network_activity
include_bodyNo

TDQS

A4/5.0
Behavior3/5

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

No annotations provided, so description carries burden. It discloses return content: metadata, timing, initiator type, notes on unavailability. Does not mention side effects or permissions, but read-only nature is implied.

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, no wasted words. Front-loaded with verb and resource, then return details. Efficient and clear.

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?

No output schema, but description adequately lists return information. Notes unavailable headers/bodies. For a simple inspection tool with 2 params, it is sufficiently complete.

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

Parameters3/5

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

Schema covers id with description, include_body has default but no explanation of effect. Description mentions return content but does not describe how include_body alters output. Schema coverage is 50%.

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 verb 'inspect', the resource 'network request', and the specific identifier 'list_network_activity'. It distinguishes from sibling tools like list_network_activity and inspect_websocket.

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?

Description specifies to use after list_network_activity with an @rN id, implying context. It does not explicitly state when not to use or list alternatives, 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.

inspect_storageA

Inspect browser storage (localStorage and sessionStorage) on the current page. Returns all key-value pairs with size information. Supports filtering by storage type and key pattern.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNoWhich storage to inspect: 'local' for localStorage, 'session' for sessionStorage, 'all' for bothall
patternNoFilter by key name substring

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool returns key-value pairs with size info, but does not mention performance impact, permission requirements, or whether it is a read-only operation (which is implied but not explicit).

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, each serving a purpose: first states the core action, second lists return details and filtering. No wasted words, 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?

For a simple two-parameter tool with no output schema, the description covers the essential functionality. It could mention that it only works on browser pages or requires a loaded page, but it is generally sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so the description adds minimal value beyond the schema. It repeats filtering by storage type and key pattern, but does not provide additional semantics or examples.

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 inspects browser storage (localStorage and sessionStorage) on the current page, returns key-value pairs with size info, and supports filtering. This distinguishes it from siblings like inspect_cookies or inspect_request.

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?

The description mentions filtering capabilities but does not explicitly state when to use this tool versus alternatives like inspect_cookies or inspect_request. It implies usage for inspecting storage but provides no exclusions or when-not guidance.

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

inspect_websocketA

Inspect actual WebSocket messages for a connection. Provide @wsN ID from list_websocket_activity. Supports direction filter, pattern search, and sort_by (newest/oldest).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes@wsN ID from list_websocket_activity
limitNo
patternNoSubstring match on message data
sort_byNonewest
directionNoall

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It lists supported features (direction filter, pattern search, sort_by) but does not disclose whether the operation is read-only, auth requirements, or potential side effects. 'Inspect' implies non-destructive, but it is not explicit.

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 concise sentences: first states purpose, second lists prerequisites and features. No fluff, well front-loaded. Every sentence adds value.

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

Completeness3/5

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

Given 5 parameters and no output schema, the description covers core purpose and main features but omits details on the return format, direction enum meanings, and limit parameter. It is adequate but incomplete for a tool with moderate complexity.

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

Parameters3/5

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

Schema description coverage is 40% (id and pattern have descriptions). The description reinforces the id parameter source and mentions direction, pattern, and sort_by features, but does not explain the limit parameter or detail enum values. It adds some value but not enough to fully compensate for low 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 the tool's purpose: 'Inspect actual WebSocket messages for a connection.' It specifies the resource (WebSocket messages) and the action (inspect), and uniquely differentiates from siblings by requiring an ID from list_websocket_activity and listing supported features.

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 a clear prerequisite: 'Provide @wsN ID from list_websocket_activity.' This guides the agent to use it after listing activity. It implicitly distinguishes from other inspect tools by focusing on WebSocket. However, it does not explicitly state when not to use this tool.

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

intercept_networkA

Manage network interception rules. Block or mock requests matching URL glob patterns. Rules are additive — each call adds a rule. Use refresh() after adding rules to replay the page load with rules active.

ParametersJSON Schema
NameRequiredDescriptionDefault
mockNoSynthetic response for mock_response action.
actionYesblock: abort matching requests. mock_response: return synthetic response. remove_rule: remove by rule_id. clear_all: remove all rules.
patternNoURL glob matched against the full request URL. '*' matches across path separators (e.g. '*ads.com*' blocks any URL containing ads.com; '*/api/v2/*' matches that path on any host). Prefix with 're:' for a regular expression (e.g. 're:api/v[0-9]+'). Required for block/mock_response.
rule_idNoRule ID to remove (for remove_rule action).

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description must carry behavioral disclosure. It reveals rules are additive and refresh() needed to apply, but does not mention persistence across navigations, side effects, or rule lifecycle (e.g., whether rules survive tab refresh). Partial but not comprehensive.

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?

Three sentences, each adding distinct value: purpose, additive behavior, and usage tip. No wasted words; front-loaded with main action.

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

Completeness3/5

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

For a complex tool with 4 parameters and nested objects, description covers basic usage but misses details like how to view active rules, rule ordering, or conflict resolution. Adequate but not thorough.

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 100%, so baseline is 3. Description adds value by explaining glob pattern syntax with examples and regex prefix ('re:'), which goes beyond the schema's brief 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?

The description explicitly states the tool manages network interception rules, with actions like block and mock. It clearly distinguishes from sibling inspection tools (e.g., inspect_request) by focusing on modifying network behavior.

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 usage guidance: rules are additive and require refresh() after adding. Lacks explicit when-not-to-use or alternatives, but the additive nature and refresh requirement are helpful context.

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

list_network_activityA

List observed network requests buffered during this browser session. Supports temporal filtering by seq window, request-state filters, URL substring filtering, adjective-based sorting such as slowest/fastest or newest/oldest, and an inline content_type field on each row. Returns stable @rN refs for follow-up inspection with inspect_request.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sinceNoStart of time window. 'all' = entire session, 'last' = since last action (default), or a seq number from a previous action response. Network capture starts automatically at browser launch — use `since='all'` to retrieve any request from any point in the session regardless of when it occurred.
untilNo'now' = up to present (default), or a seq number (exclusive upper bound).
filterNoall
methodNoFilter by HTTP method (case-insensitive), e.g. 'GET', 'POST'.
patternNoURL substring filter
sort_byNoSort order. First element = primary, rest = tiebreakers. Default: ['oldest']
max_size_kbNoOnly include requests whose response size is at most this many kilobytes.
min_size_kbNoOnly include requests whose response size is at least this many kilobytes.
unique_urlsNoCollapse multiple requests to the same URL into one row. The representative row is the one with the largest response size (ties broken by most recent). Includes request_count.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It discloses that network capture starts automatically at browser launch and that results return stable @rN refs. However, it does not mention whether listing clears buffered data or any side effects.

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 (two sentences), front-loads the purpose, and lists capabilities without any wasted words.

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?

The description covers the tool's purpose, filtering capabilities, and return format (stable refs). It mentions an inline 'content_type' field but could be improved by explicitly describing the structure of each row in the output.

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

Parameters3/5

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

Schema coverage is high (80%), so the baseline is 3. The description summarizes filtering capabilities but does not add significant new meaning beyond the schema's parameter 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?

The description explicitly states the verb 'List' and resource 'observed network requests buffered during this browser session.' It distinguishes from siblings like 'inspect_request' by noting that this tool returns stable @rN refs for follow-up inspection.

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 the tool (to list network requests) and mentions a follow-up sibling ('inspect_request'). However, it does not explicitly state when not to use it or alternative tools.

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

list_page_logsA

List buffered console logs for the current page with optional level filtering and seq-based temporal filtering. Group by exact message text (default, deduplicated with @logN IDs), source, or level.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoLog level filter. Use 'all' (default) to include every console message, or narrow to error, warning, info, or debug.all
sinceNoTemporal lower bound: 'all', 'last' (default), or a seq number. Uses half-open interval filtering on seq_at_initiation.
untilNoTemporal upper bound: 'now' (default) or a seq number. Uses half-open interval filtering on seq_at_initiation.
group_byNoGrouping dimension. 'message' (default) deduplicates exact text and assigns @logN IDs for inspect_log; 'source' groups by file/source; 'level' groups by severity.message

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that logs are buffered, deduplicated by default with @logN IDs, and that temporal filtering uses half-open intervals on seq_at_initiation. This is detailed but could mention if there are limits or truncation.

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, front-loaded with purpose, and no wasted words. Each sentence adds essential information.

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 4 parameters, no output schema, and no required params, the description covers grouping and temporal filtering reasonably well. It mentions @logN IDs linking to inspect_log. Missing explicit output format but that's acceptable without output schema. Minor gap: no mention of pagination or limits.

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 100%, but the description adds significant meaning beyond schema: explains that 'message' grouping deduplicates and assigns IDs, 'source' groups by file, 'level' by severity; what 'all' means for level; and half-open interval for since/until. This enhances understanding.

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 it lists buffered console logs with optional filtering, matching the name. It distinguishes from siblings like inspect_log and list_network_activity by specifying it deals with console logs and grouping by message, source, or level.

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 it (to list logs with optional filters and grouping), but does not explicitly state when not to or contrast with alternatives like inspect_log. However, the context is clear enough for an AI agent to infer appropriate use.

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

list_resourcesA

List all discoverable resources on the current page: links (with href and text), images (with src and alt), and forms (with action and method). Returns the complete set without caps — use this when page_map's 50-link limit is insufficient or when you need image URLs. No parameters required.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It states returns complete set without caps, which is clear. However, it doesn't mention potential side effects (likely none) or response format specifics like JSON array structure.

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, front-loaded with purpose, then usage guidance. Every sentence adds value; no unnecessary words.

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 no output schema, description mentions returned fields per resource type but doesn't specify exact return structure (e.g., array of objects). However, for a simple list tool, it's fairly complete and covers 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?

Schema has zero parameters and description confirms 'No parameters required.' This is clear and sufficient, adding value by explicitly stating no input 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 lists discoverable resources on the page, specifying types (links, images, forms) and their properties. Explicitly distinguishes from sibling page_map by mentioning the 50-link limit and image URL capability.

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: when page_map's limit is insufficient or when image URLs are needed. This directly helps agent select between sibling tools.

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

list_scriptsA

List all previously saved scripts with their metadata (name, creation date, last modified, size). Returns a JSON array. Use to discover available scripts before running them with run_script by name, or to audit what scripts exist on disk.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so the description carries the full burden. It discloses the output format (JSON array) and metadata fields, implying a read-only operation. However, it does not mention side effects, pagination, or whether results are sorted. The description is adequate but could be more explicit about the lack of modifications.

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?

Three sentences, each valuable: first states action and result, second clarifies output format, third provides usage guidance. Front-loaded and no unnecessary words.

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 no output schema, the description provides essential metadata fields and usage context. It differentiates from siblings well. While the exact JSON structure is not detailed, the listed fields are sufficient for a simple list tool. Could improve by specifying property names or sorting behavior.

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 tool has 0 parameters, and the schema coverage is 100%. Baseline for 0 parameters is 4. The description does not add parameter information, but none is needed. It implicitly confirms no inputs, which is sufficient.

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 uses the specific verb 'List' and clearly identifies the resource as 'all previously saved scripts'. It provides metadata fields and explicitly distinguishes from sibling tools like run_script by stating 'Use to discover available scripts before running them with run_script by name'.

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 gives clear usage contexts: discovering scripts before running them or auditing existence. It mentions a specific alternative (run_script) by name, but does not explicitly state when not to use the tool or list other alternatives like read_script.

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

list_websocket_activityA

Overview of WebSocket connections and message counts. Returns connections with @wsN IDs. Use inspect_websocket to see actual message content.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNo'all', 'last' (default), or seq number
untilNo'now' (default) or seq number (exclusive)

TDQS

A3.8/5.0
Behavior2/5

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

No annotations provided, so description carries full burden. It states outputs (connections with IDs) but does not disclose behavioral traits like pagination, latency, or whether it's read-only. As a list tool, it's likely read-only, but this is not stated.

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 concise sentences that efficiently convey the tool's purpose, output format, and a pointer to a related tool. No wasted words.

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 no output schema and no annotations, the description provides sufficient context about what the tool returns and how to get more detail. It lacks mention of result ordering or limits, but overall is adequate for a list operation.

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

Parameters3/5

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

Schema coverage is 100%, and both parameters are described in the schema. The description does not add extra meaning beyond what the schema already provides for 'since' and 'until', so baseline score of 3 is appropriate.

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 it provides an overview of WebSocket connections and message counts, returns connections with @wsN IDs, and distinguishes from inspect_websocket by directing to that tool for message content.

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?

It explicitly mentions using inspect_websocket for actual message content, providing a clear when-to-use distinction. However, it lacks explicit when-not-to-use or alternatives for other scenarios.

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

measure_coverageA

Measure JavaScript and CSS code coverage on the current page. Returns per-file byte usage showing how much code was actually executed/applied versus total loaded. Useful for identifying unused bundles, oversized dependencies, and performance optimization opportunities.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoWhich coverage to measure: 'js' for JavaScript only, 'css' for CSS only, 'all' for bothall
resetNoStop any in-progress coverage, clear data, and restart fresh

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It states the tool returns per-file byte usage but does not mention potential side effects (e.g., whether it modifies page state) or prerequisites (e.g., page must be fully loaded). For a read-only measurement tool, this is adequate but lacks depth.

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 two sentences, front-loading the key action and resource, and wastes no words. Every sentence serves a purpose: stating function, describing output, and listing use cases.

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 two parameters, no output schema, and no annotations, the description adequately covers purpose, output shape (per-file bytes used vs total), and applicability. It could mention return format details, but overall it is complete enough for an agent to understand invocation intent.

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

Parameters3/5

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

With 100% schema description coverage, the baseline is 3. The description does not add additional meaning to the parameters beyond what the schema already provides (reset and type enums). It focuses on output instead.

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 measures JavaScript and CSS code coverage on the current page, specifying the verb (Measure) and resource (code coverage). It distinguishes from sibling tools like get_page_performance by focusing on coverage rather than performance metrics.

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 gives explicit use cases: identifying unused bundles, oversized dependencies, and optimization opportunities. While it doesn't explicitly state when not to use it or name alternatives, the context is clear enough for an agent to decide.

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

page_mapB

Get the page's YAML accessibility tree (primary structural view). Each node: - role "name" [state...] [ref=eN]:. Scope by [ref=eN] or semantic token. depth controls tree depth.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoMaximum tree depth (default: 5, max: 10). At max depth, omitted children are counted.
scopeNoLimit output to a subtree: `[ref=eN]` (subtree rooted at that node) or semantic token (`dialog`, `main`, `sidebar`).

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden. It does not disclose whether the operation is read-only, permissions required, or performance implications. The get verb implies read but safety is not explicit.

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 and front-loaded. Two sentences cover purpose, node format, scope, and depth with no wasted words.

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 simplicity (2 params, no output schema, no annotations), the description provides adequate context including the output format and parameter usage. Minor gaps like default behavior with no scope are tolerable.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The tool description adds no new meaning beyond what the schema already provides for depth and scope.

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

Purpose4/5

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

The description clearly states it retrieves the YAML accessibility tree and provides the node format. It is a distinct purpose among siblings but does not explicitly differentiate from similar tools like audit_accessibility.

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 guidance on when to use this tool versus alternatives. The description implies its use for structural view but lacks explicit when-to-use or 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.

press_keyA

Dispatch a keyboard key press event on the page or a targeted element. Supports named keys (Enter, Escape, Tab, ArrowDown, Backspace) and character keys. Returns post-action page_state reflecting any DOM changes caused by the keypress. Use for form submission (Enter), closing modals (Escape), focus navigation (Tab), or keyboard shortcuts.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesKey to press — use Playwright key names: "Enter", "Escape", "Tab", "ArrowDown", "ArrowUp", "Backspace", "Space", or single characters like "a". Modifier combos: "Control+a", "Shift+Tab".
widenNoWhen true, return the full-page diff instead of scoping to the interacted container. Default: false.
selectorNoOptional CSS selector or @eN ref to focus before pressing the key. If omitted, the key is dispatched to the currently focused element or the page.

TDQS

A4.4/5.0
Behavior4/5

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

Discloses that it returns post-action page_state reflecting DOM changes. Lacks details on error handling or permissions, but otherwise sufficient for a simple event dispatch tool.

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?

Three well-structured sentences with front-loaded purpose. Every sentence adds value; no repetition or fluff.

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?

No output schema, but description explains return value. Covers all parameters and use cases adequately for a low-complexity 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?

Schema coverage is 100%, baseline 3. Description adds valuable context for all three parameters: key format, selector usage, and widen behavior.

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?

Clear verb 'Dispatch' with specific resource 'keyboard key press event on page or targeted element'. Lists supported keys and use cases, distinguishing from sibling tools like click or hover.

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 states use cases for form submission, closing modals, focus navigation, or keyboard shortcuts. Does not explicitly mention when not to use, 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.

read_contentA

Extract plain text content from a specific page section identified by heading name or CSS selector. Supports pagination via offset and max_chars for large sections. Returns content, total character count, and whether more content is available. Use after page_map to read specific sections without re-fetching the entire page; use navigate instead when you need the full page content.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNoCharacter offset to start reading from (default: 0). Use with max_chars to paginate through large sections.
headingNoExact heading text to find (case-insensitive match). Extracts all content under that heading until the next heading of equal or higher level. If not found, the response lists available headings as a hint.
selectorNoCSS selector to extract content from (e.g. ".article-body", "#main-content"). Use when content isn't under a heading or you need a precise DOM target.
max_charsNoMaximum characters to return (default: 10000). Reduce for token efficiency; increase to get more content in one call.

TDQS

A4.4/5.0
Behavior4/5

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

No annotations exist, so description carries full burden. It discloses return fields (content, character count, more available), pagination behavior, and hints at heading-not-found behavior (lists available headings). Could add more detail on error handling but covers core behavior well.

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, front-loaded with purpose, includes usage guidance at the end. No redundant or irrelevant content.

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?

For a tool with 4 parameters, no annotations, no output schema, description covers usage context, behavior, return values, and alternatives. Slightly lacking in describing exact response format or error handling, but sufficient for basic use.

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

Parameters3/5

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

Schema coverage is 100% with detailed parameter descriptions. The description reinforces usage patterns (pagination, alternative selector) but does not add significant new semantic information 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?

The description clearly states the tool extracts plain text from a page section using heading name or CSS selector. It distinguishes from siblings page_map and navigate by specifying when to use each.

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: after page_map to read specific sections without re-fetching, or use navigate for full page content. Also describes pagination support with max_chars and offset.

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

read_scriptA

Read the full JSON definition of a previously saved script. Returns the complete script object including version, steps, and limits. Use to inspect a saved script's logic before running it, or to understand what an existing script does before modifying and re-saving it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the saved script to read (as shown in list_scripts output, without .json extension).

TDQS

A4.3/5.0
Behavior4/5

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

Without annotations, the description carries the full burden. It transparently states the return value ('complete script object including version, steps, and limits'), which adds useful behavioral context. However, it does not explicitly confirm it is a read-only operation with no side effects, though 'read' strongly implies this.

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 two sentences long, front-loading the core purpose and following with usage guidance. Every word adds value; there is no redundancy or unnecessary detail.

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 simple read tool with one parameter and no output schema, the description fully covers what the tool does, what it returns, and when to use it. It is sufficient for an agent to understand and select the tool.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description does not add any additional meaning beyond the schema's existing parameter description (name, format, source). No extra context or clarification is provided.

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 ('Read the full JSON definition') and the resource ('a previously saved script'). It distinguishes itself from sibling tools like list_scripts (which lists names) and run_script (which executes), making the purpose unambiguous.

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 explicit usage scenarios: 'Use to inspect a saved script's logic before running it, or to understand what an existing script does before modifying and re-saving it.' This gives clear context for appropriate use, though it does not explicitly state when not to use it or name alternatives for exclusion.

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

refreshA

Reload the current page. Returns page_state after reload. Use after setting intercept rules to replay the page with rules active. Seq increments for temporal observation queries.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations, so description carries full burden. It mentions returning page_state and seq increment, but lacks details on side effects like losing unsaved data, though implied by reload.

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?

Three concise sentences, front-loaded with purpose, then usage context, then return detail. No 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?

For a no-parameter tool without output schema, it adequately explains action, timing, and return behavior (page_state with seq increment).

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?

Zero parameters; baseline score is 4. Description adds no parameter-specific info but explains the return value, which is appropriate.

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 'Reload the current page' with a specific verb and resource, and distinguishes from siblings like 'navigate' or 'go_back'.

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 setting intercept rules to replay the page with rules active.' It doesn't list when not to use, but the use case is clear.

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

run_goalA

Execute a high-level crawl goal autonomously. The agent plans, navigates, and extracts data using its own LLM loop. Returns structured results when done. Use this for complex multi-page tasks; use individual tools (navigate, click, etc.) for fine-grained control.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYesNatural-language crawl goal
modelNoModel to use (optional; uses default from credentials if omitted)
max_stepsNoMaximum agent steps (optional; default from settings)
allowed_toolsNoRestrict which built-in tools the agent can use (optional)

TDQS

A4.2/5.0
Behavior3/5

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

No annotations were provided, so the description carries full burden. It discloses autonomous behavior, LLM loop usage, and structured output, but lacks details on potential side effects like cost, rate limits, or that it may invoke other tools internally.

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?

Three concise sentences: core action, how it works, usage guidance. No redundancy, every sentence adds value and is 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 complexity (autonomous goal execution) and absence of an output schema, the description is fairly complete. It covers purpose, behavior, and usage context, though it could mention that the agent can be restricted via the allowed_tools parameter (already in schema). Minor omission.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for all parameters. The tool description does not add additional meaning beyond what the schema already provides, earning the baseline score of 3.

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 it executes a high-level crawl goal autonomously, using an LLM loop to plan, navigate, and extract data. It contrasts itself from sibling tools like navigate, click, etc., making its unique purpose unambiguous.

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 to use this for complex multi-page tasks and to use individual tools for fine-grained control. Provides clear context on when this tool is appropriate versus alternatives.

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

run_scriptA

Execute a deterministic multi-step script without per-step LLM round-trips, running on a cloned browser tab. Scripts support loops (for/while/forEach), conditionals (if/else), error handling (try/catch), parallel branches, and variable capture. Returns a script_id immediately — use wait_for_scripts to collect results. Provide either an inline script definition or a name to load a previously saved script. Use when you detect a repetitive pattern (same operation on 3+ pages/items).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName of a previously saved script to run (alternative to inline 'script'). Mutually exclusive with 'script' — provide one or the other.
limitsNoOverride default execution limits. Keys: max_steps (int), max_timeout_secs (int), max_output_bytes (int), max_parallel_branches (int), per_step_timeout_secs (int).
scriptNoInline script definition object. Must include: version ("1.0"), steps (array of node objects: ToolCall, Assign, Collect, Yield, ForLoop, ForEach, WhileLoop, IfElse, TryCatch, Parallel), and optional limits. Use instead of 'name' for new scripts.
save_asNoSave the script under this name after execution for future reuse (alphanumeric + underscore). Persists to ~/.acrawl/scripts/<name>.json.

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It explains the tool is deterministic, runs on a cloned tab, returns script_id immediately, supports loops, conditionals, error handling, and parallel branches. Could mention cancellation via cancel_script, but overall transparent.

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 paragraphs: first describes what the tool does and its capabilities, second gives usage context. Every sentence serves a purpose, no redundancy. Front-loaded with key action and immediate result.

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?

No output schema, but description explains return value (script_id) and how to get results (wait_for_scripts). Covers supported constructs and parameter options. Lacks explicit mention of error handling beyond try/catch, but sufficient for usage.

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 100% (baseline 3), but description adds context: explains name and script are mutually exclusive, save_as persists to disk, limits override defaults, and script must include version and steps. This adds meaningful value 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?

The description uses specific verb+resource: 'Execute a deterministic multi-step script without per-step LLM round-trips, running on a cloned browser tab.' It clearly distinguishes from sibling tools by specifying it's for repetitive patterns and mentions control flow constructs, making its unique purpose unmistakable.

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 when-to-use guidance: 'Use when you detect a repetitive pattern (same operation on 3+ pages/items).' Also implies alternatives: use wait_for_scripts for results, and that you can provide inline or saved script. Does not explicitly state when not to use, but sufficient for most agents.

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

save_fileA

Download a resource from a URL and save it to the local output directory. Handles any file type (images, PDFs, CSVs, etc.) via HTTP GET. Returns the absolute path of the saved file. Use to persist crawl artifacts; path traversal is blocked for security.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesFully qualified URL of the resource to download (e.g. "https://example.com/report.pdf"). Must include protocol.
subdirNoSubdirectory within the output directory to save into (e.g. "images", "data/csv"). Created automatically if it doesn't exist.
headersNoOptional HTTP request headers to send with the download (e.g. Referer, Origin, User-Agent). Use for CDNs that reject requests lacking a Referer.
filenameNoCustom filename to save as (e.g. "report.pdf"). If omitted, derived from the URL's last path segment. Path traversal characters (../) are rejected.
output_dirNoOverride the default output directory. Can be relative (resolved against CWD) or absolute. If omitted, uses the configured output_dir from settings.

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, description carries full burden. It mentions HTTP GET, any file type, returns absolute path, and path traversal blocking. However, lacks details on error handling, size limits, or overwrite 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?

Three sentences front-loaded with purpose, then general capability, then use case. No superfluous content.

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?

No output schema, but return value is simple. Parameters well-documented. Missing error/edge-case info, but overall adequate for a file download 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?

Schema description coverage is 100%, but description adds value: notes path traversal blocked for filename, subdir auto-created. Provides usage hints beyond 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 'Download a resource from a URL and save it to the local output directory.' This gives specific verb and resource, distinguishing it from all browser-interaction sibling tools.

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 'Use to persist crawl artifacts' and mentions security constraint. Provides clear context but does not explicitly state when not to use or alternative tools.

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

save_scriptA

Persist a script definition to disk at ~/.acrawl/scripts/.json for reuse across sessions. Once saved, run it later with run_script using name instead of providing the full inline definition. Use for complex extraction patterns you want to apply repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName to save the script under (alphanumeric characters and underscores only, no file extension). Must be unique — overwrites any existing script with the same name.
scriptYesScript definition object (same format as the 'script' parameter in run_script). Must include version, steps, and optionally limits.

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses the save location, file format, overwrite behavior, and relationship with run_script, providing sufficient transparency beyond the lack of annotations. 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.

Conciseness5/5

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

Three sentences, front-loaded with the main action, no redundancy, each sentence serves a purpose.

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

Completeness3/5

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

The description is mostly complete for a save operation but lacks details on return values, error conditions, or confirmation of success. Given the absence of an output schema, this is a minor gap.

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 description adds value beyond the input schema by specifying uniqueness and overwriting for 'name' and referencing 'script' parameter format from run_script, with schema coverage at 100%.

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 (persist/save), resource (script definition to disk at a specific path), and distinguishes from sibling tools like run_script and list_scripts by explaining the reuse purpose.

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 (complex extraction patterns for repeated use) and mentions the alternative (use run_script to run saved scripts), though it does not explicitly 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.

screenshotA

Capture a screenshot of the current page viewport, a specific element, or the full scrollable page. Returns base64-encoded image data by default, or saves to disk when save=true. Use as a LAST RESORT only after text-based tools (page_map, read_content, execute_js) have failed to provide the needed information — screenshots are expensive and cannot be searched or parsed programmatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveNoIf true, save the screenshot to the output directory and return the file path instead of base64 data. Default: false.
formatNoImage format. 'png' (default) supports transparency; 'jpeg'/'webp' produce smaller files for photos. Default: png.
qualityNoCompression quality 0–100 for jpeg/webp formats only (ignored for png). Lower values = smaller files. Default: 80.
filenameNoCustom filename for the saved image (e.g. "homepage.png"). Only used when save=true. Defaults to a timestamped name if omitted.
selectorNoCSS selector to screenshot a specific element (e.g. "#chart", ".product-image"). If omitted, captures the full viewport.
full_pageNoIf true, capture the full scrollable page height (not just the visible viewport). Ignored when selector is provided. Default: false.
output_dirNoDirectory to save the screenshot in (absolute or relative to CWD). Only used when save=true. Overrides the default output directory.

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description discloses key behaviors: returns base64 by default or saves to disk when save=true. It does not cover all edge cases (e.g., waiting for page load, animation side effects), but provides sufficient transparency for most use cases.

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, front-loaded with the core action, followed by essential advisory context. Every word earns its place; no 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?

Despite lacking an output schema, the description explains return types (base64 data or file path) and covers all capture modes and optional parameters, making the tool fully self-contained.

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 100%, but the description adds valuable aggregation: it summarizes the three capture modes (viewport, element, full page) and the distinction between base64 and file output, surpassing the individual parameter 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?

The description clearly states the tool's purpose: 'Capture a screenshot of the current page viewport, a specific element, or the full scrollable page.' It distinguishes from sibling tools by positioning it as a last resort after text-based tools, making the purpose unambiguous.

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 advises to use 'as a LAST RESORT only after text-based tools (page_map, read_content, execute_js) have failed,' providing clear when-to-use and when-not-to-use guidance with named alternatives.

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

script_statusA

Check the current execution status of a running or completed script without blocking. Returns the script's state (running, completed, failed, cancelled), current step count, extracted data so far, and any error message. Use to monitor long-running scripts between other actions; use wait_for_scripts to block until completion.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesScript ID returned by run_script (format: scr_XXXXXXXX). Obtain from the run_script response.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, description fully carries burden. It accurately states non-blocking nature and lists return values. No contradictory or omitted behavioral traits for a read-only status check.

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 concise sentences: first explains functionality and outputs, second gives usage directive. No redundant words, front-loaded with essential info.

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 a single parameter, no output schema, and low complexity, the description fully covers what the tool does, its return values, and usage context. No gaps.

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

Parameters3/5

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

Schema coverage is 100% and schema already describes script_id format and source. Description adds no extra parameter information beyond the schema, so baseline 3 is appropriate.

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 checks execution status of a script without blocking, and enumerates returned fields (state, step count, data, error). Distinguishes from sibling wait_for_scripts by mentioning non-blocking behavior.

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 advises using this tool to monitor long-running scripts between other actions, and directs to wait_for_scripts for blocking completion. Provides clear when-to and when-not-to guidance.

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

scrollA

Scroll the current page up or down by a specified pixel amount to reveal content beyond the visible viewport. Returns updated page_state after scrolling, reflecting any newly loaded lazy content. Use to reveal below-the-fold content, trigger infinite scroll loading, or navigate long pages section by section.

ParametersJSON Schema
NameRequiredDescriptionDefault
pixelsNoNumber of pixels to scroll (default: 500). Use 300–800 for a normal page scroll; larger values for quickly reaching page bottom.
directionNoScroll direction. 'down' reveals content below the viewport; 'up' scrolls back toward the top.

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It informs that the tool returns updated page_state after scrolling and reflects lazy-loaded content, adding valuable behavioral context beyond the basic scroll 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?

Three sentences, each serving a distinct purpose: what it does, what it returns, and when to use. No unnecessary words, efficient and front-loaded.

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 simple 2-parameter tool with no output schema, the description covers the action, return value, and usage scenarios adequately. It is complete for an agent to understand and use the tool correctly.

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 100%. The description adds practical guidance, e.g., pixel range '300–800 for a normal page scroll' and 'larger values for quickly reaching page bottom', which is helpful beyond the schema definitions.

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 it scrolls the page up or down by a specified pixel amount, a specific verb+resource. It distinguishes from sibling tools like click, navigate, and press_key by focusing on viewport manipulation.

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?

It provides explicit use cases: reveal below-the-fold content, trigger infinite scroll, navigate long pages. While not explicitly stating when not to use, the guidance is clear and contextually appropriate given the sibling set.

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

select_optionA

Select an option from a native or custom ARIA/portal dropdown. Identify the target control via CSS selector or @eN ref, then specify which option to select by its value attribute, visible label text, or zero-based index. Omit value, label, and index to open the dropdown, enumerate the currently available options, and return them without selecting. Returns post-action page_state showing any page changes triggered by the selection (e.g. dependent dropdowns updating).

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoZero-based index of the <option> to select (0 = first option). Use when value/label are unknown.
labelNoThe visible text of the option to select (e.g. "United States", "Medium"). Use when you know the display text.
valueNoThe value attribute of the option to select (e.g. "us", "medium"). For custom dropdowns without exposed values, this is matched against visible option text.
widenNoWhen true, return the full-page diff instead of scoping to the interacted container. Default: false.
selectorYesCSS selector or @eN ref targeting the native select or custom dropdown trigger (e.g. "@e4", "select#country", "button[role='combobox']").

TDQS

A4.6/5.0
Behavior5/5

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

Despite no annotations, the description fully discloses behavior: selection triggers page changes, returns page_state, fallback matching for custom dropdowns, and widen parameter effect.

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?

Four succinct sentences, front-loaded with purpose, no redundant information. Efficiently structured.

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 return value, alternative usage modes, and parameter options. Missing error handling details but sufficient for common use cases given no output schema.

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 100%, so baseline 3. The description adds value by explaining the enumeration mode when all optional params omitted, which goes beyond individual parameter 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?

The description clearly states it selects an option from a native select or custom dropdown, and also describes the enumeration behavior. It distinguishes from sibling tools like click and fill_form.

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?

Explains when to use each parameter (value, label, index) and the enumeration use case. Does not explicitly exclude other tools but provides clear context.

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

set_deviceA

Switch browser device emulation between mobile and desktop modes. Recreates the browser context with new viewport, user agent, and touch settings. Cookies and localStorage are preserved. Use preset device names for convenience or provide custom parameters. Returns page_state showing the page as rendered in the new device mode. Cannot be used while sub-agents are running.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoDevice preset name: 'iphone_15', 'iphone_se', 'iphone_15_pro_max', 'pixel_7', 'galaxy_s24', 'ipad_pro', 'ipad', 'galaxy_tab_s9', 'desktop', 'desktop_hd'. Use 'desktop' to reset to default mode. Cannot be combined with custom fields.
hasTouchNoEnable touch event support. Cannot be used with 'device'.
isMobileNoEnable mobile viewport behavior. Cannot be used with 'device'.
viewportNoCustom viewport dimensions. Cannot be used with 'device'.
userAgentNoCustom user agent string. Cannot be used with 'device'.
deviceScaleFactorNoDevice pixel ratio (e.g., 2 for retina, 3 for iPhone). Cannot be used with 'device'.

TDQS

A4.2/5.0
Behavior4/5

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

Discloses that cookies and localStorage are preserved, returns page_state, and cannot be used with sub-agents. No annotations provided, so description carries full burden; it does not contradict any 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?

Four sentences, front-loaded with main action, each sentence provides useful information 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?

Covers return value (page_state) and usage constraint (sub-agents). Lacks details about what happens if device is set while custom params are present, but schema already enforces exclusivity.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description adds context about using presets vs custom fields but does not significantly enhance understanding 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 the tool switches browser device emulation between mobile and desktop modes, specifying it recreates the browser context with viewport, user agent, and touch settings. Distinct from any sibling tool.

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 guidance on using preset device names versus custom parameters, and explicitly states it cannot be used while sub-agents are running. However, no explicit alternative tool comparison is needed as no sibling does emulation.

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

switch_tabA

Switch the browser focus to a different open tab by its zero-based index. Returns the tab count and a page_state object reflecting the switched-to tab's content (headings, landmarks, links). Use to access pages opened by link targets, popups, or forked sub-agents without re-navigating.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoZero-based tab index to switch to (0 = first tab). Use the tab count from previous responses to determine valid indices.

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavioral traits. It states it switches focus and returns tab count and page_state. It does not disclose failure modes (e.g., invalid index) or side effects on browser history. This is adequate but not exhaustive.

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: first defines action and output, second provides usage guidance. No unnecessary words; efficiently communicates purpose and usage.

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?

For a simple tool with one parameter and no output schema, the description covers purpose, usage, parameter semantics, and return value. It could mention what happens on invalid index, but given simplicity, it is sufficiently 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?

The single parameter `index` is fully described in the schema (100% coverage). The tool description adds value by linking the index to 'tab count from previous responses,' aiding correct invocation. This goes beyond the schema's basic description.

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 ('Switch the browser focus'), identifies the resource ('different open tab'), and specifies the method ('by its zero-based index'). It differentiates from siblings like `navigate` and `go_back` by focusing on tab switching without re-navigation.

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 explicitly says when to use this tool: 'to access pages opened by link targets, popups, or forked sub-agents without re-navigating.' It does not state when not to use it or list alternatives, but the context of sibling tools provides the necessary differentiation.

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

waitA

Wait for a DOM element to reach a specified state (visible, hidden, attached, detached) or pause for a fixed duration. Use after actions that trigger asynchronous page changes such as form submissions, AJAX requests, or animations. Returns post-action page_state showing the resulting URL, title, and structural diff once the condition is met or the timeout expires, unless silent: true is set for a time-only wait, in which case only the completion signal is returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNoTarget state to wait for. 'attached' (default) = element exists in DOM; 'visible' = element is rendered and not hidden; 'hidden' = element is no longer visible; 'detached' = element removed from DOM. Use 'hidden' to wait for loading spinners to disappear.
silentNoWhen true, suppress the page_state payload from the response. Use for simple timed pauses where you don't need a structural diff — saves context tokens. Only effective for time-only waits (no selector). Default: false.
secondsNoFixed number of seconds to wait (max 300). Use when no specific element signals completion. Mutually exclusive with 'selector'.
selectorNoCSS selector of the element to wait for (e.g. ".results-loaded", "#spinner"). Mutually exclusive with 'seconds' — provide one or the other.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It explains return behavior (page_state or completion signal), the effect of 'silent', and the mutually exclusive parameters. However, it does not specify the default timeout or behavior if neither 'selector' nor 'seconds' is provided, which is a minor gap.

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, consisting of three well-structured sentences. It front-loads the main purpose, then provides usage context, and finally details the return behavior. 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 complexity (4 parameters, no output schema, no annotations), the description covers usage, parameter details, and return values well. However, it lacks explicit mention of default timeout or what happens if both 'selector' and 'seconds' are omitted, which would improve completeness.

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 100%, providing a baseline of 3. The description adds significant value beyond the schema by explaining each state enum value, clarifying the 'silent' parameter, and explicitly stating the mutual exclusivity of 'seconds' and 'selector'. This extra context earns a score of 5.

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 waits for a DOM element to reach a specific state or pauses for a fixed duration. It uses specific verbs and resources, and distinguishes from sibling tools like 'wait_for_scripts' by focusing on DOM element states and timed pauses.

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 explicitly states when to use: 'Use after actions that trigger asynchronous page changes...'. It provides context for usage but does not explicitly mention when not to use or name alternatives, though the differentiation from siblings is implied.

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

wait_for_scriptsA

Block until one or more scripts finish execution and return their collected results. Returns a JSON array of ScriptResult objects with extracted_data, yielded checkpoints, step count, and status. If script_ids is omitted, waits for ALL active scripts. Use after run_script to collect final results.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idsNoList of script IDs to wait for (format: scr_XXXXXXXX each). If omitted, waits for all currently active scripts to finish.

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It mentions blocking behavior and return structure (JSON array with specific fields). However, it does not disclose timeout behavior, error handling, or what happens if scripts never finish. Acceptable but could be more thorough.

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, front-loaded with primary purpose, then details on return and optional behavior. No wasted words.

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 simple tool with one optional param and no output schema, description adequately covers purpose, usage, return shape. Lacks timeout or error handling info, but not critical for this tool's typical use.

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 100% with only one param. Description adds behavioral nuance: omitting script_ids waits for all active scripts. This adds value beyond the schema's description of 'List of script IDs'.

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 blocks waiting for script execution and returns results. Distinguishes from siblings like run_script (initiates) and script_status (check status without blocking). Also covers behavior when script_ids omitted.

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 recommends using after run_script to collect results. Implicitly suggests not using if scripts haven't been started. Could be improved by mentioning not to use if non-blocking check is needed.

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

TDQS

A4/5.0
Disambiguation5/5

Every tool has a clear, distinct purpose with thorough descriptions. Interactions, inspections, navigation, and scripting tools are all well-separated, with no overlapping functionality that would confuse an agent.

Naming Consistency4/5

Most tools follow a verb_noun snake_case pattern (e.g., inspect_cookies, list_scripts). A few outliers like page_map and script_status use noun_noun, but they are still descriptive and consistent in style, with no mixed conventions.

Tool Count2/5

With 39 tools, the server is significantly over the recommended 3-15 range for well-scoped servers. While each tool serves a purpose, the large number adds complexity and may overwhelm agents, suggesting potential for consolidation.

Completeness4/5

The tool set covers a wide range of web automation needs: navigation, interaction, inspection, performance, scripting, and storage. Minor gaps exist (e.g., no explicit alert handling or file upload), but the core workflows are well-supported.

Maintenance

ActivitySlowing
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Multi-session browser MCP server that gives AI agents up to 15 fully-isolated browsers running in parallel. 36 tools including navigation, extraction, network intercept, stealth, and self-improvement. Each session has its own cookies, storage, and fingerprint so agents never collide.
    37
    62
    5
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Web scraping, crawling, and structured data extraction for AI agents. 5 tools: scrape (clean markdown from any URL), crawl (entire sites), map (discover URLs), extract (structured JSON), and search. 833ms avg latency, single binary, self-hostable.
    8
    916
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    single-binary MCP server that gives AI agents a browser. 66 tools for navigation, form filling, data extraction, screenshots, and DOM diffing — built on pure Chrome DevTools Protocol.
    9
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mingye-Lu/AgenticCrawler'

If you have feedback or need assistance with the MCP directory API, please join our Discord server