Repository navigation
tst-cu-mcp v0.2.0 - Windows support
tst-cu-mcp v0.2.0 — Windows support
A local computer-use MCP server: lets a model see the screen and drive the
desktop over stdio. One package, two backends, selected at runtime from
sys.platform.
Install
pip install tst_cu_mcp-0.2.0-py3-none-any.whl
A single py3-none-any wheel is correct for both platforms: the PyObjC
dependencies carry sys_platform == 'darwin' markers, so a Windows install
skips them and adds no runtime dependency at all (ctypes is stdlib; Pillow was
already required for the downscale path).
What's new
- Windows backend. DPI-aware capture and geometry,
SendInputactuation,
UIPI and secure-desktop reporting. Per-monitor-v2 awareness is set before any
geometry is read, so a scaled display reports true pixels rather than scaled
ones. win/superis pressable on its own.VK_LWINneeds the extended-key
flag; without it the Start menu never opens. Found by live use, not review.expect_windowon every input tool. Pass part of the intended window's
title or process name and the action is refused, before anything is sent,
unless that window is in front. A coordinate aims at a point, not at a thing.- New tools:
get_foreground_window,get_cursor_position,wait,
wait_for_window. - Reads are exempt from the kill-switch. Halting the hands should not blind
the eyes: capture and state queries keep working while actuation is stopped.
Verification status
Verified on Windows 11 at 150% display scaling: 342 headless tests, 45 desktop
tests against the real OS, plus a live driving session covering capture, click,
type, scroll, the focus guard's refusal path, and the kill-switch.
The macOS half of this release is unverified. The darwin backend ships and
its pre-existing 0.1.0 functionality was working before the port, but the
cursor_position and foreground_window implementations added in 0.2.0 have
never been executed on a Mac. There is also no macOS desktop test tier. Treat
the darwin path as untested in this release.
Linux is not supported. get_backend() raises UnsupportedPlatformError
naming the supported platforms. Note the wheel will still install on Linux —
it is pure Python with no platform-gated dependencies — so the failure appears
at first tool call rather than at install time.
Known gaps
No drag (click is down-and-up at a single point), no screenshot frame hash for
cheap change-polling, and no element-level targeting. Coordinate-driven
automation is brittle by construction; the expect_window guard manages that
rather than removing it.