iOS Device Control

by chrishayuk

Not rated
GitHub

About

An MCP server to control iOS simulators and real devices, enabling AI assistant integration on macOS.

Details

Author
chrishayuk
Categories
Developer Tools, Other, Productivity

Setup

Install iOS Device Control in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/chrishayuk/chuk-mcp-ios-simulator

Follow the installation instructions in the repository README, then restart your MCP client.

Comprehensive iOS device control system supporting both simulators and real devices. Available as both a standalone CLI tool and MCP (Model Context Protocol) server for AI assistant integration.

- ๐ŸŽฏ Unified Device Management: Control iOS simulators and real devices through a single interface
- ๐Ÿ“‹ Session Management: Create and manage device sessions for organized automation workflows
- ๐Ÿ“ฑ App Lifecycle: Install, launch, terminate, and manage iOS applications
- ๐ŸŽฎ UI Automation: Tap, swipe, type, and interact with device interfaces
- ๐Ÿ“ธ Media & Location: Add photos/videos, simulate GPS locations and routes
- ๐Ÿ” Debugging: Access logs, crash reports, and debugging information
- ๐Ÿค– MCP Server: Integration with Claude and other AI assistants
- โšก CLI Tool: Standalone command-line interface for direct control

- macOSwith Xcode installed
- Xcode Command Line Tools:xcode-select --install
- At least one iOS Simulator runtime

- iOS device withDeveloper Modeenabled
- ValidApple Developeraccount (for app installation)
- One or more of these tools:

