phantom-touch
Allows automation of iOS simulators: screenshots, element inspection, gestures, app management, and clipboard-based text input that works with React Native controlled TextInput.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@phantom-touch Type 'hello@example.com' into the email field at (200, 450)"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
👻 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
onChangeTextWebDriverAgent
setValuegets overwritten by React state
The Solution
phantom-touch uses a clipboard + paste strategy:
simctl pbcopy→ set simulator clipboardidb tap→ focus the fieldCmd+V→ paste triggersonChangeText✅
16 MCP Tools
Module | Tools |
Simulator |
|
App |
|
Screen |
|
Gesture |
|
Input ⭐ |
|
Prerequisites
macOS with Xcode installed
iOS Simulator
IDB (iOS Development Bridge):
brew install idb-companionNode.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 tsxLicense
MIT
Available Tools
18 toolspt_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
Scored across 18 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Appcircle mobile CI/CD platform.
Hosted iOS app intelligence and creative research MCP server.
An MCP server that automatically collects feedback on your MCP server.
The official MCP server for Capawesome documentation and Capawesome Cloud.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server to control iOS Simulators.9 npm53MIT
- AlicenseBqualityDmaintenanceAn 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.157 npm2MIT

SilbercueSwiftofficial
AlicenseNot gradedqualityBmaintenanceHigh-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.10MIT- AlicenseNot gradedqualityCmaintenanceMCP server to control iOS simulators for automation, enabling device management, input control, and screen capture via Facebook IDB.11MIT