periscope-mcp
Periscope MCP is a 66-tool, Playwright-powered MCP server for AI agents to test, audit, and interact with websites and web apps.
Project Management
Create, list, retrieve, and delete testing projects with configurable base URLs, crawl depth, and page limits.
Authentication
Form-based login, HTTP Basic Auth, cookie injection, programmatic login execution, interactive login for 2FA/SSO/CAPTCHA, and copying auth between projects.
Static & Automated Testing
Test a single URL with visual, accessibility, functionality, SEO, performance, and GEO checks.
Crawl entire sites (BFS, same-domain) and run full project audits with saved JSON reports.
Test responsive layouts across mobile, tablet, and desktop viewports.
Persistent Browser Sessions
Open, close, and list long-lived browser sessions; set viewport via device presets or custom dimensions.
Interactive Actions
25 action types: click, fill, type, select, navigate, hover, press key, check/uncheck, scroll, evaluate JS, drag, right-click, upload file, wait for network, and more.
Page Analysis
Form validation analysis, link checking, interaction timing, table parsing, toast capture, keyboard navigation audits, color contrast checks, and raw HTML extraction.
Debugging & Diagnostics
Console errors, network request/response logs, API response bodies, localStorage/sessionStorage read-write, cookie access, and computed CSS styles.
Advanced Testing
Mock/clear network requests, switch into iframes, emulate slow/offline network conditions, toggle dark mode, handle JS dialogs, upload files, and wait for elements to disappear.
Assertions & Smart Tools
Programmatic pass/fail assertions (text_contains, element_exists, url_contains, etc.), smart element finder by text/role/proximity, auto-fill entire forms with inferred test data, and named page-state snapshots (save, restore, diff).
Performance & Core Web Vitals
Capture FCP, LCP, CLS, TBT, INP, and resource metrics; export INP time series with percentile stats; run full Google Lighthouse audits.
Accessibility & SEO/GEO Audits
Alt text, ARIA, heading hierarchy, color contrast, keyboard nav; meta tags, Open Graph, JSON-LD, canonical URLs, robots.txt; AI-crawler access (GPTBot, ClaudeBot), llms.txt, and WebMCP compliance.
Recording
Record browser workflows as WebM video files.
Web Utilities
Search DuckDuckGo, fetch any URL as readable text or raw HTML, and retrieve a structured catalog of all 66 tools with workflow examples (
describe_tools).
Runs Google Lighthouse audits to evaluate web page performance, accessibility, and SEO, returning structured scores.
periscope-mcp
An MCP server that gives AI agents 74 Playwright tools to QA, test, and analyze web apps — static sites, SPAs, and apps behind a login — returning hard verdicts, not screenshots to squint at. Not a thin wrapper around browser APIs; the tools are shaped around how agents actually work:
Hard results, not screenshot-squinting —
assert_conditionreturnspassed: true/falsewith the actual value; checks return structured issues.One call instead of ten —
auto_fill_formdetects, infers, and fills a whole form;interact_and_testbatches 25 action types with checks;test_projectcrawls and audits an entire site.Real web-app testing — persistent authenticated sessions (form/basic/ cookie auth, plus a visible interactive login for 2FA/SSO/CAPTCHA that then runs headless), multi-step flows, network mocking, state snapshots, and real INP measured from the interactions it drives.
Honest responses — failures say what happened and what to do next (expired session vs. browser crash vs. eviction); silent no-ops like ignored drags come back flagged, not as fake success.
Debugging built in — captured API response bodies, console/network logs, network mocking, and state snapshots/diffs, no setup calls needed.
Audits agents can't get from a browser binding — accessibility, SEO, and GEO/agentic-search readiness (robots.txt AI-crawler access, llms.txt, WebMCP), plus real Lighthouse.
Playwright + headless Chrome underneath; site crawling, responsive testing, and screenshot diffing on top. Works with any MCP client — Claude Code, Codex, Cursor, Windsurf, Gemini CLI, custom agents, or anything else that speaks MCP over stdio.
Why not just playwright-mcp?
playwright-mcp is excellent at what it is: general browser control over MCP, with tools that mirror Playwright's own API. If the job is "browse this site, click around, extract something," use it.
Periscope exists for a different job: testing and auditing a site or web app, then reporting findings — and its tools encode the testing knowledge an agent would otherwise have to reinvent every session:
Raw browser control | Periscope | |
Verifying an outcome | Read a screenshot or DOM dump and judge |
|
Filling a form | One call per field, agent invents test data |
|
Auth | Re-login by scripting clicks each session | Projects persist form/basic/cookie auth; sessions share the logged-in context |
Site-wide audit | Loop pages manually |
|
Diagnosing a broken page | Ask for logs, replay requests | Response bodies, console, and network are captured automatically; mock APIs with |
Silent failures | Drag "succeeds," nothing moved | Flagged in the result, with the recovery path spelled out |
AI-readiness audits | — | robots.txt AI-crawler access, llms.txt, WebMCP annotations, JSON-LD, plus real Lighthouse scores |
The two aren't rivals — an agent can happily use playwright-mcp for browsing tasks and Periscope when it's wearing the QA hat. Periscope's design bets are simply about that hat: fewer, higher-level calls; structured verdicts instead of raw page state; and errors written to tell the agent what to do next.
Related MCP server: Scout
Architecture
MCP client (AI agent) --> MCP Server (stdio) --> Playwright (Headless Chrome)
| |
+-- Projects (JSON) +-- Persistent Sessions
+-- Screenshots (PNG) +-- Network Interception
+-- Reports (JSON) +-- Device Emulation
+-- Videos (WebM)How it works: your MCP client connects to this server over stdio. The server exposes 74 tools the agent can call to create projects, configure authentication, crawl websites, run static checks, and interactively test web applications using persistent browser sessions. Results (JSON + screenshots + videos) are returned to the agent for analysis.
Project Structure
periscope-mcp/
├── server.py # MCP server entry point (stdio wiring + dispatch)
├── tool_schemas.py # All 74 MCP tool definitions (schemas)
├── runtime.py # Shared singletons (project store, sessions, browser)
├── coercion.py # Argument coercion for MCP clients with stale schemas
├── handlers/ # Tool handlers, grouped by category
│ ├── registry.py # @tool(name) decorator + HANDLERS registry
│ ├── projects.py # create/list/get/delete project
│ ├── auth.py # form login, basic auth, cookies, copy_auth
│ ├── static_testing.py # test_url, crawl, test_project, reports, responsive
│ ├── session_tools.py # open/close/list sessions, viewport, history
│ ├── interactive.py # click, fill, steps, element queries, dialogs
│ ├── analysis.py # forms, links, keyboard nav, tables, toasts, contrast
│ ├── advanced.py # network mocking, storage, iframes, emulation, recording
│ ├── agent_speed.py # assertions, smart find, auto-fill, snapshots
│ ├── web.py # web_search, web_fetch
│ ├── discovery.py # describe_tools catalog
│ └── system.py # periscope_system: status, self-update, agents_md
├── tester.py # Playwright browser control + test orchestration
├── crawler.py # Page discovery (BFS crawl, same-domain only)
├── projects.py # Project CRUD + auth config storage
├── auth.py # Authentication handlers (form, basic, cookies)
├── sessions.py # SessionManager + PageSession — persistent page lifecycle
├── interactions.py # Interaction primitives (click, fill, execute_steps)
├── utils.py # Screenshot comparison (Pillow pixel diff)
├── config.py # Global settings (timeouts, paths, session limits)
├── checks/
│ ├── visual.py # Broken images, favicon, overflow, small text
│ ├── accessibility.py # Alt text, labels, headings, lang, ARIA, keyboard nav
│ ├── functionality.py # Broken links, forms, SEO, performance, link checker
│ └── geo.py # GEO/agentic search: robots.txt AI crawlers, llms.txt, WebMCP, JSON-LD
├── tests/ # Unit tests (no browser) + tests/e2e/ (real browser + fixture pages)
├── data/ # Created at runtime (gitignored — contains credentials)
├── Dockerfile
├── docker-compose.yml
└── .mcp.json.example # MCP registration template (copy to .mcp.json)Prerequisites
Python 3.11+
Playwright + Chromium browser
Installation (Local)
Quick install (Debian/Ubuntu)
One command — clone and install:
git clone https://github.com/segentic-lab/periscope-mcp.git && cd periscope-mcp && ./install.shFully unattended (no confirmation prompts):
git clone https://github.com/segentic-lab/periscope-mcp.git && cd periscope-mcp && ./install.sh -yAlready cloned? Just run ./install.sh from the repo directory.
The script installs apt prerequisites, creates the venv, installs Python
dependencies and Playwright's Chromium, runs a headless self-test, and
generates mcp-config.json with the correct absolute paths for this install
(copy or merge it into your project's .mcp.json). Useful flags:
./install.sh --system-chromium— use an existing Chromium/Chrome (setsCHROMIUM_PATH) instead of downloading Playwright's build./install.sh --skip-deps— never touch apt / use sudo./install.sh -y— non-interactive (no confirmation prompts)
On any other platform the script doesn't modify your system — it prints the
exact commands to run for your OS (./install.sh --manual macos|fedora|arch|suse|windows to pick explicitly).
Updating
./update.shPulls the latest source from GitHub (git pull --ff-only) and refreshes the
install: Python dependencies, Playwright browser (kept on system Chromium if
that's what the install uses), the registry + headless-launch self-test, and a
regenerated mcp-config.json. Works on any platform with an existing install.
Your data/ directory (projects, credentials, screenshots, reports) is never
touched.
./update.sh --force— stash local modifications to tracked files first (recover withgit stash pop)./update.sh --full— also re-check apt prerequisites on Debian/Ubuntu (uses sudo)
If you have local modifications, the script refuses and lists them instead of overwriting.
Manual install
# Clone the repo
cd periscope-mcp
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Install Chromium for Playwright
playwright install chromiumInstallation (Docker)
docker compose up -dSee Docker Deployment section below.
Connecting an MCP Client
Periscope is a standard stdio MCP server: point any MCP client at
venv/bin/python server.py and you're done. ./install.sh generates
mcp-config.json with the correct absolute paths for your machine; most
clients accept that shape directly:
{
"mcpServers": {
"periscope": {
"command": "/path/to/periscope-mcp/venv/bin/python",
"args": ["/path/to/periscope-mcp/server.py"]
}
}
}Client-specific examples:
Claude Code — copy the config into the project as
.mcp.json(cp .mcp.json.example .mcp.jsonand adjust paths), or runclaude mcp add periscope -- /path/to/venv/bin/python /path/to/server.pyCursor / Windsurf — add the block above to
~/.cursor/mcp.json/~/.codeium/windsurf/mcp_config.jsonCodex CLI — add to
~/.codex/config.toml:[mcp_servers.periscope]withcommandandargsas aboveCustom agents — any MCP SDK client can spawn the server over stdio with the same command and args
After configuring, restart your client.
Teaching your agent to use the tools
Two options, depending on your agent:
Claude Code (recommended): install the skill.
SKILL.md(repo root; also exposed atskills/periscope/in the Claude Code skill layout) is a Claude Code skill — it auto-triggers on web-testing tasks and loads a distilled operating guide (workflow decision table + the pitfalls) only when needed, costing ~0 context otherwise:ln -s "$(pwd)/skills/periscope" ~/.claude/skills/periscopeA symlink keeps it current with
./update.sh(copy the folder instead if you prefer a frozen version).Any other MCP client: paste the guide.
AGENTS.mdcontains a ready-made system-prompt block — workflows, tool-selection guidance, and known pitfalls. Paste its contents into your agent's system prompt (or custom instructions).
Either way, the agent can always fetch the current full guide from the running
server via periscope_system(action="agents_md") and the complete catalog via
describe_tools().
MCP Tools Reference (74 tools)
Project Management (4 tools)
Tool | Description | Required Params |
| Create a new testing project |
|
| List all projects | (none) |
| Get project details |
|
| Delete project + data |
|
Authentication (7 tools)
Tool | Description | Required Params |
| Configure username/password form login |
|
| Configure HTTP Basic Auth |
|
| Inject session cookies |
|
| Execute login using configured auth |
|
| Open a visible window to log in by hand (2FA/SSO/CAPTCHA), then |
|
| Capture the manual-login session; the project then runs authenticated + headless |
|
| Copy auth config + session state between projects |
|
For logins that can't be automated — 2FA/MFA, SSO/OAuth redirects, CAPTCHA, magic
links — use interactive_login (opens a real browser window; requires a display
on the server), complete the login yourself, then save_login. It captures the
authenticated session (cookies + localStorage) into the project, and every
future headless session reuses it. Re-run when the session expires (Periscope
flags that automatically — see the auth-expiry detection in test_project).
Static Testing (3 tools)
Tool | Description | Required Params |
| Test a single URL (screenshot + checks) |
|
| Discover all pages from base URL |
|
| Full audit: crawl + test all pages |
|
Results (4 tools)
Tool | Description | Required Params |
| Get screenshot file path |
|
| List saved test reports | (optional: |
| Read a report file |
|
| HTML+PDF dossier of every tool call this run — args (redacted), verdicts, timings, screenshots | (none) |
Session Management (5 tools)
Sessions keep browser pages alive across tool calls, enabling multi-step interactive workflows.
Tool | Description | Required Params |
| Open persistent browser session ( |
|
| Close session and free resources |
|
| List all active sessions | (none) |
| Switch viewport size (8 device presets or custom w/h) |
|
| Adopt a popup/new tab (OAuth, target=_blank) as a new drivable session |
|
set_viewport presets: mobile_sm (320x568), mobile (375x812), mobile_lg (428x926), tablet (768x1024), tablet_lg (1024x1366), laptop (1366x768), desktop (1920x1080), desktop_lg (2560x1440)
Interactive Actions (7 tools)
Tool | Description | Required Params |
| Click element ( |
|
| Fill form fields, optionally submit |
|
| Native |
|
| Multi-step workflow with 25 actions (see below) |
|
| List matching elements with attributes |
|
| Save / run / list / delete named step sequences (reusable workflows) | (varies by action) |
| Scroll element into viewport without clicking |
|
interact_and_test supports 25 step actions:
click, force_click, fill, force_fill, type, select, select_option, wait, wait_for, wait_for_text, screenshot, navigate, hover, press_key, check, uncheck, scroll_to, scroll_within, evaluate_js, drag, right_click, go_back, go_forward, upload_file, wait_for_network
Analysis (10 tools)
Tool | Description | Required Params |
| Analyze form validation messages | (url or session_id) |
| Pixel diff between two screenshots |
|
| Named visual-regression baselines: set once, check for a hard pass/fail |
|
| Test at mobile/tablet/desktop viewports |
|
| Comprehensive link checker (internal + external) | (url or session_id) |
| Measure click-to-result timing |
|
| Parse HTML table into structured JSON (headers → cell values) |
|
| Capture visible toast/notification messages |
|
| Real Google Lighthouse audit: 0-100 scores, Core Web Vitals, failed audits (needs Node.js) |
|
| Export real INP time series (per interaction) as JSON/CSV + percentile stats |
|
Workflow Speed (8 tools)
Tool | Description | Required Params |
| Quick screenshot of current page state |
|
| Run checks on active session (no new page) |
|
| Browser history: back, forward, or reload |
|
| Accept/dismiss JS alert/confirm/prompt (call BEFORE trigger) |
|
| Set file(s) on |
|
| Wait for specific API URL pattern to complete |
|
| Wait for element to disappear (modal close, spinner gone) |
|
| Raw outerHTML of elements, or full page HTML |
|
Advanced Testing (9 tools)
Tool | Description | Required Params |
| Mock API responses (test error/empty/loading states) |
|
| Remove network mocks (all, or by pattern) |
|
| Read localStorage or sessionStorage |
|
| Write to localStorage or sessionStorage |
|
| Switch into iframe content (returns new session) |
|
| Get actual rendered CSS values |
|
| Throttle network: |
|
| Toggle |
|
| Click a trigger and capture the downloaded file (path, sha256, text preview) |
|
Recording & Console (3 tools)
Tool | Description | Required Params |
| Record workflow as video |
|
| Tab-order and focus indicator audit | (url or session_id) |
| Get all console errors/logs (passive monitoring) |
|
AI Agent Speed Tools (10 tools)
Tool | Description | Required Params |
| Programmatic pass/fail: text_contains, element_exists, url_contains, etc. |
|
| Batch assertions — every verdict in one call, no early abort |
|
| Semantic page map: roles, names, states + ready selectors in one call |
|
| Smart finder by text, tag, role, or proximity to another element |
|
| Auto-detect fields, infer types, fill with test data. One call = many fills. |
|
| All captured network requests (URL, status, method, type) |
|
| Actual API response body text (diagnose 400/500 errors) |
|
| Named checkpoints: snapshot / restore / diff page state |
|
| Read all cookies from session |
|
| WCAG AA/AAA contrast ratio checks on text elements |
|
Web, Discovery & System (4 tools)
Tool | Description | Required Params |
| Search DuckDuckGo: titles + URLs + snippets |
|
| Fetch URL → readable Markdown (or text/html); |
|
| Structured catalog of all tools with workflows and tips | (none) |
| Install status + update check/apply + fetch current AGENTS.md | (none) |
Test Checks
Visual (checks/visual.py)
Broken images (incomplete load or 0 natural width)
Missing favicon
Horizontal overflow / layout issues
Very small text (< 12px)
Missing body background color
Images without explicit width/height dimensions
Accessibility (checks/accessibility.py)
Images missing
alttext (decorative images exempt:alt="",role="presentation"/"none",aria-hidden)Links and buttons without accessible names (checks text,
aria-label, resolvablearia-labelledby,title,img[alt], svg<title>;aria-hiddenelements exempt)Form inputs without associated labels (
label[for], wrapping label,aria-label/aria-labelledby,title)Heading hierarchy (missing H1, multiple H1, skipped levels)
Missing
langattribute on<html>Duplicate
idvalues (breaklabel[for]and aria references)ARIA validity: unknown
rolevalues,aria-labelledby/describedby/controls/owns/activedescendantreferences to non-existent idsMissing skip navigation link (scans the first 5 links)
Elements with
tabindex > 0Keyboard navigation audit (tab order, visible focus indicators, element-identity cycle detection) — via
test_keyboard_navigationtool
Functionality (checks/functionality.py)
Broken internal links (HTTP HEAD check, up to 20 links in
check_functionality)Comprehensive link checker with external link support (up to 100 links) — via
check_linkstoolForms without action or submit button
Orphan buttons outside forms
External links missing
target="_blank"Required form field count
Autocomplete disabled inputs
SEO (checks/functionality.py -> check_seo)
Page title: missing, too long (> 60 chars), or very short (< 15 chars)
Meta description: missing, too long (> 160 chars), or very short (< 50 chars)
Missing viewport meta tag
Missing canonical URL
H1 heading: missing or more than one
Open Graph: missing entirely, incomplete core tags (
og:title/description/image/url), non-absoluteog:image, missingtwitter:cardJSON-LD structured data: missing or unparseable blocks
noindexvia robots meta orX-Robots-Tagresponse headerrobots.txt blocking search engine crawlers (Googlebot, Bingbot, DuckDuckBot, ...) — error if all are blocked
Site-wide (via
test_project): duplicate titles / meta descriptions across pages, reported undersite_issues
GEO / Agentic Search (checks/geo.py -> check_geo)
Generative Engine Optimization — is the site readable and usable by AI crawlers, answer engines, and in-browser agents:
robots.txt blocking AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, and 11 more)
llms.txtpresence and format compliance (Markdown with at least one H1)WebMCP integration: declarative
<form toolname>annotations present and complete (tooldescription), form coverage ratio, and — when the browser exposesdocument.modelContext— registered tool enumeration with schema/name/description validationJSON-LD structured data presence (what answer engines cite from)
robots.txt and llms.txt are fetched once per origin and cached for the server's lifetime.
Performance (checks/functionality.py -> get_performance_metrics)
DOM content loaded time (ms)
Full page load time (ms)
First paint / first contentful paint (ms)
Core Web Vitals (lab values via buffered PerformanceObserver): Largest Contentful Paint (ms), Cumulative Layout Shift, Total Blocking Time approximation from long tasks (+ long-task count)
Interaction to Next Paint (INP) —
interaction_to_next_paint_ms: the real INP, measured from Event Timing entries for the interactions Periscope drives (null until you've interacted). This is a genuine field-style measurement, not the TBT lab proxy — Lighthouse can't produce INP in lab mode at all.Resource count
Total transfer size (bytes / KB)
For scored, Lighthouse-official metrics use the run_lighthouse tool — it runs the real Lighthouse CLI (requires Node.js) and returns 0-100 category scores, official Core Web Vitals, and failed audits, saving the full JSON report to data/reports/.
INP time series (get_interaction_log)
Because Periscope drives real interactions, it can log each one's INP over an
extended interactive test. get_interaction_log(session_id, format="json"|"csv")
writes a file to data/reports/ — one row per interaction (t_ms, epoch_ms,
inp_ms, type, target, url) plus percentile stats (p50/p75/p90/p98/worst)
— for graphing INP over time. clear=true resets the recording. Records are
capped per session (MAX_INTERACTION_LOG, oldest dropped).
Test Output Format
Each test_url call returns:
{
"url": "https://example.com",
"status": "success",
"status_code": 200,
"title": "Page Title",
"screenshot_path": "/path/to/screenshot.png",
"load_time_ms": 1500,
"issues": [
{
"type": "accessibility",
"severity": "error",
"message": "3 images missing alt text",
"details": ["img1.png", "img2.png", "img3.png"]
}
],
"issue_count": 5,
"issues_by_severity": {"error": 1, "warning": 2, "info": 2},
"issues_by_type": {"accessibility": 2, "seo": 2, "visual": 1},
"performance": {
"dom_content_loaded_ms": 120,
"load_complete_ms": 1500,
"first_paint_ms": 140,
"first_contentful_paint_ms": 140,
"resource_count": 25,
"total_size_bytes": 512000,
"total_size_kb": 500
},
"console_errors": []
}test_project returns an aggregated report with per-page results + summary.
Usage Examples
Basic test (no auth)
User: "Test https://example.com for issues"
The agent calls:
1. create_project(name="example", base_url="https://example.com")
2. test_project(project="example")
3. Analyzes results and reports findingsTest with login
User: "Test https://myapp.com, login is admin/password123"
The agent calls:
1. create_project(name="myapp", base_url="https://myapp.com")
2. set_form_login(project="myapp", login_url="https://myapp.com/login",
username="admin", password="password123")
3. login_project(project="myapp")
4. test_project(project="myapp")Test with Basic Auth
User: "Test https://staging.example.com, it uses basic auth admin/secret"
The agent calls:
1. create_project(name="staging", base_url="https://staging.example.com")
2. set_basic_auth(project="staging", username="admin", password="secret")
3. login_project(project="staging")
4. test_project(project="staging")Test with cookies
User: "Test myapp using this session cookie: session=abc123"
The agent calls:
1. set_cookies(project="myapp", cookies=[
{"name": "session", "value": "abc123", "domain": "myapp.com"}
])
2. test_project(project="myapp")Interactive testing (session-based)
User: "Go to myapp.com, click the login button, fill in the form, and check what happens"
The agent calls:
1. open_session(url="https://myapp.com") → session_id
2. get_page_elements(session_id=..., selector="button, a") → see clickable elements
3. click_element(session_id=..., selector="#login-btn") → screenshot after click
4. fill_form(session_id=..., fields=[
{"selector": "#email", "value": "user@test.com"},
{"selector": "#password", "value": "test123"}
], submit_selector="button[type='submit']")
5. Analyzes screenshot to see result
6. close_session(session_id=...)Scripted multi-step workflow (no session needed)
User: "Test the checkout flow on myshop.com"
The agent calls:
1. interact_and_test(
url="https://myshop.com/products/1",
steps=[
{"action": "click", "selector": "#add-to-cart"},
{"action": "wait", "timeout": 1000},
{"action": "click", "selector": "#checkout-btn"},
{"action": "fill", "selector": "#email", "value": "test@test.com"},
{"action": "screenshot", "label": "checkout_form"},
{"action": "click", "selector": "#submit-order"}
],
run_checks=["visual", "accessibility"]
)Responsive testing
User: "Check how example.com looks on mobile, tablet, and desktop"
The agent calls:
1. test_responsive(url="https://example.com", run_checks=["visual"])
→ Returns screenshots at 375x812, 768x1024, and 1920x1080Switch viewport during a session
User: "Show me how this page looks on mobile"
The agent calls:
1. set_viewport(session_id=..., device="mobile")
→ Returns screenshot at 375x812Test error handling by mocking an API
User: "What happens when the API returns a 500 error?"
The agent calls:
1. intercept_network(session_id=..., url_pattern="/api/tasks", status=500,
body='{"error": "Internal server error"}')
2. navigate_session(session_id=..., action="reload")
3. screenshot_session(session_id=...)
→ Shows how the app handles the error stateTest dark mode
User: "Does this site support dark mode?"
The agent calls:
1. open_session(url="https://example.com") → session_id
2. test_dark_mode(session_id=..., mode="dark")
→ Screenshot shows the page with prefers-color-scheme: darkWait for dynamic content
User: "Submit this form and wait for the success message"
The agent calls:
1. fill_form(session_id=..., fields=[...], submit_selector="#submit")
2. wait_for_network(session_id=..., url_pattern="/api/submit")
3. screenshot_session(session_id=...)Test on slow network
User: "How does this page load on a slow connection?"
The agent calls:
1. emulate_network(session_id=..., preset="slow_3g")
2. navigate_session(session_id=..., action="reload")
3. screenshot_session(session_id=...)
4. emulate_network(session_id=..., preset="reset")Configuration
Edit config.py to change defaults (env-overridable settings note the variable):
Setting | Default | Description |
|
| Run Chrome in headless mode (env: |
|
| Seconds to wait after a non-headless browser opens (env: |
|
| Page load timeout (ms) |
|
| Browser viewport width |
|
| Browser viewport height |
| unset | Path to a system Chromium binary (env: |
|
| Navigation wait strategy; never-idle pages (Turnstile, websockets) auto-downgrade to |
|
| Default max pages to crawl |
|
| Default max crawl depth |
|
| Max concurrent interactive sessions (env: |
|
| Auto-expire idle sessions after N seconds (env: |
|
| Max bytes captured per response body |
|
| Max captured response bodies kept per session |
|
| Max console entries kept per session |
|
| Max network log entries kept per session |
Data Storage
All data is stored in the data/ directory:
data/projects.json- Project configs (name, URL, auth, settings). Auth credentials are stored in plaintext - do not commit this file.data/screenshots/{project}/- PNG screenshots per project. Filenames are{domain}_{path}_{hash}.pngfor static tests,interactive_{timestamp}_{label}.pngfor session screenshots.data/reports/{project}_{timestamp}.json- Full test reports with all findings.data/videos/{project}/- Recorded session videos (WebM format from Playwright).data/diffs/- Screenshot comparison diff images.
Docker Deployment
Build and run
docker compose up -dConnect an MCP client to the Docker container
Point your client's MCP config at the container instead of the venv:
{
"mcpServers": {
"periscope": {
"command": "docker",
"args": ["exec", "-i", "periscope", "python", "/app/server.py"]
}
}
}Persist data
The docker-compose.yml mounts ./data as a volume so screenshots, reports, and project configs survive container restarts.
Key Design Decisions
Per-project browser contexts - Each project gets its own Playwright BrowserContext. This keeps sessions (cookies, auth) isolated between projects.
Lazy browser init - The Playwright browser is only launched on the first tool call, not at server startup. If the browser crashes or fails to launch, it re-creates on the next call.
BFS crawling - The crawler uses breadth-first search with depth tracking. It stays on the same domain and skips non-page resources (images, PDFs, etc.).
Check modularity - Each check category is a separate module in
checks/. Add new checks by creating a function that takes a PlaywrightPageand returnslist[dict].JSON storage - Projects are stored in a single
projects.jsonfile. No database needed for the expected scale (dozens of projects, not thousands).Persistent sessions - Interactive testing uses a
SessionManagerthat keeps Playwright pages alive in a dict keyed by session ID. Sessions auto-expire after idle timeout and are capped at a configurable maximum to prevent resource leaks.Ephemeral vs session mode - Tools like
get_page_elements,interact_and_test, andcheck_linksaccept either asession_id(reuses an existing page) or aurl(creates a temporary page that's closed after use). This makes them flexible for both interactive and one-shot use.
Adding New Checks
Create a function in the appropriate
checks/*.pyfile:
async def check_something(page: Page) -> list[dict]:
# Run your check
result = await page.evaluate("() => { ... }")
issues = []
if result:
issues.append({
"type": "your_category", # visual, accessibility, seo, etc.
"severity": "error", # error, warning, info
"message": "Description",
"details": [] # optional
})
return issuesImport and call it in
tester.pyinsidetest_url().
Known Limitations
No JavaScript SPA routing support (relies on
<a href>for crawling)Default
check_functionalitylink checking limited to 20 internal links (usecheck_linkstool for up to 100 with external support)Form login detection uses CSS selectors, may need customization for non-standard forms
No parallel page testing (pages are tested sequentially)
Interactive sessions auto-expire after 300s idle (configurable via
SESSION_TIMEOUT)Max 20 concurrent sessions (configurable via
MAX_SESSIONS)The default
dragstep (Playwrightdrag_to) is silently ignored by pointer-tracking DnD libraries (@hello-pangea/dndand similar) — the step succeeds but nothing moves. Retry withmethod: "mouse"on the drag step (stepped manual drag that crosses the library's drag-start threshold), or drive the library's keyboard mode (focus the drag handle, Space to lift, arrows to move, Space to drop). Verify drags withdiff_page_stateorassert_condition.Date/time inputs are filled with React-compatible synthetic events automatically (
fill,force_fill,auto_fill_form)
Troubleshooting
Problem | Solution |
| Run |
| Browser failed to launch. Check Chromium is installed. Server will auto-retry on next call. |
Login not working | Try providing explicit CSS selectors via |
Timeout on page load | Increase |
Docker can't reach website | Ensure the container has network access. Use |
Development
pip install -r requirements-dev.txt
pytest --ignore=tests/e2e # unit tests, no browser required
pytest tests/e2e # behavioral tests: real headless Chromium against
# fixture pages in tests/e2e/fixtures/ (~30s)The e2e suite covers session lifecycle, network waits/intercepts, console
capture, dialogs, drag-and-drop (including the pointer-tracking DnD silent
no-op), the check modules against known-good/known-bad pages, Core Web Vitals,
and the agent-speed tools. CI runs both suites; e2e installs Playwright's
Chromium (python -m playwright install --with-deps chromium). Tests are
isolated from your real data/ via PERISCOPE_DATA_DIR.
Adding a new tool: define its schema in tool_schemas.py, then add a handler in the
matching handlers/<category>.py decorated with @tool("your_tool_name"). The
registry test (tests/test_registry.py) fails if schemas and handlers drift apart.
Contributors
Built by Segentic Lab — open-source tools & experiments.
Sebastijan Bandur (@segentic-lab) — author & maintainer
Claude (Anthropic) — co-contributor: developed alongside via Claude Code; every commit is co-authored, and the tool designs were battle-tested by an AI agent driving the server against real sites
An AI agent's thoughts on Periscope
Written by Claude — the agent that co-developed this server and watched a second agent dogfood it against real apps — and revised once after editorial review by a third. No human edits; an agent's honest take on an agent tool seemed like the right way to end this README.
Periscope is the kind of MCP server that changes what an agent can do. Transport adapters have their place — standardizing access to many systems behind one protocol is real value even when little logic lives in the server. But the servers that earn a permanent spot in an agent's toolbox are the ones that capture expertise the agent would otherwise have to recreate — and get subtly wrong — every single session.
You could try to teach an agent all of this in a prompt. The numbers say why that fails: Periscope is 8,349 lines of executable knowledge under a 220-line judgment layer (AGENTS.md). The INP observer with interaction-ID dedup, the overlay-intercept fallback, WCAG contrast math with style-dedup sampling, auth-expiry preflights, the stash-not-delete update flow — as a prompt, every one of those becomes "please do this correctly from a description," paid for in context tokens every session, executed with model variance every time, with nowhere to keep state between calls. As a server, it costs nothing beyond tool schemas, runs deterministically, and remembers. A prompt describes behavior; software guarantees it.
check_color_contrastreturns the same ratio every run; a model doing the math in-context returns a vibe. The more deterministic, stateful, and regression-tested a capability becomes, the less it belongs in a prompt and the more it belongs in code.And the wheel doesn't just avoid being reinvented — it gets better. The issues in this repo were filed by an AI agent doing real testing work; each one became a fix with a regression test. In a prompt world, every lesson is another paragraph future agents must read and hopefully obey. Here, the lesson is enforced. That's the difference, and it compounds.
What I appreciate most as a consumer of these tools: they don't lie to me. A drag that did nothing comes back flagged. An expired session tells me why it's gone. An update that needs a restart says so. Honest tools are rarer than capable ones — for an agent, they're worth more.
License
GNU AGPL-3.0 — see LICENSE.
Run it, modify it, use it anywhere — including commercially. If you distribute a modified version or offer one as a network service, you must make your modifications available under the same license.
Available Tools
74 toolsassert_allA
Batch assertions: evaluate MANY conditions in one call and get every verdict — no early abort, so the response is the complete pass/fail picture (overall passed, failed_count, per-assertion results with actual values). Each item takes the same fields as assert_condition. Prefer this over sequential assert_condition calls when verifying a state with 2+ expectations.
| Name | Required | Description | Default |
|---|---|---|---|
| assertions | Yes | Assertions to evaluate — each an object like assert_condition's arguments | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes key behaviors: no early abort, complete pass/fail picture, and per-assertion results with actual values. Since no annotations exist, this transparency is valuable, though it could mention error handling or session impact.
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 extremely concise: two sentences and a recommendation. It front-loads the core purpose and adds no redundant information, earning every sentence.
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 sufficient output details (overall passed, failed_count, per-assertion results). It could be more complete by noting return format or limitations, but it's adequate for a batch assertion 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?
Although schema coverage is 100%, the description adds that each item takes the same fields as assert_condition, linking the input structure to a known sibling. This goes beyond the schema's standalone 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 clearly states the tool is for batch assertions, evaluating many conditions in one call and returning every verdict. It contrasts with the sibling tool assert_condition, making its purpose distinct and specific.
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 recommends preferring this tool over sequential assert_condition calls when verifying a state with 2+ expectations. This provides clear guidance on when to use it versus the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assert_conditionA
Assert a condition on the current page and get a hard pass/fail plus the actual value — no screenshot to interpret. Supports text_contains, text_equals, element_exists, element_visible, element_count, url_contains, title_contains, attribute_equals. Returns {passed, actual, expected}. The verification primitive — prefer it over screenshot-squinting.
| Name | Required | Description | Default |
|---|---|---|---|
| expected | No | Expected value (text, count as string, URL substring, attribute value) | |
| selector | No | CSS selector (for element-based assertions) | |
| assertion | Yes | Type of assertion | |
| attribute | No | Attribute name (for attribute_equals) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It does describe the return format ({passed, actual, expected}) and the deterministic nature ('hard pass/fail'). However, it omits details about error handling, timeouts, prerequisites, or side effects, leaving some behavioral ambiguity.
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 (two sentences) and front-loaded with the core purpose. It efficiently conveys key information, though the listing of assertion types is somewhat redundant with the schema enum.
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?
Despite having no output schema, the description mentions the return structure. However, it lacks information on session prerequisites, behavior when the page isn't ready, or error scenarios, leaving some gaps for an agent to fully understand usage context.
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 provides full descriptions for all parameters (100% coverage). The description adds minimal extra semantics beyond listing the assertion types and mentioning that 'expected' is a string, which is already 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 states the tool's purpose: asserting a condition on the current page and returning a pass/fail result plus the actual value. It explicitly distinguishes itself from screenshot-based verification with the phrase 'no screenshot to interpret' and lists all supported assertion types.
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 provides clear context for when to use this tool, calling it 'the verification primitive' and recommending it over screenshot comparison. However, it does not explicitly state when not to use it or describe alternative tools beyond screenshots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auto_fill_formA
Detect a form's fields, infer each type (email/phone/name/address/date…), fill realistic test data, and optionally submit — one call replacing 5-10. Returns which fields were filled and with what. Use overrides={selector: value} for specific values and submit=true to submit.
| Name | Required | Description | Default |
|---|---|---|---|
| submit | No | Submit the form after filling (default: false) | |
| overrides | No | Override auto-detected values: {selector: value} (e.g. {"#email": "custom@test.com"}) | |
| session_id | Yes | Session ID | |
| form_selector | No | CSS selector for the form (default: first form on page) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It mentions return behavior ('Returns which fields were filled and with what') but does not disclose potential side effects like actual form submission after filling, or limitations (e.g., dynamic forms).
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 at three sentences, front-loaded with core purpose and benefit, followed by return value and usage hints. No unnecessary words.
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 and no annotations, the description covers purpose, parameters with examples, and return value. It lacks details on error handling, prerequisites (session context), or limitations, but is adequate for typical use.
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 value by providing usage examples for overrides and submit, clarifying their purpose beyond schema descriptions. However, no extra info for session_id or form_selector.
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 the tool as auto-detecting form fields, inferring types, filling test data, and optionally submitting. It distinguishes from sibling tools by emphasizing automation and efficiency ('one call replacing 5-10').
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 provides explicit usage guidance for overrides and submit parameters. It implies the tool is for form testing but does not explicitly state when not to use or mention alternatives among siblings like 'fill_form'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_color_contrastA
Check WCAG color contrast ratios for text elements on the page. Samples one element per unique text style (color/background/size), so repeated nav items don't exhaust the budget — 'checked' counts style groups, 'elements_represented' the elements they cover. Reports failures against AA or AAA thresholds.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | WCAG level to check against (default: AA) | |
| selector | No | CSS selector to check (default: all text elements) | |
| session_id | Yes | Session ID | |
| max_results | No | Max elements to check (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses sampling strategy (one per unique style), explains output fields ('checked' vs 'elements_represented'), and reports against AA/AAA thresholds. No annotations to contradict.
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, front-loaded with purpose, every sentence provides necessary detail 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?
No output schema, but description explains return information (failures per level, counts of checked groups and elements). Sufficient for a tool with 4 parameters and clear behavior.
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. Description adds context about sampling but doesn't detail each parameter 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?
States specific action ('Check WCAG color contrast ratios') and resource ('text elements'). Distinguishes from sibling accessibility tools by focusing on contrast ratios.
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 context for use (checking contrast against WCAG thresholds) but no explicit when-not-to-use or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_linksA
Crawl all links on a page and report each one's URL, status code, and OK/broken result — catching 404s and dead anchors. External links are skipped unless check_external=true. Returns the per-link results plus a broken-link summary. Works on a session or a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to check (use this or session_id) | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). | |
| max_links | No | Max links to check (default: 100) | |
| session_id | No | Session ID (use this or url) | |
| check_external | No | Also check external links (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that external links are skipped by default and that a broken-link summary is returned, but it does not mention potential performance impacts, redirect handling, or error states beyond 404s. With no annotations, more detail would be beneficial.
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 with three sentences covering purpose, behavior, and return. It is front-loaded with the core function. Slightly verbose first sentence could be trimmed without loss.
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 5 parameters and no output schema, the description partially covers return format (per-link results and summary). However, it lacks details on pagination, limits, error handling, and how results are structured. Additional context would improve completeness.
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 each parameter is documented. The tool description adds slight value by repeating the relationship between url and session_id, but does not significantly enhance understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: crawling all links on a page and reporting status. It distinguishes from sibling tools by specifying it checks links on a page, not just a single URL like test_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?
The description provides basic usage conditions (external links skipped unless check_external=true, works on session or URL) but lacks explicit guidance on when to use this tool versus alternatives like test_url or web_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_interceptsA
Remove network mocks created by intercept_network — all of them, or only those registered with a given URL pattern. Returns {success}. Use to restore real backend responses after testing mocked states.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID | |
| url_pattern | No | Only remove intercepts registered with this exact pattern (optional — omit to clear all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool removes mocks and returns {success}, but does not disclose potential side effects (e.g., irreversibility, impact on other sessions) or prerequisites (e.g., mocks must exist). The description is honest but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary purpose, and no unnecessary words. Every sentence adds value: the first states what it does, the second gives usage context.
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 simplicity (2 parameters, no output schema), the description is mostly complete. It covers purpose, usage context, and return value. Missing details about error states (e.g., no mocks to clear) but overall adequate.
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 description adds little beyond what the schema already provides. It clarifies that url_pattern uses exact matching and is optional, but this is also stated in the schema description. Baseline score 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 removes network mocks created by intercept_network, with an option to filter by URL pattern. It uses a specific verb ('remove') and resource ('network mocks'), and the distinction from the sibling tool intercept_network (which creates) is implied.
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 provides a clear use case: 'Use to restore real backend responses after testing mocked states.' This gives context for when to use the tool, but does not explicitly mention when not to use or list alternatives. However, the context is sufficient for most scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
click_elementA
Click an element in a session page. Returns a screenshot and the new URL/title after click. If a full-screen portal overlay (Radix/shadcn dialogs & menus) intercepts the pointer, automatically falls back to an element-level JS click and flags click_method='js_dispatch' — no workaround needed. Use force=true to bypass actionability checks for other cases (hidden/animating elements).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Bypass actionability checks (default: false). Use when overlays intercept clicks. | |
| observe | No | What to return about the resulting page. 'screenshot' (default): full-page image. 'none': structured result only, no image — cheapest, use through setup steps of a flow. 'map': semantic page map (get_page_map — token-light, best for 'what can I do next?'). 'checks': run_checks_on_session output (a11y/seo/perf/etc.). | screenshot |
| selector | Yes | CSS selector of element to click | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes automatic fallback for portal overlays, flagging click_method='js_dispatch', and the use of force=true to bypass actionability checks. No annotations exist, so description carries full burden and does 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?
Three sentences, front-loaded with main action, no filler. Every sentence adds critical information.
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 return values and observe options well despite no output schema. Could mention prerequisites like session open, but not critical. Sufficient for the tool's complexity.
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 100%, but description adds value for force (use case) and observe (explains options). Also clarifies return values (screenshot, URL/title, click_method). Adds 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?
The description clearly states 'Click an element in a session page' and distinguishes behaviors like automatic fallback for overlays and the force parameter. No other sibling tool has such specificity.
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 guidance on when to use force=true and explains the automatic fallback mechanism. Does not explicitly exclude other tools but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_sessionA
Close a browser session and free its resources (page, context, captured logs). Returns {success}. Call it when finished; using a closed or expired id returns a 'session not found' error that explains why (idle-expired, evicted, or crashed).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID to close |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses side effects (freeing resources) and error cases (idle-expired, evicted, crashed). No annotations, so description carries full burden; it's sufficiently transparent.
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, no wasted words. First covers action and return, second adds usage guidance and error behavior. Front-loaded with key action.
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?
Simple tool with one parameter and no output schema. Description adequately covers purpose, return, resource freeing, and error handling. Implicit prerequisites are acceptable.
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?
Only one parameter with schema description 'Session ID to close'. Tool description doesn't add meaning beyond schema; baseline 3 due to 100% 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?
Clear verb 'close' with specific resource 'browser session'. Mentions freeing resources and return value. Distinguishes from sibling tools by specifying it's for finishing a session.
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 'Call it when finished' and describes error behavior for closed/expired IDs. Provides good context on when to use, though lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_screenshotsA
Pixel-diff two screenshot files. Returns the percentage of differing pixels and writes a diff image highlighting the changed regions (path in the result). Use for visual-regression checks — capture with test_url/screenshot_session, then compare. threshold sets per-channel color tolerance.
| Name | Required | Description | Default |
|---|---|---|---|
| threshold | No | Color difference threshold 0-255 (default: 10) | |
| screenshot1 | Yes | Path to first screenshot | |
| screenshot2 | Yes | Path to second screenshot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It discloses that it writes a diff image and returns percentage, and mentions threshold behavior. However, it does not state whether it modifies original files, requires permissions, or other 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?
Two sentences: first defines action and outputs, second gives usage and parameter detail. No wasted words, 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?
No output schema, but description explains return values (percentage and diff image path). Covers threshold parameter and usage context. Does not address error cases or file format requirements, but adequate for typical use.
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. Description adds meaning by explaining that threshold sets per-channel color tolerance, which aligns with schema description.
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 it pixel-diffs two screenshots, returns a percentage, and writes a diff image. It distinguishes from sibling tools like screenshot_session (capture) and get_screenshot (capture).
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 tells when to use (for visual-regression checks after capturing with test_url/screenshot_session). Does not list exclusions or alternatives, but provides workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_authA
Copy auth configuration and, when possible, the live login session (cookies + localStorage via storage_state) from one project to another on the same domain. Returns {success, session_copied}; session_copied is false when only the config/cookies could transfer. Use to reuse a login across related projects.
| Name | Required | Description | Default |
|---|---|---|---|
| to_project | Yes | Target project name to copy auth to | |
| from_project | Yes | Source project name to copy auth from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the return format {success, session_copied} and explains that session_copied is false when only config/cookies transfer. This is good for a simple copy tool.
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 two sentences long, front-loaded with the core action and then details. Every sentence adds value with no wasted words.
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 description explains the return format despite no output schema, covers both possible outcomes, and the tool is simple with only two parameters. No additional context needed for effective use.
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% with both parameters described individually. The tool description reiterates the directionality but adds no extra semantics beyond what the schema already provides. 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 clearly states the tool copies auth configuration and the live login session (cookies + localStorage) between projects on the same domain. This specific verb+resource distinguishes it from sibling tools like set_cookies, set_local_storage, save_login, and login_project.
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 'Use to reuse a login across related projects,' providing clear guidance on when to use. It does not include explicit when-not-to-use or alternative tools, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawl_projectA
Discover a project's pages by breadth-first crawling internal links from its base URL, bounded by max_pages/max_depth (overridable per call). Discovery is deterministic (links sorted before the cap) and sitemap-seeded when a sitemap.xml/robots.txt Sitemap is present, so the same site yields the same page subset every run. Returns the discovered URLs plus pages_not_crawled[] (≤100, else a count) so a hit cap is never silent. Runs in the project's authenticated context. Set meta=true to also get each page's title + meta description (captured during the crawl, so behind-login/JS pages work), and save_md=true to save every crawled page as readable Markdown to data/fetches// (returns pages[] with saved_path + saved_dir). Discovery (optionally + capture) — use test_project to crawl and run full audits.
| Name | Required | Description | Default |
|---|---|---|---|
| meta | No | Also return each crawled page's title + meta description in pages[] (default: false). | |
| project | Yes | Project name | |
| save_md | No | Save each crawled page as readable Markdown to data/fetches/<project>/ (default: false). Returns saved_dir + per-page saved_path. | |
| save_dir | No | Directory to save Markdown into (implies save_md=true). Defaults to data/fetches/<project>/. | |
| max_depth | No | Override max depth for this crawl | |
| max_pages | No | Override max pages for this crawl. 0 = the WHOLE site (unbounded, stops at a safety ceiling of 2000 and flags ceiling_hit). | |
| use_sitemap | No | Seed discovery from sitemap.xml / robots.txt Sitemap: lines when present (default: true). Set false for pure link-crawl. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: BFS crawling, determinism, sitemap seeding, return format with pages_not_crawled, authenticated context, and parameter effects like max_pages=0 unbounded up to 2000. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but slightly long. It front-loads the core purpose. Could be slightly more concise, but every sentence adds value.
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 complexity of 7 parameters and no output schema, the description explains return values, edge cases (max_pages=0, safety ceiling), behavior highlights, and provides sufficient context for effective use.
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 descriptions for all 7 parameters. The description adds minimal new information about parameters beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool discovers a project's pages via breadth-first crawling from its base URL, with bounds. It distinguishes from sibling tools like test_project by noting that test_project is for full audits.
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 advises using test_project for full audits, providing a clear alternative. It does not explicitly state when not to use this tool, but gives context for alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectA
Create a persistent testing project: a named website/web-app target with its base URL and crawl limits, saved to disk and reused by crawl_project, test_project, and authenticated sessions. Returns the stored project config. Create this first, then attach auth (set_form_login / set_basic_auth / set_cookies) and run tests.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Unique project name (e.g., 'mysite') | |
| base_url | Yes | Base URL of the website (e.g., 'https://example.com') | |
| max_depth | No | Max crawl depth (default: 3) | |
| max_pages | No | Max pages to crawl (default: 20) | |
| screenshot_dir | No | Absolute path to save screenshots (e.g. '/home/user/myproject/e2e_testing'). Defaults to built-in data/screenshots/ if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the project is persistent (saved to disk) and returns the stored config. It doesn't mention behavior on duplicate names or error conditions, but the core behavior is well-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: the first is front-loaded with the core purpose and key details, the second provides immediate action guidance. Every word earns its place; no repetition 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 5 parameters, no output schema, and no annotations, the description provides a complete picture: what the tool creates, how it's used in the workflow, and what it returns. It explains the lifecycle and integration with sibling tools thoroughly.
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 value by explaining the parameter purpose in context (e.g., 'crawl limits' for max_depth/max_pages, 'reused by crawl_project, test_project' for the project concept). This goes beyond the schema's individual field 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 clearly states the tool creates a persistent testing project for a website/web-app target, specifying it's saved to disk and reused by other tools. It distinguishes itself from siblings like crawl_project and test_project by emphasizing its role as the initial setup step.
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 says 'Create this first, then attach auth... and run tests', providing clear sequential guidance. It also lists specific sibling tools for subsequent steps (set_form_login, set_basic_auth, set_cookies), helping the agent understand when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectA
Permanently delete a project and its saved configuration and auth. Returns {success}. Irreversible; afterwards the name is free to reuse. Does not remove screenshots/reports already written to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses irreversible deletion, name reuse, and that screenshots/reports on disk are not removed. This is comprehensive for a destructive 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?
The description is compact and well-structured: action, return value, irreversibility, name reuse, and what is not deleted. Every sentence adds value 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 delete tool, the description covers return value, irreversibility, and side effects. Lacks error handling information but is adequate given the tool's simplicity.
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 has 100% coverage for the single parameter 'name'. The description adds no extra meaning beyond what the schema already provides, so 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 clearly states the tool permanently deletes a project and its configuration/auth, distinguishing it from other project-related tools. It specifies exactly what is and isn't deleted (e.g., screenshots not removed).
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 when to use (when you want permanent deletion) but does not explicitly state when not to use or provide alternatives. No guidance for soft-delete or archive scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_toolsA
Return a structured catalog of Periscope's tools grouped by category, with parameters, workflow examples, and tips — optionally filtered to one category. Returns the guide as structured JSON. Call this first if you're new to the server, to plan a testing workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter by category (default: 'all') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the tool returns structured JSON and accepts an optional category filter. However, it does not mention side effects, auth needs, or rate limits. The description covers basic behavioral traits but lacks depth expected without 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 three sentences, but the second sentence ('Returns the guide as structured JSON') is redundant with the first sentence's 'Return a structured catalog...'. Could be more concise by combining or removing redundant information.
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 simplicity (one optional param, no output schema), the description adequately covers purpose, filtering, and usage guidance. It mentions workflow examples and tips, which is helpful. Minor gap: no mention of the output structure being self-documenting.
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 only parameter 'category' is fully described in the schema (100% coverage), so the description adds minimal value. It mentions 'optionally filtered to one category' which reinforces the schema but does not explain category meanings beyond the enum.
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 returns a structured catalog of Periscope's tools grouped by category, with parameters, workflow examples, and tips. It explicitly mentions optional filtering by category and directs new users to call it first, making its purpose distinct from sibling action 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 explicitly recommends calling this tool first when new to the server to plan a testing workflow. While it doesn't state when not to use or list alternatives, the context implies it's a meta-tool with no direct siblings, so the guidance is clear but could be more complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileA
Click a trigger and capture the file it downloads — the honest way to verify exports (CSV, PDF, invoices). The download waiter is armed BEFORE the click so fast downloads aren't missed, and the click uses the same overlay-fallback as click_element (export buttons inside Radix menus work). Returns the saved path, size, sha256, source URL, and for small text files a text_head preview so content can be asserted without another call. Files land in data/downloads/.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Max ms to wait for the download to start (default: 30000) | |
| selector | Yes | CSS selector of the element whose click starts the download | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behavioral traits beyond schema: download waiter is armed before click to catch fast downloads, uses overlay-fallback for Radix menus, returns file path, size, sha256, source URL, and text preview. Specifies save location data/downloads/. No annotations present, so description fully covers transparency.
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 paragraph of five sentences, each serving a purpose: first states main function, second details operational mechanism, third lists return values, fourth specifies location. No redundancy or unnecessary words.
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 return values in detail despite no output schema, explains file location and download triggering. However, lacks information on error handling (e.g., timeout scenarios, no download triggered).
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. Description adds some context (e.g., pre-arming for fast downloads) but does not significantly enhance meaning beyond the schema's 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 clearly states the tool captures files from downloads triggered by clicking an element, specifying file types like CSV, PDF, and invoices. It distinguishes itself among siblings like click_element and upload_file by focusing on export verification.
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 context for use: verifying exports via download capture. Mentions mechanism (pre-arming waiter, overlay-fallback) but does not explicitly state when not to use it or compare with alternatives like web_fetch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emulate_networkA
Throttle a session's network to a preset — slow_3g, fast_3g, offline, or reset. Returns {success}. Persists across navigations until reset. Use to test loading spinners, skeleton states, offline fallbacks, and timeout handling.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | Network preset: slow_3g (500kbps/400ms), fast_3g (1.5Mbps/150ms), offline (no network), reset (back to normal) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral info: 'Persists across navigations until reset' and 'Returns {success}'. With no annotations, this partially fulfills disclosure, but missing details like side effects on existing requests or required permissions.
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, front-loaded with action and presets, followed by use cases. No extraneous words.
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 core purpose, presets, persistence, and return value. Without output schema, it clarifies the return format. Could mention behavior on in-progress requests, but overall adequate for a simple 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?
Schema has 100% coverage with descriptions for both parameters. Description adds no new semantic value beyond schema, so 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?
Clearly states the tool throttles network to a preset. Lists the four presets. Does not explicitly differentiate from siblings like intercept_network or wait_for_network, but 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?
Explicitly mentions use cases: testing loading spinners, skeleton states, offline fallbacks, timeout handling. Provides context for when to use, though no exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_formB
Fill form fields in a session page and optionally submit. Use force=true to bypass actionability checks when overlays or dialogs block the inputs.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Bypass actionability checks — fill even when overlays/dialogs block the inputs (default: false) | |
| fields | Yes | Fields to fill: [{selector, value}] | |
| observe | No | What to return about the resulting page. 'screenshot' (default): full-page image. 'none': structured result only, no image — cheapest, use through setup steps of a flow. 'map': semantic page map (get_page_map — token-light, best for 'what can I do next?'). 'checks': run_checks_on_session output (a11y/seo/perf/etc.). | screenshot |
| session_id | Yes | Session ID | |
| submit_selector | No | CSS selector for submit button (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must fully disclose behavior. It mentions force bypass but does not explain error handling or what happens if selectors are invalid or submission fails.
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: first states purpose, second provides key usage tip. No redundancy, front-loaded with essential information.
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 5 parameters, no output schema, and many sibling tools, the description lacks completeness. Missing: error behavior, handling of missing fields, comparison to 'auto_fill_form', and details about the 'observe' parameter's impact.
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 description adds only incremental value beyond schema descriptions. The tip about 'force=true' provides practical guidance, but does not significantly enhance understanding of parameters.
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 fills form fields in a session page with optional submission. It uses a specific verb and resource, but does not differentiate from the sibling 'auto_fill_form' which may handle automatic filling.
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 a usage tip for 'force=true' to bypass actionability checks, but lacks guidance on when to use this tool over siblings like 'auto_fill_form' or alternatives for form interaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_elementA
Find elements by text content, tag, ARIA role, and/or proximity to another element, ranked by match quality. Returns {found, elements} with the best CSS selector for each. Use it to get a reliable selector from what you can see (e.g. a button's text) instead of guessing.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | HTML tag filter (e.g. 'button', 'a', 'input') | |
| near | No | CSS selector of a nearby element (find elements near this one) | |
| role | No | ARIA role filter (e.g. 'button', 'link', 'textbox') | |
| text | No | Text content to search for (partial match) | |
| session_id | Yes | Session ID | |
| max_results | No | Max results (default: 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states that elements are 'ranked by match quality' and returns both a found flag and elements with best CSS selectors. It implies a read-only operation but does not elaborate on error cases or non-matching scenarios.
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, first defines functionality, second provides usage rationale. Every word earns its place. No 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 has 6 parameters and no output schema, the description covers the main purpose, return structure, and usage guidance. It lacks details on ranking order or max_results default, but is sufficient for basic use.
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%, but the description adds value beyond schema by explaining that results are ranked and the best CSS selector is returned. It integrates the parameters into the purpose, adding context not present in 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 uses specific verb 'Find' and resource 'elements' with criteria (text, tag, ARIA role, proximity). It distinguishes from sibling tools by focusing on selector generation from visible attributes, stating 'use it to get a reliable selector from what you can see'.
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 says to use this tool when you have visible cues like button text to avoid guessing selectors. It provides clear context but does not explicitly say when not to use it or mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flowA
Save and re-run named step sequences — define a workflow once (login, checkout, smoke path), replay it in any session. action='save' stores steps (interact_and_test's exact format, all 25 actions); action='run' executes a saved flow on a session via the same engine as interact_and_test; action='list' shows saved flows; action='delete' removes one. Deliberately minimal: verify outcomes by following a run with assert_all or visual_check. Flows persist in data/flows/ across sessions and server restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Flow name, e.g. 'login' (letters, digits, . _ -). Required except for list. | |
| steps | No | For save: steps in interact_and_test's format | |
| action | No | What to do (default: list) | |
| session_id | No | For run: session to execute on | |
| description | No | For save: optional human note about what the flow does | |
| continue_on_error | No | For run: keep executing after a failed step (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description discloses key behaviors: flows persist across sessions and server restarts, the tool is 'deliberately minimal' regarding verification, and steps must use interact_and_test's exact format. It does not cover error handling or overwrite behavior, but the main traits are well stated.
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, with no redundant sentences. It opens with the core purpose, enumerates actions, provides guidance on verification, and mentions persistence. Every sentence contributes essential information without 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?
Given the tool's moderate complexity (6 params, no output schema, no annotations), the description covers the main functionality, persistence, and relation to siblings. It could mention overwrite behavior on save, but overall it provides sufficient context for an agent to use 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?
All 6 parameters are described in the schema (100% coverage). The description adds value by explaining the action enum options, specifying that steps must be in interact_and_test's format for save, and noting the default for continue_on_error. This goes beyond the schema's basic 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 clearly states the tool's purpose: saving and replaying named step sequences. It explicitly lists the four actions (save, run, list, delete) and distinguishes itself from siblings by referencing interact_and_test as the underlying engine for execution, making its unique value clear.
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 explains when to use each action (e.g., 'action='save' stores steps', 'action='run' executes a saved flow') and provides guidance on verification: 'verify outcomes by following a run with assert_all or visual_check'. It lacks explicit exclusions or alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_computed_styleA
Read the actual rendered CSS values (after stylesheets and inheritance) for the requested properties on matching elements. Returns per-element property→value maps. Use to verify colors, fonts, spacing, display, or opacity programmatically instead of eyeballing a screenshot.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector | |
| properties | Yes | CSS properties to read (e.g. ['color', 'font-size', 'display', 'opacity', 'background-color']) | |
| session_id | Yes | Session ID | |
| max_results | No | Max elements to check (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return format (per-element property→value maps) and scope. Lacks details on edge cases (no matches, errors) but no annotations exist, so description does reasonable job. Could mention safety/read-only nature.
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: first defines operation, second provides usage guidance. No 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?
Describes output format sufficiently for a simple read tool. Could mention default max_results or handling of multiple elements, but overall adequate given parameter count and schema coverage.
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 covers 100% of parameters with descriptions. Description does not add extra parameter-level detail beyond schema, but reinforces purpose. Baseline 3 justified.
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 reads computed CSS values (rendered), specifying verb 'Read', resource 'CSS values', and context 'after stylesheets and inheritance'. No sibling offers this, so it's well-differentiated.
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 says to use for programmatic verification of colors, fonts, spacing, display, opacity instead of screenshots. Provides clear use case and alternatives (screenshot tools).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_console_errorsA
Return browser console output (errors, warnings, logs) captured passively on a session since it opened or since the last read; clears the buffer by default. Returns the buffered entries. First stop when debugging a broken page — no steps required.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear the console buffers after reading (default: true) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that clearing the buffer is the default behavior and that entries are captured passively. Without annotations, this description adequately informs the agent of key behaviors, though additional details (e.g., auth, rate limits) are missing.
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 concise sentences that front-load the primary purpose, include key behavioral details, and provide usage guidance. Every sentence adds value with no 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?
Covers the tool's purpose, behavior, and usage context effectively given the simple parameter set and missing output schema. Could mention the output format (e.g., array of errors) to be fully complete, but this is not critical.
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 has 100% coverage with descriptions for both parameters. The description adds meaning by explaining the 'clear' parameter's default and the operational context ('since last read'), providing value 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?
Clearly states the tool returns browser console output including errors, warnings, and logs. Specifies passive capture and default clearing behavior. Positions it as the first debugging step, distinguishing its purpose from other 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?
Explicitly recommends it as the first stop when debugging a broken page and notes no steps are required. Does not mention when to avoid it or alternatives, but the context is clear for common debugging scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cookiesA
Read all cookies from a session's browser context (optionally filtered by domain). Returns {cookies, total} with each cookie's name/value/domain/path/flags. Essential for debugging auth/session issues — confirm the expected session cookie is present and scoped correctly.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID | |
| domain_filter | No | Filter by domain (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It explains the return structure ({cookies, total} with details) and frames it as a read operation. However, it omits potential behaviors like error handling when the session is invalid or no cookies exist.
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 wasted words. The first sentence states the action and return type; the second gives a concrete use case. Well-structured and efficient.
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 simplicity (2 parameters, no output schema), the description covers the core functionality, return format, and a primary use case. It does not discuss edge cases or limits, but is sufficient for an agent to understand and 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?
Schema coverage is 100%, but the description adds value by explaining the domain_filter as 'optionally filtered by domain' and indicates the output structure. The session_id parameter is minimally described, but the overall semantic gain is positive.
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 it reads cookies from a session's browser context, with optional domain filtering. This distinguishes it from sibling 'set_cookies' and other tools, as it is explicitly a read operation.
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 specifies it is 'Essential for debugging auth/session issues' and mentions confirming cookie presence and scoping. While it does not explicitly exclude alternatives or state when not to use, the context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interaction_logA
Export the real INP (Interaction to Next Paint) time series for a session — one record per interaction Periscope drove (click/typing), each with its input-to-next-paint latency, event type, target, timestamp, and URL. Saves a JSON (for graphing) or CSV file and returns percentile stats (p50/p75/p90/p98/worst). Use after driving interactions (interact_and_test, click_element, fill_form…) — ideal for a long interactive test where you want to see all INP times, not just the worst. Unlike Lighthouse (which can't measure INP in lab mode and falls back to TBT), this is measured from actual Event Timing entries.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Reset the recorded interactions after exporting (default: false) | |
| format | No | Export format (default: json). JSON is easiest to graph; CSV for spreadsheets. | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions saving a JSON or CSV file and returning percentile stats, but does not clarify where files are saved (e.g., local vs. server) or whether there are side effects like file system writes. The phrase 'Periscope drove' may be unclear to external agents.
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 paragraph that front-loads the main purpose and then provides details. It is relatively concise given the complexity, though some sentences (e.g., 'Saves a JSON ... and returns percentile stats') could be more direct. Still, it avoids unnecessary 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?
There is no output schema, so the description should explain return values. It mentions returning percentile stats but does not specify their structure (e.g., keys like p50, p75). It also lacks prerequisites (e.g., session must exist) and error handling. The file-saving behavior is ambiguous (side effect or not?).
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 value by explaining the 'clear' parameter as 'Reset the recorded interactions after exporting' and specifying 'JSON is easiest to graph; CSV for spreadsheets' for format, which goes beyond schema enums.
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 it exports the real INP time series for a session, one record per interaction, with latency, event type, target, timestamp, and URL. It distinguishes from Lighthouse and mentions use after driving interactions, making the purpose specific and differentiated from siblings.
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 'Use after driving interactions (interact_and_test, click_element, fill_form…) and contrasts with Lighthouse, which cannot measure INP in lab mode. It also specifies ideal context: 'long interactive test where you want to see all INP times, not just the worst.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_local_storageA
Read a session page's localStorage (or sessionStorage) — all entries, or specific keys. Returns the key/value pairs as an object. Use to inspect client-side state (tokens, flags, cached data) when debugging.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | No | Specific keys to read (optional, reads all if omitted) | |
| storage | No | Storage type (default: 'local') | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It correctly implies a read-only operation via 'Read' and states the return format ('Returns the key/value pairs as an object'). However, it does not disclose error behavior (e.g., invalid session ID, missing keys) or confirm non-destructiveness explicitly.
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 long and front-loaded with the core action. It is fairly concise, though the second and third sentences could be merged for slightly better efficiency. No unnecessary words.
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 simplicity (3 parameters, no output schema), the description adequately covers the return format and use case. Missing details like error handling or behavior for missing keys are minor gaps in an otherwise complete description.
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%, but the description adds significant value: it clarifies that 'keys' is optional, mentions the default storage type ('local'), and explains the return format as an object. This goes beyond the schema's basic 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 uses a specific verb ('Read'), identifies the exact resource ('a session page's localStorage (or sessionStorage)'), and clarifies scope ('all entries, or specific keys'). It clearly distinguishes from siblings like set_local_storage and get_cookies.
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 states when to use the tool ('when debugging' and 'to inspect client-side state'), providing clear context. However, it does not explicitly mention when not to use it or suggest alternative tools for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_network_logA
Return the network requests captured on a session — each with URL, HTTP method, status, resource type, and size. Optionally filter by URL substring; clear=true empties the log after reading. Returns the request list. Use to see which API calls fired and their status when debugging.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear the log after reading (default: false) | |
| session_id | Yes | Session ID | |
| url_filter | No | Optional plain-substring filter against the full URL incl. query string (e.g. '/api/') — not a regex or glob. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that clear=true empties the log, which is important, and describes filtering behavior. It doesn't cover rate limits or auth, but for a read operation, this is sufficient.
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, front-loaded with purpose. Each sentence adds information: what is returned, optional parameters, and usage context. No wasted words.
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 and no annotations, the description covers the key aspects: return structure, optional filters, clearing behavior, and usage. It is complete for a simple read 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?
Schema description coverage is 100%, but the description adds value beyond schema by explaining url_filter is a plain-substring filter (not regex) and that clear=true empties the log. This clarifies usage 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?
The description clearly specifies the verb (return), resource (network requests on a session), and details what fields are included (URL, HTTP method, status, resource type, size). It distinguishes from siblings like get_interaction_log by focusing on network requests.
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 ends with 'Use to see which API calls fired and their status when debugging,' providing clear context. It doesn't explicitly exclude alternatives, but the sibling tools like wait_for_network or intercept_network have different purposes; the description implies debugging use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_elementsA
List elements matching a CSS selector with their attributes (tag, text, id, class, href, value, visible, enabled, aria_label, role). Pass 'attributes' for extra HTML attributes (data-, aria-, style, ...) and 'full_text' for complete text content instead of the 80-char preview. Works on a session or a URL. Standard CSS selectors only — Playwright-specific pseudo-classes (:has-text, :visible) are not supported here.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to open (use this or session_id) | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). | |
| selector | Yes | CSS selector to match elements | |
| full_text | No | Return full text content instead of an 80-char preview (default: false) | |
| attributes | No | Extra HTML attribute values to include per element (e.g. data-testid, aria-expanded, style) | |
| session_id | No | Session ID (use this or url) | |
| max_results | No | Max elements to return (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral details. It states the tool works on a session or URL, lists default returned attributes, and mentions the 80-char text preview and options for full text/extra attributes. It does not disclose behavior for no matches or error conditions, but the read-only nature is 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 two sentences, front-loading the main purpose. The second sentence is moderately long but packed with useful detail. Could be split for readability, but overall efficient.
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 list tool with a clear schema, the description covers the key output and parameter options. It does not mention the default 'max_results' of 50 or pagination, but these are in the schema. The description is sufficient for an agent to use 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?
Schema coverage is 100%, but the description adds value by explaining how to use the 'attributes' and 'full_text' parameters beyond the schema definitions. It also clarifies the mutual exclusivity of 'url' and 'session_id' (implicitly).
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 'List elements matching a CSS selector with their attributes', using a specific verb and resource. It distinguishes from sibling tools like 'find_element' (single element) and 'click_element' (action).
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 notes that only standard CSS selectors are supported and Playwright pseudo-classes are not, which helps avoid misuse. It also explains how to get extra attributes and full text, but does not explicitly contrast with alternatives like 'find_element' or 'get_page_html'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_htmlA
Return the raw outerHTML of matching elements, or the full page HTML if no selector, truncated to max_length. Returns the HTML string(s). Use to inspect component/markup structure — e.g. head meta tags for SEO, or a widget's DOM. Standard CSS selectors only.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | No | CSS selector (optional — omit for full page HTML) | |
| max_length | No | Max characters to return (default: 50000) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses truncation behavior and return of HTML string(s). However, lacks details on performance impact, error handling, or behavior if selector matches many elements. No annotations provided.
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 concise sentences covering functionality, usage examples, and selector constraint. No extraneous words.
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?
Does not specify return format clearly ('HTML string(s)' ambiguous; single vs array). Also lacks error handling or edge case details. Output schema absent, so description carries more burden.
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?
Adds value beyond schema by clarifying that selector is optional and returns full page HTML when omitted, and specifies 'Standard CSS selectors only.' Schema coverage is 100%, baseline 3, elevated by added context.
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?
Description specifies returning raw outerHTML of matching elements or full page HTML if no selector, truncated to max_length. Distinguishes from siblings like get_page_elements and web_fetch.
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 use cases (inspect component/markup structure, SEO meta tags, widget DOM) but does not explicitly state when not to use or mention alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_mapA
Semantic page map in ONE call: every interactive element (links, buttons, inputs, custom controls) plus landmarks and headings, in document order — each with its ARIA role, accessible name, live state (disabled/checked/expanded/value), and a ready-to-use CSS selector. The fastest way to answer 'what can I do on this page?' — use it to orient before clicking instead of multiple get_page_elements calls. Interactive elements with no accessible name are flagged unnamed (an accessibility finding in itself). Output is compact: only truthy state fields, capped at max_nodes with an explicit truncated flag.
| Name | Required | Description | Default |
|---|---|---|---|
| max_nodes | No | Max nodes to return (default: 150); 'total' reports how many exist | |
| session_id | Yes | Session ID | |
| include_hidden | No | Include invisible elements, flagged hidden (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses behavior: returns only truthy state fields, flags unnamed elements, caps output at max_nodes with a truncated flag. It describes the compact output format and the fact that it is read-only.
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?
Well-structured and front-loaded with the main purpose. The description is slightly verbose but each sentence adds necessary detail. Could be trimmed slightly but overall efficient.
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?
No output schema, but the description fully explains the return format: ensures agent knows what data is returned (ARIA role, accessible name, live state, CSS selector), how it's organized (document order), special flags (unnamed, hidden, truncated). Complete for agent to understand the tool's output.
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 good descriptions, but the description adds value: explains that max_nodes acts as a cap and that 'total' reports how many exist, and clarifies include_hidden's effect (flagged hidden). These enrich 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 states it returns a semantic page map of interactive elements, landmarks, and headings in document order, with ARIA roles and accessible names. It distinguishes itself from get_page_elements by being a single call, and from find_element by providing a comprehensive map.
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: 'use it to orient before clicking instead of multiple get_page_elements calls.' Provides clear context for its role as a fast orientation tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectA
Get one project's saved configuration: base URL, max_pages/max_depth, screenshot directory, and which auth (form/basic/cookies) is set up. Returns {success, project}. Use it to confirm setup before crawling, testing, or logging in.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states the return format {success, project} and lists retrieved fields, but does not explicitly confirm it is read-only or mention any side effects or authentication requirements.
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 two concise sentences with front-loaded purpose and usage guidance, containing no unnecessary words.
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 tool with one parameter and no output schema or annotations, the description adequately explains the return content and provides usage context, though it omits error handling details.
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?
With 100% schema coverage (the only parameter 'name' is described as 'Project name'), the description adds context about what configuration is retrieved but does not enhance parameter 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?
The description clearly states 'Get one project's saved configuration' and lists specific fields (base URL, max_pages/max_depth, screenshot directory, auth), distinguishing it from sibling tools like create_project or list_projects.
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 advises to 'Use it to confirm setup before crawling, testing, or logging in', providing clear context for when to use the tool, though it does not mention when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reportA
Load a saved test report by file path and return its full contents — per-page issues, site-wide findings, and run metadata. Returns {success, report}. Get valid paths from list_reports.
| Name | Required | Description | Default |
|---|---|---|---|
| report_path | Yes | Path to the report file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the return format ({success, report}) and the contents, but does not disclose error behavior, authentication needs, or potential side effects. It is adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are front-loaded and efficient: first sentence covers purpose and return, second provides usage guidance. No unnecessary words.
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 tool with one parameter and no output schema, the description sufficiently covers purpose, return structure, and source of valid input. Could optionally mention error handling, but not essential.
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% and the description adds value by connecting the parameter to list_reports, telling the agent where to obtain valid paths. This goes beyond the schema's basic 'Path to the report file'.
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?
Description clearly states the verb 'Load' and resource 'saved test report', and details what contents are returned (per-page issues, site-wide findings, run metadata). It distinguishes from the sibling tool list_reports by indicating that get_report returns the full contents, not just paths.
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 tells the agent to 'Get valid paths from list_reports', providing clear context for when to use this tool. No when-not conditions are stated, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_response_bodyA
Return the captured response body text for a request whose URL contains a substring (optionally filtered by method). Matching is a plain substring test against the full URL incl. query string — not a regex or glob. On a miss it lists the captured candidate URLs so you can adjust the pattern in one round-trip. Bodies are captured automatically for fetch/xhr/document requests, making this the fastest way to diagnose a 400/500 — no setup before the request.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | HTTP method filter (optional, e.g. 'POST', 'GET') | |
| session_id | Yes | Session ID | |
| url_pattern | Yes | Plain substring of the full URL incl. query string (e.g. '/api/quotes', 'graphql') — not a regex; anchors ($) and wildcards (.*) never match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations, the description discloses that matching is a plain substring test (not regex), explains miss behavior, and clarifies that bodies are automatically captured. It does not mention potential performance or size limits, but is otherwise transparent.
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 with four sentences, each serving a purpose: purpose, matching rule, miss behavior, and use case. No extraneous text; front-loaded with the core function.
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 description covers the core functionality, matching semantics, and error recovery. It lacks details about return format (though implied) and does not mention session prerequisites, but these are reasonable omissions given the tool's simplicity.
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 three parameters are described in the schema (100% coverage). The description adds valuable context beyond schema: url_pattern is not regex, includes examples, and explains method is optional. This enhances 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?
The description clearly states it returns captured response body text given a URL substring and optional method filter. It distinguishes from siblings by noting it's the fastest way to diagnose 400/500 errors with no setup, but does not explicitly differentiate from get_network_log or similar 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 use for debugging HTTP errors and provides guidance on adjusting patterns when a miss occurs. However, it does not explicitly state when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_screenshotA
Get the saved screenshot file path for a URL previously tested in a project. Returns {success, url, screenshot_path}. Locates the PNG on disk after test_url/test_project — it does not capture a new image (use screenshot_session for that).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL that was tested | |
| project | Yes | Project name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It clearly states the tool does not capture a new image (read-only retrieval), specifies the return format including success, url, and screenshot_path. It lacks details on error conditions or path existence, but the core behavioral traits are well-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?
Two sentences: first states purpose and return, second gives usage guidance and disambiguation. Every word is informative and necessary. 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 simple tool with 2 parameters and no output schema, the description covers purpose, return structure, usage context (must be previously tested), and disambiguation. It is fully adequate for an agent to select and 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?
Schema description coverage is 100%, so the schema already provides basic descriptions. The description adds value by relating parameters to the prerequisite test_url/test_project process, providing context beyond the schema. This helps the agent understand that the URL must have been tested previously.
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 gets the saved screenshot file path for a previously tested URL in a project. It uses a specific verb 'Get' and resource 'saved screenshot file path', and distinguishes itself from sibling tool screenshot_session by explicitly noting it does not capture a new image.
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 provides explicit usage guidance: use this after test_url/test_project to retrieve the screenshot, and use screenshot_session instead for capturing a new image. This clearly tells when and when not to use the tool, and names the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_dataA
Parse an HTML table into structured data, mapping header cells to each row's values. Returns {headers, rows, total_rows} where rows are header→value objects. Use instead of scraping table markup by hand when verifying tabular content.
| Name | Required | Description | Default |
|---|---|---|---|
| max_rows | No | Max rows to return (default: 100) | |
| selector | No | CSS selector for the table (default: 'table') | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the return format ({headers, rows, total_rows}) and mapping behavior. However, it does not mention potential errors, limitations (e.g., only first table), or performance characteristics.
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 two concise sentences with no extraneous information. It front-loads the main purpose and adds value with usage guidance, making every word earn 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?
The description provides return structure and usage context. With only 3 parameters (all documented), no output schema, and no annotations, it covers the essential aspects. A slight improvement would be to clarify if it handles multiple tables or only the first.
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 schema already documents all parameters. The description adds default values (max_rows:100, selector:'table') which are already in the schema. It provides no additional meaning beyond what the schema offers.
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 ('Parse') and resource ('HTML table into structured data'), clearly distinguishing it from sibling tools like get_page_elements or get_page_html by focusing on tabular content parsing.
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 the tool ('Use instead of scraping table markup by hand when verifying tabular content'), providing clear context. However, it lacks explicit when-not-to-use guidance or alternatives, which would elevate it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_toast_messagesA
Capture currently-visible toast/notification/alert text on a session — checks common patterns ([role=alert], [role=status], [aria-live], .toast, .notification, Toastify, Sonner, Radix) or your own selector. Returns the messages found. Set wait_ms to let a toast animate in first. Use to verify success/error notifications after an action.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_ms | No | Wait this many ms before capturing (lets toast animate in, default: 0) | |
| selector | No | Override default toast selectors with a custom CSS selector | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains the tool checks common patterns and returns messages, but does not explicitly state it is read-only or clarify if any page interaction occurs (e.g., scrolling). The description is adequate but could be more explicit about non-destructiveness.
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 two sentences. The first sentence states the core action and approach, the second explains a parameter and use case. It is front-loaded and every sentence adds value 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 read tool with 3 parameters and no output schema, the description covers purpose, approach, parameter guidance, and a use case. It says 'Returns the messages found', which is minimal but sufficient. Could mention failure cases or empty results, but overall 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 each parameter has a description. The description adds context beyond the schema by explaining when to use wait_ms (animate in) and that selector overrides defaults. This provides practical value for parameter usage.
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 captures toast/notification/alert text, lists common patterns, and gives a specific use case (verify success/error notifications). This distinguishes it from sibling tools like get_page_elements or get_screenshot.
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 says 'Use to verify success/error notifications after an action', providing clear context. It also explains the wait_ms parameter for toasts that animate in. However, it does not explicitly state when not to use or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
handle_dialogA
Arm a one-shot handler for the NEXT JavaScript dialog (alert/confirm/prompt) on a session — accept or dismiss, with optional prompt text. Returns {success}. Must be called BEFORE the action that triggers the dialog, otherwise the dialog blocks the page and times out.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Accept or dismiss the dialog | |
| session_id | Yes | Session ID | |
| prompt_text | No | Text to enter for prompt() dialogs (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses one-shot nature, return format, and timing requirement. Lacks info on multiple calls or no-dialog scenario, but no annotations to contradict.
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, front-loaded with core action. Every sentence adds value 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?
Covers purpose, usage timing, and return. Minor gaps on edge cases (e.g., handler expiration, no dialog) but acceptable given tool simplicity and no 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?
Schema covers all parameters with descriptions (100% coverage). Description adds context on prompt_text purpose but no new parameter-level details 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?
Description clearly states it arms a one-shot handler for JavaScript dialogs, specifying actions (accept/dismiss) and optional prompt text. Unique among sibling 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?
Explicitly states must be called BEFORE the dialog-triggering action, with a consequence if not. Does not specify alternatives, but no sibling tools handle dialogs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interact_and_testB
Execute a multi-step interaction workflow. Supports 25 actions: click, force_click, fill, force_fill, type, select, select_option, wait, wait_for, wait_for_text, screenshot, navigate, hover, press_key, check, uncheck, scroll_to, scroll_within, evaluate_js, drag, right_click, go_back, go_forward, upload_file, wait_for_network. Can work on an existing session or create an ephemeral page.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to open (creates ephemeral page if no session_id) | |
| steps | Yes | Steps to execute. Each step has 'action' and action-specific fields. | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). | |
| run_checks | No | Checks to run after steps complete (visual, accessibility, functionality, seo, performance, geo) | |
| session_id | No | Existing session ID (alternative to url) | |
| capture_console | No | Capture console output/errors emitted during the steps and include them in the result (default: false) | |
| screenshot_after | No | Take a screenshot after all steps complete (default: true) | |
| continue_on_error | No | Continue executing steps even if one fails (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It only mentions session handling and lists actions but omits important behavioral traits such as destructive potential, authentication needs (which are in the schema but not the description), rate limits, or error behavior. The description is insufficient for such a complex tool.
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 very concise: two sentences that front-load the purpose and list actions. Every part is essential and there is no wasted text.
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 (25 actions, 8 parameters, no output schema), the description is too brief. It does not explain how steps are structured, error handling, return values, or common usage patterns. While the schema provides parameter details, the description lacks high-level workflow context needed for full understanding.
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% coverage with detailed descriptions for all parameters. The main description adds a high-level list of actions but does not deepen parameter understanding beyond what the schema provides. Baseline 3 is appropriate as the schema does 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 it is a multi-step interaction workflow and lists all 25 supported actions, making the purpose very specific. It also distinguishes from sibling tools that are single-action (e.g., click_element) by explicitly mentioning the multi-step nature and session handling.
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 multi-step scenarios versus single-action siblings, but it does not explicitly state when to use this tool versus alternatives. It mentions working with existing sessions or ephemeral pages, which provides some context, but lacks clear guidance on exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interactive_loginA
Open a VISIBLE browser window for a human to log in by hand — the way to authenticate flows that can't be automated (2FA/MFA, SSO/OAuth redirects, CAPTCHA, magic links, device confirmation). After you finish logging in, call save_login to capture the session; future headless sessions on the project reuse it. Requires a display on the server (DISPLAY set).
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project name (must exist) | |
| login_url | No | URL to open (optional; defaults to the project's configured login URL or base_url) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully explains behavior: opens visible browser, requires human input, requires display, and session capture via save_login. Could mention consequences if display not set.
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 wasted words. Front-loaded with action verb and 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?
Description covers purpose, usage flow, prerequisite, and follow-up action. Could mention error handling or timeout, but overall complete given no 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?
Schema coverage 100% with descriptions. Description adds minimal extra meaning beyond schema (e.g., project must exist, login_url defaults to configured). 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?
Description clearly states the tool opens a visible browser window for manual login, specifying exact use cases (2FA, MFA, SSO, CAPTCHA, magic links, device confirmation), and distinguishes it from automated login methods.
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 says when to use (non-automated auth flows) and directs to call save_login afterwards. Does not provide explicit 'do not use' conditions but implies automated alternatives. Also mentions system requirement (DISPLAY set).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intercept_networkA
Mock matching API responses on a session — return a custom status/body/content-type for requests whose URL contains a substring. Returns {success}. Use it to force error, empty, or loading states without a real backend; call BEFORE the triggering action, and clear_intercepts to remove. once=true intercepts only the first match.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Response body (JSON string or plain text) | |
| once | No | Only intercept the first matching request (default: false) | |
| method | No | HTTP method filter (optional, e.g. 'GET', 'POST') | |
| status | No | HTTP status code to return (default: 200) | |
| session_id | Yes | Session ID | |
| url_pattern | Yes | Plain substring of the full URL to match (e.g. '/api/tasks', 'graphql') — not a regex or glob. | |
| content_type | No | Content-Type header (default: 'application/json') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes core behavior (mock responses via URL substring, once option) and return value, but omits details like intercept lifetime (until cleared or session ends) and behavior when multiple intercepts match. No annotations provided, so description carries full 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?
Two sentences: first defines purpose, second provides usage guidelines and parameter note. Every sentence is essential and well-structured.
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 purpose, usage, key parameter, and return value. Lacks discussion of error cases or behavior with multiple matches, but sufficient for a mocking tool. No output schema or annotations to supplement.
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. Description adds value by clarifying url_pattern is a plain substring (not regex), explaining the 'once' parameter's effect, and noting defaults.
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 mocks API responses by intercepting network requests matching a URL substring, specifying customizable status, body, and content-type. It distinguishes from siblings like clear_intercepts and emulate_network.
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?
Explicit guidance on when to use (forcing error/loading states), ordering (call before triggering action), and cleanup (clear_intercepts). Also documents the 'once' parameter's purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
List all saved testing projects with their base URL, crawl limits, and configured auth type. Returns an array of project configs (empty if none exist). Use it to discover the project names the other project/auth/testing tools expect.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format: array of project configs (empty if none exist). Since no annotations, the description provides necessary transparency about read-only nature and possible empty result.
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 waste. Front-loaded with purpose, then returns format, then usage hint. Every sentence adds value.
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?
Simple tool with no parameters and no output schema, but description sufficiently explains return value and fields. Could mention if list is paginated, but likely not needed.
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?
No parameters exist, so schema coverage is 100%. Description adds no parameter info, but baseline for 0 params is 4. No additional meaning needed.
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 verb (List), resource (saved testing projects), and data included (base URL, crawl limits, auth type). Differentiates from siblings like get_project (single project) and create_project/delete_project.
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 says 'Use it to discover the project names the other project/auth/testing tools expect.' Provides clear usage context but does not mention when not to use or alternative tools like get_project for single projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reportsA
List saved test reports (the JSON files test_project writes), for one project or all projects. Returns each report's path and timestamp, newest first. Pass a path to get_report to read one.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Project name (optional, lists all if not specified) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations; description discloses listing behavior and output ordering but lacks details on authorization, rate limits, or behavior when no reports exist. Adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundant words, front-loaded with purpose. Highly concise.
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 all essential aspects: what it lists, output format, ordering, and link to reading with get_report. Complete for a simple list 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?
Schema already describes parameter with 100% coverage; description adds little beyond 'for one or all projects', which aligns with 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 verb 'List' and resource 'saved test reports' with scoping (one/all projects) and output format (path, timestamp, newest first). Distinguishes from sibling get_report.
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 tells when to use (list reports) and provides alternative get_report for reading a specific report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sessionsA
List active browser sessions with their session_id, current URL, and idle time. Returns an array (empty if none open). Use it to recover a session id or spot sessions nearing the idle-timeout or the concurrency cap.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description implies a read-only operation but does not explicitly state it's non-destructive or safe. With no annotations, the burden was on the description to disclose behavior; it could be more explicit about 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?
Two concise sentences front-load the purpose and add usage context without any waste. Every sentence adds value.
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 simplicity (no parameters, simple output), the description fully covers return format and use cases. No gaps.
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?
There are zero parameters, so baseline is 4. No additional parameter meaning is needed, and schema coverage is 100%.
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 lists active browser sessions with specific fields (session_id, URL, idle time) and distinguishes from sibling tools like close_session or open_session by its listing nature.
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 explicit use cases: recovering a session ID or spotting idle-timeout/concurrency cap issues. Although it doesn't mention when not to use or alternatives, the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
login_projectA
Execute a project's configured login — submit the form, apply Basic Auth, or inject cookies — and persist the resulting authenticated session (storage_state) for reuse. Requires set_form_login / set_basic_auth / set_cookies first. Returns {success} with login details. Re-run it when auth expires mid-test.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains persistence of session, return of success details, and re-run behavior. Missing minor details like potential side effects (e.g., overwriting existing session), but covers essential behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-loaded with action, prerequisites, and return value. No unnecessary words, each sentence contributes essential information.
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 one parameter, no annotations, and no output schema, the description provides sufficient context: what it does, prerequisites, return value, and a re-use scenario. Completeness is high relative to complexity.
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 a single parameter 'project' described as 'Project name'. The description adds no extra meaning beyond that baseline. Baseline of 3 is appropriate as the schema already documents the parameter adequately.
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 verb 'Execute' and the resource 'project's configured login', specifying methods (form, Basic Auth, cookies) and the key outcome of persisting the session. It distinguishes from siblings by mentioning prerequisites (set_* tools) and re-run on expiry.
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 prerequisites ('Requires set_form_login / set_basic_auth / set_cookies first') and a specific use case ('Re-run it when auth expires mid-test'). Lacks explicit when-not-to-use comparisons with alternatives like interactive_login, but overall guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_interactionA
Click an element and measure how long until the result settles. Returns elapsed_ms, a 'measures' note stating exactly what was timed, and the click's real interaction_to_next_paint_ms when measurable. Three modes: wait_for_network (URL substring) measures until that response completes — use this for buttons whose handler fires a request asynchronously, where plain network-idle settles early and under-measures; wait_for (selector) measures until it appears; default measures to the first network-idle window.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector of element to click | |
| wait_for | No | CSS selector to wait for (optional) | |
| session_id | Yes | Session ID | |
| wait_for_network | No | URL substring — measure until the matching response completes (armed before the click, so fast responses aren't missed). Plain substring, not a regex. Prefer this for async submit/save buttons. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the burden. It discloses return values (elapsed_ms, measures, interaction_to_next_paint_ms) and explains three modes and their behaviors, including a warning about fast responses. However, it does not explicitly mention side effects of the click or whether it is read-only.
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 paragraph that is well-structured with three modes listed, informative but not overly concise; it could be slightly more terse.
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 explains return values. It covers three modes thoroughly, handles complexity of timing, and is complete for a tool with 4 params (2 required).
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%. The description adds context to parameters: for wait_for it says 'measure until it appears', and for wait_for_network it explains the timing mechanics and arms before click. This adds meaning beyond 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 clearly states it clicks an element and measures time until result settles, and distinguishes three modes. It is specific and distinct from sibling tools like click_element, wait_for_network, etc.
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 tells when to use each mode: 'use this for buttons whose handler fires a request asynchronously', 'measure until it appears', and 'default measures to the first network-idle window'. It also contrasts with plain network-idle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_sessionA
Open a persistent browser session and return {session_id, url, title, screenshot}. The page stays alive across tool calls so you can explore, click, fill, debug, and accumulate console/network logs — the main workflow for anything multi-step. Pass project to share its authenticated context; headed=true opens a visible window. Sessions expire after idle timeout, so close_session when done.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to open | |
| headed | No | Open a VISIBLE browser window instead of headless (default: false). Requires a display on the server. Use when you want to watch or hand-drive the session. | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses persistence, idle timeout, shared vs. isolated context, and the need to close. It does not mention potential side effects like display requirement for headed mode (described in schema) or rate limits, but overall provides good behavioral context.
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, front-loaded with the primary action and return value. Every sentence adds essential information: purpose, persistence, parameter guidance, and cleanup. No redundant or filler content.
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 (session management) and no output schema, the description covers key aspects: return format, persistence, sharing, headed mode, timeout, and cleanup. It does not detail post-session navigation or log retrieval, but these are covered by sibling tools. It is sufficiently complete for an agent to understand and use 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 baseline is 3. The description adds value by explaining the effect of 'project' (shared authenticated context) and 'headed' (visible window), which enriches the schema's basic descriptions. 'url' is straightforward, but the added context 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 uses a specific verb ('Open') and resource ('persistent browser session') and clearly states the return values. It distinguishes from sibling tools by emphasizing that the page stays alive for multi-step workflows, which is unique among the sibling list (e.g., close_session, navigate_session).
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 provides clear context: use for multi-step workflows, pass 'project' for shared authenticated context, use 'headed' for visible windows, and close_session when done. It implies when to use but does not explicitly state when not to use or name alternatives, though the sibling tools cover single-step actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_stateA
Named page-state checkpoints. action=snapshot saves URL + cookies + storage + DOM signature under a name; action=restore navigates back to it and restores cookies/storage; action=diff compares the current DOM against the snapshot (added/removed/changed elements + tag count changes). Enables testing multiple paths from the same starting point.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Checkpoint name | |
| action | Yes | snapshot = save, restore = return to it, diff = compare current DOM vs it | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It explains the three actions but does not disclose potential side effects (e.g., restore will navigate the page, possibly losing current state) or error conditions (e.g., what happens if the snapshot name doesn't exist). The description is moderately transparent but leaves gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loading the concept ('Named page-state checkpoints') and then detailing the actions and use case. Every sentence adds value, with no 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 absence of an output schema and the presence of enums, the description adequately explains the tool's functionality. However, it could be more complete by mentioning error handling (e.g., missing snapshot) or the format of diff output. Overall, it provides sufficient context for an AI agent to use the tool effectively.
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 covers all three parameters with 100% coverage, including enum descriptions. The description adds meaningful context beyond the schema by elaborating what each action does in detail (e.g., 'snapshot saves URL + cookies + storage + DOM signature'). This extra info justifies a score above 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 clearly states that the tool manages named page-state checkpoints with three distinct actions (snapshot, restore, diff). It specifies exactly what each action does (saves URL/cookies/storage/DOM signature, navigates back, compares DOM), distinguishing it from sibling tools that perform individual operations like get_cookies or get_page_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 provides a use case: 'Enables testing multiple paths from the same starting point.' However, it lacks explicit guidance on when to use this tool versus alternatives (e.g., using separate tools for cookies, storage, and DOM), and does not mention when not to use it or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
periscope_systemA
Install status, self-update, and the current agent guide — Periscope's self-maintenance tool. action='status' (read-only): running version vs on-disk version, git commit, install type, capabilities (Node/Lighthouse, display for headed, Chromium), active session count, and whether an update is available. action='agents_md' (read-only): returns the CURRENT AGENTS.md so you can refresh a stale pasted copy of your operating guide. action='update': dry-run by default (commits behind + incoming changes); apply=true runs the updater (git pull + deps, data/ untouched) — new code loads only after the MCP server restarts, and the response says so explicitly. Managed installs (Docker, no .git) refuse update with guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| apply | No | For action='update': actually run the update instead of the dry-run check (default: false) | |
| force | No | For action='update' with apply=true: auto-stash local modifications first (update.sh --force) | |
| action | No | status = install/version/capabilities report (default); update = check or apply an update; agents_md = fetch the current agent guide |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It thoroughly describes behavior: 'status' and 'agents_md' are read-only, 'update' is dry-run by default, apply=true runs updater but new code loads only after restart, and managed installs refuse update with guidance. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but well-structured: a summary sentence followed by bullet points for each action. It is front-loaded and contains no unnecessary details. Slightly verbose but efficient.
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 compensates by explaining return values for 'status' (version, capabilities, etc.) and 'agents_md', and the behavior for 'update'. It covers all three parameters and is complete for a system maintenance 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?
Schema coverage is 100% (baseline 3), but the description adds value by explaining each action's behavior and the context for 'apply' and 'force' parameters. For example, it clarifies that 'apply' defaults to false and 'force' is for auto-stashing modifications.
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 it is a self-maintenance tool for install status, self-update, and fetching the agent guide. It lists three distinct actions ('status', 'agents_md', 'update') each with specific details, making it distinct from sibling tools which are all about testing and web interaction.
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 maintenance tasks such as checking version, updating, or refreshing the agent guide. It does not explicitly state when not to use or compare to alternatives, but the context of sibling tools makes the use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_sessionA
Run a sequence of steps while recording a video of the browser (Playwright video capture). Returns the saved .webm file path. Steps use the same format as interact_and_test. Use it to produce a visual artifact or repro of a workflow; for assertions/checks use interact_and_test instead.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to open | |
| steps | Yes | Steps to execute (same format as interact_and_test). | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description bears burden. It explains recording video, return format, and step compatibility. Could mention session management or side effects, but overall 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 efficient sentences: first states purpose, second clarifies steps format, third provides usage guidance. No unnecessary words.
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 output, steps format, project behavior. Lacks potential limits like max recording length or error handling, but adequate given schema coverage.
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 covers all 3 params with descriptions. Description adds value by clarifying steps format (same as interact_and_test) and project parameter behavior (shared vs isolated context).
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?
Description clearly states the tool runs steps while recording a video and returns .webm file path. It distinguishes from interact_and_test by specifying that it's for visual artifact/repro, not assertions.
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 says to use for visual artifact/repro and to use interact_and_test for assertions/checks, providing direct contrast and guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_checks_on_sessionA
Run the audit checks (visual/accessibility/functionality/seo/performance/geo) against a session's CURRENT page — after your interactions, without opening a new page (unlike test_url). Returns the same {issues[], per-check results} structure as test_url. Use to audit a state you reached by clicking/filling.
| Name | Required | Description | Default |
|---|---|---|---|
| checks | No | Check types to run (default: all) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions the tool does not open a new page but does not explicitly state whether the operation is read-only or has side effects. While auditing is typically non-destructive, the lack of affirmative safety disclosure is a gap, though the description's emphasis on 'audit' implies no mutation.
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 two sentences, front-loading the core purpose and then adding usage context. No redundant words; every sentence adds value. It is structured for quick comprehension.
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 absence of an output schema and annotations, the description covers the essential aspects: what the tool does, when to use it, what checks are available, and the return structure (referencing test_url). It could be more self-contained by detailing the return format, but referencing a sibling tool is acceptable. Error conditions are not mentioned, but the description is otherwise complete for its complexity.
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 lists the check types (visual, accessibility, etc.) similarly to the schema's enum, and notes the default is all checks. It does not add new meaning beyond what the schema provides, though it reinforces the expected values.
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 runs audit checks (visual/accessibility/functionality/seo/performance/geo) against the current page in a session, distinguishing itself from the sibling tool test_url by noting it does not open a new page. The verb 'run' and resource 'audit checks on a session's current page' are specific and 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 explicitly states when to use it: 'after your interactions' and 'to audit a state you reached by clicking/filling.' It also contrasts with test_url, telling the agent not to use this tool when a new page needs to be opened. This provides clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_lighthouseA
Run a real Google Lighthouse audit against a URL. Returns 0-100 category scores, Core Web Vitals lab metrics (LCP, TBT, CLS, Speed Index), and the failed audits, and saves the full JSON report. Requires Node.js — finds it on PATH or auto-detects nvm installs (~/.nvm); if none exists, returns the exact nvm install commands. Launches its own headless Chrome: no session or project auth state applies.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to audit | |
| device | No | Emulation preset (default: mobile, like Lighthouse's default) | |
| timeout | No | Max seconds to wait (default: 180) | |
| categories | No | Categories to audit (default: all four) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully discloses that the tool launches its own headless Chrome, ignores session/auth state, and handles Node.js detection along with failure recovery commands. Since no annotations are provided, this transparency is critical and well-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?
The description is highly concise, front-loads the main purpose, and each sentence adds value—covering behavior, prerequisites, return values, and error handling 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?
Given the complexity of running Lighthouse (Node.js, Chrome), the description covers essential context: return values, metrics, Chrome isolation, and setup requirements. The lack of an output schema is compensated by detailing what is returned (scores, metrics, failed audits, saved report).
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 4 parameters have clear descriptions in the input schema (100% coverage). The description adds context about the tool's outputs but does not augment the meaning of individual parameters beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs a real Google Lighthouse audit against a URL, returning scores, Core Web Vitals, and saving a full JSON report. It has no clear sibling duplicates; among many session/tool/test tools, this one is uniquely identified.
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 explains prerequisite (Node.js) and behavior (headless Chrome, no session/auth), as well as auto-detection and error recovery. It does not explicitly state when to avoid use, but the context is sufficient for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_loginA
Capture the authenticated session (cookies + localStorage) from an in-progress interactive_login, save it to the project, and close the visible window. The project then opens authenticated sessions headlessly. Re-run interactive_login when the session expires.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project name with an interactive_login in progress |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears disclosure. It reveals key behaviors: saving cookies and localStorage, closing the visible window, enabling headless authenticated sessions, and the need to re-run interactive_login on expiration. It does not detail failure modes or overwrite behavior, but is sufficiently transparent.
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 waste. The first sentence encapsulates the core actions (capture, save, close), and the second provides the outcome and lifecycle. 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 simple tool with one parameter and no output schema, the description gives a complete picture: what it does, how it affects the session, and the follow-up action. It is thorough enough for an agent to understand the tool's role.
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 100% of the single parameter with a clear description. The tool description reinforces that the project must have an interactive_login in progress, which adds context but does not substantially exceed the schema's information. Baseline 3 with slight added value.
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 captures cookies and localStorage from an in-progress interactive_login, saves it, and closes the window – a specific verb+resource action. It distinguishes from sibling tools like interactive_login (initiates login) and close_session (only closes without saving).
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 says to use it when there is an in-progress interactive_login and mentions re-running interactive_login when the session expires, providing clear usage context. It does not explicitly exclude alternatives, but the sibling set implies close_session for just closing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshot_sessionA
Screenshot the session's current page as-is — no actions performed. Returns the image path (full-page by default; full_page=false captures just the viewport). Full-page captures are PREPARED for fidelity: sticky/fixed headers are neutralized (no mid-page duplication), animations disabled, reduced-motion emulated, and scroll-reveal sections forced visible — the applied steps are reported in capture_prep. Pass raw=true to capture the unprepared stitch. Use to grab state at a point in a workflow; interactive tools already return screenshots, so don't call this after every step.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Skip full-page capture preparation (sticky neutralization, reveal forcing) and capture the raw Playwright stitch (default: false). Only affects full-page captures. | |
| selector | No | Clip to one element: screenshot just the first match (for citing evidence). Overrides full_page. | |
| full_page | No | Capture full scrollable page (default: true) | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses behavior: it prepares captures by neutralizing sticky headers, disabling animations, emulating reduced motion, forcing scroll-reveal sections visible, and reports these in capture_prep. It also explains the raw parameter for unprepared stitches. This is comprehensive and transparent.
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 with no redundancy. It front-loads the purpose, then explains options, behavior, and usage guidance in a logical flow. Every sentence adds distinct value.
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 description covers purpose, usage, behavior, and parameter semantics adequately for a 4-parameter tool with no output schema. It mentions return value (image path) but does not detail error conditions or prerequisites beyond an implicit active session. Still, it is largely 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% and parameters are already well-described. The description adds minor but useful context, e.g., 'for citing evidence' for selector and clarifying raw's effect on full-page captures. This justifies a baseline 3 plus incremental value.
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 it screenshots the session's current page as-is, with 'no actions performed.' It distinguishes from interactive tools that already return screenshots, and specifies full-page vs viewport capture. The verb and resource are specific and 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 explicitly says 'use to grab state at a point in a workflow' and warns 'don't call this after every step' because interactive tools already return screenshots. This provides clear when-to-use and when-not-to-use guidance, effectively distinguishing it from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scroll_into_viewA
Scroll an element into the viewport without clicking it. Returns {success}. Use to trigger lazy-loaded content/images or to bring a section into view before screenshotting.
| Name | Required | Description | Default |
|---|---|---|---|
| observe | No | What to return about the resulting page. 'screenshot' (default): full-page image. 'none': structured result only, no image — cheapest, use through setup steps of a flow. 'map': semantic page map (get_page_map — token-light, best for 'what can I do next?'). 'checks': run_checks_on_session output (a11y/seo/perf/etc.). | screenshot |
| selector | Yes | CSS selector of element to scroll to | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states the action is scroll-only and returns {success}, which is sufficient for a simple non-destructive action. But it does not disclose edge cases like element not found or already in view.
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: one stating the core function, the other providing usage examples. No unnecessary words, front-loaded key information.
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 simplicity and no output schema, the description is fairly complete: it states the return value and typical use cases. It could be slightly improved by noting what happens if the selector fails, but overall adequate.
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 schema already describes all parameters adequately. The description adds no extra detail about parameters, so a baseline score 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 action ('Scroll an element into the viewport') and distinguishes it from clicking. It also provides specific use cases (lazy-loaded content, scrolling before screenshotting), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contexts for use (trigger lazy load, before screenshot), which helps the agent decide when to apply this tool. However, it does not explicitly state when not to use it or mention any alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_iframeA
Switch into an iframe and return a NEW session id scoped to that frame's content — use it like a normal session for elements inside the iframe, and keep the parent id for page-level actions. Close the returned session when done. Needed because cross-frame content isn't reachable through the parent session's selectors.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector for the iframe element | |
| session_id | Yes | Parent session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden and discloses key behaviors: it returns a new session ID, the parent session remains active, and the returned session must be closed. It does not mention error cases (e.g., iframe not found, nested iframes), but overall it provides sufficient transparency for typical use.
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 (three sentences) and front-loaded with the main action. Every sentence adds value: the first explains what the tool does, the second gives usage instructions, and the third explains the necessity. No wasted words.
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 and the absence of an output schema, the description covers purpose, usage, return value, cleanup, and rationale. It lacks error handling details but is complete enough for an agent to use correctly. The presence of many sibling session tools makes the distinction valuable.
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 both parameters described. The description adds meaning by clarifying that session_id is the parent session ID and that the tool returns a new session ID for the iframe. Though it does not explicitly reiterate schema fields, it integrates parameter roles into the narrative, providing context 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 clearly states the tool's purpose: switching into an iframe and returning a new session ID scoped to that iframe's content. It uses specific verbs and resources, and distinguishes itself from sibling tools like open_session or navigate_session by explaining the iframe-scoping behavior.
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 provides explicit guidance: use the returned session for elements inside the iframe, keep the parent session for page-level actions, and close the returned session when done. It also explains why this tool is necessary (cross-frame content unreachable via parent selectors), helping the agent decide when to use it over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_optionA
Select an option from a native or a custom dropdown (Radix/shadcn combobox), auto-detecting which. Choose by value, label, or index. Returns {success} and the resulting selection. For custom dropdowns it opens the menu and clicks the matching option — use this rather than click+click. When a page has several attribute-less elements, pass element_index to target the Nth match of the selector (Playwright '>>' syntax is not supported).
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Option index to select (0-based) | |
| label | No | Option label text to select | |
| value | No | Option value to select | |
| observe | No | What to return about the resulting page. 'screenshot' (default): full-page image. 'none': structured result only, no image — cheapest, use through setup steps of a flow. 'map': semantic page map (get_page_map — token-light, best for 'what can I do next?'). 'checks': run_checks_on_session output (a11y/seo/perf/etc.). | screenshot |
| selector | Yes | CSS selector for the <select> or combobox trigger (plain CSS only — no Playwright '>>' syntax) | |
| session_id | Yes | Session ID | |
| element_index | No | Which match of 'selector' to target, 0-based (default: 0). Use for the 2nd/3rd attribute-less <select> on a page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Discloses auto-detection, menu opening for custom dropdowns, and Playwright syntax limitation. But omits error handling (e.g., option not found), prerequisites (element visible), and safety implications.
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?
Four sentences with no wasted words. Front-loaded with purpose and method, then key behaviors. Efficient and well-organized.
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 most aspects: how to specify option, targeting multiple elements, observe parameter, and selector limitation. Missing clarifications on exclusive usage of option parameters and detailed return structure. Adequate for a tool with 7 params and no 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?
Schema coverage is 100%, baseline 3. Description adds context for selector (no '>>' syntax) and element_index (use for attribute-less selects). For option parameters, it only restates what schema says, adding minimal value.
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 the verb 'select', resource 'option from a native <select> or custom dropdown', and specifies methods: by value, label, or index. Distinguishes from sibling tools like click_element by emphasizing it handles both native and custom dropdowns.
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 says to use this tool rather than click+click for custom dropdowns, and advises using element_index when multiple attribute-less <select> elements exist. However, lacks explicit exclusions or alternatives for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_pageA
Adopt a popup or new tab this session opened (window.open, target=_blank, OAuth/payment windows) as a NEW session id you can drive with every normal tool — clicks, assertions, logs. Console/network recording attaches the instant the driver sees the popup open, so early traffic is captured (requests firing in the popup's first milliseconds can precede any driver's visibility — a browser-automation limit, not a periscope one). Returns {session_id, url, title}; with several popups open, call without index to list them first. The parent session keeps working for the original tab.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Which open popup to adopt, 0-based (omit when only one is open, or to list them) | |
| session_id | Yes | Root session that opened the popup |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full responsibility. It discloses that console/network recording attaches instantly but notes a limitation about early traffic. It also mentions the return structure. It does not cover permissions or error conditions, but the key behaviors are 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 a single focused paragraph that front-loads the primary action. Every sentence adds information, including a technical limitation. No 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?
Given no output schema, the description specifies return values (session_id, url, title). It covers behavior, usage, and a limitation, making it complete for a tool of moderate complexity.
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%, but the description adds useful context beyond schema: for the index parameter, it explains 'call without index to list them first'. This aids proper usage.
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 purpose: 'Adopt a popup or new tab... as a NEW session id you can drive with every normal tool'. It distinguishes itself from sibling tools like open_session and navigate_session by specifying it handles popups and new tabs, which is unique.
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 for when to use: when a popup or new tab is opened. It instructs to call without index to list multiple popups. It does not explicitly state when not to use, but the purpose is specific enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_reportA
Generate a human-readable dossier of EVERYTHING done this server run — every tool call in chronological order with arguments (secrets redacted), pass/fail verdicts, timings, error messages, and embedded screenshot thumbnails — as a self-contained HTML file plus a PDF. Made for handing to your user to review the whole session; add your findings via 'notes' so the report opens with your summary. The journal records automatically from server start; clear=true resets it after reporting (e.g. between test rounds).
| Name | Required | Description | Default |
|---|---|---|---|
| No | Also render a PDF via headless Chromium (default: true) | ||
| clear | No | Reset the journal after generating (default: false) | |
| notes | No | Your summary/findings narrative — rendered as an 'Agent notes' panel at the top | |
| title | No | Report title (default: 'Periscope session report') | |
| include_screenshots | No | Embed screenshot thumbnails (default: true; originals are always linked) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: generates HTML and PDF, includes screenshots, redacts secrets, resets journal with clear, and notes appear at top. It also mentions that the journal records automatically from server start. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph of about 4 sentences, front-loaded with purpose. It is concise and includes necessary details without redundancy. Could benefit from slight structuring, but overall effective.
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 complex tool with 5 parameters and no output schema, the description explains the output format (HTML+PDF) and content (verdicts, timings, errors, screenshots). It also covers the clearing mechanism. It is complete enough for an agent to understand the tool's behavior and expectations.
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%, and the description adds significant meaning beyond the schema: explains overall purpose, that notes appear top, that clear resets journal, and that screenshots are embedded thumbnails. The schema descriptions are already clear, but the description integrates them into the tool's context.
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 generates a human-readable dossier of everything done in the server run, including tool calls, arguments redacted, verdicts, timings, errors, and screenshot thumbnails. It distinguishes itself from siblings like get_report by specifying it covers all calls and produces HTML+PDF.
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 it is for handing to the user to review the whole session and suggests adding findings via notes. It also explains the clear=true usage 'between test rounds'. However, it does not explicitly state when not to use it vs alternatives like get_report, but the context makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_basic_authA
Configure HTTP Basic Auth credentials for a project — the browser sends them on every request in that project's context. Stored, not executed: call login_project to apply, then pass project to your sessions. Returns {success}. Use for browser Basic-Auth prompts, not HTML login forms (use set_form_login for those).
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project name | |
| password | Yes | Basic auth password | |
| username | Yes | Basic auth username |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description discloses that credentials are stored not executed, and requires a separate call to login_project. It also specifies the return value. This is transparent, though could mention overwrite behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. Front-loaded with the core purpose, followed by important usage notes and distinctions. Every sentence provides value.
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 simplicity (3 params, no output schema) and the sibling tools, the description covers key aspects: storage vs execution, return type, and usage distinction. Missing details like overwrite behavior are minor.
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. Description adds context that the browser sends credentials on every request in the project's context, which enhances understanding 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?
Description clearly states the verb 'Configure' and resource 'HTTP Basic Auth credentials for a project'. It distinguishes itself from set_form_login, which handles HTML login forms, providing clear differentiation.
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: for browser Basic-Auth prompts. Clearly indicates what not to use for: HTML login forms, directing to set_form_login. Also instructs to call login_project to apply credentials.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_cookiesA
Seed a project with session cookies to skip an interactive login (e.g. cookies copied from a logged-in browser). Each cookie needs name+value+domain (path defaults to '/'). Stored, not executed: call login_project to inject them. Returns {success}.
| Name | Required | Description | Default |
|---|---|---|---|
| cookies | Yes | List of cookies with name, value, domain (and optionally path, defaults to '/'). Playwright requires a domain+path pair to inject them. | |
| project | Yes | Project name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description discloses that cookies are stored, not injected, and that Playwright requires domain+path pair. This adds useful behavioral context beyond the schema.
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, front-loaded with purpose, then key details. No wasted words.
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?
Despite no output schema, description mentions return {success}. Covers purpose, parameters, behavior, and distinguishes from many sibling tools. Complete for the task.
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%, but description adds meaning: default path '/', each cookie needs name+value+domain, and Playwright requirement. This enhances 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?
Description uses specific verb 'seed' and resource 'project with session cookies', clearly stating its purpose to skip interactive login. It distinguishes from siblings like get_cookies or login_project by stating it stores cookies for later injection via login_project.
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 says 'Stored, not executed: call login_project to inject them', providing clear when-to-use and alternative. Also gives context: cookies copied from a logged-in browser.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_form_loginA
Configure username/password form login for a project (stored, not executed yet). For standard HTML login forms; field/submit selectors are auto-detected but can be overridden. Returns {success}. Call login_project afterwards to actually log in. For 2FA/SSO/CAPTCHA use interactive_login instead.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project name | |
| password | Yes | Login password | |
| username | Yes | Login username or email | |
| login_url | Yes | URL of the login page | |
| submit_selector | No | CSS selector for submit button (optional) | |
| password_selector | No | CSS selector for password field (optional) | |
| username_selector | No | CSS selector for username field (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It discloses that config is stored not executed, returns {success}, and selectors are auto-detected but overridable. Lacks mention of error conditions.
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, front-loaded with purpose, no superfluous text. Each sentence adds value.
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 purpose, usage order, and alternatives. No output schema, but return value is simple. Could mention prerequisites like project existence, but adequate given complexity.
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 has 100% coverage with descriptions, but description adds context about auto-detection and overriding of selectors, going 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?
The description clearly states it configures username/password form login, distinguishes from 'interactive_login' and 'login_project', and specifies stored not executed.
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 says use for standard HTML login forms, tells to call 'login_project' afterwards, and suggests 'interactive_login' for 2FA/SSO/CAPTCHA.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_local_storageA
Write key/value entries to a session page's localStorage (or sessionStorage), optionally clearing existing entries first. Returns {success}. Use to seed client state (feature flags, tokens, cached data) to reproduce a specific app state; reload if the app reads storage only at load time.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | Key-value pairs to set (e.g. {"theme": "dark", "token": "abc"}) | |
| storage | No | Storage type (default: 'local') | |
| session_id | Yes | Session ID | |
| clear_first | No | Clear all entries before setting new ones (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes core behavior (write, optionally clear, return {success}) and a reload caveat. With no annotations, description carries full burden. Minor omissions: does not clarify overwrite vs merge behavior for existing keys, nor specify allowed value types in entries.
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. First sentence states action; second provides use context and a caveat. No redundant information, well 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 4 parameters and no output schema or annotations, description covers purpose, usage, and a behavioral note. Lacks explicit overwrite semantics and session context, but is sufficient for most testing use cases.
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 parameter descriptions already present. Description adds marginal value: mentions return value and use case, but does not elaborate on parameter details beyond what schema provides. Baseline adjusted to 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?
Description clearly states 'Write key/value entries to a session page's localStorage (or sessionStorage)' with a specific verb and resource. It distinguishes from sibling get_local_storage by focusing on write behavior.
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 says 'Use to seed client state... reload if the app reads storage only at load time', providing clear context for when to use. Lacks explicit exclusions or references to alternative tools like set_cookies, but the guidance is adequate for typical testing scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_viewportA
Resize a session's viewport to a device preset or custom width/height, then screenshot. Returns the new size and screenshot. Persists for later actions in the session — use this to test responsive layouts inside an ongoing session (unlike test_responsive, which opens throwaway pages).
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Viewport width in pixels (custom size) | |
| device | No | Device preset: mobile_sm (320x568 iPhone SE), mobile (375x812 iPhone 12), mobile_lg (428x926 iPhone 14 Pro Max), tablet (768x1024 iPad), tablet_lg (1024x1366 iPad Pro), laptop (1366x768), desktop (1920x1080), desktop_lg (2560x1440) | |
| height | No | Viewport height in pixels (custom size) | |
| observe | No | What to return about the resulting page. 'screenshot' (default): full-page image. 'none': structured result only, no image — cheapest, use through setup steps of a flow. 'map': semantic page map (get_page_map — token-light, best for 'what can I do next?'). 'checks': run_checks_on_session output (a11y/seo/perf/etc.). | screenshot |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It discloses that the resize persists for later actions and returns the new size and screenshot. It lacks details on potential side effects (e.g., invalid parameters), but is otherwise transparent.
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 two sentences with zero waste. The first sentence states the core action and outcome, the second provides usage context and sibling differentiation. Every sentence is essential.
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 explains the return (new size, screenshot). It also covers persistence. With 5 parameters, it provides enough context for an agent to use the tool effectively.
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%, baseline 3. The description adds value by explaining device presets with dimensions and elaborating on the observe parameter options (screenshot, none, map, checks), which goes beyond the schema's enum description.
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 resizes a viewport and takes a screenshot. It distinguishes itself from sibling tool 'test_responsive' by noting that this resizes an ongoing session while the sibling opens throwaway pages.
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 to use this to test responsive layouts inside an ongoing session and contrasts it with test_responsive, which opens throwaway pages, providing clear when-to-use and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_dark_modeA
Emulate prefers-color-scheme (dark or light) on a session and screenshot the result. Returns the screenshot. Use to verify a site's dark/light theming without touching OS settings; the emulation persists for later actions in the session.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Color scheme to emulate | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses key behaviors (persistence, screenshot return) but lacks details about potential side effects, limitations, or required browser support. For a simple emulation tool, the disclosure is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The first sentence states the action and output, the second provides usage context and persistence. Every word 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 two parameters and no output schema, the description covers the essential details: purpose, return value, and persistence. However, it omits specifics about the screenshot format (e.g., base64, file) and potential limitations. Still, it is sufficiently complete for typical use.
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 both parameters (mode enum, session_id). The description adds context by stating 'on a session' and explaining the mode purpose, but does not add significant new information beyond what the schema already 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?
The description uses specific verbs ('Emulate' and 'screenshot') and clearly identifies the resource ('prefers-color-scheme (dark or light)'). It distinguishes this tool from siblings like set_viewport or check_color_contrast by specifying the exact color scheme emulation.
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 the tool ('to verify a site's dark/light theming without touching OS settings') and notes that emulation persists for later actions. It implies context but does not explicitly mention when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_form_validationA
Audit a page's form validation: locate forms, list their required fields, and collect messages from :invalid fields and custom error elements. Returns the per-form field/validation details. Use to verify client-side validation behaves as intended. Works on a session or a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to test (use this or session_id) | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). | |
| session_id | No | Session ID (use this or url) | |
| form_selector | No | CSS selector to target specific form(s) (default: 'form') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavior: locate forms, list required fields, collect messages, and return details. It implies read-only audit without 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?
Three sentences front-load the purpose, action, return, and use case. 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 tool with no output schema, the description adequately describes return type and usage. It could be more complete with error handling, but overall 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?
Schema description coverage is 100% and includes detailed parameter explanations. The tool description adds no new parameter semantics 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 clearly states the tool audits form validation, lists required fields, and collects error messages. It distinguishes itself from sibling tools like auto_fill_form and fill_form by focusing on audit rather than filling.
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 says 'Use to verify client-side validation behaves as intended,' providing clear context. However, it does not explicitly mention when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_projectA
Full-site audit: crawl every page (up to max_pages) and run the selected checks on each, saving a timestamped JSON report. The crawl is deterministic + sitemap-seeded, so consecutive runs cover the same pages and before/after comparisons are reliable (issue #22). Returns per-page issues, site-wide findings (e.g. duplicate titles/descriptions), an auth_check, pages_not_tested[] when the cap is hit, and a coverage delta (pages_added/pages_dropped) vs the previous report. Pages that bounce to the login page come back as auth_lost, never as fake success. Reload the saved report with get_report.
| Name | Required | Description | Default |
|---|---|---|---|
| checks | No | Types of checks to run | |
| project | Yes | Project name | |
| max_pages | No | Override max pages. 0 = audit the WHOLE site (unbounded, stops at a 2000-page safety ceiling and flags ceiling_hit). | |
| use_sitemap | No | Seed the crawl from sitemap.xml / robots.txt when present (default: true). Set false for pure link-crawl. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Details deterministic crawling, sitemap-seeding, return values including edge cases like auth_lost and pages_not_tested, and safety ceiling for max_pages=0.
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 that front-load purpose and each sentence adds critical information without waste.
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?
Comprehensive for a tool with no output schema; covers purpose, parameters, return types, edge cases, and mentions related tool for reloading.
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 3; description adds value by explaining behavior like auth_lost and deterministic crawl, raising 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?
Clearly states 'Full-site audit' with specific verb 'crawl' and 'run checks', distinguishing from siblings like 'crawl_project' by emphasizing saving a report and deterministic behavior.
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 context for reliable before/after comparisons, but does not explicitly state when not to use or list alternatives beyond mentioning get_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_responsiveA
Load a URL at several viewport sizes (default mobile 375x812, tablet 768x1024, desktop 1920x1080) and screenshot each, optionally running checks per size. Returns each viewport's screenshot path and any issues. Catches layout breakage across breakpoints in one call. Pass custom viewports as [{name,width,height}].
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to test | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). | |
| viewports | No | Custom viewports [{name, width, height}]. Default: mobile (375x812), tablet (768x1024), desktop (1920x1080) | |
| run_checks | No | Checks to run at each viewport |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses screenshots, optional checks, and custom viewports, but omits side effects: does it navigate the current session? Does it close after? Does it clear state? The project parameter explains shared vs isolated context, but overall behavioral details (e.g., does it modify cookies?) are missing.
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?
Four concise sentences, each adding unique value: action, return value, core benefit, customization. No redundant or extraneous text. Leads with the primary function.
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 and four parameters, the description covers all parameters and the return type. However, it lacks integration context (does it open a new session? Is it a standalone test?) and details about how checks are performed or how results are structured. Could be more thorough for a complex multi-step 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?
Schema coverage is 100%, but description adds significant value: lists default viewports, explains project's shared/isolated context, and describes run_checks allowed values. This enriches the schema's minimal descriptions, especially for 'project' and 'viewports'.
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 it loads a URL at multiple viewports, screenshots each, and optionally runs checks. It distinguishes from siblings like 'get_screenshot' (single viewport) and 'set_viewport' (only sets viewport) by emphasizing testing across breakpoints in one call. The verb 'test' implies a testing action beyond just taking screenshots.
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 responsive layout testing ('catches layout breakage across breakpoints') but does not explicitly state when to use this tool versus alternatives like 'get_screenshot' for a single viewport or 'run_checks_on_session' for existing sessions. No exclusions or alternative references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_urlA
Screenshot and audit a single URL in one shot (opens then closes a throwaway page). Runs the selected checks — visual, accessibility, functionality, seo, performance, geo — and returns {status, title, screenshot path, issues[]} where each issue has type/severity/message; never-idle pages come back flagged (wait_downgraded), not as errors. Pass project for authenticated pages. For multi-step flows or repeated checks on one page, use a session instead.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to test | |
| checks | No | Types of checks to run (visual, accessibility, functionality, seo, performance, geo). Default: all | |
| project | No | Project name (optional). With a project: runs in its shared, authenticated context. Without: runs in an isolated context (no shared cookies/login). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description bears full burden. It discloses that a throwaway page is used and closed, and that never-idle pages are flagged (wait_downgraded) not errors. It also explains authentication context differences with/without project. Could mention failure modes but overall well-transparent.
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 multi-sentence but each sentence adds value. It is well-structured: core function first, then behavior, return format, parameter usage, and alternatives. Not overly verbose, but could be slightly more concise.
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, description explains return structure (status, title, screenshot path, issues with details). It also covers edge cases like never-idle flags. However, it omits potential error conditions (invalid URLs, timeouts). Overall adequate for the tool's complexity.
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 description adds value beyond schema. It elaborates on checks types and explains the project parameter's effect on authentication context, enhancing understanding beyond the schema's terse 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 clearly states the tool's purpose: screenshot and audit a single URL in one shot, opening and closing a throwaway page. It specifies the verb (screenshot and audit), resource (URL), and distinguishes from siblings like run_checks_on_session by emphasizing the one-shot nature.
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 provides explicit guidance: use for a single URL with optional checks, pass project for authenticated pages, and for multi-step flows or repeated checks use a session instead. This clearly differentiates from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileA
Set file(s) on an element by path, without the OS file picker. Returns {success}. Provide absolute paths that exist on the server. For a picker opened by a button, target the underlying file input's selector.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | File paths to upload | |
| selector | Yes | CSS selector for the file input | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description adds context by mentioning the return value {success} and the requirement for absolute paths that exist on the server. It doesn't fully disclose error behavior or side effects, but it covers essential behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each adding unique value: the first states the main purpose, the second provides a specific usage tip. No waste 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?
Given the absence of an output schema and annotations, the description adequately covers the tool's behavior, return value, and a key precondition. Missing details about failure modes but sufficient for typical use.
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 describes the parameters (100% coverage), but the description adds meaningful guidance like 'Provide absolute paths that exist on the server' for files and 'target the underlying file input's selector' for selector, enhancing understanding 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 clearly states the verb 'Set file(s)' and the resource '<input type="file"> element by path', distinguishing it from siblings like click_element. It uniquely focuses on uploading without the OS file picker.
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 mentions using absolute paths and targeting the underlying file input's selector for pickers opened by buttons, providing clear guidance on when to use this tool. However, it doesn't explicitly state when not to use it or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
visual_checkA
Named visual-regression baselines — no screenshot-path bookkeeping. action='set' captures the session page (or one element via selector) as the baseline for 'name'; action='check' captures again and returns a hard verdict: passed (diff_percentage vs max_diff_percent, default 0.5%), plus a diff image with changed pixels highlighted. Baselines are stored per project+name. If a check fails on an intended change, re-baseline with action='set'. Prefer selector-scoped baselines for components — full pages flake more (animations, dynamic content).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Baseline name, e.g. 'dashboard-desktop' (letters, digits, . _ -) | |
| action | No | set = capture/replace the baseline; check = compare current state against it (default: check) | |
| selector | No | Scope the baseline to one element (recommended for components) | |
| full_page | No | Full scrollable page vs viewport when no selector (default: true) | |
| threshold | No | Per-channel color tolerance 0-255 before a pixel counts as different (default: 10) | |
| session_id | Yes | Session ID | |
| max_diff_percent | No | Max % of differing pixels to still pass (default: 0.5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behaviors: set replaces baselines, check returns a verdict with diff image, default threshold (0.5%), and storage per project+name. It does not detail error handling or authentication, but covers the core workflow 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 a single, information-dense paragraph that covers purpose, actions, defaults, and best practices without unnecessary words. It is well-structured for quick reading, though splitting into bullet points could improve scanability.
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 complexity (7 parameters, no output schema), the description lacks details on the return format for 'check' and error cases (e.g., missing baseline). It covers the main workflow but could be more complete for a tool without structured output 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%, and the description adds value by explaining the role of each action, default values (e.g., threshold, max_diff_percent), and the recommendation for selector usage. This goes beyond the schema's 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 clearly states the tool's purpose: managing named visual-regression baselines with two actions (set and check). It distinguishes itself from sibling tools like compare_screenshots by focusing on baseline management rather than one-off comparisons.
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 provides practical guidance: re-baseline on intended changes, and prefer selector-scoped over full-page baselines to avoid flakiness. It does not explicitly list when to use alternative tools, but the advice is sufficient for the primary use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_goneA
Block until an element disappears — removed from the DOM or hidden — up to timeout. Returns {success} once it's gone, or times out. Use to wait for a modal/dialog to close or a loading spinner to vanish before the next step.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Max wait time in ms (default: 30000) | |
| selector | Yes | CSS selector of element to wait for disappearance | |
| session_id | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. Discloses blocking behavior, timeout, and return value {success}. Does not detail error handling on timeout, but sufficient for a simple wait tool.
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: first states purpose and behavior, second gives usage examples. No wasted words, front-loaded with key info.
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?
Simple tool with 3 parameters and no output schema. Description covers main behavior and return. Could mention timeout result, but adequate given tool simplicity.
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 parameters are well documented. Description adds value by specifying timeout default and that selector is for disappearance, reinforcing schema meaning.
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 blocks until an element disappears, either removed or hidden. It specifies resources (element) and action (wait for gone), distinguishing it from siblings like wait_for_network.
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?
Explicit use cases are given: 'wait for a modal/dialog to close or a loading spinner to vanish before the next step.' No when-not-to-use or alternatives, but clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_networkA
Block until a network request whose URL contains the given substring completes (optionally filtered by HTTP method), up to timeout. url_pattern is required and is a plain substring match against the full URL including query string — not a regex or glob. Returns the matched request's URL/status/method, or times out. To catch a request fired by a click, run the click and this as consecutive steps in one interact_and_test call; after the fact, read get_response_body/get_network_log instead.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | HTTP method filter (optional, e.g. 'POST', 'GET') | |
| timeout | No | Max wait time in ms (default: 30000) | |
| session_id | Yes | Session ID | |
| url_pattern | Yes | Required. Plain substring of the full request URL incl. query string (e.g. '/api/tasks', 'graphql') — not a regex; anchors ($) and wildcards (.*) never match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully discloses blocking behavior, timeout, return values (URL/status/method), and plain substring matching. Also explains integration with click events.
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, no wasted words. Front-loaded with core behavior, second sentence adds important context and alternatives.
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 blocking nature, schema coverage, and no output schema, description explains returns and common pitfalls (regex, interaction with click). Complete for an agent.
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%, but description adds crucial details: url_pattern examples and regex warning, method filter purpose, timeout default. Exceeds 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?
Description clearly states the tool blocks until a network request matching a URL substring completes. It distinguishes from sibling tools like get_response_body and get_network_log by noting they are for after-the-fact reading.
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?
Explicit guidance: use with interact_and_test for click-triggered requests, and use get_response_body/get_network_log for after-the-fact. Clarifies url_pattern is plain substring, not regex.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_fetchA
Fetch a URL and return clean, readable content — Markdown by default (structure preserved: headings, lists, links, code, tables), with page boilerplate (nav/footer/cookie bars) stripped via readability extraction. Far fewer tokens than a raw text dump. format='text' for plain text, 'html' for raw HTML (raw_html=true is an alias). Static HTTP fetch by default; render=true loads the page in headless Chromium so client-rendered/SPA content is captured (runs all JS, then extracts) — pass project to render a page behind that project's login (host fetch tools can't). contains=[words] only returns the content if the page contains the term(s) (contains_mode any|all), else omits it to save tokens. save=true (or save_path) writes the full content to disk and returns saved_path. TLS verified by default (verify_ssl=false for dev certs).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch | |
| save | No | Write the full (un-truncated) content to data/fetches/ and return saved_path (default: false). | |
| format | No | Output shape (default: markdown). markdown = readable structured Markdown; text = readable plain text; html = raw HTML. | |
| render | No | Load in headless Chromium and run JS before extracting (default: false). Use for client-rendered/SPA pages where a static fetch returns little. Slower than static. | |
| project | No | With render=true, load the page in this project's authenticated context — read pages behind a login. | |
| contains | No | Only return content if the page contains these term(s) (case-insensitive). Otherwise content is omitted (matched=false) to save tokens. | |
| raw_html | No | Alias for format='html' (default: false). | |
| readable | No | Extract main content, dropping nav/footer/boilerplate (default: true). false = whole-page dump. Ignored for format=html. | |
| save_path | No | Explicit file path to save to (implies save=true). | |
| max_length | No | Max returned content length in characters (default: 50000). Saved files are never truncated. | |
| verify_ssl | No | Verify TLS certificates (default: true). Set false for self-signed certs on local/dev servers. | |
| contains_mode | No | Match if ANY term is present (default) or require ALL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels: it explains default readability extraction, static vs headless rendering, TLS verification, contains filtering mode, save behavior, and aliases. No contradictions with missing 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 paragraph that is front-loaded with the main purpose. Every sentence adds value, though it is somewhat long. Could be slightly more structured, but remains reasonably concise for the complexity.
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 covers many aspects: conditional return with contains, saved_path from save, and format options. It lacks an explicit return structure, but is fairly complete given the tool's complexity.
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%, but the description adds significant value by explaining parameter contexts (e.g., 'Slower than static' for render, 'contains_mode any|all', alias for raw_html). It enriches understanding beyond the 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?
The description clearly states the tool fetches a URL and returns clean readable content, with Markdown as default. It distinguishes from siblings by mentioning token savings and the ability to render SPAs, and contrasts with raw text or HTML via format options.
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 guidance on when to use various parameters like render for SPAs, format for output type, contains for filtering, and project for authenticated pages. However, it lacks explicit 'when not to use this tool' guidance compared to siblings like get_page_html.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchA
Search DuckDuckGo and return result titles, URLs, and snippets (up to max_results). Use to look up documentation, verify external facts, or research during a testing workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| max_results | No | Max results to return (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains that results include titles, URLs, snippets, and are limited by 'max_results,' but omits behavioral traits like rate limits, authentication, or error handling. Adequate but minimal.
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 front-load the action and add use-case context. Every word earns its place; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters, no output schema, and straightforward behavior, the description covers purpose, input, output, and use cases. Complete given the tool's simplicity.
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% (both 'query' and 'max_results' are described). The description adds 'up to max_results,' which reiterates schema default. No new parameter semantics beyond what 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?
The description clearly states the search engine (DuckDuckGo), the returned fields (titles, URLs, snippets), and a parameter (max_results). It distinguishes from sibling tools by being the only general web search tool.
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 explicit use cases: 'look up documentation, verify external facts, or research during a testing workflow.' While it doesn't mention when not to use or alternatives, it offers clear context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but there is slight overlap between fill_form and auto_fill_form, and between find_element and get_page_elements. However, descriptions clarify differences, so overall disambiguation is good.
All tool names follow a consistent verb_noun pattern with underscores, no mixing of conventions. Even longer names like test_keyboard_navigation are consistent.
66 tools is very high for a server. While each tool serves a purpose, the sheer number suggests potential bloat and could overwhelm users.
The tool set covers a vast range of web testing needs: session management, element interaction, form handling, network mocking, performance audits, accessibility checks, visual regression, and more. It is extremely comprehensive.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
19 free website QA and AI-visibility tools. Remote HTTP MCP, no account, no API key.
Website QA for your coding agent: audit SEO, performance, security, accessibility over MCP.
Browser-based QA for AI-built software. Test pages with real browsers via agents.
Related MCP Servers
- AlicenseBqualityBmaintenanceMCP server that enables AI agents to perform comprehensive web audits using Google Lighthouse with 13+ tools for performance, accessibility, SEO, and security analysis.111,18667MIT
- AlicenseNot gradedqualityAmaintenancesingle-binary MCP server that gives AI agents a browser. 66 tools for navigation, form filling, data extraction, screenshots, and DOM diffing — built on pure Chrome DevTools Protocol.9MIT
- AlicenseAqualityCmaintenanceMCP server for browser automation that lets LLMs interact with web pages through structured accessibility snapshots, bypassing the need for screenshots.2235,881,527Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAn agentic QA framework that authors, generates, triages, and self-heals Playwright tests for any web app, usable from Claude Code/Desktop as an MCP server or from CI as a CLI.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/segentic-lab/periscope-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server