Skip to main content
Glama

kvm-automation

Agent automation for IP-KVMs: one MCP server, CLI, and fleet config that drive GLKVM, PiKVM, and TinyPilot devices. An open-source alternative to TinyPilot Automation — it can drive TinyPilot devices that already have an Automation key, and PiKVM/GLKVM devices with no license at all.

This is out-of-band automation: the target machine sees only a monitor, a keyboard, and a mouse. There is no agent on the target, no SSH, and no DOM — HDMI pixels in, USB HID out. That makes it the tool of last resort and the only tool that works on locked machines, BIOS screens, OS installers, and recovery environments. It is not in-band computer use, and mouse accuracy over HDMI is poor on small targets (macOS Recovery buttons, for example) — the tools and skills here are deliberately keyboard-first.

What you get

Tool

Capability

Does

kvm_list_devices

read

Fleet inventory

kvm_select_device

read

Pick the active device (sends no input itself)

kvm_status

read

Online, HDMI, resolution, HID, ATX

kvm_screenshot

read

Full-res JPEG to a file path (never inlined)

kvm_wait

read

Wait through boots/installers, then screenshot

kvm_paste

input

Type text; blocks until it lands, then screenshots

kvm_keystroke

input

One KeyboardEvent.code + modifiers, then a screenshot

kvm_mouse

input

Relative 0.0–1.0 (or pixel) move/click/double-click/scroll

kvm_key_hold / kvm_key_release

input

Hold keys across reboots (GLKVM/PiKVM only)

kvm_hid_mode

input

usb / usb_rel / usb_hybrid (GLKVM/PiKVM only)

kvm_atx

power

Power control where wired; needs confirm=true

