Skip to main content
Glama

terrarium

Real, disposable computers in seconds, for you and your AI agent.

Fork a fresh Windows or Linux machine, use it, break it, reset it to spotless in the time it takes to read this.

CI Go License

one command, a real Windows machine

Get started

You need a Windows host with VirtualBox 7.x. Do not have it yet?

winget install Oracle.VirtualBox

With Claude Code

One command. npx fetches the package with the terrarium binary inside, so there is nothing else to install:

claude mcp add -s user terrarium -- npx -y terrarium-mcp mcp

Open a new Claude Code session and ask for a machine:

Fork a fresh debian-12 machine, run uname -a in it, then delete it.

The agent checks the host, downloads the image, builds it, forks it, and reports back. Linux images download themselves; a Windows machine needs an installation ISO from you, once - see Images.

From the command line

npm i -g terrarium-mcp

Then:

$ terrarium doctor                 # can it talk to VirtualBox?
$ terrarium get debian-12          # download the image, boot it once, snapshot it (~1 min)
$ terrarium fork debian-12 t1      # a throwaway machine, SSH-ready in ~20s
$ terrarium exec t1 -- uname -a
$ terrarium revert t1              # back to clean in seconds

ssh t1 opens a shell, rm t1 deletes the machine, down and start park and wake it. fork --ttl 2h marks an env to expire and terrarium gc removes the expired ones.

No Node? Install covers Scoop, Go, and other MCP clients.

Related MCP server: wisp

Why

Containers are the right way to ship a Linux service and the wrong way to test a whole system: every container borrows the host's kernel, so a build that passes in one can still fail on real hardware. VMs have always fixed that. What they lacked was the container workflow: image, run, throw away.

terrarium is that workflow on top of the VirtualBox you already have. Fork a golden image in a tenth of a second. Wreck the fork and put it back in seconds. Do it from the command line, or hand the same power to an AI agent over MCP. It ships no virtualization code, wraps VBoxManage, and never touches a VM it did not create.

What people use it for:

  • Set the goal, walk away. Give an agent a real disposable machine over MCP and a goal; it builds, fails, reverts, and retries on its own, unsupervised, all the way to installing something end to end - and the task can involve the screen, not just the command line.

  • Let an agent test an install end to end on a real machine, from first boot to a working app.

  • Let an agent write a guide or reproduce a bug and hand back a step-by-step screenshot trail or a GIF, exactly like the recordings in this README.

  • Isolated, disposable, real. Do sensitive or risky work on a machine you can throw away, so it never touches your own.

  • Clean-machine testing. Run your installer or build on a machine that has never seen your dev setup, and "works on my machine" stops being an argument.

Contents

Features

Every recording below is real: real commands, real screenshots read from the guest's video memory, and a timer that shows real wall-clock seconds. docs/demo explains how they are made.

Fork Windows: a desktop from cold in ~40s

fork a Windows machine

Fork Linux: SSH answering in ~20s

fork a Linux machine

Brick it, then revert it: clean again in 13s

break a machine past boot, then revert it

Claude wins Minesweeper on XP: no SSH, nothing installed

Claude wins Minesweeper on a Windows XP fork through the hypervisor

How it compares

terrarium

Docker

VirtualBox

Vagrant

Hyper-V

Multipass

WSL2

a real, whole machine (its own kernel)

Windows guests

legacy guests (XP era)

new machine in one command, seconds

reset to clean state in seconds

environment shared as a small text file

drives GUI-only guests (screen, mouse)

AI agent tools built in (MCP)

production workloads

runs on any host OS

If your work fits in a container, use Docker. When it needs a real, whole machine you can break and un-break - and the last two rows are prices you can pay - the first column is the point of this project. VirtualBox gets its own column on purpose: terrarium runs on it, so the green half of that column is the engine, and the red half is what this project adds.

A dev environment per project

# terrarium.yaml, committed in your repo
image: ubuntu-24.04
cpus: 4
memory: 4096

terrarium up forks an env named after the project, shares the project folder at /work in the guest, and adds it to ~/.ssh/config, so ssh <project> works and VS Code Remote-SSH sees it one click away. down parks it, up brings it back, revert resets it.

Everyday commands

terrarium ls lists the machines with their guest type, and terrarium info <name> reports one in full - architecture, hardware, snapshot, credentials. terrarium cp ./app.tar t1:/tmp/ moves files in or out over the env's own SSH. terrarium create s11 --iso suse.iso --ostype OpenSUSE_64 installs an OS by hand from an ISO, see Images.

  • exec <env> --shell powershell|cmd|sh -- <command...> runs the command under that shell instead of the one the guest's sshd would pick.

  • exec <env> --stdin reads a whole script from stdin and runs it in the guest, so nothing in it needs escaping.

  • exec <env> --kill-on-timeout kills the command and its children in the guest when the timeout fires, instead of leaving it running unwatched.

  • exec <env> --desktop runs it in the logged-in session of a Windows guest, so a window or a dialog it opens is on the screen screenshot shows.

Your AI agent gets real computers

Setup is one command - see Get started. The same binary is an MCP server: every command above as a tool, plus screenshot, click, scroll, type, and keys - screen, mouse and keyboard injected through the hypervisor, so nothing is installed in the guest and no network or guest additions are needed. That is how an agent drives an installer, a login screen, or an OS too old for SSH - exactly what the Minesweeper recording above shows. On connect the server tells the agent to run doctor first and report what is missing instead of flailing.

  • "Fork a clean env, build the project in it, tell me what the README missed."

  • "Install our app on the Windows env and screenshot each step."

For Windows guests with SSH, terrarium rdp opens a full desktop already logged in.

Install

Get started has the two fast paths. Everything else about installing is here. terrarium is a single Windows binary; VirtualBox 7.x is the only thing it needs on the host.

Scoop (no Node needed)

If you do not have Scoop yet, from a normal (non-admin) PowerShell:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

Then:

scoop bucket add terrarium https://github.com/chryaner/terrarium
scoop install terrarium

If you installed Scoop in this same window, its shims are not on the current shell's PATH yet, so terrarium will not be found. Open a new terminal, or refresh PATH in place:

$env:Path = [Environment]::GetEnvironmentVariable('Path','User') + ';' + [Environment]::GetEnvironmentVariable('Path','Machine')

The Scoop binary is the same MCP server: claude mcp add -s user terrarium -- terrarium mcp.

Go

go install github.com/chryaner/terrarium/cmd/terrarium@latest

Run it without installing

