mcp-serial-hid-kvm

March 18, 2026 · View on GitHub

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

  1. Hardware: CH9329+CH340 USB HID cable + USB HDMI capture device (see serial-hid-kvm for details)
  2. 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
    
  3. Tesseract OCR (for get_screen_text / execute_and_read):

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

VariableDefaultDescription
SHKVM_API_HOST127.0.0.1KVM server address
SHKVM_API_PORT9329KVM server port
SHKVM_OCR_CMDauto-detectPath to tesseract executable
SHKVM_CAPTURE_LOG_DIRplatform defaultCapture 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

ToolDescription
type_textType text with inline tags: ls -la{enter}, {ctrl+c}, {alt+f4}. Whitelist-based: unknown {content} passes through literally. Raw mode (raw=true) disables tags; actual line breaks become Enter. char_delay_ms: delay between keystrokes in ms (default: 20). Only ASCII printable characters, tab, and line breaks are supported; unsupported characters (Unicode, CJK, etc.) cause an error — use base64 encoding as a workaround
send_keySingle key press with modifiers
send_key_sequenceMultiple key steps with per-step delays. default_delay_ms: delay between steps in ms (default: 100); each step can override with delay_ms

Mouse

ToolDescription
mouse_moveMove cursor (absolute or relative)
mouse_clickClick at optional position
mouse_dragDrag from one position to another (drag-and-drop, text selection, etc.)
mouse_scrollScroll wheel

Screen

ToolDescription
capture_screenCapture screen as image (high token cost)
get_screen_textCapture + OCR to text (preferred for text content)
execute_and_readType command, Enter, wait, capture + OCR

Device Management

ToolDescription
get_device_infoSerial port, capture device, config info
list_capture_devicesList available video devices
set_capture_deviceSwitch capture device
set_capture_resolutionChange 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 useserial-hid-kvm works without MCP (interactive preview, scripts, other AI frameworks)

License

MIT