chromium-arm64
This ARM64-optimized Chromium automation server via Chrome DevTools Protocol offers:
Core Browser Control: Navigate, take screenshots (full-page or viewport), click, fill fields, hover, select dropdowns, execute JavaScript, and extract HTML/text.
Monitoring & Logging: Retrieve console logs/errors, network logs/errors, and clear all logs.
Element Inspection: Get details (tag, ID, class, text, value, selector) of the focused element.
Audits: Run accessibility, performance, SEO, best practices, Next.js, combined audits, and debugger mode.
Session Management: Set, get, and import/export cookies; persistent user profiles.
Mobile Device Emulation: Presets for iPhone, Pixel, Samsung, iPad; customizable viewport, user agent, device scale factor, touch, landscape, and reset to desktop.
Screencast Recording: Start/stop recording, export to MP4, GIF, or WebM, and check status.
Cross-Platform & Performance: Optimized for Linux ARM64 (Raspberry Pi), macOS Apple Silicon; direct WebSocket for lower memory and fast startup.
Integration: Claude Code CLI (MCP), Python API, and direct CLI access.
Customization: Environment variables for window size, screenshot height, user data dir, headful/headless, disk cache, custom Chromium path, and launch arguments.
Process Management: Cleanly shut down the Chromium browser instance.
Built on Node.js runtime to provide browser automation capabilities through a standardized interface.
Provides an alternative to Puppeteer that works on ARM64 architecture, fixing compatibility issues with Puppeteer's x86_64 binaries.
Provides Python wrappers and APIs for browser automation, enabling Python scripts to control the browser environment.
Optimized for Raspberry Pi's ARM64 architecture, providing a budget-friendly hardware platform for AI development.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@chromium-arm64take a screenshot of the homepage and save it as 'homepage.png'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Chromium ARM64 Server
๐ Two Implementation Approaches Available
๐ฆ Version Comparison
Feature | Direct CDP (v1.4.0) โญ RECOMMENDED | Puppeteer-based (v1.2.0) |
Dependencies | Only | Puppeteer + MCP SDK (163 packages) |
Memory Usage | Lower (native chromium) | Higher (Node.js wrapper overhead) |
Startup Time | Faster (direct WebSocket) | Slower (puppeteer initialization) |
Browser Control | Native Chrome DevTools Protocol | Puppeteer abstraction layer |
ARM64 Optimization | Full native ARM64 | Depends on Puppeteer ARM64 support |
Debugging | Raw CDP messages visible | Abstracted by Puppeteer |
Maintenance | Chrome protocol changes only | Puppeteer + Chrome protocol changes |
Performance | Best (direct communication) | Good (wrapped communication) |
๐ฏ When to Use Which Version
Use Direct CDP (v1.4.0) if:
โ You want maximum performance and minimum dependencies
โ You need native ARM64 optimization
โ You want direct Chrome DevTools Protocol control
โ You're building production automation systems
โ You want the latest features and fastest updates
Use Puppeteer-based (v1.2.0) if:
โ You're migrating from existing Puppeteer code
โ You prefer the Puppeteer API abstraction
โ You need specific Puppeteer features not yet implemented in direct CDP
โ You want to minimize changes to existing workflows
๐ Switching Between Versions
# Switch to Direct CDP (recommended)
git checkout direct-chromium
npm install # Only 89 packages
# Switch back to Puppeteer version
git checkout main
npm install # 163 packagesRelated MCP server: Glance
๐ Documentation & Specialized Guides
This repository includes multiple documentation approaches for different audiences:
๐ฏ For Developers & DevOps Engineers
๐ TECHNICAL README - Comprehensive technical documentation including:
Architecture diagrams and API reference
Performance benchmarks and optimization guides
CI/CD integration examples and E2E testing workflows
Advanced debugging and customization options
๐ For Makers & Entrepreneurs
๐ RASPBERRY PI README - Budget-focused guide featuring:
Complete $480 AI development setup
No-code SaaS development workflows
Real-world startup use cases and ROI analysis
Global accessibility and maker movement focus
โก Quick Links
Developers: Jump to Technical Documentation โ
Makers: Jump to Raspberry Pi Guide โ
Everyone: Continue reading for universal setup and usage
โจ Core Features
๐ค Native ARM64 Browser Automation
Direct Chrome DevTools Protocol implementation
27 comprehensive MCP tools for complete browser control
Optimized for Raspberry Pi and Apple Silicon architectures
No dependency on broken x86_64 Puppeteer binaries
โก High Performance Architecture
Only 2 dependencies (ws + MCP SDK) vs 163 packages in Puppeteer
Lower memory usage and faster startup times
Direct WebSocket communication with Chrome
Comprehensive logging and audit capabilities
๐ ๏ธ Enterprise-Ready Development
Full debugging suite with console/network monitoring
Accessibility, SEO, and performance audits built-in
CI/CD integration examples and E2E testing workflows
Cross-platform compatibility (Linux ARM64, macOS Apple Silicon)
๐ฐ Affordable Innovation Platform
Complete AI development setup for under $500
Same capabilities as $50K+ enterprise workstations
Global accessibility for makers and startups worldwide
No recurring cloud costs - own your infrastructure
๐ Universal Quick Start
Prerequisites
# Install system dependencies
sudo apt update
sudo apt install chromium-browser nodejs npm python3
# Verify Chromium works
chromium-browser --versionInstallation
git clone https://github.com/nfodor/mcp-chromium-arm64
cd mcp-chromium-arm64
npm install
chmod +x *.py *.shQuick Test (One-Liner)
# Verify it works immediately after install:
python3 -c "import sys; sys.path.append('.'); import arm64_browser; print('[OK] ARM64 Browser Works!' if 'error' not in arm64_browser.navigate('https://example.com').lower() else '[FAIL] Failed')"Expected Result: [OK] ARM64 Browser Works!
Test & Demo
# Quick demo with immediate visible results (30 seconds)
python3 instant_demo.py
# Or comprehensive demo showing all capabilities (2-3 minutes)
./run_demo.shTest the Setup
# Test MCP server directly
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node index.js
# Test Python wrapper
python3 simple_browser.py๐ ๏ธ Developer Guide & Debugging
๐ง Available MCP Tools (29 total)
Core Browser Control
navigate- Navigate to URLs with full page loadingscreenshot- Capture PNG screenshots (full page or viewport)click- Click elements by CSS selector with precise positioningfill- Fill input fields with text or valueshover- Hover over elements for dropdown/tooltip interactionsselect- Select dropdown options by valueevaluate- Execute JavaScript and return resultsget_content- Extract page HTML or plain text content
Advanced Functionality
get_console_logs- Retrieve browser console outputget_console_errors- Get console error messages onlyget_network_logs- Monitor all network requests/responsesget_network_errors- Track failed network requests (4xx/5xx)wipe_logs- Clear all stored logs from memoryget_selected_element- Get info about currently focused element
Session & Authentication
set_cookies- Import cookies (e.g. exported after logging in elsewhere) to authenticate without scripting the login formget_cookies- Export the current session's cookies as JSON (round-trips withset_cookies)
Mobile Device Emulation
emulate_device- Emulate mobile devices with 17 presets or custom viewport/UA/DPR/touch, with landscape supportiPhones:
iphone-16,iphone-16-pro,iphone-16-pro-max,iphone-16e,iphone-15,iphone-15-pro-max,iphone-sePixels:
pixel-9,pixel-9-pro,pixel-9-pro-xl,pixel-9-pro-foldSamsung:
galaxy-s24,galaxy-s24-ultra,galaxy-z-fold-5Tablets:
ipad-air-m2,ipad-pro-13,galaxy-tab-s9
reset_emulation- Reset device emulation back to desktop mode
Screencast Recording
start_screencast- Start recording browser activity via CDP screencast (configurable format, quality, resolution, frame skip)stop_screencast- Stop recording and encode to MP4, GIF, or WebM via ffmpeg (auto-detects FPS from frame timestamps)screencast_status- Check recording status, frame count, and elapsed duration
Audit & Analysis Tools
run_accessibility_audit- Check alt text, labels, headings, contrastrun_performance_audit- Measure load times, memory usage, resourcesrun_seo_audit- Validate title, meta description, H1 tags, canonicalrun_best_practices_audit- Check HTTPS, deprecated HTML, viewportrun_nextjs_audit- Next.js specific optimization checksrun_debugger_mode- Comprehensive debugging informationrun_audit_mode- Run all audits together with summaryclose_browser- Clean shutdown of chromium process
๐ Authenticated Review (login-required sites)
To review pages behind a login (e.g. x.com) you don't have to script the login form, captcha, or 2FA. Log in once in your normal browser, export the cookies, inject them, then navigate.
Log in to the site in your regular browser.
Export the cookies with Cookie-Editor (Chrome / Firefox / Edge / Safari / Opera): open it on the logged-in tab โ Export โ JSON. An extension export is required for
httpOnlycookies (e.g. x.com'sauth_token), whichdocument.cookiecannot read.Inject and review via the MCP:
# 1) import the exported cookies (replace the [...] with the Cookie-Editor JSON array)
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"set_cookies","arguments":{"url":"https://x.com","cookies":[]}}}' | node index.js
# 2) navigate to the page you want โ now authenticated
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"navigate","arguments":{"url":"https://x.com/home"}}}' | node index.jsThe session stays authenticated for the life of the browser process. Use get_cookies to export it back out for reuse.
Alternative โ raw Cookie header. Instead of the JSON array you can paste a raw Cookie: header string via cookieHeader (requires url, since a header carries no domain):
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"set_cookies","arguments":{"url":"https://x.com","cookieHeader":"auth_token=abc123; ct0=def456"}}}' | node index.jsPersist across restarts. By default the profile is ephemeral, so the session is lost when the browser process exits. Set CHROMIUM_USER_DATA_DIR to a writable path and cookies/logins survive restarts โ log in (or inject cookies) once and reuse:
export CHROMIUM_USER_DATA_DIR="$HOME/.mcp-chromium-arm64/profile"Format:
set_cookiesaccepts the Cookie-Editor / EditThisCookie JSON export directly โ it normalizessameSite(no_restrictionโNone), acceptsexpirationDate, and honors session cookies. Pass a top-levelurlfor any cookie that omits a domain, or usecookieHeaderfor a raw header string.cookies[]andcookieHeadercan be combined.Security: cookies are session secrets and pass through as tool arguments, so they appear in logs/transcripts. Treat an exported
auth_tokenlike a password โ log out / rotate when done. A persistentCHROMIUM_USER_DATA_DIRstores the live session on disk, so protect that directory too.
๐ Debugging & Development
Direct MCP Testing
# Test individual tools directly
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"navigate","arguments":{"url":"https://example.com"}}}' | node index.js
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"evaluate","arguments":{"script":"document.title"}}}' | node index.js
echo '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"screenshot","arguments":{"name":"debug.png"}}}' | node index.jsScreencast Recording
# Start recording, interact with the page, then stop and encode
# 1. Start screencast
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"start_screencast","arguments":{"format":"jpeg","quality":80,"maxWidth":1280,"maxHeight":720}}}' | node index.js
# 2. Perform actions (navigate, click, fill, etc.)
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"navigate","arguments":{"url":"https://example.com"}}}' | node index.js
# 3. Check recording progress
echo '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"screencast_status","arguments":{}}}' | node index.js
# 4. Stop and encode to MP4
echo '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"stop_screencast","arguments":{"output":"mp4","name":"my-demo"}}}' | node index.js
# Output: /tmp/my-demo.mp4
# Encode as GIF instead (2-pass palette for quality)
echo '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"stop_screencast","arguments":{"output":"gif","name":"bug-repro"}}}' | node index.js
# Output: /tmp/bug-repro.gif
# Or WebM (VP9)
echo '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"stop_screencast","arguments":{"output":"webm"}}}' | node index.jsRequires:
ffmpeginstalled on the system. FPS is auto-detected from CDP frame timestamps. GIF output is capped at 15fps for reasonable file sizes.
Mobile Device Emulation
# Emulate iPhone 16 Pro
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"emulate_device","arguments":{"device":"iphone-16-pro"}}}' | node index.js
# Emulate in landscape mode
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"emulate_device","arguments":{"device":"ipad-pro-13","landscape":true}}}' | node index.js
# Custom viewport with DPR
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"emulate_device","arguments":{"width":390,"height":844,"deviceScaleFactor":3,"mobile":true}}}' | node index.js
# Reset back to desktop
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"reset_emulation","arguments":{}}}' | node index.jsNetwork & Console Monitoring
# Navigate to a page, then check console logs
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_console_logs","arguments":{}}}' | node index.js
# Get only errors
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_console_errors","arguments":{}}}' | node index.js
# Check network activity (all requests with status codes)
echo '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_network_logs","arguments":{}}}' | node index.js
# Check for failed requests (4xx/5xx)
echo '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"get_network_errors","arguments":{}}}' | node index.js
# Clear all logs when done
echo '{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"wipe_logs","arguments":{}}}' | node index.jsAudits
# Run all audits at once (accessibility + performance + SEO + best practices + Next.js)
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"run_audit_mode","arguments":{}}}' | node index.js
# Or run individual audits
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"run_accessibility_audit","arguments":{}}}' | node index.js
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"run_performance_audit","arguments":{}}}' | node index.js
echo '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"run_seo_audit","arguments":{}}}' | node index.js
# Get full debug info (URL, viewport, memory, timing)
echo '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"run_debugger_mode","arguments":{}}}' | node index.jsElement Inspection
# Get info about the currently focused element
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_selected_element","arguments":{}}}' | node index.js
# Returns: tagName, id, className, textContent, value, and a CSS selectorChrome DevTools Protocol Debugging
# Manual CDP connection test
node -e "
const { WebSocket } = require('ws');
const { spawn } = require('child_process');
const chrome = spawn('/usr/bin/chromium-browser', [
'--headless', '--remote-debugging-port=9227'
]);
setTimeout(() => {
fetch('http://localhost:9227/json')
.then(r => r.json())
.then(tabs => {
console.log('Available tabs:', tabs.length);
const ws = new WebSocket(tabs[0].webSocketDebuggerUrl);
ws.on('open', () => {
console.log('CDP WebSocket connected!');
ws.send(JSON.stringify({id: 1, method: 'Runtime.evaluate', params: {expression: '2+2'}}));
});
ws.on('message', (data) => {
console.log('CDP Response:', JSON.parse(data));
chrome.kill();
process.exit(0);
});
});
}, 2000);
"Performance Monitoring
# Monitor system resources during operation
htop &
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"navigate","arguments":{"url":"https://httpbin.org/delay/5"}}}' | time node index.js
# Check memory usage
ps aux | grep chromium
free -hNetwork Debugging
# Check if debugging port is accessible
curl -s http://localhost:9222/json | jq '.[] | {id, title, type}'
# Monitor WebSocket traffic (install websocat)
websocat ws://localhost:9222/devtools/page/[TAB_ID] --text -v๐ Common Debugging Scenarios
1. WebSocket Connection Issues
# Symptoms: "CDP command timeout" errors
# Check if chrome debugging port is running
lsof -i :9222
# Test manual connection
node -e "
const { WebSocket } = require('ws');
const ws = new WebSocket('ws://localhost:9222/devtools/browser');
ws.on('open', () => console.log('โ WebSocket OK'));
ws.on('error', (e) => console.log('โ WebSocket Error:', e.message));
setTimeout(() => process.exit(0), 2000);
"2. Chrome Process Issues
# Symptoms: Browser won't start or hangs
# Kill any stuck processes
pkill -f chromium-browser
pkill -f remote-debugging-port
# Test chrome startup manually
timeout 10s /usr/bin/chromium-browser --headless --remote-debugging-port=9223 --no-sandbox
# Check chrome logs
journalctl --user -u chromium --since "1 hour ago"3. Element Selection Problems
# Debug CSS selectors interactively
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"evaluate","arguments":{"script":"document.querySelectorAll(\"button\").length"}}}' | node index.js
# Get element information
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"evaluate","arguments":{"script":"document.querySelector(\"#mybutton\") ? \"found\" : \"not found\""}}}' | node index.js4. Memory and Performance Issues
# Monitor memory during operation
watch -n 1 'ps aux | grep -E "(chromium|node)" | grep -v grep'
# Chrome memory debugging
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"evaluate","arguments":{"script":"JSON.stringify(performance.memory)"}}}' | node index.js๐ฏ Advanced Debugging Features
Enable Verbose Logging
# Set environment variables for detailed output
export DEBUG=puppeteer:*
export NODE_ENV=development
# Run with detailed Chrome logs
/usr/bin/chromium-browser --headless --enable-logging --log-level=0 --remote-debugging-port=9222CDP Message Tracing
# Create debug version with message logging
cp index.js debug-index.js
# Add to sendCDPCommand method:
# console.log('โ CDP:', JSON.stringify(command));
# console.log('โ CDP:', JSON.stringify(response));
node debug-index.jsIntegration with Browser DevTools
# Connect regular Chrome DevTools to the headless instance
# 1. Start the MCP server
# 2. Open regular Chrome/Chromium
# 3. Navigate to: chrome://inspect
# 4. Click "Configure..." and add localhost:9222
# 5. Click "inspect" on the page you want to debug๐ Performance Benchmarks
Startup Time Comparison
# Direct CDP (v1.3.0)
time echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"evaluate","arguments":{"script":"Date.now()"}}}' | node index.js
# Puppeteer version (v1.2.0)
git checkout main
time echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"evaluate","arguments":{"script":"Date.now()"}}}' | node index.jsMemory Usage Monitoring
# Before operation
free -h && ps aux | grep -E "(chromium|node)" | grep -v grep
# During operation (run in another terminal)
watch -n 1 'echo "=== $(date) ===" && free -h && echo && ps aux | grep -E "(chromium|node)" | grep -v grep'๐จ Error Codes & Solutions
Error | Cause | Solution |
| WebSocket connection lost | Restart browser, check port availability |
| Chrome not fully started | Increase startup delay, check chrome process |
| CSS selector invalid | Verify selector with |
| Debugging port blocked | Check firewall, kill existing chrome processes |
| Page loading issues | Check network, increase timeout, try simpler page |
๐ง Customization & Extension
Adding New MCP Tools
// In index.js, add to tools array:
{
name: 'my_custom_tool',
description: 'My custom functionality',
inputSchema: {
type: 'object',
properties: {
param: { type: 'string', description: 'Parameter description' }
},
required: ['param']
}
}
// Add to switch statement in CallToolRequestSchema handler:
case 'my_custom_tool':
return await this.myCustomTool(args.param);
// Implement the method:
async myCustomTool(param) {
await this.ensureChromium();
const result = await this.sendCDPCommand('Page.navigate', { url: param });
return { content: [{ type: 'text', text: `Custom result: ${result}` }] };
}Environment Variables
# Set browser window size (default: 1280,720)
export CHROMIUM_WINDOW_SIZE=1920,1080
# Cap full-page screenshot height in px (default: 32768)
export CHROMIUM_MAX_SCREENSHOT_HEIGHT=32768
# Persistent profile: keep cookies / logins across restarts (default: ephemeral when unset)
export CHROMIUM_USER_DATA_DIR="$HOME/.mcp-chromium-arm64/profile"
# Use a specific Chromium-family binary (Chrome, Edge, Brave, Opera, Vivaldi, Chromium).
# Overrides auto-detection; point it at any Chromium-based browser.
export CHROMIUM_PATH="/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
# Launch a visible (headful) window instead of headless โ e.g. to log into a site
# by hand once into a persistent profile (default: headless when unset)
export CHROMIUM_HEADLESS=false
# Cap Chrome's on-disk HTTP cache in bytes (default: 104857600 = 100MB).
# Bounds profile/cache growth, especially with a persistent CHROMIUM_USER_DATA_DIR.
export CHROMIUM_DISK_CACHE_SIZE=104857600Disk hygiene: in the default (ephemeral) mode the server launches Chrome with its own temp profile dir and deletes it on close โ and sweeps any leftovers from crashed/killed prior runs on startup โ so it can't accumulate orphaned profile/cache directories. The disk cache is capped (CHROMIUM_DISK_CACHE_SIZE) in both ephemeral and persistent modes. A persistent CHROMIUM_USER_DATA_DIR is intentionally kept (that's the point of it), so it's the one path you manage yourself.
Browser support: auto-detects any Chromium-family browser โ Chrome, Chromium, Microsoft Edge, Brave, Opera, Vivaldi (Firefox/Safari are not supported; the server speaks Chrome DevTools Protocol). Set CHROMIUM_PATH to force a specific binary.
Headful login (no cookie-export extension needed): set CHROMIUM_USER_DATA_DIR + CHROMIUM_HEADLESS=false, log into a site (X, LinkedIn, โฆ) by hand once in the visible window, then drop CHROMIUM_HEADLESS โ the persistent profile keeps you logged in for subsequent headless runs. This also beats headless bot-detection since you sign in as a normal user.
Chrome Launch Options
// Modify in startChromium() method:
const customArgs = [
'--headless',
'--no-sandbox',
'--disable-extensions',
'--disable-plugins',
'--disable-background-timer-throttling',
'--disable-backgrounding-occluded-windows',
'--disable-renderer-backgrounding',
'--remote-debugging-port=9222',
'--window-size=1920,1080', // Custom viewport
'--user-agent=CustomUA/1.0', // Custom user agent
'--disable-web-security', // For CORS testing
'--allow-running-insecure-content' // For mixed content
];๐ Cross-Platform ARM64 Compatibility
Platform Support Matrix
Platform | Status | Chrome Path | Installation Method | Notes |
Linux ARM64 โ | Fully Supported |
|
| Tested on Raspberry Pi OS |
macOS Apple Silicon โ ๏ธ | Requires Modifications |
| Download from Google or | Need path and flag updates |
Windows ARM64 โ | Untested |
| Download from Google | Would need Windows-specific changes |
macOS Apple Silicon Setup
Prerequisites
# Install Homebrew if not already installed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install Node.js and Chromium
brew install node chromium --no-quarantineRequired Code Changes
Currently, the server is optimized for Linux ARM64. For macOS compatibility, modify index.js:
// Detect platform and set appropriate chrome path
function getChromePath() {
const platform = process.platform;
switch(platform) {
case 'linux':
return '/usr/bin/chromium-browser';
case 'darwin': // macOS
// Try multiple possible paths
const macPaths = [
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
'/Applications/Chromium.app/Contents/MacOS/Chromium',
'/opt/homebrew/bin/chromium'
];
for (const path of macPaths) {
if (require('fs').existsSync(path)) {
return path;
}
}
throw new Error('Chrome/Chromium not found on macOS');
case 'win32':
return 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe';
default:
throw new Error(`Unsupported platform: ${platform}`);
}
}
// Update startChromium method
async startChromium() {
const chromePath = getChromePath();
const platform = process.platform;
// Platform-specific arguments
const baseArgs = [
'--headless',
'--disable-extensions',
'--disable-plugins',
`--remote-debugging-port=${debuggingPort}`,
'--no-first-run',
'--disable-gpu',
'--window-size=1280,720'
];
// Add Linux-specific sandbox flags
if (platform === 'linux') {
baseArgs.push('--no-sandbox', '--disable-setuid-sandbox');
}
// Add macOS-specific flags if needed
if (platform === 'darwin') {
baseArgs.push('--disable-dev-shm-usage');
}
chromiumProcess = spawn(chromePath, baseArgs);
// ... rest of method
}macOS-Specific Issues & Solutions
1. "Chromium is damaged" Error
# Remove quarantine flag if downloading manually
sudo xattr -r -d com.apple.quarantine /Applications/Chromium.app
# Or install via Homebrew with no-quarantine flag
brew install chromium --no-quarantine2. Chrome vs Chromium Choice
# Option 1: Use Google Chrome (recommended)
# Download from: https://www.google.com/chrome/
# Path: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
# Option 2: Use Chromium via Homebrew
brew install chromium --no-quarantine
# Path: /opt/homebrew/bin/chromium3. Permission Issues
# Ensure Chrome has required permissions
# System Preferences > Security & Privacy > Privacy tab
# Grant Camera, Microphone access if needed for specific use casesTesting Cross-Platform Compatibility
Quick Platform Detection Test
node -e "
console.log('Platform:', process.platform);
console.log('Architecture:', process.arch);
const fs = require('fs');
const paths = {
linux: '/usr/bin/chromium-browser',
darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
win32: 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe'
};
const chromePath = paths[process.platform];
console.log('Expected Chrome path:', chromePath);
console.log('Chrome exists:', fs.existsSync(chromePath));
"Cross-Platform MCP Test
# Test basic functionality across platforms
echo '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"evaluate\",\"arguments\":{\"script\":\"navigator.platform\"}}}' | node index.js
# Should return the current platformWindows ARM64 Considerations
While untested, Windows ARM64 support would need:
// Windows-specific chrome path detection
case 'win32':
const winPaths = [
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
process.env.LOCALAPPDATA + '\\Google\\Chrome\\Application\\chrome.exe'
];
// Similar path checking logic...Performance Differences
Platform | Startup Time | Memory Usage | Notes |
Linux ARM64 (Pi 4) | ~3-4s | ~150MB | Optimized, well-tested |
macOS Apple Silicon | ~2-3s | ~200MB | Faster CPU, more memory |
Windows ARM64 | Unknown | Unknown | Would depend on hardware |
Contribution Needed
We welcome contributions for full cross-platform support!
macOS testers: Test the proposed changes on Apple Silicon
Windows ARM64: Test on Surface Pro X or similar devices
Performance optimization: Platform-specific optimizations
Installation scripts: Automated setup for each platform
Claude CLI Integration
Prerequisites
# Install Claude Code CLI if you haven't already
npm install -g @anthropic-ai/claude-codeAdd to Claude CLI
# From the project directory after cloning
claude mcp add chromium-arm64 "$(pwd)/mcp-wrapper.sh" --scope userVerify Connection
claude mcp list
# Should show: chromium-arm64: /path/to/mcp-wrapper.sh - โ Connectedโ ๏ธ Important: Restart Claude After Adding
You MUST start a new Claude session after adding the MCP server:
# Exit current session if in one
exit
# Start fresh session
claudeUsing in Claude CLI
Ask Claude to use the chromium-arm64 tools:
List available MCP servers and use chromium-arm64 to navigate to https://example.com
Take a screenshot using the chromium-arm64 tool
Use chromium-arm64 to click the button with selector #submit
Fill the email field using chromium-arm64 with test@example.com
Record a screencast of the login flow and save it as a GIF
Emulate an iPhone 16 Pro and take a screenshot of the homepage
Run a full audit on https://example.com using chromium-arm64Be explicit to avoid Playwright/Puppeteer:
"Use chromium-arm64 to navigate..."
"Using the chromium-arm64 tool, take a screenshot"
"Open a browser" (might try broken Playwright)
"Take a screenshot" (might try broken Puppeteer)
Success Example
When working correctly, you'll see:
You: Use chromium-arm64 to navigate to https://httpbin.org/json and show me what you see
Claude: I'll navigate to https://httpbin.org/json using the chromium-arm64 tool.
[Uses chromium-arm64.navigate tool]
The page displays a JSON object with a slideshow structure containing:
- Author: "Yours Truly"
- Date: "date of publication"
- Title: "Sample Slide Show"
...Usage Examples
Python API
import simple_browser
# Navigate to any website
result = simple_browser.browser_navigate("https://example.com")
print(result) # "Successfully navigated to https://example.com"
# Take a screenshot
screenshot = simple_browser.browser_screenshot("homepage.png")
print(screenshot) # "Screenshot saved to /tmp/homepage.png"
# Execute JavaScript
title = simple_browser.browser_evaluate("document.title")
print(title) # Website title
# Extract page content
content = simple_browser.browser_get_content("text")
print(content[:100]) # First 100 chars of page textMCP Tools (via Claude Code)
Once configured, use these tools directly in Claude Code:
navigate- Go to URLsscreenshot- Capture page imagesclick/fill/hover/select- Interact with page elementsevaluate- Execute JavaScriptget_content- Extract page HTML/textemulate_device/reset_emulation- Mobile device emulation with 17 presetsstart_screencast/stop_screencast- Record browser activity to MP4/GIF/WebMget_console_logs/get_network_logs- Monitor console and networkrun_audit_mode- Run all audits (a11y, performance, SEO, best practices)close_browser- Clean shutdown
๐ฏ Key Use Cases
๐งช For Testing & QA Teams
End-to-end SaaS testing with autonomous AI agents
Visual regression detection and cross-device compatibility
24/7 continuous validation on budget hardware
๐ For Startups & Makers
Complete $480 AI development setup (see Raspberry Pi Guide)
No-code SaaS development with AI-powered testing
Competitive analysis and market research automation
๐ ๏ธ For DevOps & Developers
CI/CD integration with comprehensive audit tools
Performance benchmarking and accessibility testing
Advanced debugging with console/network monitoring
๐ Full examples and detailed guides available in the specialized documentation.
๐๏ธ Architecture
graph TB
A[Claude Code] --> B[MCP Protocol]
B --> C[ARM64 Browser Server]
C --> D[System Chromium]
D --> E[Web Pages]
F[Python Tools] --> C
G[Direct CLI] --> C๐ง Troubleshooting & Advanced Usage
For detailed troubleshooting guides, debugging tools, and advanced configuration:
๐ Quick References
Common Issues: See Technical Documentation โ
Performance Tuning: See Technical Documentation โ
Cross-Platform Setup: See Technical Documentation โ
Complete Hardware Setup: See Raspberry Pi Guide โ
Quick Fixes
# Test MCP server directly
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node index.js
# Verify browser installation
chromium-browser --version
# Check Claude MCP integration
claude mcp list๐ค Contributing
We welcome contributions to democratize AI access for developers worldwide.
Areas for Contribution:
๐ฑ Mobile browser support (Android/iOS testing)
๐ง Additional MCP tools and integrations
โก Performance optimizations for smaller devices
๐ Tutorial content and use-case examples
Development Setup:
git clone https://github.com/nfodor/mcp-chromium-arm64
cd mcp-chromium-arm64
npm install
# Ready to use - no development server needed!๐ License
MIT License - feel free to use in commercial projects!
๐ Acknowledgments
๐ค Anthropic for Claude Code and MCP protocol
๐ Raspberry Pi Foundation for democratizing computing
๐ Chromium Project for ARM64 browser support
๐ฅ Open Source Community for making this possible
๐ Support & Community
๐ Issues: GitHub Issues
๐ฌ Discussions: GitHub Discussions
๐ง Email: github@fodor.app
๐ Repository: github.com/nfodor/mcp-chromium-arm64
Available Tools
22 toolsclickC
Click an element on the page
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector for the element to click |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. While 'click' implies a user interaction simulation, the description doesn't mention what happens after clicking (e.g., page navigation, form submission, JavaScript execution), error conditions, or any side effects. It provides minimal behavioral context beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose with zero wasted words. It's appropriately sized for a simple action tool and front-loads the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a browser interaction tool with no annotations and no output schema, the description is insufficient. It doesn't explain what constitutes a successful click, what errors might occur (e.g., element not found), or what the tool returns. Given the complexity of browser automation and the lack of structured data, more behavioral context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, with the single parameter 'selector' clearly documented as a CSS selector. The description adds no additional parameter information beyond what the schema provides, so it meets the baseline for high schema coverage without adding extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('click') and target ('an element on the page'), providing a specific verb+resource combination. However, it doesn't distinguish this tool from sibling tools like 'hover' or 'select' that also interact with page elements, which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'hover', 'select', or 'get_selected_element'. There's no mention of prerequisites (e.g., needing an element to be visible or interactable) or context for when clicking is appropriate versus other interactions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_browserB
Close the browser instance
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Close the browser instance' implies a destructive action that terminates the session, but it doesn't specify consequences (e.g., loss of unsaved data, effect on subsequent operations) or requirements (e.g., permissions, state dependencies). For a mutation tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero wasted words. It's front-loaded with the core action and target, making it highly efficient and easy to parse. Every word earns its place by directly conveying the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a destructive operation with no parameters) and lack of annotations or output schema, the description is incomplete. It doesn't address behavioral aspects like what 'close' entails (e.g., graceful shutdown vs. force quit), return values, or error conditions. For a mutation tool in a browser automation context, more detail is needed to guide safe usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, which aligns with the empty input schema. A baseline of 4 is applied since there are no parameters to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('close') and target ('the browser instance'), which is specific and unambiguous. However, it doesn't differentiate from siblings like 'navigate' or 'wipe_logs' that also affect browser state, so it doesn't fully distinguish its unique purpose among related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., after completing tasks), exclusions (e.g., not during active debugging), or sibling tools that might be relevant (like 'navigate' for changing pages instead of closing). This leaves usage context entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluateC
Execute JavaScript in the browser
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | JavaScript code to execute |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral insight. It states what the tool does but doesn't disclose risks (e.g., potential side effects, security implications), execution environment details, or error handling. This is inadequate for a tool that executes arbitrary code in a browser context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with zero wasted words. It's front-loaded with the core action and context, making it highly efficient and easy to parse for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of executing JavaScript in a browser (with no annotations or output schema), the description is insufficient. It lacks details on return values, error cases, execution scope, or interaction with sibling tools (e.g., how it relates to get_console_logs). This leaves significant gaps for safe and effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with one parameter ('JavaScript code to execute'), so the schema already documents the parameter adequately. The description doesn't add any meaningful semantics beyond what the schema provides, such as examples or constraints on the script content, warranting the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Execute JavaScript in the browser' clearly states the action (execute) and target (JavaScript in browser), distinguishing it from siblings like click or navigate. However, it doesn't explicitly differentiate from tools like get_console_logs that also involve JavaScript execution context, making it a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., browser must be open), limitations (e.g., execution context), or when to prefer other tools like get_content for data extraction. This leaves the agent with minimal context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillC
Fill an input field
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector for the input field | |
| value | Yes | Value to fill |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. 'Fill an input field' implies a mutation (changing input value), but it doesn't disclose behavioral traits like whether it triggers events, requires the field to be interactable, handles errors if the selector is invalid, or has side effects. This is a significant gap for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description 'Fill an input field' is extremely concise with zero wasteโit's a single, front-loaded sentence that directly states the action. Every word earns its place, making it efficient for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a mutation operation with 2 parameters), lack of annotations, and no output schema, the description is incomplete. It doesn't explain return values, error handling, or interaction details, leaving gaps that could hinder an AI agent's ability to use it correctly in a web automation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('selector' and 'value') with clear descriptions. The description adds no meaning beyond this, such as examples of CSS selectors or validation rules for the value. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Fill an input field' states a clear verb ('fill') and resource ('input field'), but it's vague about scope and doesn't differentiate from sibling tools like 'select' or 'get_selected_element' which might also interact with input fields. It provides basic purpose but lacks specificity about what type of input fields or context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. With siblings like 'select' (which might select options) or 'get_selected_element' (which might retrieve input values), there's no indication of when 'fill' is appropriate, such as for text inputs versus other form elements, or prerequisites like needing an element to be visible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_console_errorsB
Get browser console errors
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool does but doesn't explain key behaviors: whether it returns real-time or historical errors, if it requires specific browser states, what format the output is in, or if it has side effects like clearing logs. This leaves significant gaps for an agent to understand how to use it effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely conciseโjust three wordsโand front-loaded with the core action. There is no wasted language or unnecessary elaboration, making it easy to parse quickly while still conveying the essential purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (likely moderate, as it interacts with browser state) and the lack of annotations and output schema, the description is insufficient. It doesn't cover what the tool returns, how errors are formatted, or any behavioral nuances, leaving the agent with incomplete information to use the tool correctly in context with its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the input schema has 100% description coverage (though empty). The description doesn't need to add parameter details, so it meets the baseline for a parameterless tool. No additional semantic information is required or provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get browser console errors' clearly states the verb ('Get') and resource ('browser console errors'), making the tool's purpose immediately understandable. However, it doesn't differentiate from its sibling 'get_console_logs', which likely retrieves general console logs rather than specifically errors, leaving some ambiguity about when to choose one over the other.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_console_logs' or 'get_network_errors'. It lacks context about prerequisites (e.g., needing an active browser session) or typical use cases (e.g., debugging JavaScript issues), leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_console_logsB
Get browser console logs
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states what the tool does but doesn't explain critical behaviors such as whether logs are cleared after retrieval, if there are rate limits, what format the logs are returned in, or if authentication is required. This is inadequate for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core action and resource, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't address what the tool returns (e.g., log format, structure), behavioral constraints, or how it interacts with siblings like 'wipe_logs'. For a tool in a browser automation context, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately doesn't mention parameters, earning a baseline score of 4 for not adding unnecessary information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('browser console logs'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'get_console_errors' or 'get_network_logs', which likely retrieve similar but distinct types of logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'get_console_errors' or 'wipe_logs'. The description lacks context about prerequisites, timing, or exclusions, leaving the agent to infer usage from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contentC
Get page content (HTML or text)
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Type of content to get | text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states what the tool does ('get page content') but lacks critical details: whether it requires an active page session, what happens if no page is loaded, if it returns the entire page or a portion, or any rate limits. For a tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely conciseโa single phrase with no wasted words. It front-loads the core purpose ('Get page content') and specifies the format options efficiently. Every word earns its place, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (a retrieval tool in a browser automation context), lack of annotations, and no output schema, the description is incomplete. It doesn't explain what the return value looks like (e.g., a string of HTML/text), error conditions, or dependencies on other tools like 'navigate'. For a tool with no structured support, more context is needed to guide the agent effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the parameter 'type' fully documented in the schema (enum: 'html' or 'text', default: 'text'). The description adds no additional meaning beyond stating 'HTML or text', which merely repeats the schema. According to the rules, with high schema coverage (>80%), the baseline is 3 even with no param info in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'get' and the resource 'page content', specifying the format options 'HTML or text'. It distinguishes from siblings like 'get_console_logs' or 'get_network_errors' by focusing on page content rather than logs or errors. However, it doesn't explicitly differentiate from tools like 'evaluate' or 'select' that might also retrieve content, keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a page loaded via 'navigate'), exclusions, or comparisons to siblings like 'get_selected_element' for specific content. Without such context, the agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_network_errorsC
Get network error logs
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Get network error logs' implies a read-only operation, but it doesn't specify whether this retrieves real-time data, historical logs, requires specific permissions, has rate limits, or what format the output takes. This leaves significant gaps for an agent to understand how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient phrase ('Get network error logs') that gets straight to the point without unnecessary words. It's appropriately sized for a simple tool, though it could be slightly more informative without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (a tool for retrieving logs) and lack of annotations or output schema, the description is incomplete. It doesn't explain what 'network error logs' entail, how they're formatted, or any behavioral aspects like data freshness or scope. For a tool in a set with many logging siblings, more context is needed to guide proper usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, meaning no parameters need documentation. The description doesn't add parameter details, which is appropriate here. A baseline score of 4 is given since no parameters exist, and the description doesn't need to compensate for any gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get network error logs' clearly states the action (get) and resource (network error logs), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'get_console_errors' or 'get_network_logs', leaving ambiguity about what specifically distinguishes this tool from those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'get_console_errors' and 'get_network_logs' available, there's no indication of whether this tool is for errors only, real-time vs. historical logs, or other contextual factors that would help an agent choose appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_network_logsC
Get network activity logs
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the action ('Get') without details on permissions, rate limits, data format, or whether this is a read-only operation. This leaves significant gaps in understanding how the tool behaves in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words, making it easy to parse. However, it could be more front-loaded with additional context to improve clarity, but it remains appropriately concise for its minimal content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of network logging and the lack of annotations and output schema, the description is incomplete. It fails to explain what 'network activity logs' include, how data is returned, or any behavioral traits, leaving the agent with insufficient information to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description adds no parameter information, which is acceptable here as there are no parameters to explain, aligning with the baseline for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get network activity logs' states a clear verb ('Get') and resource ('network activity logs'), providing basic purpose. However, it doesn't distinguish this tool from its sibling 'get_network_errors', which likely retrieves similar network-related data, leaving ambiguity about what specifically differentiates them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'get_network_errors' or other logging tools such as 'get_console_logs'. The description lacks context about specific scenarios, prerequisites, or exclusions, offering minimal usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_selected_elementB
Get information about the currently selected element
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool retrieves information, implying a read-only operation, but doesn't specify what type of information is returned, potential errors (e.g., if no element is selected), or performance considerations. This leaves gaps in understanding how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It's front-loaded with the core purpose and efficiently communicates the tool's function without unnecessary detail. This is an excellent example of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is adequate but minimal. It states what the tool does but lacks details on return values, error handling, or usage context. For a tool that likely returns structured data about an element, more completeness would be helpful, though the absence of an output schema makes this less critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and it appropriately doesn't mention any. This meets the baseline for tools with no parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get information about the currently selected element.' It uses a specific verb ('Get') and resource ('currently selected element'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from siblings like 'get_content' or 'select', which could have overlapping contexts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a selected element first), exclusions, or comparisons to sibling tools like 'get_content' or 'select'. Without this, users might struggle to choose the right tool in context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hoverC
Hover over an element on the page
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector for the element to hover |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states what the tool does but doesn't explain what 'hover over' means behaviorally (e.g., triggers CSS :hover states, might reveal tooltips, doesn't click). It also omits potential side effects, error conditions, or response expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's appropriately sized for a simple tool and front-loads the core action clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a browser interaction tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens after hovering (e.g., visual feedback, event triggers) or potential errors (e.g., if selector doesn't match). Given the complexity of browser automation, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single parameter 'selector' fully documented in the schema. The description doesn't add any meaning beyond what the schema provides about parameters, so it meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('hover over') and target ('an element on the page'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'click' or 'select', which are also element interaction tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'click' or 'select'. It doesn't mention prerequisites (e.g., needing an element to be visible) or contextual constraints, leaving the agent with minimal usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_accessibility_auditB
Run an accessibility audit on the current page
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral insight. It states the action ('run an accessibility audit') but doesn't disclose what the audit entails, how long it takes, whether it modifies the page, what output to expect, or any rate limits. This is inadequate for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without any wasted words. It is appropriately sized and front-loaded, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of an audit tool with no annotations and no output schema, the description is insufficient. It doesn't explain what the audit checks, what format results are in, whether it's blocking or async, or any error conditions. For a tool that likely produces detailed output, this leaves significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description adds no parameter information, which is appropriate here. Baseline 4 applies as per rules for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('run') and resource ('accessibility audit on the current page'), making the purpose immediately understandable. It distinguishes this from non-audit siblings like 'click' or 'navigate', though it doesn't explicitly differentiate from other audit tools like 'run_performance_audit' or 'run_seo_audit'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'run_best_practices_audit' or 'run_seo_audit'. The description implies usage on 'the current page', but lacks context about prerequisites (e.g., needing a page loaded) or exclusions (e.g., not for non-web content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_audit_modeC
Run comprehensive audit mode for optimization
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It vaguely mentions 'comprehensive audit mode' but doesn't explain what the tool does behaviorallyโe.g., whether it runs multiple audits, modifies system state, requires specific conditions, or has side effects like logging. For a tool with zero annotation coverage, this is inadequate, as it leaves critical behavioral traits unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a single sentence, but it's under-specified rather than efficiently informative. It front-loads the core action ('Run comprehensive audit mode') but fails to provide essential details, making it feel incomplete rather than streamlined. While not verbose, it doesn't earn its place by adding sufficient value beyond the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity implied by 'comprehensive audit mode', lack of annotations, no output schema, and rich sibling tools, the description is incomplete. It doesn't explain what the audit covers, what 'optimization' means, or what the output might be, leaving significant gaps. For a tool that likely performs a non-trivial operation, more context is needed to be fully helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics beyond the schema, which already fully covers the lack of inputs. A baseline of 4 is appropriate as the description doesn't contradict or need to compensate for missing parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Run comprehensive audit mode for optimization' restates the tool name 'run_audit_mode' with minimal elaboration, making it tautological. It doesn't specify what 'audit mode' entails or what 'optimization' refers to, leaving the purpose vague. Compared to sibling tools like 'run_accessibility_audit' or 'run_performance_audit', it lacks differentiation, failing to clarify if this is a generic audit or something distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'run_accessibility_audit', 'run_performance_audit', and 'run_seo_audit', it's unclear if 'run_audit_mode' is a superset, a different type of audit, or should be used in specific contexts. No explicit when/when-not instructions or prerequisites are mentioned, leaving usage ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_best_practices_auditC
Run a best practices audit on the current page
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions 'Run a best practices audit' which suggests an analysis operation, but doesn't disclose behavioral traits such as whether it's read-only, if it modifies the page, execution time, or output format. This is a significant gap for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero waste, front-loading the core action and target. It's appropriately sized for a no-parameter tool, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity implied by 'best practices audit' and lack of annotations or output schema, the description is incomplete. It doesn't explain what the audit entails, what it returns, or how it differs from other audit tools. This leaves the agent with insufficient context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so no parameter information is needed. The description doesn't add param details, which is appropriate. Baseline is 4 as it compensates adequately for the lack of parameters by not introducing unnecessary complexity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action ('Run a best practices audit') and target ('on the current page'), which provides a basic purpose. However, it's vague about what 'best practices' entails compared to sibling tools like run_accessibility_audit or run_seo_audit, lacking specific differentiation. It doesn't restate the name/title tautologically but could be more precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like run_accessibility_audit or run_seo_audit. The description implies usage on a current page but doesn't specify contexts, prerequisites, or exclusions. This leaves the agent without clear direction for tool selection among similar audit siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_debugger_modeC
Run debugger mode to debug issues in the application
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool runs a debugger mode but does not disclose behavioral traits such as whether it's interactive, what output it produces, if it modifies the application state, or its execution duration. This leaves significant gaps for a tool that likely involves runtime analysis.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It is appropriately sized for a simple tool, though it could be more front-loaded with key details if the purpose were clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity implied by 'debugger mode' and the lack of annotations and output schema, the description is incomplete. It does not explain what the tool does beyond the name, what issues it debugs, or what results to expect, making it inadequate for informed tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so no parameter documentation is needed. The description does not add parameter details, but this is acceptable given the absence of parameters, aligning with the baseline for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's purpose as 'Run debugger mode to debug issues in the application', which is clear but vague. It specifies the verb 'run' and resource 'debugger mode', but lacks specificity about what 'debugger mode' entails or how it differs from sibling audit tools like 'run_audit_mode' or 'run_accessibility_audit'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention prerequisites, context, or exclusions, leaving the agent to infer usage from the name alone among many sibling tools focused on testing, debugging, and interaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_nextjs_auditB
Run a Next.js specific audit on the current page
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool does but doesn't describe behavioral traits like whether it modifies the page, requires specific page states, returns results, or has side effects. This is inadequate for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's appropriately sized and front-loaded, clearly stating the tool's purpose without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of an audit tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the audit entails, what results to expect, or how it interacts with the page, leaving significant gaps in understanding for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the input schema has 100% description coverage (though empty). The description doesn't need to add parameter semantics, so it meets the baseline of 4 for tools with no parameters, as there's nothing to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Run') and target ('Next.js specific audit on the current page'), providing a specific verb+resource combination. However, it doesn't explicitly distinguish this tool from sibling audit tools like 'run_accessibility_audit' or 'run_seo_audit' beyond mentioning 'Next.js specific', which is helpful but not a full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like other audit tools (e.g., 'run_accessibility_audit', 'run_seo_audit') or general audit modes (e.g., 'run_audit_mode'). It lacks explicit when/when-not instructions or prerequisite context, such as needing a Next.js page to be loaded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_performance_auditC
Run a performance audit on the current page
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states the action but does not explain what the audit does (e.g., metrics checked, output format), whether it's read-only or has side effects, or any constraints like permissions or rate limits, leaving significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It is front-loaded with the core action and target, making it easy to scan and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a performance audit tool with no annotations and no output schema, the description is incomplete. It lacks details on what the audit entails, what results to expect, or how it integrates with sibling tools, making it inadequate for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description does not add parameter details, but this is acceptable as there are no parameters to describe, aligning with the baseline for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's action ('Run a performance audit') and target ('on the current page'), which is clear but vague. It does not specify what a 'performance audit' entails or how it differs from sibling tools like 'run_accessibility_audit' or 'run_seo_audit', missing sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description lacks context about prerequisites (e.g., needing a page loaded) or exclusions, and it does not reference sibling tools for comparison, leaving usage unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_seo_auditB
Run an SEO audit on the current page
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the action ('run an SEO audit') but doesn't explain what this entails (e.g., what metrics are checked, whether it modifies the page, how results are returned, or if it has side effects). For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It is appropriately sized and front-loaded, making it easy to understand at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of an SEO audit (which typically involves multiple checks and outputs), the description is incomplete. It lacks details on what the audit covers, how results are returned (no output schema), and behavioral traits. With no annotations and no output schema, the description should provide more context to be fully helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and it appropriately doesn't mention any. A baseline of 4 is applied for zero-parameter tools, as there's nothing missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('run an SEO audit') and target ('on the current page'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'run_accessibility_audit' or 'run_performance_audit' beyond the SEO focus, which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'run_accessibility_audit' or 'run_performance_audit', nor does it mention prerequisites (e.g., requiring a page to be loaded). It only states what the tool does, not when it should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotB
Take a screenshot of the current page
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the screenshot file | screenshot.png |
| fullPage | No | Capture full page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the action but doesn't disclose behavioral traits such as whether it saves the screenshot locally, returns it as data, requires specific permissions, or has side effects. For a tool with no annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core purpose and appropriately sized for a simple tool, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., file path, binary data) or behavioral details like error handling. For a tool with 2 parameters and no structured coverage beyond the input schema, more context is needed to be fully helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('name' and 'fullPage') with descriptions and defaults. The description adds no additional meaning beyond what the schema provides, such as explaining the implications of 'fullPage' or file naming conventions. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Take a screenshot of the current page' clearly states the action (take) and resource (screenshot of current page) with specific scope. It distinguishes from siblings like 'get_content' (which retrieves page content) or 'run_audit_mode' (which performs analysis) by focusing on visual capture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., requires a page to be loaded), exclusions, or comparisons with similar tools like 'get_content' for textual data. The description only states what it does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selectC
Select an option from a dropdown
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector for the select element | |
| value | Yes | Value to select |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral insight. It implies a UI interaction but doesn't disclose whether this requires a browser context, what happens on failure (e.g., if selector isn't found), or any side effects. For a tool with zero annotation coverage, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded and directly communicates the tool's purpose without unnecessary elaboration, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a UI interaction tool with no annotations and no output schema, the description is insufficient. It lacks details on behavioral traits, error handling, or dependencies (e.g., requiring a browser session), leaving significant gaps for an agent to operate effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('selector' and 'value') adequately. The description adds no additional meaning beyond what the schema provides, such as examples or constraints, but doesn't need to compensate for gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Select an option') and target resource ('from a dropdown'), making the purpose immediately understandable. It doesn't differentiate from sibling tools like 'click' or 'fill', but it's specific enough to convey the core function without being tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'click' (for general clicking) or 'fill' (for text input). There's no mention of prerequisites, context, or exclusions, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wipe_logsB
Clear all stored logs from memory
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Clear all stored logs from memory' implies a destructive operation but doesn't specify permanence (irreversible?), scope (clears all types or just some?), side effects (affects performance?), or response behavior (confirmation?). For a destructive tool with zero annotation coverage, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It's front-loaded with the core action and resource. Every word earns its place, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, lack of annotations, and no output schema, the description is incomplete. It doesn't address safety (e.g., confirmation prompts), return values (e.g., success status), or error handling. For a clear/wipe operation, more context is needed for reliable agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100% (empty schema). The description doesn't need to explain parameters, and it correctly implies no inputs are required. Baseline is 4 for zero parameters, as the description aligns with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Clear all stored logs from memory' clearly states the action (clear) and resource (stored logs) with scope (all, from memory). It distinguishes from sibling tools like get_console_logs or get_network_logs which retrieve logs rather than clear them. However, it doesn't explicitly differentiate from hypothetical siblings like 'delete_logs' or 'archive_logs'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., after debugging), exclusions (e.g., not for production), or related tools (e.g., use after get_console_logs). The agent must infer usage from the action alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, such as click, fill, navigate, and screenshot, with clear boundaries. However, some overlap exists between the various audit tools (e.g., run_accessibility_audit, run_best_practices_audit, run_performance_audit, run_seo_audit, run_nextjs_audit, run_audit_mode), which could cause confusion as their specific scopes might not be immediately clear from the names alone, though descriptions help differentiate them.
The tool names follow a highly consistent snake_case pattern with clear verb_noun structures, such as click, close_browser, evaluate, fill, get_console_errors, navigate, run_accessibility_audit, and screenshot. There are no deviations in naming conventions, making the set predictable and easy to understand.
With 22 tools, the count is borderline high for a browser automation and auditing server, as it might feel heavy and potentially overwhelming. While it covers many aspects, some tools could be consolidated (e.g., multiple audit tools), suggesting a slight over-scoping that could impact usability.
The tool set provides comprehensive coverage for browser automation and auditing, including navigation, interaction (click, fill, select), content retrieval (get_content, get_console_logs), debugging (run_debugger_mode, get_network_errors), audits (performance, SEO, accessibility), and maintenance (close_browser, wipe_logs). There are no obvious gaps, and agents can handle full workflows from setup to analysis.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Mint โ AI-powered QA that runs your app in a real browser on every PR.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
MCP server to assist with JxBrowser development.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI-powered browser automation, web scraping, and testing using Playwright across Chromium, Firefox, and WebKit. It allows users to perform actions like navigation, clicking, typing, and taking screenshots through natural language interfaces.15MIT
- AlicenseCqualityDmaintenanceAn MCP server that gives Claude Code real browser control for web automation, testing, and screenshots.3255151MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that enables AI agents to automate browser testing via Chromium, providing tools for navigation, interaction, and inspection.
- AlicenseNot gradedqualityDmaintenanceMCP server to control Chrome browsers locally or remotely via the Claude extension, enabling navigation, form filling, screenshots, and JavaScript execution from any MCP client.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nfodor/mcp-chromium-arm64'
If you have feedback or need assistance with the MCP directory API, please join our Discord server