# Selenium MCP Server
smithery badge
An MCP server that uses Selenium to interact with a WebDriver instance. Built using the [MCP-Server-Starter](https://github.com/TheSethRose/MCP-Server-Starter) template.
## Overview
This server allows AI agents to control a web browser session via Selenium WebDriver, enabling tasks like web scraping, automated testing, and form filling through the Model Context Protocol.
## Core Components
* **MCP Server**: Exposes Selenium WebDriver actions as MCP tools.
* **Selenium WebDriver**: Interacts with the browser.
* **MCP Clients**: AI hosts (like Cursor, Claude Desktop) that can utilize the exposed tools.
## Prerequisites
* **Node.js (v18 or later)**
* **npm (v7 or later)**
* **A WebDriver executable** (e.g., ChromeDriver, GeckoDriver) installed and available in your system's PATH.
* **A compatible web browser** (e.g., Chrome, Firefox).
## Getting Started
1. **Clone the repository:**
```bash
git clone <your-repo-url> selenium-mcp-server
cd selenium-mcp-server
```
2. **Install dependencies:**
```bash
npm install
```
3. **Configure WebDriver:**
* Ensure your WebDriver (e.g., `chromedriver`) is installed and in your PATH.
* Modify `src/seleniumService.ts` (you'll create this file) if needed to specify browser options or WebDriver paths.
4. **Build the server:**
```bash
npm run build
```
5. **Run the server:**
```bash
npm start
```
Alternatively, integrate it with an MCP host like Cursor or Claude Desktop (see Integration sections below).
## Tools
This server will provide tools such as:
* `selenium_navigate`: Navigates the browser to a specific URL.
* `selenium_findElement`: Finds an element on the page using a CSS selector.
* `selenium_click`: Clicks an element.
* `selenium_sendKeys`: Sends keystrokes to an element.
* `selenium_getPageSource`: Retrieves the current page source HTML.
* (Add more tools as needed)
## TypeScript Implementation
The server uses the `@modelcontextprotocol/sdk` and `selenium-webdriver` libraries.
```typescript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { Builder, By, Key, until, WebDriver } from 'selenium-webdriver';
// Basic server setup (details in src/index.ts)
const server = new Server({
name: "selenium-mcp-server",
version: "0.1.0",
capabilities: {
tools: {}, // Enable tools capability
}
});
// Selenium WebDriver setup (details in src/seleniumService.ts)
let driver: WebDriver;
async function initializeWebDriver() {
driver = await new Builder().forBrowser('chrome').build(); // Or 'firefox', etc.
}
// Example tool implementation (details in src/tools/)
server.registerTool('selenium_navigate', {
description: 'Navigates the browser to a specific URL.',
inputSchema: { /* ... zod schema ... */ },
outputSchema: { /* ... zod schema ... */ },
handler: async (params) => {
await driver.get(params.url);
return { success: true };
}
});
// Connect transport
async function startServer() {
await initializeWebDriver();
const transport = new StdioServerTransport();
await server.connect(transport);
console.log("Selenium MCP Server connected via stdio.");
// Graceful shutdown
process.on('SIGINT', async () => {
console.log("Shutting down WebDriver...");
if (driver) {
await driver.quit();
}
process.exit(0);
});
}
startServer();
```
## Development
* **Build:** `npm run build`
* **Run:** `npm start` (executes `node build/index.js`)
* **Lint:** `npm run lint`
* **Format:** `npm run format`
### Debugging
Use the MCP Inspector or standard Node.js debugging techniques.
## Integration with MCP Hosts
(Keep relevant sections from the original README for Cursor, Claude Desktop, Smithery, etc., updating paths and commands as necessary)
### Cursor Integration
1. **Build your server**: `npm run build`
2. **In Cursor:** `Settings` > `Features` > `MCP`: Add a new MCP server.
3. **Register your server**:
* Select `stdio` as the transport type.
* Name: `Selenium Server` (or similar).
* Command: `node /path/to/selenium-mcp-server/build/index.js`.
4. **Save**.
### Claude Desktop Integration
1. **Build your server**: `npm run build`
2. **Modify** `claude_desktop_config.json`:
```json
{
"mcpServers": {
"selenium-mcp-server": {
"command": "node",
"args": [
"/path/to/selenium-mcp-server/build/index.js"
]
}
}
}
```
3. **Restart Claude Desktop**.
## Best Practices
* Use TypeScript and Zod for type safety and validation.
* Keep tools modular (e.g., one file per tool in `src/tools/`).
* Handle WebDriver errors gracefully (e.g., element not found, navigation issues).
* Ensure proper WebDriver shutdown (e.g., `driver.quit()` on server exit).
* Follow MCP best practices for schemas, error handling, and content types.
## Learn More
* [Model Context Protocol Documentation](https://modelcontextprotocol.io/)
* [Selenium WebDriver JS Documentation](https://www.selenium.dev/documentation/javascript/)
* [MCP TypeScript SDK Documentation](https://modelcontextprotocol.io/sdk/typescript)
## Credits
**Based on the template created by Seth Rose**:
* **Website**: <https://www.sethrose.dev>
* **𝕏 (Twitter)**: <https://x.com/TheSethRose>
* **🦋 (Bluesky)**: <https://bsky.app/profile/sethrose.dev>