npx runs the CLI straight from the package cache: npx -y terrarium-mcp doctor.

Other MCP clients

Any client that launches stdio servers takes the same command. In JSON form:

{
  "mcpServers": {
    "terrarium": {
      "command": "npx",
      "args": ["-y", "terrarium-mcp", "mcp"]
    }
  }
}

Updating

npm update -g terrarium-mcp or scoop update terrarium. npx -y picks up new versions on its own. terrarium version prints what you have.

git-bash

MSYS rewrites absolute paths in arguments (/etc/hosts becomes C:/Program Files/Git/etc/hosts) before terrarium ever sees them. Prefix the command with MSYS_NO_PATHCONV=1 to stop it.

How fast

operation

measured

fork a golden (linked clone)

0.1 s

Linux fork to SSH answering (cold)

~20 s

Windows fork to a usable desktop (cold)

~40 s

revert to clean state (RAM resume)

8-11 s

snapshot a running machine (RAM)

4 s

disk per fork

28-48 MB

build a Linux golden from scratch

~40 s

Measured on a desktop (i9-14900K, NVMe, VirtualBox 7.2). Your numbers will differ; the shape will not. Forks are linked clones: they share the golden's disk, which is why cloning costs a tenth of a second and megabytes, not minutes and gigabytes.

Images

A golden is the vendor's own published image plus a few lines of YAML, so the bytes always come from the distribution that maintains them. Adding an image is a pull request with one file.

Linux: downloaded for you

terrarium get <name> downloads the official cloud image, seeds it with a generated SSH key, boots it once, and snapshots it. About a minute each.

recipe

downloads from

ubuntu-24.04

cloud-images.ubuntu.com

ubuntu-22.04

cloud-images.ubuntu.com

debian-12

cloud.debian.org

debian-13

cloud.debian.org

alma-9

repo.almalinux.org

rocky-9

dl.rockylinux.org

fedora-44

fedoraproject.org

opensuse-16.0

download.opensuse.org

Windows: bring your own ISO

There is no Windows cloud image and Microsoft's media cannot be redistributed, so you download the ISO once and terrarium runs the real installer unattended:

  1. Download the installation ISO from Microsoft.

  2. Save it in %LOCALAPPDATA%\terrarium\isos\, named for the recipe: win10.iso, winxp.iso.

  3. terrarium get win10. Fully unattended: about ten minutes for win10, seven for XP.

A win10 golden comes out key-based like the Linux ones: the install generates an ed25519 pair, puts the public half in the guest and records the private one, so ssh and scp from the generated ~/.ssh/config entry never prompt. Its SSH sessions land in PowerShell, so exec quotes for PowerShell rather than cmd.exe. A golden built by an older terrarium keeps its password and its cmd shell; re-run terrarium get win10 --force to rebuild it.

win10 and winxp ship today. XP predates OpenSSH, so its forks are driven through screenshot, click, type and keys rather than exec, and its recipe needs a product key you supply in a local override. Recipe details, private mirrors and the unattended-install internals are in docs/DESIGN.md.

adopt --transport guestcontrol --user <u> --password <pw> reaches a Windows with no SSH server through VirtualBox Guest Additions instead, if they are installed in it, and exec, cp and the MCP tools then work on its forks.

Install any OS from an ISO by hand

Some systems have neither a cloud image nor an installer that can be answered in advance. terrarium create <name> --iso <path> --ostype <type> builds a blank machine with the ISO in its drive and boots it, and you answer the installer through screenshot, type, keys and click - revert puts the blank disk back if you want to start over. The machine has no credentials until the install is done: promote it into a golden, then adopt that golden with the user and password you created inside it.

Layer your own

A recipe can build on another image instead of on media: from names the base, setup runs commands in a fork of it, and the result is flattened into a new golden. The YAML file is the shareable artifact - a teammate with the same file builds an equivalent machine from their own base, so no disk image (and no Windows license) ever changes hands.

# %LOCALAPPDATA%\terrarium\recipes\team-dev.yaml
name: team-dev
from: debian-12
setup:
  - sudo apt-get update
  - sudo apt-get install -y git build-essential

terrarium get team-dev builds it in seconds on top of an existing base. For state you made by hand rather than by script, terrarium promote <env> <name> flattens a configured env into a golden directly. terrarium rm --golden <name> removes an image you are done with.

Machines you already have

terrarium adopt <vm> records a VirtualBox VM you built yourself as a golden, without modifying it. terrarium import <file.ova> --name <golden> does the same for an appliance file: it imports and snapshots it, and seeds nothing, so an export that predates cloud-init imports instead of hanging.

Neither needs credentials. When you do not know the login yet, adopt or import without one, fork it, and drive the fork through the console:

$ terrarium import centos6.ova --name centos6
$ terrarium fork centos6 probe
$ terrarium screenshot probe          # read the login prompt
$ terrarium type probe root --enter   # try one
$ terrarium screenshot probe          # did it take?
$ terrarium adopt trr-golden-centos6 --name centos6 --user root --password <pw>

Re-running adopt updates the record, so the last line is how a credentialless golden becomes one exec and ssh work against. terrarium info <name> reports what a golden or env actually is - guest type, architecture, hardware, snapshot and which credentials are recorded - and screenshot works on any running machine, including a golden or a VM terrarium does not manage.

What it is not

  • Not cross-platform yet. The host must be Windows with VirtualBox. Every hypervisor call sits behind one package by design, so a QEMU or Hyper-V driver is a planned door, not a promise.

  • Not for production. Forks are cattle for development and testing.

  • Not a secrets manager. A Windows golden's password is stored in plain text locally and is briefly visible on the VBoxManage command line during the install. Use a throwaway password.

License

Apache-2.0. Recipes, issues and field reports welcome, the most useful contribution is a recipe for an image people actually use.

Available Tools

24 tools
doctorA

Check that this machine can run terrarium at all: VirtualBox present and responding, state directory writable, SSH client available. Call this once before anything else. Cheap and safe to call at any time. If it reports ok:false, report the failing check and its fix to the user rather than working around it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
checksYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states that the operation is a non-destructive check, calls it 'cheap and safe', and describes the failure contract involving ok:false with actionable remediation. This is strong transparency beyond what structured data provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, with each sentence serving a distinct purpose: what is checked, when to call it, safety, and failure handling. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless preflight check with an output schema, the description provides a complete practical contract: prerequisites checked, invocation order, safety profile, and failure behavior. Nothing essential for an agent to select or invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter documentation needed. The description appropriately focuses on behavioral contract rather than inputs, matching the baseline expected for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: checking whether the machine can run terrarium. It enumerates the specific checks performed (VirtualBox, state directory, SSH client), making it easy to distinguish from sibling env_* tools that manipulate or inspect environments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to call this tool ('once before anything else'), notes it is safe to call at any time, and explains how to handle a failure (report the failing check and its fix rather than working around it). This fully covers usage context and expected behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_clickA

