Electron Debug MCP Server
Provides debugging capabilities for Electron applications, including process management, Chrome DevTools Protocol integration for inspecting targets, executing JavaScript, and controlling application execution.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Electron Debug MCP Serverlist running Electron processes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐ Overview
Electron Debug MCP is a local MCP server that gives AI coding agents eyes, hands, and Chrome DevTools inside your Electron app.
Instead of guessing from source alone, the agent can:
๐ฏ Goal | ๐ ๏ธ How |
Boot your app under a debugger |
|
Hook an app you already launched |
|
See the UI |
|
Read renderer failures |
|
Stream console live |
|
Inspect markup |
|
Run JS in the page |
|
Run JS in main |
|
Cookies & web storage |
|
Watch network |
|
Drive the UI |
|
Perf deep-dive |
|
One-shot health check |
|
Full DevTools power |
|
It speaks MCP over stdio (Cursor / Claude Desktop friendly), bridges to Chrome DevTools Protocol, buffers console + network on monitored page targets, and keeps stdout clean (all server logs go to stderr).
๐ค Who itโs for
๐งโ๐ป Cursor / Claude users pair-programming on Electron desktop apps
๐ Maintainers tired of โwhite screen / silent exceptionโ bugs agents canโt see
๐งฐ Tooling authors who need a stdio MCP โ CDP bridge for Electron/Chromium
๐ฌ Example things you can ask the agent
โStart
D:/apps/my-appon port 9222 and tell me if the renderer threw on boot.โ
โFind my running Electron app, attach by PID, screenshot#sidebar, and dump localStorage.โ
โType into
โStart a CDP trace, click through settings, stop tracing, and save the JSON.โ
โDiagnose why this Electron window is blank.โ
๐ At a glance
Aspect | Details |
๐ Transport | MCP stdio JSON-RPC |
๐งฌ Debug bridge | Chrome DevTools Protocol (Runtime ยท Page ยท Network ยท Debugger ยท Input ยท Log ยท Tracing) |
๐ App control | Spawn Electron or attach by port / PID / process scan |
๐ฆ Surface area | 36 tools ยท 6 resources ยท 3 prompts ยท logging + resource list-changed |
๐ฅ๏ธ Platforms | Windows ยท macOS ยท Linux (CI: Xvfb + no-sandbox) |
๐ฆ Requires | Node โฅ 18, npm, one-time Electron binary download |
๐ก๏ธ Safety | Optional |
โ Verify |
|
โ Status
๐ข Ready for local agent-driven Electron debugging
๐ข E2E smoke: start โ UI/automation โ storage/cookies โ tracing โ find/attach-by-pid โ stop
๐ข Windows binary repair:
scripts/fix-electron.cmdwhen npm blocks postinstall๐ข v1.5.0 โ element screenshots, cookies/storage, tracing, attach-by-pid
Related MCP server: Electron Native MCP Server
๐ Table of contents
โจ Why this exists
Electron bugs are often invisible to coding agents:
๐ฃ Pain | ๐ What agents usually see | ๐๏ธ What this server adds |
Blank / white window | Source files only | Live screenshot + DOM (+ element clip) |
Silent renderer crash | Nothing | Console + exception buffer (+ live stream) |
Failed API calls | Guesswork | Network event log |
Wrong route / URL | Unknown | page_info / |
UI not responding | Can't interact | click / type_text / press_key / wait_for |
Auth / state bugs | Blind | cookies + localStorage/sessionStorage |
Perf jank | Guesswork | CDP tracing export |
App already running | Manual port hunt | find_apps / attach_by_pid |
Need DevTools power | Manual only | Full cdp_command escape hatch |
๐ Feature tour
๐ Lifecycle
โถ๏ธ
start_appโ launch with remote debugging (+ optionalinspectMain)๐
attachโ connect to an existing debug port๐
attach_by_pidโ resolve port from process argv๐งญ
find_appsโ list Electron PIDs + debug ports๐
discover_appsโ scan local CDP portsโน๏ธ
stop_appโ kill owned / detach attached๐
list_appsโ sessions, ports, buffer counts๐ฉบ
diagnoseโ port health + recent errors
๐ Inspection
๐ธ
screenshot/ ๐พsave_screenshotโ full page or selector clip๐ณ
get_dom/query_selector๐งฎ
evaluate/evaluate_main๐ช
get_cookies/set_cookie๐๏ธ
get_storage/set_storage๐งพ
get_console_messagesโ log/warn/error/exceptions๐
get_network_logโ request/response/fail๐
get_logsโ Electron stdout/stderr๐ฏ
list_targets/page_info
๐ฑ๏ธ Interaction
๐งญ
navigate+ load waitโณ
wait_forโ selector / hidden / enabled / count / text / URL / console๐ฑ๏ธ
clickleft/right/middleโจ๏ธ
type_text(+ clear / Enter) ยทpress_key(+ modifiers)๐
reloadยท โธ๏ธpauseยท โถ๏ธresume๐งน
clear_buffers
๐ง Agent UX & power
๐ MCP handshake instructions
๐ฌ Prompts: blank window ยท exceptions ยท UI smoke
๐ท๏ธ Target roles: page / worker / browser / main
๐
set_console_live+ resource list-changed๐
start_tracing/stop_tracing๐ก๏ธ stderr-only diagnostics (stdio-safe)
๐งฐ
cdp_commandfor any DevTools method
โก 60-second quick start
git clone https://github.com/amafjarkasi/electron-mcp-server.git
cd electron-mcp-server
npm install
npm run ensure-electron
npm run build
npm test๐ช Windows binary missing?
If npm warns about allowScripts / Electron postinstall:
.\scripts\fix-electron.cmdThat reinstalls Electron, extracts electron.exe with system tar, then runs tests.
๐ฅ๏ธ Cursor & Claude Desktop setup
Cursor
npm run buildOpen Cursor โ MCP settings
Add (use your absolute path):
Windows
{
"mcpServers": {
"electron-debug": {
"command": "node",
"args": ["D:/GH/electron-mcp-server/build/index.js"]
}
}
}macOS / Linux
{
"mcpServers": {
"electron-debug": {
"command": "node",
"args": ["/Users/you/code/electron-mcp-server/build/index.js"],
"env": {
"ELECTRON_MCP_NO_SANDBOX": "1"
}
}
}
}Restart Cursor
Confirm tools:
start_app,attach,find_apps,screenshot,get_console_messages,click,start_tracing, โฆ
๐ Template: examples/cursor-mcp.json
Claude Desktop
Same mcpServers block in claude_desktop_config.json, pointing at build/index.js.
โ ๏ธ Donโt run
node build/index.jsin a normal terminal for daily use โ it waits on stdio for an MCP client. Let Cursor/Claude spawn it.
๐งฉ How it works
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Cursor / Claude / MCP โ
โ client (agent) โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ stdio JSON-RPC
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Electron Debug MCP โ
โ ๐ ๏ธ tools (36) โ
โ ๐ก resources โ
โ ๐ฌ prompts โ
โ ๐ฃ logging / list-changedโ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ spawn / attach / PID resolve
โ CDP WebSocket
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Electron application โ
โ --remote-debugging-port โ
โ RuntimeยทPageยทNetworkยทโฆ โ
โ optional --inspect (main)โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโAfter start_app / attach / attach_by_pid, page targets get Runtime / Log / Network / Page enabled so console + network events keep buffering between tool calls.
Finding a running app
find_appsโ OS process scan (Electron PIDs +--remote-debugging-portfrom argv)discover_appsโ HTTP probe of local CDP ports (/json/version,/json/list)attach/attach_by_pidโ open a managed session (detach-only onstop_app)
๐๏ธ Complete tools cheatsheet
Category | Tools |
๐ Lifecycle |
|
๐ Inspect |
|
๐ฑ๏ธ Interact |
|
๐งฐ Power |
|
๐ ๏ธ Tools reference (all options)
All APIs below are MCP tools. Schemas match the live Zod definitions in src/index.ts.
๐ Lifecycle
start_app
Launch Electron with remote debugging.
Param | Type | Req | Default | Description |
| string | โ | โ | App directory or main script |
| int | โ | random | CDP port |
| string[] | โ |
| Extra CLI flags |
| bool | โ |
| Pass |
Auto flags: --remote-debugging-port, --enable-logging, --disable-gpu, and --no-sandbox when ELECTRON_MCP_NO_SANDBOX=1 / CI=true / no DISPLAY.
Returns: id, pid, debugPort, targets, attached: false, โฆ
attach
Param | Type | Req | Description |
| int | โ | Existing DevTools port |
| string | โ | Friendly session name |
stop_app on attached sessions detaches only (does not kill the external app).
attach_by_pid
Attach by OS process id. Resolves --remote-debugging-port from the process command line (Linux/macOS/ps, Windows PowerShell). Falls back to listening sockets owned by the PID on Linux when needed.
Param | Type | Req | Description |
| int | โ | Electron main process id |
| string | โ | Friendly session name |
Tip: Prefer the main process PID from find_apps (helpers with --type=renderer / gpu-process are filtered unless they expose a debug port).
find_apps
List running Electron-like processes.
Returns: { apps: [{ pid, command, debugPort?, inspectPort?, likelyElectron }], count }
Use this when you launched the app yourself and donโt remember the port.
discover_apps
Param | Type | Default |
| int |
|
| int |
|
HTTP-probes each port for Chromium/Electron DevTools (/json/version + /json/list).
stop_app โ { processId }
list_apps โ no params
diagnose โ optional { processId } (omit = all sessions)
diagnose reports port reachability, target role counts, recent console errors, and monitoring state.
๐ Inspection
screenshot / save_screenshot
Param | Type | Default | Description |
| string โ | โ | Session id |
| string | first page | CDP page target |
|
|
| Image format |
| int | โ | JPEG only |
| string | โ | Element clip โ capture only that nodeโs bounding box |
| string โ
( | โ | File path to write |
screenshot returns MCP image content (+ JSON meta including clip when used).save_screenshot writes bytes to disk and returns { path, bytes, mimeType, clip? }.
get_dom โ { processId, selector?, targetId? }
query_selector โ { processId, selector, targetId?, limit?=20 }
evaluate
Param | Type | Default |
| string โ | โ |
| string โ | โ |
| string | auto |
|
|
|
| bool |
|
evaluate_main
Evaluate in the Electron main/node CDP target.
Param | Type | Default |
| string โ | โ |
| string โ | โ |
| string | auto-pick node/main |
| bool |
|
Requires a node-like target โ start with inspectMain: true, or pass an explicit targetId from list_targets.
get_cookies
Param | Type | Description |
| string โ | โ |
| string[] | Optional URL filter |
| string | Page target |
set_cookie
Param | Type | Description |
| string โ | โ |
| string โ | Cookie pair |
| string | One required (defaults |
| string | Cookie path |
| bool | Flags |
|
| SameSite |
| number | Unix seconds |
| string | Page target |
Note: Chromium often rejects cookies on
file://pages โ use anhttp(s)URL or pass an expliciturl/domain.
get_storage / set_storage
Param | Type | Default | Description |
| string โ | โ | โ |
|
|
| Store |
|
| โ | Keys to write |
| bool ( |
| Clear store before write |
| string | โ | Page target |
get_console_messages โ { processId, tail?, level? }
get_network_log โ { processId, tail? }
get_logs โ { processId, tail? }
list_targets โ { processId? }
page_info โ { processId, targetId? } โ url / title / readyState / userAgent
Console capture includes console.*, CDP Log entries, and Runtime.exceptionThrown.
๐ฑ๏ธ Interaction & control
navigate โ { processId, url, targetId?, waitUntilLoad?=true, timeoutMs?=15000 }
wait_for
Provide at least one condition:
Param | Meaning |
| Element must exist |
| Element absent or not visible |
| Element exists and is not disabled |
|
|
|
|
|
|
| Buffered console text includes |
| Default |
| Save a PNG under the OS temp dir on failure |
| Page target |
click โ { processId, selector, targetId?, button?=left }
type_text โ { processId, text, selector?, clear?, pressEnter?, targetId? }
press_key
Param | Type | Description |
| string โ | โ |
| string โ | e.g. |
| string | Focus/click before keypress |
|
| Chord modifiers |
| int | Repeat count |
| string | Page target |
set_console_live โ { enabled }
Errors/asserts always emit MCP logs. When enabled, log/info/warn/debug also stream live.
reload โ { processId, targetId?, ignoreCache?=false }
pause / resume โ { processId, targetId? }
clear_buffers โ { processId, console?=true, network?=true, logs?=false }
๐งฐ Power / tracing
start_tracing
Param | Type | Description |
| string โ | โ |
| string | Comma-separated CDP categories (default: timeline + v8 profiler set) |
| string | Page target |
Only one active trace per process session.
stop_tracing
Param | Type | Description |
| string โ | โ |
| string | Output JSON path (default: OS temp dir) |
Returns: { path, eventCount, elapsedMs, targetId, โฆ }
Open the file in Chromeโs chrome://tracing (or Perfetto UI).
cdp_command โ { processId, method:"Domain.method", targetId?, params? }
Escape hatch for any DevTools method not wrapped above.
๐ก Resources (read-only)
URI | MIME | Description |
| JSON | Managed processes overview |
| JSON | All CDP targets |
| JSON | Process details + webContents + recent errors |
| text | stdout/stderr capture |
| JSON | Buffered console / exceptions |
| JSON | Target metadata |
๐ฌ Prompts
Prompt | Args | Use when |
|
| White/blank window |
|
| Hunting console/exceptions |
|
| Wait โ interact โ verify |
๐ Usage examples
1๏ธโฃ Start app โ read title
// tool: start_app
{
"appPath": "D:/apps/my-electron-app",
"debugPort": 9222,
"extraArgs": ["--no-sandbox"]
}// tool: evaluate
{
"processId": "electron-1710000000000",
"expression": "document.title"
}2๏ธโฃ Attach to a running app (port)
electron . --remote-debugging-port=9222// tool: attach
{ "debugPort": 9222, "name": "my-app" }3๏ธโฃ Find by PID โ attach
// tool: find_apps
{}// tool: attach_by_pid
{ "pid": 43210, "name": "my-app" }4๏ธโฃ Catch console errors (+ live stream)
// tool: set_console_live
{ "enabled": true }// tool: get_console_messages
{
"processId": "electron-1710000000000",
"level": "error",
"tail": 50
}Also: resource electron://console/{processId}
5๏ธโฃ Screenshot โ full page, file, or element
// tool: screenshot
{ "processId": "electron-โฆ", "format": "png" }// tool: save_screenshot
{
"processId": "electron-โฆ",
"path": "D:/tmp/app.png",
"format": "png"
}// tool: save_screenshot (element clip)
{
"processId": "electron-โฆ",
"path": "D:/tmp/sidebar.png",
"selector": "#sidebar"
}6๏ธโฃ UI automation flow
// wait_for
{ "processId": "electron-โฆ", "selector": "#email", "timeoutMs": 8000 }// type_text
{
"processId": "electron-โฆ",
"selector": "#email",
"text": "ada@example.com",
"clear": true
}// press_key
{ "processId": "electron-โฆ", "key": "Enter" }// click
{ "processId": "electron-โฆ", "selector": "button[type=submit]" }// wait_for (richer conditions)
{
"processId": "electron-โฆ",
"text": "Welcome",
"timeoutMs": 8000,
"screenshotOnTimeout": true
}// wait_for enabled / count / hidden
{ "processId": "electron-โฆ", "enabled": "#submit" }{
"processId": "electron-โฆ",
"countSelector": ".row",
"minCount": 3
}{ "processId": "electron-โฆ", "hidden": ".spinner" }7๏ธโฃ Cookies & storage
// set_storage
{
"processId": "electron-โฆ",
"kind": "localStorage",
"clear": true,
"entries": { "theme": "dark", "onboardingDone": "1" }
}// get_storage
{ "processId": "electron-โฆ", "kind": "localStorage" }// set_cookie
{
"processId": "electron-โฆ",
"name": "session",
"value": "abc",
"url": "https://app.local/"
}// get_cookies
{ "processId": "electron-โฆ", "urls": ["https://app.local/"] }8๏ธโฃ Main-process evaluate
// start_app with inspectMain
{
"appPath": "D:/apps/my-electron-app",
"debugPort": 9222,
"inspectMain": true
}// evaluate_main
{
"processId": "electron-โฆ",
"expression": "process.versions.electron"
}9๏ธโฃ Performance tracing
// start_tracing
{ "processId": "electron-โฆ" }โฆreproduce the slow interaction (click / navigate / wait_for)โฆ// stop_tracing
{
"processId": "electron-โฆ",
"path": "D:/tmp/app-trace.json"
}Open app-trace.json in chrome://tracing.
๐ Diagnose a sick session
// tool: diagnose
{ "processId": "electron-1710000000000" }1๏ธโฃ1๏ธโฃ Navigate + page info
// navigate
{
"processId": "electron-โฆ",
"url": "file:///path/to/renderer/settings.html",
"waitUntilLoad": true
}// page_info
{ "processId": "electron-โฆ" }1๏ธโฃ2๏ธโฃ Raw CDP escape hatch
// cdp_command
{
"processId": "electron-โฆ",
"method": "Page.captureScreenshot",
"params": { "format": "png", "fromSurface": true }
}1๏ธโฃ3๏ธโฃ Recommended agent loop
find_apps / discover_apps / start_app / attach / attach_by_pid
โ diagnose
โ set_console_live(true) # optional
โ get_console_messages(level="error")
โ screenshot / save_screenshot(selector?)
โ wait_for (if UI)
โ click / type_text / press_key / evaluate / get_dom
โ get_storage / get_cookies # if state matters
โ start_tracing โฆ stop_tracing # if perf
โ stop_app๐ Configuration
Environment variables
Variable | Purpose |
| Force a specific Electron binary |
| Always pass |
|
|
| Download mirror for Electron zips |
| Cleared by |
| Zip cache directory |
| Enables no-sandbox auto flag |
unset | Enables no-sandbox auto flag |
Path allowlist example
$env:ELECTRON_MCP_ALLOWED_ROOTS="D:\apps;D:\GH"๐ npm scripts
Script | Does |
| Download/repair Electron binary |
| Alias of ensure-electron |
| Compile TS โ |
| Run MCP server (stdio) |
| build + start |
|
|
| ensure + build + unit + smoke |
| Helper unit tests |
| Full MCP e2e vs fixture app |
| Runs ensure-electron |
Windows helpers: scripts/fix-electron.cmd ยท scripts/fix-electron.ps1
๐งช Testing
npm testSmoke path (v1.5):
initialize โ tool/prompt/resource lists โ start_app โ evaluate โ console/network/DOM โ page_info / type_text / click / wait_for / press_key โ save_screenshot (+ selector clip) โ storage / cookies โ start/stop_tracing โ find_apps / attach_by_pid โ screenshot โ diagnose โ attach โ discover โ stop
CI: .github/workflows/ci.yml (Ubuntu + Xvfb).
๐๏ธ Project layout
electron-mcp-server/
โโโ assets/logo.svg
โโโ examples/cursor-mcp.json
โโโ fixtures/minimal-electron-app/
โโโ scripts/ensure-electron.mjs ยท fix-electron.cmd ยท fix-electron.ps1
โโโ src/index.ts ยท process-manager.ts ยท events.ts ยท log.ts
โโโ test/mcp-smoke.mjs ยท unit-helpers.test.mjs
โโโ .github/workflows/ci.yml
โโโ README.md ยท LICENSE ยท package.json๐ก๏ธ Security
Can launch local binaries, evaluate JS in app contexts, read page content, cookies, and storage โ treat as a powerful local debugger.
Use
ELECTRON_MCP_ALLOWED_ROOTSon shared machines.Donโt expose stdio over an open network without auth.
Only
attach/attach_by_pidto apps you trust (remote debugging is powerful).In-memory console/network buffers and exported traces may contain secrets from the app under test.
๐งฏ Troubleshooting
Symptom | Fix |
|
|
| Corrupt cache โ repair script clears + uses |
| Expected on newer npm โ run ensure/fix scripts |
Hang + console title | Windows QuickEdit โ press Esc; disable QuickEdit |
Empty console buffer | Wait for page activity; monitoring starts on start/attach; try |
| Selector not ready โ wait first; screenshot to verify |
Element screenshot hangs / times out | Headless/GPU quirks โ server retries without |
| Pass an |
| Restart with |
| App must be started with |
| Outside |
| Waiting on MCP stdio โ use Cursor config |
Port in use | Change |
Linux headless |
|
Tracing empty / fails | Call |
๐ค Contributing
Fork + branch
npm testPR with tool/behavior notes
Keep stdout MCP-clean (log to stderr only)
๐ License
ISC ยฉ Electron Debug MCP contributors
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/amafjarkasi/electron-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server