A side-by-side look at the Desktop Touch MCP and Oswright 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 Oswright for os automation as a local process. You can also run both side by side in one mcpServers block.
DESKTOP_TOUCH_MCP_HOME, GITHUB_TOKEN, GH_TOKEN, DESKTOP_TOUCH_MCP_ALLOW_UNVERIFIED.desktop_discover, desktop_act, desktop_state.screenshot, get_screen_info, find_text_on_screen.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | OS Automation | OS Automation |
| Quality signal | 65/100 · Great | 59/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | Not declared |
| Pricing | Free | Not declared |
| Required env vars | DESKTOP_TOUCH_MCP_HOMEGITHUB_TOKENGH_TOKENDESKTOP_TOUCH_MCP_ALLOW_UNVERIFIED | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 22 | 4 |
| Directory activity | 2 views 0 installs 0 upvotes | 2 views 0 installs 0 upvotes |
| Tools | 23 | 43 |
| Full listing | View Desktop Touch MCP | View Oswright |
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.keyboardSend keyboard input. Supports background input (WM_CHAR) and IME-safe clipboard bypass.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.screenshot
Take a screenshot of the screen or a region.
Returns the image as native MCP image content.
Optionally saves to a file path.
Args:
save_path: Optional file path to save the screenshot.
region_left: Left coordinate for a sub-region capture.
region_top: Top coordinate for a sub-region capture.
region_width: Width of the sub-region.
region_height: Height of the sub-region.
monitor: Monitor index (0 = all monitors, 1 = primary, etc.).
get_screen_info
Get screen dimensions and monitor count.
Args:
monitor: Monitor index (0 = all monitors combined).
find_text_on_screen
Find all occurrences of text on screen using OCR.
Returns a list of matches with coordinates and confidence. Coordinates are
absolute screen coordinates, ready to pass straight to mouse_click.
Args:
text: The text to search for on screen.
exact: If True, requires exact match. If False, substring match.
region_left: Optional left bound to restrict search area.
region_top: Optional top bound to restrict search area.
region_width: Optional width to restrict search area.
region_height: Optional height to restrict search area.
monitor: Monitor index.
read_screen_text
Read ALL visible text on the screen using OCR.
Returns every detected text element with its position, in absolute
screen coordinates that are ready to click.
Args:
region_left: Optional left bound to restrict OCR area.
region_top: Optional top bound to restrict OCR area.
region_width: Optional width to restrict OCR area.
region_height: Optional height to restrict OCR area.
monitor: Monitor index.
find_image_on_screen
Find all occurrences of a template image on screen.
Coordinates are absolute screen coordinates, ready to pass to mouse_click.
Args:
template_path: Absolute path to the template image file to find.
threshold: Minimum match confidence (0.0-1.0, default 0.8).
monitor: Monitor index.
mouse_click
Click the mouse at coordinates or current position.
Returns action result and a screenshot of current screen state.
Args:
x: X screen coordinate. If not provided, clicks at current position.
y: Y screen coordinate. If not provided, clicks at current position.
button: Mouse button - 'left', 'right', or 'middle'.
clicks: Number of clicks (2 for double-click).
mouse_double_click
Double-click at coordinates or current position.
Returns action result and a screenshot of current screen state.
Args:
x: X screen coordinate.
y: Y screen coordinate.
mouse_move
Move the mouse cursor to screen coordinates.
Args:
x: X screen coordinate.
y: Y screen coordinate.
mouse_scroll
Scroll the mouse wheel.
Returns action result and a screenshot of current screen state.
Args:
amount: Scroll amount. Positive = up, negative = down.
x: Optional X coordinate to scroll at.
y: Optional Y coordinate to scroll at.
mouse_drag
Drag from one point to another.
Returns action result and a screenshot of current screen state.
Args:
start_x: Starting X coordinate.
start_y: Starting Y coordinate.
end_x: Ending X coordinate.
end_y: Ending Y coordinate.
button: Mouse button to hold ('left' or 'right').
duration: Duration of the drag in seconds.
get_mouse_positionGet the current mouse cursor position.type_text
Type text using the keyboard (character by character).
Returns action result and a screenshot of current screen state.
Args:
text: The text to type.
delay: Delay in seconds between each character.
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.
{
"mcpServers": {
"harusame64-desktop-touch-mcp": {
"command": "npx",
"args": [
"-y",
"@harusame64/desktop-touch-mcp"
],
"env": {
"DESKTOP_TOUCH_MCP_HOME": "YOUR_DESKTOP_TOUCH_MCP_HOME_HERE",
"GITHUB_TOKEN": "YOUR_GITHUB_TOKEN_HERE",
"GH_TOKEN": "YOUR_GH_TOKEN_HERE",
"DESKTOP_TOUCH_MCP_ALLOW_UNVERIFIED": "YOUR_DESKTOP_TOUCH_MCP_ALLOW_UNVERIFIED_HERE"
}
}
}
}
{
"mcpServers": {
"oswright": {
"command": "uvx",
"args": [
"oswright"
]
}
}
}