-
-
Notifications
You must be signed in to change notification settings - Fork 178
v2 MCP Server
Pro feature · BETA — see Free vs Pro.
The MCP server exposes your WSL environment (or your VMs on macOS) to AI agents through the Model Context Protocol — think of it as a terminal, but for your agent. Claude Desktop, Claude Code, opencode and any other MCP client can list your instances, create and configure them, run commands and hold real interactive shell sessions. The built-in AI assistant uses exactly the same tools.
Enable it under Settings → MCP Server (WSL API) (on macOS: MCP Server (VM API)).

Once enabled, the app shows the server URL and an access token:

The server speaks streamable HTTP on http://127.0.0.1:59133/mcp and every request must carry the access token as a bearer token:
Authorization: Bearer <your token>
Copy both values with the buttons next to them. The eye icon reveals the token; the circular arrow generates a new one (any client using the old token stops working immediately).
Claude Desktop — click Connect Claude Desktop in the MCP panel. It writes the entry below into claude_desktop_config.json for you (needs Node.js); restart Claude Desktop afterwards. To do it by hand, or for any other stdio-only MCP client, bridge the HTTP endpoint with mcp-remote:
Claude Code — same bridge, one command:
claude mcp add wsl-manager -- npx -y mcp-remote http://127.0.0.1:59133/mcp \
--header "Authorization: Bearer <TOKEN>"opencode — add it under mcp in your opencode.json (or ~/.config/opencode/opencode.json):
{
"mcp": {
"wsl-manager": {
"type": "local",
"command": ["npx", "-y", "mcp-remote", "http://127.0.0.1:59133/mcp",
"--header", "Authorization: Bearer <TOKEN>"]
}
}
}Any MCP client that speaks streamable HTTP can also point straight at the endpoint with an Authorization: Bearer <TOKEN> header, skipping mcp-remote.
Instances
| Tool | Purpose |
|---|---|
wsl_list_distros |
List installed distros and which are running |
wsl_distro_info |
State, install path and disk size of one distro |
wsl_status |
WSL version, kernel, default distro and default WSL version |
wsl_list_online_distros |
What wsl --list --online offers |
wsl_list_catalog |
The app's own curated rootfs catalogue (name → URL) |
wsl_install_distro |
wsl --install from the online catalogue, headless |
wsl_import_distro |
Create a distro from a rootfs tarball (local path or URL) |
wsl_import_in_place |
Register an existing .vhdx where it lies |
wsl_export_distro |
Back up a distro to tar / tar.gz / tar.xz / vhd |
wsl_package_distro / wsl_install_package
|
Build or install a portable .wsl package |
wsl_move_distro / wsl_resize_distro / wsl_compact_disk
|
Move to another folder, grow the disk, compact it |
wsl_set_default_distro / wsl_set_default_user / wsl_set_version
|
Defaults and WSL 1 ↔ 2 conversion |
wsl_stop_distro / wsl_shutdown
|
Stop one distro, or all of WSL (needed for .wslconfig changes) |
wsl_unregister_distro |
Permanently delete a distro — refuses unless confirm is true |
Configuration, files and disks
| Tool | Purpose |
|---|---|
wsl_get_wsl_conf / wsl_set_wsl_conf
|
Read or set keys in a distro's /etc/wsl.conf
|
wsl_get_wslconfig / wsl_set_wslconfig
|
Read or set keys in the global .wslconfig
|
wsl_copy_to / wsl_copy_from
|
Copy a single file into or out of a distro |
wsl_list_physical_disks / wsl_list_mounted_disks
|
What can be mounted, what is mounted |
wsl_mount_disk / wsl_unmount_disk
|
wsl --mount / --unmount (Windows asks for admin rights) |
Commands, snippets and recipes
| Tool | Purpose |
|---|---|
wsl_run_command |
Run a shell command in an instance and return its output (default root, 300 s timeout; starts a stopped distro, a VM must be running) |
wsl_terminal_start / _send / _read / _signal / _list / _close
|
Persistent interactive shell sessions — send input, poll output, wait for a regex, send Ctrl-C / Ctrl-D / EOF, kill |
wsl_list_snippets / _get_snippet / _create_snippet / _delete_snippet
|
Manage saved snippets |
wsl_list_recipes / wsl_install_service
|
List and install the one-click service recipes (MinIO, Postgres, MySQL, ClickHouse, Redis, RabbitMQ, Kafka) |
Virtual machines (macOS only)
| Tool | Purpose |
|---|---|
vm_list_images |
The curated installer ISO and cloud image catalogue |
vm_create_linux |
Create a Linux VM from a catalogue id, a local ISO or a disk image — a boot source is mandatory |
vm_create_macos |
Create a macOS guest from a local .ipsw or the latest supported restore image (Apple Silicon) |
vm_start |
Start a VM, headless or with its window |
vm_ip |
The IP of a running VM, for SSH or reaching services inside it |
vm_import_image |
Create a VM from an existing raw disk image, e.g. an exported template |
The wsl_* instance, command, snippet and recipe tools work on VMs too — the names stay the same so agents don't need two vocabularies.
One-shot vs. sessions: wsl_run_command runs a command and returns when it finishes. The wsl_terminal_* tools keep a real shell alive across calls, which is what you want for a REPL, a build watcher, or anything that needs input after it has started. Closing the server (or quitting the app) closes any open terminal sessions.
Sandbox tools (sandbox_run_command, sandbox_read_file, sandbox_write_file, sandbox_terminal_*) are not served to external clients; they only exist inside sandbox chats.
By default the server is bound to 127.0.0.1 and is unreachable from any other machine — including others on your LAN.
If you need a remote client to reach it, the Expose via Cloudflare Tunnel toggle creates a temporary public HTTPS URL that forwards to your local server. No Cloudflare account is needed; the app downloads the cloudflared helper for your platform on first use, and the panel shows the Public URL with a copy button.
⚠️ Understand what this does. It puts your MCP server — and everything it can do, including creating, deleting and running commands in your instances — on the public internet. Your access token is the only thing protecting it. Treat that token like a password, only enable this when you actually need remote access, and turn it off when you're done. Stopping the MCP server also tears down the tunnel.
- Local-only by default (
127.0.0.1), never LAN-exposed unless you opt in - Bearer token required on every request, regenerable at any time
- Deleting a distro requires an explicit
confirmflag; there is no tool that deletes a VM - The token is stored locally on your machine only