{"slug": "give-your-ai-agent-hands-android-automation-via-mcp", "title": "Give Your AI Agent Hands: Android Automation via MCP", "summary": "A developer has released app-automating, an open-source MCP server that gives AI agents direct control over Android emulators and physical devices. The project exposes 28 tools across three modules — device lifecycle, screen interaction via Appium and uiautomator2, and a persistent navigation memory backed by SQLite — positioning itself as a capability layer rather than a testing framework. Its navigation memory is described as the piece that distinguishes it from existing adb wrappers, which the developer says give a model hands but no memory.", "body_md": "🔗 [github.com/dkmostafa/app-automating](https://github.com/dkmostafa/app-automating)\n\n`app-automating` is an open-source MCP server that gives an AI agent real\n\ncontrol over Android — emulators and physical devices alike.\n\nIt does three things:\n\nThat third one is the part that doesn't exist elsewhere. Most tooling in this\n\nspace is a thin wrapper over `adb` — it gives a model hands but no memory, so\n\nevery session starts from zero.\n\n**28 tools, three modules:** `android_` (10) for the device lifecycle,\n\n`appium_` (13) for the screen, `navigation_memory_` (5) for the map.\n\nIt's deliberately not a testing framework. It's a *capability layer* — the\n\nagent decides what the job is.\n\n| You want to | The agent does | \n|---|---|\n| **Test an app** | Boots a clean emulator, installs the build, walks the flows, screenshots what broke | \n| **Scrape a mobile-only app** | Navigates to the data, reads the view hierarchy, pages through results | \n| **Reproduce a bug** | Replays a recorded route to the exact screen, every time | \n| **Explore an unfamiliar app** | Maps the screens it finds and builds a navigation graph as it goes | \n| **Automate a repetitive chore** | Anything you'd otherwise do by hand, thirty times | \n\nIf the task involves an Android screen and you'd rather describe it than script\n\nit, this is the layer underneath.\n\nPure Python at the core — the server itself is a remote control for other\n\npeople's tools, and it stays out of their way.\n\n| Layer | Stack | \n|---|---|\n| **MCP server** | [FastMCP](https://github.com/jlowin/fastmcp) over STDIO — no sockets, deliberately | \n| **Device control** | Appium + the `uiautomator2` driver | \n| **Emulator control** | The Android SDK directly: `adb` ,`emulator` ,`avdmanager` ,`sdkmanager` | \n| **Navigation memory** | SQLAlchemy + `aiosqlite` — one local SQLite file, no service to run | \n| **Schemas & config** | Pydantic v2 + pydantic-settings | \n| **Tooling** | Python 3.12+, `uv` ,`pytest` ,`ruff` | \n\nUnder that, the codebase is four-layer Clean Architecture — one vertical slice\n\nper module, dependencies pointing inward, and an architecture test in every\n\nmodule that walks the AST and fails the build on a layer violation. More on\n\nthat later in the post.", "url": "https://wpnews.pro/news/give-your-ai-agent-hands-android-automation-via-mcp", "canonical_source": "https://dev.to/dkmostafa/give-your-ai-agent-hands-android-automation-via-mcp-34lg", "published_at": "2026-09-11 11:29:59+00:00", "updated_at": "2026-09-11 11:40:17.460227+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-products"], "entities": ["app-automating", "MCP", "Appium", "uiautomator2", "FastMCP", "Android", "SQLAlchemy", "SQLite"], "alternates": {"html": "https://wpnews.pro/news/give-your-ai-agent-hands-android-automation-via-mcp", "markdown": "https://wpnews.pro/news/give-your-ai-agent-hands-android-automation-via-mcp.md", "text": "https://wpnews.pro/news/give-your-ai-agent-hands-android-automation-via-mcp.txt", "jsonld": "https://wpnews.pro/news/give-your-ai-agent-hands-android-automation-via-mcp.jsonld"}}