strands-ios 📱
Give your agent an iPhone.
@tool decorated iOS device control for Strands Agents & DevDuck.
Drive any USB-connected iPhone/iPad from an LLM — read syslog, launch apps, take screenshots, simulate location, drive UI (via WebDriverAgent), pull crash logs, capture pcap.
Backed by pymobiledevice3 — the canonical pure-Python replacement for libimobiledevice.
🔌 Use as an MCP server
Use strands-ios from Claude Code, Claude Desktop, Cursor, Kiro, or any MCP client — the ios tool (device control, apps, screenshots, UI automation) becomes an MCP tool.
claude mcp add ios -- uvx strands-ios
Claude Desktop config:
{
"mcpServers": {
"ios": {
"command": "uvx",
"args": ["strands-ios"]
}
}
}
Options:
strands-ios --http --port 8000 # HTTP mode, multi-client
Install
pip install strands-ios
Optional extras:
pip install 'strands-ios[ui]' # facebook-wda for UI automation
pip install 'strands-ios[vision]' # Pillow for image manipulation
Setup
-
Trust the computer on your iPhone (plug it in → "Trust This Computer")
-
Enable Developer Mode on iOS 16+ (Settings → Privacy & Security → Developer Mode)
-
For iOS 17+ developer services (DVT, screenshot, launch/kill), start a tunnel:
sudo pymobiledevice3 remote tunneld
-
For UI automation (tap/swipe/type), install WebDriverAgent on the device and run it. Then
export WDA_URL=http://localhost:8100after port-forwarding (iproxy 8100 8100).
Quickstart
from strands import Agent
from strands_ios import ios
agent = Agent(tools=[ios])
agent("take a screenshot of my iphone and describe what's on screen")
DevDuck (1 line)
export DEVDUCK_TOOLS="strands_ios:ios;strands_tools:shell"
devduck "show me the last 50 lines of syslog from my iphone"
Actions
| Domain | Actions |
|---|---|
| device | list_devices, select_device, device_info, battery, storage |
| syslog | syslog, syslog_stream_start, syslog_stream_stop |
| screen | screenshot, screenrecord_start, screenrecord_stop |
| apps | list_apps, launch, kill, install, uninstall, current_app |
| files | afc_ls, afc_pull, afc_push |
| diag | crash_logs, pcap_start, pcap_stop |
| ui (WDA) | tap, swipe, type_text, press |
| misc | open_url, set_location, reboot |
👁️ Vision
screenshot returns a proper Converse API image block — the agent actually sees the screen:
agent("screenshot my iphone and tell me if there are unread messages")
# → ios(action="screenshot") returns PNG bytes in Converse image block
# → vision model reads it → "You have 3 unread iMessages from..."
Env vars
| Var | Purpose |
|---|---|
IOS_UDID |
default device UDID |
WDA_URL |
WebDriverAgent base URL (e.g. http://localhost:8100) |
PYMOBILEDEVICE3_BIN |
override pmd3 binary path |
Differences from strands-adb
iOS is not Android. Some honest trade-offs:
| Capability | Android (adb) | iOS (pymobiledevice3) |
|---|---|---|
| Arbitrary shell | ✅ adb shell |
❌ no userland shell |
| Screenshot | ✅ trivial | ⚠️ needs DVT + dev mode |
| UI automation | ✅ input tap |
⚠️ needs WebDriverAgent |
| App install | ✅ APK | ✅ IPA (properly signed) |
| File access | ✅ full fs (with root) | ⚠️ AFC only (sandboxed) |
| Syslog | ✅ logcat |
✅ syslog live |
| Pcap | ⚠️ needs root | ✅ native |
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file strands_ios-0.1.0.tar.gz.
File metadata
- Download URL: strands_ios-0.1.0.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9fb2f00e15947f79244ad886844fc9e4eba0e693c0ffdbf3665119a8b7daaccf
|
|
| MD5 |
8252b2fc15bc8aa8b75cb23d13c9ae8c
|
|
| BLAKE2b-256 |
daadd30d2946d37565e41b08cfe3688749f421416c546b5a11cb9f6b52ea60a2
|
File details
Details for the file strands_ios-0.1.0-py3-none-any.whl.
File metadata
- Download URL: strands_ios-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2454fcce6814bdacaa107add614a6a909d202ac8bd7f4758d341e16d98a1257
|
|
| MD5 |
b12b819f4acf0285334ba3ffb7639550
|
|
| BLAKE2b-256 |
de8a230d270addd7e0ab0599e8fc4235ba3a66ca846a2198349dc0db1e160ba8
|