Atlas / MCP servers / dynaevangelical2652 / android-agent

android-agentBLOCK

mcp/dynaevangelical2652/android-agent

Control Android devices through ADB with this Python automation framework for task execution and phone farm scaling.

Verdict
BLOCK
Grade
F
Trust score
50 /100
Exposed tools
35 30r · 5w · 0d
Transport
streamable-http
License
MIT
Stars
4
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://raw.githubusercontent.com/Dynaevangelical2652/android-agent/main/frontend/src/assets/agent-android-v1.7.zip)

Android-agent helps you manage your phone through your computer. You use your mouse and keyboard to perform tasks on your device. The software bridges the gap between your Windows desktop and your Android phone. It makes repetitive tasks easy by automating screen touches, swipes, and text entry.

📋 What This Tool Does

You store your mobile apps and data on your phone. This tool lets you reach those items from your desk. You connect your phone, pick a task, and let the software work. It includes a dashboard that shows your phone screen in real time. You can monitor your device status, manage files, and run scripts to handle complex workflows without manual input.

⚙️ System Requirements

Before you start, check your computer and phone.

  • Operating System: Windows 10 or Windows 11.
  • Memory: At least 4 gigabytes of RAM.
  • Storage: 500 megabytes of free space.
  • Hardware: A USB cable to connect your phone.
  • Phone Settings: Enable Developer Options and USB Debugging in your Android settings menu.

📥 How to Download and Install

  1. Visit the project website. Click the link below to go to the releases page.

Download Software Here

  1. Look for the file named android-agent-setup.exe under the latest release section.
  2. Click the file name to start the download.
  3. Save the file to your desktop for easy access.
  4. Double-click the file once the download finishes.
  5. Follow the on-screen prompts. Windows may show a security notice because the app is new. Click More Info and then Run Anyway to proceed.
  6. The installer places a shortcut on your desktop.

🔌 Connecting

Read from source at commit 97ff689f346bOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add site --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env GITHUB_TOKEN=${GITHUB_TOKEN} --env OPENROUTER_API_KEY=${OPENROUTER_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "site": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "GITHUB_TOKEN": "${GITHUB_TOKEN}",
        "OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
      }
    }
  }
}
03

Exposed tools (35)

30 read · 5 write · 0 destructive.

