Track MCP LogoTrack MCP
Track MCP LogoTrack MCP

The world's largest repository of Model Context Protocol servers. Discover, explore, and submit MCP tools.

Product

  • Categories
  • Top MCP
  • New & Updated
  • Submit MCP

Company

  • About

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy

© 2026 TrackMCP. All rights reserved.

Built with ❤️ by Krishna Goyal

    Electron Mcp Server

    🚀 A powerful MCP server for debugging Electron applications with deep Chrome DevTools Protocol integration. Control, monitor, and debug Electron apps through a standardized API.

    32 stars
    TypeScript
    Updated Oct 29, 2025

    Table of Contents

    • 🌟 Overview
    • 👤 Who it’s for
    • 💬 Example things you can ask the agent
    • 📊 At a glance
    • ✅ Status
    • 📖 Table of contents
    • ✨ Why this exists
    • 🚀 Feature tour
    • 🔌 Lifecycle
    • 🔍 Inspection
    • 🖱️ Interaction
    • 🧠 Agent UX & power
    • ⚡ 60-second quick start
    • 🪟 Windows binary missing?
    • 🖥️ Cursor & Claude Desktop setup
    • Cursor
    • Claude Desktop
    • 🧩 How it works
    • 🗂️ Complete tools cheatsheet
    • 🛠️ Tools reference (all options)
    • 🚀 Lifecycle
    • start_app
    • attach
    • attach_by_pid
    • find_apps
    • discover_apps
    • stop_app — { processId }
    • list_apps — no params
    • diagnose — optional { processId } (omit = all sessions)
    • 🔍 Inspection
    • screenshot / save_screenshot
    • get_dom — { processId, selector?, targetId? }
    • query_selector — { processId, selector, targetId?, limit?=20 }
    • evaluate
    • evaluate_main
    • get_cookies
    • set_cookie
    • get_storage / set_storage
    • 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
    • 🖱️ Interaction & control
    • navigate — { processId, url, targetId?, waitUntilLoad?=true, timeoutMs?=15000 }
    • wait_for
    • click — { processId, selector, targetId?, button?=left }
    • type_text — { processId, text, selector?, clear?, pressEnter?, targetId? }
    • press_key
    • set_console_live — { enabled }
    • reload — { processId, targetId?, ignoreCache?=false }
    • pause / resume — { processId, targetId? }
    • clear_buffers — { processId, console?=true, network?=true, logs?=false }
    • 🧰 Power / tracing
    • start_tracing
    • stop_tracing
    • cdp_command — { processId, method:"Domain.method", targetId?, params? }
    • 📡 Resources (read-only)
    • 💬 Prompts
    • 📚 Usage examples
    • 1️⃣ Start app → read title
    • 2️⃣ Attach to a running app (port)
    • 3️⃣ Find by PID → attach
    • 4️⃣ Catch console errors (+ live stream)
    • 5️⃣ Screenshot — full page, file, or element
    • 6️⃣ UI automation flow
    • 7️⃣ Cookies & storage
    • 8️⃣ Main-process evaluate
    • 9️⃣ Performance tracing
    • 🔟 Diagnose a sick session
    • 1️⃣1️⃣ Navigate + page info
    • 1️⃣2️⃣ Raw CDP escape hatch
    • 1️⃣3️⃣ Recommended agent loop
    • 🔐 Configuration
    • Environment variables
    • Path allowlist example
    • 📜 npm scripts
    • 🧪 Testing
    • 🗂️ Project layout
    • 🛡️ Security
    • 🧯 Troubleshooting
    • 🤝 Contributing
    • 📄 License

    Table of Contents

    • 🌟 Overview
    • 👤 Who it’s for
    • 💬 Example things you can ask the agent
    • 📊 At a glance
    • ✅ Status
    • 📖 Table of contents
    • ✨ Why this exists
    • 🚀 Feature tour
    • 🔌 Lifecycle
    • 🔍 Inspection
    • 🖱️ Interaction
    • 🧠 Agent UX & power
    • ⚡ 60-second quick start
    • 🪟 Windows binary missing?
    • 🖥️ Cursor & Claude Desktop setup
    • Cursor
    • Claude Desktop
    • 🧩 How it works
    • 🗂️ Complete tools cheatsheet
    • 🛠️ Tools reference (all options)
    • 🚀 Lifecycle
    • start_app
    • attach
    • attach_by_pid
    • find_apps
    • discover_apps
    • stop_app — { processId }
    • list_apps — no params
    • diagnose — optional { processId } (omit = all sessions)
    • 🔍 Inspection
    • screenshot / save_screenshot
    • get_dom — { processId, selector?, targetId? }
    • query_selector — { processId, selector, targetId?, limit?=20 }
    • evaluate
    • evaluate_main
    • get_cookies
    • set_cookie
    • get_storage / set_storage
    • 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
    • 🖱️ Interaction & control
    • navigate — { processId, url, targetId?, waitUntilLoad?=true, timeoutMs?=15000 }
    • wait_for
    • click — { processId, selector, targetId?, button?=left }
    • type_text — { processId, text, selector?, clear?, pressEnter?, targetId? }
    • press_key
    • set_console_live — { enabled }
    • reload — { processId, targetId?, ignoreCache?=false }
    • pause / resume — { processId, targetId? }
    • clear_buffers — { processId, console?=true, network?=true, logs?=false }
    • 🧰 Power / tracing
    • start_tracing
    • stop_tracing
    • cdp_command — { processId, method:"Domain.method", targetId?, params? }
    • 📡 Resources (read-only)
    • 💬 Prompts
    • 📚 Usage examples
    • 1️⃣ Start app → read title
    • 2️⃣ Attach to a running app (port)
    • 3️⃣ Find by PID → attach
    • 4️⃣ Catch console errors (+ live stream)
    • 5️⃣ Screenshot — full page, file, or element
    • 6️⃣ UI automation flow
    • 7️⃣ Cookies & storage
    • 8️⃣ Main-process evaluate
    • 9️⃣ Performance tracing
    • 🔟 Diagnose a sick session
    • 1️⃣1️⃣ Navigate + page info
    • 1️⃣2️⃣ Raw CDP escape hatch
    • 1️⃣3️⃣ Recommended agent loop
    • 🔐 Configuration
    • Environment variables
    • Path allowlist example
    • 📜 npm scripts
    • 🧪 Testing
    • 🗂️ Project layout
    • 🛡️ Security
    • 🧯 Troubleshooting
    • 🤝 Contributing
    • 📄 License

    Documentation

    ⚡ Electron Debug MCP

    Debug Electron apps from Cursor & Claude with real DevTools superpowers.

    Model Context Protocol server · Chrome DevTools Protocol · start / attach / screenshot / console / DOM / UI automation / tracing

    ---

    🌟 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 debuggerstart_app with --remote-debugging-port
    Hook an app you already launchedattach · attach_by_pid · find_apps · discover_apps
    See the UIscreenshot / save_screenshot (full page or element clip via selector)
    Read renderer failuresget_console_messages (level: "error") + exceptions
    Stream console liveset_console_live → MCP log notifications
    Inspect markupget_dom / query_selector
    Run JS in the pageevaluate
    Run JS in mainstart_app({ inspectMain: true }) → evaluate_main
    Cookies & web storageget_cookies / set_cookie · get_storage / set_storage
    Watch networkget_network_log
    Drive the UIwait_for → type_text / press_key → click → navigate
    Perf deep-divestart_tracing → reproduce → stop_tracing (open in chrome://tracing)
    One-shot health checkdiagnose
    Full DevTools powercdp_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

    AspectDetails
    🔌 TransportMCP stdio JSON-RPC
    🧬 Debug bridgeChrome DevTools Protocol (Runtime · Page · Network · Debugger · Input · Log · Tracing)
    🚀 App controlSpawn Electron or attach by port / PID / process scan
    📦 Surface area36 tools · 6 resources · 3 prompts · logging + resource list-changed
    🖥️ PlatformsWindows · macOS · Linux (CI: Xvfb + no-sandbox)
    📦 RequiresNode ≥ 18, npm, one-time Electron binary download
    🛡️ SafetyOptional ELECTRON_MCP_ALLOWED_ROOTS (app paths) · ELECTRON_MCP_OUTPUT_ROOTS (screenshot/trace output, plus built-in blocklist of sensitive locations); attach sessions detach-only on stop
    ✅ Verifynpm 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
    • 🟢 Built on TypeScript 7 (native Go compiler) — ~10x faster builds

    ---

    📖 Table of contents

    • Overview
    • Why this exists
    • Feature tour
    • 60-second quick start
    • Cursor & Claude Desktop setup
    • How it works
    • Complete tools cheatsheet
    • Tools reference (all options)
    • Resources
    • Prompts
    • Usage examples
    • Configuration
    • npm scripts
    • Testing
    • Project layout
    • Security
    • Troubleshooting
    • Contributing
    • License

    ---

    ✨ Why this exists

    Electron bugs are often invisible to coding agents:

    😣 Pain🙈 What agents usually see👁️ What this server adds
    Blank / white windowSource files onlyLive screenshot + DOM (+ element clip)
    Silent renderer crashNothingConsole + exception buffer (+ live stream)
    Failed API callsGuessworkNetwork event log
    Wrong route / URLUnknownpage_info / evaluate
    UI not respondingCan't interactclick / type_text / press_key / wait_for
    Auth / state bugsBlindcookies + localStorage/sessionStorage
    Perf jankGuessworkCDP tracing export
    App already runningManual port huntfind_apps / attach_by_pid
    Need DevTools powerManual onlyFull 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

    bash
    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:

    bat
    .\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

    json
    {
      "mcpServers": {
        "electron-debug": {
          "command": "node",
          "args": ["C:/Users/you/code/electron-mcp-server/build/index.js"]
        }
      }
    }

    macOS / Linux

    json
    {
      "mcpServers": {
        "electron-debug": {
          "command": "node",
          "args": ["/Users/you/code/electron-mcp-server/build/index.js"],
          "env": {
            "ELECTRON_MCP_NO_SANDBOX": "1"
          }
        }
      }
    }

    4. Restart Cursor

    5. Confirm tools: start_app, attach, find_apps, screenshot, get_console_messages, click, start_tracing, …

    📄 Template: [examples/cursor-mcp.json](./examples/cursor-mcp.json)

    Claude Desktop

    Same mcpServers block in claude_desktop_config.json, pointing at build/index.js. Edit the file at:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
    • Linux: ~/.config/Claude/claude_desktop_config.json

    📄 Template: [examples/claude-desktop-config.json](./examples/claude-desktop-config.json)

    ⚠️ 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

    text
    ┌──────────────────────────┐
    │  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

    CategoryTools
    🚀 Lifecyclestart_app · attach · attach_by_pid · find_apps · discover_apps · stop_app · list_apps · diagnose
    🔍 Inspectscreenshot · 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
    🖱️ Interactnavigate · wait_for · click · type_text · press_key · reload · pause · resume · clear_buffers · set_console_live
    🧰 Powerstart_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.

    ParamTypeReqDefaultDescription
    appPathstring✅—App directory or main script
    debugPortint 1024–65535❌random 9222–9999CDP port
    extraArgsstring[]❌[]Extra CLI flags
    inspectMainbool❌falsePass --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

    ParamTypeReqDescription
    debugPortint✅Existing DevTools port
    namestring❌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.

    ParamTypeReqDescription
    pidint✅Electron main process id
    namestring❌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

    ParamTypeDefault
    startPortint9222
    endPortint9235

    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

    ParamTypeDefaultDescription
    processIdstring ✅—Session id
    targetIdstringfirst pageCDP page target
    formatpng \jpegpngImage format
    qualityint 0–100—JPEG only
    selectorstring—Element clip — capture only that node’s bounding box
    pathstring ✅ (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

    ParamTypeDefault
    processIdstring ✅—
    expressionstring ✅—
    targetIdstringauto
    rolepage \worker \browser \otherpage
    returnByValuebooltrue

    evaluate_main

    Evaluate in the Electron main/node CDP target.

    ParamTypeDefault
    processIdstring ✅—
    expressionstring ✅—
    targetIdstringauto-pick node/main
    returnByValuebooltrue

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

    ---

    get_cookies

    ParamTypeDescription
    processIdstring ✅—
    urlsstring[]Optional URL filter
    targetIdstringPage target

    set_cookie

    ParamTypeDescription
    processIdstring ✅—
    name / valuestring ✅Cookie pair
    url / domainstringOne required (defaults url to location.href when possible)
    pathstringCookie path
    secure / httpOnlyboolFlags
    sameSiteStrict \Lax \NoneSameSite
    expiresnumberUnix seconds
    targetIdstringPage target

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

    ---

    get_storage / set_storage

    ParamTypeDefaultDescription
    processIdstring ✅——
    kindlocalStorage \sessionStoragelocalStorageStore
    entriesRecord ✅ (set)—Keys to write
    clearbool (set)falseClear store before write
    targetIdstring—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:

    ParamMeaning
    selectorElement must exist
    hiddenElement absent or not visible
    enabledElement exists and is not disabled
    countSelector + minCountquerySelectorAll length ≥ min
    textdocument.body.innerText includes
    urlIncludeslocation.href includes
    consoleIncludesBuffered console text includes
    timeoutMsDefault 10000 (max 120000)
    screenshotOnTimeoutSave a PNG under the OS temp dir on failure
    targetIdPage target

    click — { processId, selector, targetId?, button?=left }

    type_text — { processId, text, selector?, clear?, pressEnter?, targetId? }

    press_key

    ParamTypeDescription
    processIdstring ✅—
    keystring ✅e.g. Enter, Escape, Tab, ArrowDown, a
    selectorstringFocus/click before keypress
    modifiersAlt \Control \Meta \Shift[]Chord modifiers
    repeatint 1–50Repeat count
    targetIdstringPage 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

    ParamTypeDescription
    processIdstring ✅—
    categoriesstringComma-separated CDP categories (default: timeline + v8 profiler set)
    targetIdstringPage target

    Only one active trace per process session.

    stop_tracing

    ParamTypeDescription
    processIdstring ✅—
    pathstringOutput 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)

    URIMIMEDescription
    electron://infoJSONManaged processes overview
    electron://targetsJSONAll CDP targets
    electron://process/{id}JSONProcess details + webContents + recent errors
    electron://logs/{id}textstdout/stderr capture
    electron://console/{id}JSONBuffered console / exceptions
    electron://cdp/{processId}/{targetId}JSONTarget metadata

    ---

    💬 Prompts

    PromptArgsUse when
    debug_blank_windowprocessIdWhite/blank window
    find_renderer_exceptionprocessIdHunting console/exceptions
    ui_smoke_checkprocessId, selectorWait → interact → verify

    ---

    📚 Usage examples

    1️⃣ Start app → read title

    json
    // tool: start_app
    {
      "appPath": "D:/apps/my-electron-app",
      "debugPort": 9222,
      "extraArgs": ["--no-sandbox"]
    }
    json
    // tool: evaluate
    {
      "processId": "electron-1710000000000",
      "expression": "document.title"
    }

    2️⃣ Attach to a running app (port)

    bash
    electron . --remote-debugging-port=9222
    json
    // tool: attach
    { "debugPort": 9222, "name": "my-app" }

    3️⃣ Find by PID → attach

    json
    // tool: find_apps
    {}
    json
    // tool: attach_by_pid
    { "pid": 43210, "name": "my-app" }

    4️⃣ Catch console errors (+ live stream)

    json
    // tool: set_console_live
    { "enabled": true }
    json
    // tool: get_console_messages
    {
      "processId": "electron-1710000000000",
      "level": "error",
      "tail": 50
    }

    Also: resource electron://console/{processId}

    5️⃣ Screenshot — full page, file, or element

    json
    // tool: screenshot
    { "processId": "electron-…", "format": "png" }
    json
    // tool: save_screenshot
    {
      "processId": "electron-…",
      "path": "D:/tmp/app.png",
      "format": "png"
    }
    json
    // tool: save_screenshot (element clip)
    {
      "processId": "electron-…",
      "path": "D:/tmp/sidebar.png",
      "selector": "#sidebar"
    }

    6️⃣ UI automation flow

    json
    // wait_for
    { "processId": "electron-…", "selector": "#email", "timeoutMs": 8000 }
    json
    // type_text
    {
      "processId": "electron-…",
      "selector": "#email",
      "text": "ada@example.com",
      "clear": true
    }
    json
    // press_key
    { "processId": "electron-…", "key": "Enter" }
    json
    // click
    { "processId": "electron-…", "selector": "button[type=submit]" }
    json
    // wait_for (richer conditions)
    {
      "processId": "electron-…",
      "text": "Welcome",
      "timeoutMs": 8000,
      "screenshotOnTimeout": true
    }
    json
    // wait_for enabled / count / hidden
    { "processId": "electron-…", "enabled": "#submit" }
    json
    {
      "processId": "electron-…",
      "countSelector": ".row",
      "minCount": 3
    }
    json
    { "processId": "electron-…", "hidden": ".spinner" }

    7️⃣ Cookies & storage

    json
    // set_storage
    {
      "processId": "electron-…",
      "kind": "localStorage",
      "clear": true,
      "entries": { "theme": "dark", "onboardingDone": "1" }
    }
    json
    // get_storage
    { "processId": "electron-…", "kind": "localStorage" }
    json
    // set_cookie
    {
      "processId": "electron-…",
      "name": "session",
      "value": "abc",
      "url": "https://app.local/"
    }
    json
    // get_cookies
    { "processId": "electron-…", "urls": ["https://app.local/"] }

    8️⃣ Main-process evaluate

    json
    // start_app with inspectMain
    {
      "appPath": "D:/apps/my-electron-app",
      "debugPort": 9222,
      "inspectMain": true
    }
    json
    // evaluate_main
    {
      "processId": "electron-…",
      "expression": "process.versions.electron"
    }

    9️⃣ Performance tracing

    json
    // start_tracing
    { "processId": "electron-…" }
    text
    …reproduce the slow interaction (click / navigate / wait_for)…
    json
    // stop_tracing
    {
      "processId": "electron-…",
      "path": "D:/tmp/app-trace.json"
    }

    Open app-trace.json in chrome://tracing.

    🔟 Diagnose a sick session

    json
    // tool: diagnose
    { "processId": "electron-1710000000000" }

    1️⃣1️⃣ Navigate + page info

    json
    // navigate
    {
      "processId": "electron-…",
      "url": "file:///path/to/renderer/settings.html",
      "waitUntilLoad": true
    }
    json
    // page_info
    { "processId": "electron-…" }

    1️⃣2️⃣ Raw CDP escape hatch

    json
    // cdp_command
    {
      "processId": "electron-…",
      "method": "Page.captureScreenshot",
      "params": { "format": "png", "fromSurface": true }
    }

    1️⃣3️⃣ Recommended agent loop

    text
    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

    VariablePurpose
    ELECTRON_PATHForce a specific Electron binary
    ELECTRON_MCP_NO_SANDBOX=1Always pass --no-sandbox
    ELECTRON_MCP_ALLOWED_ROOTS; / `\ allowlist for start_app` paths
    ELECTRON_MCP_OUTPUT_ROOTS; / `\ allowlist for save_screenshot / stop_tracing` output paths
    ELECTRON_MIRRORDownload mirror for Electron zips
    ELECTRON_SKIP_BINARY_DOWNLOADCleared by ensure-electron so download still runs
    ELECTRON_CACHE / electron_config_cacheZip cache directory
    CI=trueEnables no-sandbox auto flag
    unset DISPLAY (Linux)Enables no-sandbox auto flag

    Path allowlist example

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

    ---

    📜 npm scripts

    ScriptDoes
    npm run ensure-electronDownload/repair Electron binary
    npm run fix-electronAlias of ensure-electron
    npm run buildCompile TS → build/
    npm startRun MCP server (stdio)
    npm run devbuild + start
    npm run typechecktsc --noEmit
    npm testensure + build + unit + smoke
    npm run test:unitHelper unit tests
    npm run test:smokeFull MCP e2e vs fixture app
    postinstallRuns ensure-electron

    Windows helpers: scripts/fix-electron.cmd · scripts/fix-electron.ps1

    ---

    🧪 Testing

    bash
    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](./.github/workflows/ci.yml) (Ubuntu + Xvfb).

    ---

    🗂️ Project layout

    text
    electron-mcp-server/
    ├── assets/logo.svg · logo.png
    ├── examples/cursor-mcp.json · claude-desktop-config.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
    ├── src/types/chrome-remote-interface.d.ts
    ├── test/mcp-smoke.mjs · unit-helpers.test.mjs
    ├── .github/workflows/ci.yml
    └── README.md · LICENSE · package.json · tsconfig.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.
    • save_screenshot / stop_tracing reject writes to sensitive locations (~/.ssh, /etc, /proc, /usr, C:\Windows, C:\Program Files, …). Set ELECTRON_MCP_OUTPUT_ROOTS to further restrict output to specific directories.
    • 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

    SymptomFix
    Electron failed to install correctly.\scripts\fix-electron.cmd / npm run ensure-electron
    path.txt missing / dist=localesCorrupt cache — repair script clears + uses tar
    allowScripts warningExpected on newer npm — run ensure/fix scripts
    Hang + console title Select …Windows QuickEdit — press Esc; disable QuickEdit
    Empty console bufferWait for page activity; monitoring starts on start/attach; try set_console_live
    wait_for / click failsSelector not ready — wait first; screenshot to verify
    Element screenshot hangs / times outHeadless/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 portApp must be started with --remote-debugging-port; check find_apps
    start_app path rejectedOutside ELECTRON_MCP_ALLOWED_ROOTS
    node build/index.js “does nothing”Waiting on MCP stdio — use Cursor config
    Port in useChange debugPort or discover_apps / find_apps
    Linux headlessELECTRON_MCP_NO_SANDBOX=1 + Xvfb
    Tracing empty / failsCall 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

    ---

    Built for agents that need eyes — and hands — inside Electron.

    Similar MCP

    Based on tags & features

    • MC

      Mcp Open Library

      TypeScript·
      42
    • DI

      Discogs Mcp Server

      TypeScript·
      59
    • QU

      Quran Mcp Server

      TypeScript·
      50
    • AN

      Anilist Mcp

      TypeScript·
      57

    Trending MCP

    Most active this week

    • PL

      Playwright Mcp

      TypeScript·
      22.1k
    • SE

      Serena

      Python·
      14.5k
    • MC

      Mcp Playwright

      TypeScript·
      4.9k
    • MC

      Mcp Server Cloudflare

      TypeScript·
      3.0k
    View All MCP Servers

    Similar MCP

    Based on tags & features

    • MC

      Mcp Open Library

      TypeScript·
      42
    • DI

      Discogs Mcp Server

      TypeScript·
      59
    • QU

      Quran Mcp Server

      TypeScript·
      50
    • AN

      Anilist Mcp

      TypeScript·
      57

    Trending MCP

    Most active this week

    • PL

      Playwright Mcp

      TypeScript·
      22.1k
    • SE

      Serena

      Python·
      14.5k
    • MC

      Mcp Playwright

      TypeScript·
      4.9k
    • MC

      Mcp Server Cloudflare

      TypeScript·
      3.0k