Android AI MCP is a personal Android automation app that uses Accessibility APIs and cloud LLM planning, with mandatory preview/confirmation before execution.
- Configure provider keys and model IDs in Setup.
- Enable Accessibility service.
- Enter command manually, by voice wake, or from a saved template.
- Generate plan (validated against configured max steps).
- Review preview and confirm execution.
- Track runs in Logs.
- OpenRouter (strict free-model policy)
- NVIDIA NIM
Model ID selection is runtime-configurable:
- OpenRouter model ID: stored in app settings (
openRouterModelId) - NVIDIA model ID: stored in app settings (
nvidiaModelId)
OpenRouter free enforcement:
- App fetches OpenRouter model catalog and filters models with zero prompt + completion price.
- If catalog is unavailable, only
:freemodel IDs are allowed. - If catalog is available and selected model is not free, plan generation is blocked.
- On-device Android SpeechRecognizer
- Wake word configurable (default
AI) - Voice service runs as a foreground microphone service when enabled
- Voice commands still require in-app preview confirmation before execution
- Save command + provider + model + limits as reusable templates
- Run templates repeatedly from Templates tab
- Encrypted password storage with Android Keystore AES-GCM
- Match by
appPackage + fieldHint + accountHint - Biometric session unlock required before fills
fill_saved_passwordsteps require explicit runtime approval- No plaintext passwords are written to logs
- Mandatory plan preview before execution
- Stop execution button
- Manual handoff mode when secure/blocked screens are detected
- Configurable max step limit (
1-50, default20) - Sequential execution with delay (default
700ms)
- JDK 17
- Android SDK (compile/target SDK 36)
- Gradle wrapper in repo
./gradlew :app:assembleDebug-PciVersionCode=<int>: overridesdefaultConfig.versionCodefor CI builds.-PciSignDebug=true|false: signs debug with stable keystore whentrueand signing config exists.
Copy keystore.properties.example to keystore.properties in project root, or set equivalent environment variables.
Expected values:
storeFilestorePasswordkeyAliaskeyPassword
Then run:
./gradlew :app:assembleReleaseThe workflow requires these repository secrets:
KEYSTORE_BASE64(raw base64 string only, notKEYSTORE_BASE64=...)KEY_ALIASKEY_PASSWORDSTORE_PASSWORD
- Release APK package:
com.android.ai.mcp - Debug APK package:
com.android.ai.mcp.debug - CI sets
versionCodefrom GitHub run number to keep updates monotonic. - CI builds and publishes both signed debug and signed release APKs.
- Use the signed release APK for normal installs and updates.
- Use the signed debug APK for side-by-side testing only.
- Enable install from unknown apps for the installer app you use.
One-time migration if older conflicting installs exist:
- Uninstall
com.android.ai.mcp - Uninstall
com.android.ai.mcp.debug - Install the latest signed release APK
Use this script to capture exact INSTALL_FAILED_* output and apply deterministic fixes:
powershell -ExecutionPolicy Bypass -File .\scripts\triage-android-install.ps1 -ApkPath "C:\path\to\app-release.apk"If you hit INSTALL_FAILED_UPDATE_INCOMPATIBLE and want automatic cleanup across users:
powershell -ExecutionPolicy Bypass -File .\scripts\triage-android-install.ps1 -ApkPath "C:\path\to\app-release.apk" -ApplyFixNotes:
- Script checks
com.android.ai.mcpandcom.android.ai.mcp.debug. - Pass
-AdbPath "C:\path\to\adb.exe"ifadbis not on PATH.
Built by M Sai Sohan (@sohan-a11y)
If you find this project useful, please consider giving it a ⭐ on GitHub!