Garmin Connect IQ Simulator MCP Server
Provides tools for automating the Garmin Connect IQ Simulator on macOS, enabling AI agents to build and run Monkey C apps, manage device profiles, synthesize button presses and touch gestures, capture watch-screen screenshots, inspect logs, and run unit tests for Garmin watchfaces, data fields, and device apps.
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., "@Garmin Connect IQ Simulator MCP Serverbuild my app for fenix847mm, run it, and send a screenshot"
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.
Garmin Connect IQ Simulator MCP Server
A Model Context Protocol (MCP) server providing 100% deterministic automation, input synthesis, and visual inspection for the Garmin Connect IQ Simulator (ConnectIQ.app) on macOS.
Enables AI coding agents (Antigravity, Claude Code, Cursor) to build, run, test, tap, swipe, press hardware buttons, stream logs, and visually inspect Garmin watchfaces, data fields, and device apps.
Architecture
flowchart TB
LLM["LLM Agent (Antigravity / Claude / Cursor)"]
MCP["Garmin Emulator MCP Server (TypeScript / Node.js)"]
subgraph Engines["Core MCP Subsystems"]
Meta["Device Metadata Engine\n(Parses simulator.json, compiler.json, simulator.ini)"]
SDK["SDK & Shell Runner\n(monkeyc, monkeydo, bin/shell TCP 1234)"]
Bridge["macOS Native UI Bridge\n(Swift CLI: Quartz CGWindowList, CGEvent, AXUIElement)"]
Img["Image Pipeline (sharp)\n(Retina normalization, watch screen crop, SVG debug overlay)"]
end
subgraph GarminEnv["Garmin Connect IQ Environment (macOS)"]
SimApp["ConnectIQ.app (simulator process)\nBundle: com.garmin.connectiq.simulator"]
SimFiles["~/Library/Application Support/Garmin/ConnectIQ/\nDevices/*/simulator.json & Sdks/*"]
end
LLM <-->|"MCP Protocol (stdio)"| MCP
MCP --> Meta
MCP --> SDK
MCP --> Bridge
MCP --> Img
Meta -->|"Reads button & screen coordinates"| SimFiles
SDK -->|"TCP :1234 (launch, push .prg, logs)"| SimApp
Bridge -->|"CGEvent (buttons, taps, swipes)\nscreencapture -l <windowID>\nAXUIElement (menu bar)"| SimApp
Bridge -->|"Raw Window PNG"| Img
Img -->|"Cropped Watch Screen PNG (base64)"| MCPRelated MCP server: MCP Connect
Available MCP Tools
1. Lifecycle & Device Management
Tool | Parameters | Description |
| none | Returns running state, window ID, bounds, macOS Screen Recording and Accessibility permissions, TCP port 1234 status, and active device profile metadata. |
|
| Launches |
|
| Lists all installed Garmin device profiles in |
|
| Sets the active device ID (e.g. |
|
| Compiles a Monkey C project for a specified device using the SDK |
|
| Pushes and executes a compiled |
| none | Terminates the active app child process in the simulator. |
|
| Runs unit tests on a compiled test |
2. Navigation & User Input Synthesis
Tool | Parameters | Description |
|
| Presses a physical bezel button ( |
|
| Executes a sequence of button presses in order with delays between steps, returning the final watch screen. |
|
| Sends a macOS virtual key code or named key ( |
|
| Clicks the watch touchscreen at display coordinates $(X, Y)$ or normalized $(0.0..1.0)$, returning the updated screen. |
|
| Synthesizes a touch drag adhering to device gesture thresholds (e.g. right swipe triggers |
|
| Long-presses at specific watch display coordinates (default 1000ms), returning the updated screen. |
3. Visual Inspection & Logs
Tool | Parameters | Description |
|
| Captures the simulator window. |
|
| Retrieves console output, |
4. Environment & Menus
Tool | Parameters | Description |
|
| Triggers a macOS menu item in |
|
| Toggles or sets Glance View mode ( |
Coordinate Calibration & Retina Scaling
Watch Screen Crop (
view: "screen"): Garmin devices have exact display bounding boxes specified inDevices/<device_id>/simulator.json(e.g.454x454at offset(134, 221)forfenix847mm). On macOS Retina displays ($2\times$ pixel density), the server scales the crop window dynamically and normalizes the output image back to $1\times$ logical device pixels (454x454), saving up to 75% of vision tokens while matching code drawing coordinates 1:1.macOS Title & Status Bar Calibration: In
ConnectIQ.app(wxWidgetson macOS), the window features a28pxmacOS title bar at the top and a28pxstatus bar at the bottom. The client canvas origin is computed as: $$\text{originX} = \max\left(0, \left\lfloor \frac{\text{windowWidth} - \text{bezelWidth}}{2} \right\rfloor\right), \quad \text{originY} = 28$$ This ensures mouse clicks and drag gestures align with sub-pixel accuracy to hardware bezel buttons and touchscreen boundaries.
Required macOS Permissions
The terminal or IDE hosting the MCP server requires two standard macOS permissions:
Screen Recording:
Required by
/usr/sbin/screencaptureto capture simulator window buffers.Prompted automatically on first screenshot or grant via:
System Settings > Privacy & Security > Screen & System Audio Recording
Accessibility:
Required by
CGEventto synthesize mouse clicks, drags, and keystrokes, and byAXUIElementto trigger menu items.Grant via:
System Settings > Privacy & Security > Accessibility
Run simulator_status at any time to verify permission status.
Installation & Setup
1. Build from Source
Ensure Xcode Command Line Tools (swiftc) and Node.js $\ge 18$ are installed:
git clone https://github.com/keponer/garmin-simulator-mcp.git
cd garmin-simulator-mcp
npm install
npm run buildThis compiles:
bin/macos-bridge(native Swift CLI helper)dist/index.js(TypeScript MCP server)
Run all tests:
npm testClient Configuration
Claude Desktop (claude_desktop_config.json)
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"garmin-emulator": {
"command": "node",
"args": [
"/path/to/garmin-emulator-mcp/dist/index.js"
]
}
}
}Cursor (.cursor/mcp.json)
Add to .cursor/mcp.json or ~/.cursor/mcp.json:
{
"mcpServers": {
"garmin-emulator": {
"command": "node",
"args": [
"/path/to/garmin-emulator-mcp/dist/index.js"
]
}
}
}Antigravity (~/.gemini/config/mcp_config.json)
Add to ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"garmin-emulator": {
"command": "node",
"args": [
"/path/to/garmin-emulator-mcp/dist/index.js"
]
}
}
}License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloud iPhone Simulators for AI agents: build the Xcode project, read the screen, tap by label, test.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Cloud iPhones and Macs with Xcode for AI agents: build, run and test iOS apps, use the screen.
Let your AI agent control real iPhones: screenshots, tap, swipe, type and open apps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to automate iOS Simulator interactions including device management, UI element interaction (tap, swipe, type), screenshot capture, and execution of YAML-defined navigation workflows.12 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to control iOS Simulators and automate browsers by combining xcrun simctl, fb-idb, and Puppeteer for screenshot capture, device management, gestures, navigation, and DOM interaction.6 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control real iPhones and simulators on macOS, allowing for UI interaction, testing, and automation.58 npm92MIT
- AlicenseNot gradedqualityDmaintenanceGives AI agents the ability to interact with iOS simulators through 21+ tools for mobile app testing.10,447 npmMIT