sailaoda/concurrent-browser-mcp
If you are the rightful owner of concurrent-browser-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
A concurrent browser MCP server built on Playwright, supporting multiple browser instances and automation tasks.
browser_create_instance
Creates a new browser instance.
browser_navigate
Navigates to a specified URL.
browser_click
Clicks on a page element.
browser_screenshot
Takes a screenshot of the page.
concurrent-browser-mcp
A multi-concurrent browser MCP (Model Context Protocol) server built with Playwright.
| English
Features
- ๐ Multi-Instance Concurrency: Support running multiple browser instances simultaneously
- ๐ฏ Instance Management: Dynamically create, manage, and clean up browser instances
- ๐ง Flexible Configuration: Support various browser types and custom configurations
- ๐ก๏ธ Resource Management: Automatically clean up timed-out instances to prevent resource leaks
- ๐ Full Feature Support: Complete browser automation capabilities (navigation, clicking, input, screenshots, etc.)
- ๐ป Cross-Platform: Support Chromium, Firefox, WebKit
Installation
Option 1: Install from npm (Recommended)
# Global installation
npm install -g concurrent-browser-mcp
# Or use npx directly (no installation required)
npx concurrent-browser-mcp
Option 2: Build from Source
# Clone repository
git clone https://github.com/sailaoda/concurrent-browser-mcp.git
cd concurrent-browser-mcp
# Install dependencies
npm install
# Build project
npm run build
# Optional: Global link (for local development)
npm link
Option 3: Quick Install Script
git clone https://github.com/sailaoda/concurrent-browser-mcp.git
cd concurrent-browser-mcp
./install.sh
Quick Start
1. Basic Usage
# Start server (default configuration)
npx concurrent-browser-mcp
# Custom configuration
npx concurrent-browser-mcp --max-instances 25 --browser firefox --headless false
2. MCP Client Configuration
Choose the appropriate configuration based on your installation method:
Using npm global installation or npx
{
"mcpServers": {
"concurrent-browser": {
"command": "npx",
"args": ["concurrent-browser-mcp", "--max-instances", "20"]
}
}
}
Using global installation version
{
"mcpServers": {
"concurrent-browser": {
"command": "concurrent-browser-mcp",
"args": ["--max-instances", "20"]
}
}
}
Using local build version
If you built from source, you can reference the local build version directly:
{
"mcpServers": {
"concurrent-browser": {
"command": "node",
"args": ["/path/to/concurrent-browser-mcp/dist/index.js", "--max-instances", "20"],
"cwd": "/path/to/concurrent-browser-mcp"
}
}
}
Or use relative path (if config file and project are in the same directory level):
{
"mcpServers": {
"concurrent-browser": {
"command": "node",
"args": ["./concurrent-browser-mcp/dist/index.js", "--max-instances", "20"]
}
}
}
Using npm link version (development mode)
If you used npm link
:
{
"mcpServers": {
"concurrent-browser": {
"command": "concurrent-browser-mcp",
"args": ["--max-instances", "20"]
}
}
}
Command Line Options
Option | Description | Default |
---|---|---|
-m, --max-instances <number> | Maximum number of instances | 20 |
-t, --instance-timeout <number> | Instance timeout in minutes | 30 |
-c, --cleanup-interval <number> | Cleanup interval in minutes | 5 |
--browser <browser> | Default browser type (chromium/firefox/webkit) | chromium |
--headless | Default headless mode | true |
--width <number> | Default viewport width | 1280 |
--height <number> | Default viewport height | 720 |
--user-agent <string> | Default user agent | - |
--ignore-https-errors | Ignore HTTPS errors | false |
--bypass-csp | Bypass CSP | false |
Available Tools
Instance Management
browser_create_instance
: Create a new browser instancebrowser_list_instances
: List all instancesbrowser_close_instance
: Close a specific instancebrowser_close_all_instances
: Close all instances
Page Navigation
browser_navigate
: Navigate to a specified URLbrowser_go_back
: Go back to previous pagebrowser_go_forward
: Go forward to next pagebrowser_refresh
: Refresh current page
Page Interaction
browser_click
: Click on page elementsbrowser_type
: Type text contentbrowser_fill
: Fill form fieldsbrowser_select_option
: Select dropdown options
Page Information
browser_get_page_info
: Get detailed page information including full HTML content, page statistics, and metadatabrowser_get_element_text
: Get element textbrowser_get_element_attribute
: Get element attributesbrowser_screenshot
: Take page screenshotsbrowser_get_markdown
: ๐ Get Markdown content
Wait Operations
browser_wait_for_element
: Wait for element to appearbrowser_wait_for_navigation
: Wait for page navigation to complete
JavaScript Execution
browser_evaluate
: Execute JavaScript code
Usage Examples
1. Create Browser Instance
// Create a new Chrome instance
await callTool('browser_create_instance', {
browserType: 'chromium',
headless: false,
viewport: { width: 1920, height: 1080 },
metadata: {
name: 'main-browser',
description: 'Main browser instance'
}
});
2. Navigation and Interaction
// Navigate to website
await callTool('browser_navigate', {
instanceId: 'your-instance-id',
url: 'https://example.com'
});
// Click element
await callTool('browser_click', {
instanceId: 'your-instance-id',
selector: 'button.submit'
});
// Input text
await callTool('browser_type', {
instanceId: 'your-instance-id',
selector: 'input[name="search"]',
text: 'search query'
});
3. Get Page Information
// Take screenshot
await callTool('browser_screenshot', {
instanceId: 'your-instance-id',
fullPage: true
});
// Get page information
await callTool('browser_get_page_info', {
instanceId: 'your-instance-id'
});
4. Concurrent Operations
// Create multiple instances for parallel processing
const instances = await Promise.all([
callTool('browser_create_instance', { metadata: { name: 'worker-1' } }),
callTool('browser_create_instance', { metadata: { name: 'worker-2' } }),
callTool('browser_create_instance', { metadata: { name: 'worker-3' } })
]);
// Navigate to different pages in parallel
await Promise.all(instances.map(async (instance, index) => {
await callTool('browser_navigate', {
instanceId: instance.data.instanceId,
url: `https://example${index + 1}.com`
});
}));
Architecture Design
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ MCP Client โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Concurrent Browser MCP Server โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ Browser Tools โ โ Browser Manager โ โ MCP Server โ โ
โ โ โ โ โ โ โ โ
โ โ - Tool Defs โ โ - Instance Mgmt โ โ - Request โ โ
โ โ - Execution โ โ - Lifecycle โ โ Handling โ โ
โ โ - Validation โ โ - Cleanup โ โ - Error Mgmt โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Playwright โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ Browser 1 โ โ Browser 2 โ โ Browser N โ โ
โ โ (Chromium) โ โ (Firefox) โ โ (WebKit) โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Real Functionality Testing
In addition to simulation demo scripts, we also provide real browser functionality test scripts that let you see actual screenshot results:
๐งช Run Real Tests
# Run real browser screenshot test
node test-real-screenshot.js
This test script will:
- Start real browser: Using Chromium engine
- Visit websites: Navigate to example.com and github.com
- Save screenshots: Generate real PNG screenshot files
- File output: Generate screenshot files in current directory
๐ธ Test Output Example
๐ Starting real browser screenshot test...
โ
Browser started
โ
Page created
๐ Navigating to https://example.com...
โ
Page loaded successfully
๐ธ Taking screenshot and saving as screenshot-2025-07-19T11-04-18-660Z.png...
โ
Screenshot saved: screenshot-2025-07-19T11-04-18-660Z.png
๐ File size: 23.57 KB
๐ File location: /path/to/screenshot-2025-07-19T11-04-18-660Z.png
๐ Visiting https://github.com...
โ
github screenshot saved: screenshot-github-2025-07-19T11-04-18-660Z.png (265.99 KB)
๐ Browser closed
๐ผ๏ธ View Screenshot Files
After testing, you can find actual screenshot files in the project directory:
# View generated screenshot files
ls -la screenshot-*.png
# Open in system default image viewer
open screenshot-*.png # macOS
start screenshot-*.png # Windows
xdg-open screenshot-*.png # Linux
Differences from Traditional MCP Browser Servers
Feature | Traditional MCP Browser Server | Concurrent Browser MCP |
---|---|---|
Instance Management | Single instance | Multi-instance concurrency |
Resource Isolation | None | Complete isolation |
Concurrent Processing | Serial | Parallel |
Instance Lifecycle | Manual management | Automatic management |
Resource Cleanup | Manual | Automatic |
Scalability | Limited | Highly scalable |
Development Guide
Local Development Environment Setup
# 1. Clone project
git clone https://github.com/sailaoda/concurrent-browser-mcp.git
cd concurrent-browser-mcp
# 2. Install dependencies
npm install
# 3. Build project
npm run build
# 4. Local link (optional, for global command testing)
npm link
Available npm Scripts
# Build TypeScript project
npm run build
# Development mode (file watching)
npm run dev
# Run code linting
npm run lint
# Fix code formatting issues
npm run lint:fix
# Clean build artifacts
npm run clean
# Run tests
npm test
Project Structure
concurrent-browser-mcp/
โโโ src/ # Source code directory
โ โโโ index.ts # CLI entry point
โ โโโ server.ts # MCP server main logic
โ โโโ browser-manager.ts # Browser instance manager
โ โโโ tools.ts # MCP tool definitions and implementation
โโโ dist/ # Build artifacts directory
โโโ assets/ # Static resources directory
โโโ examples/ # Example scripts
โโโ test-real-screenshot.js # Real test script
โโโ config.example.json # Configuration example
โโโ package.json # Project configuration
โโโ tsconfig.json # TypeScript configuration
โโโ README.md # Project documentation
Using Local Build Version
After building, you can use the local version in several ways:
Option 1: Run build files directly
# Run built files
node dist/index.js --max-instances 20
# Use absolute path in MCP configuration
{
"mcpServers": {
"concurrent-browser": {
"command": "node",
"args": ["/absolute/path/to/concurrent-browser-mcp/dist/index.js", "--max-instances", "20"]
}
}
}
Option 2: Use npm link (recommended for development)
# Execute link in project root directory
npm link
# Now you can use it like a global package
concurrent-browser-mcp --max-instances 20
# Use in MCP configuration
{
"mcpServers": {
"concurrent-browser": {
"command": "concurrent-browser-mcp",
"args": ["--max-instances", "20"]
}
}
}
Option 3: Use in project directory
# Run directly in project directory
cd /path/to/concurrent-browser-mcp
npm run build
node dist/index.js
# MCP configuration using relative path
{
"mcpServers": {
"concurrent-browser": {
"command": "node",
"args": ["./concurrent-browser-mcp/dist/index.js"],
"cwd": "/parent/directory/path"
}
}
}
Testing and Debugging
# Run real browser tests
node test-real-screenshot.js
# Run simulated MCP call tests
node examples/demo.js
# Start development server (with debug output)
node dist/index.js --max-instances 5 --browser chromium --headless false
Contributing Guidelines
- Fork this project
- Create feature branch (
git checkout -b feature/amazing-feature
) - Commit changes (
git commit -m 'Add some amazing feature'
) - Push to branch (
git push origin feature/amazing-feature
) - Open Pull Request