boxes-mcp
Manages GNOME Boxes virtual machines through libvirt/virsh, providing VM lifecycle operations (start, stop, reboot, suspend, resume), snapshot management (create, list, revert, delete), and VM discovery with detailed information.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@boxes-mcplist all VMs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
boxes-mcp
A lightweight Model Context Protocol (MCP) server that enables Claude Code to manage GNOME Boxes virtual machines through libvirt/virsh. Provides safe, reversible VM operations with comprehensive snapshot management.
Features
🖥️ VM Lifecycle Management - Start, stop, reboot, suspend, and resume VMs
📸 Snapshot Operations - Create, list, revert, and delete VM snapshots
🔍 VM Discovery - List and inspect all VMs with detailed information
🔒 Safe Operations - Storage preservation by default, no destructive actions
🎯 GNOME Boxes Compatible - Works seamlessly with GNOME Boxes VMs
⚡ Fast & Lightweight - Minimal overhead, direct virsh integration
Related MCP server: libvirt-mcp-server
Quick Start
Prerequisites
Ubuntu 22.04/24.04 (or compatible Linux distribution)
libvirt-daemon-system, qemu-kvm installed
Node.js 18+ and npm
User in
libvirtandkvmgroups
# Install dependencies
sudo apt install -y libvirt-daemon-system qemu-kvm virt-manager
# Add your user to required groups
sudo usermod -aG libvirt,kvm "$USER"
newgrp libvirtInstallation
# Clone the repository
git clone https://github.com/your-org/boxes-mcp.git
cd boxes-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Run tests
npm testConfiguration
Add to your Claude Code config (~/.claude/config.json):
{
"mcpServers": {
"boxes": {
"command": "node",
"args": ["/absolute/path/to/boxes-mcp/dist/src/index.js"],
"env": {
"LIBVIRT_URI": "qemu:///system"
}
}
}
}Available Tools
VM Management
Tool | Description | Parameters |
| List all VMs | - |
| Get VM details |
|
| Start a VM |
|
| Shutdown VM (graceful) |
|
| Reboot a VM |
|
| Suspend a VM |
|
| Resume suspended VM |
|
| Remove VM (keeps storage) |
|
| Get SPICE/VNC address |
|
Snapshot Management
Tool | Description | Parameters |
| List VM snapshots |
|
| Create snapshot |
|
| Revert to snapshot |
|
| Delete snapshot |
|
Usage Examples
With Claude Code
User: "List all my VMs"
Claude: [Uses boxes.list tool]
User: "Start ubuntu-24.04"
Claude: [Uses boxes.start with nameOrUuid="ubuntu-24.04"]
User: "Create a snapshot called 'before-update' for my fedora VM"
Claude: [Uses boxes.snapshots.create]Direct Usage
# Run the MCP server
LIBVIRT_URI=qemu:///system node dist/src/index.jsDevelopment
Project Structure
boxes-mcp/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── libvirt.ts # virsh operations & parsers
│ ├── exec.ts # Safe command execution
│ ├── *.test.ts # Unit tests
├── systemd/
│ └── boxes-mcp.service # Systemd user service
├── dist/ # Compiled JavaScript
├── coverage/ # Test coverage reports
├── package.json
├── tsconfig.json
└── vitest.config.tsTesting
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Generate coverage report
npm run test:coverageTest Coverage: 33 tests, 100% passing
exec.ts: 100% statementslibvirt.ts: 81.3% statements, 92.85% branchesComprehensive unit and integration tests
Building
# Build TypeScript
npm run build
# Watch mode for development
npm run devSystemd Service
Install as a user service for automatic startup:
mkdir -p ~/.config/systemd/user
cp systemd/boxes-mcp.service ~/.config/systemd/user/
sed -i "s|%h/projects/virtmcp|$HOME/boxes-mcp|g" ~/.config/systemd/user/boxes-mcp.service
systemctl --user daemon-reload
systemctl --user enable --now boxes-mcp
journalctl --user -fu boxes-mcpSecurity Considerations
✅ Sandboxed Execution: Uses Node.js
execFilewith timeout and buffer limits✅ No Arbitrary Commands: Only predefined virsh operations allowed
✅ Storage Preservation: VM storage not deleted by default
✅ LIBVIRT_URI Isolation: Respects environment-specified libvirt connection
⚠️ Permissions Required: User must have libvirt group membership
⚠️ Network Exposure: Not designed for remote access without additional security
Troubleshooting
No VMs Listed
# Check libvirt URI
virsh -c qemu:///system list --all
virsh -c qemu:///session list --all
# Verify permissions
groups # Should include 'libvirt' and 'kvm'Permission Denied
# Re-add to groups and re-login
sudo usermod -aG libvirt,kvm "$USER"
# Then logout/login or:
newgrp libvirtVMs Not Showing in Boxes
Open virt-manager and check which connection your VMs use:
System connection:
qemu:///systemUser session:
qemu:///session
Set LIBVIRT_URI environment variable accordingly.
Roadmap
VM creation via
virt-installintegrationNetwork management (
virsh net-list, port forwarding)Storage pool information (
virsh vol-list)VM import from OVA/QCOW2
Remote libvirt connection support
Performance metrics and monitoring
Contributing
Contributions welcome! Please read CONTRIBUTING.md for guidelines.
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Run tests (
npm test)Commit changes (
git commit -m 'Add amazing feature')Push to branch (
git push origin feature/amazing-feature)Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
Built for Claude Code
Integrates with libvirt virtualization API
Support
Issues: GitHub Issues
Discussions: GitHub Discussions
Documentation: Project Wiki
Made with ❤️ for the Claude Code community
Available Tools
13 toolsboxes.displayA
Get SPICE/VNC display address for VM (useful to open viewer)
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
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 reveals that the tool retrieves a display address in SPICE or VNC form and is intended for opening a viewer, which is meaningful. However, it does not mention whether the VM must be running, what the exact return format is, or whether any connection is initiated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that states the action, the target resource, and the practical use case. There is no redundant information and it is immediately useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter tool with no output schema, and the description conveys the essential purpose and output type (SPICE/VNC address). It is complete enough for an agent to know what to call, though a note on return format or preconditions would make it fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers the only parameter (nameOrUuid) with 100% description coverage. The tool description does not add extra parameter semantics beyond 'Domain name or UUID', but since the schema is fully sufficient, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and a concrete resource ('SPICE/VNC display address for VM'), clearly distinguishing the tool's output from sibling tools like boxes.screenshot (which captures screen pixels) and boxes.info (which returns general VM info). The phrase 'useful to open viewer' further clarifies why an agent would use this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it ('useful to open viewer') but does not explicitly contrast it with alternatives such as boxes.screenshot or boxes.info. There is no when-not-to-use guidance or named sibling for comparison, so the agent must infer the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.infoB
Get detailed domain info
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. 'Get' implies a read-only operation and no destructive side effects are suggested, but it does not disclose error behavior, required domain state, or the scope of information returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with the verb and resource front-loaded. There is no filler, and the qualifier 'detailed' earns its place by distinguishing it from the list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is under-specified. 'Detailed domain info' does not say what fields or state are returned, nor what preconditions exist for a valid nameOrUuid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the only parameter as 'Domain name or UUID' with 100% coverage. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('domain info'), and the qualifier 'detailed' separates it from the list sibling. It does not explicitly name sibling tools or state the one-domain scope, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or alternative conditions are provided. The description only restates the operation and gives no guidance for choosing between boxes.info and related siblings like boxes.list or boxes.capabilities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.listA
List all libvirt domains (VMs) managed by GNOME Boxes/libvirt
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description alone must communicate the operation type. 'List' implicitly indicates a read-only, non-destructive operation, so an agent can reasonably infer safety. However, it does not disclose what the returned list contains (e.g., domain names, UUIDs, status) or the output format, which is relevant when there is no output schema. For a simple listing tool this is acceptable, but it falls short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that gets straight to the point, front-loading the verb and the resource. There is no redundant phrasing or filler. Every word contributes to the tool's definition. This is an ideal example of conciseness without under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameter-less listing tool with no output schema, the description is largely sufficient: it tells the agent exactly what is being listed. However, it leaves room for clarification about the return structure (e.g., does it return domain names, objects, or a list of IDs?). Given the sibling tool boxes.info exists, a brief note on the output shape would have made it complete. Nevertheless, the core functionality is fully specified, so this is slightly above average in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to elaborate on parameter meaning. The schema is empty and coverage is 100%, meaning there is nothing to document. The baseline for zero params is 4, and the description does not add any parameter-specific information because there are none to describe. This score appropriately reflects that the parameter burden is void.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a precise resource ('all libvirt domains (VMs) managed by GNOME Boxes/libvirt'). It unambiguously identifies the tool's purpose and clearly distinguishes it from sibling tools like boxes.info (which would provide details on a specific domain) and state-changing tools like boxes.start. There is no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it obvious that this tool is the enumeration/list command among the siblings. However, it does not explicitly state when to prefer this over boxes.info or mention that it returns all domains, which could be a useful precursor to calling boxes.info on a specific domain. The lack of explicit when/alternatives guidance is minor given the tool's self-explanatory nature, but a note about being a read-only enumeration step would have made it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.rebootB
Reboot a running domain
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action but does not reveal side effects, such as whether the reboot is graceful, potential state loss, required permissions, or behavior when the domain is not running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant language. It efficiently conveys the action and the condition in minimal words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-changing operation with no annotations and no output schema, this description is insufficiently complete. It does not explain what happens during reboot, what prerequisites are needed beyond an implied running state, or what errors might occur, leaving an agent under-informed for a destructive-ish operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the single parameter nameOrUuid with a clear description ('Domain name or UUID') and 100% coverage. The tool description adds no additional parameter context, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'reboot' and identifies the resource as 'a running domain'. This is a distinct action not covered by sibling tools like start, shutdown, suspend, or resume, so it is self-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a running domain' implies the tool is intended for active domains, but it gives no explicit guidance on when to use reboot compared to start/shutdown/suspend/resume. There is no mention of what to do if the domain is stopped or when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.resumeC
Resume a suspended domain
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description offers no information about side effects, permissions required, or consequences of resuming. As a mutation operation, this leaves the agent blind to behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no fluff. While it is brief, it does not waste words, and the essential action is conveyed. Structure is minimal but acceptable for such a simple operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description omits critical context such as the expected state of the domain (must be suspended), any side effects on running processes, or the format of the response. It only states the action without surrounding context, leaving gaps for an agent making decisions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the single parameter 'nameOrUuid' with its description. The tool description adds no additional meaning or constraints beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Resume') and resource ('suspended domain'), clearly indicating the action. Differentiates from siblings like 'suspend' and 'start' by implying the domain is in a suspended state, though not explicit about the distinction from 'start'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a domain is suspended and needs to be resumed, but does not explicitly state when to use this tool over 'start' (e.g., for stopped vs. suspended domains). Lacks clear guidance on prerequisites or scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.shutdownA
Shutdown/Power off a domain (graceful by default)
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If true, force off (destroy) | |
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description is the only source of behavioral info. It discloses 'graceful by default', which adds context beyond the schema, but it does not mention other behavioral aspects such as error handling or consequences of force (which are covered in the schema's force parameter description). The description is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, front-loading the purpose and the key default. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two parameters and no output schema, the description covers the essential purpose and the default behavior. The schema covers the parameters, so the description is sufficient. It does not discuss edge cases, but for this simple operation it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters with 100% coverage. The description adds the default behavior of graceful shutdown, clarifying that force is optional and non-default, which gives extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (shutdown/power off) and the resource (a domain), and the default behavior is noted. It distinguishes from siblings like start, reboot, and suspend.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is clear about what the tool does, providing the context of shutting down a domain. It does not explicitly mention alternatives or when not to use it, but the sibling names (start, reboot) make the distinction obvious. However, it lacks explicit guidance on when to choose shutdown over reboot or suspend.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.snapshots.createB
Create a snapshot for a domain
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot | Yes | Snapshot name | |
| nameOrUuid | Yes | Domain name or UUID | |
| description | No | Snapshot description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states that a snapshot is created; it does not mention overwrite behavior, whether the domain must be running or shut off, side effects, return values, or failure conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words and is appropriately front-loaded. It is concise, though it achieves brevity at the cost of useful behavioral or usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description should carry more context about prerequisites, side effects, and invocation behavior. It only states the action, which is insufficient for a mutation tool, even though the schema fully documents the parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the three parameters already documented as snapshot name, domain name or UUID, and snapshot description. The tool description adds no additional parameter meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Create') and resource ('snapshot for a domain'), and the create verb clearly separates it from sibling snapshot tools like list, revert, and delete. The resource scope is clear enough for an agent to identify what the tool operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the tool to use when creating a snapshot, but it never explicitly states when to use it versus alternatives or when not to use it. No prerequisites, conflicts, or exclusions are mentioned, leaving usage context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.snapshots.deleteB
Delete a snapshot
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot | Yes | Snapshot name | |
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It merely states 'Delete a snapshot' but does not reveal that the operation is permanent and irreversible, nor does it mention potential failure conditions (e.g., snapshot not found, domain in use). This is a significant omission for a destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that is appropriately concise. It is front-loaded and wastes no words, achieving maximum efficiency. Every word contributes to the meaning without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation with no annotations and no output schema, the description is too minimal. It lacks information about required conditions, side effects, error handling, or results. An agent would not know whether the deletion is idempotent, what happens if the snapshot is in use, or how the operation might fail. This incompleteness is unwarranted given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, meaning both parameters (snapshot and nameOrUuid) already have descriptive definitions. The description adds no extra information about the parameters, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a snapshot' is a specific verb-resource pair that unambiguously identifies the action. It clearly distinguishes this tool from sibling snapshot tools like list, create, and revert, all of which have different verbs. There is no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites such as the snapshot existing or the domain being stopped, nor does it indicate when one should prefer revert or create over delete. An agent must infer usage from the tool name and parameters alone, with no explicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.snapshots.listA
List snapshots for a domain
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral transparency. It does not explicitly state that the operation is read-only, non-destructive, or describe any side effects. The term 'list' hints at safety, but no explicit disclosure is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, starts with the verb, and contains no unnecessary words. It is perfectly front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one parameter and no output schema, the description adequately conveys the core purpose. It does not cover potential error scenarios or details about the returned list, but given the simplicity, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully covers the one parameter with a description. The tool description adds no additional meaning beyond repeating 'domain', so it matches the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and the resource ('snapshots') scoped to a domain. It is easily distinguished from sibling tools like create, revert, and delete, which have explicit different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to view existing snapshots) but does not explicitly contrast it with alternatives or mention scenarios like checking before creating or reverting. The sibling list provides context, but the description itself is minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.snapshots.revertB
Revert a domain to a snapshot
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot | Yes | Snapshot name | |
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. Reverting is a destructive action that likely overwrites the current domain state and may be irreversible, but the description does not mention this, nor does it note any impact like a reboot or data loss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with the action front-loaded. It has no fluff or redundancy, making it efficient. However, it sacrifices important contextual detail, which prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is incomplete. It fails to explain the consequences of reverting (e.g., potential data loss, need for domain to be stopped or rebooted), nor does it clarify any behavioral side effects. An agent calling this tool lacks critical information to use it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with descriptions ('Domain name or UUID' and 'Snapshot name'), achieving 100% coverage. The description adds no additional meaning, nuance, or constraints beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Revert') and resource ('a domain to a snapshot'), clearly indicating the action and distinguishing it from siblings like create, delete, and list. An agent can immediately understand what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, common scenarios, or conditions that would make this the correct choice over other snapshot operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.startC
Start a domain (VM)
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided (readOnlyHint, destructiveHint absent), so the description carries the full behavioral burden. The single sentence discloses no side effects, no requirement that the VM be in a stopped state, no mention of whether this is non-blocking (queues the boot) or blocking, and no idempotency semantics. For a state-changing operation with zero annotation coverage, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, wasteful sentence that communicates the verb, object, and domain context efficiently. It is not padded with filler, though the brevity is as much a product of under-specification as it is of restraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is trivial (one fully-documented parameter, no nested objects, no output schema, no enums), so there is little metadata for the description to duplicate or supplement. The main hole is the lack of guidance about VM state (stopped vs. running vs. suspended) and the absence of any side-effect or prerequisite details. It is acceptable but leaves the most useful contextual information on the table.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single parameter nameOrUuid is fully self-documenting with the description 'Domain name or UUID'. The description adds nothing beyond the schema, but with full coverage the baseline of 3 applies; the parameter meaning is entirely contained in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific, active verb ('Start') with a clear resource ('a domain (VM)'), and the parenthetical disambiguates 'domain' as a libvirt VM rather than a DNS domain. It distinguishes itself from siblings by being the power-on counterpart to shutdown/resume, though it doesn't explicitly disambiguate when to use 'start' vs 'resume' — a distinction an agent would have to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage guidance is provided whatsoever. The description neither states when this tool is appropriate nor differentiates it from the semantically overlapping sibling 'boxes.resume' (both power-on-like operations) or from 'boxes.reboot'. An agent cannot tell from the text whether to call this on a stopped VM, a suspended VM, or both.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.suspendC
Suspend a running domain
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID |
TDQS
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 states only that the tool suspends a running domain but does not explain effects (e.g., state preservation, reversibility via 'resume', or resource implications). This is a significant transparency gap for a state-changing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, unambiguous sentence with no fluff, and the action is front-loaded. It is appropriately concise for a simple operation, though it borders on under-specification, which is captured in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It fails to mention when to use suspend, what happens to the domain, or any side effects. An agent would lack essential context to decide between suspend and shutdown, making the tool risky to invoke without further research.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the sole parameter as 'Domain name or UUID' with 100% coverage. The description adds no additional meaning about the parameter, such as format requirements or how it relates to the operation, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'suspend' and the resource 'domain', which distinguishes it from sibling operations like 'start', 'shutdown', 'reboot', and 'resume'. However, it does not explicitly contrast with alternatives, so it stops short of the strongest clarity score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use 'suspend' versus other lifecycle operations such as 'shutdown' or 'reboot'. It also fails to mention prerequisites like the domain needing to be in a running state, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boxes.undefineA
Undefine a domain (remove from libvirt). Storage is NOT deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUuid | Yes | Domain name or UUID | |
| keepStorage | No | Keep storage (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly states that storage is not deleted, which is critical. However, it omits other behavioral aspects such as whether the domain must be inactive, what happens to snapshots, or if the operation is reversible. Not fully transparent, but the storage caveat is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence conveys the essential purpose and a critical caveat with zero waste. It is highly concise while retaining clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (2 parameters, no output schema, no annotations), the description covers the primary purpose and storage behavior but misses important contextual details like preconditions (e.g., domain state), side effects on other metadata, and any error scenarios. It is minimally adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description's note about storage not being deleted reinforces the default of keepStorage=true, adding slight clarity beyond the schema's 'Keep storage (default: true)' but not introducing new information. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Undefine'), resource ('a domain'), and the precise effect ('remove from libvirt'), plus a key qualifier ('Storage is NOT deleted'). This distinguishes it from sibling tools like start, shutdown, or snapshots without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not specify when to use this tool versus alternatives, nor any prerequisites (e.g., domain must be shut down). It simply states what it does, leaving the agent to infer appropriate context from the name and sibling list.
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.
13 tool updates
v0.1.0- First observed
boxes.display - First observed
boxes.info - First observed
boxes.list - First observed
boxes.reboot - First observed
boxes.resume - First observed
boxes.shutdown - First observed
boxes.snapshots.create - First observed
boxes.snapshots.delete - First observed
boxes.snapshots.list - First observed
boxes.snapshots.revert - First observed
boxes.start - First observed
boxes.suspend - First observed
boxes.undefine
TDQS
Scored across 13 tools
Each tool targets a distinct action (e.g., start, shutdown, snapshot operations) with no overlap. Snapshots are namespaced under 'snapshots' to further differentiate from domain-level actions.
All tools follow a consistent 'boxes.<action>' pattern, with snapshot sub-tools using 'boxes.snapshots.<action>'. Names are lowercase with dots and use verbs for actions (list, create, delete).
13 tools is well-scoped for managing libvirt domains, covering lifecycle, snapshots, and info display. The number feels complete without being excessive.
Core VM lifecycle (start, shutdown, reboot, suspend, resume, undefine) and snapshot CRUD are covered. Missing domain modification (e.g., edit config) is a minor gap, but the set handles essential operations.
Maintenance
Related MCP Connectors
Manage Sprites: sandboxed compute environments with exec, services, and checkpoints.
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
Persistent Linux microVMs for agents: root, internet, sub-second resume and a public URL.
Read GPU instances, types, images, filesystems and firewall rules; launch and terminate instances.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables AI assistants to manage virtual machines, sandboxes, and dev environments through VirtualBox, Hyper-V, and Windows Sandbox, supporting VM lifecycle, ISO downloads, networking, and unattended installs.915MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI models to securely query and manage virtual machines and virtualized resources via the libvirt API through the Model Context Protocol.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables management of KVM/QEMU virtual machines on remote libvirt hosts via SSH, with tools for inspection, lifecycle management, snapshots, and cloning.1AGPL 3.0
- FlicenseNot gradedqualityCmaintenanceEnables management of oVirt / Red Hat Virtualization environments via AI assistants, supporting VM lifecycle, power operations, snapshots, and infrastructure queries.-