ToolRiskDescription
classify_screenreadClassify the current screen: what app, what type of screen (home, search, profile,
clipboard_getreadGet the current clipboard text from the device.
clipboard_setwriteSet clipboard text on the device. Use with press_key(PASTE) to paste into fields.
create_skillwriteCreate a new reusable skill from a JSON list of recorded steps.
explore_appreadExplore an Android app
find_on_screenreadFind specific text on the screen and return its location.
get_elementsreadGet all UI elements on the current screen as a JSON array.
get_notificationsreadGet active notifications. Returns JSON array of {package, title, text}.
get_phone_statereadGet current app, activity, keyboard state, and focused element.
get_screen_treereadGet an LLM-friendly indented UI hierarchy of the current screen.
get_screen_xmlreadGet the raw UI XML dump from the device (uiautomator).
launch_appreadLaunch an Android app by package name. Use search_apps() to find the package name.
launch_intentreadLaunch a full Android intent. More powerful than launch_app().
list_appsreadList all installed apps with human-readable names and package names.
list_devicesreadList all connected Android devices with serial numbers and models.
list_skillsreadList all installed Android automation skills with their actions and workflows.
long_pressreadLong press at coordinates. Use for context menus, drag initiation, etc.
ocr_regionreadOCR a specific region of the screen. Coordinates in device pixels.
ocr_screenreadOCR the entire device screen using RapidOCR. Returns all visible text with positions.
open_notificationsreadPull down the notification shade.
press_backreadPress the Android Back button.
press_homereadPress the Android Home button. Returns to home screen.
press_keywriteSend a key event. key examples: POWER, VOLUME_UP, VOLUME_DOWN, ENTER, TAB, MENU.
run_actionwriteRun a single skill action on the device.
run_workflowwriteRun an installed skill workflow on the device.
screenshotreadTake a screenshot of the device screen. Returns base64-encoded PNG.
screenshot_annotatedreadTake a screenshot with numbered element labels overlaid on interactive elements.
screenshot_croppedreadTake a screenshot of a specific region of the screen.
search_appsreadSearch installed apps by name. Case-insensitive. Returns matching apps with package names.
swipereadSwipe from (x1,y1) to (x2,y2). Use for scrolling, pulling down notifications, etc.
tapreadTap at exact pixel coordinates (x, y) on the device screen.
tap_elementreadTap a UI element by its index from get_elements().
toggle_overlayreadToggle the numbered element overlay on the device screen.
type_textreadType ASCII text into the currently focused input field.
type_unicodereadType unicode text (emoji, CJK, accented chars) via ADBKeyboard broadcast.
04

Trust audit

BLOCKgrade F · trust 50/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)WARN
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (5 observation(s))
Shell
declared (8 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (23)

CRITICALObfuscation / stealth · obf.decode_then_exec · CWE-506, CWE-94
gitd/tools/tts.py:32
b64decode( ... subprocess.
Why it matters. decodes a payload and executes it
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
gitd/cli.py:28
DANGEROUS_PATTERNS = ["os.system(", "eval(", "exec(", "subprocess.call(", "__import__"]
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
registry/scripts/validate_skill.py:21
DANGEROUS_PATTERNS = ["os.system(", "eval(", "exec(", "subprocess.call(", "__import__"]
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.binary · CWE-1104
frontend/src/assets/agent-android-v1.7.zip
agent-android-v1.7.zip
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
portal/gradle/wrapper/gradle-wrapper.jar
gradle-wrapper.jar
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
gitd/mcp_server.py:389
mod = importlib.import_module(f"gitd.skills.{d.name}")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
gitd/routers/benchmarks.py:62
mod = importlib.import_module(SUITES[suite]["module"])
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
gitd/routers/skills.py:84
mod = importlib.import_module(f"gitd.skills.{name}")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
gitd/skills/_run_skill.py:182
mod = importlib.import_module(f'gitd.skills.{args.skill}')
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
gitd/routers/streaming.py:441
params["callbackUrl"] = f"http://127.0.0.1:{server_port}/api/phone/webrtc-callback/{device}"
MEDIUMPrompt injection · prompt.hidden_style · CWE-94, CWE-1427
site/src/content/docs/contributing/dashboard-theme.md:241
<p style="color:var(--text-3);max-width:400px;font-size:0.9rem;
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
gitd/bots/common/adb.py:13
return base + int(hashlib.md5(serial.encode()).hexdigest()[:3], 16) % 1000
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
gitd/routers/streaming.py:31
return 19000 + int(hashlib.md5(serial.encode()).hexdigest()[:3], 16) % 1000
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
gitd/routers/streaming_viewers.py:18
return 19000 + int(hashlib.md5(serial.encode()).hexdigest()[:3], 16) % 1000
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
gitd/services/device_context.py:892
return hashlib.md5(sig.encode()).hexdigest()[:12]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
gitd/skills/auto_creator.py:133
return hashlib.md5(xml_str.encode()).hexdigest()[:12]
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
gitd/routers/streaming.py:173
png_data = _b64.b64decode(j["result"])
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
gitd/tools/tts.py:32
return base64.b64decode(inner[2])
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
frontend/package.json
pinia, vue, vue-router, @tailwindcss/vite, @tsconfig/node24, @types/node, @vitejs/plugin-vue, @vue/tsconfig
Why it matters. 14 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
site/package.json
@astrojs/starlight, astro, sharp
Why it matters. 3 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
site/public/demo/amazon.mp4
site/public/demo/amazon.mp4
Why it matters. 2006558 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
site/public/demo/reddit.mp4
site/public/demo/reddit.mp4
Why it matters. 1724139 bytes not read
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/SETUP.md:122
# or: curl -fsSL https://ollama.com/install.sh | sh  # Linux

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 97ff689f346bfull audit observations/trust-audit/mcp-server/dynaevangelical2652__android-agent.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1197ff689f346bBLOCKF50first audit
06

Questions

What is the android-agent MCP server?

Control Android devices through ADB with this Python automation framework for task execution and phone farm scaling.

What tools does android-agent expose?

35 in total: 30 read-only, 5 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is android-agent safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (50/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does android-agent need?

It reads ANTHROPIC_API_KEY, GITHUB_TOKEN and OPENROUTER_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does android-agent run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as site at 0.0.1.

How current is this page?

The grade is for one exact copy of the source (97ff689f346b), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement