Windows-MCP in the background: run it in Anode's hidden Windows session

Tested on 22 October 2026: we started Windows-MCP 0.8.8 inside Anode's hidden Windows session (the seat), and all 13 of its tool calls returned without an error (7 from a script, 6 from Claude Code), with no USER_CONTROL pause from its control gate, while the pointer on the PC's own desktop, sampled every 50 ms for 240 s, never moved and its foreground window never changed. Nobody used the PC during the run, so it shows that the agent's clicks and typing stayed in the seat, not yet that the gate ignores you while you work: we expect it to, because Windows' global input hooks see only their own desktop (Microsoft's SetWindowsHookEx docs), but we haven't measured it. Anode needs Windows 10/11 Pro, Enterprise or Education. Method, data and the setup steps are below.

We make Anode. Windows-MCP is CursorTouch's project (MIT); we don't maintain it, and this page isn't affiliated with it. Our numbers come from one run that you can repeat with the scripts listed under Method; everything about Windows-MCP's own behaviour links to its README, issues or source. If we got something wrong, open an issue and we will correct it.

Last checked: 22 October 2026 · Windows-MCP 0.8.8, the latest release on PyPI and GitHub (its main at 0ffef41 has unreleased gate changes) · Anode 0.11.3 · Next check by 21 November 2026, or sooner when Windows-MCP releases.

The short answer

Why Windows-MCP pauses when you touch your mouse

Windows-MCP 0.8.8 (10 October 2026) added a control gate (#445). While the agent holds control, during each call and for 15 seconds after it, the gate holds back your physical keyboard and mouse input, and only moving the mouse substantially or pressing Ctrl+Alt+Shift+Backspace takes control back (except in the moment it hides its indicator to take a screenshot, when any physical input does). Once the agent has been idle for 15 seconds, any physical key press, click or mouse movement on its desktop hands control to you. Either way, new tool calls are then refused with the USER_CONTROL code until your mouse and keyboard have been idle for 10 seconds (control.py at v0.8.8; the ControlStatus entry in its README at v0.8.8; #457). In 0.8.8 the gate holds back every tool except ControlStatus, including ones that don't drive the desktop, such as Clipboard, WaitFor and DisplayInventory (#456; the README on main describes its new strict policy as the previous behaviour). And it can't be turned off: as #475 reports, 0.8.8 has no --no-control option and silently ignores the [control] settings that the README on main documents. The reporter of #457 uses the same PC while the agent runs long jobs, and found the agent blocked most of the time after updating.

What we measured

Windows-MCP 0.8.8 from PyPI on Python 3.14.7, telemetry off, served over streamable HTTP on 127.0.0.1:8765 and started inside the seat of Anode 0.11.3 (Windows 11 Pro, build 26200; seat 1280x720). A sampler on the PC's own desktop read the pointer position, the foreground window and the input idle time every 50 ms for 240 s, which covered both client runs.

CheckResult
Session of the process listening on port 8765The seat's (session 3), not the PC's own (session 1)
Tool calls: script (fastmcp client)7 of 7 returned without an error: ControlStatus, App (start the test window), Snapshot, Type, Screenshot, Snapshot, ControlStatus
Tool calls: Claude Code 2.1.302 (Sonnet, claude-sonnet-5-5)6 of 6 returned without an error: ControlStatus, App (switch), Snapshot, Type, Screenshot, ControlStatus. Five Windows-MCP tools were pre-approved (not Click), and it used Claude Code's ToolSearch once to load them. Its Type line landed in the middle of the existing text (see the limits).
USER_CONTROL or TAKEOVER_PENDINGIn no tool result and not in the server log
ControlStatusready before, ai after: the agent held control at the end
The PC's own pointer, 4,762 samples over 240 s1 position: it never moved
The PC's own foreground window0 changes
The PC's own input idle timeOver 9 hours throughout: nobody used the PC
Anode's pointer guardIts count stayed at 8 before and after: nothing to block
Text typed by the script's TypeArrived in the test window inside the seat (screenshot below)
Call times (script run)ControlStatus 0.01–0.5 s, App 0.1 s, Type 1.4 s, Screenshot 0.4 s, Snapshot 16–26 s
A plain test window titled C-074 test pad, containing the line: Typed by Windows-MCP inside an Anode seat.
The throwaway test window inside the seat after the script's Type call, from the seat's own screen, cropped to the window.

Data: script run, Claude Code run, the PC's own desktop (the sampler kept window title lengths, not titles), session and pointer-guard checks, the test window's text, exact package versions.

Set it up

These are the steps from Anode's guide, Keep working while Windows-MCP clicks, which is kept up to date. Our run used the same server command apart from the flags noted in step 2; the other differences are listed under Method. You need Anode installed and set up and uv. Windows-MCP 0.8.8 needs Python 3.14 or later (PyPI's requirement; its README still says 3.13+).

1. Install Windows-MCP in a folder of its own

uv venv --python 3.14 C:\tools\windows-mcp
uv pip install --python C:\tools\windows-mcp\Scripts\python.exe windows-mcp==0.8.8
New-Item -ItemType File C:\tools\windows-mcp\config.toml   # an empty config of its own

If uv picks a free-threaded build (3.14t), pywin32 won't install. Name a regular build instead, for example --python cpython-3.14.7-windows-x86_64-none.

2. Save a start script

Save this as C:\tools\windows-mcp\start-windows-mcp.cmd. It listens on 127.0.0.1 only, turns off Windows-MCP's anonymous telemetry, enables the same six tools as our run (it called five of them; Click wasn't needed), and writes a log next to it.