- idb(Facebook's iOS Development Bridge) - Recommended
- devicectl(Xcode 15+)
- instruments(Legacy Xcode tool)

# Install with uv uv add chuk-mcp-ios # Run directly uvx chuk-mcp-ios cli status
# Install from source git clone https://github.com/yourusername/chuk-mcp-ios.git cd chuk-mcp-ios pip install -e . # Or install from PyPI (when published) pip install chuk-mcp-ios
# Check system status chuk-mcp-ios cli status # Should show available tools and devices

Based on testing, the CLI has several bugs that need fixing:
- Session Resolution: Sessions show active but commands fail to find devices
- Import Errors: Missingtimeimport causing crashes
- Device Resolution: Direct UDID usage also failing

# Use native simulator tools directly xcrun simctl list devices xcrun simctl boot "iPhone 15" xcrun simctl io booted screenshot screenshot.png xcrun simctl launch booted com.apple.Preferences
# Use the Python API directly for full functionality python3 -c " import asyncio from chuk_mcp_ios.mcp.tools import ios_create_session, ios_screenshot session = asyncio.run(ios_create_session()) print(f'Session: {session}') "
# Use MCP server for AI assistant integration uvx chuk-mcp-ios mcp # Then connect via Claude or other AI assistants
# CLI currently has issues but basic commands work: uvx chuk-mcp-ios cli status # โœ… Works uvx chuk-mcp-ios cli device list # โœ… Works uvx chuk-mcp-ios cli session list # โœ… Works uvx chuk-mcp-ios cli ui screenshot # โŒ Broken uvx chuk-mcp-ios cli app list # โŒ Broken

Here's a complete sequence that actually works:

# 1. Check your system status uvx chuk-mcp-ios cli status # 2. List available devices to see what's available uvx chuk-mcp-ios cli device list # 3. Create a new session (this gives you a fresh session ID) uvx chuk-mcp-ios cli session create --device "iPhone 15" # Note: Copy the session ID from the output, e.g., session_1749425214_4b7f748f # 4. List active sessions to verify uvx chuk-mcp-ios cli session list # 5. Use the actual session ID from step 3 for commands: # Replace YOUR_SESSION_ID with the actual ID from step 3 uvx chuk-mcp-ios cli ui screenshot YOUR_SESSION_ID -o screenshot.png # 6. Launch Settings app uvx chuk-mcp-ios cli app launch YOUR_SESSION_ID com.apple.Preferences # 7. Take another screenshot to see Settings uvx chuk-mcp-ios cli ui screenshot YOUR_SESSION_ID -o settings.png # 8. List installed apps uvx chuk-mcp-ios cli app list YOUR_SESSION_ID # 9. Clean up when done uvx chuk-mcp-ios cli session terminate YOUR_SESSION_ID
# Method 1: Try session ID first, fallback to UDID SESSION_ID="session_1749425214_4b7f748f" UDID="D5ABE678-7395-4EF6-880B-E649F4FEDEE5" # Try session ID uvx chuk-mcp-ios cli ui screenshot $SESSION_ID -o screenshot.png # If that fails, try UDID directly if [ $? -ne 0 ]; then echo "Session failed, trying UDID..." uvx chuk-mcp-ios cli ui screenshot $UDID -o screenshot.png fi # Method 2: Direct device approach (most reliable) # Get UDID from device list uvx chuk-mcp-ios cli device list # Copy the UDID and use it directly uvx chuk-mcp-ios cli ui screenshot D5ABE678-7395-4EF6-880B-E649F4FEDEE5 -o screenshot.png # Method 3: Fresh session approach # Clean slate approach if sessions are buggy uvx chuk-mcp-ios cli session terminate session_1749425214_4b7f748f uvx chuk-mcp-ios cli session terminate automation_1749424425_58872b30 NEW_SESSION=$(uvx chuk-mcp-ios cli quick-start | grep -o 'session_[a-zA-Z0-9_]') uvx chuk-mcp-ios cli ui screenshot $NEW_SESSION -o screenshot.png
# Based on your current sessions, try these in order: # 1. Try direct UDID (most likely to work) uvx chuk-mcp-ios cli ui screenshot D5ABE678-7395-4EF6-880B-E649F4FEDEE5 -o screenshot.png # 2. If UDID doesn't work, test direct simctl xcrun simctl io D5ABE678-7395-4EF6-880B-E649F4FEDEE5 screenshot test.png # 3. If simctl works but CLI doesn't, it's a CLI bug # Use Python API as workaround: python3 -c " import asyncio from chuk_mcp_ios.mcp.tools import ios_screenshot result = asyncio.run(ios_screenshot('D5ABE678-7395-4EF6-880B-E649F4FEDEE5', 'screenshot.png')) print('Success!' if result.get('success') else f'Error: {result.get(\"error\")}') "
# Auto-setup with best available device uvx chuk-mcp-ios cli quick-start # This creates a session and tells you the ID to use # Then use that ID for subsequent commands

First, check what commands are actually available:

# Check main commands chuk-mcp-ios cli --help # Check UI subcommands chuk-mcp-ios cli ui --help # Check device subcommands chuk-mcp-ios cli device --help # Check session subcommands chuk-mcp-ios cli session --help # Check app subcommands chuk-mcp-ios cli app --help
# List all available devices (simulators + real devices) chuk-mcp-ios cli device list # List only simulators chuk-mcp-ios cli device list --type simulator # Show device details chuk-mcp-ios cli device info DEVICE_UDID # Boot a specific simulator chuk-mcp-ios cli device boot DEVICE_UDID # Shutdown simulator chuk-mcp-ios cli device shutdown DEVICE_UDID
# Create session with auto-selected device chuk-mcp-ios cli session create # Create session with specific device name chuk-mcp-ios cli session create --device "iPhone 15" # Create session with specific UDID chuk-mcp-ios cli session create --udid ABCD-1234-EFGH-5678 # List active sessions chuk-mcp-ios cli session list # Terminate session chuk-mcp-ios cli session terminate session_123
# List installed apps chuk-mcp-ios cli app list session_123 # List only user apps (exclude system apps) chuk-mcp-ios cli app list session_123 --user-only # Install app from .app bundle chuk-mcp-ios cli app install session_123 /path/to/MyApp.app # Launch app by bundle ID chuk-mcp-ios cli app launch session_123 com.example.myapp # Terminate running app chuk-mcp-ios cli app terminate session_123 com.example.myapp # Uninstall app chuk-mcp-ios cli app uninstall session_123 com.example.myapp
# Take screenshot chuk-mcp-ios cli ui screenshot session_123 -o /path/to/screenshot.png # Tap at coordinates chuk-mcp-ios cli ui tap session_123 100 200 # Type text (available commands based on your CLI implementation) chuk-mcp-ios cli ui type session_123 "Hello World" # Check available UI commands chuk-mcp-ios cli ui --help

Note: The exact UI commands available depend on your CLI implementation. Checkchuk-mcp-ios cli ui --helpfor the complete list.

# Note: Check available commands with --help first chuk-mcp-ios cli --help # Location and media commands may be available under different subcommands # Check for location commands: chuk-mcp-ios cli location --help # if location subcommand exists chuk-mcp-ios cli media --help # if media subcommand exists # If not available via CLI, use Python API: python3 -c " from chuk_mcp_ios.core.media_manager import UnifiedMediaManager media = UnifiedMediaManager() media.set_location_by_name('your_session_id', 'San Francisco') "

The CLI structure may differ from this documentation. Always check available commands:

# Discover main command structure chuk-mcp-ios cli --help # Check subcommands for each area chuk-mcp-ios cli device --help chuk-mcp-ios cli session --help chuk-mcp-ios cli app --help chuk-mcp-ios cli ui --help # If certain commands aren't available in CLI, they may be: # 1. Available only via MCP tools # 2. Available only via Python API # 3. Named differently than documented # Example: Check what UI commands actually exist chuk-mcp-ios cli ui --help # Output might show: tap, screenshot, type (but not press, swipe, etc.)
# If CLI command doesn't exist, try Python API: python3 -c " import asyncio from chuk_mcp_ios.mcp.tools import ios_press_button result = asyncio.run(ios_press_button('session_123', 'home')) print(result) " # Or check if it's an MCP-only feature chuk-mcp-ios mcp # Start MCP server and use via AI assistant
# Start MCP server (stdio mode) chuk-mcp-ios mcp # Start with specific configuration chuk-mcp-ios mcp --host localhost --port 8080 # With debug logging chuk-mcp-ios mcp --log-level DEBUG

Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json):