Click the environment's screen at a pixel position, 0-based, exactly as seen in env_screenshot. Left button unless button says otherwise; double for a double-click. Like env_screenshot it goes through the hypervisor and needs nothing of the guest, but the click lands wherever the pixel says, so screenshot first and aim. The environment must be running.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYespixel column, 0-based, as seen in env_screenshot
yYespixel row, 0-based, as seen in env_screenshot
nameYesname of the environment
buttonNoleft (default), right or middle
doubleNodouble-click

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does substantial work: it explains that clicks go through the hypervisor, require no guest agent, and land exactly where the pixel points. It could add more about potential side effects, but for a click tool the core behavior is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the action. All three sentences carry useful information, though the middle sentence is slightly long and partially overlaps with schema-provided defaults.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a click tool with an output schema and 100% parameter coverage, the description covers coordinate sourcing, environment state, button behavior, double-click behavior, and the underlying mechanism. Nothing essential is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description mostly restates what the schema already says about x/y being pixel positions and the button/double defaults; it adds operational context like "screenshot first" but little new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Click the environment's screen at a pixel position." It also clarifies the coordinate frame by referencing env_screenshot, which distinguishes this tool from screenshot, scroll, and type operations among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational conditions: "screenshot first and aim" and "The environment must be running." It also explains button and double-click behavior, but it does not explicitly contrast with alternatives such as env_type or env_scroll.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_createA

Create a blank environment with an installation ISO in its DVD drive and boot it, for an OS that has no recipe and no unattended installer - an old distribution, or one whose installer has to be answered by hand. The boot order is disk first, DVD second, so the installer runs while the disk is blank and the installed system boots itself afterwards. The result has no golden image and therefore no credentials: env_exec will not work on it. Drive the installer with env_screenshot, env_type, env_keys and env_click, and note that env_revert puts the blank disk back and restarts the install. When the OS is up, env_promote turns it into a golden - and golden_adopt then records the account created inside it. iso_path is a path on this host, where the server runs.

ParametersJSON Schema
NameRequiredDescriptionDefault
cpusNoCPUs, default 2
nameYesname for the new environment: letters, digits and dashes
ostypeYesVirtualBox guest type, for example Linux_64, OpenSUSE_64 or Windows10_64
disk_gbNosize of the blank disk in GB, default 32; it is dynamic and grows on demand
iso_pathYesabsolute path on THIS host to the installation ISO
memory_mbNomemory in MB, default 2048

Output Schema

ParametersJSON Schema
NameRequiredDescription
envYes
logNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses boot order (disk first, DVD second), the lack of a golden image and credentials, the fact that env_exec will not work, and the behavior of env_revert resetting the blank disk and restarting the install.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence serves a purpose: purpose, boot behavior, missing credentials, drive workflow, and post-install promotion. The description is dense but well-structured, front-loading the core use case and then explaining consequences and next steps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and lack of annotations, the description is complete: it explains what is created, the boot/install flow, why env_exec won't work, how to interact during installation, and what to do afterward. An output schema exists, so return-value details are not required here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters. The description adds meaningful context beyond the schema by clarifying that iso_path is on the host where the server runs, and by tying disk_gb to the concept of a blank dynamic disk.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: create a blank environment with an installation ISO in its DVD drive and boot it. It clearly targets OSes with no recipe and no unattended installer, distinguishing this from generic environment creation and from related sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool: for an OS with no recipe and no unattended installer. It also routes the agent through follow-up tools like env_screenshot, env_type, env_keys, env_click, env_revert, env_promote, and golden_adopt, and warns that env_exec will not work on the result.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_downA

Shut an environment down cleanly, keeping its disk and its place in the environment list. env_start brings it back with everything intact.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It reveals that the operation is clean, non-destructive, preserves disk and list placement, and is reversible via env_start. This is meaningful context beyond the bare tool name, though it could further clarify process termination or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact sentences that lead with the action and the key persistence guarantee. Every sentence earns its place, with no filler or redundant schema restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with an output schema, the description gives the essential operational context: what happens (shutdown), what is preserved (disk and list position), and how to reverse it (env_start). It is sufficiently complete for an agent to invoke it correctly without needing more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, 'name', and the schema already documents it as 'name of the environment' with 100% coverage. The description adds no additional parameter-specific meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific action verb ('Shut') with a clear resource ('an environment') and adds a key differentiator: it keeps the disk and the environment's place in the list. This distinguishes it from destructive siblings like env_rm and aligns it with env_start for lifecycle management.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use this tool: for a clean, non-destructive shutdown that preserves state. It explicitly references env_start as the way to bring the environment back, which helps an agent choose between down, start, and remove. It does not explicitly mention destructive alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_execA

Run a shell command inside an environment and return its exit code and output. The command is one shell string: pipes, redirects, globs and quoting are interpreted by the guest shell, unlike the CLI's terrarium exec, which passes its arguments literally. Which shell that is: /bin/sh on Linux guests; on a Windows guest, the shell recorded for its golden, which is PowerShell for a golden terrarium built and cmd.exe for an older or adopted one, unless terrarium adopt --shell said otherwise. Pass shell (powershell, cmd or sh) to run under a different one, and script instead of command for anything multi-line or heavily quoted - a script reaches the shell on stdin, so nothing in it is re-parsed on the way. The environment must be running. Commands run as a user with passwordless sudo, so this can change or destroy anything inside the guest - the host is not affected. A command that outruns timeout_sec is killed in the guest, with its child processes, and the error says what was killed: nothing is left running where you cannot see it. On a Windows guest an ordinary command runs in session 0, which has no screen: if it opens a window or a dialog it waits there forever and env_screenshot shows nothing. Set desktop to run it in the session a user is logged into instead, where env_screenshot can see what it wants. Only works when the environment's golden has SSH credentials; without them, use env_screenshot, env_type, env_keys and env_click.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment to run in
shellNorun under this shell instead of the guest's own: powershell, cmd or sh
scriptNomulti-line script to run instead of command; it reaches the shell on stdin so nothing in it is quoted or split
commandNoshell command to run in the guest; omit when passing script
desktopNoWindows guests only: run in the session a user is logged into, so env_screenshot shows the window or dialog the command opens. Without it a command runs in session 0, which has no screen
timeout_secNoseconds to wait before giving up (default 300)

