Skip to main content
Glama
amafjarkasi

Electron Debug MCP Server

by amafjarkasi

๐ŸŒŸ 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

start_app with --remote-debugging-port

Hook an app you already launched

attach ยท attach_by_pid ยท find_apps ยท discover_apps

See the UI

screenshot / save_screenshot (full page or element clip via selector)

Read renderer failures

get_console_messages (level: "error") + exceptions

Stream console live

set_console_live โ†’ MCP log notifications

Inspect markup

get_dom / query_selector

Run JS in the page

evaluate

Run JS in main

start_app({ inspectMain: true }) โ†’ evaluate_main

Cookies & web storage

get_cookies / set_cookie ยท get_storage / set_storage

Watch network

get_network_log

Drive the UI

wait_for โ†’ type_text / press_key โ†’ click โ†’ navigate

Perf deep-dive

start_tracing โ†’ reproduce โ†’ stop_tracing (open in chrome://tracing)

One-shot health check

diagnose

Full DevTools power

cdp_command (Domain.method)

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-app on 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 #email, press Enter, wait for Welcome, then list console errors.โ€
โ€œ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 ELECTRON_MCP_ALLOWED_ROOTS; attach sessions detach-only on stop

โœ… Verify

npm test โ†’ unit + full MCPโ†”Electron smoke

โœ… 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.cmd when 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 / evaluate

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 (+ optional inspectMain)

  • ๐Ÿ”— 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

  • ๐Ÿ–ฑ๏ธ click left/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_command for 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.cmd

That reinstalls Electron, extracts electron.exe with system tar, then runs tests.


๐Ÿ–ฅ๏ธ Cursor & Claude Desktop setup

Cursor

  1. npm run build

  2. Open Cursor โ†’ MCP settings

  3. 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"
      }
    }
  }
}
  1. Restart Cursor

  2. 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.js in 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

  1. find_apps โ€” OS process scan (Electron PIDs + --remote-debugging-port from argv)

  2. discover_apps โ€” HTTP probe of local CDP ports (/json/version, /json/list)

  3. attach / attach_by_pid โ€” open a managed session (detach-only on stop_app)


๐Ÿ—‚๏ธ Complete tools cheatsheet

Category

Tools

๐Ÿš€ Lifecycle

start_app ยท attach ยท attach_by_pid ยท find_apps ยท discover_apps ยท stop_app ยท list_apps ยท diagnose

๐Ÿ” Inspect

screenshot ยท save_screenshot ยท get_dom ยท query_selector ยท evaluate ยท evaluate_main ยท get_cookies ยท set_cookie ยท get_storage ยท set_storage ยท get_console_messages ยท get_network_log ยท get_logs ยท list_targets ยท page_info

๐Ÿ–ฑ๏ธ Interact

navigate ยท wait_for ยท click ยท type_text ยท press_key ยท reload ยท pause ยท resume ยท clear_buffers ยท set_console_live

๐Ÿงฐ Power

start_tracing ยท stop_tracing ยท cdp_command


๐Ÿ› ๏ธ 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

appPath

string

โœ…

โ€”

App directory or main script

debugPort

int 1024โ€“65535

โŒ

random 9222โ€“9999

CDP port

extraArgs

string[]

โŒ

[]

Extra CLI flags

inspectMain

bool

โŒ

false

Pass --inspect=0 so main appears as a node target for evaluate_main

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

debugPort

int

โœ…

Existing DevTools port

name

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

pid

int

โœ…

Electron main process id

name

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

startPort

int

9222

endPort

int

9235

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

processId

string โœ…

โ€”

Session id

targetId

string

first page

CDP page target

format

png | jpeg

png

Image format

quality

int 0โ€“100

โ€”

JPEG only

selector

string

โ€”

Element clip โ€” capture only that nodeโ€™s bounding box

path

string โœ… (save_screenshot)

โ€”

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

processId

string โœ…

โ€”

expression

string โœ…

โ€”

targetId

string

auto

role

page | worker | browser | any

page

returnByValue

bool

true

evaluate_main

Evaluate in the Electron main/node CDP target.

Param

Type

Default

processId

string โœ…

โ€”

expression

string โœ…

โ€”

targetId

string

auto-pick node/main

returnByValue

bool

true

Requires a node-like target โ€” start with inspectMain: true, or pass an explicit targetId from list_targets.


get_cookies

Param

Type

Description

processId

string โœ…

โ€”

urls

string[]

Optional URL filter

targetId

string

Page target

Param

Type

Description

processId

string โœ…

โ€”

name / value

string โœ…

Cookie pair

url / domain

string

One required (defaults url to location.href when possible)

path

string

Cookie path

secure / httpOnly

bool

Flags

sameSite

Strict | Lax | None

SameSite

expires

number

Unix seconds

targetId

string

Page target

Note: Chromium often rejects cookies on file:// pages โ€” use an http(s) URL or pass an explicit url/domain.


get_storage / set_storage

Param

Type

Default

Description

processId

string โœ…

โ€”

โ€”

kind

localStorage | sessionStorage

localStorage

Store

