Skip to main content
Glama
btafoya
by btafoya

boxes-mcp

Tests TypeScript License: MIT

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 libvirt and kvm groups

# 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 libvirt

Installation

# 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 test

Configuration

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

boxes.list

List all VMs

-

boxes.info

Get VM details

nameOrUuid: string

boxes.start

Start a VM

nameOrUuid: string

boxes.shutdown

Shutdown VM (graceful)

nameOrUuid: string, force?: boolean

boxes.reboot

Reboot a VM

nameOrUuid: string

boxes.suspend

Suspend a VM

nameOrUuid: string

boxes.resume

Resume suspended VM

nameOrUuid: string

boxes.undefine

Remove VM (keeps storage)

nameOrUuid: string, keepStorage?: boolean

boxes.display

Get SPICE/VNC address

nameOrUuid: string

Snapshot Management

Tool

Description

Parameters

boxes.snapshots.list

List VM snapshots

nameOrUuid: string

boxes.snapshots.create

Create snapshot

nameOrUuid: string, snapshot: string, description?: string

boxes.snapshots.revert

Revert to snapshot

nameOrUuid: string, snapshot: string

boxes.snapshots.delete

Delete snapshot

nameOrUuid: string, snapshot: string

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.js

Development

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.ts

Testing

# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

# Generate coverage report
npm run test:coverage

Test Coverage: 33 tests, 100% passing

  • exec.ts: 100% statements

  • libvirt.ts: 81.3% statements, 92.85% branches

  • Comprehensive unit and integration tests

Building

# Build TypeScript
npm run build

# Watch mode for development
npm run dev

Systemd 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-mcp

Security Considerations

  • Sandboxed Execution: Uses Node.js execFile with 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 libvirt

VMs Not Showing in Boxes

Open virt-manager and check which connection your VMs use:

  • System connection: qemu:///system

  • User session: qemu:///session

Set LIBVIRT_URI environment variable accordingly.

Roadmap

  • VM creation via virt-install integration

  • Network 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.

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Run tests (npm test)

  4. Commit changes (git commit -m 'Add amazing feature')

  5. Push to branch (git push origin feature/amazing-feature)

  6. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Support


Made with ❤️ for the Claude Code community

Available Tools

13 tools
boxes.displayA

Get SPICE/VNC display address for VM (useful to open viewer)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

A3.8/5.0
Behavior3/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 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

B3.4/5.0
Behavior2/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 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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

C2.9/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoIf true, force off (destroy)
nameOrUuidYesDomain name or UUID

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
snapshotYesSnapshot name
nameOrUuidYesDomain name or UUID
descriptionNoSnapshot description

TDQS

B3.3/5.0
Behavior2/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 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
snapshotYesSnapshot name
nameOrUuidYesDomain name or UUID

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
snapshotYesSnapshot name
nameOrUuidYesDomain name or UUID

TDQS

B3.1/5.0
Behavior2/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 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID

TDQS

C2.9/5.0
Behavior2/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 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameOrUuidYesDomain name or UUID
keepStorageNoKeep storage (default: true)

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 13 tool updatesv0.1.0
    • First observedboxes.display
    • First observedboxes.info
    • First observedboxes.list
    • First observedboxes.reboot
    • First observedboxes.resume
    • First observedboxes.shutdown
    • First observedboxes.snapshots.create
    • First observedboxes.snapshots.delete
    • First observedboxes.snapshots.list
    • First observedboxes.snapshots.revert
    • First observedboxes.start
    • First observedboxes.suspend
    • First observedboxes.undefine

TDQS

A3.5/5.0

Scored across 13 tools

Disambiguation5/5

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.

Naming Consistency5/5

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).

Tool Count5/5

13 tools is well-scoped for managing libvirt domains, covering lifecycle, snapshots, and info display. The number feels complete without being excessive.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables 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.
    9
    15
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI models to securely query and manage virtual machines and virtualized resources via the libvirt API through the Model Context Protocol.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables management of KVM/QEMU virtual machines on remote libvirt hosts via SSH, with tools for inspection, lifecycle management, snapshots, and cloning.
    1
    AGPL 3.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables management of oVirt / Red Hat Virtualization environments via AI assistants, supporting VM lifecycle, power operations, snapshots, and infrastructure queries.
    -