A comprehensive Model Context Protocol (MCP) server providing 44 tools for Apple development automation. Enable AI assistants to manage iOS/macOS/tvOS/watchOS/visionOS development environments, certificates, provisioning profiles, simulators, and more.
The server is distributed as a .NET tool and can be installed/run in several ways:
dotnet tool install -g AppleDev.Mcp.ServerThen use the appledev-mcp command directly in your MCP configuration.
dotnet tool run --global appledev-mcpdotnet dnx -y AppleDev.Mcp.ServerNOTE: Requires .NET 10 SDK for the dotnet dnx command
This downloads and runs the tool without installing it globally.
Add this configuration to your MCP client settings (e.g., Claude Desktop, Cline, etc.):
After installing with dotnet tool install -g AppleDev.Mcp.Server:
{
"mcpServers": {
"apple-dev": {
"command": "appledev-mcp",
"env": {
"APP_STORE_CONNECT_KEY_ID": "your-key-id",
"APP_STORE_CONNECT_ISSUER_ID": "your-issuer-id",
"APP_STORE_CONNECT_PRIVATE_KEY": "base64-encoded-private-key"
}
}
}
}{
"mcpServers": {
"apple-dev": {
"command": "dotnet",
"args": ["dnx", "-y", "AppleDev.Mcp.Server"],
"env": {
"APP_STORE_CONNECT_KEY_ID": "your-key-id",
"APP_STORE_CONNECT_ISSUER_ID": "your-issuer-id",
"APP_STORE_CONNECT_PRIVATE_KEY": "base64-encoded-private-key"
}
}
}
}{
"mcpServers": {
"apple-dev": {
"command": "dotnet",
"args": [
"run",
"--project",
"/path/to/AppleDev.Tools/AppleDev.Mcp.Server/AppleDev.Mcp.Server.csproj"
],
"env": {
"APP_STORE_CONNECT_KEY_ID": "your-key-id",
"APP_STORE_CONNECT_ISSUER_ID": "your-issuer-id",
"APP_STORE_CONNECT_PRIVATE_KEY": "base64-encoded-private-key"
}
}
}
}For Claude Desktop specifically, edit the configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Using Installed Tool (Simplest):
{
"mcpServers": {
"apple-dev": {
"command": "appledev-mcp",
"env": {
"APP_STORE_CONNECT_KEY_ID": "ABCD1234",
"APP_STORE_CONNECT_ISSUER_ID": "12345678-1234-1234-1234-123456789012",
"APP_STORE_CONNECT_PRIVATE_KEY": "LS0tLS1CRUdJTi..."
}
}
}
}Using dnx (No Installation):
{
"mcpServers": {
"apple-dev": {
"command": "dotnet",
"args": ["dnx", "-y", "AppleDev.Mcp.Server"],
"env": {
"APP_STORE_CONNECT_KEY_ID": "ABCD1234",
"APP_STORE_CONNECT_ISSUER_ID": "12345678-1234-1234-1234-123456789012",
"APP_STORE_CONNECT_PRIVATE_KEY": "LS0tLS1CRUdJTi..."
}
}
}
}Support multiple Apple Developer accounts:
{
"mcpServers": {
"apple-dev": {
"command": "appledev-mcp",
"env": {
"APP_STORE_CONNECT_KEY_ID": "default-key",
"APP_STORE_CONNECT_ISSUER_ID": "default-issuer",
"APP_STORE_CONNECT_PRIVATE_KEY": "default-key-base64",
"APP_STORE_CONNECT_KEY_ID_COMPANY_A": "company-a-key",
"APP_STORE_CONNECT_ISSUER_ID_COMPANY_A": "company-a-issuer",
"APP_STORE_CONNECT_PRIVATE_KEY_COMPANY_A": "company-a-key-base64"
}
}
}
}Then use tools with the keyName parameter:
ListDevices()- uses default credentialsListDevices(keyName: "COMPANY_A")- uses Company A credentials
- .NET 9.0 SDK or later
- macOS (for keychain, simulator, and device tools)
- Xcode (for simulator and device tools)
- App Store Connect API credentials:
- Key ID
- Issuer ID (Team ID)
- Private Key (.p8 file)
- Go to App Store Connect
- Navigate to Users and Access β Keys
- Create a new API key with appropriate access
- Download the
.p8private key file - Note the Key ID and Issuer ID
- Convert private key to base64:
base64 -i AuthKey_ABCD1234.p8 | tr -d '\n'
Manage registered development and testing devices.
-
ListDevices- List registered devices with filtering- Filters: platform, status, name, UDID
- Returns: Device name, UDID, platform, model, status
-
RegisterDevice- Register a new device- Input: name, UDID, platform (IOS, MAC_OS, TVOS, VISIONOS)
- Returns: Registration confirmation with device details
-
ModifyDevice- Update device name or status- Input: deviceId, new name, enabled status
- Returns: Update confirmation
Manage app bundle identifiers.
-
ListBundleIds- List bundle IDs with filtering- Filters: identifier, name, platform
- Returns: Bundle ID details, identifier, name, platform
-
CreateBundleId- Create new bundle ID- Input: name, identifier (e.g., com.company.app), platform
- Returns: Created bundle ID details
-
UpdateBundleId- Update bundle ID name- Input: bundleId, new name
- Returns: Update confirmation
-
DeleteBundleId- Delete a bundle ID- Input: bundleId
- Returns: Deletion confirmation
Manage signing certificates.
-
ListCertificates- List certificates with filtering- Filters: certificate type, display name
- Returns: Certificate details, type, expiration, serial number
-
CreateCertificate- Create new certificate (auto-generates CSR)- Input: certificate type, common name, email
- Returns: Certificate details and content
-
RevokeCertificate- Revoke (delete) a certificate- Input: certificateId
- Returns: Revocation confirmation
Manage provisioning profiles.
-
ListProvisioningProfiles- List profiles with filtering- Filters: profile type, state, name
- Returns: Profile details, UUID, type, state, expiration
-
CreateProvisioningProfile- Create new profile- Input: name, profile type, bundle ID, certificate IDs, device IDs
- Returns: Created profile details
-
DeleteProvisioningProfile- Delete a profile- Input: profileId
- Returns: Deletion confirmation
-
ListInstalledProvisioningProfiles- List locally installed profiles- Returns: Installed profiles with UUID, name, team, expiration
-
ParseProvisioningProfile- Parse and display profile contents- Input: file path to .mobileprovision or .provisionprofile
- Returns: Complete profile details, certificates, devices, entitlements
-
DownloadProvisioningProfile- Download profile from App Store Connect- Input: profileId
- Returns: Profile metadata and base64-encoded content
-
InstallProvisioningProfile- Install profile locally- Input: base64Data OR filePath
- Returns: Installation status, UUID, installation path
Note: To add devices to an existing profile, use the workflow: List devices β Delete old profile β Create new profile with updated device list β Download β Install
List connected physical devices and simulators.
ListDevicesAndSimulators- List devices via xcdevice- Input: timeout (seconds), devicesOnly flag
- Returns: Connected devices with UDID, name, OS version, model, interface
Manage Xcode installations.
-
ListXcode- List all installed Xcode versions- Returns: Xcode paths, versions, selected status
-
LocateXcode- Find active or best Xcode installation- Input: best flag (find highest version vs. currently selected)
- Returns: Xcode path and version
Extract information from app bundles.
GetAppInfo- Get app bundle information- Input: path to .app bundle
- Returns: Bundle ID, version, build number, platform, SDK info
Complete iOS/tvOS/watchOS/visionOS simulator management.
Simulator Lifecycle:
-
ListSimulators- List simulators with extensive filtering- Filters: booted, available, unavailable, name, UDID, runtime, device type
- Returns: Simulator details, state, runtime, device type
-
CreateSimulator- Create new simulator- Input: name, device type, runtime (optional)
- Returns: Creation confirmation
-
DeleteSimulator- Delete simulator(s)- Input: target (UDID, name, 'all', or status)
- Returns: Deletion confirmation
-
BootSimulator- Boot a simulator- Input: target (UDID or name)
- Returns: Boot status
-
ShutdownSimulator- Shutdown simulator(s)- Input: target (default: 'all')
- Returns: Shutdown confirmation
-
EraseSimulator- Erase all content from simulator- Input: target (UDID or name)
- Returns: Erase confirmation
-
OpenSimulator- Open Simulator.app- Input: UDID (optional - opens specific simulator)
- Returns: Open status
Simulator Discovery:
ListSimulatorDeviceTypes- List available device types- Returns: Device type names, identifiers, product families
App Management:
-
ListSimulatorApps- List installed apps- Input: target (UDID or 'booted')
- Returns: App bundle IDs, names, versions, paths
-
InstallSimulatorApp- Install app on simulator- Input: target, app bundle path
- Returns: Installation status
-
UninstallSimulatorApp- Uninstall app from simulator- Input: target, bundle identifier
- Returns: Uninstall status
-
LaunchSimulatorApp- Launch app on simulator- Input: target, bundle identifier
- Returns: Launch status
-
TerminateSimulatorApp- Terminate running app- Input: target, bundle identifier
- Returns: Termination status
Simulator Utilities:
-
OpenUrlSimulator- Open URL in simulator- Input: target, URL
- Returns: Status (useful for deep linking)
-
ScreenshotSimulator- Capture screenshot- Input: target, output file path
- Returns: Screenshot path
-
GetSimulatorLogs- Retrieve simulator logs- Input: target, predicate (optional filter), maxLines
- Returns: Recent log entries (last 5 minutes, up to maxLines)
Manage macOS keychains and certificates.
-
CreateKeychain- Create new keychain- Input: name, password
- Returns: Keychain path
-
DeleteKeychain- Delete a keychain- Input: name or path
- Returns: Deletion confirmation
-
UnlockKeychain- Unlock a keychain- Input: password, name (optional, default: login.keychain-db)
- Returns: Unlock status
-
SetDefaultKeychain- Set default keychain- Input: name or path
- Returns: Status confirmation
-
ImportPkcs12Keychain- Import PKCS12/PFX certificate- Input: certificate path, passphrase, keychain name, allowAnyAppRead flag
- Returns: Import status
AI: "Register my iPhone for development"
β RegisterDevice(name: "My iPhone 15 Pro", udid: "00008110-...", platform: "IOS")
AI: "Create a bundle ID for my app"
β CreateBundleId(name: "My App", identifier: "com.mycompany.myapp", platform: "IOS")
AI: "Create a development certificate"
β CreateCertificate(certificateType: "IOS_DEVELOPMENT", commonName: "My Name", email: "me@company.com")
AI: "Create a development provisioning profile"
β CreateProvisioningProfile(name: "My App Dev", profileType: "IOS_APP_DEVELOPMENT", ...)
AI: "Show me available iPhone simulators"
β ListSimulators(deviceType: "iPhone")
AI: "Create an iPhone 15 Pro simulator"
β CreateSimulator(name: "Test iPhone", deviceType: "iPhone 15 Pro")
AI: "Boot the simulator and install my app"
β BootSimulator(target: "Test iPhone")
β InstallSimulatorApp(target: "Test iPhone", appPath: "/path/to/MyApp.app")
AI: "Take a screenshot"
β ScreenshotSimulator(target: "Test iPhone", outputPath: "/tmp/screenshot.png")
AI: "Set up signing for CI"
β CreateKeychain(name: "ci-keychain", password: "ci-password")
β UnlockKeychain(password: "ci-password", name: "ci-keychain")
β ImportPkcs12Keychain(certificatePath: "/tmp/cert.p12", passphrase: "...", keychain: "ci-keychain")
β DownloadProvisioningProfile(profileId: "...")
β InstallProvisioningProfile(base64Data: "...")
Built with:
- ModelContextProtocol SDK (v0.4.0-preview.3) - Official C# MCP SDK
- AppleDev Library - Core Apple tooling wrappers (SimCtl, XCDevice, Keychain, etc.)
- AppStoreConnectClient - App Store Connect API integration
- .NET 9.0 - Modern .NET runtime
- Consistent patterns - All tools follow the same structure
- Robust error handling - Platform validation, parameter checking, exception catching
- Clear output - Human-readable success/failure messages with context
- Platform awareness - macOS-only tools return helpful errors on other platforms
- Credential flexibility - Support for multiple Apple Developer accounts
dotnet build AppleDev.Mcp.Server/AppleDev.Mcp.Server.csproj# Set environment variables
export APP_STORE_CONNECT_KEY_ID="your-key-id"
export APP_STORE_CONNECT_ISSUER_ID="your-issuer-id"
export APP_STORE_CONNECT_PRIVATE_KEY="$(base64 -i AuthKey.p8 | tr -d '\n')"
# Run the server
dotnet run --project AppleDev.Mcp.Server/AppleDev.Mcp.Server.csproj# Self-contained executable (includes .NET runtime)
dotnet publish AppleDev.Mcp.Server/AppleDev.Mcp.Server.csproj \
-c Release \
-r osx-arm64 \
--self-contained true \
-o ./publish
# Framework-dependent (requires .NET 9.0 installed)
dotnet publish AppleDev.Mcp.Server/AppleDev.Mcp.Server.csproj \
-c Release \
-o ./publish- Claude Desktop - Official Anthropic desktop app
- Cline - VS Code extension
- Continue - VS Code/JetBrains extension
- Any MCP-compatible client
When connected, AI assistants can:
- β Automate complete iOS/macOS app signing setup
- β Manage devices, certificates, and provisioning profiles
- β Control iOS simulators for testing
- β Extract information from app bundles
- β Set up and tear down CI/CD signing infrastructure
- β Troubleshoot development environment issues
- β Locate and manage Xcode installations
- macOS Required: Simulator, device, keychain, and Xcode tools only work on macOS
- Xcode Required: Simulator and device tools require Xcode to be installed
- API Limits: App Store Connect API has rate limits; the server doesn't implement throttling
- Security: Private keys are stored in environment variables; use secure credential management in production
- Permissions: Some operations (keychain, simulators) may require macOS permissions
Same as parent AppleDev.Tools project.
Built on top of:
- AppleDev.Tools by @Redth
- Model Context Protocol by Anthropic
Status: β Production Ready - All 44 tools implemented and tested