Output Schema

ParametersJSON Schema
NameRequiredDescription
outputYes
exit_codeYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden, and it does so thoroughly: it warns about passwordless sudo and guest-only destruction, timeout kill behavior with child processes, Windows session 0 limitations, and the required SSH credential precondition. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place, covering purpose, shell semantics, command vs script, security, timeout behavior, Windows desktop mode, and prerequisites. The core action is front-loaded, and the length is justified by the tool's complexity and safety implications.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter, side-effect-capable tool with platform-specific behavior and sibling alternatives, the description covers all essential decision points: shell choice, script vs command, timeout behavior, desktop mode, SSH requirement, and fallback tools. It is fully actionable for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description still adds real meaning: it explains that command is a single shell string interpreted by the guest shell, script reaches stdin and avoids re-parsing, shell overrides the guest's shell, and desktop affects Windows session visibility. These clarifications materially help an agent choose parameter values correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states the specific verb and resource: run a shell command inside an environment and return exit code and output. It clearly differentiates from screen-interaction siblings like env_screenshot, env_type, and env_click, and from the CLI's terrarium exec.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use command vs script, when to pass shell, when to set desktop for Windows guests, and states the SSH-credential prerequisite with named alternatives. This goes well beyond implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_forkA

Create a new environment from a golden image and boot it. Takes under a minute and costs tens of MB of disk. The environment is disposable: anything done inside it is lost on env_rm, and env_revert rewinds it to the state it had right after this call. If the golden has no SSH credentials recorded - env_list shows an empty ssh_user, which is normal for an old or GUI-only system - env_exec will not work on the result. Drive it with env_screenshot, env_type, env_keys and env_click instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
cpusNoCPUs, default inherits the golden image
nameYesname for the new environment: letters, digits and dashes
goldenYesname of the golden image to fork, as reported by env_list
memory_mbNomemory in MB, default inherits the golden image
ttl_secondsNoauto-remove the env this many seconds from now; env_gc collects it. Omit for no expiry
share_host_pathNoabsolute host directory to mount at /work inside the guest, read-write

Output Schema

ParametersJSON Schema
NameRequiredDescription
envYes
logNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses execution time, disk cost, disposability, the precise semantics of env_revert on this environment, and the SSH credential caveat that affects env_exec. This is unusually thorough and directly informs agent expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, with the core action front-loaded and every subsequent sentence adding operational value. It covers cost, lifetime, revert semantics, and a critical interaction caveat without waste or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with six parameters and no annotations, the description is impressively complete. It explains the full lifecycle, failure mode, and alternative driving tools, while the presence of an output schema means return-value details need not be duplicated in prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters. The description adds minimal parameter-specific guidance beyond mentioning the golden image's SSH state, which is relevant to the golden parameter. This meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'Create a new environment from a golden image and boot it.' It clearly identifies the resource, the source, and the post-creation behavior, which differentiates env_fork from sibling tools like env_create and env_start.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context on when to use this tool: when you need an ephemeral environment forked from a golden image and booted. It also provides a specific routing rule for the result: if the golden has no SSH credentials, use env_screenshot, env_type, env_keys, and env_click instead of env_exec. It does not explicitly exclude alternatives like env_create, but the context is strong enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_gcA

Remove environments that have outlived the TTL set at fork time (ttl_seconds), plus any whose VM has vanished from VirtualBox. Environments forked without a TTL are never removed by age. Pass dry_run to see what would go without removing it. Good to call before finishing a session so short-lived envs do not pile up.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNolist what would be removed without removing it

Output Schema

ParametersJSON Schema
NameRequiredDescription
dry_runYes
removedYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains what gets removed, the age-based exclusion for environments without a TTL, and the dry-run safety path. It could mention whether removal is permanent, but the core destructive behavior and conditions are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the action and criteria first, then the exception, then the dry-run behavior, then the recommended usage. Every sentence adds necessary information without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with an output schema, the description is largely complete. It covers what is removed, when to use it, and how to preview. It does not describe return values in detail, but the presence of an output schema reduces that burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the single dry_run parameter at 100%, including its meaning. The description reinforces it with 'Pass dry_run to see what would go without removing it,' but adds little beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool removes environments, specifying the exact criteria (TTL expiration or vanished VirtualBox VM). It is scoped and readable, though it does not explicitly contrast itself with the sibling env_rm, so differentiation could be stronger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance: call it before finishing a session to prevent short-lived environments from piling up. It also explains the dry_run option. It does not explicitly say when not to use it or when to prefer env_rm, but the context is clear enough for most cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_keysA

Press keys and chords in the environment that env_type cannot express. Each entry in the list is one keystroke, and chords land as chords. The environment must be running. Valid key names: alt-f4, alt-tab, backspace, ctrl-a..ctrl-z, ctrl-alt-del, delete, down, end, enter, esc, f1, f10, f11, f12, f2, f3, f4, f5, f6, f7, f8, f9, home, left, pgdn, pgup, right, space, tab, up, win (the ctrl run is literal: ctrl-x, ctrl-d and so on). For the mouse, use env_click and env_scroll.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYeskey names to press in order; each entry is one keystroke or chord
nameYesname of the environment

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses key mechanics: each list entry is one keystroke, chords land as chords, the ctrl run is literal, and the environment must be running. It does not discuss invalid-key handling or focus requirements, but the core side-effect profile is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than minimal, but every sentence is functional: purpose, usage boundaries, prerequisite, and valid keys all earn their place. It is slightly dense due to the key-name enumeration, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with an output schema, the description is essentially complete: it provides prerequisites, valid inputs, behavioral semantics, and sibling-tool routing. Minor gaps such as error behavior are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds significant value beyond the schema by enumerating valid key names and clarifying chord semantics. The 'name' parameter is not expanded, but that is already adequately described in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: 'Press keys and chords in the environment.' It immediately scopes itself against env_type ('that env_type cannot express') and distinguishes itself from mouse tools, so an agent can tell what it does and what it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool versus env_type, names env_click and env_scroll as the alternatives for mouse actions, and states the prerequisite that the environment must be running. This gives clear decision criteria for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_listA

