MCP HubMCP Hub
minhalvp

android-mcp-server

by: minhalvp

An MCP server that provides control over Android devices via adb

275created 28/02/2025
Visit
Android
ADB

📌Overview

Purpose: To provide programmatic control over Android devices through the Model Context Protocol (MCP) server utilizing ADB.

Overview: The Android MCP Server enables efficient management and interaction with Android devices by exposing multiple functionalities such as command execution, screenshot capture, and UI analysis. This server acts as a bridge for MCP clients like Claude desktop and various code editors, facilitating device management operations.

Key Features:

  • ADB Command Execution: Allows users to run any Android Debug Bridge (ADB) command, providing a powerful way to interact with the device programmatically.

  • Device Screenshot Capture: Enables capturing screenshots directly from the Android device, assisting in debugging and UI testing.

  • UI Layout Analysis: Provides detailed information about the user interface layout, including properties of clickable elements, thereby aiding in UI development and analysis.

  • Device Package Management: Allows retrieval of installed packages on the device, simplifying application management for developers.


Android MCP Server

An MCP (Model Context Protocol) server that provides programmatic control over Android devices through ADB (Android Debug Bridge). This server exposes various Android device management capabilities accessible by MCP clients like Claude desktop and Code editors (e.g. Cursor).

Features

  • 🔧 ADB Command Execution
  • 📸 Device Screenshot Capture
  • 🎯 UI Layout Analysis
  • 📱 Device Package Management

Prerequisites

  • Python 3.x
  • ADB (Android Debug Bridge) installed and configured
  • Android device or emulator (not tested)

Installation

  1. Clone the repository:
git clone https://github.com/minhalvp/android-mcp-server.git
cd android-mcp-server
  1. Install dependencies:

This project uses uv for project management via various installation methods.

uv python install 3.11
uv sync

Configuration

The server uses a simple YAML configuration file (config.yaml) to specify the target Android device.

Customizing Configuration

  1. Create a new configuration file:
touch config.yaml
  1. Configure your device:
device:
  name: "google-pixel-7-pro:5555" # Your device identifier from 'adb devices'

Usage

An MCP client is needed to use this server. The Claude Desktop app is an example of an MCP client. To use this server with Claude Desktop:

  1. Locate your Claude Desktop configuration file:

    • Windows: %APPDATA%\Claude\claude_desktop_config.json
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  2. Add the Android MCP server configuration to the mcpServers section:

{
  "mcpServers": {
    "android": {
      "command": "path/to/uv",
      "args": ["--directory", "path/to/android-mcp-server", "run", "server.py"]
    }
  }
}

Replace:

  • path/to/uv with the actual path to your uv executable
  • path/to/android-mcp-server with the absolute path to where you cloned this repository

Available Tools

The server exposes the following tools:

def get_packages() -> str:
    """
    Get all installed packages on the device.
    Returns:
        str: A list of all installed packages on the device as a string
    """
def execute_adb_command(command: str) -> str:
    """
    Executes an ADB command and returns the output.
    Args:
        command (str): The ADB command to execute
    Returns:
        str: The output of the ADB command
    """
def get_uilayout() -> str:
    """
    Retrieves information about clickable elements in the current UI.
    Returns a formatted string containing details about each clickable element,
    including their text, content description, bounds, and center coordinates.

    Returns:
        str: A formatted list of clickable elements with their properties
    """
def get_screenshot() -> Image:
    """
    Takes a screenshot of the device and returns it.
    Returns:
        Image: the screenshot
    """
def get_package_action_intents(package_name: str) -> list[str]:
    """
    Get all non-data actions from Activity Resolver Table for a package
    Args:
        package_name (str): The name of the package to get actions for
    Returns:
        list[str]: A list of all non-data actions from the Activity Resolver
        Table for the package
    """

Contributing

Contributions are welcome!

Acknowledgments