browser-mcp-server
# Browser MCP Server
A Model Context Protocol (MCP) server that provides browser automation capabilities, specifically for capturing console output from web pages.
## Features
- **browser-console**: Navigate to a URL and capture console output from the browser
- **browser-server-console**: Spawn a local Express static server for a directory and capture console output from the served content
- Built with Puppeteer for reliable browser automation
- Supports custom timeouts and wait conditions
- Static file serving for local development and testing
- Automatic port detection (finds next available port if requested port is busy)
## Installation
```bash
npm install
```
## Usage
### As an MCP Server
This server is designed to be used with MCP-compatible clients. Add it to your MCP client configuration:
```json
{
"mcpServers": {
"browser-mcp-server": {
"command": "npx",
"args": ["browser-mcp-server"]
}
}
}
```
### Direct Usage
You can also run the server directly:
```bash
npm start
```
Or in development mode with auto-reload:
```bash
npm run dev
```
## Tools
### browser-console
Navigate to a URL and capture console output from the browser.
**Parameters:**
- `url` (required): The URL to navigate to
- `timeout` (optional): Timeout in milliseconds (default: 30000)
- `waitFor` (optional): CSS selector to wait for before capturing console
- `commands` (optional): Browser commands to execute (e.g., "click .button wait 2s")
- `stream` (optional): Whether to stream output in real-time (default: true)
**Commands syntax:**
- `wait <time>`: Wait for specified time (e.g., "5s", "1000ms")
- `click <selector>`: Click on element matching CSS selector
**Example:**
```json
{
"name": "browser-console",
"arguments": {
"url": "https://example.com",
"timeout": 10000,
"waitFor": "#main-content",
"commands": "click .load-more-btn wait 2s click .submit",
"stream": true
}
}
```
### browser-server-console
Spawn an Express static server for a directory and capture console output from the served content.
**Parameters:**
- `directory` (required): The directory to serve statically
- `port` (optional): Preferred port to run the server on (will automatically find next available if busy, default: 3000)
- `path` (optional): Path to navigate to after starting server (default: "/")
- `timeout` (optional): Timeout in milliseconds (default: 30000)
- `waitFor` (optional): CSS selector to wait for before capturing console
- `commands` (optional): Browser commands to execute (e.g., "click .button wait 2s")
- `stream` (optional): Whether to stream output in real-time (default: true)
**Commands syntax:**
- `wait <time>`: Wait for specified time (e.g., "5s", "1000ms")
- `click <selector>`: Click on element matching CSS selector
**Example:**
```json
{
"name": "browser-server-console",
"arguments": {
"directory": "./public",
"port": 3001,
"path": "/index.html",
"timeout": 10000,
"waitFor": "#app",
"commands": "click #start-btn wait 3s",
"stream": false
}
}
```
## Implementation Status
- [x] Basic MCP server structure
- [x] Tool schema definition
- [x] Browser navigation with Puppeteer
- [x] Console output capture
- [x] Real-time console message streaming
- [x] Browser command execution (click, wait)
- [x] Error handling for browser issues
- [x] Support for custom timeouts and wait conditions
- [x] True streaming output (currently batched)
- [ ] Support for different browser types
## Development
The main server implementation is in `src/index.js`. The current implementation includes:
- MCP server setup with proper tool registration
- Input validation for the browser-console tool
- Error handling and graceful shutdown
- Placeholder implementation for browser functionality
## Dependencies
- `@modelcontextprotocol/sdk`: MCP SDK for server implementation
- `puppeteer`: Browser automation library for console capture
- `express`: Web framework for static file serving
- `@types/node`: TypeScript definitions for Node.js
## License
MIT
TDQS
Scored across 2 tools
The two tools share a common goal of capturing console output but are clearly differentiated by their input: one navigates to an existing URL, the other serves a directory first. The descriptions make this distinction obvious, though the similar 'browser-console' phrasing could cause slight hesitation.
Both tools follow the 'browser-<noun>' pattern with hyphens and end in 'console'. The second tool inserts 'server' to indicate the serving step, which is a minor deviation but still predictable and consistent in style.
With only two tools, the server feels minimal but appropriately scoped for its narrow focus on console capture. This is borderline, as two tools may be thin for a general-purpose browser server, but the purpose is specific enough to warrant a small set.
The tool set covers the two primary ways to obtain browser console output: from an arbitrary URL and from locally served content. Minor gaps exist, such as no way to interact with the page or manage a long-running server, but the core workflows are well covered.