Skip to main content
Glama

Nemeton MCP Server

Swift Platform License MCP juergenkoller-software/nemeton-mcp MCP server

Control native macOS virtual machines from Claude Desktop, Claude Code, Cursor, or any MCP client.

This is the official Model Context Protocol bridge for Nemeton — a native macOS app that creates and manages Linux and macOS VMs using Apple's Virtualization.framework (no Parallels, no VMware, no subscriptions).

You need the Nemeton app installed and running. This MCP server is a thin stdio→HTTP bridge — the actual VM logic lives in the app. Get Nemeton at store.juergenkoller.software/apps/nemeton.


What you can do

"Claude, spin up an Ubuntu 24.04 VM with 4 CPUs and 8 GB RAM, install Docker, and tell me when it's ready."

The MCP server exposes 50+ tools across these categories:

Category

Tools

VM Lifecycle

list_vms, get_vm, create_vm, update_vm, clone_vm, delete_vm, reorder_vms, stop_all

VM Control

start_vm, stop_vm, force_stop_vm, pause_vm, resume_vm, suspend_vm, get_suspend_status

Snapshots (CoW on APFS)

list_snapshots, create_snapshot, restore_snapshot, delete_snapshot

Console

send_console, read_console, console_execute, take_screenshot

Networking & Files

vm_ip, ssh_execute, file_upload, file_download, file_list

GUI Control

gui_launch, gui_windows, vscode_command, select_vm

Clipboard Bridge

clipboard_read, clipboard_write

Host Info

get_host_info, get_metrics

Storage

resize_disk, export_vm, import_vm

Distros

list_distros (Ubuntu, Debian, Fedora, Arch — auto-download ISOs)

Display

fullscreen_enter, fullscreen_exit, fullscreen_toggle

Webhooks

list_webhooks, register_webhook, delete_webhook

Runtime

vm_runtime, vm_errors, list_downloads

Each tool returns structured JSON with VM state, snapshot metadata, console output, or operation result.


Related MCP server: FreezeText MCP

Installation

Prerequisites

  1. macOS 14 (Sonoma) or later — required for Virtualization.framework features.

  2. Nemeton app installed and running — get it here.

  3. Swift 5.9+ (Xcode 15+) if you want to build from source. Pre-built binaries are also available.

Build from source

git clone https://github.com/juergenkoller-software/nemeton-mcp.git
cd nemeton-mcp
swift build -c release
# Binary: .build/release/NemetonMCP

Pre-built binary

Download the latest NemetonMCP binary from the Releases page.


Configuration

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "nemeton": {
      "command": "/path/to/NemetonMCP",
      "env": {
        "NEMETON_PORT": "22100",
        "NEMETON_TOKEN": "your-token-here"
      }
    }
  }
}

Get NEMETON_TOKEN from Nemeton → Settings → API & Integrations.

Claude Code

Add to ~/.claude/mcp.json (or via claude mcp add):

claude mcp add nemeton /path/to/NemetonMCP \
  --env NEMETON_PORT=22100 \
  --env NEMETON_TOKEN=your-token-here

Cursor / other MCP clients

Same pattern: configure NemetonMCP as a stdio MCP server with the two environment variables above.


How it works

┌────────────────┐  JSON-RPC stdio   ┌────────────────┐  HTTP+Bearer   ┌────────────────┐
│  Claude/Cursor │ ───────────────►  │  NemetonMCP    │ ─────────────► │  Nemeton.app   │
│  (MCP client)  │ ◄───────────────  │   (this repo)  │ ◄───────────── │  (port 22100)  │
└────────────────┘                   └────────────────┘                └────────────────┘

The bridge reads JSON-RPC 2.0 requests from stdin, forwards them to Nemeton's local HTTP server at 127.0.0.1:22100/mcp, and writes responses back to stdout. All authentication, VM logic, and tool dispatch happens inside the Nemeton app.

