AginxBrowser
AginxBrowser
Der Browser für KI-Agenten. Sieh das Live-Web. Interagiere damit.
Ein Browser, der von der ersten Codezeile an für Agenten gebaut wurde – kein menschlicher Browser, der an Automatisierung angeflanscht ist. Sieh die Welt, lies sie, durchsuche sie und handle in ihr: eine Rust-Binärdatei mit eingebautem V8, kein Chromium erforderlich.
Menschen haben Chrome. Agenten haben AginxBrowser.
Eine Binärdatei, null Abhängigkeiten, sofort einsatzbereit. HTTP-API + nativer MCP – Agenten stecken ein und los geht's.
Warum Agenten ihren eigenen Browser brauchen
Bestehende „Browser-Automation“ wurde für Menschen oder für einmaliges Scraping gebaut – nicht für Agenten:
AginxBrowser | Puppeteer/Playwright | Firecrawl | Browser-use | |
Entwickelt für | Agenten zuerst | Menschliches Debugging | Scraping-Dienst | LLM-Wrapper |
Abhängigkeiten | Einzelne Binärdatei, kein Chromium | Chromium ~500MB | Docker ~1GB | Chromium |
Sieht (Screenshots) | ✅ eingebaute diting-Rendering-Engine | Benötigt Chromium | ❌ | Benötigt Chromium |
Liest | Markdown + js_extract | Eigenbau | Markdown | Eigenbau |
Findet (Suche) | ✅ Metasuche über 5 Engines | ❌ | ❌ | ❌ |
Handelt | Indexierte Sitzungsinteraktion | DevTools-API | ❌ | LLM-gesteuert |
Protokoll | HTTP + nativer MCP | Node-API | HTTP | Python |
TLS-Fingerabdrücke | ✅ Chrome/Firefox/Safari | Plugin erforderlich | ❌ | ❌ |
CAPTCHA-Lösung | ✅ automatisch | Eigenbau | ❌ | ❌ |
Interaktive Sitzungen | ✅ persistent | ✅ | ❌ | ✅ |
Ein Agent braucht fünf Dinge von einem Browser: sehen, lesen, finden, handeln, bereitstellen. Eine Binärdatei deckt alles ab – systemd-freundlich, MCP-nativ für Claude/Cursor, null Abhängigkeiten.
Kernvorteil: kein Chromium. AginxBrowser integriert eine vollständige Browser-Engine (V8 + Rust-HTTP-Stack + unsere eigene diting-CSS-/Layout-/Paint-Rendering-Engine, mit der Blitz/Stylo/Taffy-Linie als Referenzimplementierung). Kein Puppeteer, kein Chrome, kein Docker. Eine Rust-Binärdatei unter systemd ist deine Agent-Browsing-Infrastruktur.
Related MCP server: Pilot
Drei Dinge, die zustandslose Renderer nicht können
Die meisten neuen „Agent-Browser“ sind zustandslose, fingerabdrucklose Einmal-Renderer – gut für öffenliche Seiten, scheitern aber auf der Stelle an Cloudflare oder Anmeldeabläufen. AginxBrowser geht den entgegengesetzten Weg:
🔐 Echte TLS-Fingerabdrucke – Der Stealth-Modus repliziert die vollständigen TLS-Handshakes von Chrome145 / Fireox133 / Safri / Edge über BoringSSL (nicht nur einen UA-String), pro Anfrage umschaltar; Cloudflare-Türnstile-Herausforderungen warten automatisch auf
cf_clearence. Engines ohne Fingerabdrüce kassieren 403er – wir kommen durch.🤝 Zustandbehafete interaktive Sitzungen – persistente Sitzungen (8 Minuten Idle-Keep-Alive), Anmeldezustand injizier- und exporierbar (
session_create(cookies=...)↔session_cookies), übersehen Paginierung und mehrstufige Abläufe. Einmal-Engines verwerfen den Zustand.🔌 MCP-nativ – 14 Tools als Bürger erster Klasse (kein CDP-Shim). Claude Code / Curso / Claude Desktop verbinden sich mit einer Zeile. HTTP + MCP als duales Protokoll.
Als Referenz: Cloudfares Kitesurf bietet ausdrücklich weder echte TLS-Fingerabdruck-Aushandlung noch persistente Authentifizierungssitzungen – Anti-Bot- und Anmelde-Bereiche sind genau das Spielfeld von AginxBrowser.
Apache-2.0-Open-Source, einzelne Binärdatei – jetzt selbst hosten, kein Cloud-Lock-in.
Funktionen
Gestuftes Rendering: statische Seiten über einfaches HTTP (~100 ms); V8 startet nur, wenn JS-Rendering benötigt wird (~1–2 s) – 10x schneller bei ~80 % der Seiten
Multi-Engine-Metasuche: allgemeines Web (Baidu / B ing / Sogou / WeChat / Goog le), Nachrichten (B ing News), Code (Stack Overflow, GitHub), Pakete (npm, PyPI), Wissenschaf (arXiv), KI-Modelle (Hugging Face) – parallel abgefragt, zusammengeführt und dedupliziert. Betreiber können einen privaten Meilisearch-Index in dasselbe
/searchintegrieren. Suchen → Lesen in einem SchritBildersuche:
categories=imagesruft die B ildindizes von Baidu/B ing auf und liefert direkte binäreimage_ur-Links (direkt als jpg/png herunterladbar) plussource_ur-HerkunftInteraktive Sitzungen: persistente Browser sitzungen mit indexierter Interaktion (
state/click/input/scroll/eval) – Agenten browsen wie MenschenCAPTCHA-Autolösung: Typerkennung mit optionaler 2captcha-Integration – die Suche bleibt nie auf Verifizierungsseiten stehen
JS-Datenextraktion:
js_extractziehtwindow.__INITIAL_STATE__und andere strukturierte Daten aus SPAs herausScreenshot-Rendering:
/screenshot-Endpunkt (opt-in--features screenshot) rendert das JS-gerenderte DOM mit unserer eigenen diting-Rendering-Engine – reine CPU, kein Chromium – in PNG. Vision-Input für AgentenCloudflare-Auto-Wait: erkennt „Just a moment...“-Herausforderungsseiten und wartet
cf_clearanceabTLS-Fingerabdruck-Spoofing: Der Stealth-Modus gibt sich als Chrome145/Firefox133/Safari/Edge aus, pro Anfrage umschaltbar
MCP-Server: Der
--mcp-Modus stellt 14 Tools bereit (fetch/eval/click/search/download + 9 Sitzungs-Tools) – Claude Code / Claude Desktop / Cursor rufen sie direkt aufFirecrawl-kompatibel:
/v1/scrape-Endpunkt – bestehende Firecrawl-Clients migrieren, indem sie die Basis-URL ändernDNS-Rebinding-Schutz: eingebauter SSRF-Schutz + IP-Validierung nach der Auflösung
Wozu es dient
Keine Demos – echte Aufgaben, die Agent-Browser heute erledigen:
Sich durch Administrationskonsolen kämpfen – AWS / App Store Connect / Google Play, dutzende Menüebenen pro Aufgabe. Lass den Agenten klicken; er meldet sich nur, wenn Autorisierung nötig ist.
Stapelaktionen hinter der Anmeldung – Warenkörbe füllen, den Bestellverlauf durchforsten, Seiten prüfen, die nur im angemeldeten Zustand rendern. Cookies injizieren, arbeiten, zur Wiederverwendung exporieren.
Anti-Bot-Mauern überwinden – Cloudflare-Schutz, Turnstile-Herausforderungen, TLS-Fingerabdruck-Prüfungen. Der Stealth-Modus bricht durch, statt bei 403 umzukehren.
Das chinesische Internet – Baidu / Sogou / WeChat-Metasuche über 5 Engines, korrektes Rendering chinesischer Seiten. Nicht nur auf das englische Web beschränkt.
Ad-hoc-Skripting – Der Agent liest die Seite, schreibt JS, führt es aus: hervorgehobene Vergleichstabellen, neu umgebrochene Inhalte, Produktfilter auf versteckten Parametern. GreaseMonkey auf Steroiden.
Multimodales Sehen – Screenshots als visueller Input für Schauen-und-Beurteilen-Abläufe: Sitzplätze auswählen, Layouts erkennen, Rendering verifizieren.
Schnellstart
Probiere zuerst die gehostete Instanz aus: https://browser.aginx.net/
Vollinstallation mit einem Befehl (SKILL.md-Triggeroberfläche + MCP-Tools + Verifizierung):
# Download -> inspect the contents -> run only after review (never blind-run network scripts)
curl -fsSL https://raw.githubusercontent.com/yinnho/aginxbrowser/main/skill.sh -o skill.sh
less skill.sh
bash skill.shNur MCP registrieren:
claude mcp add aginxbrowser --transport http https://browser.aginx.net/mcpInstalliere die Skill-Triggeroberfläche über skills.sh:
npx skills add yinnho/aginxbrowserSelf-Hosting:
# Prebuilt binary (one-line installer: platform detect + sha256 + self-check)
curl -fsSL https://raw.githubusercontent.com/yinnho/aginxbrowser/main/install.sh -o install.sh
less install.sh && bash install.sh
aginxbrowser doctor # features + fonts + egress self-check
# Or build from source (--features stealth,screenshot or you lose both)
cargo build --release --features stealth,screenshot
# Start the service
./target/release/aginxbrowser
# → Listening on 0.0.0.0:8089
# Verify
curl http://127.0.0.1:8089/health
# → {"status":"ok","engine":"diting"}
# Fetch a page
curl -sS -X POST http://127.0.0.1:8089/fetch \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
# Search
curl -sS -X POST http://127.0.0.1:8089/search \
-H "Content-Type: application/json" \
-d '{"q":"macbook price","max_results":5}'
# Create an interactive session
curl -sS -X POST http://127.0.0.1:8089/session/create \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
# → {"session_id":"s_1","url":"https://example.com/"}
# MCP mode (for AI agents)
./target/release/aginxbrowser --mcpProjektstruktur
aginxbrowser/
├── Cargo.toml
├── build.rs # V8 snapshot generation
├── js/
│ └── bootstrap.js # V8 bootstrap script
├── README.md
├── docs/
│ └── API.md # Full API reference (HTTP + MCP)
└── src/
├── main.rs # HTTP service entry & routing
├── server.rs # Business layer (fetch/click/eval/search)
├── session.rs # Interactive browser sessions
├── captcha.rs # CAPTCHA detection & auto-solve
├── render.rs # Tiered rendering (HTTP direct → diting browser engine)
├── mcp.rs # MCP server (14 tools)
├── firecrawl_compat.rs # Firecrawl-compatible /v1/scrape endpoint
├── browser.rs # Top-level API: Browser, BrowserBuilder
├── page.rs # Top-level API: Page, Element
├── config.rs # BrowserConfig
├── cookie.rs # CookieStore
├── error.rs # Error types
├── search/ # Native search engines
│ ├── mod.rs # SearchEngine trait, Registry, merge/dedupe, progressive backoff
│ ├── baidu.rs # Baidu (JSON API, wreq stealth)
│ ├── bing.rs # Bing (HTML parsing, plain reqwest)
│ ├── sogou.rs # Sogou web (HTML parsing, plain reqwest)
│ ├── sogou_wechat.rs # Sogou WeChat (HTML parsing + /link resolution)
│ ├── google.rs # Google (HTML parsing, wreq stealth + proxy)
│ ├── stackexchange.rs # Stack Overflow (SE API v2.3, code category)
│ ├── github_repos.rs # GitHub repos (api.github.com, code category)
│ ├── arxiv.rs # arXiv (Atom API, academic category)
│ ├── bing_news.rs # Bing News RSS (news category; proxy-first)
│ ├── huggingface.rs # HF Hub models/datasets/spaces (ai category)
│ ├── npm.rs # npm packages (npms.io API, packages category)
│ ├── pypi.rs # PyPI name resolution (JSON API, packages)
│ └── meilisearch.rs # Private-index adapter (env-configured)
│
├── diting_dom/ # HTML parsing, DOM tree, CSS selectors
├── diting_net/ # HTTP client, cookies, encoding, proxies
├── diting_js/ # V8 runtime, JS ops, module loading
└── diting_browser/ # Page navigation, lifecycle, browser contextBuild
# Standard build (no stealth; TLS fingerprint features inactive)
cargo build --release
# With stealth (requires go + cmake + C++ toolchain; enables TLS fingerprint spoofing)
cargo build --release --features stealth
# With screenshot rendering (enables /screenshot; adds the rendering stack, +30-40MB)
cargo build --release --features screenshot
# Full featured (recommended for production)
cargo build --release --features stealth,screenshotAnforderungen: Rust 1.78+; die V8-Statikbibliothek wird beim ersten Build automatisch heruntergeladen. Die Stealth-Funktion benötigt zusätzlich go, cmake und einen C++-Compiler. Die Screenshot-Funktion wird mit einem gebündelten CJK-Schrift-Subset (GB2312 + gängige Symbole) ausgeliefert – für korrektes chinesisches Rendering sind keine Systemschriften erforderlich.
Laufzeit-Umgebungsvariablen
Variable | Standard | Beschreibung |
|
| Lauschadresse |
| aktiviert |
|
| Linux Chrome145 | Gefälschter User-Agent |
|
| Accept-Language-Header |
| keiner | Optionaler Fallback-Proxy. Engines, deren Quellen blockiert sind (Google, Bing News, Hugging Face), verbinden sich zuerst direkt und fallen nur dann auf diesen Proxy zurück, wenn der direkte Versuch fehlschlägt — Bereitstellungen in Übersee benötigen überhaupt keinen Proxy; pro Anfrage leitet |
|
|
|
| keiner | 2captcha-API-Schlüssel; aktiviert die automatische CAPTCHA-Lösung |
|
| CAPTCHA-Lösungsanbieter |
| keine | Meilisearch-Basis-URL; setzen, um die Private-Index-Engine zu aktivieren |
| keiner | Meilisearch-Index-UID, die abgefragt werden soll |
| keiner | Optionaler Bearer-Schlüssel für die Meilisearch-Instanz |
API-Dokumentation
Vollständige API-Referenz → docs/API.md
Hinweise zum Sicherheitsaudit → docs/skills-sh-audit.md — warum skills.sh "Critical Risk" anzeigt und welchem echten Produktfeature jede Warnung entspricht
Umfasst:
Alle HTTP-Endpunkte (
/fetch,/click,/eval,/search,/v1/scrape, 8 Session-Endpunkte)Alle 14 MCP-Server-Tools und ihre Parameter
Client-Konfiguration für Claude Code / Claude Desktop / Cursor
Umgebungsvariablen, Fehlercodes, Scraping-Beispiele pro Website
Anbindung an andere Systeme
AginxBrowser ist reine Andock-Infrastruktur — wie ein echter Browser läuft er als unabhängiger Dienst, den jedes System aufrufen kann, ohne Host-Code einzubetten oder die Host-Konfiguration zu verschmutzen. Stellen Sie eine Instanz pro Maschine bereit (unter systemd), und jede Anwendung, die "Rendern + Scrapen" benötigt, nutzt sie mit.
Integration: Die Umgebungsvariable AGINXBROWSER_URL=http://127.0.0.1:8089 wird gelesen. Nicht gesetzt → Verhalten unverändert; gesetzt → Websites mit Risikokontrolle werden automatisch über AginxBrowser zum Rendern geleitet und fallen bei Fehlern sauber zurück.
Bekannte Einschränkungen
Screenshots sind Opt-in:
/screenshoterfordertcargo build --release --features screenshot(fügt den Rendering-Stack hinzu, +30-40MB). Die Standard-Render-Engine ist diting (unser eigener CSS+Layout+Paint-Stack); übergeben Sieengine: "blitz", um wieder in die Blitz-Referenz-Pipeline zu wechseln. Komplexes Website-CSS wird bei beiden nur näherungsweise wiedergegeben (nicht pixelgenau wie Chromium)Elementkoordinaten werden unterstützt (Blockebene):
/screenshotmitselectorgibt die Seitenkoordinaten des Elements zurück (selector_rects, CSS-px);selectorallein beschneidet direkt auf dieses Element. Reine Inline-Elemente (<a>text</a>) haben keine eigene Box — wählen Sie einen Block-VorfahrenJS-Interaktion funktioniert weitgehend; Seiten mit starkem Fingerprinting können weiterhin fehlschlagen: React/Vue-Event-Delegation funktioniert normal (URL-reflektierende Attribute wie
src/hrefwerden zu absoluten URLs aufgelöst, sodass Next.js/webpack hydratisieren und Klicks Handler auslösen). Auth-Seiten mit starkem Fingerprinting (WorkOS/Cloudflare), dienavigator.plugins, WebGL-Canvas usw. abfragen, können weiterhin Probleme bereiten, bis die Stealth-Fingerprint-Abdeckung abgeschlossen istProxy-Unterstützung: HTTP/HTTPS/SOCKS5 über
AGINXBROWSER_PROXYWebsites mit starker Risikokontrolle: Baidu Wenku wird nicht unterstützt; Zhihu-Artikel benötigen ein gültiges
__zse_ck
Lizenz
Konsistent mit dem OpenCarrier-Hauptprojekt. Apache-2.0.
Available Tools
29 toolscacheAInspect
Query the LOCAL CACHE of every page this server has fetched and every search it has run. Check here BEFORE re-fetching or re-searching — a hit is instant and free while a fresh fetch costs 5-60s. Use query for full-text search (works for Chinese substrings and English words), get to pull a page's full cached content, stats for counts, clear to delete rows.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | With clear: delete everything cached for this caller | |
| get | No | Return the FULL cached content of this exact URL instead of listing hits | |
| url | No | Only rows whose URL contains this substring | |
| kind | No | Which rows to search: "auto" (default, pages + searches), "pages", or "searches" | |
| clear | No | Delete matching rows instead of returning them (requires url, since_hours, or all) | |
| limit | No | Maximum rows returned (default: 10, max 100) | |
| query | No | Full-text search over cached page contents, titles, URLs and past search queries. Omit to list the latest rows. | |
| stats | No | Return row counts and database size instead of rows | |
| since_hours | No | Only rows stored within the last N hours |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false, so the description carries the burden of disclosing mutating behavior; it does by saying 'clear to delete rows.' It also adds useful context about locality, latency, and full-text search behavior (Chinese substrings and English words), though it does not detail destructive edge cases or return behavior in depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tightly written sentences with no filler. It front-loads the core resource and action, then delivers performance guidance and mode routing in a logical progression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, zero-required tool with no output schema, the description supplies the essential decision-making context: what data is cached, when to prefer it, and how to invoke each major mode. The remaining parameters (url, since_hours, limit, kind) are fully described in the schema, so nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics by mapping query/get/stats/clear to their intended uses and by noting a capability constraint ('works for Chinese substrings and English words'). This goes beyond what the parameter descriptions already state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Query the LOCAL CACHE of every page this server has fetched and every search it has run.' It clearly defines the tool's scope and differentiates it from re-fetching or re-searching, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Check here BEFORE re-fetching or re-searching' and quantifies the trade-off ('a hit is instant and free while a fresh fetch costs 5-60s'). This gives an agent a concrete rule for when to use the cache instead of the sibling fetch/search tools, and it also routes to the correct subcommand (query/get/stats/clear).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickAInspect
Click an element on a one-off page: loads url in a fresh browser context (stateless — no cookies unless passed, no shared state with other calls), waits wait_secs after load before clicking, then fires a DOM click on the first CSS-selector match. The click may trigger navigation (link, form submit) — the response url and text_after are read after that navigation lands. Returns clicked:false when the selector matches nothing. For multi-step interaction on a shared page use session_click instead.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to load | |
| selector | Yes | CSS selector of element to click | |
| wait_secs | No | Seconds to wait for the page to settle after load, before clicking |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effects: creates a fresh stateless context, may trigger navigation, and returns clicked:false when no match. Since annotations provide no safety hints, the description carries the transparency burden and meets it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is dense but well-organized with dashes, covering all key aspects in two sentences. Slightly verbose but not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essential context: stateless behavior, navigation possibility, failure case, and the alternative tool. No output schema exists, but the description mentions the failure return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all three parameters. The description adds the 'first CSS-selector match' behavior and relates wait_secs to the load-and-click sequence, going slightly beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it clicks an element on a one-off page, specifying the fresh context, wait, and selector matching. Distinguishes from session_click by contrasting one-off vs shared page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides an alternative tool (session_click) for multi-step shared-page interactions, and describes when navigation may occur, giving concrete usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
downloadAInspect
Download a file over HTTP(S) with streaming to disk (no memory buffering), SHA-256 integrity hash, and optional resume of interrupted transfers. Filename resolution: explicit param → Content-Disposition → URL tail. Use for binaries, archives, datasets, documents - anything where the agent wants the FILE saved, not its text content read.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the file to download (http/https) | |
| resume | No | Resume an interrupted download when a local partial file exists | |
| cookies | No | Cookies to send with the request: `"name=value"` strings or CDP-style objects `{"name","value","domain",...}` for gated downloads | |
| filename | No | Explicit output filename. When omitted: Content-Disposition → URL tail → "download" | |
| use_proxy | No | Route through proxy (default: false; auto-enabled for known blocked domains) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only a title, so the description carries the full burden. It discloses streaming (no memory buffering), integrity hash, resume capability, and filename resolution order. It does not mention auth needs, error handling, or overwrite behavior, but the key behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero fluff. The first sentence front-loads the core function and key features; the second provides usage guidance and filename resolution. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 params and no output schema, the description is nearly complete. It explains streaming, integrity, resume, filename rules, and intended use cases. It omits what the agent receives back (e.g., file path or status) and does not mention network failure handling, but these are minor given the richness already present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 value by explaining filename resolution precedence (explicit → Content-Disposition → URL tail), which clarifies the 'filename' parameter beyond the schema. Other params like 'resume' and 'use_proxy' are adequately described in the schema and need no extra explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('download'), a clear resource (file over HTTP(S)), and distinct behaviors (streaming to disk, SHA-256 hash, resume). It differentiates itself from siblings by explicitly contrasting with reading text content, making it unambiguous which tool to choose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('Use for binaries, archives, datasets, documents') and implicitly when not ('not its text content read'). It provides a clear use-case boundary but does not name a specific alternative tool like 'fetch', so it stops short of full explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evalAInspect
Execute JavaScript on a one-off page: loads url in a fresh browser context, optionally waits wait_secs for the page to settle, evaluates script (async/Promise supported) and returns {url, result}. Script-driven navigation (location.href, form submit) is drained and reflected in the returned url. Stateless — no cookies or page state shared with other calls; when the script needs prior page state or a login, use session_eval.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to load | |
| script | Yes | JavaScript code to execute (supports async/Promise) | |
| wait_secs | No | Seconds to wait before executing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide only a title, so the description carries the full burden. It discloses all key behaviors: fresh browser context, optional wait, async/Promise support, the exact return shape {url, result}, and the fact that navigation is drained and reflected. It also states statelessness explicitly. There is no contradiction with the title annotation, and the description goes far beyond what annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly structured paragraph that leads with the core action and then covers the key details in logical order: context, wait, script, return, and navigation behavior. Every sentence adds essential information with no redundancy. It is front-loaded with the purpose and differentiator, making it easy for an agent to scan quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description must explain the return value, which it does ({url, result}). It covers all parameters, side effects (navigation), statelessness, and the alternative when state is needed. For a tool of this complexity, nothing essential is missing; an agent has everything needed to call it correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already describes each parameter (100% coverage), the description adds meaningful semantic value: it clarifies how wait_secs is used (optional, time to settle), that script supports async/Promise, and the return format. It also explains the interaction between script and the returned url (navigation). This goes beyond mere schema definitions, though not to the extent of a 5, since the schema already covers the basics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's core action: 'Execute JavaScript on a one-off page', followed by a precise breakdown of the flow (loads url, waits optionally, evaluates script, returns {url, result}). It also explicitly differentiates from the sibling tool session_eval by highlighting the stateless vs stateful distinction. This leaves no ambiguity about what the tool does or how it differs from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (for one-off, stateless evaluations) and when not to use it, directly naming the alternative: 'when the script needs prior page state or a login, use session_eval.' It also explains the behavior around script-driven navigation, giving clear context for invocation. This is exemplary guidance for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchARead-onlyInspect
Fetch a webpage and return clean markdown/html/text. Use whenever the agent needs to READ any web page - blogs, docs, articles, JS-rendered SPAs, Cloudflare-protected sites. Static pages are served over plain HTTP (~100ms tier:"http"); pages that need JS get the full browser (tier:"browser"). render_tier selects auto (default) / http (pure HTTP, refuses the upgrade) / obscura (always browser).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to fetch | |
| format | No | Output format: "markdown", "html", or "text" (default: markdown) | markdown |
| sanitize | No | Strip prompt-injection payloads from the text output (default true): zero-width/steganographic characters, instruction-shaped lines ("ignore previous instructions", chat markup tokens, CJK variants), and text hidden via opacity:0 / tiny fonts. A `sanitize_report` field counts what was removed — stripping is observable, never silent. Set false for raw output. | |
| selector | No | CSS selector to extract specific content | |
| max_chars | No | Maximum characters to return (default: 50000) | |
| use_proxy | No | Route through proxy (for blocked foreign sites) | |
| wait_secs | No | Seconds to wait for JS rendering | |
| js_extract | No | JS expression to extract from the page after rendering | |
| capture_xhr | No | Capture script-initiated API responses: a list of URL substrings (e.g. ["/api/"]) whose matching fetch/XHR bodies come back in an `xhr` array; an empty list captures every XHR/Fetch. Forces browser rendering (script-initiated requests only exist after JS runs). | |
| render_tier | No | Rendering strategy: "auto" (default), "http", or "obscura" | auto |
| tls_fingerprint | No | TLS fingerprint override (stealth mode only): "chrome145", "firefox133", etc. | |
| auto_bypass_challenge | No | Auto-detect and bypass Cloudflare Turnstile challenges (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=true; the description adds meaningful behavior: static pages are served over plain HTTP (~100ms), JS pages get a full browser, and render_tier controls auto/http/obscura behavior. There is no contradiction with the read-only hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action and output format, followed by usage scope and the key rendering decision. Every sentence earns its place; the render_tier sentence adds the 'refuses the upgrade' nuance rather than repeating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no output schema, the description provides selection context, output format, and the tiering model, while the input schema carries the remaining parameter detail. It does not summarize advanced features like sanitize, xhr capture, or tls_fingerprint, but the schema coverage compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description primarily supplements render_tier with contextual performance notes and the 'refuses the upgrade' behavior; the other parameters are already fully documented in the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch a webpage and return clean markdown/html/text.' It also scopes the tool to READ-only web content retrieval, which separates it from sibling interaction tools like click, session_navigate, or download.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Use whenever the agent needs to READ any web page', and lists concrete cases (blogs, docs, SPAs, Cloudflare-protected sites). It also advises on rendering mode (http for static, browser for JS), but does not explicitly name alternatives or when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_curlAInspect
Import login state from a real browser in one paste. The human logs into a site in their own Chrome (solving the CAPTCHA/SMS once), opens DevTools → Network, right-clicks any authenticated request → "Copy as cURL", and passes the command here. Returns a live session_id already carrying that site's cookies and sitting on the copied request's URL — the agent continues from where the human left off, no password or second login needed. Works with bash, PowerShell and cmd copy flavors.
| Name | Required | Description | Default |
|---|---|---|---|
| curl | Yes | A "Copy as cURL" command pasted from Chrome DevTools (Network panel → right-click any authenticated request). bash, PowerShell and cmd flavors all parse; the cookie set is injected and the session navigates to the copied request's URL. | |
| use_proxy | No | Route the session's traffic through the engine proxy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full responsibility. It discloses that the tool produces a live session_id, that it uses the cookies from the pasted request, and that it 'sits' on the copied request's URL. It also reveals supported copy flavors and the absence of a password requirement. It does not mention side effects such as overwriting an existing session or any network implications, but the core behavior is thoroughly explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each adding distinct information: the interactive workflow, the output, and supported formats. It is front-loaded with the core purpose. There is no wasted wording, though the sequence of steps (DevTools → Network → right-click → Copy as cURL) could be condensed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description provides enough operational context: where the input comes from, what the output is, and that the session inherits the URL. It lacks error scenarios or explicit limitations, but given the tool's simplicity, the description is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds workflow context for the `curl` parameter (how the human obtains it and that it parses in three formats), which slightly enhances the schema. It offers no additional meaning for `use_proxy`, which the schema already describes clearly. Overall, the description adds some value but does not go far beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Import login state from a real browser in one paste.' It explains the output (a live session_id with cookies, on the copied URL). This distinguishes it from sibling tools like session_create, session_cookies, or session_import by referencing the cURL paste workflow and 'no password or second login needed'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear usage context is provided: the human authenticates in their own Chrome first and then pastes a cURL command, avoiding re-login or CAPTCHA. The description explains exactly which precondition is required (single authentication) and that it works with bash, PowerShell, and cmd copy flavors. It does not explicitly name sibling alternatives to choose from, but the workflow guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_markdownAInspect
Render a markdown document into a deterministic, self-contained HTML artifact - the document layer, so the agent never writes HTML by hand. Prose rides a plain offline shell (no fonts, no scripts); archify fenced code blocks carry typed zero-coordinate diagram JSON (sequence, workflow, architecture, dataflow, lifecycle families) and render to inline SVG via the layout engine. Same input, same bytes: the receipt carries the sha256 so determinism is verifiable. theme picks light (default) or dark; preset picks the palette family — classic (default), signal-flow, blueprint, editorial — orthogonal to theme; colors bake at generation time (presentation attributes, not CSS variables), and the receipt records both preset and theme. quality picks the composition audit profile — standard (default) or showcase, the delivery gate: the receipt's diagrams[].composition grades route crossings, ambiguous corridors, label clearance (2px standard / 4px showcase), route rhythm, and node text projected to the 930px reader width; the audit never changes the artifact bytes. Mermaid sources are the agent's job to translate, not the engine's: flowchart/graph → workflow (lanes + columns), sequenceDiagram → sequence, stateDiagram-v2 → lifecycle (bands), erDiagram/class → architecture (grid + boundaries) — read the topology and emit the matching zero-coordinate archify JSON; the engine accepts only archify JSON. A broken diagram degrades to a visible code block and lands in receipt.diagnostics; an authored route preset that cannot be honored is self-repaired to a verified semantic substitute and disclosed in receipt diagrams[].repairs - the document still renders. A fence may also carry views: [{id,label,nodes,note?}] (node ids of the active family), emitted as guided-view tabs above the diagram plus an inlined viewer script - clicking a tab lights the member nodes and the routes between them (subgraph), clicking a node lights it with its direct neighbors (ego graph), everything else dims; a view's optional note shows as a caption while it is active (the story layer). window.agxViewer in a session drives and reads the same state programmatically: {focus,view,state} as before, plus route(i,from,to) which returns and lights the shortest authored directed path between two nodes (null when unreachable, state untouched), and reach(i,id,down|up) which returns and lights the authored downstream/upstream closure ({nodes,links}); both dim the rest of the diagram. diagrams[].views in the receipt lists the tabs. With session_id the artifact is also loaded into that session (local, free) and the reply carries viewport acceptance: scroll extents measured in the live session and graded fits/tall/wide/oversized, telling the agent how to read the page back. Diagram vocabulary adapted from archify (MIT).
| Name | Required | Description | Default |
|---|---|---|---|
| theme | No | Color theme: "light" (default) or "dark" — the shell background/ foreground and every SVG palette slot swap together; the receipt records which theme produced the bytes | |
| preset | No | Visual preset: "classic" (default), "signal-flow", "blueprint", or "editorial" — a palette family orthogonal to theme (each preset exists in both light and dark). The receipt records preset and theme separately | |
| quality | No | Quality profile for the composition audit: "standard" (default) or "showcase" — the delivery gate. The audit grades route crossings, corridors, label clearance, rhythm, and projected text size in the receipt (diagrams[].composition); it never changes the artifact bytes, only how findings are severity-rated | |
| markdown | Yes | Full markdown document. Prose rides a plain offline shell; archify fenced code blocks carry typed zero-coordinate diagram JSON and render to inline SVG. | |
| session_id | No | Optional session ID: also load the rendered HTML into that live session (local and free) so session_screenshot / session_state can verify the artifact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (only a title), so the description carries the full burden. It extensively discloses behavior: determinism (same input, same bytes, sha256 in receipt), offline shell with no fonts/scripts, degradation of broken diagrams to visible code blocks, self-repair of unhonored routes with disclosure, view tabs with interactive behavior, a programmatic API (window.agxViewer), and session integration with viewport acceptance. It also clarifies that the audit never changes artifact bytes. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph covering many features (diagrams, views, API, session, audit). It is front-loaded with the core purpose, but the sheer length and lack of structural breaks make it harder to scan. Every sentence carries information, but the density reduces conciseness; a more structured layout would improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple feature families: diagram rendering, views, API, session, quality audit) and no output schema, the description thoroughly explains what the receipt contains (sha256, composition grades, diagnostics, repairs, views) and how the artifact behaves (degradation, repair, viewport acceptance). An agent can correctly invoke the tool and interpret results without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions, so the baseline is 3. The description adds meaningful context beyond the schema: it explains that theme and preset are orthogonal, that colors bake at generation time, that quality affects severity ratings only, and that session_id enables viewport verification. This extra semantics justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement: 'Render a markdown document into a deterministic, self-contained HTML artifact - the document layer, so the agent never writes HTML by hand.' This names the verb (render), resource (markdown document), and output (HTML artifact), and distinguishes the tool from manual HTML authoring. It is unique among siblings, none of which perform rendering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly sets usage context: use this to produce HTML from markdown instead of writing HTML manually, and use session_id to load into a live session for verification. It also gives clear input guidelines (Mermaid must be translated to archify JSON; only archify JSON is accepted). However, it does not explicitly name alternative tools or exclusions, so it falls short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-onlyInspect
Search the web across Baidu/Bing/Sogou/WeChat/Google (aggregated + deduped) and optionally fetch the top results' full content. Use when the agent needs to FIND information online - replaces a search API. Supports image search returning direct image URLs. Optional engines: ["baidu"]-style filter by engine name (invalid names error with the valid list; /doctor lists them with live health). Optional time_range day/week/month/year for news freshness (engines without dated results ignore it). Response carries engine_errors explaining any engine that contributed nothing (CAPTCHA suspension, transient failure).
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query | |
| engines | No | Restrict to these engine names (e.g. ["baidu"], ["sogou_wechat"]). Empty = all engines serving `categories`. Invalid names return an error listing the valid ones. | |
| fetch_top | No | Fetch content for top N results | |
| categories | No | Search categories (default: general) | general |
| time_range | No | Freshness window: "day" | "week" | "month" | "year". Honored by engines with dated results (e.g. bing_news filters by pubDate); others ignore it. | |
| max_results | No | Maximum number of results (default: 10) | |
| max_chars_per | No | Max characters per result content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, the description discloses important runtime traits: results are aggregated and deduped, fetch_top retrieves full content, engines filter by name with an error on invalid names, time_range is only honored by dated-result engines, and engine_errors reports per-engine failures like CAPTCHA suspension. This is material behavior an agent must know and it goes well beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph of about 130 words. It front-loads the primary purpose and usage in the first two sentences, then covers notable behaviors. Every sentence adds information, but the engine-filter phrasing is slightly awkward and could be clearer as a list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, and no other structured behavioral annotations, the description gives enough to invoke and interpret results reasonably: it names the engines, mentions engine_errors, tells the agent about time_range and image search. It does not mention result schema shapes or what happens when fetch_top requests fail, but these are minor for a well-known search operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine semantics on top of the schema: engines as an array filter with error behavior and /doctor listing, time_range semantics about ignoring vs. honoring based on engine support, and the purpose of fetch_top. This raises it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a concrete resource (the web via Baidu/Bing/Sogou/WeChat/Google), and the distinguishing behavior (aggregation, deduping, optional content fetch, image search). It clearly differentiates from the sibling browser-session and URL-level tools (fetch, download, etc.) so an agent can select it for discovery rather than retrieval of a known URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the agent needs to FIND information online - replaces a search API' is an explicit trigger instruction. It gives good context but does not list what it is not for (e.g., fetching a specific known URL, which would fall to fetch), so it misses a full when-not/alternative comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_clickAInspect
Click an interactive element by its index (from session_state output) inside a live browser session: scrolls it into view and fires a DOM click on the session's current page. A submit click may navigate the session — the returned url/text_after reflect the page after the action, and session state (cookies, localStorage, globals) persists for follow-up calls. Indexes come from the most recent session_state; re-list after navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Element index (from /state output) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no readOnly/destructive annotations, the description carries the full burden and does so thoroughly. It discloses that the click may navigate the session, that the returned url/text_after reflect the post-action page, and that session state (cookies, localStorage, globals) persists. This goes well beyond a simple 'clicks an element' and prepares the agent for 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. The first sentence establishes the core action and mechanism, the second covers navigation side effects and state persistence, and the final sentence warns about stale indexes. Every sentence earns its place with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fairly simple two-parameter tool with no output schema, the description covers all necessary aspects: what it clicks, how it does it, side effects on navigation and state, and how to obtain valid indexes. It even hints at the output fields (url/text_after), satisfying the gap left by the missing output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already described in the schema with 100% coverage, so the baseline is 3. The description adds meaningful context for `index` by explicitly tying it to the most recent session_state output and warning that indexes become stale after navigation, which is valuable operational guidance not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific action – clicking an interactive element by index within a live browser session – and distinguishes it from coordinate-based alternatives like session_click_xy. It also specifies that it scrolls the element into view and fires a DOM click, making the tool's function unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage after calling session_state, since indexes come from that output, and warns to re-list after navigation. It also notes this applies to a live session. However, it does not explicitly name an alternative tool (e.g., session_click_xy for coordinates) or state when not to use it, so guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_click_xyAInspect
Click at viewport coordinates (CSS pixels) via real mouse events — pointerdown/mousedown, pointerup/mouseup, then click on whatever element is hit there. For canvas/map surfaces with no DOM element to index. click_count 2 adds dblclick.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Viewport X coordinate in CSS pixels | |
| y | Yes | Viewport Y coordinate in CSS pixels | |
| button | No | Mouse button: "left" (default), "right", "middle" | |
| session_id | Yes | Session ID | |
| click_count | No | Click count: 1 single (default), 2 adds dblclick, 3+ sets detail |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations do not include readOnly or destructive hints, so the description carries the burden. It mentions 'real mouse events' but does not explicitly warn about potential side effects like navigation or state changes. The action is inherently interactive but not fully disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct, consisting of two sentences that cover the action, method, use case, and click_count behavior. Every sentence adds value without redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With all parameters documented in the schema and no output schema, the description provides sufficient context: what the tool does, when to use it, and how click_count behaves. There is no missing critical information for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all 5 parameters with descriptions (x, y, button, session_id, click_count), which is 100% coverage. The description adds no extra parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action (click at viewport coordinates), the method (real mouse events), and the specific use case (canvas/map surfaces without a DOM element). It is distinct from sibling tools like session_click, which likely target elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool: 'For canvas/map surfaces with no DOM element to index.' This provides clear guidance on when it is appropriate versus other click tools, and also explains the click_count behavior for double-clicks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_cloneAInspect
Derive a new browser session from a live one, carrying the full login state: cookies, localStorage/sessionStorage, viewport pin, dialog policy, proxy and keepalive flags. The source session stays untouched. Use to snapshot a logged-in state before risky actions, or to run the same login in parallel tabs. Returns {session_id (new), cloned_from, url, viewport}.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID to derive from (stays alive and untouched) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include a title, so the description carries the full burden. It discloses that the source session stays untouched (non-destructive) and that the new session carries the full login state. This is adequate for a clone operation, though it does not mention any potential side effects such as resource usage or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states purpose and contents, the second adds the key safety note, and the third provides usage and return format. Purpose is front-loaded, and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 no annotations, the description covers purpose, behavior, usage scenarios, and return format. An agent has everything needed to decide when and how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, with a clear description ('Session ID to derive from (stays alive and untouched)'). The tool description reiterates that the source is untouched but adds no new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb 'derive' and resource 'browser session', enumerates what is carried (cookies, localStorage/sessionStorage, viewport, etc.), and explicitly notes the source is untouched. This clearly distinguishes it from sibling tools like session_cookies or session_storage, which handle individual aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases: 'snapshot a logged-in state before risky actions' or 'run the same login in parallel tabs.' While it does not name alternatives or provide explicit when-not guidance, the context makes it obvious that this tool is for whole-session cloning, whereas siblings are for parts. Strong guidance overall.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_closeAInspect
Close a browser session and free its resources. For a persistent session this also drops the on-disk login snapshot - idle expiry keeps it, an explicit close does not.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations providing safety hints, the description carries the burden and discloses the key side effect (dropping the on-disk login snapshot for persistent sessions) and contrasts it with idle expiry. This is valuable transparency beyond the bare action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core action is front-loaded, and the second sentence adds a critical nuance without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple close operation with one parameter and no output schema, the description covers the action, the resource effect, and a key caveat. It does not mention error handling or return values, but these are not essential for a close tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter session_id is fully described in the schema ('Session ID'), so the description adds no extra meaning. Schema coverage is 100%, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific action (close) on a specific resource (browser session), and the note about persistent sessions distinguishes it from sibling tools like session_create or session_list. The verb and resource are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (close when done with a session) but does not explicitly contrast with alternatives or give when-not conditions. The snapshot detail is more behavioral than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_consoleARead-onlyInspect
Read the session's recent page console output (log/info/warn/error) as {url, total, matched, messages:[{ts_ms, level, text, url}]}, newest last. Ring buffer of 500 entries; captures output from page scripts, clicks, evals and navigation alike. Optional filters: level (exact, e.g. "error"), since_ts (epoch ms), url_contains (page URL substring), limit (most recent N matches). The fastest way to see WHY a page misbehaves: click the button, call this, read the error.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Only entries at this level: "log" | "info" | "warn" | "error" | |
| limit | No | Keep only the most recent N matching entries | |
| since_ts | No | Only entries logged at or after this Unix epoch millisecond timestamp | |
| session_id | Yes | Session ID | |
| url_contains | No | Only entries whose page URL contains this substring |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the ring buffer size (500 entries), sources captured (scripts, clicks, evals, navigation), ordering (newest last), and filter behavior. This is comprehensive and adds significant value over the annotation alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact—three sentences pack the core action, output format, buffer limits, sources, filters, and a practical usage tip. Every sentence earns its place, with the main purpose front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the full return shape. It also covers buffer limits, capture sources, ordering, and all filter parameters. There is no missing information an agent would need to call this tool correctly, making it contextually complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 context by clarifying filter semantics (e.g., 'level (exact)' and 'limit (most recent N matches)') and shows how the output structure includes 'matched' count, which helps the agent use the parameters effectively beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('session's recent page console output'), and details the exact return structure. It clearly differentiates from sibling tools like session_state or session_network by focusing on console messages, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear use case ('The fastest way to see WHY a page misbehaves') and explains the capture scope, but it does not explicitly contrast with alternatives or state when not to use it. The guidance is helpful but lacks explicit exclusions or sibling comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_cookiesARead-onlyInspect
Export the session's current cookies as ["name=value", ...] for the page's URL. Use to persist a logged-in session and replay it later via session_create with cookies. Round-trips with session_create's cookies field.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the return format, that cookies are scoped to the page's URL, and that the output round-trips with session_create's cookies field. This gives an agent practical behavioral expectations for a read-only export operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the first states purpose and output format, the second gives the concrete use case, and the third reinforces the round-trip contract. Every sentence earns its place, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool, the description is complete: it explains what is exported, the format, the URL scoping, and how to replay the cookies later. The lack of an output schema is mitigated because the return shape is explicitly described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents session_id with 'Session ID', so the schema carries the parameter-semantics burden. The description does not add detail about how session_id affects the cookie export, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Export'), a precise resource ('the session's current cookies'), and the exact output shape ('["name=value", ...]') for the page's URL. This clearly distinguishes it from broader siblings like session_export or session_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Use to persist a logged-in session and replay it later via session_create with cookies.' It points to the relevant sibling session_create, though it does not explicitly mention when not to use it or contrast it with session_export.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_createAInspect
Create a persistent interactive browser session for multi-step interaction - clicking, typing, scrolling, reading state across page transitions. Use when the agent must INTERACT with a page (login flows, forms, pagination, click-through) rather than read it once. Returns session_id; persists 8 min idle. With persistent:true the login state survives idle eviction and server restarts - the same session_id revives logged-in.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Initial URL to navigate to (optional) | |
| width | No | Initial viewport width in CSS pixels. Pinned for the session's life (survives navigation) so element rects and media queries anchor to the same layout across every page of the visit. | |
| height | No | Initial viewport height in CSS pixels. | |
| mobile | No | Mobile device emulation (coarse pointer, no hover) for the initial viewport. | |
| cookies | No | Cookies to inject before navigation: `"name=value"` strings or CDP-style objects `{"name","value","domain",...}`. Lets the session start already logged-in. Round-trips with session_cookies. | |
| storage | No | Web Storage to inject after the initial navigation lands: {"local_storage": {"k":"v"}, "session_storage": {"k":"v"}}. For login states that live in localStorage rather than the cookie jar. Round-trips with session_storage. | |
| ttl_secs | No | Idle time-to-live in seconds before the session is evicted (default: 480, clamped 60..3600). Raise it for long workflows. | |
| keepalive | No | Exempt the session from the idle reaper: it lives until session_close or server exit, so a workflow interrupted by long non-browser steps keeps its login state. | |
| use_proxy | No | Route through proxy (default: false) | |
| persistent | No | Persist the login state (cookies + localStorage/sessionStorage + viewport + dialog policy) to the server's local store after every action. If the session idles out — or the whole server restarts — the next call with the same session_id revives it logged-in (storageState-style recovery, no re-login). Explicit session_close drops the snapshot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no readOnly/destructive annotations, the description carries the burden of transparency. It explains the session lifecycle (idle eviction, keepalive, persistent revival) and the storage-side effects (snapshot of cookies and web storage). It doesn't explicitly warn that the session is a server resource needing cleanup, but the session_close sibling and the described lifetime make this reasonably clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but focused, with a clear main purpose sentence followed by a usage condition and parameter summaries. Minor redundancy between keepalive and persistent is acceptable given the complexity. No filler or irrelevant content is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, the description covers the operational context thoroughly: when to use it, how login state is handled, lifetime controls, persistence semantics, and recovery behavior. It even notes the return value (session_id) and round-trip relationships with sibling session_cookies/session_storage tools, making the tool's role in the broader set clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 10 parameters have detailed schema descriptions that explain not only what each parameter does but why it matters (e.g., width pinned for consistent layout, persistent for storageState-style recovery). The tool description adds further context on login-state injection and round-trip storage, exceeding the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a persistent interactive browser session for multi-step interaction, and explicitly contrasts it with read-once operations. It names concrete use cases (login flows, forms, pagination, click-through) and the resource produced (session_id), making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance to use when the agent must interact with a page rather than read it once, which distinguishes it from read-only tools. It doesn't name specific alternatives like fetch or search, but the contrast is clear enough and the parameter explanations cover when to adjust TTL, keepalive, and persistence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_dialogAInspect
Inspect or flip the session's dialog policy for window.alert/confirm/prompt. Dialogs never block the page: each is auto-answered (default dismiss) and logged into session_console at level "dialog". action "list" reports {policy, prompt_text, dialogs}; "accept" makes subsequent confirm() true and prompt() return prompt_text (or the call's default argument); "dismiss" restores the default.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | "list" reports the policy and dialog history; "accept"/"dismiss" set the answer applied to subsequent window.confirm/prompt calls (alert is always logged, never blocking). | |
| session_id | Yes | Session ID | |
| prompt_text | No | With action "accept": text window.prompt returns once accepted (omitted keeps the current text). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behavioral traits: dialogs never block the page, each is auto-answered by default and logged into session_console at level 'dialog'. It explains the effects of accept (confirm() returns true, prompt() returns prompt_text) and dismiss (restores default), including the note that alert is always logged and never blocking. Since annotations provide no behavioral hints, the description carries the full burden and handles it well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet comprehensive, front-loading the purpose in the first sentence and then efficiently explaining the non-blocking behavior and action effects in the following sentences. Each sentence earns its place without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, no output schema), the description covers the main actions, their effects, the non-blocking nature, and logging behavior. It even describes the return structure for 'list' despite the lack of an output schema. While it doesn't mention error conditions or persistence across sessions, these are minor for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful value beyond the schema: it specifies the output structure for 'list' ({policy, prompt_text, dialogs}) and clarifies that prompt_text falls back to the call's default argument when omitted, which the schema only implies. This extra semantic detail improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('inspect or flip') with a clear resource ('session's dialog policy') for window.alert/confirm/prompt. It distinguishes itself from sibling session_* tools by focusing on dialog policy control, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly conveys when to use the tool: whenever you need to inspect or change how dialogs are auto-answered. It does not explicitly name alternatives, but given the tool's unique scope, no exclusions are necessary. The action semantics (list/accept/dismiss) guide the agent on correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_dragAInspect
Drag the mouse from one viewport position to another: press at from, steps interpolated mousemove events (delay_ms apart), release at to. Moves AMarker-style drag targets and canvas selections that only track while the pointer travels.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Where to release it | |
| from | Yes | Where to press the mouse button down | |
| steps | No | Interpolated mousemove events between from and to (default 10) | |
| delay_ms | No | Delay between moves in ms (default 30) — gives mousemove-driven widgets time to react per step | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide a title, so the description carries the full behavioral burden. It discloses the sequence of events (press, interpolated moves, release), the timing parameters, and the specific widgets it affects. It does not mention whether it blocks or returns after sending events, but for a drag operation this is a reasonable level of disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that front-loads the main action and then explains the mechanism. Every clause adds value; there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description covers the behavior, timing, and target types adequately. It does not explain return values (likely none) or session prerequisites, but these are implicitly covered by the schema and the tool's nature. It is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters are already documented in the input schema with descriptions. The tool description essentially restates the flow (press at from, steps interpolated, release at to) but adds no new semantic meaning beyond the schema. The baseline of 3 applies since the schema handles the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (drag the mouse) with the resource (viewport positions) and details the mechanism (press, interpolated moves, release). It also distinguishes the tool by noting it moves AMarker-style drag targets and canvas selections, separating it from generic click tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for dragging operations that require mouse movement tracking, but it does not explicitly mention when to avoid it or name alternatives. It gives clear context about the type of targets it works on, which helps an agent decide, though not explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_evalAInspect
Execute arbitrary JavaScript in a live browser session and return the result. Runs in the session's current page, so DOM mutations, globals and storage persist across calls — unlike the stateless eval tool, which loads its own throwaway page each call. Script-driven navigation moves the session's URL. JS exceptions are reported with name, line/column and stack.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | JavaScript code to execute | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no behavioral hints, so the description carries the full burden. It discloses persistence, navigation side effects, and exception reporting. Does not explicitly warn about destructive potential, but execution context is clearly described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero redundancy. Front-loads the main purpose, then adds behavioral caveats and exception handling. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a powerful arbitrary-execution tool with no output schema and minimal annotations, the description covers persistence, navigation, and error reporting. It lacks mention of return value format or potential async behavior, but these are minor for the intended use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 context about how the 'script' parameter behaves (runs in current page, persists) beyond the bare schema description, though it does not detail return value or formatting specifics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it executes JavaScript in a live session and returns the result, with a specific verb and resource. Explicitly contrasts with the sibling 'eval' tool, making differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly names the alternative stateless eval tool and explains the key difference: persistence vs. throwaway page. This gives agents a clear decision rule for when to use session_eval over eval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_exportARead-onlyInspect
Export a browser session's recorded action log. Format "bash" (default) returns a runnable curl script that replays every recorded action (navigate/click/input/scroll/eval) against a fresh session on this server — hand it to a shell or cron, zero model tokens. Format "jsonl" returns the raw action log, one JSON object per line.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: "bash" (default) renders a runnable curl script that replays every recorded action against a fresh session; "jsonl" returns the raw action log, one JSON object per line | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as readOnlyHint=true, and the description aligns with that by describing an export operation. It adds valuable behavioral detail beyond the schema: the bash output replays actions against a fresh session, is meant to be handed to a shell or cron, and consumes zero model tokens. No side effects or destructive actions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two carefully structured sentences: the first states the core function, the second explains both format options and their use cases. Every clause earns its place, and the most important decision (which format) is presented immediately after the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter export tool with read-only annotations and no output schema, this description is complete. It covers both possible formats, their outputs, and a concrete use case. An agent knows exactly what to expect from the tool and can invoke it correctly with just session_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a little extra context (e.g., 'navigate/click/input/scroll/eval' and 'zero model tokens'), but the core parameter meanings are already fully documented in the schema. The added value does not push it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'Export a browser session's recorded action log.' It then differentiates the two output formats (bash replay script vs. jsonl raw log), which clearly separates it from sibling session tools like session_list or session_state. Purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: format 'bash' is explicitly tied to creating a runnable curl script for shell/cron with zero model tokens, and format 'jsonl' is tied to getting the raw per-line log. It doesn't explicitly name sibling alternatives or exclusions, but the use cases are concrete and imply when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_inputAInspect
Type text into an input/textarea element by its index (from session_state output).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type into the input field | |
| index | Yes | Element index (from /state output) | |
| events | No | Event fidelity: "full" types one character at a time with a keydown/keypress/input/keyup cycle per character, for pages whose listeners key on keyboard events (e.g. keypress-Enter login forms). Default fires a single input+change pair after the value is set. | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose side effects (e.g., triggering events, focus changes, return values, or potential errors). The 'events' parameter hints at behavior, but the description itself leaves the actual outcome unspecified. Since no annotations provide safety hints, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-formed sentence that leads with the action and specifies the target and source of the index. No extraneous detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the description covers the essential context: what it does, how to identify the element, and a prerequisite (session_state). The lack of behavioral details slightly detracts, but for a basic interaction tool the provided context is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters have clear, functional descriptions. The 'events' parameter is particularly well explained with both 'full' and default behaviors. The 'index' parameter correctly references '/state output' for provenance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Type text into an input/textarea element') and specifies the targeting mechanism ('by its index'), which is distinct from sibling tools like session_click or session_drag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from session_state output' explicitly tells the user where to obtain the index, implying a prerequisite step. It does not explicitly contrast with alternatives, but the purpose is sufficiently scoped for a focused tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_listARead-onlyInspect
List live browser sessions with idle age and the time left before auto-eviction. Use to discover a session to reuse instead of creating a new one; sessions expire after 8 min idle.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds meaningful context about live sessions, idle age, auto-eviction, and the 8-minute idle limit, which helps the agent understand the lifecycle without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two purposeful sentences. The first states the core function and output fields, and the second gives usage guidance and expiration policy. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema, the description is complete. It tells the agent what the tool returns (idle age, eviction time), when to use it, and a key behavioral constraint (8-minute idle expiry). Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete at 100% coverage. Baseline for 0 params is 4; the description adds no parameter details because none are needed, and that is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('live browser sessions') and clearly states what information is returned ('idle age and the time left before auto-eviction'). It distinguishes itself from session_create by framing the tool as a discovery mechanism for reuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'discover a session to reuse instead of creating a new one'. It also provides a critical operational condition ('sessions expire after 8 min idle'), giving the agent a clear decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_networkARead-onlyInspect
Read the session's network request log. filter="media" extracts playback/stream URLs (m3u8/HLS, mp4, dash, flv...) actually requested by the page's player at runtime - the reliable way to get a real video link, since links embedded in page HTML are often decoys. Media elements and player iframes the engine never fetches (video/audio/source/iframe src) are merged in as candidates: via="network" entries are confirmed requests, via="dom" entries are candidates carrying their tag (iframes = kind "iframe", navigate into them to sniff). Default returns every request as compact rows (method/url/status/type/size). Navigate to the video page first, let it load, then call this.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | "media" extracts playback/stream links (m3u8/HLS, mp4, dash, ...) from the requests the page actually issued - the reliable way to get a real video link, since URLs embedded in page HTML are often decoys. Media elements and player iframes the engine never fetches (video/audio/source src, iframe src) are merged in as candidates: entries carry via="network" (confirmed requests) or via="dom" (candidates, with their tag; iframes surface as kind "iframe" - player pages to navigate or sniff inside, not playable URLs). Omit to list every request as compact rows. | |
| session_id | Yes | Session ID | |
| url_contains | No | Narrow the `xhr` array to URLs containing this substring. | |
| body_max_chars | No | Per-body character cap for the `xhr` array (default 4000). | |
| include_bodies | No | Add an `xhr` array of background API responses (the page's own fetch/XHR traffic with retained bodies) alongside the request rows — the page's API face is often the cleanest structured read of its data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description adds substantial behavioral detail: how media elements not fetched are merged as candidates, the via='network' vs 'dom' distinction, iframe handling, and default compact rows. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: purpose, filter semantics, candidate behavior, default output, and a practical tip. It is front-loaded with the core action and scopes quickly, though slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description covers usage, filter behavior, return format, and edge cases (decoys, iframes). An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions, so baseline is 3. The description adds extra meaning, especially for 'filter' (explaining decoys and candidate merging) and 'include_bodies' (the page's API face). This elevates it beyond schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('session's network request log'), with clear scope. Distinguishes from siblings by its focus on network traffic, which is unique among the session_* tools, and explains the 'filter' option for media extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use guidance: navigate first, let it load, then call, and explains the media filter for getting real video links. Does not explicitly name alternatives or exclusions, but the context makes appropriate usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_screenshotAInspect
Screenshot the session's CURRENT DOM state (mutations from clicks/evals included) as a base64 PNG via the built-in renderer. Width/height default to the session's viewport, so session_viewport + session_screenshot shows the responsive layout. Returns {url, width, height, image_base64, format}.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Render width in CSS pixels; defaults to the session's current viewport | |
| height | No | Render height in CSS pixels; defaults to the session's current viewport | |
| selector | No | CSS selector: capture only that element's box | |
| full_page | No | Capture the full scrollable page instead of the viewport (default: false) | |
| session_id | Yes | Session ID | |
| selector_all | No | With selector, capture every match (default: first match only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide a title, so the description carries the behavioral burden. It adds valuable detail: the screenshot reflects the current DOM including mutations, is rendered by the built-in renderer, and returns a structured base64 payload. It does not explicitly state non-mutating behavior, but the action itself makes that clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the core action and DOM context, the second clarifies default sizing and pairing, and the third gives the return shape. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters and no output schema, the description appropriately covers the non-obvious behavior (mutations included, built-in renderer, default sizing) and supplies the return object shape. Remaining parameter details are already in the schema; error conditions and format caveats are not addressed, but are not critical for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter already has a clear description, including width/height defaults and selector behavior. The description reinforces the viewport default and adds the session_viewport pairing, but adds little semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation: capture the session's current DOM state as a base64 PNG via the built-in renderer, explicitly including mutations from clicks/evals. This clearly differentiates it from siblings like session_viewport (viewport metadata) and session_state (state inspection).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use it to capture the live, mutated DOM, and pair it with session_viewport to evaluate responsive layout. It does not enumerate exclusions or alternative screenshot tools, but no sibling directly competes, so 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.
session_scrollAInspect
Scroll the page up or down by a number of viewport-heights.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Scroll amount in viewport-heights (default: 3) | |
| direction | No | Scroll direction: "up" or "down" (default: down) | down |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide a title, so the description carries the behavioral disclosure burden. It discloses direction and magnitude but does not mention side effects, whether it affects the current session page, or whether it preserves navigation history. Adequate for a benign viewport action, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no wasted words, front-loaded with the action and key unit of measurement. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple action with full parameter schema coverage and no output schema, the definition provides enough information for selection and invocation. It could explicitly state that scrolling applies to the current page of the given session, but the session_id parameter and sibling context make that inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with descriptions and defaults, so schema coverage is 100%. The description repeats 'up/down' and 'viewport-heights' but adds no new semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact operation (scroll), the resource (the page), and the unit of measurement (viewport-heights), making it clear what the tool does. It is also clearly distinct from sibling tools like session_navigate and session_click.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or alternatives are named, but the action is self-descriptive and no sibling tool provides scrolling. The usage context is implied rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_stateARead-onlyInspect
Get the current page state as an indexed list of interactive elements. Returns compact text with [N] indexes for use with click/input tools.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, and the description adds useful behavioral detail: it returns compact text with [N] indexes rather than a full page snapshot. This clarifies what the agent can expect from the response and how it should be used.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The first identifies the resource, the second describes the return format and purpose. Every word contributes to an agent's ability to use the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and no output schema, the description covers the essential behavior and return format. It is complete enough for correct invocation, though it could optionally mention what happens when the page is not loaded or has no interactive elements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the only parameter, session_id, with a 'Session ID' description. The tool description does not add extra meaning about the parameter, but since schema coverage is 100%, no additional compensation is needed. This is the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('current page state as an indexed list of interactive elements'), and explicitly says the output is for use with click/input tools. This clearly differentiates it from sibling tools like session_navigate or session_scroll.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: it returns indexed elements that are consumed by click/input tools, implying this should be called before interaction. It does not explicitly name alternatives or exclusions, but the purpose is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_storageARead-onlyInspect
Snapshot the session's localStorage/sessionStorage for the current origin: {url, local_storage, session_storage}. Feed it back via session_create's storage field to restore a logged-in state in a new session — the half of login state that cookies can't carry (many sites keep the session token in localStorage). Call before the session idles out.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this with 'Snapshot' while adding useful behavioral context: the output structure, the current-origin scope, and the timing warning about session idle timeout. It doesn't discuss failure modes or size limits, but the read-only annotation lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states what the tool snapshots and returns, the second explains the restoration workflow, and the third gives the timing constraint. The purpose is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description explicitly provides the return shape as {url, local_storage, session_storage}. It also explains how the output is consumed by session_create, what origin it applies to, and when to call it, making the description complete for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the only parameter, session_id, at 100% coverage. The description adds no additional meaning about session_id semantics or valid values, so it stays at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Snapshot') and a precise resource ('the session's localStorage/sessionStorage for the current origin'), and it even names the exact return shape. It also separates this tool's role from cookie handling by explaining it captures the half of login state that cookies can't carry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: call it before the session idles out, and feed the result into session_create's 'storage' field to restore logged-in state. It implies a complementary relationship with cookies but never explicitly names session_cookies as the cookie-handling alternative, so it stops short of an explicit when-to-use vs when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_viewportAInspect
Set the session's viewport (device emulation): scripts see innerWidth/innerHeight move, media queries like (max-width: 600px) re-evaluate, element rects re-anchor, and mobile=true flips pointer/hover matchMedia answers to coarse/none. Omitted width/height keeps the current value.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Viewport width in CSS pixels; omit to keep the current width | |
| height | No | Viewport height in CSS pixels; omit to keep the current height | |
| mobile | No | Mobile emulation: matchMedia answers pointer:coarse / hover:none and navigator.maxTouchPoints reports 5 (default: false) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no readOnlyHint or destructiveHint annotations, the description carries the burden, and it does well by disclosing side effects beyond a simple 'set': scripts observe innerWidth/innerHeight movement, media queries re-evaluate, element rects re-anchor, and mobile=true flips matchMedia pointer/hover answers. It also explains the retain-current-value behavior for omitted dimensions. It doesn't discuss auth or rate limits, but those aren't critical for a viewport setter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two sentences with a front-loaded purpose, followed by a concise list of behavioral effects and a closing usage note. Every phrase adds value, and there is no filler or repetition beyond what the schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a viewport mutation tool with no output schema, the description fully explains what happens when invoked, including the mobile flag's effect and the default for omitted width/height. Combined with the detailed schema, an agent has everything needed to decide whether and how to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% parameter descriptions, including 'omit to keep the current width/height' and mobile matchMedia behavior. The description largely restates these details ('Omitted width/height keeps the current value', 'mobile=true flips pointer/hover matchMedia answers to coarse/none'), adding little beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set the session's viewport (device emulation).' It goes beyond a vague label by enumerating concrete consequences (innerWidth/innerHeight change, media queries re-evaluate, element rects re-anchor), which clearly distinguishes it from sibling tools like session_navigate or session_scroll.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: call this to emulate a device viewport for the session. It also gives a practical usage note ('Omitted width/height keeps the current value'). It doesn't explicitly state when not to use it or mention alternatives, but no sibling tool offers viewport control, so the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_waitARead-onlyInspect
Wait until a CSS selector matches or a JS predicate turns truthy, with a timeout. The page's event loop keeps running while waiting (fetches, timers, promise chains progress), so this replaces blind sleeps for async content: navigate, session_wait for '.price-card', then click/read. Returns {matched, elapsed_ms, detail:{tag,text} or the predicate value}; errors with timeout ... naming the selector/predicate on expiry. Exactly one of selector/predicate.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | No | CSS selector to wait for (e.g. ".price-card") | |
| predicate | No | JS expression polled until truthy (e.g. "document.querySelectorAll('.card').length >= 3") | |
| session_id | Yes | Session ID | |
| timeout_ms | No | Give up after this many milliseconds (default: 10000, max: 120000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=true, so the description carries the behavioral disclosure burden. It adds substantial value: the page event loop keeps running, the tool returns {matched, elapsed_ms, detail}, errors name the selector/predicate on timeout, and exactly one of selector/predicate must be provided. This goes well beyond what the annotation or schema exposes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the core behavior, then adds a brief usage example, return shape, and error behavior. Every sentence contributes distinct information needed to call the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly explains the return value and error format. It also covers the key behavioral nuance (event loop keeps running), the mutual exclusion requirement, and timeout behavior. Combined with the fully described parameters, an agent has everything needed to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters with 100% coverage, so the baseline is 3. The description adds the important mutual-exclusion constraint 'Exactly one of selector/predicate,' which is not encoded in the schema, plus contextual behavior about error messages. This is meaningful added semantic value beyond the parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Wait until a CSS selector matches or a JS predicate turns truthy, with a timeout.' It clearly distinguishes the tool from navigation, scrolling, and other session tools by focusing exclusively on waiting, and it even provides a concrete usage example. This makes the tool's purpose unmistakable even without examining the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly positions the tool as a replacement for blind sleeps for async content and gives a workflow: 'navigate, session_wait for ".price-card", then click/read.' It does not name sibling alternatives or state when not to use it, but the context is clear enough for a capable agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.3.3-rc1- Changed
fetch3 fields changed- changed
Input schema / $defs / RenderTier / oneOfPrevious value: -[ - { - "const": "auto", - "description": "HTTP-direct first, fall back to diting browser. (default)", - "type": "string" - }, - { - "const": "http", - "description": "Pure HTTP, no V8/JS. Fastest; misses JS-rendered content.", - "type": "string" - }, - { - "const": "obscura", - "description": "Always use the diting browser (current behaviour pre-tiering).", - "type": "string" - } -]New value: +[ + { + "const": "auto", + "description": "HTTP-direct first, fall back to diting browser. (default)", + "type": "string" + }, + { + "const": "http", + "description": "Pure HTTP, no V8/JS. Fastest; misses JS-rendered content.", + "type": "string" + }, + { + "const": "obscura", + "description": "Always use the diting browser (current behaviour pre-tiering).\n\"browser\" is accepted as an alias — agents guess it before \"obscura\".", + "type": "string" + } +] - added
Input schema / properties / capture_xhrAdded value: +{ + "default": null, + "description": "Capture script-initiated API responses: a list of URL substrings\n(e.g. [\"/api/\"]) whose matching fetch/XHR bodies come back in an\n`xhr` array; an empty list captures every XHR/Fetch. Forces browser\nrendering (script-initiated requests only exist after JS runs).", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] +} - added
Input schema / properties / sanitizeAdded value: +{ + "default": true, + "description": "Strip prompt-injection payloads from the text output (default true):\nzero-width/steganographic characters, instruction-shaped lines\n(\"ignore previous instructions\", chat markup tokens, CJK variants),\nand text hidden via opacity:0 / tiny fonts. A `sanitize_report`\nfield counts what was removed — stripping is observable, never\nsilent. Set false for raw output.", + "type": "boolean" +}
- Changed
search2 fields changed- added
Input schema / properties / enginesAdded value: +{ + "default": [], + "description": "Restrict to these engine names (e.g. [\"baidu\"], [\"sogou_wechat\"]).\nEmpty = all engines serving `categories`. Invalid names return an\nerror listing the valid ones.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / time_rangeAdded value: +{ + "default": null, + "description": "Freshness window: \"day\" | \"week\" | \"month\" | \"year\". Honored by\nengines with dated results (e.g. bing_news filters by pubDate);\nothers ignore it.", + "type": [ + "string", + "null" + ] +}
- Changed
session_network3 fields changed- added
Input schema / properties / body_max_charsAdded value: +{ + "default": null, + "description": "Per-body character cap for the `xhr` array (default 4000).", + "format": "uint", + "minimum": 0, + "type": [ + "integer", + "null" + ] +} - added
Input schema / properties / include_bodiesAdded value: +{ + "default": null, + "description": "Add an `xhr` array of background API responses (the page's own fetch/XHR\ntraffic with retained bodies) alongside the request rows — the page's\nAPI face is often the cleanest structured read of its data.", + "type": [ + "boolean", + "null" + ] +} - added
Input schema / properties / url_containsAdded value: +{ + "default": null, + "description": "Narrow the `xhr` array to URLs containing this substring.", + "type": [ + "string", + "null" + ] +}
11 tool updates
v0.3.0- Changed
click1 field changed- changed
Input schema / properties / wait_secs / descriptionPrevious value: -"Seconds to wait after click"New value: +"Seconds to wait for the page to settle after load, before clicking"
- Changed
download1 field changed- changed
Input schema / properties / cookies / descriptionPrevious value: -"Cookies to send with the request ([\"name=value\", ...]) for gated downloads"New value: +"Cookies to send with the request: `\"name=value\"` strings or\nCDP-style objects `{\"name\",\"value\",\"domain\",...}` for gated downloads"
- Added
import_curl - Added
render_markdown - Added
session_click_xy - Added
session_clone - Changed
session_console5 fields changed- added
Input schema / properties / levelAdded value: +{ + "default": null, + "description": "Only entries at this level: \"log\" | \"info\" | \"warn\" | \"error\"", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / limitAdded value: +{ + "default": null, + "description": "Keep only the most recent N matching entries", + "format": "uint", + "minimum": 0, + "type": [ + "integer", + "null" + ] +} - added
Input schema / properties / since_tsAdded value: +{ + "default": null, + "description": "Only entries logged at or after this Unix epoch millisecond timestamp", + "format": "uint64", + "minimum": 0, + "type": [ + "integer", + "null" + ] +} - added
Input schema / properties / url_containsAdded value: +{ + "default": null, + "description": "Only entries whose page URL contains this substring", + "type": [ + "string", + "null" + ] +} - changed
Input schema / titlePrevious value: -"SessionCookiesParams"New value: +"SessionConsoleParams"
- Changed
session_create6 fields changed- changed
Input schema / properties / cookies / descriptionPrevious value: -"Cookies to inject before navigation ([\"name=value\", ...]). Lets the\nsession start already logged-in. Round-trips with session_cookies."New value: +"Cookies to inject before navigation: `\"name=value\"` strings or\nCDP-style objects `{\"name\",\"value\",\"domain\",...}`. Lets the session\nstart already logged-in. Round-trips with session_cookies." - added
Input schema / properties / heightAdded value: +{ + "description": "Initial viewport height in CSS pixels.", + "format": "uint32", + "minimum": 0, + "type": [ + "integer", + "null" + ] +} - added
Input schema / properties / keepaliveAdded value: +{ + "default": false, + "description": "Exempt the session from the idle reaper: it lives until\nsession_close or server exit, so a workflow interrupted by long\nnon-browser steps keeps its login state.", + "type": "boolean" +} - added
Input schema / properties / mobileAdded value: +{ + "default": false, + "description": "Mobile device emulation (coarse pointer, no hover) for the initial\nviewport.", + "type": "boolean" +} - added
Input schema / properties / persistentAdded value: +{ + "default": false, + "description": "Persist the login state (cookies + localStorage/sessionStorage +\nviewport + dialog policy) to the server's local store after every\naction. If the session idles out — or the whole server restarts —\nthe next call with the same session_id revives it logged-in\n(storageState-style recovery, no re-login). Explicit session_close\ndrops the snapshot.", + "type": "boolean" +} - added
Input schema / properties / widthAdded value: +{ + "description": "Initial viewport width in CSS pixels. Pinned for the session's life\n(survives navigation) so element rects and media queries anchor to\nthe same layout across every page of the visit.", + "format": "uint32", + "minimum": 0, + "type": [ + "integer", + "null" + ] +}
- Added
session_dialog - Added
session_drag - Changed
session_input1 field changed- added
Input schema / properties / eventsAdded value: +{ + "default": null, + "description": "Event fidelity: \"full\" types one character at a time with a\nkeydown/keypress/input/keyup cycle per character, for pages whose\nlisteners key on keyboard events (e.g. keypress-Enter login forms).\nDefault fires a single input+change pair after the value is set.", + "type": [ + "string", + "null" + ] +}
23 tool updates
- First observed
cache - First observed
click - First observed
download - First observed
eval - First observed
fetch - First observed
search - First observed
session_click - First observed
session_close - First observed
session_console - First observed
session_cookies - First observed
session_create - First observed
session_eval - First observed
session_export - First observed
session_input - First observed
session_list - First observed
session_navigate - First observed
session_network - First observed
session_screenshot - First observed
session_scroll - First observed
session_state - First observed
session_storage - First observed
session_viewport - First observed
session_wait
TDQS
Scored across 29 tools
Most tools are clearly separated by session vs stateless and by action (click, input, navigate, scroll, wait). The main ambiguity is between eval/session_eval and click/session_click, but the descriptions explicitly contrast them, so an agent can disambiguate.
The session_* prefix is used consistently for persistent-session tools, and stateless tools use bare verbs (fetch, search, click, eval). Minor inconsistency: session_click_xy and session_click are both click tools but one is coordinate-based; also import_curl and render_markdown don't follow the verb pattern, but overall the convention is clear.
29 tools is on the heavy side, but the server covers a broad domain: web fetching, searching, stateless interaction, persistent sessions, session introspection, and document rendering. Each tool has a distinct role; the count is justified though slightly high.
The session lifecycle is fully covered: create, list, clone, close, navigate, state, click, input, scroll, wait, screenshot, console, cookies, storage, dialog, drag, export. Stateless fetching/searching/downloading is covered, and the cache layer fills the gap for repeated access. No obvious dead ends.
Maintenance
Related MCP Connectors
Headless browser primitives for AI agents when sites need real JS rendering.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceA Playwright-based MCP server that exposes a live browser as a traceable, inspectable, debuggable and controllable execution environment for AI agents.3,71357-
- AlicenseAqualityAmaintenanceA high-performance browser automation MCP server that provides AI agents with a fast, persistent Chromium instance via Playwright. It features reference-based element interaction, snapshot diffing, and manual handoff capabilities to handle complex tasks like CAPTCHAs.611832MIT
- AlicenseAqualityDmaintenanceMulti-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.37205MIT
- FlicenseBqualityBmaintenanceA minimalist browser control engine that allows LLM agents to visually perceive and interact with web pages through the Chrome DevTools Protocol and MCP standard.411-