Ghost in the Droid

io.github.ghost-in-the-droid由 GitHub 账号 ghost-in-the-droid 发布v1.3.2更新于 Oct 24, 2026

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

发布方自己的服务:droid.monster — specs

已验证STDIO仅桌面浏览器自动化开发者工具

概览

AI 生成的概览

为 AI 助手提供 62 个 MCP 工具,用于查看并操作真实的 Android 或 iPhone 屏幕:点击、滑动、输入、启动应用并运行已保存的技能。

可以做什么
Ghost in the Droid 提供 62 个用于真机移动自动化的 MCP 工具。工具涵盖屏幕读取(截图、界面树、OCR、元素查找)、触控输入(点击、滑动、长按、输入文字、硬件按键)、应用控制(启动、列出、强制停止、intent)、浏览器与 iOS 操作、剪贴板与通知,以及技能和批量流程。Android 通过 ADB 驱动,iOS 通过 Appium XCUITest 与 WebDriverAgent 驱动。它还附带本地仪表盘、调度器和技能仓库。
适用场景
当助手需要操作真实手机而不是模拟网页时使用:重复的应用操作流程、界面测试、抓取应用界面内容,或在单台设备或设备群上运行多步脚本任务。如果只需要网页浏览,或没有可用手机与 Mac,则不适合。
运行要求
本地 Python 3.10+ 进程,通过 uvx 或 pipx 从 ghost-in-the-droid 的 PyPI 包安装。Android 需要开启 USB 调试的手机,且 ADB 在 PATH 中;iOS 需要 macOS 与 Xcode、Appium 2 及 XCUITest 驱动,以及已信任的设备或已启动的模拟器,并用 GITD_ENABLE_IOS=1 启用。前端开发服务器需要 Node.js 18+。可选 LLM 密钥包括 ANTHROPIC_API_KEY、OPENAI_API_KEY 和 OPENROUTER_API_KEY;iOS 配置使用 IOS_DEVICE_UDID、IOS_APPIUM_URL、IOS_BUNDLE_ID 和 IOS_MJPEG_SERVER_PORT。
安装前请注意
这些工具会操作真实设备:点击、输入、启动应用、执行 shell 与 intent,并可能更改或删除应用数据,因此应指向一台备用手机并使用独立账号。ANTHROPIC_API_KEY、OPENAI_API_KEY、OPENROUTER_API_KEY 等 LLM 密钥从环境变量读取;使用云端大脑时,截图和提示会离开你的网络。社区技能会安装来自第三方仓库的代码,iOS 无线驱动依赖 Tailscale 网络。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Ghost in the Droid,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Ghost tapping a phone]

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

[License: MIT] [Python 3.10+] [62 MCP tools] [Android + iOS] [cloud or on-device] [MCP Toplist: Top 1% of 95K]


[Ghost driving nine real phones]

▶ 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.

Pick a platformPick a brainPick a driver
Android over USB ADBClaude Code (free with your Max/Pro sub)MCP client (Claude Code, Codex, Antigravity, Cursor, Opencode)
Android over Wi-Fi ADBAnthropic APILangChain toolkit
Android in a Docker + KVM emulator poolOpenRouter (any model, one key)LlamaIndex tool spec
iPhone over Appium + WebDriverAgentOllama (fully local)Ghost CLI (ghost "book a table" --device pixel)
iPhone over Tailscale + WebDriverAgent (wireless)vLLM (your own GPU)Web dashboard chat with a live phone stream
On-device — llama.cpp (.gguf, any quant), MediaPipe (.task, Gemma mobile bundles), MLX (Apple Silicon, opt-in). The model runs in the phone, airplane-mode worksREST API (/docs OpenAPI)

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

Nine demos, one per feature, each recorded on real devices. Click any clip for the full mp4.

MCP clients: point your agent at a phone
[Claude Code drives the phone]
Claude Code: type in the TUI, watch it drive the phone.
[Codex drives the phone]
Codex: OpenAI's CLI operating a real phone over MCP.
[Antigravity drives the phone]
Antigravity: Google's agent, same 62-tool body.
Interfaces: CLI, framework, browser
[Ghost CLI one-liner]
Ghost CLI: ghost "check reddit" --device asus.
[LangChain adapter]
LangChain: Ghost's tools in a framework agent.
[Web chat drives phone]
Web chat: chat in your browser, it drives a real phone.
On-device and iOS: the phone as body and brain
[On-device Android]
On-device Android: model runs in the app, airplane mode.
[On-device iPhone]
On-device iPhone: your iPhone talks to itself.
[iPhone real-app control]
iPhone, real app: Ghost does the Duolingo lesson.

