Skip to main content
Glama
phantom-touch
by hieudtr8

👻 phantom-touch

An MCP server for iOS simulator automation — with clipboard-based text input that works with React Native.

phantom-touch gives AI agents full control over iOS simulators: screenshots, element inspection, gestures, app management, and most importantly — reliable text input into React Native forms.

Quick Start

Claude Desktop / Cursor

Add to your MCP configuration:

{
  "mcpServers": {
    "phantom-touch": {
      "command": "npx",
      "args": ["-y", "phantom-touch"]
    }
  }
}

That's it. No cloning, no building — just npx.

Related MCP server: app-screen-mcp

The Problem

Every existing iOS MCP tool fails at filling React Native TextInput components because:

  • HID keyboard events don't trigger onChangeText

  • WebDriverAgent setValue gets overwritten by React state

The Solution

phantom-touch uses a clipboard + paste strategy:

  1. simctl pbcopy → set simulator clipboard

  2. idb tap → focus the field

  3. Cmd+V → paste triggers onChangeText ✅

16 MCP Tools

Module

Tools

Simulator

pt_list_simulators, pt_boot_simulator, pt_shutdown_simulator

App

pt_launch_app, pt_terminate_app, pt_list_apps, pt_open_url

Screen

pt_screenshot, pt_list_elements, pt_get_screen_size

Gesture

pt_tap, pt_swipe

Input ⭐

pt_type_text, pt_press_button, pt_set_clipboard, pt_get_clipboard

Prerequisites

  • macOS with Xcode installed

  • iOS Simulator

  • IDB (iOS Development Bridge): brew install idb-companion

  • Node.js 18+

Usage Examples

Once configured, ask your AI agent:

  • "Take a screenshot of the simulator"

  • "List all UI elements on screen"

  • "Tap the Create Account button at (200, 500)"

  • "Type 'hello@example.com' into the email field at (200, 450)"

  • "Open the deep link myapp://login"

Text Input Strategies

paste (default, recommended)

Uses clipboard + Cmd+V. Works with React Native controlled TextInput.

pt_type_text(text: "Hello", x: 200, y: 400, strategy: "paste")

keyboard

Uses HID keyboard events. Faster but may fail with React Native.

pt_type_text(text: "Hello", x: 200, y: 400, strategy: "keyboard")

Development

git clone https://github.com/hieudtr8/phantom-touch.git
cd phantom-touch
npm install
npm run build
npm run dev   # Run in dev mode with tsx

License

MIT

Available Tools

18 tools
pt_boot_simulatorA

Boot an iOS simulator by its UDID. The booted simulator becomes the active device for subsequent commands.

Inputs: udid (required).

pt_fill_inputA

Fill a React Native TextInput by connecting to the Hermes debugger via CDP.

This is the MOST RELIABLE method for filling React Native controlled TextInput fields. It walks the React fiber tree, finds the component matching your identifier, and calls its onChangeText callback directly inside the JS runtime.

REQUIREMENTS:

  • Metro dev server must be running (default: localhost:8081)

  • App must be in development mode (DEV = true)

  • The TextInput must be currently rendered on screen

The identifier is matched against accessibilityLabel, testID, or placeholder (case-insensitive partial match).

Inputs: value (required), identifier (required), metroUrl.

pt_get_clipboardA

Read the current contents of the simulator's clipboard/pasteboard.

Inputs: udid.

pt_get_screen_sizeA

Get the screen dimensions (width and height in pixels) of the simulator.

Inputs: udid.

pt_launch_appA

Launch an iOS application by its bundle identifier (e.g. 'com.example.myapp'). The simulator must be booted first.

Inputs: bundleId (required), udid.

pt_list_appsA

List all installed apps on the simulator with their bundle IDs and display names.

Inputs: udid.

pt_list_elementsA

List all visible UI elements on the current screen with their types, labels, values, and coordinates. Use this to find elements to tap or type into. Each element shows its position (x,y) and size.

Inputs: udid.

pt_list_inputsA

List all TextInput components currently rendered in the React Native app.

Connects to the Hermes debugger via CDP and walks the React fiber tree to find all components with an onChangeText prop. Returns their name, placeholder, accessibilityLabel, testID, and current value.

Use this to discover which inputs are available before calling pt_fill_input.

Inputs: metroUrl.

pt_list_simulatorsA

List all available iOS simulators with their UDID, name, state (Booted/Shutdown), and runtime version. Use this first to find a simulator to work with.

Inputs: no named parameters.

pt_open_urlA

Open a URL or deep link on the simulator. Can be used to open web pages in Safari or trigger deep links into apps (e.g. 'myapp://screen/profile').

Inputs: url (required), udid.

pt_press_buttonA

Press a hardware button on the simulator (Home, Lock, Siri, Apple Pay).

Inputs: button (required), udid.

pt_screenshotA

Take a screenshot of the current simulator screen. Returns the image as base64-encoded PNG. Use this to see what's currently displayed on screen.

Inputs: udid.

pt_set_clipboardA

Set the simulator's clipboard/pasteboard content. Useful for preparing text to paste into fields.

Inputs: text (required), udid.

pt_shutdown_simulatorB

Shut down a running iOS simulator.

Inputs: udid (required).

pt_swipeA

Swipe from one point to another on the screen. Use for scrolling, dismissing, or navigating between screens.

Inputs: x_end (required), y_end (required), x_start (required), y_start (required), +2 more.

pt_tapA

Tap on the screen at the specified (x, y) coordinates. Use pt_list_elements first to find the coordinates of the element you want to tap.

Inputs: x (required), y (required), udid, duration.

pt_terminate_appA

Terminate (force close) a running iOS application.

Inputs: bundleId (required), udid.

pt_type_textA

Type text into the currently focused field, or tap a field first then type.

STRATEGIES:

  • "paste" (default, RECOMMENDED): Uses clipboard + Cmd+V paste. Works reliably with React Native controlled TextInput components that use onChangeText.

  • "keyboard": Uses HID keyboard events. Faster but may NOT work with React Native controlled inputs.

IMPORTANT: For React Native apps, always use the "paste" strategy (the default). If you know the (x,y) coordinates of the text field, provide them to auto-tap and focus first.

Inputs: text (required), x, y, udid, +2 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 18 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes (e.g., pt_launch_app vs pt_list_apps). However, pt_type_text and pt_fill_input both handle text input, and pt_list_elements vs pt_list_inputs have some overlap, though descriptions clarify their specific use cases.

    Naming Consistency5/5

    All tools consistently use the pt_ prefix with verb_noun snake_case naming (e.g., pt_boot_simulator, pt_get_clipboard, pt_list_inputs). The pattern is predictable and uniform across the entire set.

    Tool Count4/5

    18 tools is on the higher end for simulator automation, but each tool covers a distinct operation (simulator control, app management, interaction, input). The count feels slightly heavy yet justified for the comprehensive feature set.

    Completeness4/5

    The server covers core simulator workflows: controlling simulators, launching apps, UI interaction, text input, and screen inspection. Missing features like device orientation or push notification simulation, but these are secondary and do not block primary automation tasks.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      An MCP server for reliable iOS Simulator automation that enables agents to control devices, read accessibility UI trees, and capture screenshots. It supports deterministic grounded actions like tapping, typing, and swiping to create a closed-loop observe-reason-act cycle.
      15
      7 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      High-performance MCP server for iOS development and test automation. Gives AI coding assistants direct access to iOS simulators with sub-20ms screenshots, UI interaction, building, testing, and an intelligent operator mode.
      10
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      MCP server to control iOS simulators for automation, enabling device management, input control, and screen capture via Facebook IDB.
      11
      MIT