@echo off
set ANONYMIZED_TELEMETRY=false
"%~dp0Scripts\windows-mcp.exe" serve --config "%~dp0config.toml" --transport streamable-http --host 127.0.0.1 --port 8765 --tools ControlStatus,App,Type,Click,Screenshot,Snapshot >> "%~dp0server.log" 2>&1

--config points at the empty file from step 1, so a ~/.windows-mcp/config.toml left from an earlier setup (an auth key or TLS) can't break the plain http:// client config below. A WINDOWS_MCP_AUTH_KEY environment variable still would, and the seat has your user's environment. Our run's script had no --config and added --debug (as run); --config is documented in Windows-MCP's 0.8.8 README, not run by us. Any program on your PC can reach the port, and Windows-MCP's other tools include a PowerShell runner, so enable only the tools you need; its --auth-key adds a bearer-token check.

3. Start it in the seat

anode run starts a program inside the seat. Like every desktop command, it needs the desktop lease, which you release straight after. If you sign in to Windows with a PIN or Windows Hello, a new seat may stop at sign-in: choose Sign in… from the Anode tray icon (troubleshooting).

$env:ANODE_AGENT_ID = 'windows-mcp-start'
$lease = anode lease acquire | Out-String | ConvertFrom-Json
if ($LASTEXITCODE -ne 0) { throw 'Desktop acquisition failed.' }
$env:ANODE_LEASE_TOKEN = $lease.leaseToken
anode run C:\tools\windows-mcp\start-windows-mcp.cmd | Out-Host
anode lease release | Out-Host

Give it about 15 seconds to start listening (ours took 14), then check that the server runs in the seat's session, which anode status prints as seat session, not in yours:

Get-NetTCPConnection -LocalPort 8765 -State Listen |
  ForEach-Object { Get-Process -Id $_.OwningProcess } | Select-Object Id, ProcessName, SessionId

4. Point your MCP client at it

For Claude Code, add this to the project's .mcp.json (the config we used), or run claude mcp add --transport http windows-mcp http://127.0.0.1:8765/mcp. Other clients that speak streamable HTTP use the same URL.

{
  "mcpServers": {
    "windows-mcp": { "type": "http", "url": "http://127.0.0.1:8765/mcp" }
  }
}

5. Stop it when you're done

End the process that holds the port. This works across sessions:

Get-NetTCPConnection -LocalPort 8765 -State Listen | ForEach-Object { Stop-Process -Id $_.OwningProcess }

Don't run windows-mcp install for this: its sign-in task would also start Windows-MCP in your own session, where it competes for the port and your pointer.

What this does and doesn't show

When to use something else

Windows-MCP on your own desktop, gate on

When you want to see every click as it happens, take over with your mouse, or you're on Windows Home, this is the simpler setup: one tool, no second session, and the gate exists for exactly this.

Windows-MCP's main branch (unreleased)

Its main README, read at 0ffef41 on 22 October 2026, documents three gate policies. The default, relaxed, gates only direct input (Click, Type, Scroll, Move, Shortcut, MultiSelect, MultiEdit, and App switch and resize), so Snapshot, Screenshot, FileSystem, Registry and PowerShell can run while you use the computer. --no-control turns the gate off, and the README warns that the agent's desktop actions can then interfere with your own input. No release has these yet. You can try them now by installing main from GitHub, as #475's reporter did, at the cost of running unreleased code; they report that the opt-out works there (ControlStatus shows the gate disabled, on main as of 16 October). From its README and #475, not run by us. Choose it if your agent mostly runs commands, files and screenshots, as in #457: then the relaxed policy may be all you need. Clicks and typing still wait until you've been idle.

Windows-MCP 0.8.7

The reporter of #457 suggests pinning windows-mcp==0.8.7 (30 September 2026), the release before the gate (#445 shipped in 0.8.8). The agent then runs while you work, on the same pointer and keyboard focus as you, and you give up 0.8.8's other changes: fixes for six input bugs reported against 0.8.7, among them clicks that could land at the current cursor position instead of the requested point (#441) and Click or Type reporting success for a point off the screen (#439), in commit 1fea2e5, which the release notes don't list; its UI Automation threading fixes (#449, #451); and a way to keep processes out of Snapshot's UI Automation walk (#450). 0.8.8's cursor-tracking and input-latency fixes (#447, #448) repaired code the gate added, so 0.8.7 never had those bugs. From #457, the pull requests, commit 1fea2e5 and the 0.8.8 release notes, not run by us.

A virtual machine or Windows Sandbox

When the agent's work must not reach your files, accounts or network, run Windows-MCP in a virtual machine or Windows Sandbox, as its SECURITY.md suggests. Anode's seat is desktop isolation only: it runs as you (what the seat is not isolated from).

Anode's own MCP server, without Windows-MCP

Anode's server does the same jobs in the seat (windows, accessible controls, screenshots, clicks and typing) with the lease built in, so you run one tool instead of two. Choose Windows-MCP in the seat when you already use its tools, prompts or clients, or want its PowerShell, Registry and FileSystem tools. Both are compared in Windows desktop automation for AI agents.

WindowsPC-MCP

ShikeChen01/WindowsPC-MCP came up in these searches. It is a different MCP server, not a way to run Windows-MCP: its README says it gives the agent its own virtual display through the Parsec Virtual Display Driver (installed on first run, with one administrator prompt), keeps the agent's clicks and typing to that display, and lists Windows 10 or 11 and Python 3.12 or later. MIT, 1 GitHub star, last commit 27 May 2026. From its README, not run by us.

Anode's limits

Method

Sources

Read on 22 October 2026.