{"skill":{"slug":"aster","displayName":"Skill","summary":"Your AI CoPilot on Mobile — or give your AI its own phone. Make calls, send SMS, speak via TTS on speakerphone, automate UI, manage files, search media, and 40+ more tools via MCP. Open source, self-hosted, privacy-first.","description":"---\nname: aster\nversion: 0.1.13\ndescription: Your AI CoPilot on Mobile — or give your AI its own phone. Make calls, send SMS, speak via TTS on speakerphone, automate UI, manage files, search media, and 40+ more tools via MCP. Open source, self-hosted, privacy-first.\nhomepage: https://aster.theappstack.in\nmetadata: {\"aster\":{\"category\":\"device-control\",\"requires\":{\"bins\":[\"node\"]},\"mcp\":{\"type\":\"http\",\"url\":\"http://localhost:5988/mcp\"}}}\n---\n\n# Aster - Your AI CoPilot on Mobile\n\nYour AI CoPilot for any Android device using MCP (Model Context Protocol) — or give your AI a dedicated phone and let it call, text, and act on its own. Fully open source and privacy-first — your data never leaves your network.\n\n**Website**: [aster.theappstack.in](https://aster.theappstack.in) | **GitHub**: [github.com/satyajiit/aster-mcp](https://github.com/satyajiit/aster-mcp)\n\n---\n\nFor screenshots of the Android app and web dashboard, visit [aster.theappstack.in](https://aster.theappstack.in).\n\n---\n\n## Setup\n\n1. **Install and start the server**:\n```bash\nnpm install -g aster-mcp\naster start\n```\n\n2. **Install the Aster Android app** on any Android device — your daily phone or a spare one for your AI — from [Releases](https://github.com/satyajiit/aster-mcp/releases) and connect to the server address shown in terminal.\n\n3. **Configure MCP** in your `.mcp.json`:\n```json\n{\n  \"mcpServers\": {\n    \"aster\": {\n      \"type\": \"http\",\n      \"url\": \"http://localhost:5988/mcp\"\n    }\n  }\n}\n```\n\n---\n\n## Security & Privacy\n\nAster is built with a **security-first, privacy-first** architecture:\n\n- **Self-Hosted** — Runs entirely on your local machine. No cloud servers, no third-party relays. Your data stays on your network.\n- **Zero Telemetry** — No analytics, no tracking, no usage data collection. What you do stays with you.\n- **Device Approval** — Every new device must be manually approved from the dashboard before it can connect or execute commands.\n- **Tailscale Integration** — Optional encrypted mesh VPN via Tailscale with WireGuard. Enables secure remote access with automatic TLS (WSS) — no port forwarding required.\n- **No Root Required** — Uses the official Android Accessibility Service API (same system powering screen readers). No rooting, no ADB hacks, no exploits. Every action is permission-gated and sandboxed.\n- **Foreground Transparency** — Always-visible notification on your Android device when the service is running. No silent background access.\n- **Local Storage Only** — All data (device info, logs) stored in a local SQLite database. Nothing is sent externally.\n- **100% Open Source** — MIT licensed, fully auditable codebase. Inspect every line of code on [GitHub](https://github.com/satyajiit/aster-mcp).\n\n---\n\n## Available Tools\n\n### Device & Screen\n- `aster_list_devices` - List connected devices\n- `aster_get_device_info` - Get device details (battery, storage, specs)\n- `aster_take_screenshot` - Capture screenshots\n- `aster_get_screen_hierarchy` - Get UI accessibility tree\n\n### Input & Interaction\n- `aster_input_gesture` - Tap, swipe, long press\n- `aster_input_text` - Type text into focused field\n- `aster_click_by_text` - Click element by text\n- `aster_click_by_id` - Click element by view ID\n- `aster_find_element` - Find UI elements\n- `aster_global_action` - Back, Home, Recents, etc.\n\n### Apps & System\n- `aster_launch_intent` - Launch apps or intents\n- `aster_list_packages` - List installed apps\n- `aster_read_notifications` - Read notifications\n- `aster_read_sms` - Read SMS messages\n- `aster_send_sms` - Send an SMS text message to a phone number\n- `aster_get_location` - Get GPS location\n- `aster_execute_shell` - Run shell commands in Android app sandbox (no root, restricted to app data directory and user-accessible storage, 30s timeout, 1MB output limit)\n\n### Files & Storage\n- `aster_list_files` - List directory contents\n- `aster_read_file` - Read file content\n- `aster_write_file` - Write to file\n- `aster_delete_file` - Delete file\n- `aster_analyze_storage` - Storage analysis\n- `aster_find_large_files` - Find large files\n- `aster_search_media` - Search photos/videos with natural language\n\n### Device Features\n- `aster_get_battery` - Battery info\n- `aster_get_clipboard` / `aster_set_clipboard` - Clipboard access\n- `aster_show_toast` - Show toast message\n- `aster_speak_tts` - Text-to-speech\n- `aster_vibrate` - Vibrate device\n- `aster_play_audio` - Play audio\n- `aster_post_notification` - Post notification\n- `aster_make_call` - Initiate phone call\n- `aster_make_call_with_voice` - Make a call, enable speakerphone, and speak AI text via TTS after pickup\n- `aster_show_overlay` - Show web overlay on device\n\n### Media Intelligence\n- `aster_index_media_metadata` - Extract photo/video EXIF metadata\n- `aster_search_media` - Search photos/videos with natural language queries\n\n---\n\n## Proactive Event Forwarding (OpenClaw Callbacks)\n\nAster can push real-time events from the phone to your AI agent via webhook. When enabled, these events arrive as HTTP POST payloads — your agent doesn't need to poll, the phone tells you what's happening.\n\nConfigure via the dashboard at `/settings/openclaw` or CLI: `aster set-openclaw-callbacks`.\n\n### Webhook Format\n\nEvents are sent as HTTP POST to the configured OpenClaw endpoint (`/hooks/agent` by default). The AI reads the `message` field. All event context is packed into `message` using standardized `[key] value` tags.\n\nExample raw HTTP POST payload for a notification event:\n```json\n{\n  \"message\": \"[skill] aster\\n[event] notification\\n[device_id] 6241e40fb71c0cf7\\n[model] samsung SM-S938B, Android 16\\n[data-app] messaging\\n[data-package] com.google.android.apps.messaging\\n[data-title] John\\n[data-text] Hey, are you free tonight?\",\n  \"wakeMode\": \"now\",\n  \"deliver\": true,\n  \"channel\": \"whatsapp\",\n  \"to\": \"+1234567890\"\n}\n```\n\n- `message` — structured event text with standard headers (this is what the AI reads)\n- `wakeMode` — always `\"now\"` (wake the agent immediately)\n- `deliver` — always `true` for real events, `false` for test pings\n- `channel` / `to` — delivery channel and recipient, configured in the dashboard\n\n### Event Format\n\nEvery event follows a standardized structure with 4 fixed headers and `[data-*]` fields:\n\n```\n[skill] aster\n[event] <event_name>\n[device_id] <device_uuid>\n[model] <manufacturer model, Android version>\n[data-key] value\n[data-key] value\n```\n\n- `[skill]` — always `aster`\n- `[event]` — event name: `sms`, `notification`, `device_online`, `device_offline`, `pairing`\n- `[device_id]` — UUID of the device (use this to target the device with Aster tools)\n- `[model]` — device manufacturer, model, and OS\n- `[data-*]` — event-specific fields, each prefixed with `data-` (e.g. `[data-app]`, `[data-sender]`)\n\n### Event Types\n\n**`sms`** — Incoming SMS\n```\n[skill] aster\n[event] sms\n[device_id] a1b2c3d4-5678-90ab\n[model] samsung SM-S938B, Android 15\n[data-sender] +1234567890\n[data-body] Hey are you free tonight?\n```\n\n**`notification`** — App notification (deduplicated against SMS)\n```\n[skill] aster\n[event] notification\n[device_id] a1b2c3d4-5678-90ab\n[model] samsung SM-S938B, Android 15\n[data-app] whatsapp\n[data-package] com.whatsapp\n[data-title] John\n[data-text] Meeting moved to 3pm\n```\n\n**`device_online`** — Approved device came online\n```\n[skill] aster\n[event] device_online\n[device_id] a1b2c3d4-5678-90ab\n[model] samsung SM-S938B, Android 15\n[data-status] connected\n```\n\n**`device_offline`** — Device went offline\n```\n[skill] aster\n[event] device_offline\n[device_id] a1b2c3d4-5678-90ab\n[model] samsung SM-S938B, Android 15\n[data-status] disconnected\n```\n\n**`pairing`** — New device needs approval (use `[device_id]` to approve)\n```\n[skill] aster\n[event] pairing\n[device_id] e5f6g7h8-9012-cdef\n[model] Samsung SM-S924B, Android 15\n[data-status] pending_approval\n[data-action] approve this device from the Aster dashboard or via aster devices approve\n```\n\n### How to React to Events\n\nWhen you receive a message with `[skill] aster`, parse the `[event]` and `[device_id]` to determine what happened and which device to act on.\n\n**SMS — reply, extract info, or escalate:**\n```\n[event] sms | [device_id] a1b2c3d4 | sender: +1234567890 | body: Running late, be there in 20\n→ aster_send_sms (deviceId: a1b2c3d4) to +1234567890: \"No worries, see you soon!\"\n\n[event] sms | [device_id] a1b2c3d4 | sender: +1800555 | body: Your OTP is 482913\n→ Extract OTP \"482913\", use aster_input_text (deviceId: a1b2c3d4) to enter it\n```\n\n**Notifications — monitor and act on behalf of user:**\n```\n[event] notification | [device_id] a1b2c3d4 | app: driver | text: Your driver is arriving\n→ aster_speak_tts (deviceId: a1b2c3d4) \"Your Uber is almost here\"\n\n[event] notification | [device_id] a1b2c3d4 | app: mShop | text: Your package was delivered\n→ aster_send_sms (deviceId: a1b2c3d4) to user: \"Your Amazon package just arrived\"\n```\n\n**Device lifecycle — manage connectivity:**\n```\n[event] device_offline | [device_id] a1b2c3d4\n→ Pause pending automations for device a1b2c3d4\n\n[event] device_online | [device_id] a1b2c3d4\n→ Resume queued tasks, aster_read_notifications (deviceId: a1b2c3d4) to catch up\n```\n\n**Pairing — approve or alert:**\n```\n[event] pairing | [device_id] e5f6g7h8 | model: Samsung SM-S924B\n→ If expected: approve device e5f6g7h8 via dashboard API\n→ If unexpected: alert user \"Unknown device SM-S924B trying to connect\"\n```\n\n---\n\n## Example Usage\n\n**Your CoPilot on Mobile:**\n```\n\"Open YouTube and search for cooking videos\"\n→ aster_launch_intent → aster_click_by_id → aster_input_text\n\n\"Find photos from my trip to Mumbai last month\"\n→ aster_search_media with query \"photos from Mumbai last month\"\n\n\"Take a screenshot and tell me what's on screen\"\n→ aster_take_screenshot → aster_get_screen_hierarchy\n```\n\n**AI's own phone — let it act for you:**\n```\n\"Call me and tell me my flight is delayed\"\n→ aster_make_call_with_voice with number, text \"Your flight is delayed 45 min, new gate B12\", waitSeconds 8\n\n\"Text me when my delivery arrives\"\n→ aster_read_notifications → aster_send_sms with number and message\n\n\"Reply to the delivery guy: Thanks, I'll be home\"\n→ aster_send_sms with number and message\n```\n\n---\n\n## Commands\n\n```bash\naster start              # Start the server\naster stop               # Stop the server\naster status             # Show server and device status\naster dashboard          # Open web dashboard\n\naster devices list       # List connected devices\naster devices approve    # Approve a pending device\naster devices reject     # Reject a device\naster devices remove     # Remove a device\n\naster set-openclaw-callbacks  # Configure event forwarding to OpenClaw\n```\n\n---\n\n## Requirements\n\n- Node.js >= 20\n- Any Android device with Aster app installed (your phone or a dedicated AI device)\n- Device and server on same network (or use [Tailscale](https://tailscale.com) for secure remote access)\n\n---\n\n**Website**: [aster.theappstack.in](https://aster.theappstack.in) | **GitHub**: [github.com/satyajiit/aster-mcp](https://github.com/satyajiit/aster-mcp)\n","tags":{"latest":"0.1.14"},"stats":{"comments":0,"downloads":4153,"installsAllTime":6,"installsCurrent":6,"stars":0,"versions":12},"createdAt":1770317422153,"updatedAt":1779076696949},"latestVersion":{"version":"0.1.14","createdAt":1770396743855,"changelog":"add proactive event forwarding, camera/video tools, alarm/contact/volume handlers","license":null},"metadata":null,"owner":{"handle":"satyajiit","userId":"s178433zqn457qqr1dkwt02mg1884dpv","displayName":"satyajiit","image":"https://avatars.githubusercontent.com/u/41864109?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1779950896631}}