{ "mcpServers": { "ios-control": { "command": "uvx", "args": ["chuk-mcp-ios", "mcp"], "env": { "LOG_LEVEL": "INFO" } } } }

Once connected to Claude, you can use natural language:

๐Ÿง‘ "Take a screenshot of the current iOS simulator" ๐Ÿค– I'll take a screenshot for you... โœ… Screenshot saved to screenshot_20231215_143022.png ๐Ÿง‘ "Launch the Settings app and navigate to WiFi settings" ๐Ÿค– I'll launch Settings and help you navigate... โœ… Settings app launched โœ… Tapped on WiFi settings ๐Ÿง‘ "Set the device location to Tokyo and open Maps" ๐Ÿค– Setting location to Tokyo and opening Maps... โœ… Location set to Tokyo, Japan (35.6762, 139.6503) โœ… Maps app launched ๐Ÿง‘ "Install the app at /Users/me/MyApp.app and launch it" ๐Ÿค– I'll install and launch the app for you... โœ… App MyApp installed successfully โœ… App launched: com.example.myapp ๐Ÿง‘ "Simulate a user scrolling through a photo gallery" ๐Ÿค– I'll simulate scrolling through photos... โœ… Photos app launched โœ… Performed swipe gestures to scroll through gallery
// Session Management ios_create_session() ios_list_sessions() ios_terminate_session() // Device Control ios_list_devices() ios_boot_device() ios_shutdown_device() // App Management ios_install_app() ios_launch_app() ios_terminate_app() ios_uninstall_app() ios_list_apps() // UI Automation ios_tap() ios_double_tap() ios_long_press() ios_swipe() ios_swipe_direction() ios_input_text() ios_press_button() ios_screenshot() ios_record_video() ios_get_screen_info() // Media & Location ios_set_location() ios_set_location_by_name() ios_add_media() // Utilities ios_open_url() ios_set_status_bar() ios_set_appearance() ios_clear_keychain() ios_get_logs() ios_set_permission() ios_focus_simulator()
from chuk_mcp_ios.core.device_manager import UnifiedDeviceManager from chuk_mcp_ios.core.session_manager import UnifiedSessionManager from chuk_mcp_ios.core.ui_controller import UnifiedUIController # Initialize managers device_manager = UnifiedDeviceManager() session_manager = UnifiedSessionManager() ui_controller = UnifiedUIController() # Set up session manager for UI controller ui_controller.set_session_manager(session_manager) # Create automation session session_id = session_manager.create_automation_session() print(f"Created session: {session_id}") # Take screenshot screenshot_path = ui_controller.take_screenshot(session_id, "test.png") print(f"Screenshot saved: {screenshot_path}") # Interact with UI ui_controller.tap(session_id, 100, 200) ui_controller.swipe_up(session_id) ui_controller.input_text(session_id, "Hello World") # Clean up session_manager.terminate_session(session_id)
from chuk_mcp_ios.core import  import time async def automate_app_testing(): """Example: Automated app testing workflow.""" # Initialize managers device_mgr = UnifiedDeviceManager() session_mgr = UnifiedSessionManager() app_mgr = UnifiedAppManager() ui_ctrl = UnifiedUIController() # Link managers app_mgr.set_session_manager(session_mgr) ui_ctrl.set_session_manager(session_mgr) try: # Create session with iPhone simulator session_id = session_mgr.create_automation_session({ 'device_name': 'iPhone 15' }) # Install test app app_info = app_mgr.install_app( session_id, '/path/to/TestApp.app', AppInstallConfig(launch_after_install=True) ) # Wait for app to load time.sleep(3) # Take screenshot of app launch ui_ctrl.take_screenshot(session_id, 'app_launch.png') # Perform test interactions ui_ctrl.tap(session_id, 200, 300) # Tap login button ui_ctrl.input_text(session_id, 'test@example.com') ui_ctrl.tap(session_id, 200, 400) # Tap password field ui_ctrl.input_text(session_id, 'password123') ui_ctrl.tap(session_id, 200, 500) # Tap submit # Wait and verify time.sleep(2) ui_ctrl.take_screenshot(session_id, 'after_login.png') # Get app logs logs = logger_mgr.get_app_logs(session_id, app_info.bundle_id) print(f"Found {len(logs)} log entries") finally: # Clean up if 'session_id' in locals(): session_mgr.terminate_session(session_id) # Run the automation import asyncio asyncio.run(automate_app_testing())

