@tool decorated Android control for Strands Agents & DevDuck.
Drive any adb-connected Android device (phone / tablet / emulator) from an LLM — let your agent text people, read notifications, launch apps, take screenshots, drive the UI, take physical photos, stream logcat events, mutate settings.
📘 Full docs: cagataycali.github.io/strands-adb
Install
pip install strands-adb
brew install android-platform-tools # or apt / pacman / winget
Enable USB debugging on your phone, plug it in, accept the trust dialog.
adb devices
# 59230DLCH0012Z device
[](https://github.com/cagataycali/awesome-strands-agents)
Quickstart
from strands import Agent
from strands_adb import adb
agent = Agent(tools=[adb])
agent("take a screenshot of my phone and describe what's on screen")
DevDuck (1 line)
export DEVDUCK_TOOLS="strands_adb:adb;strands_tools:shell"
devduck "open whatsapp and read the last message from mom"
MCP Server (Claude Code / Claude Desktop / Cursor / any MCP client)
Expose adb + recorder over the Model Context Protocol:
No install needed — just uvx:
# stdio mode (default) — for Claude Code / Claude Desktop
uvx strands-adb
# HTTP mode — multi-client, background-capable
uvx strands-adb --http --port 8000
Claude Code:
claude mcp add strands-adb -- uvx strands-adb
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"strands-adb": {
"command": "uvx",
"args": ["strands-adb"]
}
}
}
Prefer pip?
pip install "strands-adb[mcp]"
strands-adb-mcp # stdio
strands-adb-mcp --http --port 8000 # HTTP
Now any MCP client can control your Android device — screenshots, UI automation, app control, sensors, everything.
👁️ Agent can SEE the screen
screenshot returns a proper Converse API image block — the same format as strands_tools.image_reader. The agent doesn't just get a file path, it actually receives the pixels and reasons over them:
agent("take a screenshot and tell me what app is open")
# → adb(action="screenshot") returns PNG bytes in Converse image block
# → vision model reads it → "You're on the WhatsApp chat with Mom..."
Disable with include_image=False if you just want the file path.
🎬 Record What The Agent Does
Non-blocking screen recording — start before the agent acts, stop after. Review the video to see what actually happened.
adb(action="screen_record_start", output_path="/tmp/run.mp4")
agent("open whatsapp and reply to mom") # agent works while recording
result = adb(action="screen_record_stop")
print(result["merged_path"]) # single mp4, auto-stitched past 180s
90+ Actions, One Tool
| Domain | Actions |
|---|---|
| Device | list, select, info, battery, wake, unlock |
| UI | tap, swipe, type, key, gestures, smart_tap |
| Screen | screenshot (image block), screen_record, screen_record_start/stop (bg), frames, ui_dump, ui_find |
| Apps | list, launch, kill, install, uninstall, clear_data |
| Files | push, pull, ls |
| Intents | open_url, share_text, start_activity |
| Camera | camera_photo (image block), camera_video |
| Sensors | accelerometer, gyro, light, pressure, step counter |
| Thermals | CPU / skin / battery / GPU / modem temps |
| Settings | brightness, ringer, airplane, bluetooth, any setting_put |
| Logs | logcat one-shot, log_stream → event_bus, notifications_parsed |
| A11y | enable services, captions, magnification, font scale |
| Comms | dial, sms_compose, media_control, volume |
Docs
- Installation
- Quickstart
- Connect a Device — USB / wireless / SSH
- Vision — screenshots as image blocks
- Smart Tap — semantic UI automation
- Camera — physical photos
- Logcat Streaming — event bus integration
- DevDuck Integration
- Safety — production hardening
- Examples — WhatsApp, notifications, autonomous
- Architecture
- API Reference
Safety
- Dry-run mode for destructive ops
- Allowlist/denylist for package operations
- No plaintext PIN/password storage
- Full audit logging of every adb invocation
License
MIT
Release files for strands-adb 0.19.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| strands_adb-0.19.4.tar.gz | 116.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| strands_adb-0.19.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 200.5 kB
Release files / strands_adb-0.19.4.tar.gz
| Download URL | strands_adb-0.19.4.tar.gz |
|---|---|
| Size | 116.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0c406fef1ceef4aef97c78d11c96b2057abab8792d727dee021fcc54a4e4eea3
|
|
BLAKE2b-256 checksum How to use checksums |
4511591686892e9f178002e00bb224a03bd2af8eef4bd93d39b13dd977d86be6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.11
|
Release files / strands_adb-0.19.4-py3-none-any.whl
| Download URL | strands_adb-0.19.4-py3-none-any.whl |
|---|---|
| Size | 84.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b33165437dfea2e62db06cc8b9c98152f724aa7b8a875691275b423374b5ef50
|
|
BLAKE2b-256 checksum How to use checksums |
79b48667aa861d599c88eff24149781b6cf76f49534ae58bd1a73405fda2e690
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.11
|