asus-ipmi-mcp
Controls an ASUS IPMI Expansion Card (AST2600 BMC) on an ASUS motherboard: captures the host screen via the card's KVM, sends mouse and keyboard input, reads sensors, power state and BMC info, controls host power and one-time boot devices, attaches virtual media, and checks/downloads/verifies (SHA-256, MD5, model match) and flashes ASUS card firmware from the ASUS support page.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@asus-ipmi-mcpTake a screenshot of the host screen and tell me what's showing."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
asus-ipmi-mcp
Give your AI agent hands and eyes on a physical machine. This MCP server connects to an ASUS IPMI Expansion Card and lets an agent (Claude Code, Cursor, Claude Desktop, …) see the machine's screen, move the mouse, type, press keys, read sensors, control power and update the card's firmware — exactly what you'd do in the card's web console, but as tools. No browser, no Java, no VNC.
agent ──MCP (stdio)──> asus-ipmi-mcp ──HTTPS/WebSocket──> IPMI card (AST2600) ──USB keyboard/mouse + video──> hostUnofficial project. asus-ipmi-mcp is an independent community project. It is not affiliated with, endorsed by, or supported by ASUSTeK Computer Inc. or American Megatrends (AMI). "ASUS", "AMI" and "MegaRAC" are trademarks of their respective owners and are used only to describe compatible hardware. It talks to the card through the same interfaces its own web console uses, learned by observing them. Use at your own risk; for official support contact ASUS.
What it's good for
Install or reinstall an OS without anyone at the machine: watch the installer, click through it, type answers.
Fix machines that dropped off the network: log in on the local console and repair the network, a service or a broken boot. The kind of problem that usually needs someone with a monitor and keyboard.
Change BIOS settings remotely: reboot into setup, navigate menus, save.
Provision a fleet of on-prem boxes step by step with an agent that can both see and act, for machines that have no PXE or automation set up yet.
Keep the IPMI card itself up to date: check for and apply card firmware updates with built-in safety checks.
Related MCP server: PiKVM MCP Server
See it in action
Everything below was done by an agent through this MCP server, on a headless ProArt X870E-CREATOR WIFI running Rocky Linux, with no monitor attached.
1. | 2. |
|
|
3. | 4. |
|
|
Screenshot 4 is a real repair: after the IPMI card was installed, the host's network cards got new
PCIe names and the old network profiles no longer matched, so the machine had no IP. The agent opened
a terminal over the KVM, found the mismatch with nmcli, rebound the profiles to the cards' MAC
addresses and brought the link up. No SSH was possible, because the machine had no network.
It works before the OS too: firmware POST screen and the BIOS setup, navigated remotely with
press_keys and click:
5. POST screen (AMI firmware) | 6. BIOS setup, EZ Mode |
|
|
7. Advanced Mode → Boot | 8. Boot → CSM settings |
|
|
Screenshot 9: before saving, the BIOS lists exactly the changes the agent made, so they can be checked:

