The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Agentpc listing page.
Instant, resettable Windows and Ubuntu desktops for AI agents, on your Mac.
Website: https://agentpc.pawanpaudel.com.np
agentpc gives AI agents (Claude Code, Claude Desktop, Codex, Cursor, Gemini CLI, VS Code, or any MCP client) real desktop computers to work in: create a VM in seconds, let the agent click, type, take screenshots and run commands, then reset it to a clean state. It is a single Rust binary that runs VMs with QEMU on Apple's hypervisor and serves them to agents over MCP.
reset returns a VM to a clean state just as fast.agentpc mcp-install sets up the popular ones.127.0.0.1 only.| Requirement | Details |
|---|---|
| Hardware | Apple Silicon Mac (M1 or later; tested on M4) |
| OS | A macOS version QEMU supports: the current one and, for up to two years, the previous one (tested on macOS 15) |
| Runtime | QEMU from Homebrew (the installer handles it, installing Homebrew too if needed) |
| Memory | 4 GB per running Ubuntu VM, 8 GB per running Windows VM |
| Disk | ~10 GB per Ubuntu image, ~30 GB per Windows image (each including its snapshot) |
The installer:
agentpc to ~/.local/bin (no sudo) and adds it to your PATH,agentpc mcp-install),agentpc doctor.To upgrade later, run agentpc update (or agentpc update --check to just look); rerunning the
installer works too. Installer options:
| Variable | Effect |
|---|---|
AGENTPC_VERSION=0.1.0 | Install a specific version |
AGENTPC_INSTALL_DIR=<dir> | Install somewhere other than ~/.local/bin |
AGENTPC_NO_MCP=1 | Skip registering the MCP server |
To build from source instead, see Development.
Ubuntu:
Windows: Microsoft's license doesn't allow redistributing Windows images, so each Mac builds its own once. agentpc downloads the official Windows 11 ARM64 ISO from Microsoft (7.3 GB, checksum-verified) unless you already have one:
Then ask your agent something like:
uname -a."To watch a VM yourself, open the viewer URL printed by agentpc info <name>.
agentpc is an MCP server (agentpc mcp, stdio). One server handles every VM.
In Claude Code, install the agentpc plugin. It bundles the MCP server with a skill that teaches Claude when and how to use the VMs:
The plugin runs the installed agentpc binary, so install that first
(see Installation). When the plugin is installed it already registers the MCP
server for Claude Code, so agentpc mcp-install skips Claude Code to avoid a duplicate.
Register it with every supported agent that's installed (the installer does this):
Supported: Claude Code, Claude Desktop, Codex, Cursor, Gemini CLI and VS Code (restart Claude Desktop after registering). For any other MCP client, add:
This repository also contains project-level configs (.mcp.json, .codex/config.toml,
.cursor/mcp.json, .gemini/settings.json, .vscode/mcp.json), so agents opened in a clone
pick the server up automatically.
| Tool | Description |
|---|---|
list_vms | VMs (owner, state, size, checkpoints, viewer) and the available images with their OS versions |
create_vm | Create a VM (optionally of a given version, size, or offline) and wait until its desktop is ready. Retrying it in the same session returns the VM already created |
start_vm / stop_vm | Boot a stopped VM / shut one down cleanly |
reset_vm | Discard all changes: back to a fresh copy of the image |
checkpoint_vm / restore_vm | Save a VM's disk and memory under a label; go back to it in seconds |
delete_checkpoint | Delete one checkpoint by label; the VM is untouched |
delete_vm | Delete a VM with its disk and checkpoints |
take_screenshot | PNG screenshot from the hypervisor; save_to also writes it to a path on your Mac |
run_command | Run a command (PowerShell on Windows, bash on Ubuntu); returns exit code, stdout and stderr. A foreground run is killed at timeout (default 120 s) with partial output; background: true returns a job id for get_job_status |
get_job_status | Check a background job by its id: still running or exited (with its code), plus the tail of its log |
upload_file / download_file | Copy files or folders between your Mac and a VM |
forward_port | Reach a server running in a VM from your Mac (SSH tunnel; works even for servers bound to the guest's own 127.0.0.1) |
list_forwards / delete_forward | List a VM's active port forwards / stop one by its host port |
read_vm_log | Read the tail of a VM's qemu or serial log, for when a VM won't boot or the desktop is unreachable |
list_desktop_tools | List the desktop-control tools inside a VM |
use_desktop_tool | Call one of them: click, type, launch apps, read the UI tree, … |
VMs an MCP session created or started are stopped (never deleted) when the session ends, unless
AGENTPC_KEEP_RUNNING=1.
| Guest | Desktop | Desktop-control server |
|---|---|---|
| Windows | Windows 11 (ARM64), 1280x800, Edge | cua-driver (over SSH; Windows-MCP on images built by 0.1.0) |
| Ubuntu | Ubuntu 24.04 or another release, XFCE on X11, 1280x800, Google Chrome | cua-driver (over SSH) |
AGENTS.md has usage tips for agents.
Commands that act on VMs take several names (agentpc stop a b), check them all before
doing anything, and carry on past a failure (exit status 1 if any failed). Every command has
--help.
| Command | Description |
|---|---|
agentpc create <image> [name] [--memory GB] [--cpus N] [--offline] | Create a VM from ubuntu, windows or a version such as ubuntu-22.04; fetches Ubuntu images if missing. --memory is 2–64 GB, --cpus 1–16; a non-default size boots cold instead of resuming. --offline: no internet or access to this Mac |
agentpc list [--json] (ls) | VMs and images; --json gives the same data as the MCP list_vms tool |
agentpc info <name> | Viewer URL (with the VNC password), SSH and VNC details, and checkpoints |
agentpc start <name>… | --all | Boot stopped VMs |
agentpc stop <name>… | --all | Shut VMs down cleanly; disks are kept |
agentpc reset <name>… | Discard all changes: back to a fresh copy of the image |
agentpc rm <name>… (delete) | Delete VMs with their disks and checkpoints |
agentpc checkpoint <name> <label> [-d] | Save a VM's disk and memory (a running VM pauses ~5 s), or delete a checkpoint |
agentpc restore <name> <label> | Put a VM back exactly as it was at a checkpoint (resumes in seconds) |
agentpc ssh <name> [command] | Run a command, or open a shell with no command |
agentpc screenshot <name> [file] | Save a PNG screenshot |
agentpc cp <src> <dst> | Copy files; the VM side is <name>:<path>, e.g. agentpc cp app.msi windows-1:Downloads/ |
agentpc forward <name> <guest-port> [host-port] | Forward 127.0.0.1:<host-port> to a port in a running VM (over SSH). --list shows a VM's forwards; --rm <host-port> stops one |
| Command | Description |
|---|---|
agentpc image pull <image> | Download a published Ubuntu image, e.g. ubuntu or ubuntu-22.04 |
agentpc image build <image> [--iso <path>] | Build an image locally (Ubuntu ~3 min, Windows ~12 min + ISO download) |
agentpc image ls (list) | List local images with their OS versions |
agentpc image info <image> | Version, source, build date and desktop server of an image |
agentpc image rm <image>… (delete) | Delete local images |
agentpc image snapshot <image> | Recapture the snapshot VMs resume from (build and pull do this) |
agentpc image push <image> | Maintainers: publish an Ubuntu image to ghcr.io |
| Command | Description |
|---|---|
agentpc mcp | Run the MCP server on stdio (what agents launch) |
agentpc mcp-install [clients…] | Register the MCP server with agents (skips Claude Code when the plugin is installed; raises Codex's MCP timeouts so slow builds and boots don't trip it) |
agentpc mcp-uninstall [clients…] | Remove it from agents again |
agentpc update [--check] | Update to the latest release (checksum-verified; images and VMs are kept). Alias: upgrade |
agentpc doctor | Check prerequisites |
agentpc clean [-n] | Free disk space: downloaded ISOs and cloud images, and leftovers of interrupted builds or checkpoints. Never touches images or VMs; lists images no VM uses |
agentpc uninstall [--keep-data] [-y] | Remove agentpc (see Uninstalling) |
agentpc completions <shell> | Print tab completion for bash, zsh or fish, e.g. agentpc completions zsh > ~/.zfunc/_agentpc |
An image is a read-only disk with the OS, desktop and agent tools installed. Every VM is a copy-on-write clone of an image, so a VM starts from a clean install and costs only a few MB.
Images are named <os>-<version>, and several can be installed side by side; each VM
remembers which one it came from. A bare ubuntu means ubuntu-24.04, and a bare windows
(or windows-11) means windows-11-25h2. To save a 12-minute build, create and
image info fall back to your newest installed Windows 11 image if 25H2 isn't built. Pin the
full name when the release matters, e.g. in test harnesses.
| Image | Source | How to get it |
|---|---|---|
ubuntu = ubuntu-24.04 | Official Ubuntu 24.04 cloud image | image pull (automatic on first create) or image build |
ubuntu-<release> | Any release in cloud-images.ubuntu.com/releases, e.g. 22.04, 26.04 | image build ubuntu-22.04, or image pull if published |
windows-11-25h2 (windows) | Windows 11 25H2 (Home/Pro), 7.3 GB ISO from Microsoft | image build windows |
windows-11-24h2, windows-11-23h2 | Earlier Windows 11 releases (Home/Pro) | image build windows-11-23h2 |
windows-<name> | Your own Windows 11 ARM64 Home/Pro ISO | image build windows-<name> --iso <path> |
Only ARM64 Windows runs at native speed on Apple Silicon, so x64-only releases aren't offered,
and Windows 10's ARM64 build hangs at boot on Apple Silicon, so Windows 11 is the minimum.
The unattended install uses the Home/Pro setup key, so Enterprise and LTSC ISOs aren't
supported. An ISO in ~/Downloads is used when its file name shows the release being built;
--iso with a release name must match it too (a 24H2 ISO can't become windows-11-25h2).
Windows runs unactivated (a watermark, nothing else); activate it with your own key if you
need to.
Images are clean installs, like a customer's new PC: Windows has no Visual C++ redistributable,
no .NET (only the built-in .NET Framework 4.8.1) and no PowerShell 7. A program that runs on
your machine but fails in a VM with a missing VCRUNTIME140.dll or similar is missing a
dependency its installer should provide. Microsoft's evaluation ISOs aren't offered: they install already expired and shut
down every hour.
Microsoft serves only its current ARM64 ISOs; the older ones download from archive mirrors
(archive.org, bobpony.com). Every ISO is checked against a pinned SHA-256, so a mirror can't
substitute a modified file, and kept in ~/.agentpc/cache. All are en-us; for another
language, download it yourself and pass --iso.
Each image records what it is (agentpc image info <image>):
Published images live in one package, ghcr.io/pawanpaudel93/agentpc, tagged by image
name. Only Ubuntu is published (Windows images can't be redistributed):
| Tag | Meaning | Pull with |
|---|---|---|
ubuntu-24.04 | Newest build of Ubuntu 24.04 (also tagged ubuntu) | agentpc image pull ubuntu |
ubuntu-<release> | Newest build of another release | agentpc image pull ubuntu-22.04 |
ubuntu-24.04-YYYYMMDD | One specific build (pinned) | agentpc image pull ubuntu-24.04-YYYYMMDD |
| Variable | Default | Description |
|---|---|---|
AGENTPC_HOME | ~/.agentpc | Where images, VMs, keys and caches live |
AGENTPC_IMAGE_REPO | ghcr.io/pawanpaudel93/agentpc | Package for image pull/push (tagged by image name) |
WIN_ISO | an earlier download, a matching ISO in ~/Downloads, else a download | Windows ISO used by image build windows-… without --iso |
Each VM gets its own ports on 127.0.0.1, derived from its slot number n (an existing VM
moves to its new ports the next time it starts):
| Port | Use |
|---|---|
47000 + n | SSH |
47100 + n | Windows-MCP (Windows images built by 0.1.0) |
47200 + n | noVNC WebSocket (for the viewer) |
47300 + n | VNC |
8100 | Browser viewer, shared by all VMs |
The guest login is agent / agent. Each VM also has its own VNC password (see
Security).
start after stop is a normal boot; reset resumes a fresh copy again.agentpc checkpoint <name> <label> --delete removes one, and deleting the VM removes all of them.create checks free disk and RAM up front and checkpoint checks disk;
restore is atomic (a failed one leaves the VM as it was) and resumes a VM that was left paused;
operations on one VM are serialized, and a stale pid file from a crash is detected rather than
trusted. The guest clock follows the Mac's time zone. SSH keepalives hold long calls open, a
desktop tool call gives up after 120 s, and a viewer that won't start no longer fails a VM
start. The browser viewer (noVNC) is downloaded against a pinned checksum.cua-driver telemetry enable in the VM.agentpc doctor.agentpc screenshot <name>, or open the viewer URL from
agentpc info <name>.~/.agentpc/instances/<name>/: qemu.log (QEMU errors) and
serial.log (guest console).agentpc reset <name>.image build/pull/rm refuses: VMs still depend on that image; agentpc rm them
first.Each VM sits behind QEMU's user-mode NAT, so VMs are isolated from each other but share the Mac's network (a VPN or proxy configured on the Mac applies to a VM's outbound traffic).
agentpc forward <name> <guest-port> [host-port]
(MCP: forward_port), then connect to 127.0.0.1:<host-port>. It tunnels over SSH, so it
reaches a server bound to the guest's own 127.0.0.1 and the Windows firewall doesn't apply.
A forward lasts until the VM stops or you remove it (--rm <host-port> / delete_forward);
--list (MCP: list_forwards) shows a VM's forwards.10.0.2.2 is the Mac host — the NAT maps it to the Mac's
loopback, so a dev server listening on 127.0.0.1 or 0.0.0.0 is reachable at
10.0.2.2:<port> from inside the VM.forward_port(B, guest_port, host_port)), then from the other VM connect to
10.0.2.2:<host_port>.--offline / offline: true) can't reach 10.0.2.2 or the internet, but
ports you forward from the Mac still reach them.HTTP_PROXY
and HTTPS_PROXY inside the guest, and import your corporate root CA with
Import-Certificate (Windows) or update-ca-certificates (Ubuntu).Rebooting a guest (a Windows Update install, some installers) drops the SSH connection. Call
start_vm on the same VM — it waits until the desktop is ready again even when the VM is
already running — or simply retry run_command once it's back.
GUI installers return immediately. Run them silently and wait for the process:
Start-Process installer.exe -ArgumentList '/S' -Wait -PassThru (the switch varies:
/S, /silent, /quiet), then check its ExitCode. A run_command process ends when
the command returns, so start servers and GUI apps with background: true.
Windows Update is disabled in the image (the wuauserv service is stopped and set to
Disabled, and the NoAutoUpdate policy is set) so updates never interrupt a task. This also
blocks optional features that fetch from Windows Update — DISM /online (e.g. .NET 3.5) and
Add-WindowsCapability (RSAT, language packs; OpenSSH is already installed). To use one,
re-enable it temporarily and set it back afterwards:
Defender real-time protection is on. agentpc only disables SmartScreen, not Defender, so
Defender may quarantine a freshly built or unsigned test binary. Exclude your work directory
with Add-MpPreference -ExclusionPath C:\work, or turn real-time monitoring off with
Set-MpPreference -DisableRealtimeMonitoring $true (Tamper Protection may block the latter).
Guests have a fixed 1280x800 display, a 2D-only virtio GPU (no 3D/GPU acceleration; WebGL is software-rendered or unavailable), and no audio device.
This stops all VMs, removes the MCP server from every agent mcp-install registered it with,
deletes ~/.agentpc (images, VMs, checkpoints and keys; --keep-data keeps them) and the
agentpc binary. It leaves shared things alone and lists them: the PATH line the installer
added (~/.local/bin is used by other tools too), QEMU (brew uninstall qemu if nothing else
needs it) and the Claude plugin (/plugin uninstall agentpc@agentpc).
To only reclaim disk space, agentpc clean deletes what can be downloaded again, and
agentpc image rm <image> deletes an image you no longer use.
127.0.0.1 only.vnc-pass, mode 0600, in its instance dir). The viewer URL
from agentpc info <name> carries it (&password=…) so the browser viewer connects without a
prompt; a native VNC client (vnc://127.0.0.1:<port>) asks for it — copy it from that URL or
read ~/.agentpc/instances/<name>/vnc-pass.agent / agent.10.0.2.2, services on your Mac. Create
a VM with --offline (offline: true in create_vm) to cut both off, e.g. for untrusted
software; SSH, the viewer and forwarded ports keep working.list_vms, take_screenshot and list_desktop_tools are
read-only, and tools that discard or overwrite state (including download_file, which writes
to your Mac) are marked destructive, so clients can auto-approve or confirm accordingly.Guest provisioning files in guests/ are embedded into the binary. AGENTS.md
describes the code layout for contributors and coding agents.
main, run scripts/release.sh X.Y.Z (needs gh logged in,
Node for npx, and jq). It sets the version everywhere (skipped when Cargo.toml is
already at X.Y.Z), runs the CI checks, builds dist/ (binary tarball, MCP bundle
agentpc-X.Y.Z.mcpb, their .sha256 files, a filled-in server.json and NOTES.md,
the release notes grouped from the Conventional Commit subjects since the last tag), then
asks before it commits chore: release vX.Y.Z, tags vX.Y.Z, pushes main and the tag,
and creates the GitHub Release. --dry-run stops after building dist/.agentpc image build ubuntu, then log oras in with a token
that can write packages (gh auth refresh -s write:packages, then
gh auth token | oras login ghcr.io -u <user> --password-stdin) and run
agentpc image push ubuntu. It uploads 64 MB parts, retries failures and links the package
to this repo; make the package public once in its settings.brew install mcp-publisher, mcp-publisher login github,
then mcp-publisher publish dist/server.json.MIT © 2026 Pawan Paudel