mcp-utm
README.md
# mcp-utm
MCP server for managing [UTM](https://mac.getutm.app/) virtual machines on macOS via AppleScript.
Provides 22 tools for cloning, configuring, and controlling UTM VMs — including proper MAC address randomization for Apple Virtualization Framework clones, which enables concurrent VMs with unique network identities.
## Install
```bash
# PyPI
uvx mcp-utm
# Or install globally
uv tool install mcp-utm
pip install mcp-utm
```
## Claude Code config
```json
{
"mcpServers": {
"utm": {
"command": "uvx",
"args": ["mcp-utm"]
}
}
}
```
## Requirements
- **macOS** (uses AppleScript / `osascript`)
- **UTM 4.6+** ([download](https://mac.getutm.app/) or `brew install --cask utm`)
- **Python 3.11+**
## Tools
### Lifecycle
| Tool | Description |
|------|-------------|
| `list_vms` | List all registered VMs with status |
| `get_vm` | Get status and configuration of a VM |
| `clone_vm` | Clone a template with unique random MAC |
| `start_vm` | Start a stopped or suspended VM |
| `stop_vm` | Stop a running VM (graceful or force) |
| `delete_vm` | Delete a VM permanently |
### State
| Tool | Description |
|------|-------------|
| `suspend_vm` | Suspend a running VM to memory |
| `wait_for_vm` | Poll until VM reaches a target status |
### Networking
| Tool | Description |
|------|-------------|
| `get_vm_ip` | Discover VM IP via ARP table |
| `set_vm_network` | Update MAC address or network mode |
### Configuration
| Tool | Description |
|------|-------------|
| `set_vm_resources` | Update memory and CPU cores |
| `rename_vm` | Rename a VM |
| `set_vm_display` | Toggle dynamic resolution |
### Directory Shares (VirtioFS)
| Tool | Description |
|------|-------------|
| `list_vm_shares` | List shared directories |
| `add_vm_share` | Add a host directory share |
| `remove_vm_share` | Remove a directory share |
| `set_vm_shares` | Replace all shares |
### Drives
| Tool | Description |
|------|-------------|
| `list_vm_drives` | List attached drives |
| `attach_drive` | Attach an ISO or disk image |
### Portability
| Tool | Description |
|------|-------------|
| `export_vm` | Export VM to a `.utm` file |
| `import_vm` | Import VM from a `.utm` file |
### Console
| Tool | Description |
|------|-------------|
| `get_serial_port` | Get serial port address for console access |
## How MAC randomization works
Apple's Virtualization Framework ignores `MacAddress` changes written directly to `config.plist` — UTM caches the config in memory. This server uses AppleScript's `update configuration` command which properly updates UTM's internal state, giving each clone a unique MAC and therefore a unique IP on the `192.168.64.0/24` subnet.
## License
MIT
TDQS
A3.7/5.0
Scored across 22 tools
Disambiguation5/5
Each tool targets a distinct operation: lifecycle (start/stop/suspend/delete/clone/import/export/rename), configuration (resources/network/display/shares/drives), and status (get/ip/serial/list/wait). No functional overlaps.
Naming Consistency5/5
All tools follow a consistent verb_noun pattern in snake_case (e.g., start_vm, set_vm_network). No mixing with camelCase or inconsistent verb styles.
Tool Count4/5
22 tools is slightly above the typical 3-15 range but justified by comprehensive VM management—lifecycle, configuration, and diagnostics are all covered without being excessive.
Completeness4/5
Covers CRUD, lifecycle, and most configuration aspects. Minor gap: no tool to create a VM from scratch (only clone/import), but core workflows are well-supported.
Maintenance
ActivityMaintained
ResponsivenessNo issues