Atlas / MCP servers / harusame64 / desktop-touch-mcp

desktop-touch-mcpBLOCK

mcp/harusame64/desktop-touch-mcp

Windows computer-use MCP server: drive any desktop app via semantic discover-then-act targeting (entities + leases, not pixel coordinates), with per-action perception guards, a native Rust UIA engine, Chrome CDP, and Key Locker credential autofill for ssh/sudo password prompts. Works with Claude, Cu

Verdict
BLOCK
Grade
F
Trust score
60 /100
Exposed tools
32 31r · 1w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
22
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://glama.ai/mcp/servers/Harusame64/desktop-touch-mcp)

日本語

Computer-use MCP server for Windows. Lets Claude, Cursor, or any MCP client see and operate your Windows 10/11 desktop — screenshots, UI Automation, Chrome CDP, keyboard / mouse, terminal — with semantic discover-then-act targeting that avoids pixel-coordinate guessing, and per-action perception guards that catch wrong-window typing before it happens.
npx -y @harusame64/desktop-touch-mcp

32 tools, native Rust engine (UIA in 2 ms), zero-config PowerShell fallback, full CJK support, MIT licensed. Add the snippet above to your Claude / Cursor / VS Code Copilot config and Claude can drive Notepad, Excel, Chrome, Windows Terminal, and any other app on your machine.

Why this over pixel-clicking? Two ideas run through every tool: discover-then-act — desktop_discover returns interactive entities with short-lived leases instead of raw coordinates, so desktop_act operates on what you mean, not where it was — and per-action perception guards that verify the target window's identity and bounds before input lands, catching wrong-window typing and stale-coordinate clicks before they happen. 2.1 reads UI Automation by element count instead of depth: Chrome, Edge and VS Code pages, Explorer and Settings values, and Word's body are read and can be acted on, and what UIA still cannot see falls back to OCR and Set-of-Marks as before. desktop_act also types into Word's body, and into Windows Terminal after asking the user. 2.0 refuses an action that cannot be done, with a reason, instead of reporting it done, and an action aimed by hwnd reaches that window only. See the CHANGELOG.

Features

  • 🔁 Every act reports what it did — desktop_act answers with what changed: elements that appe
Read from source at commit 879270610022OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add desktop-touch-mcp -- npx -y @harusame64/[email protected]
03

Exposed tools (32)

31 read · 1 write · 0 destructive.