What It Does

Open-source Python framework for controlling Android and iOS devices from one agent harness. Android runs through ADB. iOS runs through Appium XCUITest and WebDriverAgent, with real iPhones as the target path and simulators for development and CI.

Define skills for any app, run them from the dashboard or API, scale across a phone farm.

The ghost taps what you'd tap

  • Android control through ADB: tap, swipe, type, clipboard, shell, intents, and stealth variants
  • iOS control through WebDriverAgent: screenshot, accessibility tree, tap, swipe, type, app launch, clipboard, browser actions
  • Live phone screen streaming: Android MJPEG/WebRTC, iOS WDA MJPEG with screenshot fallback
  • Interactive touch-to-tap on the streamed screen
  • Multi-device phone farm with per-device job queues

Forge reusable skills for any app

  • YAML-based UI element definitions per app
  • Platform-specific selectors with elements.yaml for Android and elements_ios.yaml for iOS
  • Python action classes with precondition checks
  • Multi-step workflows that chain actions together
  • Built-in skills for TikTok and Play Store
  • iOS browser/news demo skill and smoke-level TikTok iOS workflows
  • Skill Hub: browse, search, and install skills from the community registry
  • Install from CLI: android-agent skill install tiktok

Teach the ghost new tricks

  • BFS-based auto app explorer: discovers every screen and transition
  • LLM-assisted Skill Creator: chat with AI while viewing the live device stream
  • The AI identifies UI elements and generates action/workflow code

Scale the haunting

  • Multi-device phone farm with per-device job queues
  • Bot runner: queue, schedule, and monitor automation jobs
  • Per-device integration tests with Android screen recording or iOS WDA MJPEG recording

Platform Support

SurfaceAndroidiOS
Device refADB serial, e.g. emulator-5554ios:<udid>
BackendADB + optional Portal companion appAppium XCUITest + WebDriverAgent
Real device supportYesYes, with Mac/Xcode/WDA signing
Simulator/emulator supportAndroid emulator toolingBooted iOS simulators via Appium/WDA
Live streamPortal WebRTC, MJPEG, screencapWDA MJPEG, screenshot polling fallback
Screen treeAndroid UIAutomator XMLNormalized XCTest accessibility tree
Skillselements.yaml, Android packageselements_ios.yaml, iOS bundle IDs
Android-only todayADB shell, intents, wireless ADB, Play Store helpers, Portal overlayUnsupported with stable platform errors

Why it is built this way

Skills cost $0. Thinking costs tokens. An agent should not pay an LLM to tap a button it has tapped a thousand times. Known workflows compile to skills: deterministic YAML + Python recipes that replay in seconds with zero LLM calls. Use AI for the unknown task, replay for the known one.

The phone is the easiest sandbox there is. Give the ghost an old Android with its own SIM and its own accounts, physically separate from your life. You already know how to set up a phone.

Zero-app by default. A fresh install touches nothing on the Android device: screen reads go through uiautomator, actions through adb shell input, no root, no accessibility service. Want it faster? The optional Portal companion app gives roughly 30x quicker UI reads. Want it private? On-device mode runs the whole loop inside the phone, nothing leaves it. All opt-in.

Local-first, cloud-optional. The server and dashboard run on your machine. With a local or on-device brain, your screenshots never leave your network. Pick a cloud brain and prompts go to that provider, same as any tool. Your call, always.


Requirements

  • Python 3.10+
  • Android: Android phone with USB debugging enabled and ADB on PATH (adb devices should list your phone)
  • iOS: macOS with Xcode, Appium 2 + XCUITest driver, and a trusted iPhone or booted simulator
  • Node.js 18+ (for the frontend dev server)

iOS Support

Ghost drives iPhones through Appium/WebDriverAgent with the same tool surface: ios:<udid> device refs route tap/swipe/type/screenshot to WDA, and iOS-aware browser primitives (open_url, read_news, extract_visible_text) cover web tasks. Android-only tools (shell, launch_intent, Portal overlay) return a clear platform error instead of failing silently.

iOS is opt-in: enable it with GITD_ENABLE_IOS=1 (or ios_platform_enabled=true in .env). Wireless drive rides your Tailscale tailnet, so treat the tailnet as the trust boundary. See docs/SETUP_IOS.md for Appium/WDA setup, and on-device on iPhone to run the model on the iPhone itself.


Quick Start

Zero-install with uvx (or pipx):

bash
uvx ghost-in-the-droid doctor   # green/red preflight: python, adb on PATH, devices, ports, LLM keysuvx ghost-in-the-droid login    # sign in with your Claude subscription, no API key neededuvx ghost-in-the-droid up       # server + dashboard at http://localhost:5055  (API docs at /docs)

doctor prints a checklist with fix hints instead of a stack trace when something is missing (e.g. adb not on PATH). Prefer pipx? pipx install ghost-in-the-droid gives you the ghost-in-the-droid / android-agent commands.

Sign in with your Claude subscription (no API key)

If you have a Claude Max/Pro subscription, you don't need an API key. android-agent login signs you in through the claude CLI's own Anthropic OAuth flow and points Ghost at the claude-code provider:

bash
android-agent login       # opens Anthropic sign-in via the claude CLI

Ghost never handles or stores your token; the claude CLI owns it, refresh included. doctor shows a green Claude subscription check once you are signed in. To use an API key instead, set ANTHROPIC_API_KEY (or OPENAI_API_KEY / OPENROUTER_API_KEY) and pick that provider.

Run fully local with Ollama (no keys, no cloud)

Select Ollama in the Phone Agent tab. Runs entirely on your machine with Ollama:

bash
brew install ollama       # or: curl -fsSL https://ollama.com/install.sh | shollama serve &ollama pull llama3.2:3b   # 2GB, fast, good tool-use
From a clone (for development)
bash
git clone https://github.com/ghost-in-the-droid/android-agent.gitcd android-agentpip install -e ".[all]"
android-agent doctor        # preflightandroid-agent up            # start server + dashboard on :5055
# Frontend (separate terminal)cd frontend && npm install && npx vite --host 0.0.0.0 --port 6175# Dashboard at http://localhost:6175

iOS Quick Start

iOS support requires a Mac because Appium uses Xcode's XCUITest/WebDriverAgent stack. Real iPhones also require trust, Developer Mode, UI Automation permission when prompted, and WDA signing with an Apple development team.

bash
# 1. Install and run Appium XCUITestnpm install -g appiumappium driver install xcuitestappium --base-path /
# 2. Find your iPhone or booted simulator UDIDxcrun xctrace list devicesxcrun simctl list devices booted
# 3. Configure the backend for iOSexport IOS_DEVICE_UDID="<udid>"export IOS_APPIUM_URL="http://127.0.0.1:4723"export IOS_BUNDLE_ID="com.google.chrome.ios"       # or com.apple.mobilesafariexport IOS_MJPEG_SERVER_PORT="9100"                # use unique ports per iOS device
# 4. Run a product-path smoke workflowuv run python scripts/ios_chrome_news_smoke.py \  --device "ios:<udid>" \  --bundle-id "$IOS_BUNDLE_ID" \  --url https://text.npr.org/ \  --max-headlines 5 \  --max-articles 3 \  --fix-health \  --out-dir data/ios_chrome_news_smoke

For full real-device signing, simulator, WDA MJPEG, health recovery, scheduler, and MCP setup details, see docs/SETUP_IOS.md.

Environment Variables

Copy .env.example to .env (if provided) or create a .env file in the project root. The server reads configuration via Pydantic Settings. Optional variables include:

VariablePurpose
OPENAI_API_KEYLLM features (Skill Creator, Agent Chat)
ANTHROPIC_API_KEYAlternative LLM provider
OPENROUTER_API_KEYOpenRouter LLM provider
DEFAULT_DEVICEADB serial (auto-detected if empty)
IOS_DEVICE_UDIDiPhone or simulator UDID; devices are addressed as ios:<udid>
IOS_APPIUM_URLAppium server URL, default http://127.0.0.1:4723
IOS_BUNDLE_IDDefault iOS app/browser bundle, e.g. com.google.chrome.ios or com.apple.mobilesafari
IOS_DEVICES_JSONPer-device iOS config for multiple phones/simulators, WDA ports, bundle IDs, and MJPEG ports
IOS_MJPEG_SERVER_PORTWDA MJPEG stream port; use one unique port per iOS device

