Skip to content
Conduit

mcp server

utm-mcp

michaelbarry/utm_mcpcommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

Before you start

  • uv (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "utm-mcp": {
      "command": "uvx",
      "args": [
        "utm-mcp"
      ]
    }
  }
}

same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12

Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs

README

synced Oct 22, 2026

UTM MCP Server

An MCP (Model Context Protocol) server that provides tools for managing UTM virtual machines via the utmctl CLI.

Prerequisites

  • macOS with UTM installed at /Applications/UTM.app
  • Python 3.10+
  • uv
  • UTM must be running in the current user session (utmctl uses Apple Events)

Setup

git clone https://github.com/michaelbarry/utm_mcp.git
cd utm_mcp
uv sync

Running

uv run utm-mcp

The server uses stdio transport by default, suitable for use with Claude Code and other MCP clients.

Claude Desktop Configuration

Run the helper script to automatically add the server to your Claude Desktop config:

uv run python add_to_claude_desktop.py

# Or specify the path to your utm_mcp checkout
uv run python add_to_claude_desktop.py /path/to/utm_mcp

Or manually add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "utm": {
      "command": "uv",
      "args": ["--directory", "/path/to/utm_mcp", "run", "utm-mcp"]
    }
  }
}

Claude Code Configuration

claude mcp add -s user utm -- uv --directory /path/to/utm_mcp run utm-mcp

Tools

VM Lifecycle

ToolDescription
utm_list_vmsList all registered virtual machines
utm_get_statusQuery the status of a VM
utm_start_vmStart or resume a VM (supports disposable and recovery mode)
utm_suspend_vmSuspend a running VM to memory (optionally save state to disk)
utm_stop_vmShut down a VM (force, kill, or graceful request)
utm_clone_vmClone an existing VM (with disk space checks and warnings)
utm_delete_vmPermanently delete a VM (irreversible)
utm_get_ip_addressList IP addresses on the guest

Guest Operations

Require the QEMU guest agent running inside the VM. See Installing the QEMU Guest Agent below.

ToolDescription
utm_exec_commandExecute a command inside the guest
utm_exec_scriptPush and execute a multi-line script on the guest
utm_file_pullFetch a file from the guest
utm_file_pushUpload text content to a file on the guest

USB

ToolDescription
utm_list_usbList connected USB devices
utm_connect_usbConnect a USB device to a VM
utm_disconnect_usbDisconnect a USB device from a VM

Installing the QEMU Guest Agent

The guest agent is required for guest operations (utm_exec_command, utm_exec_script, utm_file_pull, utm_file_push). Install it inside each VM you want to manage:

Linux

Debian / Ubuntu:

sudo apt update && sudo apt install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent

Fedora / RHEL / CentOS:

sudo dnf install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent

Arch Linux:

sudo pacman -S qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent

Alpine Linux:

sudo apk add qemu-guest-agent
sudo rc-update add qemu-guest-agent
sudo service qemu-guest-agent start

NixOS:

Add to configuration.nix:

services.qemuGuest.enable = true;

Then rebuild:

sudo nixos-rebuild switch

Windows

  1. Download the VirtIO guest tools ISO
  2. Mount the ISO in UTM (CD/DVD drive)
  3. Run guest-agent\qemu-ga-x86_64.msi (or qemu-ga-i386.msi for 32-bit) from the mounted drive
  4. The agent starts automatically as a Windows service

Verifying the Agent

After installing, verify the agent is running by checking the VM status from the host:

/Applications/UTM.app/Contents/MacOS/utmctl exec <vm-name> -- echo "agent works"

If this returns agent works, guest operations are ready to use.

Storage Notes

utm_clone_vm checks available disk space before cloning and warns if:

  • UTM storage is on the local disk rather than external storage
  • Free space would drop below 50 GB after the clone

UTM can be configured to store VMs on an external volume via UTM preferences. This is recommended for machines with limited internal storage.

Troubleshooting

utmctl returns no VMs (OSStatus error -1743)

utmctl communicates with UTM.app via Apple Events. If the app running utmctl (Terminal, iTerm, VS Code, etc.) hasn't been granted Automation permission, macOS silently blocks the request and no VMs are returned.

Fix:

  1. Run this command in your terminal to trigger the macOS permission prompt:

    osascript -e 'tell application "UTM" to get name of every virtual machine'
    
  2. Approve the dialog that appears, granting your terminal app permission to control UTM.

  3. You can verify or manage this permission in System Settings → Privacy & Security → Automation.

Note: If you're using the App Store (sandboxed) version of UTM and continue to have issues, the direct download is known to work more reliably with utmctl.

Limitations

  • utmctl requires an active GUI session (Apple Events). It does not work over SSH.
  • Guest operations require the QEMU/SPICE guest agent installed and running inside the VM.
  • Clone operations copy the entire VM disk image and can take significant time and space.

License

MIT

↑↓ navigate openesc close