Mmcp.market

Ghost in the Droid MCP server

by ghost-in-the-droid·io.github.ghost-in-the-droid/android-agent·v1.3.2

Give any LLM agent a real Android or iPhone as its body. 62 MCP tools for mobile automation.

B78/100grade B
What users say
No reviews yet
Be the first
Safety scan
B78/100

full report

Adoption
Growing

363 stars84 downloads/wk

Reviews

Write one

Nobody has reviewed Ghost in the Droid yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

Ghost in the Droid tools (64, 6 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • app_state

    Check whether an Android package or iOS bundle id is installed, running, or foreground.

  • browser_back

    Navigate back in the current browser/app context.

  • classify_screen

    Classify the current screen: what app, what type of screen (home, search, profile, settings, dialog, error, loading), keyboard state. No LLM needed — uses XML heuristics. Use this for quick state checks before deciding what action to take.

  • clear_notifications

    Dismiss visible notifications when the platform exposes a clear control.

  • clipboard_get

    Get the current clipboard text from the device.

  • clipboard_set

    Set clipboard text on the device. Use with press_key(PASTE) to paste into fields.

  • create_skillwrite action

    Create a new reusable skill from a JSON list of recorded steps.

  • crm_list_unread_messages

    List local CRM contacts with unread messages, sorted by recency. Read-only.

  • crm_lookup_contact

    Get the stored fact sheet for one local CRM contact by handle. Read-only.

  • device_healthwrite action

    Run a comprehensive device health check. iOS includes Appium/WDA status, active session details, and recovery steps.

  • explore_app

    Explore an app's UI autonomously using BFS. Launches the app, taps every interactive element, builds a state graph. Returns JSON with discovered screens, elements, and transitions. Use this to understand an unfamiliar app before writing automation for it.

  • extract_articles

    Extract likely visible article/headline candidates from the current browser page.

  • extract_visible_text

    Extract visible text from the current screen with browser chrome filtered by default.

  • find_on_screen

    Find specific text on the screen and return its location. Searches XML elements first (fast), falls back to OCR if not found. Use this to check if a button, label, or message is visible. Returns JSON with {text, x, y, w, h, method} or null if not found.

  • fix_device_health

    Apply a recovery action returned by device_health.recommended_fix.

  • force_stop

    Force-stop an Android package or terminate an iOS bundle id.

  • get_crash

    Return the full stack trace of the MOST RECENT crash (from the crash buffer).

  • get_current_url

    Get the current browser URL when the platform exposes it.

  • get_elements

    Get all UI elements on the current screen as a JSON array. Each element has: idx, text, content_desc, resource_id, class, bounds, center, clickable, scrollable. Use element idx with tap_element(). Call this to understand the screen layout before acting.

  • get_notifications

    Get active notifications. Returns JSON array of {package, title, text}.

  • get_phone_state

    Get current app, activity, keyboard state, and focused element. Quick way to check what app/screen the device is on without parsing full elements.

  • get_screen_tree

    Get an LLM-friendly indented UI hierarchy of the current screen. Each node shows: [idx] ClassName "label" [clickable] [x1,y1][x2,y2]. Use this to understand screen layout and pick which element to tap. Much more readable than raw XML — prefer this over get_elements() for planning.

  • get_screen_xml

    Get the raw normalized UI XML dump from the device. Android returns uiautomator XML; iOS returns normalized Appium/WDA XML. Use get_screen_tree() instead for a readable summary. Use this only when you need exact attribute values or the full hierarchy.

  • get_stream_info

    Return effective stream metadata without opening the stream.

  • launch_app

    Launch an app by Android package name or iOS bundle id. Use search_apps() to find it.

  • launch_intent

    Launch a full Android intent. More powerful than launch_app(). Examples: Open a URL: action="android.intent.action.VIEW" data="https://google.com" Open Settings: package="com.android.settings" Share text: action="android.intent.action.SEND" extras='{"android.intent.extra.TEXT": "hello"}'

  • list_apps

    List installed apps with human-readable names and package names or bundle ids. iOS is limited to configured/common bundle ids verified through Appium.

  • list_crashes

    List recent app crashes and ANRs (from the logcat crash buffer, no root).

  • list_devices

    List connected Android ADB devices and configured iOS Appium devices. Call this first to get the device serial you need for other tools.

  • list_packages

    List raw Android package names or iOS bundle ids. Prefer list_apps() for display names.

  • list_skills

    List all installed mobile automation skills with their actions, workflows, and platform support. Use this to discover what high-level automations are available. Prefer using run_workflow() over raw tap/swipe when a skill exists for the task.

  • list_unread_leads

    List every influencer with an unread reply in the inbox, sorted by recency.

  • long_press

    Long press at coordinates. Use for context menus, drag initiation, etc.

  • lookup_lead

    Get the full fact sheet for one influencer lead by handle.

  • ocr_region

    OCR a specific region of the screen. Coordinates in device pixels. More accurate than full-screen OCR for targeted text extraction. Returns JSON array of {text, conf, x, y, w, h} relative to the crop region.

  • ocr_screen

    OCR the entire device screen using RapidOCR. Returns all visible text with positions. Use this when UI elements are rendered as images/canvas (e.g., analytics dashboards, games, WebViews) where get_elements() returns no text. Returns JSON array of {text, conf, x, y, w, h} sorted top-to-bottom.

  • open_camera

    Open the platform camera app in a specific mode.

  • open_notifications

    Pull down the notification shade or iOS Notification Center.

  • open_url

    Open a URL in the platform browser.

  • paste_text

    Set clipboard text and immediately paste it into the currently focused field. Equivalent to clipboard_set + press_key(PASTE) in one call. Tap the target input field first to focus it, then call this.

  • press_back

    Press Back on Android or the best available iOS browser/navigation back action.

  • press_home

    Press the platform Home button. Returns to the home screen.

  • press_keywrite action

    Send a platform key event. Android accepts KEYCODE_* names, with the KEYCODE_ prefix added automatically. iOS supports WDA-backed HOME, ENTER/RETURN, and BACK/ESCAPE.

  • read_news

    Open a news page and return structured headlines plus article snippets.

  • run_actionwrite action

    Run a single skill action on the device.

  • run_flowwrite action

    Run an ordered batch of tool calls server-side in ONE round-trip.

  • run_workflowwrite action

    Run an installed skill workflow on the device.

  • screen_recording_status

    Return active screen recording status for a device.

  • screenshot

    Take a screenshot of the device screen. Returns a base64-encoded JPEG. Use this to SEE what's on screen before deciding what to tap.

  • screenshot_annotated

    Take a screenshot with numbered element labels overlaid on interactive elements. The numbers correspond to element indices from get_elements(). Use this when you want to SEE the screen with elements visually labelled. Returns base64-encoded PNG.

  • screenshot_cropped

    Take a screenshot of a specific region of the screen. Coordinates are in device pixels. Use this to zoom in on a specific area (e.g., a form field, a notification, a chart). Returns base64-encoded JPEG.

  • search_apps

    Search installed apps by name. Case-insensitive. Returns Android packages or iOS bundle ids. Example: search_apps('tiktok') → [{"name": "TikTok", "package": "com.zhiliaoapp.musically"}]

  • speak_text

    Make the phone speak text aloud using its built-in TTS engine.

  • start_screen_recording

    Start recording the device screen.

  • stop_screen_recording

    Stop a running device screen recording and save the MP4.

  • swipe

    Swipe from (x1,y1) to (x2,y2). Use for scrolling, pulling down notifications, etc. Common patterns: scroll down = swipe(dev, 540, 1400, 540, 600) scroll up = swipe(dev, 540, 600, 540, 1400)

  • tap

    Tap at exact pixel coordinates (x, y) on the device screen.

  • tap_element

    Tap a UI element by its index from get_elements(). Call get_elements() first to see what's on screen and get element indices.

  • toggle_overlay

    Toggle the numbered element overlay on the device screen. When on, interactive elements get visible numbered labels that match get_elements() indices. Useful for visual debugging or when sending screenshots to a vision model.

  • type_text

    Type text into the currently focused input field. Tap an input field first to focus it. Spaces are supported. Non-ASCII input is transliterated to the closest ASCII (adb input text is ASCII-only); for full-fidelity emoji/CJK use type_unicode() instead.

  • type_unicode

    Type unicode text into the focused field. Android uses ADBKeyboard when configured; iOS uses WDA text entry. Use type_text() for plain ASCII.

  • wait

    Pause execution for a fixed number of seconds.

  • wait_for_text

    Wait until text appears on screen and return visible text context.

  • web_search

    Open a web search in whatever browser is on the device.

Public scan report

scanner v0.1.9 · 2026-09-25 · same rubric, same numbers if you re-run it

1 medium
  • Code scan122 source files scanned20/25
  • –Live reliabilityno gateway calls yet and no remote to proben/a
  • –Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitylocal package, no credentials required12/15
  • Maintenancelast push 43 days ago12/15
  • Maintainer identityregistry namespace matches repository owner7/10

Findings (1)

  • mediumeval / new Function usedexec.eval
    ghost_in_the_droid-1.3.2/gitd/cli.py: …de DANGEROUS_PATTERNS = ["os.system(", "eval(", "exec(", "subprocess.call(", "__impor…
Overall 78/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

What the publisher says

From the Ghost in the Droid repository's README, as published. We do not edit it. Read it on GitHub

<!-- mcp-name: io.github.ghost-in-the-droid/android-agent -->

Ghost in the Droid

Summon a ghost into your phone. It sees the screen. It taps the buttons. It never sleeps.

Website &middot; Docs &middot; Skill Hub &middot; Releases

<!-- HERO VIDEO. Served from a relative repo path so it plays on the private mirror preview AND the public repo, with no release-attach dependency. GitHub renders inline; the poster + linked image are the fallback for older markdown renderers. --> ▶ Watch full HD with sound on YouTube · Download mp4

Nine agents. Nine real devices. One ghost. (Click to watch.)

The pitch, in one breath

Every AI agent can think. Almost none can touch a phone.

Ghost is the body. It gives any LLM agent a real Android phone or iPhone: it reads the screen, taps, swipes, and types through a clean tool surface, and it scales from one device on your desk to a whole phone farm. Point Claude Code, Codex, Antigravity, Cursor, your LangChain app, or a model running inside the phone itself at it, and your agent grows hands.

Bring your own brain. Keep the same body. MIT, forever.

Mix and match: the Ghost matrix

Ghost 1.3 is the only Android + iOS agent framework where platform, brain, and driver are all swappable. Pick one from each column. They all compose.

The Docker + KVM emulator pool is Android-only; iOS uses Apple's own simulator and Xcode signing, which are macOS-native.

The body stays the same 62 MCP tools no matter what you plug in. Every new model release is a free upgrade to your phone agent.

See it in action

Shortened. The full README is on GitHub.

Nothing above is checked by us. What we check is on the safety report.

Install directly

claude mcp add android-agent -- uvx ghost-in-the-droid
Add to Cursor

Ghost in the Droid: common questions

Is Ghost in the Droid MCP server safe?
Mostly: it is graded B (78/100). Read the Ghost in the Droid safety report
How do I install Ghost in the Droid?
It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
Does Ghost in the Droid need an API key?
Not as far as the registry entry and our scan can tell: no credentials are declared or required.
Is Ghost in the Droid maintained?
The last commit was 45 days ago (2026-08-13). The latest release is v1.3.2.
What can I use instead of Ghost in the Droid?
Servers from other publishers that do the same job: agent-device MCP server, Figma Context MCP server and agent-device MCP server. Compare all Ghost in the Droid alternatives.

Alternatives to Ghost in the Droid

Same job from other publishers: the closest match first, then the best rated.

All Ghost in the Droid alternatives →
  • agent-device
    MCP server for mobile app automation: verify, control, and debug iOS, Android, TV, and desktop apps
    A
  • Figma Context
    Give your coding agent access to your Figma data. Implement designs in any framework in one-shot.
    B
  • agent-device
    Let AI agents inspect, control, and debug real iOS, Android, desktop, and TV apps
    A
  • Mobilerun
    Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
    A
  • 3D AI Agent Avatar
    3D AI Agent Avatar — render any GLB, give it a Solana wallet, a voice, and pump.fun powers.
    B

More from ghost-in-the-droid →