MCP server that finds and safely removes undeletable files on Windows
Project description
日本語 | 中文 | Español | Français | हिन्दी | Italiano | Português (BR)
MCP server that finds and safely removes "undeletable" files on Windows.
Windows reserves device names like CON, PRN, AUX, NUL, COM1-COM9, and LPT1-LPT9 at the Win32 layer. Files with these names can exist on NTFS (created via WSL, Linux tools, or low-level APIs) but become impossible to rename, move, or delete through Explorer or normal shell commands.
NullOut scans for these hazardous entries and removes them safely using the \\?\ extended path namespace, with a two-phase confirmation workflow designed for MCP hosts.
How it works
- Scan an allowlisted directory for reserved-name collisions, trailing dots/spaces, and overlong paths
- Plan the cleanup — NullOut generates a per-entry confirmation token bound to the file's identity (volume serial + file ID)
- Delete with the token — NullOut re-verifies the file hasn't changed (TOCTOU protection) before removing it via extended namespace
Safety model
- Allowlisted roots only — operations are confined to directories you explicitly configure
- No raw paths in destructive calls — delete accepts only server-issued finding IDs + confirmation tokens
- deny_all reparse policy — junctions, symlinks, and mount points are never traversed or deleted
- File identity binding — tokens are HMAC-signed and bound to volume serial + file ID; any change between scan and delete is rejected
- Empty-only directories — v1 refuses to delete non-empty directories
- Structured errors — every failure returns a machine-readable code with next-step suggestions
MCP tools
| Tool | Type | Purpose |
|---|---|---|
list_allowed_roots |
read-only | Show configured scan roots |
scan_reserved_names |
read-only | Find hazardous entries in a root |
get_finding |
read-only | Get full details for a finding |
plan_cleanup |
read-only | Generate deletion plan with confirmation tokens |
delete_entry |
destructive | Delete a file or empty directory (requires token) |
who_is_using |
read-only | Identify processes locking a file (Restart Manager) |
get_server_info |
read-only | Server metadata, policies, and capabilities |
Configuration
Set allowlisted roots via environment variable:
NULLOUT_ROOTS=C:\Users\me\Downloads;C:\temp\cleanup
Token signing secret (generate a random value):
NULLOUT_TOKEN_SECRET=your-random-secret-here
Threat model
NullOut defends against:
- Destructive misuse — delete requires a server-issued confirmation token; no raw paths accepted
- Path traversal — all operations confined to allowlisted roots;
..escapes are resolved and rejected - Reparse point escapes — junctions, symlinks, and mount points are never traversed or deleted (
deny_all) - TOCTOU races — tokens are HMAC-bound to volume serial + file ID; any identity change between scan and delete is rejected
- Namespace tricks — destructive operations use
\\?\extended path prefix to bypass Win32 name parsing - Locked files — Restart Manager attribution is read-only; NullOut never kills processes
- Non-empty directories — refused by policy; only empty directories can be deleted
Data touched: filesystem metadata (names, file IDs, volume serials), process metadata (PIDs, app names via Restart Manager). Data NOT touched: file contents, network, credentials, Windows registry. No telemetry is collected or sent.
Requirements
- Windows 10/11
- Python 3.10+
Built by MCP Tool Shop
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nullout_mcp-1.1.5.tar.gz.
File metadata
- Download URL: nullout_mcp-1.1.5.tar.gz
- Upload date:
- Size: 72.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c7ba10dbccb8151ca02307b3fe1e235e0e97e98800ea899a77bdc9869ee181b
|
|
| MD5 |
e4a9ca06f5ee68b847e541c98776d3dd
|
|
| BLAKE2b-256 |
6d99af4a013e2caa3b3bc62031fa4a290797c0919d29285ba6c729de167cbf81
|
File details
Details for the file nullout_mcp-1.1.5-py3-none-any.whl.
File metadata
- Download URL: nullout_mcp-1.1.5-py3-none-any.whl
- Upload date:
- Size: 22.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bee88a0274b6bed3b542d11d0d04ec48f917829adc89976abba053f44fd31b7b
|
|
| MD5 |
a038cde70d418f2037352832a3a2a1fd
|
|
| BLAKE2b-256 |
f7af0ee272a475d3c25bddc3e43cbcf68e43e24a76377830b337e479e460c886
|