Give any AI agent a mobile body (MCP)

Ghost ships an MCP server with 62 tools for real-device control. Any MCP-compatible client can use them. Android serials receive the Android implementation; ios:<udid> refs route to the iOS backend where supported and return stable unsupported-platform errors for Android-only tools. One command wires it up:

bash
# Claude Code (same shape for Codex, Cursor, VS Code Copilot, Windsurf)claude mcp add android-agent -- uvx --from ghost-in-the-droid android-agent-mcp

uvx installs the package, builds an isolated env, and runs the server. No clone, no venv.

Other clients (Codex, Claude Desktop, Cursor, VS Code, Windsurf)
bash
# Codex (OpenAI)codex mcp add android-agent -- uvx --from ghost-in-the-droid android-agent-mcp

Claude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json), Windsurf (mcp_config.json):

json
{  "mcpServers": {    "android-agent": {      "command": "uvx",      "args": ["--from", "ghost-in-the-droid", "android-agent-mcp"]    }  }}

VS Code Copilot (.vscode/mcp.json) uses the same block under a "servers" key. Contributors who clone the repo get a ready .mcp.json, all 62 tools live on first claude launch.

The 62 tools, by category:

CategoryWhat the ghost can do
Seescreenshot, get_elements, get_screen_tree, get_screen_xml, screenshot_annotated, screenshot_cropped
Touchtap, tap_element, swipe, long_press, type_text, type_unicode, press_back, press_home, press_key
Appslaunch_app, search_apps, list_apps, launch_intent, force_stop, list_packages
Understandget_phone_state, classify_screen, find_on_screen, ocr_screen, ocr_region, extract_visible_text
Browser / iOSopen_url, browser_back, get_current_url, read_news, extract_articles, wait_for_text
Devicelist_devices, clipboard_get, clipboard_set, get_notifications, open_notifications, toggle_overlay, device_health
Skillslist_skills, run_workflow, run_action, create_skill, explore_app
Batchrun_flow / chain: one call runs a whole multi-step recipe server-side, N round-trips collapse to 1
Diagnosticslist_crashes, get_crash, web_search, screen recording, camera + TTS

toggle_overlay, launch_intent, Android shell helpers, wireless ADB, and Play Store helpers remain Android-only and return stable platform errors on iOS.


Run the brain inside the phone

New in 1.3: the model can live on the device. The Ghost companion app embeds real inference engines, so the phone is both the body and the brain. Airplane mode on, agent still working, nothing leaving the device.

PlatformEngineModel formatBest for
Androidllama.cpp (JNI).ggufAny GGUF: Gemma, Llama, Mistral, Qwen, DeepSeek
AndroidMediaPipe.taskSmall Gemma models, fastest Android integration
iPhonellama.cpp (Metal).ggufSame GGUF as Android, Qwen2.5 1.5B on Metal
iPhoneMLXApple SiliconFaster decode on newer chips, opt-in

On iPhone, Qwen2.5 1.5B runs through llama.cpp on Metal and drives the phone's own UI, with an opt-in MLX engine for faster decode on Apple Silicon. Small models are kept honest with grammar-constrained decoding so tool calls always parse. Full detail on the on-device LLM page.


Skill Hub CLI

bash
android-agent skill search tiktok        # search the public registryandroid-agent skill install tiktok       # install a skillandroid-agent skill install github.com/someone/their-skillandroid-agent skill list                 # what is installedandroid-agent skill update tiktok        # update a skillandroid-agent skill validate ./my-skill/ # check before publishing

The skill registry lives in registry/ in this repo. Community skills are auto-discovered nightly from repos tagged android-agent-skill.

Teach the Ghost a New App

Two ways to forge a skill:

Community skill (your own repo): create a repo with skill.yaml, elements.yaml, actions, and workflows, tag it android-agent-skill, and it appears on the Skill Hub automatically (nightly scraper).

Official skill (PR to this repo): build and test as a community skill first, then open a PR adding it to registry/. CI validates, a maintainer reviews, and it gets the "Official" badge.

Each skill needs:

  • skill.yaml: metadata (name, version, app package or iOS bundle ID, supported platforms, actions, workflows)
  • elements.yaml: Android UI element resource IDs and descriptions
  • elements_ios.yaml: optional iOS selectors for XCTest accessibility trees
  • actions/: Python classes extending Action with precondition() and execute()
  • workflows/: Python classes extending Workflow with steps()

