🚀 Electron MCP Server
A powerful Model Context Protocol (MCP) server that offers comprehensive automation, debugging, and observability capabilities for Electron applications. Enhance your Electron development workflow with AI-powered automation through Chrome DevTools Protocol integration.
🚀 Quick Start
Get a glimpse of the Electron MCP Server in action by watching the demo video:

🎬 Watch Full Demo on Vimeo
✨ Features
🎮 Application Control & Automation
- Launch & Manage: Initiate, halt, and oversee Electron applications with full lifecycle control.
- Interactive Automation: Execute JavaScript code directly in running applications via WebSocket.
- UI Testing: Automate button clicks, form interactions, and user workflows.
- Process Management: Track PIDs, monitor resource usage, and handle graceful shutdowns.
📊 Advanced Observability
- Screenshot Capture: Non-intrusive visual snapshots using Playwright and Chrome DevTools Protocol.
- Real-time Logs: Stream application logs (main process, renderer, console) with filtering.
- Window Information: Get detailed window metadata, titles, URLs, and target information.
- System Monitoring: Track memory usage, uptime, and performance metrics.
🛠️ Development Productivity
- Universal Compatibility: Works with any Electron app without requiring code modifications.
- DevTools Integration: Leverage Chrome DevTools Protocol for powerful debugging capabilities.
- Build Automation: Cross-platform building for Windows, macOS, and Linux.
- Environment Management: Clean environment handling and debugging port configuration.
📦 Installation
VS Code Integration (Recommended)

