Labsco
sh3ll3x3c logo

Native Devtools

β˜… 118

from sh3ll3x3c

About MCP server for native computer use and browser automation.

πŸ”₯πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedAccount requiredAdvanced setup

native-devtools-mcp

An MCP server for computer use on native desktop and mobile apps β€” macOS, Windows, Android, and Chrome/Electron via CDP.

Version License Platform Downloads

Add to your client in one click:

Add to Cursor Install in VS Code

Claude Code: claude mcp add native-devtools -- npx -y native-devtools-mcp

native-devtools-mcp gives AI agents and MCP clients direct control over native desktop apps, Chrome/Electron browsers, and Android devices β€” screenshots, OCR, accessibility-first element lookup, input simulation, window management, Chrome DevTools Protocol (CDP), and ADB β€” all in one local server. Works with Claude Desktop, Claude Code, Cursor, and other MCP-compatible clients.

πŸš€ Features

  • πŸ‘€ Computer Vision: Screenshots of screens, windows, or regions with built-in OCR (Vision on macOS, Windows Media OCR on Windows).
  • πŸ–±οΈ Input Simulation: Click, drag, scroll, type β€” global coordinates, window-relative, and screenshot-relative targeting.
  • 🎯 Element-Precise AX Dispatch (macOS): take_ax_snapshot β†’ ax_click / ax_set_value / ax_select β€” dispatch against Accessibility-tree elements without moving the mouse or stealing focus. The preferred path for native macOS apps.
  • 🌐 Browser Automation (CDP): Chrome DevTools Protocol for Chrome and Electron apps (Signal, Discord, VS Code, Slack) β€” DOM-level click, fill, navigate, and JS evaluation without a separate Node.js server.
  • πŸ“± Android (ADB): Screenshots, uiautomator-based text lookup, input, and app management over USB or Wi-Fi.
  • 🧩 Template Matching: load_image + find_image for icons, toggles, and custom controls OCR can't identify.
  • πŸͺŸ Window Management: List, focus, launch, and quit apps; record windows as timestamped JPEG frames.
  • πŸ” Hover Tracking: Observe user navigation patterns with dwell-filtered hover events β€” designed for LLMs watching a user work.
  • πŸ”’ Local & Private: 100% local execution. Screenshots and input never leave your machine.

🧭 Three Approaches to Interaction

Pick the approach that matches your target app.

ApproachBest forKey tools
Visual (universal)Any app β€” games, Qt, custom renderers, anything without an AX treetake_screenshot, find_text, click, type_text, find_image
AX Dispatch (macOS β€” preferred for native macOS apps)AppKit / SwiftUI apps β€” System Settings, Finder, Mail, Xcode, Notestake_ax_snapshot, ax_click, ax_set_value, ax_select
CDP (Chrome / Electron)Web content, Electron apps with --remote-debugging-portcdp_connect, cdp_find_elements, cdp_take_dom_snapshot, cdp_click, cdp_fill

For macOS native apps, AX Dispatch is the preferred path β€” it's element-precise, doesn't move the mouse, and doesn't steal focus. See the Native App AX Dispatch recipe.

There's also a fourth, niche path: AppDebugKit (app_connect / app_query / app_click) for apps instrumented with the AppDebugKit library. Mostly useful for developers testing their own apps.

πŸ†š How it compares

The most honest peers are other MCP servers for computer use. This table compares native-devtools-mcp against the leading MCP servers and two widely used non-MCP libraries.

Capabilitynative-devtools-mcpPlaywright MCPWindows-MCPAppiumpywinauto
Native macOS appsβœ… AX + screenshots❌ browser only❌ Windows only❌ mobile focus❌ Windows only
Native Windows appsβœ… UIA + input❌ browser onlyβœ…β— limitedβœ…
Web / DOM automationβœ… via CDPβœ…β— via Windows UIA◐ mobile-web❌
Electron appsβœ… CDP + AXβœ… first-class _electron◐ if UIA exposedβŒβ— if UIA exposed
Android devices (ADB)βœ… built-in◐ experimentalβŒβœ… first-class❌
MCP-nativeβœ…βœ…βœ…βŒβŒ
Local, no API keyβœ…βœ…βœ…βœ… self-hostedβœ…

Where native-devtools-mcp stands out: one local MCP server covering macOS + Windows + Chrome/Electron (CDP) + Android in the same session, plus element-precise macOS AX dispatch that doesn't move the cursor or steal focus.

Honest limits:

  • No Linux (contributions welcome β€” see Linux Desktop MCP for an AT-SPI2-based alternative in the meantime)
  • Browser automation is Chrome / Electron only via CDP β€” no Firefox, no WebKit (for those, use Playwright MCP)
  • Headed only β€” depends on real-machine permissions; not a headless CI test grid
  • No iOS

If you need just web automation, Playwright MCP is more mature. If you need just mobile (iOS + Android + deep device features), Appium is more mature. This server is for the cross-cutting native-desktop + Chrome/Electron + Android case.

πŸ“š Recipes and Examples

