Skip to main content
Glama

chrometools-mcp

🌐 Русская вСрсия README

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-mcp

This 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 chrometools to the mcpServers object:

{
  "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-mcp

Chrome 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-mcp

  • This will launch Chrome with ChromeTools' isolated profile

Step 2: Enable Developer Mode in Chrome

  • Open Chrome Extensions page: chrome://extensions

  • Toggle Developer mode (switch in top-right corner)

Developer Mode Screenshot

Step 3: Download and Extract the Extension

Option A - Download from GitHub (Recommended):

  1. Download the extension archive: chrome-extension.zip

  2. Extract the ZIP file to a folder on your computer

  3. 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/extension

  • After global install: <npm-global-path>/node_modules/chrometools-mcp/extension

  • From 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

Installed Extension Screenshot

Note: After installation, the extension card will appear on the chrome://extensions page 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 npx install, run npm list -g chrometools-mcp to find the installation path

  • The 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

: 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

  1. analyzePage - πŸ”₯ USE FREQUENTLY - Get current page state after loads, clicks, submissions (cached, use refresh:true)

  2. smartFindElement - Natural language element search with multilingual support

  3. AI Hints - Automatic context in all tools (page type, page heading, modal content, dropdown/menu items, suggestions)

  4. Text search - findElementsByText for 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 state

  • Prefer analyzePage over screenshot for 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

  1. βœ… click() - PRIMARY tool for all clicks

    • Works correctly with React/Vue/Angular synthetic events

    • Handles button clicks, link navigation, form submissions

  2. βœ… findElementsByText() + action - When selector is unknown, find by text

  3. ⚠️ executeScript() - LAST RESORT, only if above failed

For Filling Forms

  1. βœ… type() - PRIMARY tool for all text input

    • Properly updates React hooks, Vue reactive data

    • Auto-clears field before typing (configurable)

  2. ⚠️ executeScript() - LAST RESORT, only if above failed

For Reading Page State

  1. βœ… analyzePage() - PRIMARY tool for reading page content

    • Gets forms, inputs, buttons, links with current values

    • Use refresh: true after interactions to see updated state

    • Efficient: 2-5k tokens vs screenshot 5-10k

  2. βœ… findElementsByText() - Find specific elements by visible text

  3. βœ… getElement() - Get HTML of specific element

  4. ⚠️ executeScript() - LAST RESORT, only if above failed

Model-Based Interaction (Advanced)

  1. βœ… executeModelAction() - Universal tool for model-specific actions

    • Works 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 actions

    • Available 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 classes

  • Animation-proof: Modal elements are included even during CSS appear animations (opacity: 0)

  • Rich metadata: Modal nodes include title and actions (button labels) in metadata

  • In APOM tree: Modals appear as type: "dialog" with model: "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

  • ❌ executeScript bypasses 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-executing action. If the best match scores below this β€” or is too close to the runner-up β€” the action is skipped and candidates are returned with an actionSkipped reason 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 inside nav/[role=navigation]/[role=menu] β€” so menu items rendered as div/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" }
    }