Add the following to your VS Code MCP settings:
{
"mcp": {
"servers": {
"electron": {
"command": "npx",
"args": ["-y", "electron-mcp-server"]
}
}
}
}
Claude Desktop Integration
Add the following to ~/Library/Application Support/Claude/claude_desktop_config.json
:
{
"mcpServers": {
"electron": {
"command": "npx",
"args": ["-y", "electron-mcp-server"]
}
}
}
Global Installation
npm install -g electron-mcp-server
💻 Usage Examples
Smart UI Interaction Workflow
await send_command_to_electron({
command: 'get_page_structure',
});
await send_command_to_electron({
command: 'click_by_text',
args: {
text: 'Login',
},
});
await send_command_to_electron({
command: 'fill_input',
args: {
text: 'username',
value: 'john.doe@example.com',
},
});
await send_command_to_electron({
command: 'fill_input',
args: {
text: 'password',
value: 'secretpassword',
},
});
await send_command_to_electron({
command: 'select_option',
args: {
text: 'country',
value: 'United States',
},
});
await take_screenshot();
Advanced Element Detection
await send_command_to_electron({
command: 'find_elements',
});
Automated UI Testing
await launch_electron_app({
appPath: '/path/to/app',
devMode: true,
});
await take_screenshot();
await send_command_to_electron({
command: 'eval',
args: {
code: "document.querySelector('#submit-btn').click()",
},
});
await send_command_to_electron({
command: 'get_title',
});
Development Debugging
const windowInfo = await get_electron_window_info();
await send_command_to_electron({
command: 'eval',
args: {
code: 'JSON.stringify(window.appState, null, 2)',
},
});
await read_electron_logs({
logType: 'all',
lines: 100,
});
Performance Monitoring
await send_command_to_electron({
command: 'eval',
args: {
code: '({memory: performance.memory, timing: performance.timing})',
},
});
await take_screenshot({
outputPath: '/tests/screenshots/current.png',
});
📚 Documentation
🎯 What Makes This Special
Transform your Electron development experience with AI-powered automation:
- 🔄 Real-time UI Automation: Click buttons, fill forms, and interact with any Electron app programmatically.
- 📸 Visual Debugging: Take screenshots and capture application state without interrupting development.
- 🔍 Deep Inspection: Extract DOM elements, application data, and performance metrics in real-time.
- ⚡ DevTools Protocol Integration: Universal compatibility with any Electron app - no modifications required.
- 🚀 Development Observability: Monitor logs, system info, and application behavior seamlessly.
🔒 Security & Configuration
Configurable security levels to balance safety with functionality:
Security Levels
- 🔒 STRICT: Maximum security for production environments.
- ⚖️ BALANCED: Default security with safe UI interactions (recommended).
- 🔓 PERMISSIVE: More functionality for trusted environments.
- 🛠️ DEVELOPMENT: Minimal restrictions for development/testing.
Secure UI Interaction Commands
Instead of raw JavaScript eval, use these secure commands:
{
"command": "click_by_text",
"args": { "text": "Create New Encyclopedia" }
}
{
"command": "click_by_selector",
"args": { "selector": "button[title='Create']" }
}
{
"command": "send_keyboard_shortcut",
"args": { "text": "Ctrl+N" }
}
{
"command": "navigate_to_hash",
"args": { "text": "create" }
}
See SECURITY_CONFIG.md for detailed security documentation.
🎯 Proper MCP Usage Guide
⚠️ Critical: Argument Structure
The most common mistake when using this MCP server is incorrect argument structure for the send_command_to_electron
tool.
❌ Wrong (causes "selector is empty" errors):
{
"command": "click_by_selector",
"args": "button.submit-btn"
}
✅ Correct:
{
"command": "click_by_selector",
"args": {
"selector": "button.submit-btn"
}
}
📋 Command Argument Reference
Command |
Required Args |
Example |
click_by_selector |
{"selector": "css-selector"} |
{"selector": "button.primary"} |
click_by_text |
{"text": "button text"} |
{"text": "Submit"} |
fill_input |
{"value": "text", "selector": "..."} or {"value": "text", "placeholder": "..."} |
{"placeholder": "Enter name", "value": "John"} |
send_keyboard_shortcut |
{"text": "key combination"} |
{"text": "Ctrl+N"} |
eval |
{"code": "javascript"} |
{"code": "document.title"} |
get_title , get_url , get_body_text |
No args needed |
{} or omit args |
🔄 Recommended Workflow
- Inspect: Start with
get_page_structure
or debug_elements
.
- Target: Use specific selectors or text-based targeting.
- Interact: Use the appropriate command with correct argument structure.
- Verify: Take screenshots or check page state.
{
"command": "get_page_structure"
}
{
"command": "click_by_text",
"args": {
"text": "Create New Encyclopedia"
}
}
{
"command": "fill_input",
"args": {
"placeholder": "Enter encyclopedia name",
"value": "AI and Machine Learning"
}
}
{
"command": "click_by_selector",
"args": {
"selector": "button[type='submit']"
}
}
🐛 Troubleshooting Common Issues
Error |
Cause |
Solution |
"The provided selector is empty" |
Passing string instead of object |
Use {"selector": "..."} |
"Element not found" |
Wrong selector |
Use get_page_structure first |
"Command blocked" |
Security restriction |
Check security level settings |
"Click prevented - too soon" |
Rapid consecutive clicks |
Wait before retrying |
🛠️ Security Features
Enterprise-grade security built for safe AI-powered automation:
- 🔒 Sandboxed Execution: All code runs in isolated environments with strict resource limits.
- 🔍 Input Validation: Advanced static analysis detects and blocks dangerous code patterns.
- 📝 Comprehensive Auditing: Encrypted logs track all operations with full traceability.
- 🖼️ Secure Screenshots: Encrypted screenshot data with clear user notifications.
- ⚠️ Risk Assessment: Automatic threat detection with configurable security thresholds.
- 🚫 Zero Trust: Dangerous functions like
eval
, file system access, and network requests are blocked by default.
Safety First: Every command is analyzed, validated, and executed in a secure sandbox before reaching your application.
🏗️ Architecture
Chrome DevTools Protocol Integration
- Universal Compatibility: Works with any Electron app that has remote debugging enabled.
- Real-time Communication: WebSocket-based command execution with the renderer process.
- No App Modifications: Zero changes required to target applications.
Process Management
- Clean Environment: Handles
ELECTRON_RUN_AS_NODE
and other environment variables.
- Resource Tracking: Monitors PIDs, memory usage, and application lifecycle.
- Graceful Shutdown: Proper cleanup and process termination.
Cross-Platform Support
- macOS: Uses Playwright CDP with screencapture fallback.
- Windows: PowerShell-based window detection and capture.
- Linux: X11 window management (planned).
🧪 Development
Prerequisites
Target Application Setup
For the MCP server to work with your Electron application, you need to enable remote debugging. Add this code to your Electron app's main process:
const { app } = require('electron');
const isDev = process.env.NODE_ENV === 'development' || process.argv.includes('--dev');
if (isDev) {
app.commandLine.appendSwitch('remote-debugging-port', '9222');
}
Alternative approaches:
electron . --remote-debugging-port=9222
npm run dev -- --remote-debugging-port=9222
Note: The MCP server automatically scans ports 9222 - 9225 to detect running Electron applications with remote debugging enabled.
Setup
git clone https://github.com/halilural/electron-mcp-server.git
cd electron-mcp-server
npm install
npm run build
npm test
npm run dev
Project Structure
src/
├── handlers.ts # MCP tool handlers
├── index.ts # Server entry point
├── tools.ts # Tool definitions
├── screenshot.ts # Screenshot functionality
├── utils/
│ ├── process.ts # Process management & DevTools Protocol
│ ├── logs.ts # Log management
│ └── project.ts # Project scaffolding
└── schemas/ # JSON schemas for validation
🔐 Security & Best Practices
- Sandboxed Execution: All JavaScript execution is contained within the target Electron app.
- Path Validation: Only operates on explicitly provided application paths.
- Process Isolation: Each launched app runs in its own process space.
- No Persistent Access: No permanent modifications to target applications.
🔧 Available Tools
launch_electron_app
Launch an Electron application with debugging capabilities.
{
"appPath": "/path/to/electron-app",
"devMode": true,
"args": ["--enable-logging", "--dev"]
}
Returns: Process ID and launch confirmation
get_electron_window_info
Get comprehensive window and target information via Chrome DevTools Protocol.
{
"includeChildren": true
}
Returns:
- Window IDs, titles, URLs, and types
- DevTools Protocol target information
- Platform details and process information
take_screenshot
Capture high-quality screenshots using Playwright and Chrome DevTools Protocol.
{
"outputPath": "/path/to/screenshot.png",
"windowTitle": "My App"
}
Features:
- Non-intrusive capture (doesn't bring window to front)
- Works with any Electron app
- Fallback to platform-specific tools if needed
send_command_to_electron
Execute JavaScript commands in the running Electron application via WebSocket.
{
"command": "eval",
"args": {
"code": "document.querySelector('button').click(); 'Button clicked!'"
}
}
Enhanced UI Interaction Commands:
find_elements
: Analyze all interactive UI elements with their properties and positions.
click_by_text
: Click elements by their visible text, aria-label, or title (more reliable than selectors).
fill_input
: Fill input fields by selector, placeholder text, or associated label text.
select_option
: Select dropdown options by value or visible text.
get_page_structure
: Get organized overview of all page elements (buttons, inputs, selects, links).
get_title
: Get document title.
get_url
: Get current URL.
get_body_text
: Extract visible text content.
click_button
: Click buttons by CSS selector (basic method).
console_log
: Send console messages.
eval
: Execute custom JavaScript code.
Recommended workflow: Use get_page_structure
first to understand available elements, then use specific interaction commands like click_by_text
or fill_input
.
read_electron_logs
Stream application logs from main process, renderer, and console.
{
"logType": "all",
"lines": 50,
"follow": false
}
close_electron_app
Gracefully close the Electron application.
{
"force": false
}
build_electron_app
Build Electron applications for distribution.
{
"projectPath": "/path/to/project",
"platform": "darwin",
"arch": "x64",
"debug": false
}
🤝 Contributing
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/awesome-feature
)
- Commit your changes (
git commit -m 'Add awesome feature'
)
- Push to the branch (
git push origin feature/awesome-feature
)
- Open a Pull Request
📄 License
MIT License - see LICENSE file for details.
☕ Support
If this project helped you, consider buying me a coffee! ☕

Your support helps me maintain and improve this project. Thank you! 🙏
🙏 Acknowledgments
🔗 Links
Ready to supercharge your Electron development with AI-powered automation? Install the MCP server and start building smarter workflows today! 🚀