Skip to main content
Glama
hieudtr8
by hieudtr8
README.md
# 👻 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:

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

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

## 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](https://fbidb.io/) (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

```bash
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

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 issues