entries

Record<string,string> โœ… (set)

โ€”

Keys to write

clear

bool (set)

false

Clear store before write

targetId

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

selector

Element must exist

hidden

Element absent or not visible

enabled

Element exists and is not disabled

countSelector + minCount

querySelectorAll length โ‰ฅ min

text

document.body.innerText includes

urlIncludes

location.href includes

consoleIncludes

Buffered console text includes

timeoutMs

Default 10000 (max 120000)

screenshotOnTimeout

Save a PNG under the OS temp dir on failure

targetId

Page target

click โ€” { processId, selector, targetId?, button?=left }

type_text โ€” { processId, text, selector?, clear?, pressEnter?, targetId? }

press_key

Param

Type

Description

processId

string โœ…

โ€”

key

string โœ…

e.g. Enter, Escape, Tab, ArrowDown, a

selector

string

Focus/click before keypress

modifiers

Alt | Control | Meta | Shift[]

Chord modifiers

repeat

int 1โ€“50

Repeat count

targetId

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

processId

string โœ…

โ€”

categories

string

Comma-separated CDP categories (default: timeline + v8 profiler set)

targetId

string

Page target

Only one active trace per process session.

stop_tracing

Param

Type

Description

processId

string โœ…

โ€”

path

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

electron://info

JSON

Managed processes overview

electron://targets

JSON

All CDP targets

electron://process/{id}

JSON

Process details + webContents + recent errors

electron://logs/{id}

text

stdout/stderr capture

electron://console/{id}

JSON

Buffered console / exceptions

electron://cdp/{processId}/{targetId}

JSON

Target metadata


๐Ÿ’ฌ Prompts

Prompt

Args

Use when

debug_blank_window

processId

White/blank window

find_renderer_exception

processId

Hunting console/exceptions

ui_smoke_check

processId, selector

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 }
}
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

ELECTRON_PATH

Force a specific Electron binary

ELECTRON_MCP_NO_SANDBOX=1

Always pass --no-sandbox

ELECTRON_MCP_ALLOWED_ROOTS

; / | allowlist for start_app paths

ELECTRON_MIRROR

Download mirror for Electron zips

ELECTRON_SKIP_BINARY_DOWNLOAD

Cleared by ensure-electron so download still runs

ELECTRON_CACHE / electron_config_cache

Zip cache directory

CI=true

Enables no-sandbox auto flag

unset DISPLAY (Linux)

Enables no-sandbox auto flag

Path allowlist example

$env:ELECTRON_MCP_ALLOWED_ROOTS="D:\apps;D:\GH"

๐Ÿ“œ npm scripts

Script

Does

npm run ensure-electron

Download/repair Electron binary

npm run fix-electron

Alias of ensure-electron

npm run build

Compile TS โ†’ build/

npm start

Run MCP server (stdio)

npm run dev

build + start

npm run typecheck

tsc --noEmit

npm test

ensure + build + unit + smoke

npm run test:unit

Helper unit tests

npm run test:smoke

Full MCP e2e vs fixture app

postinstall

Runs ensure-electron

Windows helpers: scripts/fix-electron.cmd ยท scripts/fix-electron.ps1


๐Ÿงช Testing

npm test

Smoke 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_ROOTS on shared machines.

  • Donโ€™t expose stdio over an open network without auth.

  • Only attach / attach_by_pid to 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

Electron failed to install correctly

.\scripts\fix-electron.cmd / npm run ensure-electron

path.txt missing / dist=locales

Corrupt cache โ€” repair script clears + uses tar

allowScripts warning

Expected on newer npm โ€” run ensure/fix scripts

Hang + console title Select โ€ฆ

Windows QuickEdit โ€” press Esc; disable QuickEdit

Empty console buffer

Wait for page activity; monitoring starts on start/attach; try set_console_live

wait_for / click fails

Selector not ready โ€” wait first; screenshot to verify

Element screenshot hangs / times out

Headless/GPU quirks โ€” server retries without fromSurface; ensure selector is visible

set_cookie fails on file://

Pass an http(s) url/domain

evaluate_main โ€œNo main/node targetโ€

Restart with inspectMain: true or pass targetId

attach_by_pid canโ€™t resolve port

App must be started with --remote-debugging-port; check find_apps

start_app path rejected

Outside ELECTRON_MCP_ALLOWED_ROOTS

node build/index.js โ€œdoes nothingโ€

Waiting on MCP stdio โ€” use Cursor config

Port in use

Change debugPort or discover_apps / find_apps

Linux headless

ELECTRON_MCP_NO_SANDBOX=1 + Xvfb

Tracing empty / fails

Call start_tracing before the slow path; only one active trace per session


๐Ÿค Contributing

  1. Fork + branch

  2. npm test

  3. PR with tool/behavior notes

  4. Keep stdout MCP-clean (log to stderr only)


๐Ÿ“„ License

ISC ยฉ Electron Debug MCP contributors


A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

โ€“Maintainers
โ€“Response time
โ€“Release cycle
โ€“Releases (12mo)
Commit activity
Issues opened vs closed

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

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