Skip to main content
Glama
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