AppleDev.Mcp.Server
0.8.9
dotnet tool install --global AppleDev.Mcp.Server --version 0.8.9
dotnet new tool-manifest
dotnet tool install --local AppleDev.Mcp.Server --version 0.8.9
#tool dotnet:?package=AppleDev.Mcp.Server&version=0.8.9
nuke :add-package AppleDev.Mcp.Server --version 0.8.9
Apple Developer Tools MCP Server
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.
🚀 Quick Start
Installation
The server is distributed as a .NET tool and can be installed/run in several ways:
Option 1: Install as Global Tool (Recommended)
dotnet tool install -g AppleDev.Mcp.Server
Then use the appledev-mcp command directly in your MCP configuration.
Option 2: Run with dotnet tool run (No Installation)
dotnet tool run --global appledev-mcp
Option 3: Run with dnx (Download and Run in One Shot)
dotnet dnx -y AppleDev.Mcp.Server
NOTE: Requires .NET 10 SDK for the dotnet dnx command
This downloads and runs the tool without installing it globally.
MCP Server Configuration
Add this configuration to your MCP client settings (e.g., Claude Desktop, Cline, etc.):
Using Installed Tool (Recommended)
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"
}
}
}
}
Using dnx (No Installation Required)
{
"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"
}
}
}
}
Using Source (Development)
{
"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"
}
}
}
}
Claude Desktop Configuration
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..."
}
}
}
}
Multiple Credential Sets
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
📋 Prerequisites
- .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)
Getting App Store Connect API Credentials
- 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'
🛠️ Available Tools (44 Total)
App Store Connect - Devices (3 tools)
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
App Store Connect - Bundle IDs (4 tools)
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
App Store Connect - Certificates (3 tools)
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
App Store Connect - Provisioning Profiles (7 tools)
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
Physical Devices (1 tool)
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
Xcode (2 tools)
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
App Operations (1 tool)
Extract information from app bundles.
GetAppInfo- Get app bundle information- Input: path to .app bundle
- Returns: Bundle ID, version, build number, platform, SDK info
Simulators (15 tools)
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)
Keychain (5 tools)
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
💡 Usage Examples
Setting Up a Development Environment
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", ...)
Simulator Testing Workflow
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")
CI/CD Provisioning
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: "...")
🏗️ Architecture
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
Design Principles
- 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
🔧 Building and Publishing
Development Build
dotnet build AppleDev.Mcp.Server/AppleDev.Mcp.Server.csproj
Run for Testing
# 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
Production Build
# 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
🤝 Integration
Compatible MCP Clients
- Claude Desktop - Official Anthropic desktop app
- Cline - VS Code extension
- Continue - VS Code/JetBrains extension
- Any MCP-compatible client
Capabilities
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
📝 Notes
- 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
📄 License
Same as parent AppleDev.Tools project.
🙏 Credits
Built on top of:
- AppleDev.Tools by @Redth
- Model Context Protocol by Anthropic
Status: ✅ Production Ready - All 44 tools implemented and tested
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.