- Connect device to Mac with Xcode
- Settings โ†’ Privacy & Security โ†’ Developer Mode
- Toggle ON and restart device

# Using Homebrew brew install idb-companion # Using pip pip install fb-idb

- Connect device via USB
- Tap "Trust" when prompted on device

# List real devices chuk-mcp-ios cli device list --type real # Create session with real iPhone chuk-mcp-ios cli session create --device "Chris's iPhone" # Install app (requires developer certificate) chuk-mcp-ios cli app install session_123 MyApp.ipa # Same UI automation works on real devices chuk-mcp-ios cli ui screenshot session_123 -o real_device.png
# Tool paths (if not in PATH) export IOS_CONTROL_SIMCTL_PATH="/usr/bin/xcrun simctl" export IOS_CONTROL_IDB_PATH="/usr/local/bin/idb" export IOS_CONTROL_DEVICECTL_PATH="/usr/bin/xcrun devicectl" # Timeouts export IOS_CONTROL_DEFAULT_TIMEOUT=30 export IOS_CONTROL_BOOT_TIMEOUT=60 # Logging export IOS_CONTROL_LOG_LEVEL=INFO export IOS_CONTROL_LOG_DIR="$HOME/.ios-control/logs"
defaults: timeout: 30 screenshot_format: png devices: preferred_simulator: "iPhone 15 Pro" auto_boot: true logging: level: INFO file_logging: true mcp: host: localhost port: 8080
# Interactive demo (menu-driven) python -m chuk_mcp_ios.examples.interactive_demo # Automated end-to-end demo python -m chuk_mcp_ios.examples.automated_demo # MCP server demonstration python -m chuk_mcp_ios.examples.e2e_mcp_demo # Web scraping demo (Techmeme) python -m chuk_mcp_ios.examples.techmeme --auto
# examples/custom_automation.py from chuk_mcp_ios import  def test_settings_navigation(): """Test navigating through iOS Settings.""" with AutomationSession() as session: # Launch Settings session.launch_app('com.apple.Preferences') session.screenshot('settings_main.png') # Navigate to WiFi session.tap_text('Wi-Fi') session.screenshot('wifi_settings.png') # Navigate back session.tap_back_button() session.screenshot('settings_back.png') if __name__ == "__main__": test_settings_navigation()
chuk-mcp-ios/ โ”œโ”€โ”€ core/ # Core functionality (device-agnostic) โ”‚ โ”œโ”€โ”€ base.py # Base classes and interfaces โ”‚ โ”œโ”€โ”€ device_manager.py # Unified device management โ”‚ โ”œโ”€โ”€ session_manager.py # Session lifecycle management โ”‚ โ”œโ”€โ”€ app_manager.py # App installation and control โ”‚ โ”œโ”€โ”€ ui_controller.py # UI automation and gestures โ”‚ โ”œโ”€โ”€ media_manager.py # Photos, videos, and location โ”‚ โ”œโ”€โ”€ logger_manager.py # Logging and crash reports โ”‚ โ””โ”€โ”€ utilities_manager.py # Misc utilities and settings โ”œโ”€โ”€ devices/ # Device-specific implementations โ”‚ โ”œโ”€โ”€ simulator.py # iOS Simulator support โ”‚ โ”œโ”€โ”€ real_device.py # Real device support โ”‚ โ””โ”€โ”€ detector.py # Device discovery and detection โ”œโ”€โ”€ mcp/ # MCP server implementation โ”‚ โ”œโ”€โ”€ tools.py # MCP tool definitions โ”‚ โ”œโ”€โ”€ models.py # Pydantic models for validation โ”‚ โ””โ”€โ”€ main.py # MCP server entry point โ”œโ”€โ”€ cli/ # Command-line interface โ”‚ โ””โ”€โ”€ main.py # CLI entry point and commands โ””โ”€โ”€ examples/ # Usage examples and demos โ”œโ”€โ”€ interactive_demo.py โ”œโ”€โ”€ automated_demo.py โ”œโ”€โ”€ e2e_mcp_demo.py โ””โ”€โ”€ techmeme.py
# Clone repository git clone https://github.com/yourusername/chuk-mcp-ios.git cd chuk-mcp-ios # Install in development mode with dev dependencies pip install -e ".[dev]" # Or with uv uv sync --dev
# Run all tests pytest # Run with coverage pytest --cov=chuk_mcp_ios # Run specific test file pytest tests/test_device_manager.py # Run integration tests (requires simulators) pytest tests/integration/ -m "not slow"
# Format code black src/ tests/ # Sort imports isort src/ tests/ # Type checking mypy src/ # Lint flake8 src/

- Add interfacestocore/base.py
- Implement functionalityin appropriate core module
- Add MCP toolinmcp/tools.pywith proper validation
- Add CLI commandincli/main.py
- Write testsintests/
- Add examplesinexamples/
- Update documentation
- Session Resolution Bug: Sessions show active but can't be used
- Missing Import Error:name 'time' is not defined
- Device Resolution Bug: UUIDs not working either

# These errors indicate code-level issues: uvx chuk-mcp-ios cli app list session_1749426020_9ff9470b # โŒ Failed: Device not found: session_1749426020_9ff9470b uvx chuk-mcp-ios cli app list 45007866-72A3-4ACD-AD98-7EC58A726372 # โŒ Failed: name 'time' is not defined
# Bypass the CLI entirely and use simctl directly UDID="45007866-72A3-4ACD-AD98-7EC58A726372" # Take screenshot xcrun simctl io $UDID screenshot screenshot.png # Launch app xcrun simctl launch $UDID com.apple.Preferences # List installed apps (basic) xcrun simctl listapps $UDID # Boot device if needed xcrun simctl boot $UDID
# Create a simple Python script to bypass CLI issues cat << 'EOF' > ios_test.py #!/usr/bin/env python3 import asyncio import sys import os sys.path.insert(0, '.') async def main(): from chuk_mcp_ios.mcp.tools import ( ios_list_devices, ios_create_session, ios_screenshot, ios_list_apps ) # List devices print("=== Devices ===") devices = await ios_list_devices() print(devices) # Create session print("\n=== Creating Session ===") session = await ios_create_session(device_name="iPhone 15") if 'error' in session: print(f"Error: {session['error']}") return session_id = session['session_id'] print(f"Session: {session_id}") # Take screenshot print("\n=== Screenshot ===") screenshot = await ios_screenshot(session_id, "test.png") print(screenshot) # List apps print("\n=== Apps ===") apps = await ios_list_apps(session_id) print(f"Found {len(apps.get('apps', []))} apps") if __name__ == "__main__": asyncio.run(main()) EOF python3 ios_test.py

Option 3: MCP Server Usage (Most Reliable)

# Start MCP server in one terminal uvx chuk-mcp-ios mcp # In another terminal or via AI assistant, use MCP tools # This bypasses the CLI entirely and uses the core MCP functions

Direct Simulator Control (Always Works):

# List all simulators xcrun simctl list devices # Boot a specific simulator xcrun simctl boot "iPhone 15" # Take screenshot xcrun simctl io booted screenshot screenshot.png # Launch Settings xcrun simctl launch booted com.apple.Preferences # Add media xcrun simctl addmedia booted ~/Desktop/.jpg # Set location xcrun simctl location booted set 37.7749,-122.4194
# 1. Check if core imports work python3 -c " try: from chuk_mcp_ios.core.device_manager import UnifiedDeviceManager print('โœ… Core imports work') except Exception as e: print(f'โŒ Import error: {e}') " # 2. Check if time import is missing somewhere python3 -c " import chuk_mcp_ios.core.app_manager print('โœ… App manager imports work') " # 3. Minimal device test python3 -c " from chuk_mcp_ios.core.device_manager import UnifiedDeviceManager dm = UnifiedDeviceManager() devices = dm.discover_all_devices() print(f'Found {len(devices)} devices') for d in devices: print(f' {d.name}: {d.udid}') "