List the golden images available to fork from and the environments that exist, with their SSH ports and whether each is currently running. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
envsYes
goldensYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explicitly states the operation is read-only, which is a key safety trait, and describes exactly what data is returned. Given the zero-parameter, read-only nature, this is sufficient behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured sentence that front-loads the action and resource, includes the key details (SSH ports, running state), and ends with the read-only note. Every word contributes value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with an output schema, the description is complete. It states what is listed, the specific attributes returned, and the safety profile. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema documents no inputs, so there is nothing for the description to add. The baseline for zero-parameter tools is 4, and the description appropriately focuses on output semantics rather than parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and clearly identifies the resources: golden images available to fork from and existing environments, including SSH ports and running status. This distinguishes it from sibling tools like env_create, env_fork, and env_snapshot without needing to open their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly communicates what the tool provides, so an agent can infer it should be used when it needs to discover available golden images or environments and their connection/running state. It does not explicitly name alternatives or exclusions, but the read-only listing purpose is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_promoteA

Flatten an environment's current state into a new golden image that env_fork can use, so a machine configured during this session becomes a reusable fork source. A full disk copy: takes minutes and the disk of a golden, and afterwards depends on nothing. The environment is shut down first and left in place; remove it with env_rm if it is no longer needed once promoted. Promote only when the user wants the machine kept: the result is durable and only the user can remove it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesenv whose current state becomes the golden
imageYesname for the new golden image: letters, digits, dots, dashes

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
goldenYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral burden. It discloses that this is a full disk copy, takes minutes, consumes a golden's disk space, shuts the environment down, leaves it in place, and creates a durable artifact only the user can remove. This is rich and actionable context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, all substantive, with the core action first followed by cost, side effects, and usage guidance. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation's purpose, resource cost, duration, shutdown behavior, persistence, lifecycle, and cleanup path. Combined with the output schema, an agent has enough context to invoke it correctly and set expectations with the user.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the role of each parameter (the environment's current state becomes the image) but adds limited detail beyond the schema's own parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific operation: flatten an environment's current state into a reusable golden image for env_fork. It distinguishes itself from sibling tools by naming env_fork and env_rm and explaining the golden-image role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to promote ('only when the user wants the machine kept'), notes the durable result, and points to env_rm for cleanup. It also identifies that the promoted image becomes the source for env_fork, giving clear selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_pullA

Copy a file or directory out of an environment onto this host, over the same connection env_exec uses. guest_path is inside the guest and always uses forward slashes, Windows guests included; local_path is on the host, where this server runs, and its missing parent directories are created. Set recursive for a directory. Needs the same credentials env_exec needs.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment to copy out of
recursiveNocopy a directory and everything under it
guest_pathYespath inside the guest to copy from, forward slashes even on Windows guests (C:/Users/terrarium/x)
local_pathYespath on THIS host to copy to; the server runs on the host, not in the guest

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
guest_pathYes
local_pathYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals non-obvious behaviors: the connection mirrors env_exec, path conventions differ between guest and host, parent directories are auto-created, and credentials are required. It doesn't mention overwrite behavior, but the output schema covers response semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no filler: the core operation is first, followed by path semantics, then directory handling and credentials. Every sentence contributes unique information and nothing repeats the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with full schema coverage and an output schema, the description covers the operation, path conventions, directory recursion, and authentication. The only notable gap is overwrite behavior for existing local files, but the agent still has enough to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying guest vs host path semantics, the Windows forward-slash convention, automatic parent-directory creation, and the role of the recursive flag.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise operation: 'Copy a file or directory out of an environment onto this host.' This clearly distinguishes it from siblings like env_push (opposite direction) and env_rm (non-destructive copy), and anchors it to env_exec's connection for context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete usage constraints: guest_path always uses forward slashes even on Windows, local_path is on the host, missing parent directories are created, recursive is needed for directories, and the same credentials as env_exec are required. It doesn't explicitly name alternatives or exclusions, but the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_pushA

Copy a file or directory from this host into an environment, over the same connection env_exec uses. local_path is on the host, where this server runs; guest_path is inside the guest and always uses forward slashes, Windows guests included (C:/Users/terrarium/setup.exe). Missing parent directories in the guest are created. Set recursive for a directory. Needs the same credentials env_exec needs.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment to copy into
recursiveNocopy a directory and everything under it
guest_pathYespath inside the guest to copy to, forward slashes even on Windows guests (C:/Users/terrarium/x)
local_pathYespath on THIS host to copy from; the server runs on the host, not in the guest

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
guest_pathYes
local_pathYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the responsibility for behavioral disclosure. It does well by stating direction, connection reuse, path format behavior, automatic creation of missing parent directories, recursive behavior, and credential requirements. It leaves overwrite semantics unspecified, which is a minor but real gap for a copy operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each with distinct operational content, and the core action is front-loaded. It is efficient overall, though it slightly repeats details already present in the schema parameter descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a file-transfer tool with full schema coverage and an output schema present, the description covers the action, direction, path semantics, recursive behavior, parent directory creation, and credentials. Nothing critical for calling the tool correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all four parameters at 100% coverage, including host/guest path semantics and recursive meaning. The description mostly restates this per-parameter information rather than adding new parameter-specific value, though it does add tool-level context about the connection and credentials.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening verb phrase 'Copy a file or directory from this host into an environment' clearly identifies the action, resource, and direction. The reference to the same connection env_exec uses also differentiates it from sibling tools such as env_pull or env_exec itself, making the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear contextual guidance: it explains host vs guest paths, forward-slash conventions, the need for recursive when copying directories, and the shared credential requirement with env_exec. It does not explicitly name alternative tools or say when not to use this tool, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_restoreA

Rewind an environment to a named snapshot taken with env_snapshot. Everything done since that snapshot is lost. Use env_revert instead to go back to the environment's original clean state.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment
snapYesname of the snapshot

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It states the side effect directly: 'Everything done since that snapshot is lost.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with three sentences: action, consequence, and alternative. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Within the context of many sibling tools, it clearly distinguishes env_restore from env_revert and references env_snapshot for snapshot creation. The warning about data loss is also provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not elaborate on parameters, but the schema provides descriptions for both 'name' and 'snap' as the environment and snapshot names, respectively. Since schema coverage is 100%, baseline 3 is maintained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: rewinding an environment to a named snapshot. It distinguishes it from env_revert for original state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use env_revert instead' for a different scenario, providing a clear alternative. It also warns about losing changes, guiding appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_revertA

Discard everything done inside an environment since it was forked, returning it to its clean snapshot. Files written in the guest are lost. Takes seconds, because the snapshot includes RAM and the machine resumes rather than reboots.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden of warning about destructive behavior. It explicitly states that files written in the guest are lost and that the operation discards everything since the fork, while also explaining the performance characteristics (fast because RAM snapshot resumes rather than reboots).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, with the core action front-loaded in the first sentence. Subsequent sentences add important side effects and performance context without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool, the description covers what the tool does, what is lost, and why it is fast. An output schema exists, so return-value details are not required. No critical information is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes the single parameter as 'name of the environment' with 100% coverage. The description reinforces that the tool operates on an environment but does not add further details about name format, lookups, or edge cases. Baseline 3 is appropriate because the schema handles the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Discard') and clearly identifies the resource and scope: everything done in an environment since it was forked. It also clarifies the outcome ('returning it to its clean snapshot'), which separates it from sibling tools like env_restore that handle arbitrary snapshots.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: when you want to reset an environment back to its fork state and lose all changes made inside it. It does not explicitly mention alternatives or exclusions, but the intended use is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_rmA

Destroy an environment and delete its disks. Everything inside it is gone for good. The golden image it was forked from is untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly warns that the environment is destroyed, its disks are deleted, everything inside is permanently gone, and the golden image remains unaffected. This is excellent transparency for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences deliver the core action first, then the critical irreversibility warning, then the scope clarification about the golden image. Every sentence earns its place, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with an output schema, the description is complete. It explains the action, the irreversible consequences, and what is not affected, giving an agent all the behavioral context needed to call this tool safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage for the single required parameter, 'name', described as 'name of the environment'. The description does not add further parameter-level details, but it does not need to because the schema fully documents the only input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool destroys an environment and deletes its disks, a specific destructive action on a specific resource. It also distinguishes this from siblings like env_down, env_restore, and env_revert by emphasizing permanence and the golden image being untouched.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context clear: use this when you intend to permanently destroy an environment. It does not explicitly name alternatives such as env_down or env_snapshot for non-destructive operations, but the irreversible wording strongly implies the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_screenshotA

Capture a running machine's screen and return it as an image. This is how to see a guest that has no SSH - it needs nothing of the guest, not even a network. The name can be an environment, a golden image, or any VirtualBox VM by name: reading a screen changes nothing, so this one is safe to point at a machine terrarium does not manage. The input tools (env_type, env_keys, env_click, env_scroll) are environments only. The machine must be running. The screen lags behind keystrokes, so after env_type or env_keys take a fresh screenshot to see what actually happened.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment, golden image, or VirtualBox VM

Output Schema

ParametersJSON Schema
NameRequiredDescription
widthYes
heightYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the operation is side-effect-free ('reading a screen changes nothing'), declares the tool needs nothing from the guest ('not even a network'), and reveals the lag behavior that could otherwise confuse an agent interpreting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the first states the primary action, the second gives the key use case, the third clarifies scope and safety, the fourth distinguishes from environment-only input tools, and the last covers the running precondition and lag caveat. The description is front-loaded and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with an output schema, the description is complete. It covers purpose, accepted target types, preconditions, safety, and a known timing quirk. There is no missing information an agent would need to decide whether to call this tool and how to interpret its behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the `name` parameter as 'name of the environment, golden image, or VirtualBox VM.' The description adds a little clarity by restating accepted target kinds and emphasizing the tool works on any VirtualBox VM by name, but it does not meaningfully expand parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Capture a running machine's screen and return it as an image.' It also distinguishes this tool from the input-oriented sibling tools by clarifying that env_type, env_keys, env_click, and env_scroll operate only on environments, while env_screenshot can also target golden images and unmanaged VirtualBox VMs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'This is how to see a guest that has no SSH.' It provides clear preconditions ('The machine must be running'), notes a timing caveat ('The screen lags behind keystrokes'), and gives follow-up guidance to take a fresh screenshot after typing or key presses. It also signals a safe expansion of scope by noting the tool works for machines terrarium does not manage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_scrollA

Scroll the environment's mouse wheel: the pointer moves to the given pixel position, then the wheel turns there. Positive clicks scroll down, negative up. The environment must be running.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYespixel column to scroll at, 0-based
yYespixel row to scroll at, 0-based
nameYesname of the environment
clicksYeswheel clicks: positive scrolls down, negative up

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does well: it discloses that the pointer moves first, then the wheel turns, and explains the sign convention for scrolling direction. It does not mention potential side effects beyond the scroll, but that is acceptable for this focused action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the core action, then provides the coordinate mechanics, direction semantics, and running-environment prerequisite efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with the fully documented input schema and an output schema, is complete enough for a simple pointer-scroll tool. It covers prerequisites and behavior; only a short explicit note about when to choose this over env_click would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all four parameters. The description adds a bit of behavioral context around how x/y and clicks are used, but most parameter semantics already come from the schema, justifying the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scrolls the environment's mouse wheel and explains the coordinate-based behavior. It does not explicitly contrast itself with sibling tools like env_click, but the verb and resource are specific enough to be unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when a scroll gesture is needed at a pixel position, and it states a prerequisite: the environment must be running. However, it gives no explicit guidance on when to prefer this over related sibling tools such as env_click or env_type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_snapshotA

Take a named snapshot of an environment, to come back to later with env_restore. A running environment has its RAM captured too, so restoring resumes rather than reboots. Cheap: seconds, and only the changed disk blocks.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment
snapYesname of the snapshot

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it discloses that RAM is captured for running environments, that restore resumes rather than reboots, and that the operation is cheap and only stores changed disk blocks. These are genuinely useful behavioral details beyond the bare action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The core action is front-loaded, followed by a behavioral nuance (RAM capture) and a cost/performance note. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with an output schema, the description fully covers purpose, relationship to env_restore, behavioral implications, and cost. There are no significant gaps that would prevent an agent from using it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (name, snap) are already documented in the schema. The description adds context that the snapshot is named, matching the snap parameter, but does not add new semantic detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: 'Take a named snapshot of an environment.' It also explicitly distinguishes the tool from its restore counterpart by naming env_restore, so an agent can tell it apart from siblings like env_revert or env_fork.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'to come back to later with env_restore' gives clear contextual guidance on how the snapshot relates to future restoration. It implies the intended use but does not explicitly state when not to use it or compare it against other snapshot-like siblings such as env_revert.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_startA

Boot a stopped environment and wait until SSH answers. Does nothing if it is already running. Fails if no environment by that name exists - use env_fork to create one.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment

Output Schema

ParametersJSON Schema
NameRequiredDescription
envYes
logNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses idempotency ('Does nothing if it is already running'), a blocking wait until SSH answers, and a failure mode for nonexistent names. It does not mention timeout behavior or return values, but the output schema covers some of that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each carrying unique information: main action and wait, idempotent behavior, failure mode with corrective alternative. No filler and the essential behavior is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter boot tool with an output schema, the description covers the core behavior, the no-op case, the error case, and the correct fallback tool. Nothing essential for selecting and invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes 'name' fully, but the description adds contextual meaning: the name must reference an existing environment, and a missing environment causes failure rather than creation. This helps the agent avoid calling env_start with a new name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair, 'Boot a stopped environment,' and clarifies the exact wait condition ('until SSH answers'). It also distinguishes itself by stating it is a no-op on a running environment and fails for missing names, so it is clearly separate from creation tools like env_fork or env_create.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use the tool (start a stopped environment and wait for SSH) and explicitly routes the missing-environment case to env_fork: 'use env_fork to create one.' It does not enumerate all sibling exclusions, but the key alternative is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

env_typeA

Type text into the environment's keyboard, as if a person were at it - the keystrokes go wherever the guest's focus happens to be, so check with env_screenshot first. Environments only: to type into a golden image, env_fork it and type into the fork. The environment must be running. Takes effect a moment after the call returns.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesname of the environment
textYestext to type, as if at the keyboard
press_enterNopress enter after the text

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
nameYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses non-obvious traits: keystrokes go wherever focus is, effects appear a moment after return, and the environment must be running. This is meaningful transparency, though it stops short of describing failure modes or how special characters are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the action, focus caveat, screenshot prerequisite, golden-image routing, running requirement, and delayed effect are all packed concisely with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema and full parameter coverage, the description covers the key operational context: preconditions, focus behavior, timing, and environment vs golden-image routing. The main omission is explicit guidance on when env_type is preferable to env_keys, but this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents name, text, and press_enter. The description reinforces the 'as if at a keyboard' framing but adds little per-parameter meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific action ('Type text into the environment's keyboard') and resource (the environment), and clarifies that keystrokes go to the guest's current focus. It differentiates from click/scroll tools and from golden-image usage by directing to env_fork, but it does not explicitly distinguish from the sibling env_keys, which may overlap in purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: check env_screenshot first, only use on running environments, and for golden images fork first. It also specifies the environment must be running. However, it does not state when to use env_type versus closely related alternatives like env_keys or env_exec, so the guidance is good but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

golden_adoptA

Record a VirtualBox VM that already exists on this machine as a golden image env_fork can use. The VM itself is not modified unless take_snapshot is set. Re-running it updates the record, which is how credentials are added later: adopt a machine with no user or password, fork it, read its login prompt with env_screenshot, try a guess with env_type, then adopt again with what worked. Records nothing about the guest that was not observed - never invent a user or password here.

ParametersJSON Schema
NameRequiredDescriptionDefault
vmYesname of the existing VirtualBox VM, as shown by env_list or terrarium ls
keyNopath to an SSH private key for the guest, if there is one
userNoSSH user inside the guest, if it is known
imageNogolden image name to record it under (default: the VM name)
shellNowhat an SSH session lands in: posix, cmd or powershell; Windows guests are probed on first exec when unset
passwordNoSSH password inside the guest, if it is known
snapshotNosnapshot to fork from (default terrarium-base)
transportNohow to reach the guest: ssh (default), or guestcontrol for a Windows with no SSH server, which talks through VirtualBox Guest Additions and needs user and password
take_snapshotNocreate the snapshot if the VM does not have it yet; this modifies the user's VM

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
goldenYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral transparency burden. It explicitly discloses that the VM is not modified unless take_snapshot is set, that re-running updates the existing record, and that nothing unobserved is recorded ('never invent a user or password'). These are meaningful disclosures beyond schema fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words: the first gives purpose, the second gives side-effect scope, and the third gives an actionable workflow. The dense workflow sentence earns its place because it explains a non-obvious multi-step usage pattern.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no annotations, the description covers the non-obvious behavioral traits, the credential-adding workflow, and the honesty constraint. Parameter details are already in the schema, and an output schema exists. A minor gap is not explicitly contrasting with golden_import, but 'already exists on this machine' largely covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining how user and password are intentionally optional and later populated through a second adoption after observing the guest, and by tying take_snapshot to the only modifying behavior. This goes slightly beyond the schema's per-parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb ('Record'), a specific resource ('a VirtualBox VM that already exists on this machine'), and the purpose ('as a golden image env_fork can use'). The phrase 'already exists on this machine' clearly distinguishes it from golden_import or other image-creation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear workflow: adopt without credentials, fork, observe via env_screenshot, guess via env_type, and re-adopt with working credentials. It also says re-running updates the record. It does not explicitly name golden_import as the alternative, but the 'already exists' qualifier gives enough routing context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

golden_getA

Build a golden image from a recipe so environments can be forked from it. Slow and bandwidth-heavy: downloads roughly 500 MB the first time, then imports the appliance, boots it once for cloud-init, shuts it down and snapshots it. Takes minutes, and a Windows image takes closer to an hour because it runs a real installer. A recipe with from instead builds on an existing golden: it forks the base, runs the recipe's setup commands in the fork, and flattens the result into the new golden. Use recipe_list for the names that work here. Fails if the golden already exists - rebuilding one is a decision for the human.

ParametersJSON Schema
NameRequiredDescriptionDefault
cpusNoCPUs for the golden image (default 2)
imageYesimage name from a recipe, for example ubuntu-24.04 or alma-9
memory_mbNomemory in MB for the golden image (default 2048)

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
goldenYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations, the description carries the full burden and delivers: it discloses that the operation is slow and bandwidth-heavy, downloads ~500 MB, boots once for cloud-init, takes minutes (up to an hour for Windows), and fails if the golden already exists. This is exceptional behavioral disclosure covering performance, side effects, process steps, and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and every subsequent sentence earns its place: performance profile, process steps, the `from` variant, and the failure caveat. It is long (~120 words), but the tool genuinely has two modes and heavy operational consequences, so the density is justified with no wasted phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, long-running, resource-heavy build operation with no annotations and an output schema present, the description covers all essential ground: purpose, step-by-step behavior, expected duration, failure condition, and how to source valid inputs. The output schema handles return values, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters, giving a baseline of 3. The description adds genuine value on top: pointing to recipe_list as the source for valid image values and explaining that a `from`-recipe changes the build semantics. cpus and memory_mb receive nothing extra, but they need nothing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Build a golden image from a recipe' — and immediately explains the purpose ('so environments can be forked from it'). The workflow detail (importing, booting for cloud-init, snapshotting) clearly separates it from related siblings like golden_import and golden_adopt, so an agent can distinguish them without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit direction to consult recipe_list for valid image names and warns that rebuilding an existing golden is a human decision, an implicit when-not-to-use. It also distinguishes the two recipe modes (base vs `from`). However, it never explicitly contrasts with golden_import or golden_adopt, which are the closest alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

golden_importA

Register an .ova or .ovf appliance file already on this machine as a golden image. Unlike golden_get there is no recipe and no download, and nothing is seeded: an appliance exported from somewhere else has no cloud-init to wait for. The VM is imported, snapshotted where it stands and recorded as a golden env_fork can use. Credentials are optional - import without them, then work the login out through env_fork, env_screenshot and env_type, and record it with golden_adopt. Creates something durable that only the user can remove, so do it when the task asks for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNopath to an SSH private key for the guest, if there is one
userNoSSH user inside the guest, if it is known
imageYesname for the new golden image: letters, digits, dots, dashes
ova_pathYespath to the .ova or .ovf appliance file on this machine
passwordNoSSH password inside the guest, if it is known

Output Schema

ParametersJSON Schema
NameRequiredDescription
logNo
goldenYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden and meets it: it states the side effects ('imported, snapshotted where it stands and recorded as a golden image'), lifecycle ('durable that only the user can remove'), and non-behaviors ('no recipe and no download', 'nothing is seeded', no cloud-init to wait for). This is far richer than what the tool name alone would reveal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each with a distinct payload: core purpose, sibling contrast, side effects, credential workflow, and durability caution. It is dense and not front-loaded beyond the first sentence, but the length is earned given 5 parameters, multiple related siblings, and significant side effects to disclose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation. The description covers purpose, alternatives, side effects, durability, and the credential-discovery workflow. Minor gaps remain—idempotency on re-import and expected duration for a VM import—but nothing that would block a correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds genuine value on top by explicitly declaring credentials (key, user, password) optional and prescribing the fallback workflow when they are unknown, which the schema only hints at with 'if it is known'/'if there is one.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+outcome: 'Register an .ova or .ovf appliance file already on this machine as a golden image.' It explicitly differentiates from the closest sibling ('Unlike golden_get there is no recipe and no download') and cross-references golden_adopt, so an agent can tell this tool apart from related golden-* tools without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names golden_get as the alternative and states the differentiator (recipe/download vs. local import). It also prescribes a full decision path: import without credentials, discover login via env_fork/env_screenshot/env_type, record with golden_adopt, and warns 'do it when the task asks for it' for a durable resource. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recipe_listA

List the images that CAN be built into golden images with golden_get. This is the catalogue of what is available to build; env_list reports what has actually been built and what can be forked right now. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
recipesYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden, and it explicitly declares 'Read-only.' It also adds meaningful behavioral context by clarifying that the list reflects buildable images rather than existing environments. It does not mention error/empty-result behavior, but that is a minor gap for a parameterless listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: core purpose, sibling contrast, and read-only disclosure. The main purpose is front-loaded and there is zero filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only listing with an output schema available, the description is complete: it states purpose, distinguishes from env_list, and discloses side-effect behavior. Nothing an agent needs to select and invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to add; the rubric sets a baseline of 4 for parameterless tools. Schema description coverage is trivially 100% with an empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List'), a precise resource ('images that CAN be built into golden images with golden_get'), and immediately differentiates itself from env_list by scope. An agent can tell what this tool does and how it differs from siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names env_list as the alternative and gives the selection condition: recipe_list is the catalogue of what is available to build, while env_list reports what has actually been built and can be forked right now. This contrast leaves no ambiguity about which tool to choose for a given intent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 24 tool updatesv0.1.2
    • First observeddoctor
    • First observedenv_click
    • First observedenv_create
    • First observedenv_down
    • First observedenv_exec
    • First observedenv_fork
    • First observedenv_gc
    • First observedenv_keys
    • First observedenv_list
    • First observedenv_promote
    • First observedenv_pull
    • First observedenv_push
    • First observedenv_restore
    • First observedenv_revert
    • First observedenv_rm
    • First observedenv_screenshot
    • First observedenv_scroll
    • First observedenv_snapshot
    • First observedenv_start
    • First observedenv_type
    • First observedgolden_adopt
    • First observedgolden_get
    • First observedgolden_import
    • First observedrecipe_list

TDQS

A4.1/5.0

Scored across 24 tools

Disambiguation5/5

Every tool maps to a distinct resource and action: golden creation (golden_get/import/adopt), environment lifecycle (fork/create/start/down/rm), state management (snapshot/restore/revert), and interaction (screenshot/type/keys/click/scroll/exec/pull/push). The closest pair, env_restore and env_revert, is clearly differentiated by snapshot vs. original state.

Naming Consistency4/5

The env_* and golden_* prefixes give a strong, predictable grouping, and most names follow an action-style pattern (env_start, env_fork, env_push). Minor deviations like env_keys, env_screenshot, and the unprefixed doctor/recipe_list keep it from being perfectly uniform.

Tool Count3/5

At 24 tools, this sits in the heavy 16–25 range, though the VM lifecycle scope is broad enough that each tool has a distinct purpose. It feels borderline rather than bloated or redundant.

Completeness4/5

The set covers the full environment lifecycle: golden image creation/import, forking, power management, screenshots, keystrokes, command execution, file transfer, snapshots, promotion, and cleanup. Minor gaps exist—no golden deletion tool and no way to list snapshots—but core workflows have no dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    A
    maintenance
    A virtual Linux desktop as an MCP server, shipped in Docker. Agents drive screen, mouse, keyboard across any GUI — browsers, IDEs, office suites, Wine/Windows apps, legacy software — many in parallel.
    12
    152
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides bounded, observable access to graphical apps, browsers, terminals, Android devices, virtual machines, and SSH hosts through MCP tools, enabling safe automation and app QA.
    109 npm
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provider-neutral MCP server for managing VirtualBox, VMware Fusion, and VMware Workstation, offering tools for VM lifecycle, configuration, snapshots, guest operations, networking, and artifact resolution.
    MIT