Prefer to let AI do it? The Skill Creator watches a live device stream and generates the action and workflow code while you narrate. Full guide in CONTRIBUTING.md.


The dashboard

A local-first control room at http://localhost:5055 (or :6175 in dev). WebRTC and MJPEG live streams, tap-on-screen, tracing, and every tab below.

TabWhat it does
Phone AgentLive device stream (MJPEG/WebRTC), tap/swipe on screen, multi-device view
SchedulerCron-style job scheduling with queue management
Skill HubBrowse installed skills, run actions and workflows, export/delete
Skill CreatorLLM-assisted skill builder with live device stream
Skill MinerAuto app explorer: BFS state discovery with screenshots
Manual RunStart/stop bot jobs, queue management, logs
TestsPer-device test runner with screen recording playback
EmulatorsCreate, boot, snapshot, and manage Android emulators
TracingPer-turn traces, token accounting, tool-call visibility

Architecture

android-agent/  run.py                    # Uvicorn entry point on :5055  gitd/    app.py                  # FastAPI app factory + plugin hook    models/  schemas/       # SQLAlchemy 2.0 ORM + Pydantic v2    routers/  services/     # Route handlers + business logic    skills/                 # Skill packages (tiktok, play_store, safari [iOS], tiktok_ios)    bots/common/adb.py      # Android Device class: tap, swipe, dump tree, wait_for    bots/common/ios.py      # iOS Device class: Appium/WDA session, UI tree, gestures    mcp_server.py           # MCP server: 62 tools for any LLM agent  frontend/                 # Vue 3 + Vite + TypeScript + Tailwind  portal/                   # Kotlin companion app (WebRTC, on-device inference)  site/                     # Docs site (Astro + Starlight)

The flow: FastAPI backend on :5055 exposes device control, skills, bots, scheduling, and streaming. The Vue SPA talks to it over /api/*. Skills define per-app interaction (elements + actions + workflows). Device backends route by ref: bare serials use bots/common/adb.py, ios:<udid> refs use bots/common/ios.py and Appium/WDA. State lives in SQLite via SQLAlchemy 2.0 and Alembic.

Benchmark (sneak peek)

Early result, with the full methodology writeup still cooking: driven by Claude Code, Ghost completes 115 of 116 tasks (99.1%) on AndroidWorld, Google Research's benchmark for Android agents, on the unmodified upstream harness. Treat this as a preview rather than a citable number. The detailed writeup and trajectories are coming. Watch the releases.


Tech Stack

LayerTechnology
BackendFastAPI, Uvicorn, Python 3.10+
DataSQLAlchemy 2.0, Alembic, Pydantic v2, SQLite (WAL)
FrontendVue 3, TypeScript, Vite, Tailwind CSS 4
Device controlADB for Android; Appium XCUITest/WebDriverAgent for iOS
StreamingAndroid MJPEG/WebRTC via Portal; iOS WDA MJPEG plus screenshot fallback
On-devicellama.cpp, MediaPipe (Android); llama.cpp on Metal, MLX (iOS)
QualityRuff, pytest, Playwright

Running Tests

Most tests are unit/API tests and run without a live device. Live Android and iOS integration tests require the relevant device stack.

bash
# Run all tests on a specific deviceDEVICE=<serial> python3 -m pytest tests/ -v --tb=short

For iOS live smoke tests:

bash
IOS_LIVE_NEWS_TEST=1 \IOS_DEVICE_UDID="<udid>" \IOS_APPIUM_URL="http://127.0.0.1:4723" \IOS_BUNDLE_ID="com.google.chrome.ios" \uv run --extra test python -m pytest tests/test_browser_news.py::test_live_ios_chrome_news_workflow

Get your Android device serial from adb devices.


Database Migrations

The project uses Alembic for schema migrations:

bash
alembic revision --autogenerate -m "add new_field to my_table"   # after editing a modelalembic upgrade head                                              # apply pendingalembic downgrade -1                                              # rollback one

Contributing

The ghost gets stronger with every skill. See CONTRIBUTING.md for adding app skills (highest impact), writing actions and workflows, backend architecture, and the PR process. Join the community on the Skill Hub.


License

MIT. The ghost is free. The ghost is open source. The ghost is yours.

来源:README.md,提交 7c09f6c

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v1.3.2最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Droid 集成