Interactivity Detection:

  • Detects interactive elements via 8 different methods:

    1. Native HTML tags (button, a, input, select, textarea)

    2. ARIA roles (button, link, checkbox, etc.)

    3. onclick attribute

    4. onclick property (set via JavaScript)

    5. CSS cursor: pointer

    6. JavaScript addEventListener('click')

    7. tabindex attribute (except -1)

    8. contenteditable="true"

  • Captures DIV/SPAN with click handlers - JavaScript-enabled elements are detected

  • Adds interactivityReason metadata 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: true to get ALL page elements with selectors

  • Parameters:

    • 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 use getComputedCss or setStyles on 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 to analyzePage.

    • 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 includePortals is enabled (default), analyzePage also 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 an offsetHeight: 0 wrapper that isVisible drops, making the whole popup subtree invisible to analyzePage. - 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 bounds and full metadata

      • Parent 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 use click({ id: "button_45" }) or type({ id: "input_20", text: "..." })

    • Use getElementDetails({ id: "input_20" }) to get full details for any element, or with analyzeChildren: true to get children tree structure

    • Legacy format (useLegacyFormat: true): Classic format for backward compatibility

      • Complete map of forms (with current values), inputs, buttons, links, navigation with selectors

      • Each element includes uiFramework info (name, version, component type) - Select elements include options array with value, text, index, selected, disabled, group - With includeAll: true: Also includes allElements array with ALL visible page elements (divs, spans, headings, etc.) - each with selector, tag, text, classes, id

  • Example workflow:

    1. openBrowser({ url: "..." })

    2. analyzePage() ← Initial analysis, returns elements with IDs

    3. type({ id: "input_20", text: "user@example.com" }) ← Use APOM ID

    4. click({ id: "button_45" }) ← Use APOM ID

    5. analyzePage({ refresh: true }) ← See what changed after click!

  • Layout work example:

    1. analyzePage({ includeAll: true }) ← Get all elements

    2. Find element you want to style (e.g., div.header)

    3. getComputedCss({ selector: "div.header" }) ← Get current styles

    4. setStyles({ 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 ID

    • selector: CSS selector for the element

    • tag: HTML tag name

    • type: Element type (input, button, link, etc.)

    • text: Visible text content

    • bounds: 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 analysis

    • visible: Whether element is visible

    • childrenTree (optional): APOM tree structure of children elements when analyzeChildren: 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 for

    • exact (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 id OR selector required (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 for waitForSelector in 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 for location.pathname + location.search to change relative to before, then reports Route changed: "/a" β†’ "/b" or ⚠️ ROUTE_UNCHANGED. Because SPAs navigate via history.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, use waitForSelector instead.

    • 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 next click({ id })/type({ id }) call works without an extra analyzePage. 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:

    1. Puppeteer native click (trusted CDP events)

    2. CDP coordinate click at element center (trusted, bypasses interception check)

    3. 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 id OR selector required (mutually exclusive)

    • text (required): Text to type

    • delay (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 selector

    • behavior (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 id OR selector required (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 analyzePage to see all available options with their values, text, and indices

  • Example:

    // 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 analyzePage to see available groups in groups section with all options and labels

  • Examples:

    // 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 drag

    • direction (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 scrollTo or scrollHorizontal instead)

  • 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 scroll

    • direction (required): 'left' or 'right'

    • amount (required): Number of pixels to scroll, or 'full' to scroll to the end

    • behavior (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 filter

    • includeDefaults (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 from analyzePage. Mutually exclusive with selector.

    • selector (optional): CSS selector. Mutually exclusive with id.

    • Omit both id and selector to 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 quality and format parameters

  • Automatic compression: If image exceeds 3 MB, automatically reduces quality or scales down to fit within limit

  • For original quality: Set maxWidth: null, maxHeight: null and format: '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 file

    • padding (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 screenshot tool)

  • 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 code

    • waitAfter (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-level return (e.g. return document.title, const x = 1; return x, or code that contains a function in 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 like document.title still 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 filter

    • clear (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 paginated requests array

  • Use case: Quick overview of API calls with pagination for large request lists

  • Example:

    • listNetworkRequests() β†’ first 50 requests

    • listNetworkRequests({ limit: 20, offset: 20 }) β†’ requests 21-40

    • Response: { 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:

  1. listNetworkRequests() - see all requests (compact)

  2. getNetworkRequest({ requestId: "..." }) - inspect specific request

  3. filterNetworkRequests({ 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 id OR selector required (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 pressing

    • selector (optional): CSS selector to focus before pressing

    • key (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 id nor selector is 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-4000px

    • height (required): 200-3000px

    • deviceScaleFactor (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 more note, 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 tabs

    • newTabsDetected (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()

analyzePage also includes a frames array in its output whenever the page has more than one frame, so the agent can discover iframes without a separate listFrames call.

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-2

    • https://www.figma.com/design/ABC123/Title?node-id=1-2

    • ABC123 (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 token

    • fileKey (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 token

    • fileKey (required): Figma file key or full URL

    • searchQuery (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 token

    • fileKey (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 token

    • fileKey (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 token

    • fileKey (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 token

    • fileKey (required): Figma file key

    • nodeId (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:

    1. Fetches design structure (layout, colors, typography, spacing)

    2. Gets rendered design image at 2x resolution

    3. Returns AI-optimized instructions with simplified JSON structure

    4. 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 URL

    • nodeId (required): Figma frame/component ID

    • scale (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 key

    • nodeId (required): Figma frame ID

    • selector (required): CSS selector for page element to compare

    • figmaScale (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 token

    • fileKey (required): Figma file key

    • nodeId (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 β†’ google

  • https://dev.example.com:8080 β†’ example-8080

  • http://localhost:3000 β†’ localhost-3000

  • file:///test.html β†’ local

Domain Organization Rules:

  1. Main domain only (subdomains stripped): mail.google.com β†’ google

  2. Ports included for ALL domains: example.com:8080 β†’ example-8080

  3. Protocol ignored: http and https both β†’ 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 started

  • exitUrl: 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 project

enableRecorder

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 name

    • projectId (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, exitUrl

  • Example:

    // 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/description

    • tags (optional): Array of tags to filter

  • Use case: Find specific scenarios across all websites

  • Returns: Matching scenarios with projectId, entryUrl, exitUrl metadata

  • Example:

    // 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 name

    • includeSecrets (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 export

    • language (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 - use pageObjectMode instead.

    • 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 as generatePageObject: 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 (requires pageObjectFile)

    • 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 filename

    • testCode: Full test code with imports

    • instruction: Instructions for Claude Code

    • pageObject (if POM generated): Page Object code and metadata

    • pomIntegration (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 LoginPage
  • Selector Cleaning: Automatically removes unstable patterns:

    • CSS Modules: Button_primary__2x3yZ β†’ removed

    • Styled-components: sc-AbCdEf-0 β†’ removed

    • Emotion: css-1a2b3c4d β†’ removed

    • Hash suffixes: component_a1b2c3d β†’ removed

    • Prefers 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 export

    • language (required): Target framework - "playwright-typescript", "playwright-python", "selenium-python", "selenium-java"

    • targetFile (required): Path to existing test file to append to

    • testName (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' insertion

    • 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 - use pageObjectMode instead.

    • 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 update

    • testCode: Test code only (without imports/headers)

    • testName: Name of test to append

    • insertPosition: Where to insert test

    • referenceTestName: Reference test for 'before'/'after' positioning

    • instruction: Instructions for Claude Code to read/append/write

    • pageObject (if generatePageObject=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

source

string

Yes

URL (https://...) or local file path to swagger.json / openapi.yaml

format

'auto' | 'json' | 'yaml'

No

Parse format (default: auto β€” detects from content)

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

source

string

Yes

URL or file path to spec

language

'typescript' | 'python'

Yes

Target language

format

'auto' | 'json' | 'yaml'

No

Parse format (default: auto)

style

'interface' | 'type'

No

TypeScript style (default: interface)

pythonStyle

'dataclass' | 'pydantic' | 'typeddict'

No

Python style (default: dataclass)

includeEnums

boolean

No

Generate enum types (default: true)

schemas

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 types

  • Circular 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 openBrowser to establish context

  • Use screenshot to verify visual results

  • Combine 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)

core

Basic tools

ping, openBrowser (2)

interaction

User interaction & frames

click, type, scrollTo, waitForElement, hover, selectOption, selectFromGroup, drag, scrollHorizontal, switchFrame, listFrames (11)

inspection

Page inspection

getComputedCss, getBoxModel, screenshot, saveScreenshot (4)

debug

Debugging & network

getConsoleLogs, listNetworkRequests, getNetworkRequest, filterNetworkRequests (4)

advanced

Advanced automation & AI

executeScript, setStyles, setViewport, getViewport, navigateTo, smartFindElement, analyzePage, findElementsByText (8)

recorder

Scenario recording

enableRecorder, executeScenario, listScenarios, searchScenarios, getScenarioInfo, deleteScenario, exportScenarioAsCode, appendScenarioToFile, generatePageObject (9)

figma

Figma integration

getFigmaFrame, compareFigmaToElement, getFigmaSpecs, parseFigmaUrl, listFigmaPages, searchFigmaFrames, getFigmaComponents, getFigmaStyles, getFigmaColorPalette, convertFigmaToCode (10)

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:

  1. Go to your Figma account settings: https://www.figma.com/settings

  2. Scroll down to "Personal access tokens"

  3. Click "Create a new personal access token"

  4. Give it a name (e.g., "chrometools-mcp")

  5. 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

CHROMETOOLS_BROWSER_WS_ENDPOINT

(unset)

Direct CDP WebSocket URL (e.g. ws://127.0.0.1:9222/devtools/browser/<id>). When set, ChromeTools connects straight to it, skipping port discovery and launch.

CHROMETOOLS_DEBUG_PORT

9222

Remote-debugging port to discover/connect to (and to launch with).

CHROMETOOLS_USER_DATA_DIR

<temp>/chrome-mcp-profile

Chrome profile used when launching a new instance. Point at a real (or cloned) profile to reuse its cookies/logins.

CHROMETOOLS_CHROME_PATH

platform default

Path to the Chrome executable.

Quick path β€” attach to your already-logged-in Chrome:

  1. Fully close Chrome (a profile can't open a debug port while another Chrome holds it).

  2. 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=9222
  3. Log into the target site in that Chrome. ChromeTools will connect() to it β€” cross-origin iframes load authenticated, and listTabs sees 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:

  1. Install VcXsrv on Windows (Download)

  2. Enable "Disable access control" in VcXsrv settings ⚠️ (Critical!)

  3. Configure MCP server with DISPLAY=<your-windows-ip>:0 environment variable

  4. Fully 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.js

Features

  • 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 id parameter in click/type/hover/selectOption for stable targeting

    • Use 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-bridge

This:

  1. Creates Bridge Service files in ~/.chrometools/

  2. Registers Native Messaging Host in system (Windows Registry / Chrome config)

  3. Bridge will auto-start when Chrome Extension loads

Verify installation:

npx chrometools-mcp --check-bridge

Architecture

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 access

Parallel 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 Chrome

Configuration

No configuration needed after installation. Just use:

npx chrometools-mcp

MCP 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 help

Technical 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://extensions

Extension 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 tools
analyzePageA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
diffNoReturn only changes since last analysis: {added, removed, changed} (default: false).
groupByNoGroup elements: 'type' or 'flat' (default: 'type')
refreshNoRefresh cache (default: false)
includeAllNoInclude all elements with selectors - full debug format (default: false for compact format)
viewportOnlyNoOnly analyze elements in current viewport (default: false). Reduces output for long pages.
includePortalsNoInclude React Portal contents β€” menus, tooltips, popovers outside main root (default: true). Without this, dropdown items are invisible.
portalSelectorsNoCustom portal root CSS selectors. Default: ['#modal-root', '#menu-popup-root', '#tooltip-root', '#popover-root', '[data-portal]'].
useLegacyFormatNoReturn legacy format instead of APOM (default: false - APOM is now default)
registerElementsNoAuto-register elements in selector resolver (default: true)

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageYesTarget test framework and language
testNameNoOverride test name (default: from scenario name)
targetFileYesPath to existing test file to append to (REQUIRED)
scenarioNameYesName of scenario to export
cleanSelectorsNoRemove unstable CSS classes (default: true)
insertPositionNoWhere to insert test: 'end' (default - after all tests), 'before' (before reference test), or 'after' (after reference test)
pageObjectFileNoPath to existing POM file (required for 'use-existing' mode)
pageObjectModeNoPOM integration: 'none' (default), 'generate' (separate POM), 'generate-integrated' (POM + test using it), 'use-existing' (test uses existing POM file)
includeCommentsNoInclude descriptive comments (default: true)
referenceTestNameNoReference test name for 'before'/'after' insertion. Required when insertPosition is 'before' or 'after'
generatePageObjectNoAlso generate Page Object class for the page (default: false). Legacy - use pageObjectMode instead.
pageObjectClassNameNoPage Object class name (optional, auto-generated if not provided)

TDQS

A4.4/5.0
Behavior3/5

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

No annotations are provided, so the description bears 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAPOM element ID from analyzePage (e.g., 'button_45'). Either id or selector required.
timeoutNoMax wait ms (default: 30000)
selectorNoCSS selector (e.g., '.submit-btn'). Either id or selector required.
waitAfterNoWait ms (default: 1500)
screenshotNoScreenshot (default: false)
waitTimeoutMsNoTimeout for waitForSelector in ms (default: 2000).
waitForSelectorNoCSS selector to wait for after click (atomic click+wait). Use for dropdowns/popups that render into portals.
autoAnalyzeAfterNoAfter 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.
waitForRouteChangeNoSPA 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

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's purpose: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesFrame/component ID
fileKeyYesFile key
selectorYesCSS selector
thresholdNoDiff threshold (default: 0.05)
figmaScaleNoScale (default: 2)
figmaTokenNoAPI token (optional)

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's function: '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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesFrame/component ID (formats: '123:456' or '123-456')
fileKeyYesFile key
frameworkNoTarget framework (default: react)
figmaTokenNoAPI token (optional)
includeCommentsNoInclude comments (default: true)

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesScenario name

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDrag mode: 'native' (default, faster) or 'synthetic' (better for JS libraries)
distanceNoDistance in pixels (default: 100)
durationNoDrag duration in ms (default: 500)
selectorYesCSS selector for element to drag
directionYesDrag direction

TDQS

A3.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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"})

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoElement APOM ID (e.g., 'input_20') from analyzePage. Either id or selector required.
actionYesAction name to execute (e.g., 'type', 'click', 'SetDate'). See element's model in analyzePage 'models' map for available actions.
paramsNoAction parameters (depends on action). Examples: {text: 'hello'} for type, {date: '2024-03-15'} for SetDate, {value: 'US'} for selectOption
selectorNoCSS selector (alternative to id). Either id or selector required.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's purpose: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesScenario name
projectIdNoOptional: Project ID (domain) to disambiguate scenarios with same name. Examples: 'google', 'localhost-3000'
parametersNoExecution parameters
executeDependenciesNoExecute dependencies (default: true)

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesJavaScript code
timeoutNoMax wait ms (default: 30000)
waitAfterNoWait ms (default: 500)
screenshotNoScreenshot (default: false)

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageYesTarget test framework and language
scenarioNameYesName of scenario to export
cleanSelectorsNoRemove unstable CSS classes (default: true)
pageObjectFileNoPath to existing POM file (required for 'use-existing' mode)
pageObjectModeNoPOM integration: 'none' (default), 'generate' (separate POM), 'generate-integrated' (POM + test using it), 'use-existing' (test uses existing POM file)
includeCommentsNoInclude descriptive comments (default: true)
generatePageObjectNoAlso generate Page Object class for the page (default: false). Legacy - use pageObjectMode instead.
pageObjectClassNameNoPage Object class name (optional, auto-generated if not provided)

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear after read (default: false)
typesNoFilter types (default: Fetch, XHR)
urlPatternYesURL pattern (regex or partial)

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesSearch text
exactNoExact match (default: false)
actionNoOptional action on first match
caseSensitiveNoCase sensitive (default: false)

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNoTypeScript only: 'interface' (default) or 'type' aliases
formatNoSpec format (default: auto)
sourceYesURL or file path to OpenAPI spec
schemasNoGenerate only these schemas (default: all)
languageYesTarget language for models
pythonStyleNoPython only: 'dataclass' (default), 'pydantic', or 'typeddict'
includeEnumsNoGenerate enum types (default: true)
includeValidationNoInclude validation constraints as comments (default: false)

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
classNameNoPage Object class name (optional, auto-generated from page title/URL if not provided)
frameworkNoTarget test framework (default: playwright-typescript)
groupElementsNoGroup elements by page sections (default: true)
includeCommentsNoInclude descriptive comments in generated code (default: true)

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It discloses 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description must 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the tool's purpose 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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter: 'layout', 'typography', 'colors', 'visual', 'all' (default)
selectorNoCSS selector (default: body)
propertiesNoSpecific properties. Overrides category.
includeDefaultsNoInclude defaults (default: false)

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear after read (default: false)
typesNoFilter types (default: all)

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAPOM element ID (e.g., 'input_20', 'button_45') from analyzePage result
refreshNoForce refresh of cached analysis (default: false)
includeAllNoWhen analyzing children, include all elements, not just interactive ones (default: false)
analyzeChildrenNoAnalyze children elements tree structure (default: false)

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's purpose: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileKeyYesFile key or URL
figmaTokenNoAPI token (optional)

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileKeyYesFile key or URL
figmaTokenNoAPI token (optional)

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoScale (default: 2)
formatNoFormat (default: png)
nodeIdYesFrame/component ID
fileKeyYesFile key
figmaTokenNoAPI token (optional)

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

No guidance on when to use this tool versus 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesFrame/component ID
fileKeyYesFile key
figmaTokenNoAPI token (optional)

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileKeyYesFile key or URL
figmaTokenNoAPI token (optional)

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool gets 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestIdYesRequest ID

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's function: '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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesScenario name
includeSecretsNoInclude secrets (default: false)

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's function: 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAPOM element ID from analyzePage. Either id or selector required.
selectorNoCSS selector. Either id or selector required.

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden 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.

Conciseness5/5

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.

Completeness3/5

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

For a simple two-parameter tool with 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileKeyYesFile key or URL
figmaTokenNoAPI token (optional)

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

For a simple tool with 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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's purpose 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear after read (default: false)
limitNoMax requests (default: 50)
typesNoFilter types (default: Fetch, XHR)
offsetNoSkip requests (default: 0)
statusNoFilter status (default: all)

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
allProjectsNoList scenarios from all projects (default: false, shows only current project)

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's function: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoSpec format. 'auto' (default) detects from extension/content
sourceYesURL (http/https) or local file path to swagger.json / openapi.yaml

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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

The description covers the tool's 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to navigate to

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. '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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesFigma URL or fileKey

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoOptional message to include in response

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAPOM element ID to focus before pressing. Optional.
keyYesKey to press: 'Enter', 'Escape', 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Backspace', 'Delete', 'Home', 'End', 'PageUp', 'PageDown', 'Space'
selectorNoCSS selector to focus before pressing. Optional.
modifiersNoModifier keys to hold while pressing (e.g., ['Control'] for Ctrl+key)

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesScenario name
tagsNoTags for organizing scenarios (optional)
actionsYesArray of recorded actions (from stopRecording)
secretsNoSecrets object (from stopRecording)
descriptionNoScenario description (optional)

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoFormat (default: auto)
paddingNoPadding px (default: 0)
qualityNoJPEG quality (default: 80)
filePathYesSave path (extension auto-adjusted)
maxWidthNoMax width px (default: 1024, null=original)
selectorYesCSS selector
maxHeightNoMax height px (default: 8000, null=original)

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAPOM element ID. Mutually exclusive with selector. Omit both for viewport screenshot.
formatNoFormat (default: jpeg)
paddingNoPadding px (default: 0). Ignored for viewport.
qualityNoJPEG quality (default: 40)
maxWidthNoMax width px (default: 1024, null=original)
selectorNoCSS selector. Mutually exclusive with id. Omit both for viewport screenshot.
maxHeightNoMax height px (default: 8000, null=original)

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

The description explicitly says when to use 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesPixels to scroll or 'full' for end
behaviorNoScroll behavior (default: auto)
selectorYesCSS selector for element to scroll
directionYesScroll direction

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description'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.

Purpose5/5

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

The description clearly states the tool's action ('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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
behaviorNoBehavior (default: auto)
selectorYesCSS selector

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the 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.

Conciseness5/5

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.

Completeness3/5

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

Given the tool's simplicity (2 params, no output schema), 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileKeyYesFile key or URL
figmaTokenNoAPI token (optional)
searchQueryYesSearch query

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter tags
textNoSearch text
allProjectsNoSearch in all projects (default: false, searches only current project)

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNoMatch by value, label text, or auto-detect (default: 'auto')
modeNoFor checkboxes: 'set' (replace all), 'add', 'remove', 'toggle' (default: 'set')
nameYesName attribute of the radio/checkbox group (e.g., 'size', 'topping')
textNoLabel text to match (alternative to value)
textsNoMultiple label texts to match (for checkbox group)
valueNoSingle value to select (for radio or single checkbox)
valuesNoMultiple values to select (for checkbox group)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAPOM element ID from analyzePage for select element. Either id or selector required.
textNoOption text content (priority 2)
indexNoOption index, 0-based (priority 3)
valueNoOption value attribute (priority 1)
selectorNoCSS selector for select element. Either id or selector required.

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description'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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stylesYesCSS property name-value pairs
selectorYesCSS selector

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden 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.

Conciseness5/5

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.

Completeness4/5

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

For a simple tool with 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesWidth px
heightYesHeight px
deviceScaleFactorNoPixel ratio (default: 1)

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoOptional action on element
maxResultsNoMax candidates (default: 5)
descriptionYesNatural language description
minConfidenceNoConfidence 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

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's function: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoScenario name (optional, can be set later when saving)
tagsNoTags for organizing scenarios (optional)
descriptionNoScenario description (optional)

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness5/5

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

For a tool with no parameters and 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameUrlNoSubstring matched against each frame's URL (e.g. 'app.example.com'). Mutually exclusive with frameSelector.
frameSelectorNoCSS selector of the <iframe> element; its content frame becomes active. Mutually exclusive with frameUrl.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

The description explicitly states when to use 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabYesTab identifier: index number or URL pattern to match

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoAPOM element ID from analyzePage (e.g., 'input_20'). Either id or selector required.
textYesText to type
delayNoKeystroke delay ms (default: 30)
selectorNoCSS selector (e.g., '#email'). Either id or selector required.
clearFirstNoClear first (default: true)

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNoMax wait ms (default: 5000)
visibleNoWait for visible (default: true)
selectorYesCSS selector

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's function 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.

Usage Guidelines4/5

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.

  1. 59 tool updatesv3.6.0
    • First observedanalyzePage
    • First observedappendScenarioToFile
    • First observedclick
    • First observedcompareFigmaToElement
    • First observedconvertFigmaToCode
    • First observeddeleteScenario
    • First observeddrag
    • First observedenableRecorder
    • First observedexecuteModelAction
    • First observedexecuteScenario
    • First observedexecuteScript
    • First observedexportScenarioAsCode
    • First observedfilterNetworkRequests
    • First observedfindElementsByText
    • First observedgenerateApiModels
    • First observedgeneratePageObject
    • First observedgetBoxModel
    • First observedgetComputedCss
    • First observedgetConsoleLogs
    • First observedgetElementDetails
    • First observedgetFigmaColorPalette
    • First observedgetFigmaComponents
    • First observedgetFigmaFrame
    • First observedgetFigmaSpecs
    • First observedgetFigmaStyles
    • First observedgetNetworkRequest
    • First observedgetRecorderState
    • First observedgetScenarioInfo
    • First observedgetViewport
    • First observedhover
    • First observedlistFigmaPages
    • First observedlistFrames
    • First observedlistNetworkRequests
    • First observedlistScenarios
    • First observedlistTabs
    • First observedloadSwagger
    • First observednavigateTo
    • First observedopenBrowser
    • First observedparseFigmaUrl
    • First observedping
    • First observedpressKey
    • First observedsaveScenario
    • First observedsaveScreenshot
    • First observedscreenshot
    • First observedscrollHorizontal
    • First observedscrollTo
    • First observedsearchFigmaFrames
    • First observedsearchScenarios
    • First observedselectFromGroup
    • First observedselectOption
    • First observedsetStyles
    • First observedsetViewport
    • First observedsmartFindElement
    • First observedstartRecording
    • First observedstopRecording
    • First observedswitchFrame
    • First observedswitchTab
    • First observedtype
    • First observedwaitForElement

TDQS

B3.4/5.0

Scored across 59 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    -
  • A
    license
    B
    quality
    F
    maintenance
    Enables 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.
    20
    243
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides complete browser automation capabilities for AI agents via 44 tools, including navigation, element interaction, state management, and session recording.
    583 npm
    1
    Apache 2.0