mcp-serial-hid-kvm
MCP (Model Context Protocol) server that gives AI agents full keyboard, mouse, and screen access to a physical PC. Thin client for serial-hid-kvm — all hardware control is delegated via TCP.
How It Works
Claude / AI Agent
↕ MCP (stdio)
mcp-serial-hid-kvm ← this package (thin client + OCR)
↕ TCP (localhost:9329)
serial-hid-kvm ← standalone KVM server (owns hardware)
↕ USB Serial + HDMI
Target PC
The KVM server (serial-hid-kvm) runs as a persistent process owning the serial port and capture device. This MCP server connects to it as a TCP client. Multiple MCP instances (multiple Claude sessions) can share a single KVM server without device conflicts.
Prerequisites
- Hardware: CH9329+CH340 USB HID cable + USB HDMI capture device (see serial-hid-kvm for details)
- serial-hid-kvm installed and running:
pip install -e /path/to/serial-hid-kvm serial-hid-kvm --api # with preview window serial-hid-kvm --api --headless # or headless
- Tesseract OCR (for
get_screen_text/execute_and_read):- Linux:
sudo apt install tesseract-ocr - Windows: https://github.com/tesseract-ocr/tesseract
- Linux:
Installation
pip install -e .
This automatically installs serial-hid-kvm as a dependency.
MCP Client Configuration
Claude Desktop / Claude Code
{
"mcpServers": {
"kvm": {
"command": "mcp-serial-hid-kvm"
}
}
}
Custom KVM server address:
{
"mcpServers": {
"kvm": {
"command": "mcp-serial-hid-kvm",
"env": {
"SHKVM_API_HOST": "127.0.0.1",
"SHKVM_API_PORT": "9329"
}
}
}
}
Configuration
| Variable | Default | Description |
|---|---|---|
SHKVM_API_HOST |
127.0.0.1 |
KVM server address |
SHKVM_API_PORT |
9329 |
KVM server port |
MCP_TESSERACT_CMD |
auto-detect | Path to tesseract executable |
MCP_CAPTURE_LOG_DIR |
platform default | Capture log directory (empty string to disable) |
Hardware settings (SHKVM_SERIAL_PORT, SHKVM_SCREEN_WIDTH, etc.) are configured on the KVM server side, not here. If the target PC uses a non-US keyboard, set --target-layout (or SHKVM_TARGET_LAYOUT) on the KVM server so that type_text and send_key produce correct characters.
Available Tools
Keyboard
| Tool | Description |
|---|---|
type_text |
Type text with inline tags: ls -la{enter}, {ctrl+c}, {alt+f4} |
send_key |
Single key press with modifiers |
send_key_sequence |
Multiple key steps with per-step delays |
Mouse
| Tool | Description |
|---|---|
mouse_move |
Move cursor (absolute or relative) |
mouse_click |
Click at optional position |
mouse_drag |
Drag from one position to another (drag-and-drop, text selection, etc.) |
mouse_scroll |
Scroll wheel |
Screen
| Tool | Description |
|---|---|
capture_screen |
Capture screen as image (high token cost) |
get_screen_text |
Capture + OCR to text (preferred for text content) |
execute_and_read |
Type command, Enter, wait, capture + OCR |
Device Management
| Tool | Description |
|---|---|
get_device_info |
Serial port, capture device, config info |
list_capture_devices |
List available video devices |
set_capture_device |
Switch capture device |
set_capture_resolution |
Change capture resolution |
Architecture
This package is intentionally minimal (~4 files):
mcp_serial_hid_kvm/
server.py MCP tool handlers → KvmClient TCP calls
config.py KVM host/port, tesseract, log settings
ocr.py Tesseract OCR (runs locally on fetched frames)
__init__.py
All keyboard/mouse/capture logic lives in serial-hid-kvm. This package only translates MCP tool calls to TCP API calls and runs OCR locally.
Why Separate?
- No device conflicts — multiple Claude sessions share one KVM server
- Independent restarts — restart the MCP server without losing the KVM connection
- Standalone use —
serial-hid-kvmworks without MCP (interactive preview, scripts, other AI frameworks)
License
Metadata
Release files for mcp-serial-hid-kvm 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_serial_hid_kvm-0.1.0.tar.gz | 9.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_serial_hid_kvm-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.1 kB
Release files / mcp_serial_hid_kvm-0.1.0.tar.gz
| Download URL | mcp_serial_hid_kvm-0.1.0.tar.gz |
|---|---|
| Size | 9.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad1870d1ff334e1ec98d854bb6948661236a9c84e05acd2876c45a2b8e1fdb0d
|
|
BLAKE2b-256 checksum How to use checksums |
52850795aeac5f938a905276b508e2920a3235c7bd3b498b6e73bb01ea6b7637
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 26, 2026.
Transparency logRelease files / mcp_serial_hid_kvm-0.1.0-py3-none-any.whl
| Download URL | mcp_serial_hid_kvm-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fba38357eeb0bc590635f49a3ec073839587111d4af8a648a3bcfced4cb50365
|
|
BLAKE2b-256 checksum How to use checksums |
78d816181a3c9de599fd97f6bf126728e082792d92221b5828f72d488863cbc1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 26, 2026.
Transparency log