xcode-mcp
Enables control of the iOS Simulator using the xcrun simctl command-line utility. It allows users to manage devices, install and launch apps, send push notifications, and simulate device features like GPS location.
README
xcode-mcp
MCP server for Xcode developer tools.
Installation
npm install
npm run build
Usage
Claude Desktop Configuration
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"xcode": {
"command": "node",
"args": ["/Users/YOUR_USERNAME/Projects/xcode-mcp/dist/index.js"]
}
}
}
Available Tools
iOS Simulator (simctl)
Control iOS Simulators via xcrun simctl.
| Tool | Description |
|---|---|
simctl_list |
List available simulators, device types, runtimes, or device pairs |
simctl_boot |
Boot a simulator device |
simctl_shutdown |
Shutdown a simulator device or all simulators |
simctl_install |
Install an app bundle on a simulator |
simctl_launch |
Launch an app on a simulator |
simctl_terminate |
Terminate a running app without shutting down the simulator |
simctl_uninstall |
Uninstall an app from a simulator |
simctl_openurl |
Open a URL or deep link on a simulator |
simctl_push |
Send a push notification to an app |
simctl_location |
Set or clear the simulated GPS location |
simctl_privacy |
Grant, revoke, or reset privacy permissions for an app |
simctl_io_screenshot |
Capture a screenshot from a simulator |
Device Identification
All simulator tools that require a device accept:
- Device UDID (e.g.,
"3A8C9B5F-1234-5678-9ABC-DEF012345678") - Device name (e.g.,
"iPhone 16 Pro") - Special value
"booted"for the currently booted simulator
Examples
List all devices:
{"name": "simctl_list", "arguments": {"filter": "devices"}}
Boot a simulator:
{"name": "simctl_boot", "arguments": {"device": "iPhone 16 Pro"}}
Take a screenshot:
{"name": "simctl_io_screenshot", "arguments": {"device": "booted"}}
Send a push notification:
{
"name": "simctl_push",
"arguments": {
"device": "booted",
"bundle_id": "com.example.app",
"payload": {
"aps": {
"alert": {
"title": "Test",
"body": "Hello from MCP!"
}
}
}
}
}
Set location:
{
"name": "simctl_location",
"arguments": {
"device": "booted",
"action": "set",
"latitude": 37.7749,
"longitude": -122.4194
}
}
Grant camera permission:
{
"name": "simctl_privacy",
"arguments": {
"device": "booted",
"action": "grant",
"service": "camera",
"bundle_id": "com.example.app"
}
}
WebDriverAgent (wda)
UI automation for iOS Simulator apps via WebDriverAgent. Enables tapping, swiping, typing, and finding UI elements.
| Tool | Description |
|---|---|
wda_status |
Check WebDriverAgent server connectivity |
wda_tap |
Tap at coordinates, by accessibility ID, or element ID |
wda_type |
Type text into the currently focused text field |
wda_swipe |
Perform a swipe gesture from start to end coordinates |
wda_find |
Find UI elements by accessibility ID, class name, or predicate |
wda_source |
Get the UI hierarchy (accessibility tree) as XML |
wda_home |
Press the home button |
wda_alert |
Accept or dismiss system alerts |
Prerequisites
-
Clone WebDriverAgent (one-time):
git clone https://github.com/appium/WebDriverAgent.git cd WebDriverAgent -
Start WDA on a simulator (keep running in a terminal):
xcodebuild test -project WebDriverAgent.xcodeproj \ -scheme WebDriverAgentRunner \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' -
Verify WDA is running:
curl http://localhost:8100/status
Coordinate System
All coordinates are in points (logical pixels), not physical pixels. Use wda_source to see element positions in the UI hierarchy XML.
Common Parameters
All WDA tools accept these optional parameters:
bundle_id: Activate a specific app before the actionport: WDA server port (default: 8100)
Examples
Check WDA status:
{"name": "wda_status", "arguments": {}}
Tap at coordinates:
{"name": "wda_tap", "arguments": {"x": 200, "y": 400}}
Tap by accessibility ID:
{"name": "wda_tap", "arguments": {"accessibility_id": "login_button"}}
Tap with app activation:
{"name": "wda_tap", "arguments": {"accessibility_id": "login", "bundle_id": "com.example.app"}}
Type text:
{"name": "wda_type", "arguments": {"text": "hello@example.com"}}
Swipe down (scroll up):
{
"name": "wda_swipe",
"arguments": {
"start_x": 200,
"start_y": 400,
"end_x": 200,
"end_y": 200,
"duration": 500
}
}
Find elements:
{"name": "wda_find", "arguments": {"strategy": "accessibility id", "value": "submit_button"}}
Get UI hierarchy:
{"name": "wda_source", "arguments": {}}
Handle alert:
{"name": "wda_alert", "arguments": {"action": "accept"}}
Xcode Build (xcodebuild)
Build, test, and manage Xcode projects via xcodebuild.
| Tool | Description |
|---|---|
xcodebuild_list |
List schemes, targets, and configurations for a project or workspace |
xcodebuild_build |
Build a scheme for a destination with structured result parsing |
xcodebuild_test |
Run tests and return structured results with pass/fail counts |
xcodebuild_clean |
Clean build artifacts for a scheme |
xcodebuild_show_build_settings |
Show build configuration settings |
Project Auto-Detection
All xcodebuild tools can automatically detect the project or workspace in the current directory. They prefer .xcworkspace over .xcodeproj. You can also specify explicit paths:
workspace: Path to a.xcworkspacefileproject: Path to a.xcodeprojfiledirectory: Directory to search for projects (defaults to cwd)
Destination Handling
The destination parameter accepts:
- Device names (e.g.,
"iPhone 16 Pro") - automatically resolved to simulator UDID - Full destination strings (e.g.,
"platform=iOS Simulator,name=iPhone 16 Pro")
Examples
List schemes:
{"name": "xcodebuild_list", "arguments": {}}
Build a scheme:
{
"name": "xcodebuild_build",
"arguments": {
"scheme": "MyApp",
"destination": "iPhone 16 Pro",
"configuration": "Debug"
}
}
Run tests:
{
"name": "xcodebuild_test",
"arguments": {
"scheme": "MyApp",
"destination": "iPhone 16 Pro",
"only_testing": ["MyAppTests/testLogin"]
}
}
Clean build:
{
"name": "xcodebuild_clean",
"arguments": {
"scheme": "MyApp"
}
}
Show build settings:
{
"name": "xcodebuild_show_build_settings",
"arguments": {
"scheme": "MyApp",
"configuration": "Release"
}
}
Development
# Run in development mode
npm run dev
# Build
npm run build
# Test
npm test
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.