A side-by-side look at the Hypruse and Kwin MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Hypruse for os automation work as a local process; choose Kwin MCP for os automation as a local process. You can also run both side by side in one mcpServers block.
HYPRUSE_CLIPBOARD.desktop, screenshot, zoom.session_start, session_connect, session_stop.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | OS Automation | OS Automation |
| Quality signal | 56/100 · Good | 53/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | HYPRUSE_CLIPBOARD | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 36 | 2 |
| Directory activity | 0 views 0 installs 0 upvotes | 0 views 0 installs 0 upvotes |
| Tools | 15 | 30 |
| Full listing | View Hypruse | View Kwin MCP |
desktopOne-call semantic snapshot: monitors, workspaces, windows (address/class/title/geometry), active window, cursor, and layer surfaces (launchers, bars, notification popups) with a best-effort kind and geometry. A listed layer is one the compositor tracks, not one you can see: transparent and dormant…screenshotFocused monitor, one window by address (with grim 1.5+ on Hyprland 0.54+, even hidden or covered; metadata `visible` says whether the compositor draws it, `source` whether the pixels are the window's own or a screen crop, and a hidden capture may be stale), or `x,y,WxH` region; returns image + coor…zoomNative-resolution re-capture around an estimated point (optionally clamped to a window): the precision step before clicking small controls, same metadata contractuiRead a window's accessibility tree (AT-SPI, GTK/Qt apps that expose one) and return clickable elements by name with exact global coordinates, no screenshot; reports current values too (typed text, slider position, checkbox state); falls back to vision when an app exposes nothingmarksSet-of-Marks capture: the window screenshot with every accessible control drawn as a numbered mark, plus a JSON legend (role, name, current value, exact click point per number); needs ImageMagick for the drawing, degrades to the legend alone without itclick_uiClick a control by accessible NAME or by a `marks` number in one call: the coordinate comes from the tree, the click goes through the real pointer (visible, same safety guarantees); an ambiguous name returns the candidates instead of guessingpointermove / click / drag / scroll (discrete wheel notches) in global coordinateskeyboardType literal text (unicode-safe) or press app-level combos (`ctrl+shift+t`, `esc`, `F5`); optional `window` address focuses the target first so keystrokes land in the right app. Compositor binds (`super+...`) go through `use_bind`, not herehyprSwitch workspace, focus/move/close windows, fullscreen, floating (pure IPC, milliseconds; `close_window` also waits up to 1s for the destroy event, so its result and `then=` observation reflect the close instead of racing it)launchStart an app (optionally silent on another workspace), block on its actual `openwindow` event, return its address; detects single-instance apps (browsers) whose window ignores exec rules and moves it to the requested workspacebindsThe user's own keybinds, decoded (`SUPER+Q`, action, description); the agent runs one with `use_binduse_bindExecute a keybind by combo (`SUPER+F`), running its bound action, so the agent drives the owner's own launchers and shortcuts. Not available for binds in a Lua `hyprland.lua`: those are anonymous closures Hyprland exposes no way to call, so `binds` shows them as action `lua` and `use_bind` says so…session_startStart an isolated KWin Wayland session, optionally launching an app. A screen size of `0` auto-detects the bounding box of the logical desktop (all enabled outputs / connected monitors). Set `enable_clipboard=true` to enable clipboard tools (requires `wl-clipboard`). Set `keep_screenshots=true` to…session_connectConnect to an existing KWin session (real desktop or container). Defaults to `$DBUS_SESSION_BUS_ADDRESS` and `$WAYLAND_DISPLAY`. Clipboard is always enabled. `session_stop` only disconnects without killing KWin or pre-existing apps.session_stopStop the session and clean up. For virtual sessions: terminates KWin and all apps. For live sessions: disconnects without killing KWin or pre-existing apps.screenshotCapture a screenshot of the virtual display (saved as PNG, returns file path)accessibility_treeGet the AT-SPI2 widget tree with roles, names, states, and screen coordinates (translated from window-local coordinates via compositor-side window geometry). Use `role` to filter to specific element types (e.g. `"button"`, `"check box"`). Non-matching elements are hidden but their children are stil…find_ui_elementsSearch for UI elements by name, role, or description (case-insensitive). Returns screen coordinates suitable for `mouse_click` and friends. Optionally filter by AT-SPI2 states (e.g. `["focused"]`, `["active", "visible"]`). `query` can be empty when filtering by states only.mouse_clickClick at coordinates. Supports left/right/middle, single/double/triple click, modifier keys (e.g. `["ctrl", "shift"]`), and long-press via `hold_ms`.mouse_moveMove the cursor (hover) to coordinates without clickingmouse_scrollScroll at coordinates. `delta` positive = down/right, negative = up/left. Use `discrete=true` for wheel ticks, `steps` to split into smooth increments.mouse_dragDrag from one point to another with smooth interpolation. Supports custom `waypoints` for complex drag paths.mouse_button_downPress a mouse button at coordinates without releasing. Use with `mouse_button_up` for manual drag control.mouse_button_upRelease a previously pressed mouse button at coordinatesPaste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"hypruse": {
"command": "uvx",
"args": [
"hypruse"
],
"env": {
"HYPRUSE_CLIPBOARD": "YOUR_HYPRUSE_CLIPBOARD_HERE"
}
}
}
}
{
"mcpServers": {
"kwin-mcp": {
"command": "uvx",
"args": [
"kwin-mcp"
]
}
}
}