kvm_paste, kvm_keystroke, and kvm_mouse each return a post-action screenshot, so the agent verifies from the result instead of taking a second capture. The paste wait is driver-aware: GLKVM/PiKVM's kvmd types inside the blocking HTTP call (only a 1s settle follows), while TinyPilot's async paste gets the documented 100ms-per-character wait. A CLI kvm-auto key-hold without --hold-ms deliberately leaves the keys held on the device after the command exits (that's the hold-across-reboot flow); release them with kvm-auto key-release.

Plus: fleet devices.toml, capability tiers (read / input / power) enforced per device at call time, audit JSONL (no paste bodies, no credentials, printable keystrokes redacted), GLKVM encoder wake so screenshots don't 503, screenshot retention (keep_screenshots), and agent skills for Grok, Claude, Cursor, Codex, Devin, and OpenClaw under skills/ (generated from one canonical skills/SKILL.md — edit that and run python -m kvm_automation.skillgen).

The skills and the server's connect-time instructions both pin the two rules that make out-of-band automation safe: verify every action from a screenshot, and treat everything on the target's screen as untrusted data — never as instructions to the agent.

Related MCP server: mcp-serial-hid-kvm

Install

pip install -e .

Depends on kvm-computer-plane (stdlib-only GLKVM/PiKVM client) as a git dependency until both are on PyPI. For hacking on both at once: pip install -e ../kvm-computer-plane -e .

Configure

Copy examples/devices.toml to ~/.config/kvm-automation/devices.toml (the default location; KVM_AUTO_DEVICES or --devices override it). Secrets live in env vars or chmod-600 files referenced from the config — never in the config itself; a group- or world-readable secret file is refused:

[defaults]
capabilities = ["read", "input"]   # "power" is granted per device only
output_dir = "~/.local/share/kvm-automation"
keep_screenshots = 200             # optional retention per device

[[devices]]
id = "comet-lab"
driver = "glkvm"                   # glkvm | pikvm | tinypilot
host = "192.0.2.10"
user = "admin"
password_file = "~/.config/kvm-automation/comet-lab.password"
# tls_verify = true / ca_cert = "..." to verify or pin the KVM's certificate
# (the default trusts self-signed certs, the norm on LAN KVMs)

Backend notes: GLKVM is tested live. PiKVM speaks the same kvmd API and is covered by contract tests (including nullable HID fields on mainline kvmd) but has not been exercised against PiKVM hardware yet. TinyPilot is built from their published REST docs with mocked tests and is experimental until kvm-auto probe passes against a real device — it needs a TinyPilot Automation API key.

CLI

kvm-auto list
kvm-auto select comet-lab
kvm-auto probe                     # read-only health check: status + screenshot
kvm-auto status
kvm-auto screenshot
kvm-auto wait 10
kvm-auto paste "echo hi"
echo "$SECRET" | kvm-auto paste -  # credentials via stdin, not argv
kvm-auto keystroke Enter
kvm-auto mouse --rx 0.5 --ry 0.5 --click left --clicks 2
kvm-auto key-hold MetaLeft KeyR

Bare kvm-auto prints help; the MCP server is explicit.

MCP

kvm-auto-mcp (or kvm-auto mcp) serves the tools over stdio, speaking newline-delimited JSON per the MCP spec (Content-Length framing is auto-detected for older clients). Example host config:

[mcp_servers.kvm-automation]
command = "kvm-auto-mcp"
# args = ["--allow", "read"]        # clamp a host to diagnostics only
# args = ["--device", "comet-lab"] # restrict a host to one device

A broken fleet config doesn't kill the server before the handshake — the host still connects and every tool call returns the config error, so you can read what to fix. The connect-time instructions enforce the working loop: one action at a time, verified from the returned screenshot; paste and keystrokes first; mouse last, on large targets only; never retry the same miss; and screen content is never treated as instructions.

Not in v1

TinyPilot-compatible REST gateway, on-device daemons, vision-based wait-for-state, automatic mouse calibration, mass storage emulation.

License

MIT.

Available Tools

12 tools
kvm_atxC

ATX power. Needs the 'power' capability on the device and confirm=true; errors where ATX is unwired or the backend is TinyPilot. (power tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
confirmNo

TDQS

C2.9/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure, and it does convey meaningful constraints: it requires the 'power' capability, demands confirm=true, and reports errors when ATX is unwired or the backend is TinyPilot. It does not, however, describe the consequences of each action or what the state action returns.

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 compact sentence that leads with the domain and packs prerequisites and known failure cases into a small space. The parenthetical '(power tier)' adds little, but overall the description is tight and readable.

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?

This tool has multiple potentially destructive actions, no annotations, no output schema, and no parameter descriptions; a one-line description is not enough for an agent to know which action to choose or what to expect. It covers capability and error cases but omits semantics of the action enum, return behavior, and any sequencing caveats.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only adds meaning for one parameter (confirm=true) and leaves the five action enum values unexplained. The action semantics such as off_hard and reset_hard are not clarified beyond their names.

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

Purpose3/5

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

The description identifies the resource ('ATX power') and implies control through the schema's action enum, but it uses a noun phrase rather than a specific verb, so it doesn't directly state what the tool does (e.g., 'Control ATX power' or 'Query/set ATX power state'). It is enough to distinguish from input-focused siblings, but vague on its own.

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 guidance is given, no alternatives are named, and there is no statement about when kvm_atx should be selected instead of kvm_status or other siblings. The only usage-like content is the prerequisite 'confirm=true' and the error conditions, which are behavioral constraints, not selection guidance.

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

kvm_hid_modeA

Switch the mouse gadget: usb (absolute), usb_rel (relative; better in Mac Recovery), usb_hybrid. GLKVM/PiKVM only. (input tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
mouse_outputYes

TDQS

A3.8/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 full behavioral burden. It does disclose a hardware restriction ('GLKVM/PiKVM only') and the relative-vs-absolute behavioral difference of the modes. But it is silent on side effects of switching — whether the mode persists across reboots, whether the mouse re-enumerates, or whether the switch disrupts an active connection.

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

Conciseness4/5

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

The description is compact and front-loaded: the action verb comes first, followed by the concise mode enumeration and the platform constraint. The trailing '(input tier)' tag is cryptic and adds little for an agent, but it is minor noise in an otherwise tight definition.

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?

For a single-parameter, enum-driven tool, the description covers purpose, mode semantics, and a platform gate. Yet with no output schema and no annotations, it omits practical details an agent would want: what the tool returns on success/failure, whether the switch takes effect immediately, and whether existing mouse input is disrupted. Adequate but with clear gaps.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It adds real semantic value by glossing usb as 'absolute', usb_rel as 'relative' with a Mac Recovery tip, which goes beyond the raw enum in the schema. However, usb_hybrid is left unexplained, so the compensation is incomplete and prevents a 5.

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 ('Switch') and a clear resource ('the mouse gadget'), then enumerates the three valid modes with one-line definitions. This distinguishes it from siblings like kvm_mouse (which presumably handles pointer movement) by making clear it changes the HID protocol mode, not sends input events.

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 Mac Recovery hint for usb_rel provides mode-selection context, and 'GLKVM/PiKVM only' sets a platform precondition. However, it never explicitly says when to use this tool versus alternatives like kvm_mouse or kvm_select_device, and gives no exclusion conditions. Usage is implied rather than stated.

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

kvm_key_holdA

Hold keys down (GLKVM/PiKVM only; e.g. MetaLeft+KeyR across a Mac reboot). Pass hold_ms or call kvm_key_release; auto-releases after 25s. (input tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYes
hold_msNo

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses key behavioral details: keys are held, it is platform-specific, it auto-releases after 25 seconds, and release can be triggered explicitly. It does not mention potential outcomes of repeated calls or errors, but the core behavior is transparent.

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

Conciseness5/5

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

The description is compact and information-dense, with no wasted words. It conveys purpose, constraints, duration, and release mechanism in two sentences.

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

Completeness5/5

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

For a low-complexity tool, the description covers the essential operational context: what it does, platform scope, duration control, and release path. Sibling tool names further clarify the surrounding workflow.

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 provides no parameter descriptions, but the description clarifies that keys is a list of key names (e.g., MetaLeft+KeyR) and that hold_ms controls the hold duration. Units are implied by the parameter name and constraints, though not explicitly stated.

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

Purpose5/5

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

The description clearly states the tool holds keys down, scopes it to GLKVM/PiKVM, and gives a concrete example. It is distinguishable from sibling tools like kvm_keystroke and kvm_key_release.

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

Usage Guidelines4/5

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

Provides practical guidance on passing hold_ms or calling kvm_key_release, and notes the 25-second auto-release. It could be more explicit about when to prefer this over kvm_keystroke, but the example and release instruction give sufficient direction.

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

kvm_key_releaseA

Release held keys (all when omitted). GLKVM/PiKVM only. (input tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
keysNo

TDQS

A4/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 disclosure burden. It does state the core action, the all-when-omitted default, and the platform constraint, but it does not cover edge cases such as releasing keys that are not held or what happens when no keys are currently held.

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?

Extremely compact and front-loaded. The first clause states the action, the parenthetical adds the default behavior, and the suffix adds platform and tier context. Every word contributes value.

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 one optional parameter and no output schema, the description covers purpose, default behavior, and platform constraints. Minor gaps remain around key value syntax and explicit linkage to kvm_key_hold, but the tool is simple enough that these are not critical.

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 only describes an array of strings with 0% description coverage, so the description must compensate. It meaningfully adds the 'all when omitted' semantics, but it does not define valid key names, formats, or accepted string values.

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 ('Release') and resource ('held keys'), and further clarifies the default behavior when keys are omitted. This clearly distinguishes it from siblings like kvm_key_hold and other kvm_* operations.

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

Usage Guidelines4/5

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

The description gives clear context: it is used to release held keys, with omission meaning all keys. It also adds an explicit platform restriction ('GLKVM/PiKVM only'), though it does not name the complementary kvm_key_hold tool as an alternative.

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

kvm_keystrokeA

Send one KeyboardEvent.code keystroke (Enter, Escape, Tab, KeyR, F7...) with optional modifiers. Returns a post-key screenshot. (input tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
alt_leftNo
alt_rightNo
ctrl_leftNo
meta_leftNo
ctrl_rightNo
meta_rightNo
shift_leftNo
shift_rightNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does substantial work: it discloses single-keystroke scope, the KeyboardEvent.code encoding, optional modifier combination, and the fact that a screenshot is captured after the key is sent. It does not state whether a device must be selected first or whether the key is auto-released, both relevant given the kvm_select_device and kvm_key_hold siblings.

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

Conciseness5/5

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

Three short segments in roughly 25 words: the action and its encoding, the return value, and the input-tier tag. Every clause earns its place, and the most critical information (what to send and in what format) is front-loaded.

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

Completeness4/5

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

For a 9-parameter tool with zero schema descriptions, no annotations, and no output schema, the description covers the essentials for a correct call: code format, modifier semantics, and the screenshot return. The notable omissions are the device-selection prerequisite (kvm_select_device exists as a sibling) and the screenshot return format, but the tool's simplicity keeps these from being fatal.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: 'KeyboardEvent.code' supplies the exact vocabulary for the `code` parameter, which the schema leaves as a bare string—this is the difference between sending 'KeyR' and an unusable guess. 'With optional modifiers' explains the role of all 8 boolean modifier parameters, though the left/right distinction is left to the parameter names.

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?

Names the exact verb and resource: 'Send one KeyboardEvent.code keystroke' with concrete examples (Enter, Escape, Tab, KeyR, F7), which pins down the semantic domain precisely. The return-value clause ('Returns a post-key screenshot') further helps the agent distinguish it from kvm_paste, kvm_mouse, and kvm_screenshot.

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 word 'one' and the discrete key examples imply this is for single key taps, contrasting implicitly with kvm_key_hold/kvm_key_release for sustained presses and kvm_paste for text strings. However, the description never explicitly says when to prefer this tool over those alternatives, so routing is left to inference.

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

kvm_list_devicesA

List fleet devices: id, driver, label, capabilities, which is active. (read tier)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are present, so the description bears the full burden. It explicitly labels the operation '(read tier)', conveying non-mutating behavior, and lists the output fields. For a zero-parameter list command, this is sufficient behavioral disclosure, though it does not mention failure modes or output formatting.

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?

One compact sentence with a parenthetical: the action is front-loaded, followed immediately by the output fields. Every element carries information and there is no filler.

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

Completeness5/5

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

With no parameters and no output schema, the description names exactly what the agent receives and flags the operation as read-only. Nothing essential is missing for invoking this tool correctly.

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

Parameters4/5

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

The tool takes zero parameters and schema coverage is 100%, so there are no parameter semantics for the description to clarify. The baseline of 4 applies because no undocumented inputs require compensation.

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

Purpose5/5

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

States an explicit verb and resource: 'List fleet devices' and enumerates the returned fields (id, driver, label, capabilities, active). This makes the operation unmistakable and clearly distinct from sibling tools like kvm_select_device or kvm_status.

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 a read/list use case but does not explicitly state when to prefer this tool over alternatives or provide exclusions. It is clear enough for a trivial list operation, but no guidance is given about using it before device selection or how it differs from kvm_status.

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

kvm_mouseB

Move/click/scroll. Pass BOTH relative_x AND relative_y (0.0-1.0), or BOTH pixel_x AND pixel_y of the last screenshot. Mouse is the LAST resort; prefer keyboard. Returns a post-action screenshot. (input tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
buttonNo
clicksNo
pixel_xNo
pixel_yNo
wheel_xNo
wheel_yNo
relative_xNo
relative_yNo

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden of explaining side effects. It mentions returning a post-action screenshot but does not disclose what happens when invalid or incomplete coordinate pairs are supplied, nor whether a device must be selected beforehand.

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 short and mostly to the point, with the key coordinate-pair requirement front-loaded. The trailing '(input tier)' fragment is somewhat unclear but does not add significant noise.

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 tool has eight parameters and no output schema, yet the description only addresses coordinate pairing and general mouse behavior. It omits parameter details, failure modes, and how this interacts with device selection, making it incomplete for reliable agent use.

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

Parameters2/5

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

The description covers relative_x, relative_y, pixel_x, and pixel_y, but ignores button, clicks, wheel_x, and wheel_y. Since the schema has zero field descriptions, the omitted parameters remain unexplained, leaving significant semantic gaps.

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 that the tool moves, clicks, and scrolls the mouse, and it highlights that mouse input is a last resort compared to keyboard input. It does not explicitly name sibling alternatives, but the core action is specific enough.

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

Usage Guidelines4/5

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

It provides explicit guidance on coordinate usage: pass both relative_x and relative_y, or both pixel_x and pixel_y. It also advises preferring keyboard input, but it does not explain when to choose relative vs. pixel coordinates or how wheel parameters should be used.

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

kvm_pasteB

Type text on the target via HID. Blocks until the typing has landed, then returns a post-paste screenshot — safe to send Enter after it returns. (input tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

TDQS

B3.4/5.0
Behavior4/5

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

Discloses important behavioral aspects: blocks until typing lands, returns a post-paste screenshot, and indicates a follow-up action (Enter) is safe after completion. No hidden side effects mentioned.

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

Conciseness5/5

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

The description is concise, using a single sentence with a useful parenthetical note. No fluff or redundancy.

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

Completeness4/5

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

For a simple tool with one parameter and no output schema, the description covers the key aspects: action, blocking behavior, and return type. It does not mention failure modes, but for this simplicity level it is adequate.

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

Parameters2/5

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

The single parameter 'text' has no description in the schema, and the tool description does not elaborate on it beyond implying it is the text to type. Since schema coverage is 0%, the description should compensate but does not.

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 action (type text) and resource (target via HID), and mentions blocking behavior and return of a screenshot. It does not explicitly differentiate from kvm_keystroke, but the name and context make it reasonably clear.

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 explicit guidance on when to use this tool versus alternatives like kvm_keystroke. The note about being safe to send Enter after returns implies a usage tip but does not provide clear selection criteria.

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

kvm_screenshotA

Capture the HDMI frame to a JPEG file. Read the returned path to see the screen; the image is never inlined. (read tier)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the transparency burden and discloses key behavior: output is written to a JPEG file, only a path is returned, and the image is never inlined. The '(read tier)' tag also signals a non-mutating operation, though actual file lifecycle is not described.

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?

Two short sentences, each carrying distinct information, and the most important behavior (capture, return path, not inline) is front-loaded. No filler.

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 zero-parameter capture tool with no output schema, the description covers the essential loop: invoke, read path, view screen. It does not specify file location or cleanup, but these are minor given the tool's simplicity.

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

Parameters4/5

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

The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add. Baseline 4 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 ('Capture') and resource ('HDMI frame to a JPEG file'), making the action and result unambiguous. No sibling tool overlaps with this screenshot capability, so it is easily distinguished.

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

Usage Guidelines4/5

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

It clearly implies the use case: when you need to see the current screen, invoke this and read the returned file path. It does not list exclusions or alternative tools, but no screenshot alternative exists among the siblings.

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

kvm_select_deviceA

Select the active device by id, host, or alias. Sends no input itself; required before other tools. (read tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the safety disclosure burden itself. It explicitly states 'Sends no input itself' and marks the operation as 'read tier', which tells the agent it is non-mutating. It also communicates statefulness by requiring selection before other tools. It does not explain failure behavior or active-device persistence, but the key behavioral traits are covered.

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 three short sentences, each contributing a distinct piece of information: selection mechanism, non-input behavior, and required sequencing. It is front-loaded with the primary action and avoids repetition.

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

Completeness4/5

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

For a one-parameter selection tool with no output schema, the description covers the action, the parameter's accepted forms, the operation's safety profile, and its prerequisite role. It is sufficient for correct invocation. It could mention how to list valid devices or what happens on invalid input, but those are secondary for such a simple tool.

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

Parameters4/5

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

Schema coverage is 0%, so the description must add meaning for the single 'device' parameter. It does so by specifying that it accepts an id, host, or alias, which is essential knowledge beyond the bare string type. It could add more detail about format or how to discover valid values, but the core semantics are present.

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

Purpose5/5

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

The description clearly states the specific action — select the active device — and adds the distinct scoping dimension that selection can be by id, host, or alias. It also separates this tool from siblings by noting it sends no input and is a prerequisite, making its role unambiguous.

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

Usage Guidelines4/5

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

The description provides clear usage context: select a device before using other tools. It implicitly tells the agent this is a setup step rather than an input action. It does not explicitly name alternatives or exclusions, but for a prerequisite tool this is strong guidance.

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

kvm_statusA

Online/HDMI/resolution/HID state of the active device (plus ATX where wired). (read tier)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It indicates a read-only operation implicitly via 'read tier' and lists the state components, but does not explicitly state that it has no side effects or describe the return format or potential errors.

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 front-loads the core information and avoids redundancy. It is well-structured and directly to the point.

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

Completeness4/5

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

The description is sufficiently complete for a simple status query with no parameters. It lists the specific state aspects covered, though it could slightly improve by explicitly stating that it returns the current state (e.g., 'reports the current...').

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

Parameters4/5

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

The tool has zero parameters, and the description adds no parameter-related information. Since there are no parameters to explain, this meets the baseline for a no-parameter tool.

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

Purpose5/5

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

The description clearly identifies the tool's purpose: reporting the online, HDMI, resolution, and HID state of the active device, plus ATX where wired. The 'read tier' suffix distinguishes it from the action-oriented sibling tools.

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

Usage Guidelines3/5

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

The description gives a minimal usage hint ('read tier') but does not explicitly state when to use this tool over the siblings (e.g., 'use this to check status rather than perform actions'). An agent must infer from the sibling names.

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

kvm_waitA

Wait, then return a fresh screenshot. Use during boots, installers, and Recovery instead of re-screenshotting in a loop. (read tier)

ParametersJSON Schema
NameRequiredDescriptionDefault
secondsNo

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It reveals the sequential behavior (wait, then screenshot) and explicitly labels the tool as 'read tier,' indicating a safe, read-only operation. It does not cover error cases or return-format details, but for such a simple tool this is adequate context.

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

Conciseness5/5

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

The description is two short sentences that pack in the operation, the precise use cases, and an anti-pattern to avoid. It is front-loaded with the core behavior and contains no filler or redundancy.

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

Completeness4/5

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

For a tool with one optional parameter and a straightforward action, the description covers the operation, the timing contexts, and the read-only safety tier. The main gap is the undocumented parameter semantics, but given the simplicity of the tool and the clear numeric parameter name/range in the schema, the description is otherwise complete enough for an agent to invoke it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, and the description never mentions the 'seconds' parameter. It fails to explain that this parameter controls the wait duration or how it relates to the 'Wait' action, leaving the agent to infer from the parameter name and schema defaults. The description adds almost no semantic value for the parameter.

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

Purpose5/5

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

The description clearly states the tool's function: wait, then return a fresh screenshot. It also distinguishes itself from siblings like kvm_screenshot by specifying the use case (boots, installers, Recovery) and by explicitly saying 'instead of re-screenshotting in a loop.' The verb and resource are specific and unambiguous.

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

Usage Guidelines4/5

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

The description provides explicit contexts where the tool should be used (boots, installers, Recovery) and recommends against an alternative approach (re-screenshotting in a loop). However, it does not name an alternative sibling tool explicitly or provide a clear when-not-to-use condition beyond that loop anti-pattern, so it stops short of a 5.

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. 12 tool updatesv0.1.0
    • First observedkvm_atx
    • First observedkvm_hid_mode
    • First observedkvm_key_hold
    • First observedkvm_key_release
    • First observedkvm_keystroke
    • First observedkvm_list_devices
    • First observedkvm_mouse
    • First observedkvm_paste
    • First observedkvm_screenshot
    • First observedkvm_select_device
    • First observedkvm_status
    • First observedkvm_wait

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation4/5

Most tools target clearly distinct actions (device selection, status, screenshots, individual input types, power), but kvm_wait and kvm_screenshot both return screenshots and could be confused if an agent does not read the timing distinction carefully. The other input tools are well-separated by their descriptions.

Naming Consistency4/5

All tools share the kvm_ prefix and use lowercase snake_case, which provides a predictable family identity. However, some names are verb-led (wait, paste, keystroke) while others are noun-led (status, screenshot, mouse, atx), making the pattern slightly inconsistent.

Tool Count5/5

Twelve tools is well within the ideal range and each tool maps to a necessary KVM workflow: device selection, status/screenshot, keyboard/mouse input, HID configuration, and ATX power. Nothing feels redundant or missing enough to bloat the surface.

Completeness4/5

The surface covers the core KVM lifecycle well: select a device, inspect status, capture the screen, send text/keys/mouse input, and control power. Minor gaps exist such as file transfer or remote media mounting, but for a KVM-focused server the main operational needs are addressed.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to remotely control Sipeed NanoKVM hardware for BIOS-level management of servers and headless machines. It provides tools for power control, keyboard and mouse emulation, screen capture, and ISO image mounting via the Model Context Protocol.
    19
    13
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to control and automate Incus/QEMU virtual machines via SSH, supporting mouse/keyboard, screenshots, commands, and lifecycle management.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables computer-use clients to control KVM devices via MCP tools for listing, opening, viewing, and controlling remote computers with low-latency video and input.
    -