Ghost in the Droid MCP server
Give any LLM agent a real Android or iPhone as its body. 62 MCP tools for mobile automation.
363 stars84 downloads/wk
Reviews
Write oneNobody 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 postsRead from the package source without running it. The installed server may list more.
app_stateCheck whether an Android package or iOS bundle id is installed, running, or foreground.
browser_backNavigate back in the current browser/app context.
classify_screenClassify 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_notificationsDismiss visible notifications when the platform exposes a clear control.
clipboard_getGet the current clipboard text from the device.
clipboard_setSet clipboard text on the device. Use with press_key(PASTE) to paste into fields.
create_skillwrite actionCreate a new reusable skill from a JSON list of recorded steps.
crm_list_unread_messagesList local CRM contacts with unread messages, sorted by recency. Read-only.
crm_lookup_contactGet the stored fact sheet for one local CRM contact by handle. Read-only.
device_healthwrite actionRun a comprehensive device health check. iOS includes Appium/WDA status, active session details, and recovery steps.
explore_appExplore 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_articlesExtract likely visible article/headline candidates from the current browser page.
extract_visible_textExtract visible text from the current screen with browser chrome filtered by default.
find_on_screenFind 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_healthApply a recovery action returned by device_health.recommended_fix.
force_stopForce-stop an Android package or terminate an iOS bundle id.
get_crashReturn the full stack trace of the MOST RECENT crash (from the crash buffer).
get_current_urlGet the current browser URL when the platform exposes it.
get_elementsGet 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_notificationsGet active notifications. Returns JSON array of {package, title, text}.
get_phone_stateGet 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_treeGet 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_xmlGet 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_infoReturn effective stream metadata without opening the stream.
launch_appLaunch an app by Android package name or iOS bundle id. Use search_apps() to find it.
launch_intentLaunch 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_appsList installed apps with human-readable names and package names or bundle ids. iOS is limited to configured/common bundle ids verified through Appium.
list_crashesList recent app crashes and ANRs (from the logcat crash buffer, no root).
list_devicesList connected Android ADB devices and configured iOS Appium devices. Call this first to get the device serial you need for other tools.
list_packagesList raw Android package names or iOS bundle ids. Prefer list_apps() for display names.
list_skillsList 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_leadsList every influencer with an unread reply in the inbox, sorted by recency.
long_pressLong press at coordinates. Use for context menus, drag initiation, etc.
lookup_leadGet the full fact sheet for one influencer lead by handle.
ocr_regionOCR 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_screenOCR 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_cameraOpen the platform camera app in a specific mode.
open_notificationsPull down the notification shade or iOS Notification Center.
open_urlOpen a URL in the platform browser.
paste_textSet 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_backPress Back on Android or the best available iOS browser/navigation back action.
press_homePress the platform Home button. Returns to the home screen.
press_keywrite actionSend 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_newsOpen a news page and return structured headlines plus article snippets.
run_actionwrite actionRun a single skill action on the device.
run_flowwrite actionRun an ordered batch of tool calls server-side in ONE round-trip.
run_workflowwrite actionRun an installed skill workflow on the device.
screen_recording_statusReturn active screen recording status for a device.
screenshotTake 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_annotatedTake 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_croppedTake 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_appsSearch installed apps by name. Case-insensitive. Returns Android packages or iOS bundle ids. Example: search_apps('tiktok') → [{"name": "TikTok", "package": "com.zhiliaoapp.musically"}]
speak_textMake the phone speak text aloud using its built-in TTS engine.
start_screen_recordingStart recording the device screen.
stop_screen_recordingStop a running device screen recording and save the MP4.
swipeSwipe 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)
tapTap at exact pixel coordinates (x, y) on the device screen.
tap_elementTap a UI element by its index from get_elements(). Call get_elements() first to see what's on screen and get element indices.
toggle_overlayToggle 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_textType 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_unicodeType unicode text into the focused field. Android uses ADBKeyboard when configured; iOS uses WDA text entry. Use type_text() for plain ASCII.
waitPause execution for a fixed number of seconds.
wait_for_textWait until text appears on screen and return visible text context.
web_searchOpen 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
- 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 used
exec.evalghost_in_the_droid-1.3.2/gitd/cli.py: …de DANGEROUS_PATTERNS = ["os.system(", "eval(", "exec(", "subprocess.call(", "__impor…
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 · Docs · Skill Hub · 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
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.
- agent-deviceMCP server for mobile app automation: verify, control, and debug iOS, Android, TV, and desktop appsnot reviewedWidely usedA
- Figma ContextGive your coding agent access to your Figma data. Implement designs in any framework in one-shot.not reviewedWidely usedB
- agent-deviceLet AI agents inspect, control, and debug real iOS, Android, desktop, and TV appsnot reviewedWidely usedA
- MobilerunControl real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.not reviewedEstablishedA
- 3D AI Agent Avatar3D AI Agent Avatar — render any GLB, give it a Solana wallet, a voice, and pump.fun powers.not reviewedEstablishedB