🌐 Browser Automation (CDP)

Connect to Chrome or Electron apps via the Chrome DevTools Protocol for DOM-level automation β€” more reliable than coordinate-based clicking for web content.

Copy & paste β€” that's it
# Launch Chrome with remote debugging
launch_app(app_name="Google Chrome", args=["--remote-debugging-port=9222", "--user-data-dir=/tmp/chrome-profile"])

# Connect and automate
cdp_connect(port=9222)
cdp_navigate(url="https://example.com")
cdp_find_elements(query="search")    # DOM walker with element UIDs (d1, d2, ...)
cdp_fill(uid="d1", value="search query")
cdp_press_key(key="Enter")
cdp_wait_for(text=["Results"])

18 CDP tools β€” DOM snapshot, find elements, click, hover, fill, type, press key, navigate, handle dialogs, manage tabs, evaluate JS, element inspection, and more. Works with Chrome 136+, Chromium, and Electron apps (Signal, Discord, VS Code, Slack). See AGENTS.md for the full tool reference.

Chrome 136+ note: requires --user-data-dir=<path> alongside --remote-debugging-port β€” Chrome silently ignores the debug port with the default profile. Electron apps only need --remote-debugging-port.

πŸ“± Android Support

Android support is built-in. The server communicates with Android devices over ADB (USB or Wi-Fi), providing screenshots, input simulation, UI element search, and app management.

Prerequisites

  1. ADB installed on the host (brew install android-platform-tools on macOS, or via Android SDK).
  2. USB debugging enabled on the device (Settings > Developer options > USB debugging).
  3. ADB server running β€” starts automatically when you run adb devices.

Tools

All Android tools are prefixed with android_ and appear dynamically after connecting to a device:

ToolDescription
android_list_devicesList all ADB-connected devices (always available)
android_connectConnect to a device by serial number
android_disconnectDisconnect from the current device
android_screenshotCapture the device screen
android_find_textFind UI elements by text (via uiautomator)
android_clickTap at screen coordinates
android_swipeSwipe between two points
android_type_textType text on the device
android_press_keyPress a key (e.g., KEYCODE_HOME, KEYCODE_BACK)
android_launch_appLaunch an app by package name
android_list_appsList installed packages
android_get_display_infoGet screen resolution and density
android_get_current_activityGet the current foreground activity

Typical workflow

Copy & paste β€” that's it
android_list_devices           β†’ find your device serial
android_connect(serial="...")  β†’ connect (unlocks android_* tools)
android_screenshot             β†’ see what's on screen
android_find_text(text="OK")   β†’ locate a button
android_click(x=..., y=...)    β†’ tap it
<details> <summary><strong>Known issues & advanced setup</strong></summary>

MIUI / HyperOS (Xiaomi, Redmi, POCO devices): input injection (android_click, android_type_text, android_press_key, android_swipe) and android_find_text (via uiautomator) require an additional security toggle:

Settings > Developer options > USB debugging (Security settings) β€” enable this toggle. MIUI may require you to sign in with a Mi account to enable it.

Without this, you'll see INJECT_EVENTS permission errors for input tools and could not get idle state errors for android_find_text. Screenshot and device info tools work without this toggle.

Wireless ADB: to connect without a USB cable, first connect via USB and run:

Copy & paste β€” that's it
adb tcpip 5555
adb connect <phone-ip>:5555

Then use the <phone-ip>:5555 serial in android_connect.

Smoke tests: verify all Android tools against a real connected device. They are #[ignore]d by default:

Copy & paste β€” that's it
cargo test --test android_smoke_tests -- --ignored --test-threads=1

Tests must run sequentially since they share a single physical device. The device must be unlocked and awake.

</details>

πŸ” Security & Trust

This tool requires Accessibility and Screen Recording permissions β€” that's a lot of trust. Here's how to verify it deserves it.

Verify your binary

Copy & paste β€” that's it
native-devtools-mcp verify

Computes the SHA-256 hash of the running binary and checks it against the official checksums published on the GitHub Releases page. If the hash matches, you're running an unmodified official build.

Audit the code

SECURITY_AUDIT.md documents exactly which permissions are used, where in the source code, and includes an LLM audit prompt you can paste into any AI model for an independent security review.

What this server does NOT do

  • No unsolicited network access. The server never phones home. Network is only used when the MCP client explicitly invokes app_connect (WebSocket to a local debug server) or when you run the verify subcommand (fetches checksums from GitHub).
  • No file scanning. Does not read or index your files. The only file reads are load_image (a path the MCP client explicitly provides) and short-lived temp files for screenshots (deleted immediately after capture).
  • No background persistence. Exits when the MCP client disconnects.
  • No data exfiltration. Screenshots are returned to the MCP client via stdout, never stored or transmitted elsewhere.

πŸ—οΈ Architecture

