Skip to content

tst-cu-mcp v0.2.0 - Windows support

Choose a tag to compare

@captcrock captcrock released this 15 Oct 20:18
· 626 commits to main since this release

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, SendInput actuation,
    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/super is pressable on its own. VK_LWIN needs the extended-key
    flag; without it the Start menu never opens. Found by live use, not review.
  • expect_window on 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.