35925b3863
Browser window with globe and cursor design. TypeScript blue color palette matching the ecosystem. Includes SVG source, 200px and 512px PNG versions. Updated README with centered logo and badges. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
7.0 KiB
7.0 KiB
@saiden/browse
Headless browser automation via MCP using Playwright WebKit.
Installation
npm install @saiden/browse
npx playwright install webkit
CLI Usage
# Take a screenshot
browse https://example.com
# Custom viewport and output
browse -o page.png -w 1920 -h 1080 https://example.com
# Query elements
browse -q "a[href]" https://example.com
browse -q "img" -j https://example.com # JSON output
# Click and interact
browse -c "button.submit" https://example.com
browse -t "input[name=q]=hello" -c "button[type=submit]" https://google.com
# Chain actions
browse -c ".cookie-accept" -c "a.nav-link" -q "h1" https://example.com
# Interactive mode (visible browser)
browse -i --headed https://example.com
# Fullscreen mode (macOS native fullscreen)
browse --fullscreen -i https://example.com
# Preview mode (highlights elements before actions)
browse -p -c "button.submit" https://example.com
browse -p --preview-delay 3000 -c ".nav-link" https://example.com
MCP Server
Add to your MCP client config (e.g., ~/.claude/settings.json or project .mcp.json):
{
"mcpServers": {
"browse": {
"command": "npx",
"args": ["browse-mcp"]
}
}
}
Or run directly:
browse-mcp
MCP Tools Reference
Browser Lifecycle:
| Tool | Description |
|---|---|
launch |
Launch browser with options (headed, fullscreen, preview, viewport) |
close |
Close the browser and end session |
Navigation & Interaction:
| Tool | Description |
|---|---|
goto |
Navigate to a URL |
click |
Click on an element |
type |
Type text into an input field |
hover |
Hover over an element |
select |
Select option(s) in a dropdown |
keys |
Send keyboard shortcuts (e.g., "Enter", "Control+a") |
scroll |
Scroll page or element into view |
upload |
Upload files to a file input |
back, forward, reload |
Browser navigation |
wait |
Wait for a specified time |
Debugging & Inspection:
| Tool | Description |
|---|---|
console |
Get captured console messages (log, warn, error, etc.) |
errors |
Get page errors (uncaught exceptions) |
network |
Get captured network requests/responses |
intercept |
Block or mock network requests |
metrics |
Get performance metrics and DOM statistics |
a11y |
Get accessibility tree snapshot |
Page Content:
| Tool | Description |
|---|---|
query |
Query elements by CSS selector |
screenshot |
Take a screenshot |
url |
Get current URL and title |
html |
Get page HTML content |
eval |
Execute JavaScript in browser context |
Storage & Session:
| Tool | Description |
|---|---|
cookies |
Get, set, delete, or clear cookies |
storage |
Access localStorage or sessionStorage |
dialog |
Configure how browser dialogs are handled |
session_save |
Save session state to file |
session_restore |
Restore session from file |
Viewport & Emulation:
| Tool | Description |
|---|---|
viewport |
Resize browser viewport |
emulate |
Emulate a mobile device |
Image Processing:
| Tool | Description |
|---|---|
favicon |
Generate favicon set from image |
convert |
Convert image format |
resize |
Resize image |
crop |
Crop image |
compress |
Compress image |
thumbnail |
Create thumbnail |
MCP Resources
| Resource | Description |
|---|---|
browser://state |
Browser state (URL, title, launched) |
browser://html |
Page HTML (truncated to 10KB) |
browser://html/full |
Complete page HTML |
browser://console |
Captured console messages |
browser://network |
All network requests |
browser://network/failed |
Failed requests only |
browser://errors |
Page errors |
browser://a11y |
Accessibility tree |
browser://screenshot |
Page screenshot as base64 PNG |
Programmatic Usage
import { ClaudeBrowser } from '@saiden/browse';
const browser = new ClaudeBrowser({
headless: true, // Set false to show browser window
width: 1280,
height: 800,
fullscreen: false, // macOS native fullscreen (implies headless: false)
preview: false, // Highlight elements before actions
previewDelay: 2000, // Preview highlight duration in ms
});
await browser.launch();
await browser.goto('https://example.com');
const elements = await browser.query('a[href]');
console.log(elements);
await browser.click('button.submit');
await browser.type('#input', 'hello');
await browser.screenshot('page.png');
await browser.close();
API
ClaudeBrowser
Lifecycle:
launch()- Launch the browserclose()- Close the browsernewPage()- Open new page
Navigation:
goto(url)- Navigate to URLback()/forward()/reload()- Browser navigationwait(ms)- Wait for timeout
Interaction:
click(selector)- Click elementtype(selector, text)- Type into inputhover(selector)- Hover over elementselect(selector, value)- Select dropdown option(s)keys(keys)- Press keyboard keysscroll(selector?, x?, y?)- Scroll page or elementupload(selector, files)- Upload files
Content:
query(selector)- Query elements, returns attributesscreenshot(path?, fullPage?)- Take screenshotgetUrl()- Get current URL and titlegetHtml(full?)- Get page HTMLeval(script)- Execute JavaScript
Debugging:
getConsole(level?, clear?)- Get console messagesgetErrors(clear?)- Get page errorsgetNetwork(filter?, clear?)- Get network requestsgetMetrics(includeResources?)- Get performance metricsgetA11y(selector?)- Get accessibility tree
Storage:
getCookies(name?)- Get cookiessetCookie(name, value, url?)- Set cookiedeleteCookie(name)/clearCookies()- Remove cookiesgetStorage(type, key?)- Get localStorage/sessionStoragesetStorage(type, key, value)- Set storage itemdeleteStorage(type, key)/clearStorage(type)- Remove storage
Interception:
addIntercept(pattern, action, response?)- Block or mock requestsclearIntercepts()- Remove all intercepts
Viewport:
setViewport(width, height)- Resize viewportemulate(device)- Emulate device (e.g., 'iPhone 13')
Commands:
executeCommand(cmd)- Execute a command object
License
MIT
