Parallels Pro MCP Server
A Model Context Protocol (MCP) server for Parallels Desktop on macOS. It enables LLM agents—such as Claude Desktop, ChatGPT Codex, Cursor, and Antigravity—to discover, control, automate, and inspect Parallels virtual machines over standard MCP stdio.
Highlights
- Full Lifecycle Management: Start, gracefully stop (ACPI), and suspend virtual machines.
- Cross-Platform Guest Execution: Execute commands inside Windows, Linux, or macOS guests with explicit argument vectors (
argv), avoiding host shell injection risks. - Readiness Probing: Automatically detects guest OS and polls until Parallels Tools and the guest execution layer respond.
- Bi-Directional File Transfer: Stream files and directories directly between host and guest over stdin/stdout tar archives without requiring network mounts or SMB credentials (
vm_copy_to_guest,vm_copy_from_guest). - Dynamic Host Folder Sharing: Mount and unmount host directories into guest VMs at runtime with read-only or read-write permissions (
vm_share_folder,vm_unshare_folder). - Instant Sandboxing & Ephemeral Clones: Spin up fast linked clones in seconds for disposable agent test environments, and permanently delete sandboxes with confirmation (
vm_clone,vm_delete). - Headless Execution & Network Simulation: Run VMs headlessly in the background, or simulate network degradation (edge, 3g, wifi, 100% packet loss, offline) for resilience testing (
vm_set_headless,vm_set_network_condition). - Visual VM Inspection: Capture real-time screenshots of the VM display buffer for multimodal AI analysis (
vm_screenshot). - Synthetic Input & Hotkeys: Send keyboard events and hotkey combinations (
Ctrl+Alt+Del,Win+R,Enter,Esc) to interact with GUI dialogs and prompts (vm_send_keys). - Snapshot Lifecycle: List, create, safely revert, and delete snapshots with mandatory confirmation flags (
confirm: true). - Pre-flight Diagnostic Doctor: Built-in environment and license validator (
parallels-pro-mcp doctorandscripts/doctor.sh).
Tool Reference
| Tool | Purpose | Confirmation Required | Annotations |
|---|---|---|---|
vm_list |
Discover registered VMs and power states | No | Read-Only |
vm_status |
Inspect detailed VM status, OS, tools version, and uptime | No | Read-Only |
vm_start |
Start a VM by name or UUID | No | Power Change |
vm_stop |
Request graceful ACPI shutdown (never force-kills) | No | Destructive |
vm_suspend |
Suspend VM and preserve guest memory | No | Destructive |
vm_wait_ready |
Poll until the guest OS answers execution probes | No | Readiness |
vm_exec |
Run an argv vector in the guest (supports custom user) |
No (Privileged) | Guest Command |
vm_copy_to_guest |
Stream files or directories from host into guest filesystem | No | File Transfer |
vm_copy_from_guest |
Stream files or directories from guest onto host filesystem | No | File Transfer |
vm_share_folder |
Mount a host directory into the guest (rw or ro) |
No | State Mutating |
vm_unshare_folder |
Remove a previously shared host directory | No | State Mutating |
vm_clone |
Clone a VM (fast linked clone or deep copy) | No | State Mutating |
vm_delete |
Permanently delete a VM and its disks | confirm: true |
Destructive |
vm_set_headless |
Configure headless vs GUI window startup mode | No | State Mutating |
vm_set_network_condition |
Simulate degraded network profiles (3g, wifi, loss, off) | No | State Mutating |
vm_screenshot |
Capture current VM screen to host PNG | No | Read-Only |
vm_send_keys |
Send synthetic keystrokes or chords (e.g. ctrl+alt+del, win+r) |
No | Guest Command |
snapshot_list |
List all snapshots for a VM | No | Read-Only |
snapshot_create |
Create a snapshot with name and optional description | confirm: true |
State Mutating |
snapshot_revert |
Revert VM state to a specified snapshot | confirm: true |
State Mutating |
snapshot_delete |
Permanently delete a snapshot to reclaim host disk space | confirm: true |
State Mutating |
Tool Usage & Cookbook
1. Instant Ephemeral Sandboxing
Create an isolated linked clone in seconds, run tests headlessly, and destroy it when finished:
# Spin up an instant linked clone sharing the base disk
vm_clone(vm="Windows 11", name="Win11-Worker-1", linked=True)
# Run headlessly without displaying a GUI window on the desktop
vm_set_headless(vm="Win11-Worker-1", enabled=True)
# Boot and wait until guest tools are ready
vm_start(vm="Win11-Worker-1")
vm_wait_ready(vm="Win11-Worker-1", timeout_s=120)
# ... perform testing or build tasks ...
# Graceful stop and permanent teardown
vm_stop(vm="Win11-Worker-1")
vm_delete(vm="Win11-Worker-1", confirm=True)
2. Bi-Directional File Transfer
Stream files or entire directory trees between host and guest over stdin/stdout tar archives without needing network mounts or SMB credentials:
# Push local build artifact into the guest Windows Temp folder
vm_copy_to_guest(
vm="Windows 11",
host_path="./dist/myapp.exe",
guest_path=r"C:\Temp\myapp.exe"
)
# Pull test logs or crash dumps back onto the host
vm_copy_from_guest(
vm="Windows 11",
guest_path=r"C:\Temp\test-results",
host_path="./reports/test-results"
)
3. Dynamic Host Folder Sharing
Mount local host directories directly into the VM at runtime:
# Share a host repository with read-only protection
vm_share_folder(
vm="Windows 11",
name="source_code",
host_path="~/projects/myapp",
mode="ro"
)
# Unmount the share when done
vm_unshare_folder(vm="Windows 11", name="source_code")
4. GUI Interaction & Screen Analysis
Interact with native GUI dialogs, installers, or Windows UAC prompts:
# Capture what is currently on the VM screen
vm_screenshot(vm="Windows 11")
# Press Win+R to open the Run dialog
vm_send_keys(vm="Windows 11", combination="win+r")
# Type a command and press Enter
vm_send_keys(vm="Windows 11", text="notepad.exe", keys=["enter"])
# Dismiss a modal with Escape
vm_send_keys(vm="Windows 11", keys=["esc"])
5. Network Simulation & Resilience Testing
Simulate poor connections or complete offline states:
# Throttle bandwidth and latency to emulate a 3G mobile link
vm_set_network_condition(vm="Windows 11", profile="3g")
# Simulate a network blackout (100% packet loss)
vm_set_network_condition(vm="Windows 11", profile="100-percent-loss")
# Restore normal network conditions
vm_set_network_condition(vm="Windows 11", profile="off")
6. Snapshot Baselines
Create rollback points before mutating system state:
# List snapshots
snapshot_list(vm="Windows 11")
# Create a checkpoint
snapshot_create(
vm="Windows 11",
name="clean-state",
description="Clean baseline before test execution",
confirm=True
)
# Revert back to the checkpoint
snapshot_revert(vm="Windows 11", snapshot="clean-state", confirm=True)
# Delete snapshot to reclaim host disk space
snapshot_delete(vm="Windows 11", snapshot="clean-state", confirm=True)
Prerequisites
- macOS with Parallels Desktop Pro or Business Edition installed.
- Note: Parallels Desktop Pro or Business is required for the
prlctlcommand-line utility andprlctl execguest execution.
- Note: Parallels Desktop Pro or Business is required for the
- Parallels Tools installed inside each target guest VM.
- Python 3.10+ and
uv(recommended).
Verify Your Environment
Before connecting an MCP client, run the pre-flight diagnostic:
# Using uv:
uv run parallels-pro-mcp doctor
# Or using the standalone script:
./scripts/doctor.sh
Client Configuration
Claude Desktop
Add the following to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"parallels-pro": {
"command": "uvx",
"args": ["parallels-pro-mcp-server"],
"env": {
"PARALLELS_DEFAULT_VM": "Windows 11",
"PARALLELS_ARTIFACT_DIR": "~/.cache/parallels-mcp"
}
}
}
}
Or when running from a local checkout:
{
"mcpServers": {
"parallels-pro": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/parallels-pro-mcp-server",
"parallels-pro-mcp"
]
}
}
}
Codex / ChatGPT Desktop
In ~/.codex/config.toml:
[mcp_servers.parallels-pro]
command = "uv"
args = ["run", "--project", "/path/to/parallels-pro-mcp-server", "parallels-pro-mcp"]
startup_timeout_sec = 30
tool_timeout_sec = 600
[mcp_servers.parallels-pro.env]
PARALLELS_DEFAULT_VM = "Windows 11"
PARALLELS_ARTIFACT_DIR = "~/.cache/parallels-mcp"
Google Antigravity (Gemini CLI)
Add the server to ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"parallels-pro": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/parallels-pro-mcp-server",
"parallels-pro-mcp"
],
"env": {
"PARALLELS_DEFAULT_VM": "Windows 11",
"PARALLELS_ARTIFACT_DIR": "~/.cache/parallels-mcp"
}
}
}
}
Or using uvx:
{
"mcpServers": {
"parallels-pro": {
"command": "uvx",
"args": ["parallels-pro-mcp-server"]
}
}
}
Environment Variables
| Variable | Description | Default |
|---|---|---|
PARALLELS_DEFAULT_VM |
Fallback VM name or UUID used when a tool argument is omitted | None |
PARALLELS_ARTIFACT_DIR |
Host directory where captured screenshots and artifacts are stored | ~/.cache/parallels-pro-mcp-server |
Safe Operating Sequence for Agents
- Discover: Call
vm_listto see available VMs and states. - Inspect: Call
vm_status(vm="...")to verify guest tools and power status. - Optional Sandbox: For risky or destructive test sessions, call
vm_clone(vm="...", name="agent-sandbox", linked=true)to create a fast, isolated linked clone. - Power Up: If stopped, call
vm_startfollowed byvm_wait_readyto ensure guest tools are responsive. - Inspect Desktop: Call
vm_screenshotto visually check if dialogs or login prompts are blocking the session. - Snapshot Baseline: Call
snapshot_create(vm="...", name="clean-baseline", confirm=true)before performing major tasks. - Transfer & Execute: Use
vm_copy_to_guestto stage scripts,vm_execwith explicit argv arrays to run commands, andvm_copy_from_guestto retrieve build artifacts. - Teardown: Revert via
snapshot_revertor destroy ephemeral sandboxes viavm_delete(vm="agent-sandbox", confirm=true).
Security Model
- Automation Bridge: This server delegates guest execution directly to
prlctl exec. - Privilege & Shared Folders: If your VM has Parallels Shared Folders enabled (e.g.
\\Mac\Homeon Windows or/media/psf/on Linux), guest commands can read and write to your host filesystem. Always run only on trusted virtual machines. - Explicit Argv Only:
vm_execonly accepts argument vectors (list[str]), preventing shell injection on the host.
Development & Testing
# Clone the repository
git clone https://github.com/PopBot/parallels-pro-mcp-server.git
cd parallels-pro-mcp-server
# Install dependencies and sync environment
uv sync
# Run diagnostic doctor
uv run parallels-pro-mcp doctor
# Run test suite with test coverage reporting
uv run coverage run --source=parallels_mcp -m unittest discover -s tests
uv run coverage report -m
For instructions on semantic versioning, GitHub Releases, and PyPI distribution, see the Releasing & Publishing Guide.
License
This project is licensed under the MIT License.
Release files for parallels-pro-mcp-server 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| parallels_pro_mcp_server-0.2.0.tar.gz | 109.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| parallels_pro_mcp_server-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 137.8 kB
Release files / parallels_pro_mcp_server-0.2.0.tar.gz
| Download URL | parallels_pro_mcp_server-0.2.0.tar.gz |
|---|---|
| Size | 109.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9d5b17a812f8da897ec1292c07bc845a04f044ad8fe1799eeb4504fd72df02eb
|
|
BLAKE2b-256 checksum How to use checksums |
b7b2dcb175e92d3d5fb65caf3e34b30e0e90782a27f0b58ebcc9d881743a4d5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / parallels_pro_mcp_server-0.2.0-py3-none-any.whl
| Download URL | parallels_pro_mcp_server-0.2.0-py3-none-any.whl |
|---|---|
| Size | 28.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
91331d7346c17e3f7f6e4f2603a221e44fcae7cb041aec138c827f99e2137857
|
|
BLAKE2b-256 checksum How to use checksums |
b5f2d790cf75e1e98e8dd9e223ac1c90a70b2f263d0545724c27aea740701ccc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log