# MCP Chrome Remote Server A remote server implementation for the MCP Chrome Bridge that allows external applications to control Chrome through **direct WebSocket connections**. ## 🚀 New Direct Connection Architecture This server now supports **direct connections** from Chrome extensions, eliminating the need for native messaging hosts as intermediaries: - **Cherry Studio** → **Remote Server** (via Streamable HTTP) - **Chrome Extension** → **Remote Server** (via WebSocket) - **No Native Server Required** for Chrome extension communication ### Benefits - ✅ Eliminates 10-second timeout errors - ✅ Faster response times - ✅ Simplified architecture - ✅ Better reliability - ✅ Easier debugging ## Features - **Remote Control**: Control Chrome browser remotely via WebSocket API - **MCP Protocol**: Implements Model Context Protocol for tool-based interactions - **HTTP Streaming**: Full support for MCP Streamable HTTP and SSE (Server-Sent Events) - **Real-time Communication**: WebSocket-based real-time communication with Chrome extensions - **RESTful Health Checks**: HTTP endpoints for monitoring server health - **Extensible Architecture**: Easy to add new Chrome automation tools - **Session Management**: Robust session handling for streaming connections ## Quick Start ### 1. Install Dependencies (from project root) ```bash # Install all workspace dependencies pnpm install ``` ### 2. Build the Server ```bash # From project root npm run build:remote # Or from this directory npm run build ``` ### 3. Start the Server ```bash # From project root (recommended) npm run start:server # Or from this directory npm run start:server ``` The server will start on `http://localhost:3001` by default. ### 4. Verify Server is Running You should see output like: ``` 🚀 MCP Remote Server started successfully! 📡 Server running at: http://0.0.0.0:3001 🔌 WebSocket endpoint: ws://0.0.0.0:3001/ws/mcp 🔌 Chrome extension endpoint: ws://0.0.0.0:3001/chrome 🌊 Streaming HTTP endpoint: http://0.0.0.0:3001/mcp 📡 SSE endpoint: http://0.0.0.0:3001/sse ``` ### 5. Test the Connection ```bash # Test WebSocket connection node test-client.js # Test streaming HTTP connection node test-tools-list.js # Test SSE connection node test-sse-client.js # Test simple health check node test-health.js ``` ## Available Scripts - `npm run start:server` - Build and start the production server - `npm run start` - Start the server (requires pre-built dist/) - `npm run dev` - Start development server with auto-reload - `npm run build` - Build TypeScript to JavaScript - `npm run test` - Run tests - `npm run lint` - Run ESLint - `npm run format` - Format code with Prettier ## Environment Variables - `PORT` - Server port (default: 3001) - `HOST` - Server host (default: 0.0.0.0) ## API Endpoints ### HTTP Endpoints - `GET /health` - Health check endpoint ### Streaming HTTP Endpoints (MCP Protocol) - `POST /mcp` - Send MCP messages (initialization, tool calls, etc.) - `GET /mcp` - Establish SSE stream for receiving responses (requires MCP-Session-ID header) - `DELETE /mcp` - Terminate MCP session (requires MCP-Session-ID header) ### SSE Endpoints - `GET /sse` - Server-Sent Events endpoint for MCP communication - `POST /messages` - Send messages to SSE session (requires X-Session-ID header) ### WebSocket Endpoints - `WS /ws/mcp` - MCP protocol WebSocket endpoint for Chrome control - `WS /chrome` - Chrome extension WebSocket endpoint ## Available Tools The server provides the following Chrome automation tools: 1. **navigate_to_url** - Navigate to a specific URL 2. **get_page_content** - Get page text content 3. **click_element** - Click on elements using CSS selectors 4. **fill_input** - Fill input fields with text 5. **take_screenshot** - Capture page screenshots ## Usage Examples ### Streamable HTTP Connection (Recommended) ```javascript import fetch from 'node-fetch'; const SERVER_URL = 'http://localhost:3001'; const MCP_URL = `${SERVER_URL}/mcp`; // Step 1: Initialize session const initResponse = await fetch(MCP_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json, text/event-stream', }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'initialize', params: { protocolVersion: '2024-11-05', capabilities: { tools: {} }, clientInfo: { name: 'my-client', version: '1.0.0' }, }, }), }); const sessionId = initResponse.headers.get('mcp-session-id'); // Step 2: Call tools const toolResponse = await fetch(MCP_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json, text/event-stream', 'MCP-Session-ID': sessionId, }, body: JSON.stringify({ jsonrpc: '2.0', id: 2, method: 'tools/call', params: { name: 'navigate_to_url', arguments: { url: 'https://example.com' }, }, }), }); const result = await toolResponse.text(); // SSE format ``` ### WebSocket Connection ```javascript const ws = new WebSocket('ws://localhost:3001/ws/mcp'); // Navigate to a URL ws.send( JSON.stringify({ method: 'tools/call', params: { name: 'navigate_to_url', arguments: { url: 'https://example.com' }, }, }), ); // Get page content ws.send( JSON.stringify({ method: 'tools/call', params: { name: 'get_page_content', arguments: {}, }, }), ); ``` ## Streaming Capabilities The MCP Remote Server now supports multiple connection types: ### 1. **Streamable HTTP (Recommended)** - Full MCP protocol compliance - Session-based communication - Server-Sent Events for real-time responses - Stateful connections with session management - Compatible with MCP clients like CherryStudio ### 2. **Server-Sent Events (SSE)** - Real-time streaming communication - Lightweight alternative to WebSockets - HTTP-based with automatic reconnection ### 3. **WebSocket (Legacy)** - Real-time bidirectional communication - Backward compatibility with existing clients ## Architecture ``` ┌─────────────────┐ HTTP/SSE ┌──────────────────┐ WebSocket ┌─────────────────┐ │ MCP Client │ ◄──────────────► │ Remote Server │ ◄─────────────────► │ Chrome Extension │ │ (External App) │ WebSocket │ (This Server) │ │ │ └─────────────────┘ └──────────────────┘ └─────────────────┘ ``` ## Development ### Project Structure ``` src/ ├── index.ts # Main server entry point ├── server/ │ ├── mcp-remote-server.ts # MCP protocol implementation │ └── chrome-tools.ts # Chrome automation tools └── types/ # TypeScript type definitions ``` ### Adding New Tools 1. Add the tool definition in `mcp-remote-server.ts` 2. Implement the tool logic in `chrome-tools.ts` 3. Update the Chrome extension to handle new actions ## Troubleshooting ### Common Issues 1. **Server won't start**: Check if port 3000 is available 2. **Chrome extension not connecting**: Ensure the extension is installed and enabled 3. **WebSocket connection fails**: Check firewall settings and CORS configuration ### Logs The server uses structured logging with Pino. Check console output for detailed error messages and debugging information. ## License MIT License - see LICENSE file for details.