This split lets us keep the MCP wire format open-source (so you can audit it, fork it, or run it through any sandboxing layer you prefer) while the VM internals stay in the app.


Environment variables

Variable

Default

Description

NEMETON_PORT

22100

Port of Nemeton's local HTTP server

NEMETON_TOKEN

(none)

Bearer token from Nemeton Settings (required for write operations)

Errors and trace logs are written to stderr so they don't pollute the JSON-RPC stdout channel.


About Nemeton

Nemeton is a native macOS app for creating and managing virtual machines using Apple's Virtualization.framework. Highlights:

  • No subscription — one-time purchase, €389

  • Linux & macOS VMs with automatic ISO/IPSW download

  • CoW snapshots on APFS — save VM states without wasting disk

  • REST API + WebSocket events (42 endpoints) for automation

  • MCP server (this repo) for Claude/AI agents

  • Native performance — uses Apple's framework directly, no QEMU overhead

  • 100% local — no cloud, no telemetry

→ Get Nemeton at store.juergenkoller.software


License

MIT — see LICENSE. The bridge is open source; the Nemeton app itself is commercial.

Issues & support

Built by Juergen Koller Software GmbH.

Available Tools

49 tools
clipboard_readB

Read the shared clipboard from a VM.

Inputs: vm (required).

clipboard_writeC

Write text to a VM's shared clipboard.

Inputs: vm (required), text (required).

clone_vmA

Clone an existing VM, optionally under a new name.

Inputs: vm (required), name.

console_executeC

Run a command via the VM console and return its output.

Inputs: vm (required), command (required).

create_snapshotB

Create a copy-on-write snapshot of a VM.

Inputs: vm (required), name.

create_vmB

Create a new VM from a Linux distribution image.

Inputs: name (required), distro (required), cpu, diskGB, +1 more.

delete_snapshotC

Delete a VM snapshot.

Inputs: vm (required), snapshot (required).

delete_vmB

Delete a VM and its disk image.

Inputs: vm (required).

delete_webhookC

Delete a registered webhook.

Inputs: id (required).

export_vmB

Export a VM to a portable bundle.

Inputs: vm (required), path.

file_downloadC

Download a file from a VM to the host.

Inputs: vm (required), localPath (required), remotePath (required).

file_listC

List files in a directory inside a VM.

Inputs: vm (required), path (required).

file_uploadC

Upload a file from the host into a VM.

Inputs: vm (required), localPath (required), remotePath (required).

force_stop_vmB

Immediately power off a VM.

Inputs: vm (required).

fullscreen_enterB

Enter fullscreen for a VM display.

Inputs: vm (required).

fullscreen_exitA

Exit fullscreen display mode.

Inputs: no named parameters.

fullscreen_toggleB

Toggle fullscreen for a VM display.

Inputs: vm (required).

get_host_infoA

Get host machine info (CPU, memory, macOS version).

Inputs: no named parameters.

get_metricsB

Get host resource-usage metrics.

Inputs: no named parameters.

get_suspend_statusB

Get the suspend/resume status of a VM.

Inputs: vm (required).

get_vmB

Get configuration and current state of a single VM.

Inputs: vm (required).

gui_launchB

Launch a GUI application inside a VM.

Inputs: vm (required), app (required).

gui_windowsB

List open GUI windows in a VM.

Inputs: vm (required).

import_vmC

Import a VM from a bundle.

Inputs: path (required).

list_distrosB

List available Linux distributions (ISOs auto-downloaded on demand).

Inputs: no named parameters.

list_downloadsA

List downloaded distro ISOs and their status.

Inputs: no named parameters.

list_snapshotsB

List APFS copy-on-write snapshots of a VM.

Inputs: vm (required).

list_vmsA

List all configured virtual machines with their current state.

Inputs: no named parameters.

list_webhooksA

List registered webhooks.

Inputs: no named parameters.

pause_vmC

Pause a running VM.

Inputs: vm (required).

read_consoleC

