Skip to main content
Glama

MCP Chromium ARM64 Server

๐Ÿš€ Two Implementation Approaches Available

๐Ÿ“ฆ Version Comparison

Feature

Direct CDP (v1.4.0) โญ RECOMMENDED

Puppeteer-based (v1.2.0)

Dependencies

Only ws + MCP SDK (89 packages)

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 packages

Related 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


โœจ 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 --version

Installation

git clone https://github.com/nfodor/mcp-chromium-arm64
cd mcp-chromium-arm64
npm install
chmod +x *.py *.sh

Quick 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.sh

Test 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 loading

  • screenshot - Capture PNG screenshots (full page or viewport)

  • click - Click elements by CSS selector with precise positioning

  • fill - Fill input fields with text or values

  • hover - Hover over elements for dropdown/tooltip interactions

  • select - Select dropdown options by value

  • evaluate - Execute JavaScript and return results

  • get_content - Extract page HTML or plain text content

Advanced Functionality

  • get_console_logs - Retrieve browser console output

  • get_console_errors - Get console error messages only

  • get_network_logs - Monitor all network requests/responses

  • get_network_errors - Track failed network requests (4xx/5xx)

  • wipe_logs - Clear all stored logs from memory

  • get_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 form

  • get_cookies - Export the current session's cookies as JSON (round-trips with set_cookies)

Mobile Device Emulation

  • emulate_device - Emulate mobile devices with 17 presets or custom viewport/UA/DPR/touch, with landscape support

    • iPhones: iphone-16, iphone-16-pro, iphone-16-pro-max, iphone-16e, iphone-15, iphone-15-pro-max, iphone-se

    • Pixels: pixel-9, pixel-9-pro, pixel-9-pro-xl, pixel-9-pro-fold

    • Samsung: galaxy-s24, galaxy-s24-ultra, galaxy-z-fold-5

    • Tablets: 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, contrast

  • run_performance_audit - Measure load times, memory usage, resources

  • run_seo_audit - Validate title, meta description, H1 tags, canonical

  • run_best_practices_audit - Check HTTPS, deprecated HTML, viewport

  • run_nextjs_audit - Next.js specific optimization checks

  • run_debugger_mode - Comprehensive debugging information

  • run_audit_mode - Run all audits together with summary

  • close_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.

  1. Log in to the site in your regular browser.

  2. 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 httpOnly cookies (e.g. x.com's auth_token), which document.cookie cannot read.

  3. 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.js

The 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.js

Persist 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_cookies accepts the Cookie-Editor / EditThisCookie JSON export directly โ€” it normalizes sameSite (no_restriction โ†’ None), accepts expirationDate, and honors session cookies. Pass a top-level url for any cookie that omits a domain, or use cookieHeader for a raw header string. cookies[] and cookieHeader can be combined.

Security: cookies are session secrets and pass through as tool arguments, so they appear in logs/transcripts. Treat an exported auth_token like a password โ€” log out / rotate when done. A persistent CHROMIUM_USER_DATA_DIR stores 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.js

Screencast 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.js

Requires: ffmpeg installed 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.js

Network & 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.js

Audits

# 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.js

Element 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 selector

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

Network 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.js

4. 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=9222

CDP 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.js

Integration 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.js

Memory 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

CDP command timeout

WebSocket connection lost

Restart browser, check port availability

WebSocket not ready

Chrome not fully started

Increase startup delay, check chrome process

Element not found

CSS selector invalid

Verify selector with evaluate tool

ECONNREFUSED

Debugging port blocked

Check firewall, kill existing chrome processes

Navigation timeout

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=104857600

Disk 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

/usr/bin/chromium-browser

apt install chromium-browser

Tested on Raspberry Pi OS

macOS Apple Silicon โš ๏ธ

Requires Modifications

/Applications/Google Chrome.app/Contents/MacOS/Google Chrome

Download from Google or brew install chromium

Need path and flag updates

Windows ARM64 โ“

Untested

C:\Program Files\Google\Chrome\Application\chrome.exe

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

Required 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-quarantine

2. 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/chromium

3. Permission Issues

# Ensure Chrome has required permissions
# System Preferences > Security & Privacy > Privacy tab
# Grant Camera, Microphone access if needed for specific use cases

Testing 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 platform

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

Add to Claude CLI

# From the project directory after cloning
claude mcp add chromium-arm64 "$(pwd)/mcp-wrapper.sh" --scope user

Verify 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
claude

Using 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-arm64

Be 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 text

MCP Tools (via Claude Code)

Once configured, use these tools directly in Claude Code:

  • navigate - Go to URLs

  • screenshot - Capture page images

  • click / fill / hover / select - Interact with page elements

  • evaluate - Execute JavaScript

  • get_content - Extract page HTML/text

  • emulate_device / reset_emulation - Mobile device emulation with 17 presets

  • start_screencast / stop_screencast - Record browser activity to MP4/GIF/WebM

  • get_console_logs / get_network_logs - Monitor console and network

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

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



Available Tools

22 tools
clickC

Click an element on the page

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector for the element to click

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't 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

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesJavaScript code to execute

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector for the input field
valueYesValue to fill

TDQS

C2.7/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose3/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like '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)

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoType of content to gettext

TDQS

C2.9/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't 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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

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

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. 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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

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

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness3/5

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

Given the tool's simplicity (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.

Parameters4/5

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.

Purpose4/5

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

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't 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

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector for the element to hover

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.4/5.0
Behavior2/5

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

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

Conciseness3/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose2/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. 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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like 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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

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

Conciseness4/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName for the screenshot filescreenshot.png
fullPageNoCapture full page

TDQS

B3.2/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines2/5

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector for the select element
valueYesValue to select

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like '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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

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

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't 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

B3.2/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness5/5

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

ActivityStale
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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