On ASUS desktop/workstation boards the firmware shows its screens on theprimary display only. To see POST and BIOS through the card, set Advanced → NB Configuration → Primary Video Device to PCIE and disable the onboard graphics. The card's video has only a legacy-compatible boot path here, so the firmware turns on CSM by itself the first time; CSM and Secure Boot don't mix.
What it can do
Area | Capabilities |
See | Screenshots of the host screen (full or cropped for small text), wait until the screen changes, wake a sleeping display |
Act | Absolute mouse: click, double/right click, drag, scroll. Keyboard: type text, keys and combos ( |
Know | BMC firmware, host power state, sensors, KVM status (resolution, other viewers) |
Power (opt-in) | On, off, graceful shutdown, restart; one-time boot device (CD, PXE, USB, BIOS setup) |
Virtual media (opt-in, experimental) | Attach an ISO from an NFS/CIFS share as a virtual CD |
Card firmware | Check for updates; download, verify and flash (opt-in) with dry run and confirmation token |
Status
Feature | State |
Screen, mouse, keyboard, KVM status | ✅ tested on hardware |
System info, sensors (read) | ✅ tested |
Firmware check, prepare + dry run on the card | ✅ tested |
Firmware flash via MCP | ⚠️ same API as a tested manual flash, but not yet run through MCP |
Power control, boot override | ⚠️ implemented via Redfish, not yet tested on hardware |
Virtual media | ⚠️ implemented from the web console's API, not yet tested |
Reports from other boards and firmware versions are very welcome. Please open an issue.
Supported hardware
Tested | ASUS IPMI Expansion Card-SI (90MC0AH0-MVUBY1), BMC firmware 1.3.13, on a ProArt X870E-CREATOR WIFI |
Should work | Other ASUS boards from the compatible model list; likely other AMI MegaRAC BMCs with ASPEED AST2500/2600 and the H5Viewer (untested) |
Install
Requires Node.js ≥ 22.19 on the machine running the agent, and network access to the card's management port.
Run straight from GitHub (from GitHub):
npx -y github:onprem-ai/asus-ipmi-mcpClaude Code
claude mcp add asus-ipmi \
-e ASUS_IPMI_HOST=192.168.0.144 -e ASUS_IPMI_USER=admin -e ASUS_IPMI_PASSWORD='…' \
-- npx -y github:onprem-ai/asus-ipmi-mcpGeneric MCP config (Claude Desktop, Cursor, …)
{
"mcpServers": {
"asus-ipmi": {
"command": "npx",
"args": ["-y", "github:onprem-ai/asus-ipmi-mcp"],
"env": {
"ASUS_IPMI_HOST": "192.168.0.144",
"ASUS_IPMI_USER": "admin",
"ASUS_IPMI_PASSWORD": "…",
"ASUS_IPMI_ALLOW_POWER": "0",
"ASUS_IPMI_ALLOW_MEDIA": "0"
}
}
}
}For several machines, add one entry per card with different names.
Configuration
Variable | Default | Meaning |
| – (required) | Card IP / hostname |
|
| Card user (needs KVM privilege) |
| – (required) | Card password |
| off |
|
| off |
|
| off |
|
|
| Long side of returned screenshots (pixels) |
Tools
Tool | What |
| Current screen as an image (optional crop region for small text). Wakes a sleeping display. |
| Blocks until the screen changes (boot, install step), returns a screenshot |
| Absolute mouse in screen pixels |
| Type text (US layout, |
| Keys / combos: |
| Resolution, display blank?, mouse mode, other KVM clients |
| BMC firmware, host power state, host BIOS/model |
| Temperatures, fans, voltages |
| Virtual-media settings and active redirections |
|
|
| Next boot from |
| Attach an ISO from an NFS/CIFS share as virtual CD |
| Card firmware vs. releases on the ASUS support page (version, date, SHA-256) |
| Download + verify a card firmware (ASUS SHA-256, MD5, model match); |
| Flash the prepared image (needs the |
Card firmware update
Two steps on purpose: firmware_prepare (safe, can be a dry run on the card) then firmware_flash
with the returned token. What it protects against:
wrong file: checks ASUS's published SHA-256, the MD5 inside the zip, and that the image is for the card's firmware model (e.g.
KOMMANDO);getting stuck: once in flash mode the card refuses all other logins until reset. On any error before flashing starts, the server cancels flash mode itself and waits until the card accepts logins again; only if that fails does it tell you to power-cycle;
interruption: the card has a single firmware slot. During
firmware_flash(~10 min + reboot) never cut power to the host.
The update only touches the IPMI card, not the motherboard BIOS. The host keeps running.
Typical agent loop: screenshot → decide → click / type_text / press_keys → wait_for_screen_change.
How it works
Logs in to the card's web API, gets a KVM token, opens
wss://<card>/kvmand speaks AMI's IVTP protocol (the same as the card's HTML5 viewer).Video is ASPEED's compressed format. It is decoded with AMI's own decoder, which this package does not ship: on first use it is downloaded from your card (
/libs/kvm/ast/decode_worker.js) and cached in~/.cache/asus-ipmi-mcp/(per card + firmware).Keyboard and mouse are sent as USB HID reports through the same connection; the card presents itself to the host as a USB keyboard and absolute mouse.
Power, sensors and boot override use the card's Redfish API.
Things to know
One controlling KVM session per card. Using the tools takes control from an open browser viewer (the viewer gets a "Permission Requested" prompt and loses control after ~30 s).
Black screen / "no signal" usually means the host display is asleep.
screenshotnudges the mouse to wake it. For unattended work, disable screen blanking on the host.No monitor needed on the host: the card provides the display. A monitor attached to the board's own outputs may take the picture away from the card.
US keyboard layout is assumed. On hosts with another layout, symbols and some letters differ.
Sensors empty / host BIOS unknown: ASUS desktop/workstation boards need a special IPMI-enabled BIOS from ASUS support for full sensor integration. KVM, keyboard, mouse and power state work without it.
Power-button pass-through: on a ProArt X870E without the special BIOS, wiring the chassis power/reset buttons through the card made the board hang at the DRAM Q-LED. Wire them directly to the board.
The card's self-signed certificate is accepted (no TLS verification).
Safety
This server can type passwords, power-cycle machines, boot installers and flash firmware. Keep
ASUS_IPMI_ALLOW_POWER, ASUS_IPMI_ALLOW_MEDIA and ASUS_IPMI_ALLOW_FIRMWARE off unless needed, use a dedicated card user, put the card on a management
network, and review what the agent does — it's physical access over the network.
Development
npm install
ASUS_IPMI_HOST=… ASUS_IPMI_PASSWORD=… npm run smoke # read-only tools + one screenshotProtocol notes are in the source headers (src/kvm.js, src/media.js).
See CONTRIBUTING.md (hardware reports welcome) and SECURITY.md.
Manual hardware tests in test/ (they act on a real card and host – read them before running):
smoke.js (read-only + screenshot), unlock.js (types a password on the host),
firmware-dryrun.js (uploads firmware to the card and cancels; the card restarts).
License and disclaimer
MIT for this code. The video decoder is AMI property and is not included; it is fetched from your own device at runtime.
This project is not affiliated with ASUSTeK Computer Inc. or American Megatrends. It can control power, type into and flash firmware on real hardware; you are responsible for how you use it. Flashing firmware always carries a risk of making the card unusable.
Available Tools
13 toolsclickMouse clickB
Clicks at absolute screen coordinates (pixels of the full host screen, see screenshot metadata).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Screen x in pixels | |
| y | Yes | Screen y in pixels | |
| button | No | ||
| double | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the coordinate space, which is useful, but says nothing about blocking behavior, what happens with out-of-bounds coordinates, whether the cursor is moved as a side effect, or whether the click targets whatever is focused — all relevant for an input-injection tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the critical coordinate-frame constraint front-loaded in parentheses. Nothing superfluous and no buried information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, and the coordinate-space clarification covers the biggest mistake mode. But with no annotations, no output schema, and half the parameters undocumented, an agent still lacks confirmation of click semantics (single vs double, button default, failure behavior).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: x/y are documented in the schema, while 'button' (enum) and especially 'double' are undocumented in both places. The description does add real value by clarifying that coordinates are full-host-screen absolute pixels rather than window-relative, but it never explains that 'double' produces a double-click.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (clicks) and resource (absolute screen coordinates) and pins the coordinate frame to 'pixels of the full host screen', which is the key ambiguity for a GUI-automation tool. It does not explicitly differentiate from siblings like move_mouse or drag, and double-click is left to a parameter rather than called out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The pointer to 'screenshot metadata' implies the workflow (screenshot first, then click at those coordinates), but this is only implied. There is no explicit guidance on when to click versus drag/scroll/move_mouse, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dragMouse dragB
Press left button at (x1,y1), move to (x2,y2), release.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | ||
| x2 | Yes | ||
| y1 | Yes | ||
| y2 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that the operation uses the left button and follows a press-move-release sequence, but it omits coordinate space, timing, side effects, error behavior, and return semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one tightly structured sentence with zero wasted words. It is front-loaded with the action and immediately explains the role of all four coordinates.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple pointer-automation tool, the core action and parameter roles are covered. However, with no annotations and no output schema, the description should also mention coordinate system, whether the drag is synchronous, and any meaningful side effects or return behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the four undocumented numeric parameters. It does this well by mapping (x1,y1) to the press point and (x2,y2) to the release point, though it does not specify coordinate origin or units.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise mouse operation: press the left button at one point, move to another, and release. This clearly identifies a drag action and distinguishes it mechanically from click or move_mouse, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how the drag is performed but gives no guidance on when to use it instead of click, move_mouse, scroll, or other sibling tools. There are no stated preconditions, exclusions, or alternative-selection rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firmware_check_updateCheck for IPMI card firmware updatesB
Compares the card firmware with the releases on the ASUS support page (version, date, SHA-256).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the entire behavioral burden, and it discloses very little. It implies an outbound lookup against the ASUS support page but does not state that network/Internet access is required, whether the tool is strictly read-only (i.e. never flashes or downloads firmware), how long the check takes, or what happens on failure or when the card model is unrecognized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that identifies the subject and the comparison target with no filler. It is perhaps over-compressed for a tool that performs an external network lookup, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description is the only place an agent can learn what comes back, and it only hints at it via '(version, date, SHA-256)' without saying whether the result is an up-to-date flag, a latest-release record, or a diff. For a zero-arg tool with no annotations this leaves a real gap, though the core operation is understandable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case; the schema has nothing to document and the description is consistent with a no-argument call. The mention of version, date and SHA-256 adds color about what is compared, but it is not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (compare card firmware against ASUS support-page releases) and scopes it to the hardware's firmware lineage. It is clearly distinguishable from the sibling tools (screenshot, click, kvm_status, system_info) without opening any schema. It stops short of a 5 only because it never frames the outcome (e.g. 'reports whether an update is available').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the tool to reach for when it needs to know if the IPMI card firmware is current, and no sibling competes for that job. However, there is no explicit when/when-not guidance, no mention of prerequisites such as network access to the ASUS page, and no alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kvm_statusKVM session statusB
Connection state, screen resolution, whether the host display is blank, mouse mode, other KVM clients.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden; it partly meets it by enumerating what the response reveals (connection state, resolution, blank display, mouse mode, other clients), which implies a non-mutating query. It does not state that it is read-only, side-effect free, or what 'other KVM clients' means in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, front-loaded on the most decision-relevant item (connection state). It is terse to the point of being clipped, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must report what comes back, and it does enumerate the returned fields. Given zero parameters and a simple read operation, this is close to sufficient; only the meaning of the client-list field is left ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; nothing about arguments needs explaining. The field list in the description maps to return content rather than inputs, which is the right emphasis for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a telegraphic noun list of reported fields rather than a verb+resource statement, but the title and content make clear it reports KVM session state. An agent can infer it is a status read, though it is not explicitly differentiated from siblings like system_info or sensors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus system_info, sensors, or screenshot, nor any note about polling or prerequisites. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_statusVirtual media statusC
Remote-media settings (share), images found on the share, active redirections.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only status query by listing reported content, but does not explicitly state that it is side-effect free, what permissions or prerequisites are needed, or how the information is presented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is a single short fragment with no wasted words and the key resource term ('Remote-media settings') is front-loaded. However, the fragment lacks a verb and reads as a label rather than a sentence, leaving the description underspecified rather than genuinely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no annotations, and no output schema, the description should explain what a call returns and when to use it. It enumerates three categories of remote-media data, which is a reasonable start, but without a verb or usage context the agent lacks a complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline there is no parameter semantics to document; the description cannot add value beyond the (empty) schema. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description lists the resource categories covered ('remote-media settings (share), images found on the share, active redirections') but supplies no verb, so it never states that it retrieves/reports status. It is distinguishable from siblings like kvm_status only because of the 'remote-media' wording, not because the description says what operation it performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this tool, when not to, or which sibling (e.g., kvm_status) is the alternative. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_mouseMove mouseA
Moves the pointer to absolute screen coordinates (also wakes a sleeping display).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden. It does surface one genuine side effect — waking a sleeping display — which is real behavioral value beyond the schema, but it omits whether the move is instant or animated, what happens with out-of-bounds or negative coordinates, and any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action first and the side-effect note in parentheses; every clause carries information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations, no output schema, and 0% parameter coverage, the description covers purpose and one side effect but leaves key calling details unspecified — coordinate origin, pixel units, and multi-monitor/bounds behavior. It is adequate to call the tool in the common case but thin for edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the schema only tells the agent that x and y are numbers. The description meaningfully adds that they are ABSOLUTE screen coordinates rather than deltas, which is the single most important semantic distinction here. It still omits the coordinate origin and units, so the two undocumented params are only partly compensated for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('moves') plus the resource ('the pointer') and the exact target space ('absolute screen coordinates'), which separates it from relative-motion siblings like drag or scroll. It does not explicitly name a sibling it replaces, so an agent must infer that click/drag are the alternatives when a click is also wanted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit 'use this when…' or 'do not use this when…' guidance; the only usage signal is the parenthetical that it wakes a sleeping display, which implies a valid hang-recovery use case. The agent is left to infer that this is the hover-only alternative to click or drag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keysPress key / key combinationB
Presses keys, e.g. "enter", "esc", "f2", "del", "tab", "up", "ctrl+alt+delete", "ctrl+alt+f3", "super", "alt+f4". Several can be given in order.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | Yes | List of keys/combos pressed one after another | |
| repeat | No | Repeat the whole list (e.g. press down 5 times) | |
| delay_ms | No | Delay between presses (default 120) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only lists example key values and sequence ordering; it does not state that input goes to the active/focused window, whether focus is required, how invalid keys are handled, or what side effects combinations like ctrl+alt+delete may cause.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the action first, then gives compact examples and the ordering behavior. It is appropriately sized and contains no redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the schema fully documents its parameters, but with no annotations or output schema the description should say more about focus/active-window behavior and when to prefer type_text. It is adequate to identify the operation but has clear gaps for correct invocation in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters. The description adds useful meaning by giving concrete key-name and key-combination syntax examples and clarifying that multiple keys can be passed in order, which is not fully conveyed by the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: pressing keys, with concrete examples including combinations and sequences. It is clear what the tool does, but it does not differentiate from the sibling tool type_text, which is the main alternative for keyboard input.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives examples of valid keys but provides no explicit guidance on when to use this tool versus type_text or other input tools. There are no when-not conditions, prerequisites, or alternatives named, leaving selection between siblings to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotScreenshot of the host screenA
Returns the current host screen (via the IPMI card KVM). Wakes a blanked display by nudging the mouse. Optional crop region (screen pixels) to read small text.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Default jpeg for full screen (smaller), png for crops | |
| region | No | Crop in screen pixels | |
| max_side | No | Downscale so the long side <= this (default 1024) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a genuine side effect: it nudges the mouse to wake a blanked display, which could disturb cursor state. It omits latency, error behavior when KVM is unavailable, and that the wake nudge may perturb coordinates, so it is good but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information: what it returns, the wake side effect, and the crop option. Nothing redundant and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, all-optional tool with no output schema, the description covers the essential behavior and the non-obvious side effect. The one gap is the return shape (image payload vs. reference) and whether max_side defaults actually apply when a region is supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents format defaults, region shape, and the max_side range. The description only reinforces the region/crop use case for small text and adds no syntax or default detail beyond what is structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Returns the current host screen") plus the mechanism (IPMI card KVM), which immediately distinguishes it from the action siblings like click, move_mouse, and wait_for_screen_change. An agent knows exactly what it gets without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a usage hint for the crop path ("to read small text") and explains the blank-display wake behavior, but never states when to choose this over wait_for_screen_change or when a full-screen capture is preferred. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollMouse wheelC
Scrolls at a position. Positive amount scrolls up, negative down (wheel notches).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| amount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It reveals the sign convention and that units are wheel notches, which is useful, but it omits whether scrolling targets the window under the cursor or requires prior focus, whether it requires the app to be foreground, and what is returned or how to confirm the scroll took effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the direction rule front-loaded and no filler. Slightly dense parenthetical, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-required-parameter input tool with no annotations and no output schema, an agent still cannot tell what coordinate frame x/y use or how to verify success. The definition is under-specified relative to the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies only 'amount' (sign direction, wheel notches) and leaves x and y completely undefined — no indication of coordinate space (screen vs. window), units, or origin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Scrolls') and resource/operation ('at a position'), which clearly separates it from siblings like click, drag, and press_keys. It does not explicitly name what it is not, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains scroll direction semantics but gives no guidance on when to use this versus wait_for_screen_change, drag, or press_keys (e.g. Page Down). No preconditions or exclusions are stated, so the agent must infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sensorsSensor readingsC
Temperatures, fans, voltages from the BMC (Redfish).
| Name | Required | Description | Default |
|---|---|---|---|
| include_absent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. Naming the BMC/Redfish source is genuinely useful (implies out-of-band access that can fail if the BMC is unreachable), but it never states that the operation is read-only, what happens on BMC timeout, or how results are shaped — gaps that matter for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short fragment with zero waste and the key content front-loaded, but it is under-specified rather than crisp — brevity here costs information rather than buying clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated tool with an undocumented parameter and no output schema, the description should say more about what a reading looks like (names, units, status/thresholds) and the failure mode. As written, an agent still cannot predict the call's behavior beyond 'reads sensors'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter include_absent has 0% schema description coverage and is not mentioned in the description at all, yet its meaning (include sensors that are present but not reporting/absent?) is not self-evident. The description does nothing to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (sensor readings) and the exact data returned (temperatures, fans, voltages), plus the source (BMC via Redfish), so an agent knows what it is. It doesn't explicitly distinguish itself from siblings like system_info or media_status, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus alternatives. The implied use case (checking hardware health/thermal state out-of-band) is never articulated, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_infoBMC and host infoC
BMC firmware, host power state, host BIOS/model (via Redfish).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Via Redfish' implies a read-only query over the BMC network interface, but the description never states that it is non-mutating, that it requires BMC credentials/connectivity, or what happens when the host is off (power state still returned?). For a tool with zero annotation coverage this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely short and front-loaded, but it is a comma-separated fragment rather than a complete statement, which leaves the reader to infer that these items are returned rather than configured. Brevity here edges toward under-specification rather than crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is the only documentation the agent has. Listing the three data categories gives a rough sense of the return payload, but it omits return structure, degradation behavior when the host is powered off, and relationship to sibling status tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The '(via Redfish)' note usefully explains how the data is sourced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource domains retrieved (BMC firmware, host power state, host BIOS/model) and the protocol (Redfish), which is more informative than the bare name 'system_info'. But it is a noun fragment with no verb, and it does not distinguish itself from siblings such as kvm_status or firmware_check_update that plausibly expose overlapping information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus kvm_status (which may also report host state) or firmware_check_update (BMC firmware). An agent must guess whether this is the summary/status tool or a duplicate of those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textType textA
Types text on the host keyboard (US layout; use \n for Enter, \t for Tab). Non-ASCII characters are not supported. Take a screenshot first: if the host locked its screen meanwhile, the text goes into the password field (a failed login).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| delay_ms | No | Delay between keys (default 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key traits: US layout, escape sequences for Enter/Tab, non-ASCII rejection, and a critical security risk of typing into a password field. It still leaves some behavior unstated (e.g., whether text requires an already-focused field, what happens on failure), keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each carrying distinct value: purpose, input constraints, and safety prerequisite. There is no filler, and the critical constraint is front-loaded after the purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter tool with no output schema, the description covers the essential context: what it does, format constraints, and a safety check. It is nearly complete but omits return behavior and focus requirements, which are minor gaps for this tool type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% because the required 'text' parameter has no schema description. The description compensates by explaining escape sequences and the ASCII-only constraint for that parameter, adding meaningful semantics beyond the schema. It does not elaborate on delay_ms, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Types text on the host keyboard'. The scope is clear, but it does not distinguish itself from the sibling press_keys tool, which likely also sends keyboard input, so an agent must infer which one applies to string typing versus key combos.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete prerequisite ('Take a screenshot first') tied to a real failure mode (locked screen), which is clear usage context. It does not, however, state when to prefer this over press_keys or other input tools, leaving the alternative implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_screen_changeWait until the screen changesA
Blocks until the host screen changes noticeably (or timeout), then returns a screenshot. Use after actions that take time (boot, install steps, page loads).
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No | Default 30 | |
| min_changed_fraction | No | Fraction of pixels that must change (default 0.01) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the blocking/synchronous nature, the timeout escape hatch, and that a screenshot is returned, but omits failure modes (error vs. current screen on timeout), any session/KVM connection prerequisite, and whether the returned image is pre- or post-change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core behavior front-loaded and the usage guidance second; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter, no-annotation, no-output-schema tool, the description covers the essential contract: it blocks, it can time out, and it returns a screenshot. Only edge-case behavior on timeout and connection prerequisites are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters and their defaults, giving a baseline of 3. The description mentions 'timeout' in passing but adds no meaning for min_changed_fraction or tuning guidance for either parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Blocks until the host screen changes noticeably') plus the outcome ('then returns a screenshot'), which cleanly differentiates it from the sibling 'screenshot' tool that presumably returns immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: 'Use after actions that take time (boot, install steps, page loads).' Clear positive guidance, but no explicit exclusions or named alternative (e.g., 'use screenshot instead if the screen is already stable').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
click - First observed
drag - First observed
firmware_check_update - First observed
kvm_status - First observed
media_status - First observed
move_mouse - First observed
press_keys - First observed
screenshot - First observed
scroll - First observed
sensors - First observed
system_info - First observed
type_text - First observed
wait_for_screen_change
TDQS
Scored across 13 tools
Each tool maps to a clearly distinct action or resource: individual mouse primitives (click, move_mouse, drag, scroll), keyboard primitives (type_text, press_keys), screen observation (screenshot, wait_for_screen_change), and read-only BMC queries (kvm_status, system_info, sensors, media_status, firmware_check_update). The only near-overlap is screenshot vs wait_for_screen_change, but the blocking semantics make the boundary explicit.
Action tools consistently use verb_noun or single verbs (move_mouse, type_text, press_keys, wait_for_screen_change), while status tools use noun phrases (kvm_status, system_info, media_status). This split is predictable and readable, though bare names like drag, scroll, and screenshot break the pattern slightly.
13 tools is well within the sweet spot and every tool covers a distinct capability of a KVM/IPMI interaction loop (observe, act, wait, query). Nothing feels redundant or padded.
Observation and input are fully covered, but core IPMI operations are missing: there is no power control (on/off/reset/cycle), and media_status is read-only with no tool to mount/unmount an ISO. An agent can drive the screen but cannot power-cycle the host or attach remote media, which are key BMC workflows.
Maintenance
Related MCP Connectors
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Connect AI assistants to explicitly paired computers, servers, and VMs for permitted remote actions.
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Secure and manage MCP servers through the Speakeasy AI Control Plane from your agent.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables 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.1914-
- AlicenseCqualityDmaintenanceThis MCP server connects AI agents to a PiKVM device, enabling full keyboard, mouse, and screen control of a physical machine without emulation.284GPL 3.0
- AlicenseNot gradedqualityBmaintenanceMCP server that enables AI to see and control a physical computer via a JetKVM device for screen viewing, mouse/keyboard input, media mounting, and power management.17MIT
- AlicenseAqualityAmaintenanceAn MCP server that gives AI agents smart hands for physical machines, controlling them via IP-KVM, BMC, and SSH with visual boot-phase classification and operator-gated actions.34175 PyPI8Apache 2.0







