Browser Tools
All browser tools execute locally on your machine via Playwright. They operate on a shared browser instance that persists across calls within a session.
Each browser tool uses an action parameter to group related operations. Most actions automatically return a page snapshot so your AI assistant always has current context.
browser_navigate
Navigate the browser: go to a URL, go back, or go forward.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | No | navigate (default), go_back, or go_forward |
url | string | Conditional | URL to navigate to (required for navigate) |
return_snapshot | boolean | No | Return page snapshot (default: true) |
include_debug | boolean | No | Include console errors and failed network requests (default: false) |
// Navigate to a URL{ "url": "https://myapp.example.com/login" }
// Go back{ "action": "go_back" }
// Go forward{ "action": "go_forward" }browser_interact
Interact with page elements: click, hover, type (keystroke-by-keystroke), fill (replace value), select a dropdown option, or press a key.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | click, hover, type, fill, select_option, or press_key |
selector | string | Conditional | CSS selector (required for click, hover, type, fill, select_option) |
value | string | Conditional | Value to type/fill, option to select, or key to press (required for type, fill, select_option, press_key) |
slowly | boolean | No | Type with 100ms delay between keystrokes (only for type, useful for autocomplete) |
submit | boolean | No | Press Enter after typing (only for type) |
return_snapshot | boolean | No | Return page snapshot (default: true) |
include_debug | boolean | No | Include console errors and failed network requests |
// Click an element{ "action": "click", "selector": "#login-button" }
// Hover over a dropdown trigger{ "action": "hover", "selector": ".dropdown-trigger" }
// Type keystroke-by-keystroke (good for autocomplete){ "action": "type", "selector": "#search", "value": "test", "slowly": true }
// Fill a field (replaces existing value)
// Select a dropdown option{ "action": "select_option", "selector": "#country", "value": "US" }
// Press a key{ "action": "press_key", "value": "Enter" }browser_form
Fill multiple form fields at once or upload files.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | fill_form or file_upload |
fields | object | Conditional | Map of CSS selector to value (required for fill_form) |
selector | string | Conditional | CSS selector of the file input (required for file_upload) |
paths | string[] | Conditional | Absolute file paths to upload (required for file_upload) |
return_snapshot | boolean | No | Return page snapshot (default: true) |
include_debug | boolean | No | Include console errors and failed network requests |
// Fill multiple fields at once{ "action": "fill_form", "fields": { "#password": "secret123", "#name": "Test User" }}
// Upload a file{ "action": "file_upload", "selector": "input[type=file]", "paths": ["/Users/me/photo.jpg"]}browser_observe
Observe the current page state: get an accessibility snapshot, take a screenshot, view console logs, or inspect network requests.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | snapshot, screenshot, console_logs, or network_requests |
full_page | boolean | No | Capture full scrollable page (only for screenshot, default: false) |
filter_status | number | No | Only show requests with this HTTP status or higher (only for network_requests, e.g. 400) |
// Get accessibility tree{ "action": "snapshot" }
// Take a screenshot{ "action": "screenshot", "full_page": true }
// Get console logs (last 100 messages){ "action": "console_logs" }
// Get network requests (errors only){ "action": "network_requests", "filter_status": 400 }browser_assert
Run assertions or wait for elements on the live page.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | assert or wait |
type | enum | Conditional | Assertion type (required for assert — see below) |
selector | string | Conditional | CSS selector (for element assertions and wait) |
text | string | Conditional | Expected text |
url | string | Conditional | Expected URL |
count | number | Conditional | Expected element count |
attribute | string | Conditional | Attribute name |
value | string | Conditional | Expected attribute value |
expression | string | Conditional | JavaScript expression (for evaluate_truthy) |
timeout_ms | number | No | Timeout in milliseconds (default: 10000, for wait) |
return_snapshot | boolean | No | Return page snapshot (default: true) |
include_debug | boolean | No | Include console errors and failed network requests |
Assertion types:
| Type | Required Params | Description |
|---|---|---|
element_visible | selector | Assert element is visible |
element_hidden | selector | Assert element is hidden |
text_contains | selector, text | Assert element text contains value |
text_equals | selector, text | Assert element text equals value exactly |
url_contains | text | Assert current URL contains string |
url_equals | url | Assert current URL equals value exactly |
element_count | selector, count | Assert number of matching elements |
attribute_value | selector, attribute, value | Assert element attribute equals value |
evaluate_truthy | expression | Assert JavaScript expression evaluates truthy |
// Assert login page URL{ "action": "assert", "type": "url_contains", "text": "/login" }
// Assert button is visible{ "action": "assert", "type": "element_visible", "selector": "#submit-btn" }
// Assert heading text{ "action": "assert", "type": "text_equals", "selector": "h1", "text": "Welcome Back" }
// Assert JS expression{ "action": "assert", "type": "evaluate_truthy", "expression": "document.querySelectorAll('.item').length > 0" }
// Wait for element{ "action": "wait", "selector": ".loading-spinner", "timeout_ms": 15000 }
// Wait 2 seconds{ "action": "wait", "timeout_ms": 2000 }browser_session
Manage browser sessions: save cookies and localStorage, restore a saved session, or open a headed browser for interactive OAuth/SSO login.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | save, restore, or login |
name | string | Yes | Session name (e.g., admin, user, default) |
url | string | Conditional | URL to navigate to (required for login) |
return_snapshot | boolean | No | Return page snapshot after restore/login (default: false) |
// Save current session{ "action": "save", "name": "admin" }
// Restore a saved session{ "action": "restore", "name": "admin" }
// Interactive login (opens headed browser){ "action": "login", "name": "admin", "url": "https://myapp.example.com/login" }Sessions are stored locally at ~/.fasttest/sessions/{orgSlug}/{name}.json with restrictive permissions.
browser_page
Page-level operations: manage tabs, resize the viewport, execute JavaScript, handle dialogs, or drag-and-drop.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | enum | Yes | tabs, resize, evaluate, handle_dialog, or drag |
tab_action | enum | Conditional | list, create, switch, or close (for tabs) |
url | string | No | URL for new tab (for tabs/create) |
index | number | No | Tab index (for tabs/switch and tabs/close) |
width | number | Conditional | Viewport width in pixels (for resize) |
height | number | Conditional | Viewport height in pixels (for resize) |
expression | string | Conditional | JavaScript expression to evaluate (for evaluate) |
dialog_action | enum | Conditional | accept or dismiss (for handle_dialog) |
prompt_text | string | No | Text for prompt dialogs (for handle_dialog with accept) |
source | string | Conditional | CSS selector of element to drag (for drag) |
target | string | Conditional | CSS selector of drop target (for drag) |
return_snapshot | boolean | No | Return page snapshot (default: true) |
include_debug | boolean | No | Include console errors and failed network requests |
// List all tabs{ "action": "tabs", "tab_action": "list" }
// Open new tab{ "action": "tabs", "tab_action": "create", "url": "https://myapp.example.com/settings" }
// Switch to second tab{ "action": "tabs", "tab_action": "switch", "index": 1 }
// Resize viewport (mobile){ "action": "resize", "width": 375, "height": 812 }
// Execute JavaScript{ "action": "evaluate", "expression": "document.title" }
// Accept a dialog{ "action": "handle_dialog", "dialog_action": "accept" }
// Accept a prompt dialog with text{ "action": "handle_dialog", "dialog_action": "accept", "prompt_text": "My answer" }
// Drag and drop{ "action": "drag", "source": ".draggable-item", "target": ".drop-zone" }