MCP server for KVM control — thin client for serial-hid-kvm. Delegates hardware operations (serial, capture) to KVM server via TCP. Runs OCR locally using frames fetched from the KVM server.
This is a hardware control server (KVM/HID) with 5 tools for keyboard and mouse input. All tools have explicit registrations with descriptions and input schemas present in the source code. Naming is action-oriented (type_text, send_key, send_key_sequence, mouse_move, mouse_click). Descriptions are detailed and contextual, particularly type_text which includes extensive usage examples and constraints. However, several parameters lack descriptions, and output schemas are not documented. The server is STDIO-only, which is a hard transport limitation.
Click a mouse button on the target PC, optionally at a specific position.
Move the mouse cursor on the target PC.
Send a single key press with optional modifier keys (e.g., Ctrl+C, Alt+F4).
Send a sequence of key steps with optional per-step delays. Useful for complex keyboard operations.
Type a string as keyboard input on the target PC. Supports inline tags: {enter}, {tab}, {ctrl+c}, {shift+0x87}, etc. {0xNN} sends any HID keycode by hex value (0x00-0xFF) for keys without a named tag, e.g. {0x87} = JIS ろ key (International1). **Whitelist-based tag parsing:** Only recognized special key names inside {braces} are interpreted as tags. Unknown {content} (e.g. {print $1}) is passed through as literal text including the braces. This means code with curly braces (awk, Python, shell) can be sent without escaping in most cases. **Escaping:** Use {{ and }} to force literal braces when they collide with a recognized tag name (e.g. {{enter}} to type the literal text "{enter}"). **Raw mode (raw=true):** Disables ALL tag interpretation. Actual line breaks in the input (LF, CRLF, CR) are sent as Enter key presses. In JSON, \n is decoded into an actual line break, so it becomes Enter. To type a literal backslash + n, use \\n in JSON. Examples: "ls -la{enter}" → types "ls -la" then presses Enter "awk '{print $1}' file.txt{enter}" → types the awk command then Enter (braces preserved) "echo {{enter}}" → types "echo {enter}" (escaped to avoid tag) raw=true: "ls -la\necho hi\n" → types "ls -la", Enter, "echo hi", Enter **Supported characters:** ASCII printable (space through ~), tab, and newline only. Unicode, CJK, accented characters, and control characters cause an error. For unsupported characters or binary data, use base64 encoding as a workaround: encode on the host and type a decode command (e.g. `echo <b64> | base64 -d`) on the target.
Output schemas not documented. Tools return results but LLMs cannot see expected response structure, limiting ability to chain tools or extract specific fields from responses.
Several parameter descriptions are minimal. send_key: 'key' param description lists valid values but doesn't explain what 'key' controls or what pressing it does. mouse_move: 'x' and 'y' lack guidance on coordinate ranges or screen resolution assumptions.
Error handling not visible. No error recovery guidance in tool descriptions (e.g., what if mouse coordinates are out of bounds? what if a keycode is invalid?). Agents cannot self-correct or know whether to retry.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
send_key_sequence: 'key' parameter inside array items has no description. Same for 'modifiers' inside array items. Array item properties need inline docs.
Type_text supports hex keycodes {0xNN} but the description doesn't clarify error behavior when an invalid hex code is passed (e.g. {0xGG}). Edge case handling is undocumented.
Mouse_click button parameter is optional ('button' not in required array) but defaults to 'left', however, the schema does not document this default explicitly in the parameter description or as a default value in the JSON schema.