vm-relay
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_VM_RELAY_URL | No | The loopback vm-service origin. Non-loopback servers, redirects and physical targets are refused. | http://localhost:6240 |
| MCP_VM_RELAY_PYTHON | No | The Python 3 used for the registry lock. | python3 |
| VM_ENVIRONMENT_FILE | No | A selected environment profile; it overrides the URL, state directory and registry above and binds the Tart store. | |
| MCP_VM_RELAY_PROJECT | No | The project directory (the plugin passes Claude Code's). Evidence lands under `relay-evidence/<task>/` there. | |
| MCP_VM_RELAY_SESSION | No | An explicit session identity. By default each server process takes a fresh random one; a stable identity lets a restarted server reconcile and reattach the enclosure of the same identity. | |
| MCP_VM_RELAY_REGISTRY | No | An explicit task registry file; otherwise an existing compatible `~/AGENTS.md` VM table, or a private managed `registry.md` in the state directory. | |
| MCP_VM_RELAY_STATE_DIR | No | Host state directory, otherwise `$XDG_STATE_HOME/mcp-vm-relay` or `~/.local/state/mcp-vm-relay`, one subdirectory per session. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| relay_searchA | Find an installed application in the image inventories by name, then choose an image yourself; optional before relay_acquire. Matches canonical names and aliases by exact, prefix and substring comparison, with an optional hard |
| relay_probeA | Read-only host and service facts, used to judge whether a task is interruptive and to pick an image; it reports current owned state on its own, so call it again after context compaction rather than trusting earlier messages. Default |
| relay_acquisition_capabilitiesA | Read the backend's versioned VNC console options for the images it serves. Read-only: it neither acquires a VM nor recovers ownership of one. |
| relay_acquireA | Acquire one fresh VM for this task and start its ownership heartbeat. Requires |
| relay_stageA | Push and hash-check the guest runtime, plus an optional workspace and support files ( |
| relay_execA | Run one guest command ( |
| relay_scriptA | Run one guest script file as this call's single recorded operation. Evidence is automatic, as for relay_exec, whose optional |
| relay_codeB | Run inline guest code as this call's single recorded operation. Evidence is automatic, as for relay_exec, whose optional |
| relay_runA | Send one tool call to an MCP server inside the VM. |
| relay_toolsA | List a relay_run target's real tools from its server inside the VM: names, descriptions and input schemas; |
| relay_imageA | Retrieve one already-saved image; never a new capture, input or directory export, and it never acquires a VM. |
| relay_extractA | Pull one or more already-declared extraction outputs home early, by |
| relay_finishA | Complete the task: extract every declared output, deliver and verify a portable evidence package, then destroy the VM and unregister it. The result reports delivery, snapshot completeness, execution outcome and human review as separate facts; a verified package is not a passing test, and a delivered package is not itself human approval. Call this, or relay_release, explicitly before you return, since ending the session does not do it for you. A declared output that was never produced is listed in |
| relay_releaseA | Abandon the task: destroy the owned VM and unregister it, retaining whatever evidence already exists, without claiming the task succeeded. Use this instead of relay_finish when the task is not being completed. Safe to retry if a previous release attempt failed; a failed release keeps ownership until destruction is verified. When this session owns no lease, the result is an error saying that nothing was released; a lease acquired under another session identity is never guessed at. |
| relay_console_resolveA | Refresh this session's non-secret console-viewing status for the owned lease. Read-only, and it never recovers ownership. A |
| relay_console_openA | Open console viewing for the owned lease, only following an explicit user request to watch. Requires |
| relay_console_cancelA | Cancel an open or uncertain console-viewing attempt by |
| relay_statusA | Show this session's owned VM lease (backend binding, guest state, renewal, console observation, last error), staging state and evidence path, plus the project directory, the VM service origin and the selected environment in use; active:false when nothing is owned. Read-only; it does not touch the VM. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 18 tools
Tools cover distinct phases: discovery (search/probe/capabilities/tools), lifecycle (acquire/stage/finish/release/status), execution (run/exec/script/code), evidence (image/extract), and console. A few read-state tools (probe vs status) and execution variants could be confused, but descriptions draw clear boundaries.
All tools use a relay_ prefix and snake_case, with no mixed casing or inconsistent styles. The suffixes vary by action, but the naming convention is highly predictable across the set.
18 tools is slightly above the typical 3-15 sweet spot, but the surface spans discovery, lifecycle, execution, evidence, console, and status for a complex VM relay. Most tools have a clearly necessary role.
Covers full VM lifecycle from image discovery and acquisition through staging, execution, evidence extraction, and finish/release, plus console and status. No obvious dead ends for the one-task-per-enclosure workflow.