Session ID Resolution Problem:If sessions show as active but commands fail, this might be a bug in session-to-device resolution:

# Workaround 1: Use device UDID directly (bypass sessions) # Get UDID from session list, then use it directly UDID="D5ABE678-7395-4EF6-880B-E649F4FEDEE5" # From session list uvx chuk-mcp-ios cli ui screenshot $UDID -o screenshot.png # Workaround 2: Use quick-start for guaranteed working session uvx chuk-mcp-ios cli quick-start # Use the session ID that quick-start returns # Workaround 3: Python API bypass (if CLI has issues) python3 -c " import asyncio from chuk_mcp_ios.mcp.tools import ios_screenshot result = asyncio.run(ios_screenshot('session_1749425214_4b7f748f', 'screenshot.png')) print(result) "
# 1. System check (always works) uvx chuk-mcp-ios cli status # 2. Device listing (always works) uvx chuk-mcp-ios cli device list # 3. Direct device operations (bypass sessions) # Use UDID from device list directly uvx chuk-mcp-ios cli device info DEVICE_UDID # 4. Session management (metadata operations) uvx chuk-mcp-ios cli session list uvx chuk-mcp-ios cli session create --device "iPhone 15" uvx chuk-mcp-ios cli session terminate SESSION_ID
# Step 1: Verify simulator is actually running xcrun simctl list devices | grep Booted # Step 2: Test direct simctl access xcrun simctl io D5ABE678-7395-4EF6-880B-E649F4FEDEE5 screenshot direct_test.png # Step 3: If direct simctl works but CLI doesn't, it's a session resolution bug # Report this as an issue and use direct UDID as workaround # Step 4: Clean restart if needed uvx chuk-mcp-ios cli session terminate --all # if available # Or manually terminate each session uvx chuk-mcp-ios cli session terminate session_1749425214_4b7f748f uvx chuk-mcp-ios cli session terminate automation_1749424425_58872b30
# Problem: No devices available # Solution: Check simulators and boot one # List available devices uvx chuk-mcp-ios cli device list # Boot a simulator if none are running uvx chuk-mcp-ios cli device boot DEVICE_UDID_FROM_LIST # Then create session uvx chuk-mcp-ios cli session create --udid DEVICE_UDID_FROM_LIST
# Problem: Command like 'press' doesn't exist # Solution: Check available commands uvx chuk-mcp-ios cli ui --help # See actual UI commands uvx chuk-mcp-ios cli --help # See all available commands # Many advanced features are MCP-only or Python API-only

- Check system status:chuk-mcp-ios cli status
- Review logs:~/.ios-control/logs/
- Run diagnostics:chuk-mcp-ios cli diagnose
- Check GitHub issues:Issues page

We welcome contributions! Here's how to get started:
- Forkthe repository
- Createfeature branch (git checkout -b feature/amazing-feature)
- Makeyour changes with tests
- Formatcode (black,isort)
- Testthoroughly (pytest)
- Commitchanges (git commit -m 'Add amazing feature')
- Pushbranch (git push origin feature/amazing-feature)
- OpenPull Request

- Add tests for new features
- Update documentation
- Follow existing code style
- Add examples for complex features
- Update changelog

MIT License - seeLICENSEfile for details

- Applefor iOS Simulator and development tools
- Facebookfor idb (iOS Development Bridge)
- Anthropicfor MCP (Model Context Protocol)
- Open source communityfor tools and libraries used

- Documentation:Full docs
- Issues:
GitHub Issues
- Discussions:
GitHub Discussions
- MCP Community:
MCP Discord

Made with โค๏ธ for iOS automation and AI integration

This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.

An MCP server that uses Facebook IDB to automate iOS simulators, providing device control, input actions, and screenshots over HTTP, SSE, or stdio.

Native macOS HomeKit integration for AI assistants via Model Context Protocol

Drive a real iPhone via macOS iPhone Mirroring, taps, swipes, OCR, plus Xcode build/test automation on simulators and devices. No jailbreak.

Native macOS SSH client with 26 local MCP tools for visible terminals, SFTP, SSH keys, connections, and read-only observability.

One command, every package manager. Installs from pip, npm, and verified binary releases on macOS, Linux, and Windows.(server at https://iuymslcbbrbahxbfuzrr.supabase.co/functions/v1/mcp)

No reviews yet โ€” be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.