Copy & paste β€” that's it
graph TD
    Client[Claude / LLM Client] <-->|JSON-RPC 2.0| Server[native-devtools-mcp]
    Server -->|Direct API| Sys[System APIs]
    Server -->|CDP / WebSocket| Chrome[Chrome / Electron]
    Server -->|WebSocket| Debug[AppDebugKit]
    Server -->|ADB Protocol| Android[Android Device]

    subgraph "Your Machine"
        Sys -->|Screen/OCR| macOS[CoreGraphics / Vision]
        Sys -->|Input| Win[Win32 / SendInput]
        Sys -->|Text Search| UIA[UI Automation]
        Sys -->|AX Snapshot + Dispatch| AXapi[Accessibility API - macOS]
        Chrome -.->|DOM-level| ChromeApp[Web Page / Electron UI]
        Debug -.->|Inspect| App[Instrumented App]
    end

    subgraph "Android Device (USB/Wi-Fi)"
        Android -->|screencap| Screen[Screenshots]
        Android -->|input| Input[Tap / Swipe / Type]
        Android -->|uiautomator| UITree[UI Hierarchy]
    end
<details> <summary><strong>πŸ”§ Technical Details (Under the Hood)</strong></summary>
OSFeatureAPI Used
macOSScreenshotsscreencapture (CLI)
InputCGEvent (CoreGraphics)
Text Search (find_text)Accessibility API (primary), Vision OCR (fallback)
AX Snapshot + Dispatch (take_ax_snapshot / ax_click / ax_set_value / ax_select)Accessibility API β€” AX tree walk, AXPress action, kAXValueAttribute write, AXSelectedRows write (focus-preserving, no mouse movement)
Element Inspection (element_at_point)AXUIElementCopyElementAtPosition + AX tree walk fallback
Hover Tracking (start_hover_tracking)CGEvent cursor + Accessibility API polling
Screen Recording (start_recording)CGWindowListCreateImage at configurable fps
OCRVNRecognizeTextRequest (Vision Framework)
WindowsScreenshotsBitBlt (GDI)
InputSendInput (Win32)
Text Search (find_text)UI Automation (primary), WinRT OCR (fallback)
Element Inspection (element_at_point)IUIAutomation::ElementFromPoint
Hover Tracking (start_hover_tracking)GetCursorPos + UI Automation polling
Screen Recording (start_recording)BitBlt (GDI) at configurable fps
OCRWindows.Media.Ocr (WinRT)
AndroidScreenshotsscreencap / ADB framebuffer
Inputadb shell input (tap, swipe, text, keyevent)
Text Search (find_text)uiautomator dump (accessibility tree)
Device Communicationadb_client crate (native Rust ADB protocol)
Chrome / ElectronDOM-level automationChrome DevTools Protocol via chromiumoxide

Screenshot Coordinate Precision

Screenshots include metadata for accurate coordinate conversion:

  • screenshot_origin_x/y: Screen-space origin of the captured area (in points)
  • screenshot_scale: Display scale factor (e.g., 2.0 for Retina displays)
  • screenshot_pixel_width/height: Actual pixel dimensions of the image
  • screenshot_window_id: Window ID (for window captures)

Coordinate conversion:

Copy & paste β€” that's it
screen_x = screenshot_origin_x + (pixel_x / screenshot_scale)
screen_y = screenshot_origin_y + (pixel_y / screenshot_scale)

Implementation notes:

  • Window captures (macOS): uses screencapture -o which excludes window shadow. Captured dimensions match kCGWindowBounds Γ— scale exactly, so click coordinates derived from screenshots land on intended UI elements.
  • Region captures: origin coordinates are aligned to integers to match the actual captured area.
</details>

πŸͺŸ Windows Notes

Works out of the box on Windows 10/11.

  • Uses standard Win32 APIs (GDI, SendInput).
  • find_text uses UI Automation (UIA) as the primary search mechanism, querying the accessibility tree for element names. This is the same accessibility-first approach used on macOS. Falls back to OCR automatically when UIA finds no matches.
  • OCR uses the built-in Windows Media OCR engine (offline).
  • Cannot interact with "Run as Administrator" windows unless the MCP server itself is also running as Administrator.
  • Screen recording uses GDI/BitBlt at configurable fps (default 5). For higher fps or game capture, DXGI Desktop Duplication API would provide hardware-accelerated capture β€” a planned future upgrade.

πŸ€– For AI Agents

Agent-oriented usage β€” intent definitions, schema examples, reasoning patterns β€” lives in AGENTS.md. It's a compact, token-optimized reference designed for ingestion by LLMs (Claude, Gemini, GPT, local models). If you're an AI agent reading this README to decide whether to use the server, go there next.

⭐ Star History

<a href="https://www.star-history.com/?repos=sh3ll3x3c%2Fnative-devtools-mcp&type=date&legend=bottom-right"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=sh3ll3x3c/native-devtools-mcp&type=date&theme=dark&legend=bottom-right" /> <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=sh3ll3x3c/native-devtools-mcp&type=date&legend=bottom-right" /> <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=sh3ll3x3c/native-devtools-mcp&type=date&legend=bottom-right" /> </picture> </a>

πŸ“œ License

MIT Β© sh3ll3x3c