chrometools-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@chrometools-mcpGo to example.com and click the login button"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
chrometools-mcp
AI-powered Chrome automation through natural language. No more fighting with CSS selectors, XPath expressions, or brittle test scripts. Just tell your AI assistant what you want to do on a web page, and ChromeTools MCP makes it happen.
Why ChromeTools MCP?
For AI Agents & Developers:
π― 56+ specialized tools for browser automation - from simple clicks to Figma comparisons
π§ APOM (Agent Page Object Model) - AI-friendly page representation (~8-10k tokens vs 5-10k for screenshots)
π Persistent browser sessions - pages stay open between commands for iterative workflows
β‘ Framework-aware - handles React, Vue, Angular events and state updates automatically
πΈ Visual testing - compare designs pixel-by-pixel with Figma integration
π¬ Scenario recording - record browser actions, replay them, or export as Playwright/Selenium tests
π Cross-platform - works seamlessly on Windows, WSL, Linux, and macOS
Perfect for:
π€ Building AI agents that interact with web applications
π§ͺ Automated testing without writing code - let AI generate tests from scenarios
π Web scraping and data extraction with natural language instructions
π¨ Design validation - compare implemented UI with Figma designs
π Rapid prototyping - test user flows by describing them to AI
π Monitoring and health checks for web applications
Stop writing brittle automation scripts. Start describing what you want in plain English.
Related MCP server: agent-browser-mcp
Installation
Claude Code (CLI)
The easiest way to install for Claude Code users:
claude mcp add chrometools -- npx chrometools-mcpThis command will automatically configure the MCP server in your Claude Code settings.
Claude Desktop
Add to your Claude Desktop configuration file:
macOS/Linux: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"]
}
}
}Cursor
Step 1: Open MCP Settings in Cursor
Click on Settings (βοΈ icon or
Cmd + ,/Ctrl + ,)Navigate to Cursor Settings β MCP
Step 2: Edit MCP Configuration
You'll see the MCP configuration JSON editor
Add
chrometoolsto themcpServersobject:
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"]
}
}
}If you already have other MCP servers configured, just add chrometools to the existing list:
{
"mcpServers": {
"existing-server": {
"command": "npx",
"args": ["some-other-mcp"]
},
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"]
}
}
}Step 3: Save and Restart
Save the configuration file
Restart Cursor to apply changes
The chrometools-mcp tools will now be available in Cursor Agent
Step 4: Test the Installation
Open Cursor Chat
Select Agent mode
Try a command like: "Open browser and navigate to google.com"
Google Antigravity
Step 1: Open Agent session in Antigravity
Step 2: Click the "β¦" dropdown at the top of the editor's side panel
Step 3: Select "MCP Servers" to open the MCP Store
Step 4: Click "Manage MCP Servers" at the top of the MCP Store
Step 5: Click "View raw config" in the main tab
Step 6: Edit mcp_config.json (located in ~/.gemini/antigravity/ directory):
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"]
}
}
}Step 7: Save the file and restart Antigravity
Note: Antigravity has a limit of ~100 tools per session. If you have many MCP servers installed, consider reducing the number of active tools to ~25 for optimal performance.
Other MCP Clients
For Cline, Continue, or other MCP-compatible clients, add to your MCP configuration:
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"]
}
}
}Manual Installation
You can also run directly without configuration:
npx chrometools-mcpChrome Extension Setup
The Chrome Extension is required for scenario recording and other advanced features. Follow these steps to install it:
Important: ChromeTools opens Chrome with a separate user profile, so you must install the extension after ChromeTools starts Chrome for the first time.
Step 1: Start ChromeTools MCP server first
Make sure ChromeTools is running through your MCP client (Claude Desktop, Cursor, etc.)
Or run it manually:
npx chrometools-mcpThis will launch Chrome with ChromeTools' isolated profile
Step 2: Enable Developer Mode in Chrome
Open Chrome Extensions page:
chrome://extensionsToggle Developer mode (switch in top-right corner)