Read recent output from a VM's serial console.

Inputs: vm (required).

register_webhookC

Register a webhook for VM lifecycle events.

Inputs: url (required), events.

reorder_vmsC

Reorder the VM list.

Inputs: order (required).

resize_diskC

Resize a VM's virtual disk.

Inputs: vm (required), sizeGB (required).

restore_snapshotB

Restore a VM to a previous snapshot.

Inputs: vm (required), snapshot (required).

resume_vmB

Resume a paused VM.

Inputs: vm (required).

select_vmA

Select/focus a VM in the Nemeton UI.

Inputs: vm (required).

send_consoleB

Send text or keystrokes to a VM's serial console.

Inputs: vm (required), text (required).

ssh_executeC

Run a command inside a VM over SSH.

Inputs: vm (required), command (required).

start_vmC

Start a VM.

Inputs: vm (required).

stop_allB

Stop all running VMs.

Inputs: no named parameters.

stop_vmB

Gracefully shut down a running VM.

Inputs: vm (required).

suspend_vmC

Suspend a VM to disk.

Inputs: vm (required).

take_screenshotB

Capture a screenshot of a VM's display.

Inputs: vm (required).

update_vmC

Update a VM's configuration (CPU, memory, etc.).

Inputs: vm (required), cpu, memoryMB.

vm_errorsC

Get recent errors reported for a VM.

Inputs: vm (required).

vm_ipB

Get the IP address of a running VM.

Inputs: vm (required).

vm_runtimeB

Get runtime info for a VM (uptime, resource usage).

Inputs: vm (required).

vscode_commandC

Run a VS Code command inside a VM.

Inputs: vm (required), command (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.9/5.0

    Scored across 49 tools

    Disambiguation3/5

    Most tools map cleanly to distinct VM operations, but several overlapping mechanisms create ambiguity: console_execute vs ssh_execute vs send_console all involve running or sending commands into a VM, and fullscreen_enter/fullscreen_exit/fullscreen_toggle are largely redundant. An agent must read descriptions carefully to avoid picking the wrong execution path.

    Naming Consistency3/5

    The dominant pattern is verb_noun in snake_case (list_vms, create_snapshot, register_webhook), but there are inconsistent exceptions: vm_ip, vm_runtime, and vm_errors lack verbs, fullscreen_enter/fullscreen_exit/fullscreen_toggle invert the verb/noun order, and console_execute reverses the typical verb-first style. The names are readable but not fully predictable.

    Tool Count2/5

    49 tools is well beyond the 25-tool threshold and includes many micro-actions such as fullscreen_enter/fullscreen_exit/fullscreen_toggle, select_vm, and clipboard_read/write that could be combined or left to client-side wrappers. The broad VM-management scope justifies a large API, but as an MCP surface it is heavy and harder for agents to navigate.

    Completeness5/5

    The tool set covers the full VM lifecycle: create/get/update/clone/delete, power and suspend states, snapshots, console/SSH access, file transfer, GUI interaction, host metrics, disk resize, export/import, distros, and webhooks. There are no obvious dead ends or missing core operations for managing VMs on macOS. It is arguably more complete than needed, but not incomplete.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      MCP server for FreezeText — OCR anything on your Mac screen from Claude, Cursor, or any MCP client. Freeze the screen and extract text via Apple Vision (videos, popups, protected PDFs), OCR a region or a base64 image, and manage a searchable capture history. 12 tools. Bridge open-source (MIT), FreezeText app is free.
      12
      1
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      426+ MCP tools for macOS, all on-device — local AI inference (llama.cpp on Metal), voice, vision OCR, local RAG, browser automation, and ~140 system actions across 26 macOS domains. Nothing leaves your Mac.
      3
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      MCP server that gives Claude and local LLMs access to Apple's on-device frameworks — Vision OCR, NSDataDetector, and Apple Intelligence FoundationModels. Everything runs on your Mac with zero data leaving.
      1
      MIT