ericsciple/microVM agent harness

Safely run an AI agent prompt inside a hardware-virtualized microVM. Credentials, egress firewall, MCP gateway, and MCP servers stay on the runner host, outside the VM. Safe by default. (Prototype — see TODO.md.)

View on GitHub

Trust Signals

Scorecard Score
not yet scored
Maintenance Recency
Stale
License
None
namedescriptionrequireddefault
promptThe task for the agent.yes
modelModel passed to the Copilot CLI.noauto
mcp-configAdditional MCP servers as a JSON string in Copilot MCP JSON format ({"mcpServers": {...}}). This is also how safe outputs are added (they are just MCP servers). Merged in behind the gateway. Real secrets referenced here are kept host-side and never placed in the guest's config.no""
github-mcpAdd the default read-only GitHub MCP server (named 'github').notrue
firewall-allowExtra egress hosts (newline-separated) allowed on top of the deny-all baseline.no""
mountsWhich host paths to expose inside the guest (cumulative enum): 'none' mounts nothing (hermetic agent); 'workspace' (default) mounts GITHUB_WORKSPACE read-only with a throwaway write overlay; 'workspace+toolcache' also mounts RUNNER_TOOL_CACHE read-only. Mapped to well-known guest paths (workspace -> /__w, toolcache -> /__t) like Actions container jobs, with GITHUB_WORKSPACE/RUNNER_TOOL_CACHE set to match. Only the tool-cache entries from the host PATH are carried into the guest (rewritten to /__t). Writes are discarded; the only durable output path is a safe output.noworkspace
copy-eventCopy the triggering event payload (GITHUB_EVENT_PATH's event.json) into the guest as agent context, and repoint GITHUB_EVENT_PATH at the copy. Only event.json is copied — never RUNNER_TEMP. Set to 'false' to withhold it.notrue
timeout-minutesHard cap on the agent run.no15
github-tokenToken the HARNESS itself uses host-side — for the inference gateway (copilot-requests) and the default read-only 'github' MCP server it provides. Held on the host; the guest never sees it. NOTE: this is NOT how safe-output or other user MCP servers get a token — those receive it via their own `env` block in mcp-config (e.g. GITHUB_TOKEN set to the workflow's github.token), like any MCP server. Requires 'copilot-requests: write' for inference. The caller must pass this (e.g. github-token set to the workflow's github.token); the action also falls back to the GITHUB_TOKEN environment variable.no""
rootfsAdvanced: path to a custom guest rootfs ext4 to boot instead of the fetched bare rootfs. Must satisfy the contract: x86_64 + glibc >= 2.28 + libstdc++.so.6 present (no musl/Alpine). Preflighted before boot.no""
namedescription
statusResult status of the agent run.