Step 3: Download and Extract the Extension
Option A - Download from GitHub (Recommended):
Download the extension archive: chrome-extension.zip
Extract the ZIP file to a folder on your computer
Remember the extraction path (you'll need it in the next step)
Option B - Use from node_modules (if you know the path):
After npx install:
~/.npm/_npx/.../node_modules/chrometools-mcp/extensionAfter global install:
<npm-global-path>/node_modules/chrometools-mcp/extensionFrom source:
<repo-path>/extension
Step 4: Load the Extension
Click "Load unpacked" button
Navigate to the extracted extension folder (from Step 3)
Select the folder and click "Select Folder"
Step 5: Verify Installation
You should see "ChromeTools MCP" extension appear in your extensions list with:
Name: ChromeTools MCP
Version: (current version)
Description: MCP server integration for Chrome automation
Status: Toggle should be ON (blue)
Look for the ChromeTools icon (CT) in your Chrome toolbar
The extension is now ready to use for scenario recording

Note: After installation, the extension card will appear on the
chrome://extensionspage alongside other installed extensions. The extension should show as "Enabled" with a blue toggle switch.
Step 6: Pin the Extension (Optional but Recommended)
Click the puzzle piece icon in Chrome toolbar
Find "ChromeTools MCP" in the list
Click the pin icon to keep it visible in toolbar
Troubleshooting:
Recommended: Use Option A (download from GitHub) to avoid searching in node_modules
If using Option B and can't find the extension folder after
npxinstall, runnpm list -g chrometools-mcpto find the installation pathThe extension only works with Chrome instances launched by ChromeTools
If Chrome closes and reopens, the extension should still be loaded (developer mode persists)
When ChromeTools first opens Chrome, it automatically shows a prompt with the extension path in node_modules
Table of Contents
AI Optimization Features- Scenario Recorder - Visual UI-based recording with smart optimization
Available Tools - 51+ Tools Total
AI-Powered Tools - smartFindElement, analyzePage, getElementDetails, findElementsByText
Core Tools - ping, openBrowser
Interaction Tools - click, type, scrollTo, selectOption, selectFromGroup, drag, scrollHorizontal
Inspection Tools - getElement, getComputedCss, getBoxModel, screenshot
Advanced Tools - executeScript, getConsoleLogs, listNetworkRequests, getNetworkRequest, filterNetworkRequests, hover, pressKey, setStyles, setViewport, getViewport, navigateTo
Tab Management Tools - listTabs, switchTab
Frame Tools - listFrames, switchFrame (cross-origin iframe automation)
Recorder Tools - enableRecorder, executeScenario, listScenarios, searchScenarios, getScenarioInfo, deleteScenario, exportScenarioAsCode, appendScenarioToFile, generatePageObject
API / Swagger Tools - loadSwagger, generateApiModels
Multi-Instance Support - Run multiple MCP servers simultaneously
AI Optimization Features
: Dramatically reduce AI agent request cycles with intelligent element finding and page analysis.
Why This Matters
Traditional browser automation with AI requires many trial-and-error cycles:
AI: "Find login button"
β Try selector #1: Not found
β Try selector #2: Not found
β Try selector #3: Found! (3 requests, 15-30 seconds)With AI optimization:
AI: smartFindElement("login button")
β Returns ranked candidates with confidence scores (1 request, 2 seconds)Key Features
analyzePage- π₯ USE FREQUENTLY - Get current page state after loads, clicks, submissions (cached, use refresh:true)smartFindElement- Natural language element search with multilingual supportAI Hints - Automatic context in all tools (page type, page heading, modal content, dropdown/menu items, suggestions)
Text search -
findElementsByTextfor finding elements by visible text
Performance: 3-5x faster, 5-10x fewer requests
Best Practice:
Use
analyzePage()after page loads AND after interactions (clicks, submissions)Use
analyzePage({ refresh: true })after page changes to see current statePrefer
analyzePageoverscreenshotfor debugging form data
π Full AI Optimization Guide
Scenario Recorder
: Visual UI-based recorder for creating reusable test scenarios with automatic secret detection.
Features
Visual Widget - Floating recorder UI with compact mode (50x50px minimize button)
Auto-Reinjection - Recorder persists across page reloads/navigation automatically with duplicate prevention - Smart Click Detection - Finds actual clickable parent elements with event listeners- Smart Waiters - 2s minimum + animation/network/DOM change detection after clicks- Detailed Error Reports - Comprehensive failure analysis with context and suggestions- Smart Recording - Captures clicks, typing, navigation with intelligent optimization
Secret Detection - Auto-detects passwords/emails and stores them securely
Action Optimization - Combines sequential actions, removes duplicates
Scenario Management - Save, load, execute, search, and delete scenarios
Dependencies - Chain scenarios together with dependency resolution
Multi-Instance Protection - Prevents multiple recorder instances from interfering
Quick Start
// 1. Enable recorder UI
enableRecorder()
// 2. Click "Start" in widget, perform actions, click "Stop & Save"
// 3. Execute saved scenario
executeScenario({ name: "login_flow", parameters: { email: "user@test.com" } })π Full Recorder Guide | Recorder Spec
Available Tools
β οΈ Tool Usage Priority
CRITICAL: Always use specialized tools first. Never jump to executeScript as first choice.
For Clicking/Interaction
β
click()- PRIMARY tool for all clicksWorks correctly with React/Vue/Angular synthetic events
Handles button clicks, link navigation, form submissions
β
findElementsByText()+ action - When selector is unknown, find by textβ οΈ
executeScript()- LAST RESORT, only if above failed
For Filling Forms
β
type()- PRIMARY tool for all text inputProperly updates React hooks, Vue reactive data
Auto-clears field before typing (configurable)
β οΈ
executeScript()- LAST RESORT, only if above failed
For Reading Page State
β
analyzePage()- PRIMARY tool for reading page contentGets forms, inputs, buttons, links with current values
Use
refresh: trueafter interactions to see updated stateEfficient: 2-5k tokens vs screenshot 5-10k
β
findElementsByText()- Find specific elements by visible textβ
getElement()- Get HTML of specific elementβ οΈ
executeScript()- LAST RESORT, only if above failed
Model-Based Interaction (Advanced)
β
executeModelAction()- Universal tool for model-specific actionsWorks with element models (Strategy Pattern)
Supports both APOM ID and CSS selector
Framework-specific actions (e.g., DatePicker SetDate, Checkbox toggle)
Example:
executeModelAction({id: "input_34", action: "check"})Example:
executeModelAction({selector: ".datepicker", action: "SetDate", params: {date: "2024-03-15"}})See
models/directory for available models and actionsAvailable models: TxtInp, Sel, Btn, Chk, Radio, TxtArea, Link, Range, DatePicker, DateInp, FileInp, ColorInp, Modal, default
Modal/Dialog Support
Automatic detection: APOM detects modals rendered via React Portals (antd, MUI, Bootstrap, Chakra, Mantine, Element UI, Headless UI, Radix)
Detection methods:
role="dialog",aria-modal="true", framework-specific CSS classesAnimation-proof: Modal elements are included even during CSS appear animations (opacity: 0)
Rich metadata: Modal nodes include
titleandactions(button labels) in metadataIn APOM tree: Modals appear as
type: "dialog"withmodel: "Modal", containing all interactive children
Why specialized tools matter:
β Trigger proper browser events (click, input, change)
β Work with React/Vue/Angular synthetic event systems
β Update framework state correctly (React hooks, Vue reactivity)
β Handle animations, navigation, and async updates
β
executeScriptbypasses framework events and may fail silently
AI-Powered Tools
smartFindElementFind elements using natural language descriptions instead of CSS selectors.
Parameters:
description(required): Natural language (e.g., "login button", "email field")maxResults(optional): Max candidates to return (default: 5)minConfidence(optional): Confidence threshold (0β1, default 0.6) for auto-executingaction. If the best match scores below this β or is too close to the runner-up β the action is skipped and candidates are returned with anactionSkippedreason instead. Prevents auto-clicking the wrong control (e.g. a primary form submit when you asked for a menu item). Lower it to act on weaker matches.
Candidate coverage: besides
button/input/a/[role=button], also considers[onclick],[role=menuitem],[role=tab], and links insidenav/[role=navigation]/[role=menu]β so menu items rendered asdiv/span[onclick]are found. Scoring penalizes candidates whose text doesn't match the description and rewards navigation/menu context.Use case: When you don't know the exact selector
Returns: Ranked candidates with confidence scores, selectors, and reasoning
Example:
{ "description": "submit button", "maxResults": 3 }Returns:
{ "candidates": [ { "selector": "button.login-btn", "confidence": 0.95, "text": "Login", "reason": "type=submit, in form, matching keyword" }, { "selector": "#submit", "confidence": 0.7, "text": "Send", "reason": "submit class" } ], "hints": { "suggestion": "Use selector: button.login-btn" } }
analyzePage Get current page state and structure. Returns complete map of forms (with values), inputs, buttons, links with selectors.
Interactivity Detection:
Detects interactive elements via 8 different methods:
Native HTML tags (
button,a,input,select,textarea)ARIA roles (
button,link,checkbox, etc.)onclickattributeonclickproperty (set via JavaScript)CSS
cursor: pointerJavaScript
addEventListener('click')tabindexattribute (except -1)contenteditable="true"
Captures DIV/SPAN with click handlers - JavaScript-enabled elements are detected
Adds
interactivityReasonmetadata showing detection method (e.g.,cursor-pointer,event-listener)
When to use:
After opening/navigating to page (initial analysis)
After clicking buttons (see what changed)
After form submissions (check results, errors)
After AJAX updates (dynamic content loaded)
When debugging (see actual form values, not just visual)
Layout/styling work - use
includeAll: trueto get ALL page elements with selectorsParameters:
refresh(optional): Force refresh cache to get CURRENT state after changes (default: false)includeAll(optional): Include ALL page elements, not just interactive ones (default: false). Useful for layout work - find any element, get its selector, then usegetComputedCssorsetStyleson it.useLegacyFormat(optional): Return legacy format instead of APOM (default: false - APOM is the default)registerElements(optional): Auto-register elements for ID-based usage (default: true) -groupBy(optional): 'type' or 'flat' - how to group elements (default: 'type')includePortals(optional): Include contents of React Portal containers β menus, tooltips, popovers rendered outside the main React root (default:true). Without this, items inside dropdown popups (e.g. action menus in MTS-like apps) are invisible toanalyzePage.portalSelectors(optional): Array of CSS selectors for portal root containers. Default:['#modal-root', '#menu-popup-root', '#tooltip-root', '#popover-root', '[data-portal]']. Override when the app uses different portal element ids.In-tree popup heuristic: when
includePortalsis enabled (default),analyzePagealso detects "in-tree portal" patterns β popups rendered inside a 0-height inline wrapper and absolute-positioned out of it (Popper, Tippy, FloatingUI, custom contextMenu implementations). Without this, popup items live inside anoffsetHeight: 0wrapper thatisVisibledrops, making the whole popup subtree invisible toanalyzePage. - Why better than screenshot:Shows actual data (form values, validation errors) not just visual
Uses 2-5k tokens vs screenshot 5-10k tokens
Returns structured data with unique element IDs for easy interaction
Detects UI frameworks (MUI, Ant Design, Chakra, Bootstrap, Vuetify, Semantic UI) - Extracts dropdown options from both native
<select>and custom UI components- Returns:APOM format (default): Tree-structured Page Object Model with unique IDs -
tree- Hierarchical tree of page elements (optimized: ~82% smaller than flat format)Each node:
{ tag, id?, type?, sel, ch?, bounds?, meta? }Interactive elements have
boundsand full metadataParent containers have minimal info (position only)
groups- Radio/checkbox groups with options (name, value, label, checked state)meta- Page metadata (url, title, timestamp, element counts)Elements automatically registered - use IDs with
click({ id: "..." }),type({ id: "..." }), etc.Token-optimized: Minified JSON, simplified parents, no redundant data
Example:
analyzePage()returns APOM, then useclick({ id: "button_45" })ortype({ id: "input_20", text: "..." })
Use
getElementDetails({ id: "input_20" })to get full details for any element, or withanalyzeChildren: trueto get children tree structureLegacy format (
useLegacyFormat: true): Classic format for backward compatibilityComplete map of forms (with current values), inputs, buttons, links, navigation with selectors
Each element includes
uiFrameworkinfo (name, version, component type) - Select elements includeoptionsarray with value, text, index, selected, disabled, group - WithincludeAll: true: Also includesallElementsarray with ALL visible page elements (divs, spans, headings, etc.) - each with selector, tag, text, classes, id
Example workflow:
openBrowser({ url: "..." })analyzePage()β Initial analysis, returns elements with IDstype({ id: "input_20", text: "user@example.com" })β Use APOM IDclick({ id: "button_45" })β Use APOM IDanalyzePage({ refresh: true })β See what changed after click!
Layout work example:
analyzePage({ includeAll: true })β Get all elementsFind element you want to style (e.g.,
div.header)getComputedCss({ selector: "div.header" })β Get current stylessetStyles({ selector: "div.header", styles: [...] })β Apply new styles
getElementDetailsGet comprehensive details about a specific element by its APOM ID. Can optionally analyze children elements tree structure. Use when analyzePage output is simplified and you need complete element information or want to focus analysis on a specific section.
Parameters:
id(required): APOM element ID (e.g.,"input_20","button_45")analyzeChildren(optional): Analyze children elements tree structure (default: false)includeAll(optional): When analyzing children, include all elements, not just interactive ones (default: false)refresh(optional): Force refresh of cached analysis (default: false)
Use case:
Get full details including bounds, CSS selector, attributes, computed styles
Focus analysis on specific section (modal, form, sidebar, etc.) with
analyzeChildren: true
Returns: Complete element details including:
id: Element APOM IDselector: CSS selector for the elementtag: HTML tag nametype: Element type (input, button, link, etc.)text: Visible text contentbounds: Position and size{ x, y, width, height, top, right, bottom, left }attributes: All HTML attributes (id, class, name, placeholder, href, etc.)computed: Key CSS properties (display, visibility, cursor, color, fontSize, etc.)metadata: Element metadata from APOM analysisvisible: Whether element is visiblechildrenTree(optional): APOM tree structure of children elements whenanalyzeChildren: true
Example:
// Get complete details for specific input field getElementDetails({ id: "input_20" }) // Returns: { "success": true, "id": "input_20", "selector": "input[name='email']", "tag": "input", "type": "email", "text": "", "bounds": { "x": 100, "y": 200, "width": 300, "height": 40, "top": 200, "right": 400, "bottom": 240, "left": 100 }, "attributes": { "name": "email", "placeholder": "Enter email", "type": "email" }, "computed": { "display": "block", "visibility": "visible", "cursor": "text" }, "visible": true } // Analyze modal contents after opening it analyzePage() // Get initial page structure click({ id: "button_45" }) // Open modal getElementDetails({ id: "container_123", analyzeChildren: true, refresh: true }) // Analyze modal contents with children tree
findElementsByText
Find elements by their visible text content.
Parameters:
text(required): Text to search forexact(optional): Exact match only (default: false)caseSensitive(optional): Case sensitive search (default: false)
Returns: Elements containing the text with their selectors
1. Core Tools
ping
Test MCP connection with a simple ping-pong response.
Parameters:
message(optional)Example:
{ "name": "ping", "arguments": { "message": "hello" } }Returns:
pong: hello
openBrowser
Opens browser and navigates to URL. Browser stays open for further interactions.
Parameters:
url(required)Use case: First step before other tools
Returns: Page title + confirmation
2. Interaction Tools
click
Click an element with optional result screenshot. PREFERRED: Use APOM ID from analyzePage for reliable targeting.
Parameters:
id(optional): APOM element ID from analyzePage (e.g.,"button_45","link_7"). Preferred over selector.selector(optional): CSS selector. Use when APOM ID is not available.β οΈ Either
idORselectorrequired (mutually exclusive)waitAfter(optional): Wait time in ms (default: 1500)screenshot(optional): Capture screenshot (default: false for performance) β‘timeout(optional): Max operation time in ms (default: 30000)skipNetworkWait(optional): Skip waiting for network requests (default: false). Use for pages with continuous long-polling to get instant response.networkWaitTimeout(optional): Custom network wait timeout in ms (default: 10000). Only used if skipNetworkWait is false.waitForSelector(optional): CSS selector to wait for after the click β atomic click+wait. Use for dropdowns/popups that render into a React Portal and otherwise race with the next MCP call. Example:click({ id: 'button_47', waitForSelector: '#menu-popup-root > div' }).waitTimeoutMs(optional): Timeout forwaitForSelectorin ms (default: 2000). On timeout the click still succeeds but the result text reportsβ οΈ WAIT_TIMEOUT.waitForRouteChange(optional): For SPAs (React Router etc.). After the click, waits forlocation.pathname + location.searchto change relative to before, then reportsRoute changed: "/a" β "/b"orβ οΈ ROUTE_UNCHANGED. Because SPAs navigate viahistory.pushState, plain network diagnostics may not register the navigation β this makes "success" mean the view actually changed, not just that the click was delivered. Never fails the click on timeout. For view changes that don't alter the URL, usewaitForSelectorinstead.autoAnalyzeAfter(optional): After click, automatically diff APOM and append the delta to the result text (e.g.+3 appeared: button_42:"Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ°", button_43:"ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ", link_44:"Π£Π΄Π°Π»ΠΈΡΡ"). New element ids are pre-registered so the nextclick({ id })/type({ id })call works without an extraanalyzePage. Designed for the dropdown/menu pattern: one MCP call instead of three.
Use case: Buttons, links, form submissions, Django admin forms
Returns: Confirmation text + optional screenshot + network diagnostics
Performance: 2-10x faster without screenshot, instant with skipNetworkWait
Click strategy: Three-tier fallback for maximum compatibility:
Puppeteer native click (trusted CDP events)
CDP coordinate click at element center (trusted, bypasses interception check)
JavaScript
element.click()(untrusted, last resort)
Example:
// PREFERRED: Using APOM ID click({ id: "button_45" }) // Alternative: Using CSS selector click({ selector: "button[type='submit']" }) // Django forms with WebSockets (prevents timeout) click({ selector: ".submit-row input[type='submit']", skipNetworkWait: true }) // Custom network timeout for slow APIs click({ id: "save_btn", networkWaitTimeout: 10000 })
type
Type text into input fields with optional clearing and typing delay. PREFERRED: Use APOM ID from analyzePage for reliable targeting.
Parameters:
id(optional): APOM element ID from analyzePage (e.g.,"input_20"). Preferred over selector.selector(optional): CSS selector. Use when APOM ID is not available.β οΈ Either
idORselectorrequired (mutually exclusive)text(required): Text to typedelay(optional): Delay between keystrokes in ms (default: 30)clearFirst(optional): Clear field first (default: true)timeout(optional): Max operation time in ms (default: 30000). Prevents infinite hangs on Django forms.
Use case: Filling forms, search boxes, text inputs, Django admin forms
Returns: Confirmation text
Example:
// PREFERRED: Using APOM ID type({ id: "input_20", text: "user@example.com" }) // Alternative: Using CSS selector type({ selector: "input[name='email']", text: "user@example.com" })
scrollTo
Scroll page to bring element into view.
Parameters:
selector(required): CSS selectorbehavior(optional): "auto" or "smooth"
Use case: Lazy loading, sticky elements, visibility checks
Returns: Final scroll position
selectOption
Select option in dropdown (HTML select elements). PREFERRED: Use APOM ID from analyzePage for reliable targeting.
Parameters:
id(optional): APOM element ID from analyzePage (e.g.,"select_5"). Preferred over selector.selector(optional): CSS selector. Use when APOM ID is not available.β οΈ Either
idORselectorrequired (mutually exclusive)value(optional): Option value attribute (priority 1)text(optional): Option text content (priority 2)index(optional): Option index, 0-based (priority 3)
Use case: Form dropdowns, filtering, selection menus
Returns: Selected option details (value, text, index)
Selection priority: If multiple parameters specified, tries value β text β index
AI Integration: Use
analyzePageto see all available options with their values, text, and indicesExample:
// PREFERRED: Using APOM ID selectOption({ id: "select_5", value: "US" }) // Alternative: Using CSS selector selectOption({ selector: "select[name='country']", text: "United States" })
selectFromGroupSelect option(s) from radio or checkbox group by name attribute. Works at abstract group level instead of individual clicks.
Parameters:
name(required): Name attribute of the radio/checkbox group (e.g., 'size', 'toppings')value(optional): Single value to select (for radio or single checkbox)values(optional): Array of values to select (for checkbox group)text(optional): Label text to match (alternative to value)texts(optional): Array of label texts to match (for checkbox group)by(optional): Match by 'value', 'text', or 'auto' (default: 'auto')mode(optional): For checkboxes - 'set' (replace all), 'add', 'remove', 'toggle' (default: 'set')
Use case: Radio buttons, checkbox groups, form options
Returns: Result with changes made and current selection state
AI Integration: Use
analyzePageto see available groups ingroupssection with all options and labelsExamples:
// Radio group - select single option selectFromGroup({ name: "size", value: "large" }) selectFromGroup({ name: "size", text: "Extra Large" }) // Checkbox group - set specific values (uncheck others) selectFromGroup({ name: "toppings", values: ["cheese", "bacon"] }) // Checkbox group - add to existing selection selectFromGroup({ name: "toppings", values: ["mushrooms"], mode: "add" }) // Checkbox group - remove specific values selectFromGroup({ name: "toppings", values: ["onions"], mode: "remove" }) // Checkbox group - toggle values selectFromGroup({ name: "toppings", texts: ["Extra Cheese"], mode: "toggle" })
drag
Drag element by mouse (click-hold-move-release). Simulates real mouse drag, not scrollbar scrolling.
Parameters:
selector(required): CSS selector for element to dragdirection(required): 'up', 'down', 'left', 'right', 'up-left', 'up-right', 'down-left', 'down-right'distance(optional): Distance in pixels (default: 100)duration(optional): Drag duration in milliseconds (default: 500)mode(optional): 'native' (default) or 'synthetic''native': Uses Puppeteer mouse API - faster, works for most cases
'synthetic': Dispatches DOM events (pointerdown/pointermove/pointerup) - better compatibility with JS libraries (frappe-gantt, jQuery UI Draggable, custom drag handlers)
Use case: Interactive maps (Google Maps, Leaflet), Gantt charts, SVG diagrams, canvas elements, sliders, drag-to-pan interfaces
How it works:
Native mode: Uses Puppeteer's mouse API (mousedown β mousemove β mouseup)
Synthetic mode: Dispatches PointerEvent/MouseEvent on element with intermediate pointermove events during drag
When to use synthetic mode: If native drag doesn't trigger JS library event handlers (e.g., frappe-gantt, jQuery UI, React DnD)
NOT for: Standard overflow scrollbars (use
scrollToorscrollHorizontalinstead)Returns: Start/end mouse positions, drag delta, and mode used
scrollHorizontal
Scroll element horizontally (for tables, carousels, wide content).
Parameters:
selector(required): CSS selector for element to scrolldirection(required): 'left' or 'right'amount(required): Number of pixels to scroll, or 'full' to scroll to the endbehavior(optional): 'auto' or 'smooth' (default: 'auto')
Use case: Wide tables, image carousels, horizontally scrollable containers
Returns: Scroll state (position, total width, visible width, scroll availability)
3. Inspection Tools
getElement
Get HTML markup of element (defaults to body if no selector).
Parameters:
selector(optional)Use case: Inspecting structure, debugging markup
Returns: Complete outerHTML
getComputedCss
Get computed CSS styles for an element with intelligent filtering to reduce token usage.
Parameters:
selector(optional): CSS selector (defaults to body)category(optional): Filter by category - 'layout', 'typography', 'colors', 'visual', or 'all' (default)properties(optional): Array of specific properties to return (e.g.,['color', 'font-size']) - overrides category filterincludeDefaults(optional): Include properties with default values (default: false)
Use case: Debugging layout, verifying styles, design comparison
Returns: JSON object with filtered CSS properties, metadata about filtering
Performance: Without filters returns ~300 properties (~14k tokens). With filtering returns 10-50 properties (~1-2k tokens)
Example usage:
Layout only:
{ selector: ".header", category: "layout" }Specific properties:
{ selector: ".title", properties: ["color", "font-size", "font-weight"] }Typography without defaults:
{ selector: "h1", category: "typography", includeDefaults: false }
getBoxModel
Get precise dimensions, positioning, margins, padding, and borders.
Parameters:
selector(required)Use case: Pixel-perfect measurements, layout analysis
Returns: Box model data + metrics
screenshot
Capture optimized screenshot of a specific element, or the full viewport when no id/selector is given. Smart compression with a 3 MB hard limit.
Parameters:
id(optional): APOM element ID fromanalyzePage. Mutually exclusive withselector.selector(optional): CSS selector. Mutually exclusive withid.Omit both
idandselectorto capture the full viewport (no element resolution needed).padding(optional): Padding in pixels (default: 0). Ignored for viewport screenshots.maxWidth(optional): Max width for auto-scaling (default: 1024, null for original size)maxHeight(optional): Max height for auto-scaling (default: 8000, null for original size)quality(optional): JPEG quality 1-100 (default: 40)format(optional): 'png', 'jpeg', or 'auto' (default: 'jpeg')
Use case: Visual documentation, bug reports
Returns: Optimized image with metadata (~5-10k tokens)
Default behavior: JPEG at quality 40, auto-scales to 1024px width and 8000px height (API limit). For higher quality, explicitly set
qualityandformatparametersAutomatic compression: If image exceeds 3 MB, automatically reduces quality or scales down to fit within limit
For original quality: Set
maxWidth: null,maxHeight: nullandformat: 'png'(still enforces 3 MB limit)
saveScreenshot
Save optimized screenshot to filesystem without returning in context, with automatic 3 MB limit.
Parameters:
selector(required)filePath(required): Absolute path to save filepadding(optional): Padding in pixels (default: 0)maxWidth(optional): Max width for auto-scaling (default: 1024, null for original)maxHeight(optional): Max height for auto-scaling (default: 8000, null for original)quality(optional): JPEG quality 1-100 (default: 80)format(optional): 'png', 'jpeg', or 'auto' (default: 'auto')
Use case: Baseline screenshots, file storage (higher quality defaults than
screenshottool)Returns: File path and metadata (not image data)
Default behavior: Auto-scales and compresses to save disk space
Automatic compression: If image exceeds 3 MB, automatically reduces quality or scales down to fit within limit
4. Advanced Tools
executeScript
Execute arbitrary JavaScript in page context with optional screenshot.
Parameters:
script(required): JavaScript codewaitAfter(optional): Wait time in ms (default: 500)screenshot(optional): Capture screenshot (default: false for performance) β‘timeout(optional): Max operation time in ms (default: 30000)
Use case: Complex interactions, custom manipulations
Returns: Execution result + optional screenshot
Performance: 2-10x faster without screenshot
Top-level
return: any snippet using a top-levelreturn(e.g.return document.title,const x = 1; return x, or code that contains afunctionin a callback) just works β it's run as-is first, and only re-wrapped in an async IIFE if the engine reports an "Illegal return statement". Bare expressions likedocument.titlestill return their value. No manual(() => { ... })()wrapping needed.Frames: runs inside the active frame after
switchFrame(see Frame Tools); defaults to the main frame.
getConsoleLogs
Retrieve browser console logs (log, warn, error, etc.).
Parameters:
types(optional): Array of log types to filterclear(optional): Clear logs after reading (default: false)
Use case: Debugging JavaScript errors, tracking behavior
Returns: Array of log entries with timestamps
Network Monitoring (3 specialized tools)
Auto-captures across page navigations. All network requests are monitored automatically.
listNetworkRequests
Get compact summary of network requests with pagination support - minimal token usage.
Parameters:
types(optional): Array of request types (default:['Fetch', 'XHR'])status(optional): Filter by status (pending, completed, failed, all)limit(optional): Maximum number of requests to return (default: 50, max: 500)offset(optional): Number of requests to skip (default: 0)clear(optional): Clear requests after reading (default: false)
Returns: Object with
totalCount,returnedCount,hasMore,offset,limit, and paginatedrequestsarrayUse case: Quick overview of API calls with pagination for large request lists
Example:
listNetworkRequests()β first 50 requestslistNetworkRequests({ limit: 20, offset: 20 })β requests 21-40Response:
{ totalCount: 150, returnedCount: 50, hasMore: true, offset: 0, limit: 50, requests: [...] }
getNetworkRequest
Get full details of a single request by ID.
Parameters:
requestId(required): Request ID from listNetworkRequests
Returns: Complete request/response with headers, payload, timing, mime type
Use case: Deep dive into specific request after identifying it in list
Example:
getNetworkRequest({ requestId: "123" })β full details with headers, body, timing
filterNetworkRequests
Filter requests by URL pattern with full details.
Parameters:
urlPattern(required): URL pattern (regex or partial match)types(optional): Array of request types (default:['Fetch', 'XHR'])clear(optional): Clear requests after reading (default: false)
Returns: Array of full request details matching pattern
Use case: Get all API calls to specific endpoint with complete data
Example:
filterNetworkRequests({ urlPattern: "api/users" })β all requests to /api/users with full details
Workflow:
listNetworkRequests()- see all requests (compact)getNetworkRequest({ requestId: "..." })- inspect specific requestfilterNetworkRequests({ urlPattern: "api/..." })- get all matching requests with details
hover
Simulate mouse hover over element. PREFERRED: Use APOM ID from analyzePage for reliable targeting.
Parameters:
id(optional): APOM element ID from analyzePage (e.g.,"button_10"). Preferred over selector.selector(optional): CSS selector. Use when APOM ID is not available.β οΈ Either
idORselectorrequired (mutually exclusive)
Use case: Testing hover effects, tooltips, dropdown menus
Returns: Confirmation text
Example:
// PREFERRED: Using APOM ID hover({ id: "button_10" }) // Alternative: Using CSS selector hover({ selector: ".dropdown-trigger" })
pressKey
Press keyboard key, optionally on a specific element. Uses Puppeteer's trusted keyboard events.
Parameters:
id(optional): APOM element ID to focus before pressingselector(optional): CSS selector to focus before pressingkey(required): Key to press β'Enter','Escape','Tab','ArrowUp','ArrowDown','ArrowLeft','ArrowRight','Backspace','Delete','Home','End','PageUp','PageDown','Space'modifiers(optional): Array of modifier keys to hold β['Control'],['Shift'],['Alt'],['Meta']Neither
idnorselectoris required β without them, presses on whatever is currently focused
Use case: Form submission (Enter), closing dialogs (Escape), focus navigation (Tab), keyboard shortcuts (Ctrl+A)
Returns: Confirmation text
Example:
// Submit form by pressing Enter on input pressKey({ id: "input_20", key: "Enter" }) // Close modal with Escape (no element needed) pressKey({ key: "Escape" }) // Select all text with Ctrl+A pressKey({ id: "input_5", key: "a", modifiers: ["Control"] }) // Navigate with Tab pressKey({ key: "Tab" })
setStyles
Apply inline CSS styles to element for live editing.
Parameters:
selector(required)styles(required): Array of {name, value} pairs
Use case: Testing design changes, rapid prototyping
Returns: Applied styles confirmation
setViewport
Change viewport dimensions for responsive testing.
Parameters:
width(required): 320-4000pxheight(required): 200-3000pxdeviceScaleFactor(optional): 0.5-3 (default: 1)
Use case: Testing mobile, tablet, desktop layouts
Returns: Actual viewport dimensions
getViewport
Get current viewport size and device pixel ratio.
Parameters: None
Use case: Checking current screen dimensions
Returns: Viewport metrics (width, height, DPR)
navigateTo
Navigate to different URL while keeping browser instance.
Parameters:
url(required)waitUntil(optional): load event type
Use case: Moving between pages in workflow
Returns: New page title. The post-navigation network summary lists only XHR/Fetch requests (static assets β JS chunks, CSS, fonts, images β are hidden and counted) and is capped at the first 12 with a
β¦ N morenote, so a heavy SPA load doesn't bury the signal.Note: resets the active frame back to the main frame (see Frame Tools).
5. Tab Management Tools
Tools for managing multiple browser tabs. New tabs opened via window.open(), target="_blank", or user actions are automatically detected and tracked.
listTabs
List all open browser tabs with their URLs, titles, and active status.
Parameters: None
Returns:
tabs: Array of{ index, url, title, isActive }totalCount: Number of open tabsnewTabsDetected(optional): Array of tabs opened since last check
Use case: See all open tabs, check for newly opened tabs
// Example response
{
"tabs": [
{ "index": 0, "url": "https://example.com", "title": "Example", "isActive": false },
{ "index": 1, "url": "https://google.com", "title": "Google", "isActive": true }
],
"totalCount": 2,
"newTabsDetected": [
{ "timestamp": "2026-01-25T...", "url": "https://google.com", "openerUrl": "https://example.com" }
]
}switchTab
Switch to a different browser tab by index or URL pattern.
Parameters:
tab(required): Tab index (number, 0-based) or URL pattern (string, partial match)
Use case: Switch between tabs for multi-tab workflows
Returns:
{ success, switchedTo: { url, title } }
// Switch by index
switchTab({ tab: 0 })
// Switch by URL pattern
switchTab({ tab: "google.com" })5a. Frame Tools (iframe automation)
Tools for automating pages whose UI lives inside an <iframe> β including cross-origin iframes (e.g. a widget hosted on a different subdomain). Cross-origin frames can't be reached from page JavaScript (Same-Origin Policy blocks iframe.contentDocument), but ChromeTools resolves them over CDP, so the SOP doesn't apply.
By default all tools operate on the main frame. After switchFrame, the element tools β click, type, hover, selectOption, pressKey, scrollTo, waitForElement, analyzePage, findElementsByText, smartFindElement, executeScript β run inside the selected frame until you reset. The active frame is reset automatically on navigateTo.
listFrames
List all frames on the current page so you can discover which one to switch into.
Parameters: None
Returns:
{ count, activeFrame, frames: [{ url, name, isMain }], hint }Use case: Find a cross-origin iframe (e.g.
app.example.com) before switching into it
switchFrame
Set the active frame for subsequent element tools. Call with no arguments to reset back to the main frame.
Parameters (provide one, or none to reset):
frameUrl(optional): substring matched against each frame's URL (e.g."app.example.com"). Selects the first match.frameSelector(optional): CSS selector of the<iframe>element; its content frame becomes active.
Returns:
{ active: <frame url>, matcher, frames }(or{ active: null }on reset)Use case: Enter a cross-origin iframe to click/fill a form rendered there
// Discover frames
listFrames()
// β { count: 2, frames: [ {url:".../app", isMain:true}, {url:"https://app.example.com/...", isMain:false} ] }
// Enter the cross-origin iframe
switchFrame({ frameUrl: "app.example.com" })
// Now element tools target the iframe
analyzePage() // returns the iframe's APOM tree
findElementsByText({ text: "Save" }) // searches inside the iframe
click({ id: "button_3" }) // clicks inside the iframe
// Back to the main document
switchFrame()
analyzePagealso includes aframesarray in its output whenever the page has more than one frame, so the agent can discover iframes without a separatelistFramescall.
6. Figma Tools
Design-to-code validation, file browsing, design system extraction, and comparison tools with automatic 3 MB compression.
parseFigmaUrl Parse Figma URL to extract fileKey and nodeId automatically.
Parameters:
url(required): Full Figma URL or just fileKey
Supported formats:
https://www.figma.com/file/ABC123/Title?node-id=1-2https://www.figma.com/design/ABC123/Title?node-id=1-2ABC123(just fileKey)
Use case: No need to manually extract fileKey and nodeId from URLs
Returns:
{ fileKey, nodeId }object
listFigmaPages Browse entire Figma file structure: all pages and frames with IDs.
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file key or full URL
Use case: Use FIRST to discover what's in the Figma file before requesting specific nodes
Returns: Hierarchical structure with:
File metadata (name, version, lastModified)
All pages with names and IDs
All frames in each page with names, IDs, types, dimensions
Example output:
{ "fileName": "Design System", "pagesCount": 3, "pages": [ { "name": "π¨ Components", "framesCount": 25, "frames": [ { "id": "123:456", "name": "Button/Primary", "type": "FRAME" } ] } ] }
searchFigmaFrames Search frames/components by name across entire Figma file.
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file key or full URLsearchQuery(required): Search text (case-insensitive)
Use case: Find specific frames/components without browsing manually
Returns: All matching nodes with IDs, names, types, pages, dimensions
Example: Search for "login" returns all frames containing "login" in name
getFigmaComponents Extract all components from Figma file (Design System).
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file key or full URL
Use case: Get complete list of design system components
Returns: All COMPONENT and COMPONENT_SET nodes with names, descriptions, dimensions
getFigmaStyles Get all shared styles from Figma file (color, text, effect, grid styles).
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file key or full URL
Use case: Extract design tokens and shared styles for CSS/Tailwind generation
Returns: Categorized styles:
Fill styles (colors)
Text styles (typography)
Effect styles (shadows, blur)
Grid styles
getFigmaColorPalette Extract complete color palette with usage statistics.
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file key or full URL
Use case: Generate CSS color variables, understand color usage
Returns: All unique colors with:
Hex and RGBA values
Usage count
Usage examples (where the color is used)
Sorted by usage frequency
convertFigmaToCode Convert Figma designs to React/Tailwind code with AI assistance.
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file keynodeId(required): Frame/component ID (formats: '123:456' or '123-456')framework(optional): 'react', 'react-typescript', or 'html' (default: 'react')includeComments(optional): Include code comments (default: true)
Use case: Rapid prototyping, design-to-code workflow, implementing Figma designs
How it works:
Fetches design structure (layout, colors, typography, spacing)
Gets rendered design image at 2x resolution
Returns AI-optimized instructions with simplified JSON structure
AI generates clean React/Tailwind code matching the design
Returns: Formatted instruction prompt containing:
Design image reference
Simplified JSON structure with layout, styling, text properties
Framework-specific guidelines (React components, TypeScript types, Tailwind classes)
Quality requirements (semantic HTML, accessibility, accurate spacing)
Best for: UI components, landing pages, card designs, navigation bars
getFigmaFrame
Export and download a Figma frame as PNG/JPG image with automatic compression.
Parameters:
figmaToken(optional): Figma API token (can use FIGMA_TOKEN env var)fileKey(required): Figma file key from URLnodeId(required): Figma frame/component IDscale(optional): Export scale 0.1-4 (default: 2)format(optional): 'png', 'jpg', 'svg' (default: 'png')
Use case: Getting design references from Figma for comparison
Returns: Figma frame metadata and compressed image
Automatic compression: Images exceeding 3 MB are automatically compressed by reducing quality or scaling down
compareFigmaToElement
The GOLD STANDARD for design-to-code validation. Compares Figma design pixel-perfect with browser implementation.
Parameters:
figmaToken(optional): Figma API token (can use FIGMA_TOKEN env var)fileKey(required): Figma file keynodeId(required): Figma frame IDselector(required): CSS selector for page element to comparefigmaScale(optional): Figma export scale (default: 2)threshold(optional): Difference threshold 0-1 (default: 0.05)
Use case: Validating implementation matches design specifications
Returns: Comparison analysis with SSIM score, difference percentage, and three images (Figma, Page, Diff map)
Automatic compression: All three images are automatically compressed if they exceed 3 MB
getFigmaSpecs
Extract detailed design specifications from Figma including text content, colors, fonts, dimensions, and spacing.
Parameters:
figmaToken(optional): Figma API tokenfileKey(required): Figma file keynodeId(required): Figma frame/component ID
Use case: Getting exact design specifications and text content for implementation
Returns: Complete design specs with:
Text content: All text from TEXT nodes (buttons, labels, headings, paragraphs)
textContent: Direct text for TEXT nodes
allTextContent: Array of all text nodes with names and visibility
textSummary: Total text nodes count, visible count, combined text
Styling: Colors (fills, strokes), typography (fonts, sizes, weights), effects (shadows, blur)
Dimensions: Width, height, x, y coordinates
Children: Recursive tree with text extraction from all child elements
7. Recorder Tools
URL-Based Storage: Scenarios are automatically organized by website domain in ~/.config/chrometools-mcp/projects/{domain}/scenarios/.
Automatic Domain Detection: Project ID is extracted from the URL where recording starts:
https://www.google.comβgooglehttps://dev.example.com:8080βexample-8080http://localhost:3000βlocalhost-3000file:///test.htmlβlocal
Domain Organization Rules:
Main domain only (subdomains stripped):
mail.google.comβgooglePorts included for ALL domains:
example.com:8080βexample-8080Protocol ignored:
httpandhttpsboth β same project
Global Scenario Access: All tools (listScenarios, searchScenarios) return scenarios from all projects. Agent can filter by:
projectId: Domain-based identifier (e.g., "google", "localhost-3000")entryUrl: URL where recording startedexitUrl: URL where recording ended
Example:
// Record scenario on google.com
enableRecorder() // Saves to ~/.config/chrometools-mcp/projects/google/scenarios/
// List ALL scenarios from all websites
listScenarios()
// Returns: [
// { name: "search", projectId: "google", entryUrl: "https://google.com" },
// { name: "login", projectId: "localhost-3000", entryUrl: "http://localhost:3000" }
// ]
// Agent filters by projectId or URL
scenarios.filter(s => s.projectId === "google")
scenarios.filter(s => s.entryUrl.includes("localhost"))
// Execute scenario (searches all projects automatically)
executeScenario({ name: "login" }) // Finds scenario in any projectenableRecorder
Inject visual recorder UI widget into the current page. Scenarios are automatically saved to ~/.config/chrometools-mcp/projects/{domain}/scenarios/ based on the website URL.
Parameters: None
Use case: Start recording user interactions visually
Returns: Success status with storage location
Features:
Floating widget with compact mode (minimize to 50x50px)
Visual recording indicator (red pulsing border)
Start/Pause/Stop/Stop & Save/Clear controls
Real-time action list display
Metadata fields (name, description, tags)
Automatic domain-based project detection from URL
executeScenario
Execute a previously recorded scenario by name. Searches all projects automatically via global index.
Parameters:
name(required): Scenario nameprojectId(optional): Project ID (domain) to disambiguate when multiple scenarios have the same name. Examples:"google","localhost-3000"parameters(optional): Runtime parameters (e.g., { email: "user@test.com" })executeDependencies(optional): Execute dependencies before running scenario (default: true)
Use case: Run automated test scenarios across projects
Returns: Execution result with success/failure status
Features:
Automatic dependency resolution (enabled by default)
Cross-project dependency support
Secret parameter injection
Fallback selector retry logic
Name collision detection with helpful error messages
Example:
// Execute with dependencies (default) executeScenario({ name: "create_post" }) // Execute without dependencies executeScenario({ name: "create_post", executeDependencies: false }) // Disambiguate when multiple scenarios have same name executeScenario({ name: "login", projectId: "google" }) executeScenario({ name: "login", projectId: "localhost-3000" })Name Collision Handling: If multiple scenarios with the same name exist across different projects, you'll get an error:
{ "success": false, "error": "Multiple scenarios named 'login' found. Please specify projectId.", "availableProjectIds": ["google", "localhost-3000"], "hint": "Use: executeScenario({ name: \"login\", projectId: \"one-of-the-above\" })" }
listScenarios
Get all available scenarios with metadata from all websites. Agent can filter by projectId, entryUrl, or exitUrl.
Parameters: None
Use case: Browse recorded scenarios across all websites
Returns: Array of scenarios with names, descriptions, tags, timestamps,
projectId,entryUrl,exitUrlExample:
// List all scenarios from all websites const scenarios = await listScenarios() // Agent filters by projectId const googleScenarios = scenarios.filter(s => s.projectId === "google") // Agent filters by URL const localhostScenarios = scenarios.filter(s => s.entryUrl.includes("localhost"))
searchScenarios
Search scenarios by text or tags across all websites. Agent can further filter results by projectId or URLs.
Parameters:
text(optional): Search in name/descriptiontags(optional): Array of tags to filter
Use case: Find specific scenarios across all websites
Returns: Matching scenarios with
projectId,entryUrl,exitUrlmetadataExample:
// Search across all websites const results = await searchScenarios({ text: "login" }) // Search by tags const authScenarios = await searchScenarios({ tags: ["auth"] }) // Agent filters results by domain const googleLogins = results.filter(s => s.projectId === "google")
getScenarioInfo
Get detailed information about a scenario. Searches all projects automatically.
Parameters:
name(required): Scenario nameincludeSecrets(optional): Include secret values (default: false)
Use case: Inspect scenario actions and dependencies
Returns: Full scenario details (actions, metadata, dependencies, project info)
deleteScenario
Delete a scenario and its associated secrets. Searches all projects to find the scenario.
Parameters:
name(required): Scenario name
Use case: Clean up unused scenarios
Returns: Success confirmation
exportScenarioAsCodeExport recorded scenario as executable test code for creating a NEW test file. Automatically cleans unstable selectors (CSS Modules, styled-components, Emotion). Optionally generates Page Object class. Returns JSON with code and suggested filename - Claude Code will create the file. To add tests to EXISTING files, use appendScenarioToFile instead.
Parameters:
scenarioName(required): Name of scenario to exportlanguage(required): Target framework -"playwright-typescript","playwright-python","selenium-python","selenium-java"cleanSelectors(optional): Remove unstable CSS classes (default: true)includeComments(optional): Include descriptive comments (default: true)generatePageObject(optional): Also generate Page Object class for the page (default: false). Legacy - usepageObjectModeinstead.pageObjectClassName(optional): Custom Page Object class name (auto-generated if not provided)pageObjectMode(optional): POM integration mode:"none"(default) - no Page Object"generate"- generate separate POM file (same asgeneratePageObject: true)"generate-integrated"- generate POM + test that uses POM methods (imports, instantiates, calls POM methods)"use-existing"- generate test that uses an existing POM file (requirespageObjectFile)
pageObjectFile(optional): Path to existing POM file (required for"use-existing"mode)
Use case: Create new test files from recorded scenarios with optional Page Object integration
Returns: JSON with:
action:"create_new_file"suggestedFileName: Suggested test filenametestCode: Full test code with importsinstruction: Instructions for Claude CodepageObject(if POM generated): Page Object code and metadatapomIntegration(if POM integrated):{ className, mode }info
Example 1 - Test only:
// Export scenario as new Playwright TypeScript file exportScenarioAsCode({ scenarioName: "checkout_flow", language: "playwright-typescript" }) // Returns JSON: { "action": "create_new_file", "suggestedFileName": "checkout_flow.spec.ts", "testCode": "import { test, expect } from '@playwright/test';\n\ntest('checkout_flow', async ({ page }) => {\n await page.goto('https://example.com');\n await page.locator('button[data-testid=\"add-to-cart\"]').click();\n await expect(page).toHaveURL(/checkout/);\n});", "instruction": "Create a new test file 'checkout_flow.spec.ts' with the testCode." }Example 2 - Test + separate Page Object (legacy):
exportScenarioAsCode({ scenarioName: "login_test", language: "playwright-typescript", generatePageObject: true, pageObjectClassName: "LoginPage" })Example 3 - Test + integrated Page Object (recommended):
// Generate POM and test that USES POM methods (not raw selectors) exportScenarioAsCode({ scenarioName: "login_test", language: "playwright-typescript", pageObjectMode: "generate-integrated", pageObjectClassName: "LoginPage" }) // Returns test code using POM: // import { LoginPage } from './LoginPage'; // test('login_test', async ({ page }) => { // const loginPage = new LoginPage(page); // await loginPage.goto(); // await loginPage.fillUsername('admin'); // await loginPage.clickLoginBtn(); // });Example 4 - Test using existing POM file:
// Use pre-existing Page Object file exportScenarioAsCode({ scenarioName: "login_test", language: "playwright-typescript", pageObjectMode: "use-existing", pageObjectFile: "./pages/LoginPage.ts" }) // Test will import and use methods from the existing LoginPageSelector Cleaning: Automatically removes unstable patterns:
CSS Modules:
Button_primary__2x3yZβ removedStyled-components:
sc-AbCdEf-0β removedEmotion:
css-1a2b3c4dβ removedHash suffixes:
component_a1b2c3dβ removedPrefers stable selectors:
data-testid,role,aria-label, semantic attributes
appendScenarioToFile
Append recorded scenario as test code to an EXISTING test file. Automatically cleans unstable selectors (CSS Modules, styled-components, Emotion). Optionally generates Page Object class. Returns JSON with test code (without imports) - Claude Code will read the file, append the test, and write back. To create NEW test files, use exportScenarioAsCode instead.
Parameters:
scenarioName(required): Name of scenario to exportlanguage(required): Target framework -"playwright-typescript","playwright-python","selenium-python","selenium-java"targetFile(required): Path to existing test file to append totestName(optional): Override test name (default: from scenario name)insertPosition(optional): Where to insert:'end'(default),'before','after'referenceTestName(optional): Reference test name for 'before'/'after' insertioncleanSelectors(optional): Remove unstable CSS classes (default: true)includeComments(optional): Include descriptive comments (default: true)generatePageObject(optional): Also generate Page Object class for the page (default: false). Legacy - usepageObjectModeinstead.pageObjectClassName(optional): Custom Page Object class name (auto-generated if not provided)pageObjectMode(optional): POM integration mode -"none","generate","generate-integrated","use-existing"(see exportScenarioAsCode for details)pageObjectFile(optional): Path to existing POM file (required for"use-existing"mode)
Use case: Add tests to existing test files without overwriting current tests
Architecture: MCP server generates only test code (without imports). Claude Code reads the target file, appends the test at the specified position, and writes the file back. This separation ensures MCP doesn't need file system access to test files.
Returns: JSON with:
action:"append_test"targetFile: Path to file to updatetestCode: Test code only (without imports/headers)testName: Name of test to appendinsertPosition: Where to insert testreferenceTestName: Reference test for 'before'/'after' positioninginstruction: Instructions for Claude Code to read/append/writepageObject(ifgeneratePageObject=true): Page Object code and metadata
Example 1 - Append to end:
// Append test to end of existing file appendScenarioToFile({ scenarioName: "new_feature_test", language: "playwright-typescript", targetFile: "./tests/features.spec.ts" }) // Returns JSON: { "action": "append_test", "targetFile": "./tests/features.spec.ts", "testCode": "test('new_feature_test', async ({ page }) => {\n // Test implementation\n await page.click('#submit');\n await expect(page.locator('.result')).toBeVisible();\n});", "testName": "new_feature_test", "insertPosition": "end", "referenceTestName": null, "instruction": "Read file './tests/features.spec.ts', append the testCode at position 'end', then write the file back." }Example 2 - Insert before specific test:
// Insert test before specific test appendScenarioToFile({ scenarioName: "setup_test", language: "selenium-python", targetFile: "./tests/test_suite.py", insertPosition: "before", referenceTestName: "test_main", testName: "test_setup_data" })Example 3 - Append with Page Object:
// Append test and generate Page Object appendScenarioToFile({ scenarioName: "login_test", language: "playwright-typescript", targetFile: "./tests/auth.spec.ts", generatePageObject: true, pageObjectClassName: "LoginPage" }) // Returns JSON with both test code and Page Object: { "action": "append_test", "targetFile": "./tests/auth.spec.ts", "testCode": "test('login_test', async ({ page }) => {\n await page.fill('#username', 'user');\n await page.fill('#password', 'pass');\n await page.click('button[type=\"submit\"]');\n});", "testName": "login_test", "insertPosition": "end", "referenceTestName": null, "pageObject": { "code": "export class LoginPage { ... }", "className": "LoginPage", "suggestedFileName": "LoginPage.ts", "elementCount": 8 }, "instruction": "Read file './tests/auth.spec.ts', append the testCode at position 'end', then write the file back. Also create a Page Object file 'LoginPage.ts' with the provided pageObject.code." }
generatePageObjectGenerate Page Object Model (POM) class from current page structure. Analyzes page, extracts interactive elements, and generates framework-specific code with smart naming and helper methods.
Parameters:
className(optional): Page Object class name (auto-generated from page title/URL if not provided)framework(optional): Target framework -"playwright-typescript"(default),"playwright-python","selenium-python","selenium-java"includeComments(optional): Include descriptive comments (default: true)groupElements(optional): Group elements by page sections (default: true)
Features:
Smart Selector Generation: Prioritizes id > name > data-testid > unique class > CSS path
Intelligent Naming: Auto-generates element names from labels, placeholders, text, attributes
Section Grouping: Groups elements by semantic sections (header, nav, form, footer, main, etc.)
Helper Methods: Auto-generates fill() and click() methods for common actions
Multi-Framework: Supports Playwright (TS/Python) and Selenium (Python/Java)
Use cases:
Generate POM classes for test automation
Create maintainable test structure from existing pages
Bootstrap test framework setup quickly
Extract page structure for documentation
Returns: Page Object code with metadata (className, url, title, elementCount, framework)
Example:
// 1. Navigate to page openBrowser({ url: "https://example.com/login" }) // 2. Generate Page Object generatePageObject({ className: "LoginPage", framework: "playwright-typescript", includeComments: true, groupElements: true }) // Returns: { "success": true, "className": "LoginPage", "url": "https://example.com/login", "title": "Login - Example Site", "elementCount": 12, "framework": "playwright-typescript", "code": "import { Page, Locator } from '@playwright/test';\n\nexport class LoginPage {\n readonly page: Page;\n \n /** Email input field */\n readonly emailInput: Locator;\n /** Password input field */\n readonly passwordInput: Locator;\n /** Login button */\n readonly loginButton: Locator;\n \n constructor(page: Page) {\n this.page = page;\n this.emailInput = page.locator('#email');\n this.passwordInput = page.locator('#password');\n this.loginButton = page.locator('button[type=\"submit\"]');\n }\n \n async goto() {\n await this.page.goto('https://example.com/login');\n }\n \n async fillEmailInput(text: string) {\n await this.emailInput.fill(text);\n }\n \n async fillPasswordInput(text: string) {\n await this.passwordInput.fill(text);\n }\n \n async clickLoginButton() {\n await this.loginButton.click();\n }\n}" }Supported Frameworks:
playwright-typescript: Playwright with TypeScript (locators, async/await, Page Object pattern)playwright-python: Playwright with Python (sync API, snake_case naming)selenium-python: Selenium with Python (WebDriver, explicit waits, By locators)selenium-java: Selenium with Java (WebDriver, Page Factory compatible)
8. API / Swagger Tools
Tools for loading OpenAPI/Swagger specs and generating typed API models.
loadSwagger
Parse an OpenAPI 2.0 (Swagger) or 3.x spec and return a structured summary of endpoints, schemas, and auth.
Parameter | Type | Required | Description |
| string | Yes | URL ( |
|
| No | Parse format (default: |
Response includes:
API title, version, base URL
All endpoints with method, path, operationId, parameters, request body, responses
Schema summaries (property names, types, enums)
Auth schemes (Bearer, API key, OAuth2)
// Load from URL
loadSwagger({ source: "https://petstore.swagger.io/v2/swagger.json" })
// Load from local file
loadSwagger({ source: "/path/to/openapi.yaml" })generateApiModels
Generate TypeScript interfaces or Python dataclasses/pydantic models from an OpenAPI spec.
Parameter | Type | Required | Description |
| string | Yes | URL or file path to spec |
|
| Yes | Target language |
|
| No | Parse format (default: |
|
| No | TypeScript style (default: |
|
| No | Python style (default: |
| boolean | No | Generate enum types (default: |
| string[] | No | Filter to specific schema names |
Features:
Topological sort ensures correct declaration order
Enum deduplication (property enums reuse top-level enums)
allOfβ extends/inheritance,oneOf/anyOfβ union typesCircular reference detection with forward references
Swagger 2.0 automatically normalized to OpenAPI 3.x
// Generate TypeScript interfaces
generateApiModels({
source: "https://petstore.swagger.io/v2/swagger.json",
language: "typescript"
})
// Returns: { code: "export interface Pet { ... }", suggestedFileName: "pet-store-api.models.ts" }
// Generate Python pydantic models
generateApiModels({
source: "/path/to/openapi.yaml",
language: "python",
pythonStyle: "pydantic"
})
// Returns: { code: "class Pet(BaseModel): ...", suggestedFileName: "pet_store_api_models.py" }
// Generate only specific schemas
generateApiModels({
source: "https://api.example.com/openapi.json",
language: "typescript",
schemas: ["User", "Order"]
})Typical Workflow Example
// 1. Open page
openBrowser({ url: "https://example.com/form" })
// 2. Analyze page to get element IDs
analyzePage()
// Returns: { tree: {...}, groups: {...}, meta: {...} }
// Elements: input_20 (email), input_21 (password), button_45 (submit)
// 3. Fill form using APOM IDs (preferred)
type({ id: "input_20", text: "user@example.com" })
type({ id: "input_21", text: "secret123" })
// 4. Submit using APOM ID
click({ id: "button_45" })
// 5. Verify
analyzePage({ refresh: true }) // See updated state
screenshot({ selector: ".dashboard", padding: 20 })Alternative: Using CSS selectors (still supported)
type({ selector: "input[name='email']", text: "user@example.com" })
click({ selector: "button[type='submit']" })Tool Usage Tips
Persistent Browser:
Browser windows remain open after each command
Manual interaction possible between AI requests
All tools work with currently open page
Best Practices:
Start with
openBrowserto establish contextUse
screenshotto verify visual resultsCombine tools for complex workflows
Tools use CDP (Chrome DevTools Protocol) for precision
Configuration
Basic Configuration (Linux, macOS, Windows)
Add the MCP server to your MCP client configuration file:
Claude Desktop (~/.claude/mcp_config.json or ~/AppData/Roaming/Claude/mcp_config.json on Windows):
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"]
}
}
}Claude Code (~/.claude.json):
{
"mcpServers": {
"chrometools": {
"type": "stdio",
"command": "npx",
"args": ["chrometools-mcp"],
"env": {}
}
}
}GUI Mode vs Headless Mode
The MCP server runs Chrome with headless: false by default, which means:
β Browser windows are visible on your screen
β You can interact with pages between AI requests
β You can see what the automation is doing in real-time
Requirements for GUI Mode:
Linux/macOS: X server (usually available by default)
WSL (Windows Subsystem for Linux): Requires X server setup (see WSL Setup Guide below)
Windows: No additional setup needed
Alternative: Headless Mode with Virtual Display (xvfb)
If you don't need to see the browser window, you can use xvfb (virtual X server):
{
"mcpServers": {
"chrometools": {
"type": "stdio",
"command": "xvfb-run",
"args": ["-a", "npx", "-y", "chrometools-mcp"],
"env": {}
}
}
}This runs Chrome in GUI mode but on a virtual display (window is not visible).
Tool Filtering with ENABLED_TOOLS
By default, all tools are enabled. You can selectively enable only specific tool groups using the ENABLED_TOOLS environment variable.
Why filter tools?
Each tool definition is sent to the AI in every request, consuming context tokens. Filtering tools can reduce token usage, improve focus, and lower API costs:
Save tokens: Fewer tools = less context consumed per request
Reduce costs: Lower token usage means lower API costs
Improve focus: AI sees only relevant tools for your workflow
Security/compliance: Restrict available capabilities when needed
Available Tool Groups:
Group | Description | Tools (count) |
| Basic tools |
|
| User interaction & frames |
|
| Page inspection |
|
| Debugging & network |
|
| Advanced automation & AI |
|
| Scenario recording |
|
| Figma integration |
|
Total: 48 tools across 7 groups
Configuration:
Claude Desktop (~/.claude/mcp_config.json):
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"],
"env": {
"ENABLED_TOOLS": "core,interaction,inspection"
}
}
}
}Claude Code (~/.claude.json):
{
"mcpServers": {
"chrometools": {
"type": "stdio",
"command": "npx",
"args": ["chrometools-mcp"],
"env": {
"ENABLED_TOOLS": "core,interaction,advanced"
}
}
}
}Format:
Comma-separated list of group names (e.g.,
"core,interaction,advanced")Spaces are automatically trimmed
If not set or empty, all tools are enabled (default behavior)
Example configurations:
Basic automation only:
"ENABLED_TOOLS": "core,interaction,inspection"Advanced automation with AI:
"ENABLED_TOOLS": "core,interaction,advanced"With debugging tools:
"ENABLED_TOOLS": "core,interaction,inspection,debug"Figma design validation:
"ENABLED_TOOLS": "core,figma"Full automation with recording:
"ENABLED_TOOLS": "core,interaction,inspection,debug,advanced,recorder"All tools (default):
"env": {}or omit the env field entirely.
Figma API Token Setup
To use Figma tools, you need to configure your Figma Personal Access Token.
How to get your Figma token:
Go to your Figma account settings: https://www.figma.com/settings
Scroll down to "Personal access tokens"
Click "Create a new personal access token"
Give it a name (e.g., "chrometools-mcp")
Copy the generated token
Add token to MCP configuration:
Claude Desktop (~/.claude/mcp_config.json or ~/AppData/Roaming/Claude/mcp_config.json on Windows):
{
"mcpServers": {
"chrometools": {
"command": "npx",
"args": ["chrometools-mcp"],
"env": {
"FIGMA_TOKEN": "your-figma-token-here"
}
}
}
}Claude Code (~/.claude.json):
{
"mcpServers": {
"chrometools": {
"type": "stdio",
"command": "npx",
"args": ["chrometools-mcp"],
"env": {
"FIGMA_TOKEN": "your-figma-token-here"
}
}
}
}Note: Alternatively, you can pass the token directly in each Figma tool call using the figmaToken parameter, but using the environment variable is more convenient.
Browser Connection (use your real, logged-in Chrome)
By default ChromeTools connects to a Chrome with remote debugging on port 9222, and if none is found it launches a fresh Chrome with a temporary profile (no cookies, no logins). To automate a site that needs your authenticated session (and to reach cross-origin iframes that depend on it), point ChromeTools at your own Chrome via environment variables β all optional:
Variable | Default | Purpose |
| (unset) | Direct CDP WebSocket URL (e.g. |
|
| Remote-debugging port to discover/connect to (and to launch with). |
|
| Chrome profile used when launching a new instance. Point at a real (or cloned) profile to reuse its cookies/logins. |
| platform default | Path to the Chrome executable. |
Quick path β attach to your already-logged-in Chrome:
Fully close Chrome (a profile can't open a debug port while another Chrome holds it).
Launch it with remote debugging on your normal profile:
# Windows chrome.exe --remote-debugging-port=9222 # macOS "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222Log into the target site in that Chrome. ChromeTools will
connect()to it β cross-origin iframes load authenticated, andlistTabssees your real tabs.
{
"mcpServers": {
"chrometools": {
"type": "stdio",
"command": "npx",
"args": ["chrometools-mcp"],
"env": {
"CHROMETOOLS_USER_DATA_DIR": "C:/Users/you/chrome-mcp-real-profile"
}
}
}
}Without any of these variables, behavior is unchanged.
WSL Setup Guide
If you're using Windows Subsystem for Linux (WSL), special configuration is required to display Chrome GUI windows.
π See the complete WSL Setup Guide: WSL_SETUP.md
The guide includes:
Step-by-step VcXsrv installation and configuration
MCP server configuration for WSL (3 different options)
Testing and troubleshooting procedures
Solutions for common issues
All reference links and resources
Quick Summary for WSL Users:
Install VcXsrv on Windows (Download)
Enable "Disable access control" in VcXsrv settings β οΈ (Critical!)
Configure MCP server with
DISPLAY=<your-windows-ip>:0environment variableFully restart your MCP client
For detailed instructions, see WSL_SETUP.md.
Development
# Install dependencies
npm install
# Run locally
npm start
# Test with MCP inspector
npx @modelcontextprotocol/inspector node index.jsFeatures
56+ Powerful Tools: Complete toolkit for browser automation (including model-based interaction system)
Core: ping, openBrowser
Interaction: click, type, scrollTo, selectOption, selectFromGroup, drag, scrollHorizontal, executeModelAction
Inspection: getElement, getComputedCss, getBoxModel, screenshot, saveScreenshot
Advanced: executeScript, getConsoleLogs, listNetworkRequests, getNetworkRequest, filterNetworkRequests, hover, setStyles, setViewport, getViewport, navigateTo, waitForElement
AI-Powered: smartFindElement, analyzePage, getElementDetails (with children analysis), findElementsByText - Recorder: enableRecorder, executeScenario, listScenarios, searchScenarios, getScenarioInfo, deleteScenario, exportScenarioAsCode, appendScenarioToFile, generatePageObject
Figma: getFigmaFrame, compareFigmaToElement, getFigmaSpecs, parseFigmaUrl, listFigmaPages, searchFigmaFrames, getFigmaComponents, getFigmaStyles, getFigmaColorPalette, convertFigmaToCode
UI Framework Detection: Automatic detection of MUI, Ant Design, Chakra UI, Bootstrap, Vuetify, Semantic UI- Smart Dropdown Handling: Extracts options from both native
<select>and custom UI framework components- APOM (Agent Page Object Model): Automatic element ID assignment for reliable interaction -analyzePage()returns elements with unique IDs (e.g.,input_20,button_45)Use
idparameter in click/type/hover/selectOption for stable targetingUse
getElementDetails()to get detailed element info
Console Log Capture: Automatic JavaScript console monitoring
Network Request Monitoring: Track all HTTP/API requests (XHR, Fetch, etc.)
Persistent Browser Sessions: Browser tabs remain open between requests
Multi-Instance Support: Run multiple MCP servers simultaneously with automatic discovery - Dynamic port allocation (9223-9227)
Chrome Extension port scanning every 20s
Broadcast pattern for parallel AI clients
Graceful handling of ungraceful shutdowns
Auto-Sync Active Tab: MCP server automatically syncs to user's currently active tab- Visual Browser (GUI Mode): See automation in real-time
Cross-platform: Works on Windows/WSL, Linux, macOS
Simple Installation: One command with npx
CDP Integration: Uses Chrome DevTools Protocol for precision
AI-Friendly: Detailed descriptions optimized for AI agents
Responsive Testing: Built-in viewport control for mobile/tablet/desktop
Multi-Instance Support
: Run up to 8 MCP servers simultaneously, connecting/disconnecting at any time without coordination.
Overview
ChromeTools MCP uses a Bridge Architecture for reliable multi-instance support:
Multiple AI clients (0-8) can connect/disconnect at any time
No scanning delays β instant connection to persistent Bridge Service
Resilient β Bridge survives MCP process crashes, maintains state
Chrome lifecycle β Bridge starts/stops with Chrome Extension
How It Works
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Claude Desktop β β Telegram Bot β β Custom Script β
β MCP Client β β MCP Client β β MCP Client β
ββββββββββ¬βββββββββ ββββββββββ¬βββββββββ ββββββββββ¬βββββββββ
β β β
β WebSocket β WebSocket β WebSocket
β (client) β (client) β (client)
β β β
ββββββββββββββββββββββΌβββββββββββββββββββββ
β
β
βββββββββββββββββββββββββββββββββ
β Bridge Service (:9223) β
β (Native Messaging Host) β
β β
β β’ Stores tabs state β
β β’ Stores recordings β
β β’ Broadcasts events β
β β’ Accepts 0-8 clients β
βββββββββββββββββ¬ββββββββββββββββ
β
β Native Messaging (stdio)
β
βββββββββββββββββ΄ββββββββββββββββ
β Chrome Extension β
β (Event Producer) β
β β
β β’ Tracks all tabs β
β β’ Records user actions β
β β’ Sends events to Bridge β
βββββββββββββββββ¬ββββββββββββββββ
β
β
βββββββββββββββββββββββββββββββββ
β Chrome Browser β
βββββββββββββββββββββββββββββββββInstallation
One-time setup (installs Native Messaging Bridge):
npx chrometools-mcp --install-bridgeThis:
Creates Bridge Service files in
~/.chrometools/Registers Native Messaging Host in system (Windows Registry / Chrome config)
Bridge will auto-start when Chrome Extension loads
Verify installation:
npx chrometools-mcp --check-bridgeArchitecture
1. Bridge Service (Persistent Intermediary)
Launched by Chrome via Native Messaging when Extension starts
Runs WebSocket server on port 9223
Stores state: tabs, recordings, recorder state
Lives as long as Chrome is running
Accepts 0-8 simultaneous MCP clients
2. Chrome Extension (Event Producer)
Tracks all browser tabs (created, updated, closed, activated)
Records user actions (clicks, typing, navigation)
Sends ALL events to Bridge via Native Messaging
Doesn't care about MCP clients β just produces events
3. MCP Server (Event Consumer)
Connects to Bridge as WebSocket client
Receives full state immediately on connect
Gets real-time event updates
Can disconnect/reconnect at any time without losing state
Use Cases
Ephemeral AI Sessions
# User sends message to Telegram bot
# β Claude Code starts, connects to Bridge
# β Gets current tabs state instantly
# β Performs automation
# β Claude Code exits, disconnects
# β Bridge keeps running, state preserved
# Next message: same flow, instant state accessParallel Workflows
# Claude Desktop: form automation
# Telegram Bot: monitoring & debugging
# Custom script: data extraction
# All connected to same Bridge
# All see same browser state
# All can control ChromeConfiguration
No configuration needed after installation. Just use:
npx chrometools-mcpMCP automatically connects to Bridge on startup.
CLI Options
npx chrometools-mcp --install-bridge # Install Native Messaging Bridge
npx chrometools-mcp --uninstall-bridge # Uninstall Bridge
npx chrometools-mcp --check-bridge # Check if Bridge is installed
npx chrometools-mcp --help # Show helpTechnical Details
Component | Technology | Port |
Bridge Service | Node.js + WebSocket Server | 9223 |
Extension β Bridge | Native Messaging (stdio) | β |
MCP β Bridge | WebSocket (client) | 9223 |
Max Clients: 8 simultaneous MCP connections
State on Connect: Full state (tabs, recordings, recorder state) sent immediately
Extension ID: dmehkibmncgphijnigkahhlekgajhpbl (stable, generated from key)
Troubleshooting
Bridge not connecting:
# Check if Bridge is installed
npx chrometools-mcp --check-bridge
# Reinstall if needed
npx chrometools-mcp --install-bridge
# Reload extension in chrome://extensionsExtension shows "Disconnected":
Bridge only runs when Chrome Extension is active
Close and reopen Chrome
Check Extension Service Worker console for errors
Known Limitations
Angular *ngFor with Dynamic Bindings
In Angular apps using Zone.js, any programmatic click (including CDP trusted events) can trigger change detection between event listener callbacks. If *ngFor iterates over a getter that returns a new array reference each time (e.g., [options]="getOptions()"), Angular destroys and recreates all child elements mid-dispatch, causing @HostListener('click') on the target element to never fire. Only real hardware mouse events (physical mouse) are immune β CDP events, despite being isTrusted: true, are not dispatched through the OS event queue.
ChromeTools automatically detects this: after each click, it checks if the target element was removed from DOM. If so, the ELEMENT DETACHED hint is shown with a workaround guide.
App fix (recommended): add trackBy to *ngFor, or cache the array reference instead of returning a new one each time.
Workaround when app fix is not possible β use executeScript to call the Angular component API directly:
// 1. Find the component instance
executeScript({ script: `
const comp = ng.getComponent(document.querySelector('my-component'));
// 2. Explore available events
Object.keys(comp).filter(k => k.includes('Event'));
` })
// 3. Emit the event directly (bypasses DOM click entirely)
executeScript({ script: `
const comp = ng.getComponent(document.querySelector('my-component'));
comp.selectedOptionChangeEvent.emit(comp.options.find(o => o.name === 'Delete'));
` })Architecture
Puppeteer for Chrome automation
MCP Server SDK for protocol implementation
Native Messaging Bridge for persistent Extension β MCP communication
WebSocket for multi-client support (Bridge as server, MCP as clients)
Zod for schema validation
Stdio transport for MCP communication
Available Tools
59 toolsanalyzePageA
PRIMARY tool for reading page state. Returns APOM tree: {tree, metadata, groups}. Compact format (default): containers as "tag_id":[children] keys, interactive elements as {id, tag, type, position, metadata} without selectors. Use element IDs (e.g., button_45, input_20) with click/type tools. Selectors registered internally for resolution. Use refresh:true after clicks. Efficient: 8-10k tokens vs screenshot 15-25k. Legend: clickTarget format is "tag:id" (e.g., "kp-chats-list-item:container_58") - use the id part for clicking. No clickTarget = element handles its own click.
| Name | Required | Description | Default |
|---|---|---|---|
| diff | No | Return only changes since last analysis: {added, removed, changed} (default: false). | |
| groupBy | No | Group elements: 'type' or 'flat' (default: 'type') | |
| refresh | No | Refresh cache (default: false) | |
| includeAll | No | Include all elements with selectors - full debug format (default: false for compact format) | |
| viewportOnly | No | Only analyze elements in current viewport (default: false). Reduces output for long pages. | |
| includePortals | No | Include React Portal contents β menus, tooltips, popovers outside main root (default: true). Without this, dropdown items are invisible. | |
| portalSelectors | No | Custom portal root CSS selectors. Default: ['#modal-root', '#menu-popup-root', '#tooltip-root', '#popover-root', '[data-portal]']. | |
| useLegacyFormat | No | Return legacy format instead of APOM (default: false - APOM is now default) | |
| registerElements | No | Auto-register elements in selector resolver (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return format (APOM tree), compact vs full format, internal selector registration, cache refresh requirement, token efficiency, and clickTarget legend. It doesn't discuss potential errors or side effects, but as a read tool this is reasonably 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 dense but well-structured, front-loading the core purpose. Every sentence provides useful information (format, IDs, refresh, efficiency, legend). It's longer than typical, but the content earns its place given the tool's 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?
For a tool with 9 parameters and no output schema, the description explains the return structure, element ID usage, refresh semantics, and format options. It gives enough context for an agent to use it effectively. Minor gaps exist around error behavior and full debug format details, but overall it's complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds some context beyond the schema (e.g., refresh after clicks, compact format), but doesn't need to re-explain parameters since the schema already documents them effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'PRIMARY tool for reading page state' with a specific verb and resource, and distinguishes it from sibling tools like screenshot and getElementDetails. It clearly conveys the tool's role and scope.
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 on when to use (primary read tool), and includes actionable guidance like 'Use refresh:true after clicks' and using element IDs with click/type tools. It does not explicitly name alternatives or when-not-to-use, but the 'PRIMARY' positioning and efficiency note imply the intended usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appendScenarioToFileA
Append scenario as test code to EXISTING file. Supports Page Object integration: 'generate-integrated' generates POM + test using it, 'use-existing' generates test using existing POM file. Use exportScenarioAsCode for new files.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | Target test framework and language | |
| testName | No | Override test name (default: from scenario name) | |
| targetFile | Yes | Path to existing test file to append to (REQUIRED) | |
| scenarioName | Yes | Name of scenario to export | |
| cleanSelectors | No | Remove unstable CSS classes (default: true) | |
| insertPosition | No | Where to insert test: 'end' (default - after all tests), 'before' (before reference test), or 'after' (after reference test) | |
| pageObjectFile | No | Path to existing POM file (required for 'use-existing' mode) | |
| pageObjectMode | No | POM integration: 'none' (default), 'generate' (separate POM), 'generate-integrated' (POM + test using it), 'use-existing' (test uses existing POM file) | |
| includeComments | No | Include descriptive comments (default: true) | |
| referenceTestName | No | Reference test name for 'before'/'after' insertion. Required when insertPosition is 'before' or 'after' | |
| generatePageObject | No | Also generate Page Object class for the page (default: false). Legacy - use pageObjectMode instead. | |
| pageObjectClassName | No | Page Object class name (optional, auto-generated if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden. It discloses that the tool appends to existing files and describes two Page Object modes, but omits the 'generate' mode behavior (separate POM creation) and does not detail failure conditions or side effects beyond appending. This is adequate but has clear 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?
Two concise, front-loaded sentences that immediately state the primary purpose and then provide key usage distinctions. 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?
With 12 parameters and full schema coverage, the description captures the core workflow (append to existing, use export for new) and key mode differences. It doesn't explain all modes, but the schema fills in details. No output schema is needed for an append operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving a baseline of 3. The description adds meaningful context for targetFile (must exist) and clarifies pageObjectMode values like 'generate-integrated' and 'use-existing', going beyond the schema's simple 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 appends scenario code to an existing file, using a specific verb and resource. It also distinguishes from the sibling tool by explicitly directing users to exportScenarioAsCode for new files.
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 alternative guidance: 'Use exportScenarioAsCode for new files' and implies this tool is for existing files. Also explains Page Object integration modes, giving clear context for when to use different configurations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickA
Click element by APOM ID (preferred) or CSS selector. Handles React/Vue/Angular events, waits for navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | APOM element ID from analyzePage (e.g., 'button_45'). Either id or selector required. | |
| timeout | No | Max wait ms (default: 30000) | |
| selector | No | CSS selector (e.g., '.submit-btn'). Either id or selector required. | |
| waitAfter | No | Wait ms (default: 1500) | |
| screenshot | No | Screenshot (default: false) | |
| waitTimeoutMs | No | Timeout for waitForSelector in ms (default: 2000). | |
| waitForSelector | No | CSS selector to wait for after click (atomic click+wait). Use for dropdowns/popups that render into portals. | |
| autoAnalyzeAfter | No | After click, diff APOM and append '+N appeared: id:"text"' delta to result. New ids are pre-registered for follow-up clicks. Use for dropdowns/menus opening with new options. | |
| waitForRouteChange | No | SPA route wait: after click, wait for location.pathname+search to change vs before; reports 'routeChanged:true/false'. Does not fail click on timeout. For URL-less view changes use waitForSelector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds two meaningful behaviors: 'Handles React/Vue/Angular events' and 'waits for navigation.' However, it omits other significant behaviors like waitForSelector, autoAnalyzeAfter, and waitForRouteChange, which are explained only in the schema. This 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?
The description is two concise sentences: the first states the action and identification methods; the second covers two key behaviors. Both sentences earn their place, and the content is front-loaded with the core action. There is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 9 parameters and no annotations or output schema, so the description must compensate for complexity. While the schema is 100% covered, the main description does not summarize advanced features like waitForSelector or autoAnalyzeAfter, which are essential for dropdowns/popups. The description is sufficient for basic clicks but incomplete for the tool's full capability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by specifying 'APOM ID (preferred)' over CSS selector, which is not explicit in the schema. It also implies the id/selector trade-off through framework event handling, adding semantic meaning beyond the raw parameter list.
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: 'Click element by APOM ID (preferred) or CSS selector.' It identifies the verb ('Click'), the resource ('element'), and the identification methods. It also distinguishes from sibling tools like type, hover, and pressKey by focusing on clicking and framework event 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 provides clear context: clicking elements with APOM ID preferred over CSS selector, and it handles framework events and waits for navigation. It does not explicitly mention alternatives or exclusions, but the tool's name and sibling list make the use case obvious (e.g., use click for mouse clicks, not for typing). This earns a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareFigmaToElementB
Compare Figma design with browser element. Pixel-perfect validation.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | Frame/component ID | |
| fileKey | Yes | File key | |
| selector | Yes | CSS selector | |
| threshold | No | Diff threshold (default: 0.05) | |
| figmaScale | No | Scale (default: 2) | |
| figmaToken | No | API token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It only says 'Pixel-perfect validation' without explaining whether the tool performs a read-only comparison, requires a live page, makes network calls to Figma API, or what happens on mismatch. No side effects, auth prerequisites, or failure behavior are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. The main verb and object are front-loaded in the first sentence, and the second sentence adds context ('Pixel-perfect validation'). It is appropriately sized for a tool with clear purpose, though slightly vague tone costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters, no output schema, and no annotations, yet the description is minimal. It fails to explain what the tool returns (e.g., a diff percentage or pass/fail), preconditions (e.g., element must exist and be visible), or how threshold and figmaScale affect the comparison. This is a substantial gap for a tool with this 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 description coverage is 100%, so the schema already documents all 6 parameters (fileKey, nodeId, selector, threshold, figmaScale, figmaToken) with meaningful descriptions. The tool description adds no semantic value beyond the schema, but the baseline of 3 applies because 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 the tool's function: 'Compare Figma design with browser element' β a specific verb and both resources. 'Pixel-perfect validation' adds scope. This clearly distinguishes it from sibling tools like getFigmaFrame (retrieves frame) or screenshot (captures browser), as none perform comparison.
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 a validation use case but provides no explicit guidance on when to use this tool vs alternatives like getFigmaFrame, screenshot, or getComputedCss. There are no exclusions or prerequisites stated, leaving the agent to infer context from the schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convertFigmaToCodeA
Convert Figma design to React/Tailwind code. Fetches node structure and rendered image, returns simplified design data with AI instructions for generating clean, semantic code. Focuses on React components with Tailwind CSS styling.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | Frame/component ID (formats: '123:456' or '123-456') | |
| fileKey | Yes | File key | |
| framework | No | Target framework (default: react) | |
| figmaToken | No | API token (optional) | |
| includeComments | No | Include comments (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool fetches node structure and rendered image and returns simplified design data with AI instructions, which is transparent about its internal process. However, it lacks explicit statements about side effects, error conditions, or prerequisites like authentication.
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 lead with the core purpose, followed by the process and focus area. Each sentence adds distinct value with no filler 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?
The description outlines the high-level workflow but does not detail the exact structure of the returned 'simplified design data' or possible limitations. With no output schema, this leaves some ambiguity about the response format, though it covers the tool's main function adequately.
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 provides 100% coverage for all five parameters, so the schema fully documents them. The description adds no parameter-specific details beyond what the schema already states, so it merits the baseline 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?
Clearly states it converts Figma designs to React/Tailwind code, with a specific verb, resource, and outcome. The process description (fetches node structure and rendered image, returns design data with AI instructions) distinguishes it from sibling tools like getFigmaFrame or getFigmaSpecs.
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 converting Figma designs to React/Tailwind code and mentions its focus on React/Tailwind styling, offering some context. However, it does not explicitly state when to use this tool over related Figma tools, nor does it provide exclusions or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deleteScenarioC
Delete scenario and secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Scenario name |
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 fails to disclose whether deletion is permanent, requires permissions, or what side effects occur (e.g., deleting secrets). The mention of 'secrets' is vague and adds 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 a single, concise sentence with no filler. It communicates the core purpose efficiently, though it lacks additional useful 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?
For a mutation tool with no annotations or output schema, the description is too thin. It does not explain permanence, confirmation, or the nature of 'secrets', leaving the agent uncertain about the operation's effects and safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes the sole parameter 'name' with 'Scenario name', achieving 100% coverage. The description does not add extra meaning beyond the schema, 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 ('Delete') and the resource ('scenario and secrets'), which distinguishes it from other scenario-related tools like listScenarios or exportScenarioAsCode. It lacks explicit distinction from potential delete-like siblings, but no such siblings exist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage context, prerequisites, or alternatives are mentioned. The tool is simple enough that usage is implied (when you want to delete a scenario), but no explicit guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dragA
Drag element in any direction. For maps, charts, SVG, canvas, sliders. Use mode='synthetic' for JS libraries (frappe-gantt, jQuery UI). Use scrollHorizontal for scrollbars.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Drag mode: 'native' (default, faster) or 'synthetic' (better for JS libraries) | |
| distance | No | Distance in pixels (default: 100) | |
| duration | No | Drag duration in ms (default: 500) | |
| selector | Yes | CSS selector for element to drag | |
| direction | Yes | Drag direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It does not explain how the drag is performed (e.g., mousedown/mousemove/mouseup sequence), what happens on failure, or effects of distance/duration. The only behavioral hint is the mode selection, which is already in 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?
The description is four short, front-loaded sentences. No filler words; each sentence adds actionable information (purpose, use cases, mode guidance, alternative tool). Excellent structure 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?
For a drag tool with no output schema and no annotations, the description provides essential usage context but lacks depth on behavioral nuances (e.g., coordinate origins, supported element types, error cases). It is adequate but leaves gaps that a more detailed description could fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining when to use 'synthetic' mode (JS libraries) and mentions scrollHorizontal as an alternative for scrollbars, enriching the understanding of parameters like mode and direction.
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 'Drag element in any direction' with specific use cases (maps, charts, SVG, canvas, sliders), distinguishing it from sibling tools like scrollHorizontal and click. 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?
Provides concrete usage guidance: use mode='synthetic' for JS libraries and use scrollHorizontal for scrollbars. This clarifies when to use this tool versus alternatives, though it doesn't explicitly list all exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enableRecorderB
Check ChromeTools Extension connection for scenario recording. Use Chrome Extension popup (CT icon) for recording.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 of disclosing behavior. It says 'Check connection' but does not mention whether the tool has side effects, what it returns, or what happens if the connection is missing. The name 'enableRecorder' also hints at a state change that the description does not confirm or deny.
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 and front-loads the core purpose. The second sentence adds a practical usage note. It is appropriately sized, though some wording could be more precise; it does not over-explain.
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 lacks essential behavioral context for a simple diagnostic tool: no expected return value, no failure behavior, and no mention of prerequisites. The ambiguity between 'enable' and 'check' further reduces completeness, and with no output schema or annotations, the description should provide more detail.
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 has zero parameters, so the baseline score is 4. No additional parameter details are needed, and the description does not introduce any parameter-related confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Check ChromeTools Extension connection') and context ('for scenario recording'), which differentiates it from tools like startRecording or stopRecording. However, the name 'enableRecorder' suggests an enabling action, while the description only says 'check', creating slight ambiguity about the tool's actual effect.
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 the tool should be used to verify the extension connection before recording, and provides an alternative ('Use Chrome Extension popup (CT icon) for recording'). It does not explicitly state when to avoid using this tool or compare it to sibling tools, so the guidance is mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
executeModelActionA
Universal tool to execute any model-specific action on element.
This tool works with element models (Strategy Pattern) and can execute any action defined by the model. Use analyzePage() first to see element's model and available actions in the 'models' map.
Models: TxtInp (text input), Sel (select), Btn (button), Chk (checkbox), Radio (radio), TxtArea (textarea), Link (link), Range (range), DatePicker (custom date picker), DateInp (HTML5 date), FileInp (file), ColorInp (color).
Examples:
executeModelAction({id: "input_20", action: "type", params: {text: "hello"}})
executeModelAction({id: "select_5", action: "selectOption", params: {value: "US"}})
executeModelAction({id: "datepicker_3", action: "SetDate", params: {date: "2024-03-15"}})
executeModelAction({id: "checkbox_7", action: "check"})
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Element APOM ID (e.g., 'input_20') from analyzePage. Either id or selector required. | |
| action | Yes | Action name to execute (e.g., 'type', 'click', 'SetDate'). See element's model in analyzePage 'models' map for available actions. | |
| params | No | Action parameters (depends on action). Examples: {text: 'hello'} for type, {date: '2024-03-15'} for SetDate, {value: 'US'} for selectOption | |
| selector | No | CSS selector (alternative to id). Either id or selector required. |
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 explains the Strategy Pattern mechanism and the prerequisite of calling analyzePage(), which is useful context. However, it does not disclose return format, error behavior, or potential side effects, despite examples showing mutating actions like type and check.
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 well-organized with a clear intro, prerequisite callout, model list, and examples. Each section adds useful information without wasting words. It is slightly longer than necessary but remains focused and readable.
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 model-driven complexity and the absence of an output schema, the description should explain return values and error behavior. It adequately covers the discovery workflow (analyzePage) and usage patterns, but leaves out critical execution outcomes (e.g., success/failure, return data), making it incomplete for an agent to use confidently.
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 covers all four parameters, but the description adds valuable concrete examples mapping actions to params (e.g., typeβtext, SetDateβdate, selectOptionβvalue, checkβno params). This goes beyond the schema's descriptions and clarifies 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: 'Universal tool to execute any model-specific action on element.' It distinguishes itself from specific sibling tools like click/type by being a generic action executor tied to element models. Examples further clarify the resource and action scope.
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 guidance to use analyzePage() first to discover available actions in the 'models' map. It also illustrates usage with multiple examples across different model types. However, it doesn't explicitly state when not to use this tool versus the specialized sibling tools, though that is implied by its universal nature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
executeScenarioB
Execute scenario by name with dependency resolution. Use projectId to disambiguate duplicate names.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Scenario name | |
| projectId | No | Optional: Project ID (domain) to disambiguate scenarios with same name. Examples: 'google', 'localhost-3000' | |
| parameters | No | Execution parameters | |
| executeDependencies | No | Execute dependencies (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must disclose behavior. It mentions dependency resolution as a behavioral trait, but it does not disclose potential side effects of executing a scenario, whether it modifies browser state, or error/failure behaviors. This is a significant gap for a tool that causes actions.
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 consists of two concise sentences with no redundant content. The first sentence delivers the core purpose, and the second adds a valuable usage tip. It is front-loaded and 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 complex execution tool with no output schema and no annotations, the description omits critical operational context: return values, side effects, error handling, and how execution fits into broader workflows. The schema covers parameters, but the behavioral and outcome context is severely under-specified.
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 schema already thoroughly describes all four parameters, including projectId's disambiguation role. The description only restates the projectId tip without adding new parameter-level meaning, so it stays at the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool executes a scenario by name and includes dependency resolution, using a specific verb and identifying the resource. This distinguishes it from sibling tools like deleteScenario or saveScenario. The disambiguation tip adds precision.
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 parameter-specific guideline for projectId but does not explicitly state when to choose this tool over alternatives like executeScript or deleteScenario. Usage context is implied by the name and core action, but no exclusions or alternative comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
executeScriptA
β οΈ LAST RESORT tool - use ONLY when ALL specialized tools failed. NEVER use for: clicking (use click), typing (use type), scrolling (use scrollTo), reading page elements (use analyzePage), finding elements (use findElementsByText), fetching API data (use listNetworkRequests + getNetworkRequest). May break React/Vue/Angular synthetic events. ALWAYS try specialized tools first.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | JavaScript code | |
| timeout | No | Max wait ms (default: 30000) | |
| waitAfter | No | Wait ms (default: 500) | |
| screenshot | No | Screenshot (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the key risk: may break React/Vue/Angular synthetic events. It also sets expectations as a destructive/advanced tool by labeling it LAST RESORT. However, it does not mention other possible side effects (e.g., page navigation, state mutation beyond the script's scope) or return value behavior, which would be useful for a raw script execution 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 compact, front-loaded with the critical warning, and every sentence provides actionable guidance. It uses bullets-like structure with 'NEVER use for' list, making it easy to parse. No wasted words; it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, and the description does not explain what the script execution returns (e.g., the script's result value, whether the result is serialized, or how errors are surfaced). Given the tool's power and fallback nature, this omission is a gap. The usage context is well-covered, but the execution result and post-conditions are left ambiguous, so completeness is below the ideal for a high-risk 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%, so the baseline is 3. The description does not add additional parameter-level semantics beyond what the schema already provides (script code, timeout, waitAfter, screenshot). It does not compensate with extra detail, but the schema is sufficient, so a 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 name 'executeScript' and description clearly indicate this tool executes JavaScript. It explicitly positions itself as a LAST RESORT fallback and distinguishes itself from specialized sibling tools by listing what it should NOT be used for (clicking, typing, etc.). The verb+resource+scope is clear and differentiates from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: use ONLY when ALL specialized tools failed, and lists specific alternatives for common actions (click, type, scrollTo, analyzePage, etc.). It also advises against using it with React/Vue/Angular due to synthetic event breakage. This is a model of clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportScenarioAsCodeA
Export scenario as test code for NEW file. Supports Page Object integration: 'generate-integrated' generates POM + test using it, 'use-existing' generates test using existing POM file. Use appendScenarioToFile for existing files.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | Target test framework and language | |
| scenarioName | Yes | Name of scenario to export | |
| cleanSelectors | No | Remove unstable CSS classes (default: true) | |
| pageObjectFile | No | Path to existing POM file (required for 'use-existing' mode) | |
| pageObjectMode | No | POM integration: 'none' (default), 'generate' (separate POM), 'generate-integrated' (POM + test using it), 'use-existing' (test uses existing POM file) | |
| includeComments | No | Include descriptive comments (default: true) | |
| generatePageObject | No | Also generate Page Object class for the page (default: false). Legacy - use pageObjectMode instead. | |
| pageObjectClassName | No | Page Object class name (optional, auto-generated if not provided) |
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 that the tool targets new files and describes POM integration behaviors, which adds context. However, it doesn't state whether the tool writes a file, returns code, or what happens if the file already exists, leaving side effects unclear.
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-loaded with the core purpose, and includes necessary differentiation and mode explanations without excess. It could be slightly better organized, but it is appropriately 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?
For a tool with 8 parameters and no output schema, the description covers core purpose and main mode options but omits important behavior like return value, file creation details, or handling of optional parameters. It is adequate for a basic understanding but not fully complete for an agent deciding to invoke it.
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 repeats some enum semantics already present in the schema (e.g., pageObjectMode explanations) and adds the 'NEW file' context, but it doesn't significantly enhance understanding of parameters like cleanSelectors or includeComments 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 states the tool exports a scenario as test code for a NEW file, which is a specific action on a specific resource. It explicitly distinguishes from appendScenarioToFile, making the purpose unambiguous and differentiating it from 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?
It directly says 'Use appendScenarioToFile for existing files,' providing a clear alternative for the append case. It also explains the different pageObjectMode options, giving context on when to choose each mode. However, it doesn't explicitly mention when not to use this tool for other scenarios, but the key alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filterNetworkRequestsA
Filter network requests by URL pattern. Returns matching requests with full details.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear after read (default: false) | |
| types | No | Filter types (default: Fetch, XHR) | |
| urlPattern | Yes | URL pattern (regex or partial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose all behavioral traits. It only says 'Returns matching requests with full details,' which suggests a read operation. However, it omits the destructive 'clear' behavior (from the schema), the default types (Fetch, XHR), and any side effects. The tool could clear the network log if clear=true, which is a significant undisclosed 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?
The description is a single concise sentence that conveys the core purpose and return value without any fluff or redundant information. It is front-loaded and every word 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?
For a simple filter tool with 3 parameters and full schema coverage, the description is adequate but lacks key context. It does not mention that the tool can also filter by request types, nor does it disclose the clear side effect or default types. Without an output schema, the return format is vague ('full details'), but the tool's simplicity keeps completeness at a moderate level.
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 all parameters with 100% coverage, so the baseline is 3. The description does not add any parameter-specific meaning beyond the schema. It mentions URL pattern but doesn't elaborate on the 'types' or 'clear' parameters, which are already explained 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 verb 'Filter' and the resource 'network requests' with the specific criterion 'by URL pattern.' This distinguishes it from sibling tools like 'listNetworkRequests' (which lists all) and 'getNetworkRequest' (which retrieves one). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for filtering network requests, but it does not explicitly state when to use it over alternatives like 'listNetworkRequests' or provide any exclusions. The usage context is only implied via the tool name and description, with no mention of the 'types' parameter or clear flag that would affect usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findElementsByTextA
Find elements by visible text content and get their selectors. Use this INSTEAD of executeScript when you need to find elements. Returns working selectors that can be used with click/type tools. Can optionally perform actions directly.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Search text | |
| exact | No | Exact match (default: false) | |
| action | No | Optional action on first match | |
| caseSensitive | No | Case sensitive (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It discloses that the tool can 'optionally perform actions directly', implying non-read-only behavior, but does not elaborate on side effects (e.g., clicking may navigate) or state that the default is read-only. This is a partial disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loads the core purpose, and provides useful guidance. Minor redundancy exists between 'get their selectors' and 'Returns working selectors', but no fluff is present and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a nested action object and no output schema. The description covers the main use case and the alternative to executeScript, but it does not explain the return format (e.g., array of selectors) or that actions apply to the first match (only mentioned in the schema). Some operational details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds semantic value by specifying 'visible text content' for the text parameter, but it does not clarify exact, caseSensitive, or action semantics beyond the schema's brief 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 ('Find') and resource ('elements by visible text content'), and states the output ('get their selectors'). It explicitly distinguishes from executeScript by saying 'Use this INSTEAD of executeScript', which clarifies its unique role.
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 when-to-use guidance: 'when you need to find elements', and names an alternative: 'INSTEAD of executeScript'. It also states that returned selectors work with click/type tools, giving downstream usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generateApiModelsA
Generate typed data models from OpenAPI/Swagger spec. Creates TypeScript interfaces/types or Python dataclasses/pydantic/TypedDict from API schemas. Handles $ref resolution, enums, allOf/oneOf, nested objects. Use after loadSwagger to generate model files.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | TypeScript only: 'interface' (default) or 'type' aliases | |
| format | No | Spec format (default: auto) | |
| source | Yes | URL or file path to OpenAPI spec | |
| schemas | No | Generate only these schemas (default: all) | |
| language | Yes | Target language for models | |
| pythonStyle | No | Python only: 'dataclass' (default), 'pydantic', or 'typeddict' | |
| includeEnums | No | Generate enum types (default: true) | |
| includeValidation | No | Include validation constraints as comments (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It goes beyond a generic statement by enumerating technical behaviors: $ref resolution, enums, allOf/oneOf, and nested objects. It also discloses the side effect of generating model files, but stops short of mentioning overwrite behavior or output location.
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, each earning its place. It front-loads the core purpose, then adds capabilities and usage timing. 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?
The tool has 8 parameters and no output schema or annotations. The description covers the core functionality and dependency on loadSwagger, but leaves out output specifics (e.g., where files are written, return value, error behavior). It is adequate but not fully complete for a tool of this 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?
All 8 parameters have schema descriptions (100% coverage), so the baseline is 3. The description does not add additional context for any specific parameter beyond what the schema provides; it only references languages and styles in a general way, which the schema already caps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Generate typed data models from OpenAPI/Swagger spec.' It names target output types (TypeScript interfaces/types, Python dataclasses/pydantic/TypedDict) and source schemas, clearly distinguishing it from sibling tools like loadSwagger.
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 final sentence 'Use after loadSwagger to generate model files' provides clear context for when to invoke this tool, directly referencing a sibling as a prerequisite. It does not explicitly state exclusions or alternatives, but the relationship to loadSwagger is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generatePageObjectA
Generate Page Object Model (POM) class from current page analysis. Analyzes page structure, extracts interactive elements (inputs, buttons, links), groups them by sections (header, nav, form, etc.), and generates framework-specific code. Supports Playwright (TypeScript/Python) and Selenium (Python/Java). Auto-generates smart element names and helper methods.
| Name | Required | Description | Default |
|---|---|---|---|
| className | No | Page Object class name (optional, auto-generated from page title/URL if not provided) | |
| framework | No | Target test framework (default: playwright-typescript) | |
| groupElements | No | Group elements by page sections (default: true) | |
| includeComments | No | Include descriptive comments in generated code (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses analysis, element extraction, grouping, and helper generation, but leaves ambiguous whether the tool writes files, returns code to the UI, or requires a prior analyzePage call. The lack of side-effect or prerequisite disclosure is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary purpose. Each sentence adds distinct value: generation of POM, the analysis/extraction/grouping behavior, and supported frameworks. 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?
The tool is moderately complex with four parameters and no output schema. The description explains what the generated code does at a high level but omits how the code is returned/stored and whether a prior analysis step is mandatory. This incomplete output/usage contract lowers 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?
All four parameters have schema descriptions (100% coverage), so baseline is 3. The description adds minor context (grouping to sections, framework support) but doesn't clarify parameter values or interactions 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?
Description opens with a specific verb-resource pair: 'Generate Page Object Model (POM) class from current page analysis.' It goes on to detail the analysis and generation behaviors (extracting elements, grouping by sections, framework-specific code), which clearly distinguishes it from sibling tools like generateApiModels or convertFigmaToCode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from current page analysis' implies a workflow dependency but does not explicitly state when to use this tool versus alternatives like analyzePage or other generators. It lists supported frameworks but gives no exclusions, alternatives, or prerequisites, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getBoxModelB
Get element box model: dimensions, positioning, margins, padding, borders.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. The verb 'Get' implies a read-only operation, and the description lists the categories of data returned. However, it does not disclose error behavior, return format, or any side-effect potential, which is a gap but not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the primary action and resource, followed by a colon-separated list of the included properties. There is no redundant wording, making it highly 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 simple single-parameter tool with no output schema, the description adequately conveys the return categories (dimensions, positioning, margins, padding, borders). It could be more explicit about the return structure (e.g., units or coordinate system), but overall it is sufficiently complete for an agent to understand the tool's basic function.
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 has 100% coverage (selector described as 'CSS selector'), so the baseline is 3. The description adds no additional meaning beyond the schema, but it does imply that the selector refers to an element from which the box model is obtained.
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 with a specific verb ('Get') and resource ('element box model'), and enumerates the contained data (dimensions, positioning, margins, padding, borders). This is more specific than a generic 'get element info' and differentiates from siblings like getComputedCss, though it does not explicitly mention alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like getComputedCss or getElementDetails. There are no stated scenarios, exclusions, or prerequisites, leaving the agent to infer usage from the name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getComputedCssA
Get computed CSS styles for element. For layout debugging and responsive design.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter: 'layout', 'typography', 'colors', 'visual', 'all' (default) | |
| selector | No | CSS selector (default: body) | |
| properties | No | Specific properties. Overrides category. | |
| includeDefaults | No | Include defaults (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description should carry the full burden. While 'Get' implies a read operation, the description does not explicitly confirm it is non-mutating, nor does it disclose any potential side effects, performance considerations, or return format. It restates the tool's function without adding behavioral insights.
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, front-loaded with the core purpose and followed by the primary use case. 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?
With no output schema and no annotations, the description should explain return values and edge cases. It does not describe the response structure or any limitations. Given the tool's simplicity and full parameter documentation, this is an acceptable but not 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 description coverage is 100%, and the schema documents all four parameters clearly. The description adds no additional parameter guidance beyond the schema, so it meets the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get computed CSS styles for element', using a specific verb and resource. It distinguishes itself from sibling tools like getBoxModel and getFigmaStyles by specifying 'computed CSS styles'.
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 adds 'For layout debugging and responsive design', providing clear usage context. However, it does not explicitly mention when not to use it or point to alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getConsoleLogsA
Get browser console messages. For debugging JS errors and tracking behavior.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear after read (default: false) | |
| types | No | Filter types (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It only states 'Get browser console messages' and gives a purpose, but does not mention that the 'clear' parameter can delete messages after reading, nor does it describe any return format or side effects. The description is insufficient for an unannotated 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 short, front-loaded sentences with no filler: 'Get browser console messages. For debugging JS errors and tracking behavior.' Every word serves a 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?
With no output schema, the description should clarify return values, but it does not. It also omits behavioral nuances such as the clearing side effect. For a simple tool with two optional parameters, the description is too sparse to be 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%, with both parameters ('clear' and 'types') having descriptions. The tool description itself adds no parameter-level meaning, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and a clear resource 'browser console messages', followed by a stated purpose 'For debugging JS errors and tracking behavior.' This unambiguously distinguishes it from sibling tools like listNetworkRequests or listTabs.
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 usage context: 'For debugging JS errors and tracking behavior.' This tells the agent when to use the tool, though it doesn't explicitly mention alternatives or exclusions relative to other debugging tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getElementDetailsA
Get detailed information about element by its APOM ID. Returns full element details including bounds, CSS selector, position, attributes, and computed styles. Can also analyze children elements tree structure. Use this when analyzePage output was simplified and you need complete information about specific element or analyze specific sections in detail.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | APOM element ID (e.g., 'input_20', 'button_45') from analyzePage result | |
| refresh | No | Force refresh of cached analysis (default: false) | |
| includeAll | No | When analyzing children, include all elements, not just interactive ones (default: false) | |
| analyzeChildren | No | Analyze children elements tree structure (default: false) |
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 discloses what the tool returns (bounds, CSS selector, position, attributes, computed styles) and mentions the optional children tree analysis. However, it doesn't explicitly state that the operation is read-only or non-destructive, nor does it mention caching behavior (relevant to the 'refresh' parameter) or any side effects. The 'Get' verb implies read-only, but without annotations, more explicit disclosure would be ideal.
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, consisting of three sentences that front-load the core purpose, then describe the output, and finally state when to use it. Every sentence adds value, with no redundancy or fluff. It is well-structured and easy to scan.
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 annotations, no output schema, and four parameters, the description does a solid job of covering the essential context: what it does, what it returns, and when to use it. The schema handles parameter details fully. It could be more complete by noting error behavior or preconditions, but for a read-only retrieval tool, it adequately covers invocation and purpose.
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 provides 100% coverage with descriptions for all four parameters, so the baseline is 3. The description adds some context by explaining the APOM ID usage and the children analysis feature, which aligns with the 'id' and 'analyzeChildren' parameters, but it doesn't add significant new semantic information beyond the schema. The description's mention of analyzePage output simplified context helps clarify the 'id' source, earning a 3 rather than a lower score.
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: 'Get detailed information about element by its APOM ID.' It specifies the resource (element) and the action (get details), and differentiates itself from siblings by mentioning it returns full details including bounds, CSS, position, attributes, and computed styles, plus optional children tree analysis. This distinguishes it from more specialized tools like getBoxModel or getComputedCss.
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 the tool: 'Use this when analyzePage output was simplified and you need complete information about specific element or analyze specific sections in detail.' This provides clear context and references a sibling tool (analyzePage). However, it doesn't explicitly mention when not to use it or name alternative tools for specific scenarios, so it misses the full 'when-not/alternatives' rubric.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFigmaColorPaletteA
Extract color palette. Returns unique colors with hex, rgba, usage count.
| Name | Required | Description | Default |
|---|---|---|---|
| fileKey | Yes | File key or URL | |
| figmaToken | No | API token (optional) |
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 fails to explicitly state that this is a read-only operation without side effects, nor does it mention authentication requirements or error behavior. It only describes the output, leaving safety and side-effect assumptions to the agent.
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, front-loaded with the primary purpose, and every word adds value. It is appropriately sized for a simple tool with no unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple extraction tool with a sparse schema and no output schema, the description adequately covers what the tool does and what it returns. It could clarify whether the palette is for the whole file or a selection, but it is sufficient for basic usage.
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 parameters (fileKey and figmaToken) with clear descriptions, so the description does not need to add extra parameter semantics. It adds no new parameter-level information, but the schema is sufficient.
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 ('Extract color palette') and describes the output (unique colors with hex, rgba, usage count). This distinguishes it from sibling tools like getFigmaStyles or getFigmaFrame, which have different purposes.
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?
Usage context is implied by the name and descriptionβuse this when needing color palette data from a Figma fileβbut no explicit guidance is given about when to prefer this over alternatives, nor are any exclusions or preconditions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFigmaComponentsB
Get all components from file (Design System). For extracting design system.
| Name | Required | Description | Default |
|---|---|---|---|
| fileKey | Yes | File key or URL | |
| figmaToken | No | API token (optional) |
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 mentions the action but does not describe the return format, authentication behavior beyond the optional token, potential large payloads, or any side effects. Minimal behavioral context beyond the verb.
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 short and front-loaded with the main action. The second clause ('For extracting design system') is slightly redundant with the parenthetical '(Design System)' but still adds intent clarification. Overall, it is concise with minor 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?
There is no output schema and no annotations, so the description should explain what the tool returns and any important operational context. It does not; the output format is ambiguous, and the tool is not contextualized within the Figma sibling family. The description is adequate only for a simple read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with useful descriptions ('File key or URL' and 'API token (optional)'). The description adds no additional parameter guidance, so it meets the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Get all components') and the target ('from file'), with a parenthetical hint about design systems and a purpose clause. It distinguishes itself from sibling tools like getFigmaStyles by focusing specifically on components.
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 general purpose ('For extracting design system') but does not explicitly state when to use this tool versus alternatives such as getFigmaStyles or getFigmaColorPalette, nor does it mention exclusions. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFigmaFrameC
Export Figma frame as PNG. Requires API token and file/node IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Scale (default: 2) | |
| format | No | Format (default: png) | |
| nodeId | Yes | Frame/component ID | |
| fileKey | Yes | File key | |
| figmaToken | No | API token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior, but it only mentions requirements. It does not explain the return format (e.g., base64 PNG data, URL), failure modes, or side effects. The statement about token requirement is also ambiguous given the schema marks it optional.
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?
Single, brief sentence states purpose and requirements without waste. Very economical and easy to parse.
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 without output schema and annotations, the description omits essential return value information and usage context. It is not complete enough for an agent to understand what the tool returns or when to prefer it over other Figma tools.
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 applies. The description adds little beyond the schema, except noting the requirement for token and IDs, which may conflict with the optional figmaToken parameter. It does not provide additional semantic detail for scale or format.
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 exports a Figma frame as PNG, using a specific verb and resource. However, it mentions PNG only while the schema supports jpg and svg, slightly narrowing the actual functionality. It distinguishes from sibling tools like getFigmaSpecs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternative Figma tools like getFigmaSpecs or listFrames. The only context is the requirement for an API token and file/node IDs, which is more of a prerequisite than a usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFigmaSpecsB
Extract design specs from Figma: colors, fonts, dimensions, spacing.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | Frame/component ID | |
| fileKey | Yes | File key | |
| figmaToken | No | API token (optional) |
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 for behavioral disclosure. It only lists the data types extracted and does not mention authentication requirements (the figmaToken parameter is optional but not explained in context), network calls, return format, or potential side effects. This is minimal and leaves the agent guessing about the tool's operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, tightly worded, and front-loads the purpose. Every word contributes, and the list of spec types adds useful detail without bloat. It is a model of conciseness.
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 extraction tool with fully documented schema, the description is minimally adequate. However, without an output schema, the agent is left to infer the return structure, and the absence of usage guidance or behavioral details (e.g., whether this replaces or complements sibling tools) leaves gaps. It is enough to understand the basic purpose but not fully complete for robust selection.
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 100% coverage with descriptions for each parameter (nodeId, fileKey, figmaToken). The description adds no additional parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Extract' and clearly identifies the resource ('design specs from Figma') while enumerating the categories (colors, fonts, dimensions, spacing). This provides a clear sense of the tool's function, though it does not explicitly differentiate itself from overlapping siblings like getFigmaStyles or getFigmaColorPalette, which might also extract similar data.
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?
There is no guidance on when to use this tool versus the many Figma-related siblings (e.g., getFigmaStyles, getFigmaFrame, getFigmaColorPalette). The description simply states the action without indicating whether this is the comprehensive extractor or if specialized tools should be preferred for specific spec types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFigmaStylesA
Get all styles: color, text, effect, grid. For extracting design tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| fileKey | Yes | File key or URL | |
| figmaToken | No | API token (optional) |
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 of behavioral disclosure. It does not mention authentication requirements, rate limits, pagination, or any side effects. Although 'get' implies a read-only action, the description lacks explicit safety context and does not go beyond the basic 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 extremely concise: two short sentences that immediately state the action and the purpose. Every word earns its place, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple interface with two parameters and no output schema, so the description should ideally convey what the return value looks like or any caveats. It explains the scope (color, text, effect, grid) and purpose, but does not mention return format or file-level limitations. This is adequate but not 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?
The input schema already provides 100% coverage for both parameters (fileKey and figmaToken). The description adds no additional parameter-level meaning beyond what the schema states, so it appropriately relies on the schema. Baseline 3 is warranted.
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 all styles (color, text, effect, grid) and explicitly ties it to extracting design tokens. The verb 'get' plus the resource 'styles' is specific and distinguishes it from sibling tools like getFigmaColorPalette or getFigmaComponents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'For extracting design tokens' provides a clear context for when to use this tool. It does not explicitly exclude alternatives or name when-not-to-use, but the stated purpose is enough to guide an agent toward selecting it for design token extraction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getNetworkRequestA
Get network request details (headers, payload, response). Use requestId from listNetworkRequests.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | Request ID |
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 discloses the return fields (headers, payload, response) and the dependency on requestId from listNetworkRequests. However, it does not mention error behavior, whether network recording must be active, or that the operation is read-only (though implied by 'Get'). This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the main action and details. Every word earns its place, with no redundancy or unnecessary 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 single-parameter tool with no output schema, the description sufficiently covers purpose, parameter source, and partial return shape. It lacks explicit error handling or edge-case behavior, but the low complexity and simple getter nature make this an acceptable level of 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?
The schema fully documents requestId with 'Request ID' (100% coverage), so the baseline is 3. The description adds contextual value by specifying 'Use requestId from listNetworkRequests,' telling the agent where to obtain a valid ID, which enriches parameter 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: 'Get network request details (headers, payload, response).' It specifies a concrete verb and resource and distinguishes itself from sibling tools like listNetworkRequests by focusing on single-request details and referencing the list tool for obtaining IDs.
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 a clear workflow hint: 'Use requestId from listNetworkRequests.' This tells the agent when to use this tool (after listing) and where to get the required parameter. It doesn't explicitly mention alternatives, but the context is sufficiently clear for a read operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getRecorderStateA
Get current recorder state: isRecording, isPaused, action count, current tab
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It states the tool returns state fields, and 'Get' implies a read-only operation, but it doesn't clarify preconditions like whether the recorder must be enabled/started, or what happens if it isn't.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the purpose and lists the return fields. Every word contributes meaning, with no redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description is nearly complete: it enumerates all expected return fields. However, terms like 'action count' and 'current tab' are slightly ambiguous without further type or format details, though this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete (100% coverage). The description doesn't need to explain parameters, earning the baseline score of 4 for zero-parameter tools.
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 ('Get') and resource ('current recorder state'), then enumerates the exact returned fields: isRecording, isPaused, action count, current tab. This clearly distinguishes it from sibling recording-control tools like startRecording and stopRecording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Get current recorder state' clearly communicates the tool's purpose and implies when to use it, but it doesn't explicitly mention exclusions or alternative tools. No direct sibling tool competes for this functionality, so this is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getScenarioInfoA
Get scenario details: actions, parameters, dependencies.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Scenario name | |
| includeSecrets | No | Include secrets (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description alone must disclose behavioral traits. It only states that it retrieves details, implying read-only, but does not mention error behavior, secret handling defaults, or whether it requires any permissions. This is a significant gap for a tool 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?
Single sentence front-loads the purpose and lists the data returned. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with two well-documented parameters, the description covers the main purpose and return content (actions, parameters, dependencies). However, lack of output schema and annotations means the description should also clarify error handling and secret inclusion behavior, which it partially inherits from the schema but doesn't explicitly state. Still, it's adequately complete 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?
The input schema already documents both parameters fully: 'name' as scenario name and 'includeSecrets' with default. The description adds no additional meaning to either parameter, merely using the word 'parameters' generically, which could confuse with scenario parameters vs tool 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?
Clear verb+resource: 'Get scenario details' specifies the action. The additional list 'actions, parameters, dependencies' clarifies the scope of details, distinguishing from siblings like listScenarios or searchScenarios which focus on listing/searching rather than fetching full details of a specific scenario.
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 when you need full scenario details by name, but it doesn't explicitly state alternatives or exclusions. There are siblings like listScenarios and searchScenarios, but the description's mention of 'details' suggests the use case. Still, no explicit guidance on when to use this vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getViewportA
Get viewport size and pixel ratio. For responsive design testing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. The verb 'Get' implies a read-only operation, and the description specifies the two outputs (size and pixel ratio). However, it does not explicitly state that there are no side effects, nor does it describe the exact return format, which would be valuable for 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?
The description is exceptionally concise: two short sentences that front-load the action and purpose. Every word earns its place, with no filler or redundant 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 low complexity (no parameters, no output schema), the description adequately covers the essentials: what it does and a key use case. It lacks details about return formatting or edge cases, but for a simple getter tool, this is largely sufficient. The absence of an output schema slightly raises the bar, but the description's explicit mention of the returned values helps bridge that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline per rubric is 4. The description adds semantic value by telling the user what information the tool returns (viewport size and pixel ratio), which goes beyond the empty input schema and compensates for the lack of an output 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: to get viewport size and pixel ratio. It uses a specific verb ('Get') and resource ('viewport'), and distinguishes it from sibling tools like setViewport, which performs the opposite action. The mention of 'pixel ratio' adds precision about what is retrieved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'For responsive design testing' provides clear context for when to use this tool. However, it does not explicitly mention alternatives or exclusions, such as contrasting with setViewport for changing the viewport. This is clear but lacks direct comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hoverA
Hover over element by APOM ID or CSS selector. For hover effects, tooltips, :hover states.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | APOM element ID from analyzePage. Either id or selector required. | |
| selector | No | CSS selector. Either id or selector required. |
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 of behavioral disclosure. It only states the action and use cases, but does not mention potential side effects (e.g., triggering JavaScript events, network requests), whether it performs a real mouse move, or behavior on failure/visibility.
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 the core action and target, followed by use cases. No wasted words or redundant qualifiers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with full schema coverage, the description provides adequate purpose and usage context. However, with no annotations or output schema, it lacks return value/error behavior and any safety profile, making it minimally viable rather than 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%, with both parameters fully described. The description repeats 'by APOM ID or CSS selector' but does not add semantic detail 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 uses a specific verb ('Hover over element') and clearly identifies the resource ('element by APOM ID or CSS selector'). It distinguishes hover from sibling tools like click and type by naming the action and use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'For hover effects, tooltips, :hover states.' However, it does not mention alternatives or when not to use it, so it falls short of full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listFigmaPagesA
Get file structure: all pages and frames. Use first to discover file contents.
| Name | Required | Description | Default |
|---|---|---|---|
| fileKey | Yes | File key or URL | |
| figmaToken | No | API token (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavior. It states the tool returns file structure with all pages and frames, but does not mention output format, pagination, errors, or any other behavioral specifics. This is adequate but not rich, warranting a mid-range score.
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 short sentences, front-loaded with the action and scope, and contains no unnecessary words. Every word earns its place, making it very concise 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?
For a simple tool with two well-documented parameters and no output schema, this description is largely complete. It offers clear purpose and usage guidance. A minor gap is the lack of detail about the structure of the returned data, but the phrase 'all pages and frames' gives a reasonable hint. Overall, it is 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 description coverage is 100% for both parameters (fileKey and figmaToken), so the schema already provides full meaning. The description adds no additional parameter context beyond what the schema defines, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Get') and resource ('file structure'), specifying it covers 'all pages and frames'. It distinguishes from sibling tools like listFrames and getFigmaFrame by positioning as an initial discovery tool for file contents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use first to discover file contents' provides clear contextual guidance for when to use this tool, implying it is the initial step before exploring specific frames or components. However, it does not explicitly name alternatives or state when not to use, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listFramesA
List all frames (main + iframes) on the current page with url/name/isMain, plus the currently active frame. Use to discover cross-origin iframes (e.g. app.example.com), then switchFrame into one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 discloses the output fields (url/name/isMain and active frame) and the purpose of discovering cross-origin iframes, but it does not explicitly state that the operation is read-only or describe potential side effects (e.g., whether it modifies the page or returns an empty list). The verb 'list' implies a safe read, but more explicit behavioral disclosure would be helpful.
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, highly concise and front-loaded. The first sentence states the core functionality and output fields; the second gives usage context and a pointer to a sibling tool. Every sentence earns its place 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?
For a zero-parameter, no-output-schema tool, the description is complete: it specifies what is returned (frames with url/name/isMain, plus active frame), the use case (discovering cross-origin iframes), and a transition to the relevant sibling tool (switchFrame). No significant gaps remain for an agent to know when and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific detail because none exist, and the schema is empty, leaving no ambiguity. It fully covers the minimal parameter semantics 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?
The description clearly states the tool lists all frames (main and iframes) on the current page with specific fields (url/name/isMain) and includes the active frame. The verb 'List' and resource 'frames' are specific, and the mention of 'then switchFrame into one' distinguishes it from the sibling tool switchFrame.
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 an explicit use case: 'Use to discover cross-origin iframes (e.g. app.example.com), then switchFrame into one.' It also implicitly names the alternative (switchFrame) and the scenario where this tool is appropriate, making the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listNetworkRequestsA
List network requests (method, URL, status). Use getNetworkRequest for details. Supports pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear after read (default: false) | |
| limit | No | Max requests (default: 50) | |
| types | No | Filter types (default: Fetch, XHR) | |
| offset | No | Skip requests (default: 0) | |
| status | No | Filter status (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. It states the return scope (method, URL, status) and pagination behavior, but does not mention potential side effects such as the 'clear' parameter which can clear data after reading. Since the schema documents this parameter, the omission is not severe, but the description alone does not fully disclose behavior for all options.
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, consisting of three short sentences that each add value: what is listed, a pointer to details, and pagination. Information is front-loaded and there is no redundant wording.
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 schema covers all parameters and the description indicates the output fields and pagination, the tool is well-specified for its simplicity. There is no output schema, but the description partially compensates by stating what is returned. It lacks mentions of default filters or interaction with other sibling tools, but overall it is 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?
The input schema provides 100% coverage with descriptions for all 5 parameters, so the baseline is 3. The description adds little beyond mentioning pagination (which relates to limit/offset), but it does not explain parameter semantics beyond what the schema already 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 ('List') with a clear resource ('network requests') and even specifies the fields returned (method, URL, status). It also explicitly differentiates from the sibling tool getNetworkRequest by pointing to it for details, 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 explicitly says 'Use getNetworkRequest for details,' which provides a clear alternative and implies using this tool for listing/overviews. It also mentions pagination support, which is relevant when handling large sets. However, it does not mention when not to use this tool (e.g., when needing detailed request info) beyond that single alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listScenariosB
List all scenarios with metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| allProjects | No | List scenarios from all projects (default: false, shows only current project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of explaining behavior. 'List' implies a read-only operation and 'with metadata' suggests the return content, but it does not explicitly state non-destructiveness, default project scope, pagination, or output shape. It adds minimal 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?
The description is a single, direct sentence with no filler. It front-loads the action and object, making it immediately scannable and appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool without an output schema, the description is minimally adequate but lacks explicit mention of what metadata is returned and the default project-scoping behavior. The allProjects default must be inferred from the schema, and the phrase 'all scenarios' is slightly ambiguous without qualification.
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%; the only parameter (allProjects) has its own clear description. The tool description contributes no additional parameter semantics, so the 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 uses a clear verb ('List') and resource ('scenarios with metadata'), so the core purpose is identifiable. However, it does not explicitly differentiate from related tools like searchScenarios or getScenarioInfo; 'all' implies breadth but no sibling comparison is given.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as searchScenarios, getScenarioInfo, or deleteScenario. The allProjects parameter hints at project scoping but the description does not state use cases, exclusions, or why one would choose this tool over similar ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listTabsA
List all open browser tabs with their URLs, titles, and active status. Use this to see all tabs opened manually or via window.open/target='_blank'. Returns tab index for use with switchTab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds value by specifying the returned data (URLs, titles, active status) and the tab index for use with switchTab. It also disambiguates that programmatically opened tabs are included, which is useful context beyond the tool name.
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, front-loaded with the main action and followed by relevant usage context and a note on the return value. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with no parameters and no output schema, the description is complete. It states what is listed, the data fields included, and how the result relates to another tool (switchTab). No critical information is missing for the agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is trivially 100%. The description adds no parameter-specific information, but none is needed. The baseline of 4 is appropriate for a no-parameter tool.
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: 'List all open browser tabs with their URLs, titles, and active status.' It uses a specific verb ('list') and resource ('browser tabs'), and it distinguishes itself by noting it includes tabs opened via window.open/target='_blank', which sets it apart from any sibling that might only handle manually opened tabs.
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 the tool: 'Use this to see all tabs opened manually or via window.open/target='_blank'.' It gives an explicit intended use case, but it does not mention alternative tools (like switchTab) or exclude scenarios, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loadSwaggerA
Load and parse OpenAPI/Swagger spec from URL or local file. Returns structured summary: endpoints, schemas, auth types, base URL. Supports both OpenAPI 2.0 (Swagger) and 3.x, JSON and YAML formats. Use this first to understand an API before generating models or client code.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Spec format. 'auto' (default) detects from extension/content | |
| source | Yes | URL (http/https) or local file path to swagger.json / openapi.yaml |
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 tool's core behaviors: loading from URL or local file, supporting OpenAPI 2.0/3.x and JSON/YAML, and returning a structured summary. However, it does not mention error handling or whether network requests are made, but these are reasonable inferences from the description.
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-loaded with the primary action, then details supported inputs and usage context. Every sentence adds value with 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?
The description covers the tool's input, supported formats/versions, output summary, and primary use case. Since there is no output schema, the description's enumeration of the returned fields (endpoints, schemas, auth types, base URL) is valuable. It is complete for a straightforward loader, though it does not provide a precise return structure.
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 provides complete descriptions for both parameters (source and format) with 100% coverage. The description reinforces that source is a URL or local file and mentions JSON/YAML, but adds no new semantic detail beyond what the schema already states. Therefore, baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Load and parse OpenAPI/Swagger spec from URL or local file.' It also specifies the output ('Returns structured summary: endpoints, schemas, auth types, base URL') and distinguishes it from sibling code-generation tools by noting it is a first step before generating models or client code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit contextual guidance: 'Use this first to understand an API before generating models or client code.' This clearly signals when to use it (before code generation) and implies it is not the final generation step. It does not explicitly name sibling tools or list exclusions, but the timing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openBrowserB
Open browser and navigate to URL. Window persists for further interactions.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to navigate to |
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. 'Window persists for further interactions' is a useful behavioral detail beyond the tool's name, indicating the window remains available. However, it doesn't disclose potential side effects, whether it reuses an existing window, or any blocking behavior, leaving some 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 two short sentences with no filler. It front-loads the core action and adds a key persistence 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?
For a one-parameter tool with a clear schema and a simple behavior, the description is mostly adequate. It explains the core action and a critical behavioral trait (persistence) but omits clarification about whether a new window is always created and how that relates to existing tabs, which is relevant given sibling tools. Still, given the simplicity, it's nearly 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?
The input schema covers the 'url' parameter with a description ('URL to navigate to'), giving 100% coverage. The tool description adds no additional semantics about URL format or restrictions, so it sticks to the baseline for well-schemaed 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 action ('Open browser and navigate to URL') and identifies the resource. The mention that the window persists adds a distinguishing behavioral trait, but it doesn't explicitly contrast with sibling tools like navigateTo, so it lacks direct sibling 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?
The description provides no guidance on when to use this tool versus alternatives. It doesn't state prerequisites, exclusions, or recommended contexts. The persistence note is implied but not framed as a decision criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parseFigmaUrlA
Parse Figma URL to extract fileKey and nodeId.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Figma URL or fileKey |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the behavioral disclosure burden. It states the extraction output (fileKey, nodeId) but omits error handling behavior, input validation, or the fact that the schema also accepts a bare fileKey rather than a full URL, which could be surprising to the agent.
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?
One sentence with no filler words; front-loads the action and outputs. 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 one-parameter utility, the description is adequate but leaves out the tool's role in the broader workflow (e.g., feeding fileKey to other Figma tools). Since there is no output schema, a brief note about the returned shape 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?
The schema documents the single parameter with 100% coverage, including the fact that it accepts 'Figma URL or fileKey'. The description adds no additional format details, so the schema already 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 uses a specific verb 'Parse' with a clear resource 'Figma URL' and names the output variables 'fileKey and nodeId', making its purpose distinct from sibling tools that operate on frames or styles.
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 the tool's use case but provides no explicit guidance on when to choose it over alternatives, such as when needing to convert a URL before calling frame-related tools. Sibling tools like getFigmaFrame might use this internally, but the description doesn't mention prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Simple ping-pong tool for testing. Returns 'pong' with optional message.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Optional message to include in response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It clearly states the output ('pong') and the optional inclusion of a message, leaving no ambiguity about side effects or return behavior. The behavior is fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys all necessary information without unnecessary words. It is front-loaded with the core function and quickly states the output and optional behavior.
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 trivial ping tool with one optional parameter and no output schema, the description is fully complete. It covers the purpose, behavior, and parameter semantics without needing additional context. The low complexity of the tool means no further details are 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?
The schema already documents the single 'message' parameter with 100% coverage, including its optionality and purpose. The description adds no additional semantic value beyond what the schema provides, so the 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 explicitly states this is a ping-pong tool for testing that returns 'pong' with an optional message. The verb 'returns' and resource 'pong' make the purpose crystal clear, and it is easily distinguishable from the browser automation and scenario-related 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?
The description mentions 'for testing' which implies the tool is used for verification or sanity checks. However, it does not explicitly state when to use this tool versus alternatives, nor does it provide any exclusions or alternative suggestions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pressKeyA
Press keyboard key on focused element or page. For form submission (Enter), closing dialogs (Escape), navigation (Tab, Arrow keys), shortcuts (Ctrl+A).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | APOM element ID to focus before pressing. Optional. | |
| key | Yes | Key to press: 'Enter', 'Escape', 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Backspace', 'Delete', 'Home', 'End', 'PageUp', 'PageDown', 'Space' | |
| selector | No | CSS selector to focus before pressing. Optional. | |
| modifiers | No | Modifier keys to hold while pressing (e.g., ['Control'] for Ctrl+key) |
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 core behavior (press key on focused element or page) but does not disclose nuances like the need to focus an element first if an id/selector is provided, or the behavior when no focus is specified. It also doesn't mention side effects or limitations. For a keyboard press tool, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence followed by a list of use cases. It is front-loaded with the purpose and contains no filler. Every sentence provides useful guidance.
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?
This is a simple tool with a well-documented schema and no output schema. The description covers main use cases and explains the focus behavior (on focused element or page). The schema covers parameter details. Together they give an agent sufficient context to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all four parameters with 100% coverage. The description mentions examples like Ctrl+A, which hints at how modifiers and key combine, but it does not add substantive meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool presses a keyboard key on a focused element or page, and provides concrete use cases (Enter for form submission, Escape for dialogs, Tab/Arrow for navigation, Ctrl+A for shortcuts). This specific verb+resource distinguishes it from sibling tools like click (mouse) and type (text input).
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 lists scenarios where the tool is appropriate: form submission, closing dialogs, navigation, and shortcuts. This provides clear context for when to use it. It does not explicitly mention alternatives or when not to use it, but the examples make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saveScenarioA
Save recorded actions as a scenario. Call this after stopRecording to persist the scenario to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Scenario name | |
| tags | No | Tags for organizing scenarios (optional) | |
| actions | Yes | Array of recorded actions (from stopRecording) | |
| secrets | No | Secrets object (from stopRecording) | |
| description | No | Scenario description (optional) |
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 that the tool 'persist[s] the scenario to disk,' indicating a write side effect, and implies a dependency on stopRecording. However, it does not mention error conditions (e.g., duplicate names, write permissions), return value, or whether saving overwrites existing scenarios, so transparency is partial.
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 filler. The first sentence states the core purpose, and the second adds necessary workflow context. It is front-loaded and earns every word.
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 sibling tools that form a recorder workflow, the description is adequately complete. It provides the purpose, the correct timing ('after stopRecording'), and the persistence behavior. It could mention return format or error behavior, but the essential context for correct use is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The tool description adds little beyond the schema; it references 'recorded actions' and 'after stopRecording,' but the schema already describes actions and secrets as 'from stopRecording.' No additional parameter meaning is provided beyond what the schema covers.
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 and resource: 'Save recorded actions as a scenario.' This distinguishes it from sibling tools like deleteScenario, listScenarios, and getScenarioInfo. It also adds the key detail of persisting to disk, which clarifies the tool's specific role in the workflow.
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 when-to-use guidance: 'Call this after stopRecording.' This tells the agent the correct sequence in the recording workflow. It does not explicitly name alternatives or exclusions, but the 'after stopRecording' instruction is strong and clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saveScreenshotA
Save screenshot to file without returning in context. Auto-scales and compresses. Use maxWidth: null and format: 'png' for original quality.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Format (default: auto) | |
| padding | No | Padding px (default: 0) | |
| quality | No | JPEG quality (default: 80) | |
| filePath | Yes | Save path (extension auto-adjusted) | |
| maxWidth | No | Max width px (default: 1024, null=original) | |
| selector | Yes | CSS selector | |
| maxHeight | No | Max height px (default: 8000, null=original) |
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 discloses auto-scaling and compression behavior, and how to achieve original quality, but does not mention file overwrite behavior, return value details, or error conditions. This 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?
The description is two sentences long, front-loaded with the core purpose, and every phrase adds value. It is concise and well-structured 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?
For a tool with 7 parameters and no output schema, the description covers the core purpose, key behavioral traits, and a practical usage tip. It does not detail return values or error handling, but given the schema richness and the straightforward nature of the tool, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds valuable semantic guidance beyond the schema by explaining the interplay of maxWidth and format for original quality, which is not obvious from 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 saves a screenshot to a file and does not return it in context. This distinguishes it from the likely sibling tool 'screenshot' which presumably returns the image, so the purpose is 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 phrase 'without returning in context' suggests this tool is appropriate when a file output is desired rather than an in-context return. It also provides a concrete usage tip for original quality (maxWidth: null, format: 'png'), but does not explicitly name alternatives or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotA
Capture element image (5-10k tokens), or full viewport when no id/selector is given. Use analyzePage for form data/validation (8-10k tokens).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | APOM element ID. Mutually exclusive with selector. Omit both for viewport screenshot. | |
| format | No | Format (default: jpeg) | |
| padding | No | Padding px (default: 0). Ignored for viewport. | |
| quality | No | JPEG quality (default: 40) | |
| maxWidth | No | Max width px (default: 1024, null=original) | |
| selector | No | CSS selector. Mutually exclusive with id. Omit both for viewport screenshot. | |
| maxHeight | No | Max height px (default: 8000, null=original) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses token consumption (5-10k tokens) and the element/viewport distinction, which is useful. However, it does not mention other behavioral aspects like whether it is read-only, the return format, or potential failure modes. The token cost adds value but leaves some transparency 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?
Two sentences with no fluff: the first fronts the verb and resource, second gives an alternative. Every sentence earns its place, and the token cost is a concise addition.
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 7 params, no output schema, and no annotations, the description provides clear purpose, usage guidance, and token estimates. It does not describe the return format, but the token count implies an encoded image and the schema covers parameters. The tool is simple enough that this is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the element-vs-viewport behavior, but this is already partly documented in the schema for id/selector ('Omit both for viewport screenshot'). No additional parameter meaning is provided 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 primary action ('Capture element image') and the alternative scenario ('full viewport when no id/selector is given'). It distinguishes itself from sibling tool analyzePage, which is specified for form data/validation, 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 explicitly says when to use the tool ('Capture element image, or full viewport when no id/selector is given') and provides a direct alternative: 'Use analyzePage for form data/validation.' This is a clear when-to-use vs. alternative guidance, similar to the top-calibration example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollHorizontalA
Scroll element horizontally by pixels or to end. For tables, carousels, scrollable containers.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Pixels to scroll or 'full' for end | |
| behavior | No | Scroll behavior (default: auto) | |
| selector | Yes | CSS selector for element to scroll | |
| direction | Yes | Scroll direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explains the two usage modes (by pixels or to end) and names common use cases, which adds useful context. However, it does not disclose potential failure modes (e.g., element not scrollable) or return behavior, leaving some behavioral traits implicit.
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 no wasted words. It leads with the action, specifies the modes, and ends with use cases. This is an example of efficient, front-loaded writing.
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 scroll tool with 100% schema coverage and no output schema, the description covers the core purpose, modes, and target elements. It does not mention return values or error handling, but these are less critical for a scroll operation. Overall, it is sufficiently complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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's phrase 'by pixels or to end' mirrors the schema's explanation of 'amount' ('Pixels to scroll or full for end'), adding little new meaning. It does not elaborate on 'selector' or 'direction' beyond what the schema already states, so the added value is minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Scroll element horizontally') and its modes ('by pixels or to end'). It also gives specific use cases ('tables, carousels, scrollable containers'), distinguishing it from the sibling tool 'scrollTo' which likely handles vertical or general scrolling. 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 provides clear context for when to use the tool ('For tables, carousels, scrollable containers') and implies horizontal scrolling scenarios. However, it does not explicitly mention alternatives (e.g., 'use scrollTo for vertical scrolling') or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollToA
Scroll to element. For lazy loading and visibility testing.
| Name | Required | Description | Default |
|---|---|---|---|
| behavior | No | Behavior (default: auto) | |
| selector | Yes | CSS selector |
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 discloses the intended effect (trigger lazy loading, assist visibility testing) but does not cover details like default scroll behavior, failure handling, or return value. This is adequate for a simple action 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 two short sentences, front-loaded with the action. Every word earns its place with 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?
Given the tool's simplicity (2 params, no output schema), the description provides adequate context for selection and basic invocation. However, it lacks usage guidance relative to siblings and behavioral details, leaving room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add extra meaning beyond the schema, but it also does not need to; the schema already documents selector and behavior clearly.
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 action ('Scroll to element') and adds context ('For lazy loading and visibility testing'), distinguishing it from sibling tools like scrollHorizontal and waitForElement. The verb+resource phrasing is 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 phrase 'For lazy loading and visibility testing' provides clear context for when to use this tool. However, it does not explicitly mention alternatives or when not to use it, so it misses the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchFigmaFramesA
Search frames/components by name. Case-insensitive across all pages.
| Name | Required | Description | Default |
|---|---|---|---|
| fileKey | Yes | File key or URL | |
| figmaToken | No | API token (optional) | |
| searchQuery | Yes | Search query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosure. It adds useful behavioral details: case-insensitive matching and scope across all pages. However, it does not describe the return format, whether partial matches are supported, pagination behavior, or authentication requirements (noting figmaToken is optional in schema). These gaps limit 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?
The description is a single sentence, front-loaded with the action verb and resource, and contains zero filler. Every word adds value (case-insensitive, across all pages).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, so the description must be self-sufficient. It covers core purpose and two behavioral traits, but leaves out important context such as what the return value looks like, whether the search is partial or exact, and how results are ordered. For a simple search tool, this is adequate but not 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% with clear descriptions for each parameter (fileKey, figmaToken, searchQuery). The description does not add additional parameter-level meaning beyond the schema. Baseline 3 is appropriate because the schema already handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search') on a specific resource ('frames/components') with a clear scope ('by name') and an added constraint ('Case-insensitive across all pages'). This clearly distinguishes it from sibling tools like listFrames (which lists all) and getFigmaComponents (which likely lists components separately).
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: use this when you need to find frames/components by name. However, it does not explicitly mention when not to use it or suggest alternatives like listFrames for browsing all frames or getFigmaFrame for fetching by ID. The guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchScenariosC
Search scenarios by text or tags.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter tags | |
| text | No | Search text | |
| allProjects | No | Search in all projects (default: false, searches only current project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It only mentions search by text or tags but does not disclose default project filtering behavior (searching current project only), read-only nature, or what happens with no criteria. This is a gap for 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?
The description is a single, front-loaded sentence with no wasted words. It is appropriately concise for a simple search tool, though it could have been slightly more informative without sacrificing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search with full schema coverage, the description is minimally adequate. However, with no annotations and no output schema, it does not mention return format or provide usage context, leaving the agent without a complete picture of the tool's 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 all parameters are documented. The description adds that 'text' and 'tags' are search criteria, which matches the schema, but it does not clarify how they combine (AND/OR) or the role of 'allProjects' beyond the schema's own 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 verb 'search' and resource 'scenarios', with specific scope 'by text or tags'. This distinguishes it from listScenarios which likely lists without filtering, but the description does not explicitly name the sibling tool or contrast 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?
No guidance is provided on when to use this tool versus alternatives like listScenarios or other search tools. The description merely states what it does without context, exclusions, or recommended scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selectFromGroupA
Select option(s) from radio or checkbox group by name attribute. For radio groups: selects one option. For checkbox groups: supports multi-select with modes (set/add/remove/toggle). Use 'name' to identify the group, and 'value'/'text' to select by value or label. See groups in analyzePage output for available options.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Match by value, label text, or auto-detect (default: 'auto') | |
| mode | No | For checkboxes: 'set' (replace all), 'add', 'remove', 'toggle' (default: 'set') | |
| name | Yes | Name attribute of the radio/checkbox group (e.g., 'size', 'topping') | |
| text | No | Label text to match (alternative to value) | |
| texts | No | Multiple label texts to match (for checkbox group) | |
| value | No | Single value to select (for radio or single checkbox) | |
| values | No | Multiple values to select (for checkbox group) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description takes on the full burden of behavioral disclosure. It explicitly differentiates radio (single-select) from checkbox (multi-select with modes), and references analyzePage for option availability. It does not cover error handling or return values, but the core interactive behavior is clearly 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 three sentences, front-loaded with the primary action, and contains no fluff. Every sentence adds meaningful context: group selection behavior, mode support, and reference to analyzePage for options.
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 7 parameters, 2 enums, and no output schema, the description covers the main behavior, group types, selection modes, and points to analyzePage for available options. It does not detail error handling or return values, but it is sufficient for an agent to invoke the tool in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explicitly mentioning 'name', 'value', and 'text' parameters and links to analyzePage for where options come from. This helps the agent understand source data for parameters without reading 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 verb 'select' and the resource 'radio or checkbox group' with a specific scope of 'by name attribute'. It distinguishes itself from sibling tools like selectOption by explicitly naming the group type, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is for radio/checkbox groups, explains radio vs. checkbox behavior, and directs users to analyzePage output for available options, implying a prerequisite. However, it does not explicitly name alternatives or state when not to use it, though the group type implicitly excludes dropdowns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selectOptionA
Select dropdown option by APOM ID or CSS selector. Specify value, text, or index.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | APOM element ID from analyzePage for select element. Either id or selector required. | |
| text | No | Option text content (priority 2) | |
| index | No | Option index, 0-based (priority 3) | |
| value | No | Option value attribute (priority 1) | |
| selector | No | CSS selector for select element. Either id or selector required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It discloses the selection mechanism (value/text/index) but adds minimal behavioral context beyond the schema. It does not mention side effects, prerequisites like element visibility, error behavior, or whether the operation modifies the page state. This is a significant gap for a mutation-like 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 two sentences, concise and front-loaded with the main action. It avoids unnecessary detail and every sentence carries meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the core purpose and selection alternatives. However, it omits behavioral details like what happens when multiple selection criteria conflict, whether the select must be visible, or any prerequisites. With no annotations or output schema, a bit more context would be helpful, but it is not severely incomplete.
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's phrase 'Specify value, text, or index' echoes the schema but adds no new semantic meaning. The priority ordering is already in the schema descriptions, so the description does not enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Select dropdown option' and specifies the two ways to identify the element ('by APOM ID or CSS selector'). This distinguishes it from sibling tools like click or type, and is a specific verb+resource combination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the intended use by telling how to select (by APOM ID or CSS selector, specifying value/text/index). It provides clear context but does not explicitly mention when not to use this tool or compare with similar alternatives like selectFromGroup, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setStylesA
Apply inline CSS to element. For live editing and prototyping.
| Name | Required | Description | Default |
|---|---|---|---|
| styles | Yes | CSS property name-value pairs | |
| selector | Yes | CSS selector |
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 of behavioral disclosure. It does not mention that this directly modifies the DOM style attribute, whether changes are temporary or persistent, or potential side effects like overriding existing styles β a significant gap for a mutation 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 short, direct sentences: the first states the action, the second states the intended use. Every word earns its place; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with fully documented parameters and no output schema, the description covers the core action and use case adequately. However, it omits behavioral considerations like persistence or side effects, which keeps it from being fully 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% with descriptions for both parameters (selector and styles). The description adds no extra parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it applies inline CSS to an element, which is a specific verb and resource. It distinguishes itself from sibling read-oriented tools like getComputedCss, and adds a clear use-case ('For live editing and prototyping').
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?
Indicates intended use with 'For live editing and prototyping', giving clear context. It does not explicitly mention alternatives or when not to use, so it misses a full exclusion statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setViewportA
Change viewport dimensions. Test responsive layouts across screen sizes.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Width px | |
| height | Yes | Height px | |
| deviceScaleFactor | No | Pixel ratio (default: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description alone must disclose behavioral traits. It only states the high-level action without mentioning side effects, impact on the current page, or how deviceScaleFactor affects behavior. This is a significant gap for a mutation 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 concise sentences, front-loaded with the core action, and every word earns its place. It is highly 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?
The tool is simple and schema provides parameter limits, but the description falls short on behavioral context (e.g., whether the viewport change applies to the current page or persists). It is minimally complete but leaves gaps due to missing annotations.
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 descriptions for width, height, and deviceScaleFactor. The tool description adds no additional parameter meaning, so the 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 uses a specific verb-resource pair ('Change viewport dimensions') and adds a clear use case ('Test responsive layouts'), effectively distinguishing it from sibling tools like getViewport.
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 clear context by stating the intended scenario (responsive layout testing) but does not explicitly mention alternatives or exclusion cases. This is a clear context without exclusions, meriting a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartFindElementA
Find elements with natural language. Returns ranked candidates. Prefer analyzePage for better performance.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | Optional action on element | |
| maxResults | No | Max candidates (default: 5) | |
| description | Yes | Natural language description | |
| minConfidence | No | Confidence threshold (default: 0.6) for auto-executing `action`. Below it (or too close to runner-up), action is skipped and candidates returned with 'actionSkipped'. Prevents auto-clicking the wrong control. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavioral traits. It only states 'Returns ranked candidates' but omits the tool's optional action execution (e.g., click, type) and the minConfidence threshold behavior that could auto-execute actions. This is a significant gap for a tool that might perform side-effectful operations.
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 exceptionally concise with exactly two sentences. 'Find elements with natural language' states the core purpose, 'Returns ranked candidates' describes output, and 'Prefer analyzePage for better performance' gives useful guidance. Every word earns its place 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?
The description is partially complete: it explains the find and return behavior but omits the optional action automation and confidence-based skipping which are key aspects of the tool's functionality. The schema covers these details, but the description alone would not give a full picture. Without an output schema, it does mention 'ranked candidates' which is helpful.
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 provides 100% description coverage for all parameters, including detailed explanations of 'description', 'action', 'maxResults', and 'minConfidence'. The description adds no extra parameter-level meaning beyond what the schema already gives, 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's function: 'Find elements with natural language' and that it 'Returns ranked candidates.' This is a specific verb+resource combination that distinguishes it from sibling tools like findElementsByText and click. The mention of analyzePage as an alternative further differentiates it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance to 'Prefer analyzePage for better performance,' which is a clear alternative recommendation. However, it doesn't outline specific when-to-use or when-not-to-use scenarios beyond performance, so it's not fully exhaustive but still provides useful context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
startRecordingA
Start recording user actions. Follows active tab automatically. Use stopRecording to finish.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Scenario name (optional, can be set later when saving) | |
| tags | No | Tags for organizing scenarios (optional) | |
| description | No | Scenario description (optional) |
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 discloses one meaningful behavior ('Follows active tab automatically') and implies a continuous session with 'Use stopRecording to finish.' However, it does not mention prerequisites (e.g., whether enableRecorder must be run first), behavior if already recording, or any state changes beyond starting. This is a minimal but not empty disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short, focused sentences: purpose, a behavioral trait, and a pairing instruction. Every sentence earns its place with no redundancy or filler, making it highly concise 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?
For a simple start-recording tool, the description covers the core action and workflow. However, it lacks context about prerequisites (e.g., enableRecorder), error conditions (e.g., already recording), and what the tool returns. With no annotations and no output schema, these gaps make it adequate but incomplete.
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% for all three optional parameters, and the schema already provides clear descriptions for name, tags, and description. The description adds no additional parameter meaning, so the 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 opens with 'Start recording user actions,' a specific verb+resource that clearly states the tool's function. It distinguishes from sibling tools like stopRecording by referencing 'Use stopRecording to finish,' and the 'Follows active tab automatically' adds scope. This is strong clarity.
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: start recording, it follows the active tab, and you finish with stopRecording. This gives a basic workflow but does not explicitly exclude alternatives like enableRecorder or state prerequisites. It is clear but lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stopRecordingA
Stop recording and return recorded actions. Does not save the scenario - use this to review actions before saving with saveScenario.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the burden. It discloses that the tool returns recorded actions and that it does not save the scenario, which is important behavioral context. It could further explain whether the recording buffer is cleared, but the core behavior is 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 two sentences, immediately states the action, and provides a clear usage hint without 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 tool with no parameters and no output schema, the description sufficiently covers purpose, behavior, and relationship to saveScenario, making it 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?
The tool has zero parameters, so there is a baseline score of 4. The description doesn't need to elaborate on parameter details, and the empty schema confirms this.
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 stops recording and returns recorded actions, which is a specific verb+resource combination that distinguishes it from sibling tools like startRecording and saveScenario.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises using this to review actions before saving with saveScenario, and clarifies it does not save the scenario, giving clear alternatives and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switchFrameA
Set the active frame so click/type/hover/analyzePage/find/executeScript/waitForElement run INSIDE it β required to automate cross-origin iframes (resolved via CDP, bypassing Same-Origin Policy). Call with no args to reset to the main frame. Auto-resets on navigateTo.
| Name | Required | Description | Default |
|---|---|---|---|
| frameUrl | No | Substring matched against each frame's URL (e.g. 'app.example.com'). Mutually exclusive with frameSelector. | |
| frameSelector | No | CSS selector of the <iframe> element; its content frame becomes active. Mutually exclusive with frameUrl. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It accurately discloses that the tool sets a stateful context affecting subsequent commands, resets with no arguments, and auto-resets on navigateTo. This adds meaningful context beyond the input 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?
The description is two sentences and front-loaded. The first sentence defines the tool's purpose and affected operations; the second covers reset and auto-reset behavior. Every sentence carries high-value information 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?
The description covers key behavioral aspects (statefulness, affected commands, cross-origin use case, reset, and auto-reset) and is sufficient for an agent to select and invoke the tool correctly. It does not mention listFrames for discovery, but that is not essential given the schema 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?
Input schema coverage is 100% with detailed descriptions for both parameters (substring matching, mutual exclusivity). The description adds no additional parameter semantics beyond the schema, but 'Call with no args' reinforces that both parameters are optional, matching 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 uses a specific verb ('Set the active frame') and clearly identifies the resource (active frame) and scope (affects click/type/hover/analyzePage/find/executeScript/waitForElement). It distinguishes itself from sibling tool listFrames by focusing on setting rather than listing frames.
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 ('required to automate cross-origin iframes') and provides reset behavior ('Call with no args to reset to the main frame') and auto-reset on navigateTo. It does not name alternative tools explicitly, but the usage context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switchTabA
Switch active browser tab by index or URL pattern. After switch, all subsequent commands will target the new active tab. Use listTabs first to see available tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | Yes | Tab identifier: index number or URL pattern to match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description itself discloses a key behavioral trait: after switching, subsequent commands target the new active tab. This goes beyond the basic definition and helps an agent understand the stateful impact. It also implies a precondition (listTabs) but does not specify error behavior for invalid indices or unmatched patterns, so it is informative 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?
The description is three short sentences with no filler. The action is stated first, followed by the behavioral consequence and a helpful prerequisite, making every sentence valuable and easy to parse.
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 single-parameter tool with no output schema, the description covers purpose, prerequisite, and statefulness. It lacks error-handling details, but given the low complexity and presence of a concrete usage hint, it is contextually sufficient. The absence of an output schema means return values are not specified, but that is not a significant gap for an action-oriented tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides complete information: the 'tab' parameter accepts either a 0-based index or a URL pattern with partial match. The description merely says 'by index or URL pattern' without adding details like partial matching, so it does not add meaning beyond the schema. Since schema coverage is 100%, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Switch active browser tab by index or URL pattern.' This clearly distinguishes it from sibling tools like listTabs (listing) and navigateTo (navigating to a URL), making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction 'Use listTabs first to see available tabs' provides an explicit prerequisite, and 'all subsequent commands will target the new active tab' clarifies the operational context. While it names no alternative tools, the context is clear and sufficient for an agent to know when to invoke it vs. others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeA
Type text into input by APOM ID (preferred) or CSS selector. Updates React/Vue/Angular state automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | APOM element ID from analyzePage (e.g., 'input_20'). Either id or selector required. | |
| text | Yes | Text to type | |
| delay | No | Keystroke delay ms (default: 30) | |
| selector | No | CSS selector (e.g., '#email'). Either id or selector required. | |
| clearFirst | No | Clear first (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds a valuable behaviorβ'Updates React/Vue/Angular state automatically'βwhich implies proper event dispatch for frameworks. However, it omits other default behaviors such as clearFirst=true and keystroke delay simulation, leaving gaps in 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?
The description is two sentences, starting with a clear action and resource. Each sentence adds a distinct value: the targeting mechanism and the framework state update. 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 tool has moderate complexity (5 params, no output schema, no annotations). The description covers the primary action, input identification, and a key behavioral guarantee, which is sufficient for basic usage. It does not mention default clear/delay behaviors, but those are already in the schema, so the description is fairly 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?
The schema already describes all parameters with 100% coverage, so the bar is lowered. The description adds the 'preferred' qualifier for id over selector, which is not present in the schema and guides the agent on parameter precedence. It does not add format or syntax details, but the schema already provides those.
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+resource: 'Type text into input' and clearly states the two targeting mechanisms (APOM ID preferred or CSS selector), which distinguishes it from sibling input tools like click, pressKey, and selectOption.
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 a clear preference for APOM ID over CSS selector, but it does not explicitly say when to use this tool instead of alternatives like pressKey or selectOption. The intended usage is implied by the verb 'type' and the framework update note, but no exclusions or alternative tool names are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waitForElementA
Wait for element to appear. For dynamic content and lazy-loaded elements.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Max wait ms (default: 5000) | |
| visible | No | Wait for visible (default: true) | |
| selector | Yes | CSS selector |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of behavioral disclosure. It only says 'wait for element to appear' without explaining what happens on timeout, whether it checks visibility (despite the 'visible' parameter), or whether it returns a result. This is a significant gap for a 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?
The description is two sentences and front-loaded with the core action. Every word earns its place, and there is no redundancy or verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the schema covers all parameters, but with no annotations and no output schema, the description should explain timeout behavior and return semantics. It provides usage context but lacks these behavioral details, making it minimally 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 baseline is 3. The description adds no extra meaning beyond the schema's own parameter descriptions; it merely restates the general purpose. It neither improves nor detracts from parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Wait for element to appear.' It also distinguishes itself from sibling tools by targeting dynamic content and lazy-loaded elements, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: 'For dynamic content and lazy-loaded elements.' This implies usage scenarios but does not explicitly exclude alternatives or name them, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
59 tool updates
v3.6.0- First observed
analyzePage - First observed
appendScenarioToFile - First observed
click - First observed
compareFigmaToElement - First observed
convertFigmaToCode - First observed
deleteScenario - First observed
drag - First observed
enableRecorder - First observed
executeModelAction - First observed
executeScenario - First observed
executeScript - First observed
exportScenarioAsCode - First observed
filterNetworkRequests - First observed
findElementsByText - First observed
generateApiModels - First observed
generatePageObject - First observed
getBoxModel - First observed
getComputedCss - First observed
getConsoleLogs - First observed
getElementDetails - First observed
getFigmaColorPalette - First observed
getFigmaComponents - First observed
getFigmaFrame - First observed
getFigmaSpecs - First observed
getFigmaStyles - First observed
getNetworkRequest - First observed
getRecorderState - First observed
getScenarioInfo - First observed
getViewport - First observed
hover - First observed
listFigmaPages - First observed
listFrames - First observed
listNetworkRequests - First observed
listScenarios - First observed
listTabs - First observed
loadSwagger - First observed
navigateTo - First observed
openBrowser - First observed
parseFigmaUrl - First observed
ping - First observed
pressKey - First observed
saveScenario - First observed
saveScreenshot - First observed
screenshot - First observed
scrollHorizontal - First observed
scrollTo - First observed
searchFigmaFrames - First observed
searchScenarios - First observed
selectFromGroup - First observed
selectOption - First observed
setStyles - First observed
setViewport - First observed
smartFindElement - First observed
startRecording - First observed
stopRecording - First observed
switchFrame - First observed
switchTab - First observed
type - First observed
waitForElement
TDQS
Scored across 59 tools
Several tools have overlapping purposes, such as executeModelAction vs click/type/selectOption, and analyzePage vs smartFindElement vs getElementDetails. However, detailed descriptions help distinguish many of them, though the volume creates ambiguity.
All tools use camelCase with a mostly verb-first pattern (get, list, search, click, type, etc.). A few names like smartFindElement and executeModelAction break the pattern slightly, but overall naming is consistent.
With 59 tools, the server is excessively large. While it covers multiple domains (browser automation, Figma, scenarios, API models), many tools could be consolidated, making the surface overwhelming.
The server covers browser automation, iframe handling, network, console, Figma design, scenario recording, and API model generation comprehensively. Minor gaps exist (e.g., cookie management, file upload), but the core workflows are well covered.
Maintenance
Related MCP Connectors
AI-powered browser automation β navigate, click, fill forms, and extract data from any website.
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides browser automation, AI-powered analysis, visual processing, web scraping, automated test generation, and DevTools analysis capabilities. Supports multiple AI providers (OpenAI, Anthropic, Google, Ollama) for intelligent web interaction and data extraction.-
- AlicenseBqualityFmaintenanceEnables AI agents to directly control your real Chrome browser with full context including login sessions, cookies, and open tabs. It provides tools for page scanning, JavaScript execution, CDP control, screenshots, and physical mouse/keyboard input for authentic browser automation.20243MIT
- AlicenseNot gradedqualityDmaintenanceProvides complete browser automation capabilities for AI agents via 44 tools, including navigation, element interaction, state management, and session recording.583 npm1Apache 2.0
- AlicenseBqualityBmaintenanceEnables AI assistants to control Chrome using real user profiles, providing undetectable automation with over 40 tools for navigation, data extraction, and interaction.346 npm4MIT