A powerful Model Context Protocol (MCP) server for debugging and automating native Electron applications on macOS. This server provides comprehensive tools for DOM inspection, UI automation, and global hotkey triggering.
- Connect to Electron apps via Chrome DevTools Protocol (CDP)
- List all debuggable targets (windows, webviews)
- Query and inspect DOM elements
- Execute JavaScript in Electron windows
- Take screenshots of Electron content
- Control mouse (move, click, double-click, drag)
- Keyboard input (type text, press keys)
- Take screenshots of native UI
- Get screen dimensions and mouse position
- Full macOS accessibility API integration
- Trigger custom keyboard shortcuts
- Activate common macOS hotkeys (Spotlight, Mission Control, etc.)
- Simulate application-specific shortcuts
- Send complex key sequences
- Check permission status
- Request system permissions
- Get setup instructions
- Verify all required permissions
- macOS 12.0 or later
- Node.js 18.0 or later
- Electron app running with
--inspectflag (for DOM inspection)
This server requires the following system permissions:
- Accessibility - For UI automation and keyboard/mouse control
- Screen Recording - For taking screenshots
- Input Monitoring - For keyboard and mouse input
# Run the setup script
./scripts/setup.shThis will:
- Check system requirements
- Install dependencies
- Build the project
- Provide configuration instructions
- Optionally install the example app
# Install dependencies
npm install
# Build the project
npm run build# Development mode (with auto-reload)
npm run dev
# Production mode
npm startAdd to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"electron-native": {
"command": "node",
"args": ["/path/to/electron-native-mcp/dist/index.js"]
}
}
}The server uses stdio transport and can be integrated with any MCP-compatible client.
List all available Electron windows and webviews.
// Example usage
{
"host": "localhost", // optional
"port": 9222 // optional
}Connect to a specific Electron target for debugging.
{
"targetId": "target-id-from-list"
}Get the complete DOM tree of a connected target.
{
"targetId": "target-id"
}Find a DOM element using CSS selector.
{
"targetId": "target-id",
"selector": "#myButton"
}Execute JavaScript in an Electron window.
{
"targetId": "target-id",
"code": "document.title"
}Click at coordinates or current position.
{
"x": 100, // optional
"y": 200, // optional
"button": "left" // left, right, or middle
}Type text at the current cursor position.
{
"text": "Hello, World!"
}Press a key with optional modifiers.
{
"key": "enter",
"modifiers": ["command", "shift"] // optional
}Capture a screenshot of the screen or region.
{
"x": 0, // optional
"y": 0, // optional
"width": 800, // optional
"height": 600 // optional
}Trigger a custom keyboard shortcut.
{
"key": "space",
"modifiers": ["command"]
}Trigger a common macOS system hotkey.
{
"hotkey": "spotlight" // spotlight, mission_control, app_switcher, etc.
}Check the status of all required permissions.
{} // No parametersTo debug an Electron app with this server:
-
Launch your Electron app with the inspect flag:
/path/to/your/app.app/Contents/MacOS/YourApp --inspect=9222
-
List available targets: Use the
list_electron_targetstool to see all debuggable windows. -
Connect to a target: Use
connect_to_electron_targetwith the target ID. -
Inspect and interact: Use DOM tools to query elements, execute JavaScript, etc.
// 1. List targets
list_electron_targets()
// 2. Connect to target
connect_to_electron_target({ targetId: "..." })
// 3. Find button
query_selector({ targetId: "...", selector: "#submitButton" })
// 4. Click it via JavaScript
execute_javascript({
targetId: "...",
code: "document.querySelector('#submitButton').click()"
})// 1. Check permissions
check_all_permissions()
// 2. Move mouse and click
click({ x: 500, y: 300 })
// 3. Type text
type_text({ text: "Hello!" })
// 4. Press Enter
press_key({ key: "enter" })trigger_common_macos_hotkey({ hotkey: "spotlight" })# Install dependencies
npm install
# Run in development mode
npm run dev
# Build
npm run build
# Lint
npm run lint
# Format code
npm run formatelectron-native-mcp/
├── src/
│ ├── index.ts # Entry point
│ ├── server.ts # MCP server setup
│ ├── types/ # TypeScript types
│ ├── lib/ # Core libraries
│ │ ├── cdp-client.ts # Chrome DevTools Protocol client
│ │ ├── accessibility.ts # macOS accessibility wrapper
│ │ └── permissions.ts # Permission manager
│ └── tools/ # MCP tools
│ ├── dom/ # DOM inspection tools
│ ├── ui/ # UI automation tools
│ ├── hotkey/ # Hotkey tools
│ └── permissions/ # Permission tools
├── package.json
├── tsconfig.json
└── README.md
If you get permission errors, use the permission tools to check status:
check_all_permissions()
get_permission_instructions({ permission: "accessibility" })Then grant the required permissions in System Settings.
Make sure your Electron app is running with the --inspect flag:
your-app --inspect=9222Ensure Screen Recording permission is granted for your terminal app (Terminal, iTerm2, VS Code, etc.).
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
Built with:
- @modelcontextprotocol/sdk - MCP TypeScript SDK
- chrome-remote-interface - Chrome DevTools Protocol client
- @nut-tree/nut-js - Desktop automation
- node-mac-permissions - macOS permissions