ToolRiskDescription
browser_clickread
browser_evalread
browser_fillread
browser_formreadInspect all form fields (input, select, textarea, button) within a CSS-selector-specified container and return their name, type, id, current value (withheld for a field the page masks, such as a password: value is null, valueWithheld is
browser_locateread
browser_navigateread
browser_openreadConnect to Chrome/Edge running with --remote-debugging-port and return open tab IDs — required before all other browser_* tools.
browser_overviewreadList all interactive elements (links, buttons, inputs, ARIA controls) on the current page with CSS selectors, visible text (an input
browser_searchreadGrep-like element search across the current page. by:
click_elementread
clipboardread
desktop_actread
desktop_discoverread
desktop_stateread
excelread
focus_windowread
key_lockerread
keyboardread
mouse_clickread
mouse_dragreadClick and drag from (startX, startY) to (endX, endY) holding the left mouse button — for sliders, drag-and-drop, canvas drawing, and window resizing. Pass windowTitle so the server auto-guards the start coordinate and returns post.perception. Examples: mouse_drag({windowTitle:
notification_showread
run_macrowrite
screenshotread
screenshot_gcreadReclaim disk space from cached screenshots by retention policy. By DEFAULT this is a
screenshot_queryreadList screenshots already saved in the disk-cache WITHOUT re-reading any pixels.
scrollread
server_statusreadReturn MCP server status. engine: native engine availability — uia:
terminalread
wait_untilread
window_dockread
workspace_launchread
workspace_snapshotread
04

Trust audit

BLOCKgrade F · trust 60/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryFAIL
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (8 observation(s))
Shell
declared (6 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
src/l1_capture/payload.rs
payload.rs
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/tools/browser-eval-helpers.ts:42
return eval(__mcpExpression);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.binary · CWE-1104
tools/key-askpass/bin/Release/net10.0-windows10.0.17763.0/win-x64/WinRT.Runtime.dll
WinRT.Runtime.dll
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
tools/key-askpass/bin/Release/net10.0-windows10.0.17763.0/win-x64/key-askpass.dll
key-askpass.dll
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
tools/key-askpass/bin/Release/net10.0-windows10.0.17763.0/win-x64/key-askpass.exe
key-askpass.exe
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
tools/key-askpass/bin/Release/net10.0-windows10.0.17763.0/win-x64/key-askpass.pdb
key-askpass.pdb
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/measure-tools-list-tokens.ts:283
console.log(`\nNote: ~1 token = 4 chars (English technical prose estimate).`);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
benches/a2_http_multisession_isolation.mjs:141
const transport = new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${port}/mcp`));
LOWInventory / provenance · inv.binary · CWE-1104
tests/integration/ocr-golden.test.ts
ocr-golden.test.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
tools/key-askpass/obj/Release/net10.0-windows10.0.17763.0/win-x64/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs
.NETCoreApp,Version=v10.0.AssemblyAttributes.cs
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/unit/path-class-contract/to-tool-failure-payload.test.ts
to-tool-failure-payload.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/unit/a-gone-field-is-not-typed-into.test.ts:146
execute: (e, a, t) => exec(e, a, t),
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/unit/a-refused-type-says-why.test.ts:96
execute: (e, action, text) => exec(e, action, text),
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/unit/a-write-that-did-not-take-is-refused.test.ts:162
execute: (e, a, t) => exec(e, a, t),
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/unit/adr-036-act-aims-by-handle.test.ts:61
await exec(entity(), "click");
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/engine/world-graph/resolver.ts:62
return createHash("sha1")
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/tools/mac/ax-provider.ts:143
return createHash("sha1").update(`ax|${pid}|${kindOf(e)}${where}`).digest("hex").slice(0, 16);
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/key-locker-landed-detection.test.ts:51
"ssh-keygen -y -f ~/.ssh/id_ed25519",
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/unit/key-locker-ssh-resolve.test.ts:103
it("alias resolves through ~/.ssh/config to the real endpoint + fp-set", async () => {
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/engine/bridge-host.ts:124
`bridge-host.exe not found at ${HELPER_EXE}. Build: cd tools/bridge-host && dotnet publish -c Release -o ../../bin/`,
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/engine/key-locker-host.ts:250
`key-locker.exe not found at ${HELPER_EXE}. Build: cd tools/key-locker && dotnet publish -c Release -o ../../bin/`,
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/engine/native-engine.ts:471
const addon = await import("../../index.js");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/engine/ocr-bridge.ts:251
`Run: cd tools/win-ocr && dotnet publish -c Release -o ../../bin/`
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/engine/perception/action-target.ts:34
import { logResolve } from "../../tools/_resolve-log.js";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.ja.md:137
デフォルトポートは `23847`。`http://127.0.0.1:23847/mcp` をクライアントの MCP サーバー URL に登録してください(ローカルのみ、外部公開なし)。

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 879270610022full audit observations/trust-audit/mcp-server/harusame64__desktop-touch-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10879270610022BLOCKF60first audit
06

Questions

What is the desktop-touch-mcp MCP server?

Windows computer-use MCP server: drive any desktop app via semantic discover-then-act targeting (entities + leases, not pixel coordinates), with per-action perception guards, a native Rust UIA engine, Chrome CDP, and Key Locker credential autofill for ssh/sudo password prompts. Works with Claude, Cu

What tools does desktop-touch-mcp expose?

32 in total: 31 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is desktop-touch-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (60/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does desktop-touch-mcp need?

It reads DESKTOP_TOUCH_DISABLE_KEY_LOCKER, DESKTOP_TOUCH_KEYBOARD_RUNG_UNCHECKED, DESKTOP_TOUCH_KEY_LOCKER_DOGFOOD, DESKTOP_TOUCH_STAGE4_SSIM_KEYBOARD, DESKTOP_TOUCH_TOKEN, GH_TOKEN, GITHUB_TOKEN and TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does desktop-touch-mcp run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @harusame64/desktop-touch-mcp at 2.2.0.

How current is this page?

The grade is for one exact copy of the source (879270610022), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement