{"name":"io.github.ghost-in-the-droid/android-agent","slug":"ghost-in-the-droid-android-agent","title":"Ghost in the Droid","description":"Give any LLM agent a real Android or iPhone as its body. 62 MCP tools for mobile automation.","url":"https://mcp.market/server/ghost-in-the-droid-android-agent","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":44,"stars":363,"forks":37,"downloads_week":84,"last_push_at":"2026-08-13T22:43:42.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ghost-in-the-droid/android-agent","website":null,"version":"1.3.2","remotes":[],"packages":[{"registryType":"pypi","identifier":"ghost-in-the-droid","version":"1.3.2","transport":{"type":"stdio"}}],"tools":[{"name":"app_state","description":"Check whether an Android package or iOS bundle id is installed, running, or foreground.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_back","description":"Navigate back in the current browser/app context.","write_action":false,"price_micros":0,"input_schema":null},{"name":"classify_screen","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_notifications","description":"Dismiss visible notifications when the platform exposes a clear control.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clipboard_get","description":"Get the current clipboard text from the device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clipboard_set","description":"Set clipboard text on the device. Use with press_key(PASTE) to paste into fields.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_skill","description":"Create a new reusable skill from a JSON list of recorded steps.","write_action":true,"price_micros":0,"input_schema":null},{"name":"crm_list_unread_messages","description":"List local CRM contacts with unread messages, sorted by recency. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"crm_lookup_contact","description":"Get the stored fact sheet for one local CRM contact by handle. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_health","description":"Run a comprehensive device health check. iOS includes Appium/WDA status, active session details, and recovery steps.","write_action":true,"price_micros":0,"input_schema":null},{"name":"explore_app","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_articles","description":"Extract likely visible article/headline candidates from the current browser page.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_visible_text","description":"Extract visible text from the current screen with browser chrome filtered by default.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_on_screen","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fix_device_health","description":"Apply a recovery action returned by device_health.recommended_fix.","write_action":false,"price_micros":0,"input_schema":null},{"name":"force_stop","description":"Force-stop an Android package or terminate an iOS bundle id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_crash","description":"Return the full stack trace of the MOST RECENT crash (from the crash buffer).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_current_url","description":"Get the current browser URL when the platform exposes it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_elements","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_notifications","description":"Get active notifications. Returns JSON array of {package, title, text}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_phone_state","description":"Get current app, activity, keyboard state, and focused element. Quick way to check what app/screen the device is on without parsing full elements.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_screen_tree","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_screen_xml","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_stream_info","description":"Return effective stream metadata without opening the stream.","write_action":false,"price_micros":0,"input_schema":null},{"name":"launch_app","description":"Launch an app by Android package name or iOS bundle id. Use search_apps() to find it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"launch_intent","description":"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\"}'","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_apps","description":"List installed apps with human-readable names and package names or bundle ids. iOS is limited to configured/common bundle ids verified through Appium.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_crashes","description":"List recent app crashes and ANRs (from the logcat crash buffer, no root).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_devices","description":"List connected Android ADB devices and configured iOS Appium devices. Call this first to get the device serial you need for other tools.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_packages","description":"List raw Android package names or iOS bundle ids. Prefer list_apps() for display names.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_skills","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_unread_leads","description":"List every influencer with an unread reply in the inbox, sorted by recency.","write_action":false,"price_micros":0,"input_schema":null},{"name":"long_press","description":"Long press at coordinates. Use for context menus, drag initiation, etc.","write_action":false,"price_micros":0,"input_schema":null},{"name":"lookup_lead","description":"Get the full fact sheet for one influencer lead by handle.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ocr_region","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ocr_screen","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"open_camera","description":"Open the platform camera app in a specific mode.","write_action":false,"price_micros":0,"input_schema":null},{"name":"open_notifications","description":"Pull down the notification shade or iOS Notification Center.","write_action":false,"price_micros":0,"input_schema":null},{"name":"open_url","description":"Open a URL in the platform browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"paste_text","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"press_back","description":"Press Back on Android or the best available iOS browser/navigation back action.","write_action":false,"price_micros":0,"input_schema":null},{"name":"press_home","description":"Press the platform Home button. Returns to the home screen.","write_action":false,"price_micros":0,"input_schema":null},{"name":"press_key","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"read_news","description":"Open a news page and return structured headlines plus article snippets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_action","description":"Run a single skill action on the device.","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_flow","description":"Run an ordered batch of tool calls server-side in ONE round-trip.","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_workflow","description":"Run an installed skill workflow on the device.","write_action":true,"price_micros":0,"input_schema":null},{"name":"screen_recording_status","description":"Return active screen recording status for a device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"screenshot","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"screenshot_annotated","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"screenshot_cropped","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_apps","description":"Search installed apps by name. Case-insensitive. Returns Android packages or iOS bundle ids. Example: search_apps('tiktok') → [{\"name\": \"TikTok\", \"package\": \"com.zhiliaoapp.musically\"}]","write_action":false,"price_micros":0,"input_schema":null},{"name":"speak_text","description":"Make the phone speak text aloud using its built-in TTS engine.","write_action":false,"price_micros":0,"input_schema":null},{"name":"start_screen_recording","description":"Start recording the device screen.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_screen_recording","description":"Stop a running device screen recording and save the MP4.","write_action":false,"price_micros":0,"input_schema":null},{"name":"swipe","description":"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)","write_action":false,"price_micros":0,"input_schema":null},{"name":"tap","description":"Tap at exact pixel coordinates (x, y) on the device screen.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tap_element","description":"Tap a UI element by its index from get_elements(). Call get_elements() first to see what's on screen and get element indices.","write_action":false,"price_micros":0,"input_schema":null},{"name":"toggle_overlay","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"type_text","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"type_unicode","description":"Type unicode text into the focused field. Android uses ADBKeyboard when configured; iOS uses WDA text entry. Use type_text() for plain ASCII.","write_action":false,"price_micros":0,"input_schema":null},{"name":"wait","description":"Pause execution for a fixed number of seconds.","write_action":false,"price_micros":0,"input_schema":null},{"name":"wait_for_text","description":"Wait until text appears on screen and return visible text context.","write_action":false,"price_micros":0,"input_schema":null},{"name":"web_search","description":"Open a web search in whatever browser is on the device.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-09-25T17:24:33.101Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:24:33.036Z","components":{"code":{"score":20,"max":25,"notes":["122 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":12,"max":15,"notes":["last push 43 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"ghost_in_the_droid-1.3.2/gitd/cli.py: …de DANGEROUS_PATTERNS = [\"os.system(\", \"eval(\", \"exec(\", \"subprocess.call(\", \"__impor…"}],"inputs":{"packages":[{"registryType":"pypi","identifier":"ghost-in-the-droid","version":"1.3.2","found":true,"weeklyDownloads":84,"license":"MIT","dependencyCount":25,"publishedAt":"2026-07-19T18:54:12.716872Z","repositoryUrl":"https://github.com/ghost-in-the-droid/android-agent"}],"repo":{"found":true,"owner":"ghost-in-the-droid","repo":"android-agent","archived":false,"pushedAt":"2026-08-13T22:43:42Z","stars":363,"forks":37,"openIssues":3,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/273162000?v=4","ownerCreatedAt":"2026-04-02T16:43:22Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/273162000?v=4&s=128","source":"github"},"presence":{"stars":363,"forks":37,"downloadsWeek":84,"license":"MIT","lastPushAt":"2026-08-13T22:43:42.000Z","score":44}}}},"grade_history":[],"reviews":[]}