Skip to main content
Glama

vphone-mcp

MCP server for programmatic control of vphone-cli iOS VMs. Enables AI-driven E2E testing by exposing the VM's display, touch input, and navigation as MCP tools.

How it works

Claude Code / Claude Desktop
    │ MCP (stdio)
    ▼
vphone-mcp (Python)
    │ Unix socket (JSON)
    ▼
vphone-cli (Swift, vm/vphone.sock)
    │ Virtualization.framework
    ▼
iOS 26 VM

Every action returns a compact grayscale screenshot (~20-30KB) inline in the response, so the LLM can see what happened without a separate call.

Related MCP server: iOS Device Control MCP Server

Setup

Requires uv and a running vphone-cli VM with the host control socket enabled (PR #261).

git clone https://github.com/pluginslab/vphone-mcp.git
cd vphone-mcp
uv sync

Claude Code

Add to ~/.claude/settings.json:

{
  "mcpServers": {
    "vphone": {
      "command": "uv",
      "args": ["--directory", "/path/to/vphone-mcp", "run", "vphone-mcp"],
      "env": {
        "VPHONE_SOCK": "/path/to/vphone-cli/vm/vphone.sock"
      }
    }
  }
}

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "vphone": {
      "command": "uv",
      "args": ["--directory", "/path/to/vphone-mcp", "run", "vphone-mcp"],
      "env": {
        "VPHONE_SOCK": "/path/to/vphone-cli/vm/vphone.sock"
      }
    }
  }
}

Tools

Hardware Keys

Tool

Description

go_home

Press home button

press_power

Lock/wake the screen

volume_up

Volume up

volume_down

Volume down

Screenshots

Tool

Description

screenshot

Capture the VM display (returns embedded image)

Pre-mapped Navigation

Tool

Description

open_app(name)

Open an app by name from the home screen

tap_back

Tap the iOS back button (top-left)

scroll_down

Scroll down on current screen

scroll_up

Scroll up on current screen

open_notification_center

Swipe down from top-left

open_control_center

Swipe down from top-right

open_app_switcher

Slow swipe up from bottom

open_search

Tap the home screen Search bar

swipe_to_next_page

Swipe to next home screen page

swipe_to_previous_page

Swipe to previous home screen page

Supported app names for open_app: FaceTime, Calendar, Photos, Mail, Notes, Reminders, Clock, TV, Games, App Store, Maps, Health, Wallet, Settings, Phone, Safari, Messages, Music.

Raw Interaction

Tool

Description

tap(x, y)

Tap at pixel coordinates (1290x2796)

swipe(x1, y1, x2, y2, duration_ms)

Swipe between two points

Use screenshot() first to identify coordinates for app-specific UI elements.

Example session

User: Open Settings and navigate to General > About

Claude: [calls open_app("Settings")]
        → sees Settings list
        [calls tap(400, 1880)]
        → sees General page
        [calls tap(400, 1100)]
        → sees About page with iOS 26.1, Serial: vphone-1337

Configuration

Env var

Description

VPHONE_SOCK

Path to vphone.sock (auto-discovered if not set)

License

MIT

Available Tools

17 tools
go_homeA

Press the home button to return to the home screen.

Inputs: no named parameters. Returns: result

open_appA

Open an app from the home screen by name.

First presses home to ensure we're on the home screen, then taps the app.

Supported apps: FaceTime, Calendar, Photos, Mail, Notes, Reminders, Clock, TV, Games, App Store, Maps, Health, Wallet, Settings, Phone, Safari, Messages, Music.

Inputs: name (required). Returns: result

open_app_switcherA

Slow swipe up from bottom to open the App Switcher.

Inputs: no named parameters. Returns: result

open_control_centerA

Swipe down from the top-right to open Control Center.

Inputs: no named parameters. Returns: result

open_notification_centerB

Swipe down from the top-left to open Notification Center.

Inputs: no named parameters. Returns: result

press_powerB

Press the power button (lock/wake).

Inputs: no named parameters. Returns: result

screenshotA

Take a screenshot of the VM display and return it as an image.

Returns the screenshot as an embedded image that can be analyzed visually.

Inputs: no named parameters.

scroll_downB

Scroll down on the current screen.

Inputs: no named parameters. Returns: result

scroll_upB

Scroll up on the current screen.

Inputs: no named parameters. Returns: result

swipeA

Swipe from one point to another.

Coordinates are in pixels matching the screenshot dimensions (1290x2796).

Args: x1: Start X coordinate y1: Start Y coordinate x2: End X coordinate y2: End Y coordinate duration_ms: Swipe duration in milliseconds (default 300)

Inputs: x1 (required), y1 (required), x2 (required), y2 (required), +1 more. Returns: result

swipe_to_next_pageB

Swipe left to go to the next home screen page.

Inputs: no named parameters. Returns: result

swipe_to_previous_pageA

Swipe right to go to the previous home screen page.

Inputs: no named parameters. Returns: result

tapA

Tap at specific pixel coordinates on the screen.

Coordinates are in pixels matching the screenshot dimensions (1290x2796). Use screenshot() first to identify the target position.

Args: x: Horizontal pixel coordinate (0=left, 1290=right) y: Vertical pixel coordinate (0=top, 2796=bottom)

Inputs: x (required), y (required). Returns: result

tap_backA

Tap the iOS navigation back button (top-left corner).

Inputs: no named parameters. Returns: result

volume_downB

Press volume down.

Inputs: no named parameters. Returns: result

volume_upB

Press volume up.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 17 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose with no overlap; for example, go_home, open_app, and open_app_switcher perform different navigation actions, while tap, swipe, and screenshot handle distinct interactions. The descriptions specify unique functions, making it easy for an agent to select the correct tool without confusion.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern (e.g., go_home, open_app, scroll_down, tap_back), with no deviations in style or casing. This predictability enhances readability and usability for agents, ensuring a coherent naming convention throughout the set.

    Tool Count5/5

    With 17 tools, the server is well-scoped for simulating iOS device interactions, covering navigation, input, and system controls. Each tool serves a specific function (e.g., scrolling, tapping, opening apps), and the count aligns with the domain's complexity without being excessive or insufficient.

    Completeness4/5

    The tool set provides comprehensive coverage for basic iOS simulation, including navigation, app launching, gestures, and system actions. Minor gaps exist, such as lack of tools for typing text or adjusting settings beyond volume, but agents can work around these using existing tools like tap for input fields.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to automate iOS Simulator interactions including device management, UI element interaction (tap, swipe, type), screenshot capture, and execution of YAML-defined navigation workflows.
      15 npm
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables AI to control iOS simulators through the MCP protocol. Supports device management, UI automation, and network interception including screenshot capture, text input, and HTTP request mocking.
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to control real iPhones and simulators on macOS, allowing for UI interaction, testing, and automation.
      90 npm
      98
      MIT