Desktop Touch MCP vs Hypruse — MCP Server Comparison | AllMCPs
Desktop Touch MCP vs Hypruse
A side-by-side look at the Desktop Touch MCP and Hypruse MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Desktop Touch MCP for os automation work as a local process; choose Hypruse for os automation as a local process. You can also run both side by side in one mcpServers block.
Which MCP server should you choose?
Choose Desktop Touch MCP when
You need dedicated capabilities in the OS Automation domain.
You prefer a local stdio subprocess transport.
Its auth model fits you: No auth required.
You have the keys it needs: DESKTOP_TOUCH_MCP_HOME, GITHUB_TOKEN, GH_TOKEN, DESKTOP_TOUCH_MCP_ALLOW_UNVERIFIED.
You want tools like desktop_discover, desktop_act, desktop_state.
desktop_discoverObserve the desktop. Returns interactive entities with leases (UIA, CDP, Terminal, Visual SoM).
desktop_actPerform actions (click, type, set a value, select) on entities via lease validation. Returns semantic diffs — plus an optional `roiCapture` (changed-region PNG + next-target preview) on visual-only targets.
desktop_stateLightweight check of focus, active window, cursor, and Auto-Perception attention signal.
screenshotMulti-mode capture: `detail='text'` (UIA/OCR), `diffMode` (P-frame), `dotByDot` (1:1), and `background`. Returns a cheap `screenshot://by-ref/{id}` link to the saved image instead of inlining pixels every time.
screenshot_queryInspect and prune the on-disk screenshot cache behind the by-ref links: `screenshot_query` lists saved captures without re-reading pixels; `screenshot_gc` reclaims space by retention policy (dry-run by default).
workspace_snapshotInstant session orientation: all window thumbnails + UI summaries in one call.
server_statusDiagnostic check for native engine health and feature activation.
mouse_clickPrecision coordinate-based interaction with homing and force-focus protection.
scrollMulti-strategy: `raw` (notches), `to_element`, `smart` (virtual lists), and `capture` (stitch).
click_elementLegacy UIA-based click by name/ID (fallback when entities are unavailable).
browser_openIdempotent debug-mode launch and reliable navigation.
+11 more on the
Ready-to-paste client configs
Paste 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.
Desktop Touch MCP is categorized under OS Automation and uses a local stdio subprocess. Hypruse belongs to OS Automation and uses a local stdio subprocess. Pick Desktop Touch MCP for os automation work and Hypruse for os automation.
Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.
Desktop Touch MCP is listed as free. Auth: no auth required. Hypruse has no declared pricing — check the project's own site. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.
Yes. MCP clients support multiple servers: add harusame64-desktop-touch-mcp and hypruse as separate keys in the same mcpServers object, and your assistant will call tools from either one.
On AllMCPs, Desktop Touch MCP has a quality signal of 65/100 (Great) with 2 views, 0 installs and 22 GitHub stars. Hypruse has 56/100 (Good) with 0 views, 0 installs and 33 GitHub stars.
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, exact window crop by address, or `x,y,WxH` region; returns image + coordinate-mapping metadata; fast JPEG by default (`lossless=true` for PNG); `stable=true` waits for the frame to settle
zoomNative-resolution re-capture around an estimated point (optionally clamped to a window): the precision step before clicking small controls, same metadata contract
uiRead 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 nothing
marksSet-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 it
click_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 guessing
pointermove / click / drag / scroll (discrete wheel notches) in global coordinates
keyboardType 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 here
hyprSwitch 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 workspace
bindsThe user's own keybinds, decoded (`SUPER+Q`, action, description); the agent runs one with `use_bind
use_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…