Skip to main content
Glama
les-k
by les-k

sweep-mcp

Ein MCP-Server, der Verzeichnisse löscht – und die Schutzmechanismen, die es alles andere als leichtsinnig machen, diese Fähigkeit einem Sprachmodell zu übergeben.

Er stellt sweep über das Model Context Protocol bereit, sodass ein Agent node_modules, .venv, target, __pycache__ und ähnliche Verzeichnisse finden und zurückgewinnen kann. Das Interessante ist nicht das Löschen. Es ist alles, was zutreffen muss, bevor ein Löschen erlaubt wird.

Eine im Jahr 2026 veröffentlichte Studie fand Sicherheitsprobleme in 66% von 1.808 gescannten MCP-Servern, mit über 30 CVE-Meldungen gegen MCP-Implementierungen in einem einzigen Quartal. Dieses Repository ist ein Server, der andersherum geschrieben wurde: zuerst die Verweigerungen, dann die Funktion.


Das Bedrohungsmodell

Ein MCP-Server, der Verzeichnisse löschen kann, ist eine geladene Waffe, die auf alles gerichtet ist, was der Prozess erreichen kann. Fünf Dinge könnten schiefgehen, und jedes hat eine Kontrolle und einen Test, der es auslöst.

Risiko

Kontrolle

Test

Agent scannt / oder C:\ und löscht die Maschine

Root-Allowlist, festgelegt beim Serverstart. Der Agent kann sie nicht setzen, erweitern oder darüber hinauslesen. Keine Roots konfiguriert → jede Anfrage verweigert

test_empty_allowlist_denies_every_path

../../ oder ein Symlink wird verwendet, um die Allowlist zu umgehen

Jeder Pfad wird vor der Containment-Prüfung mit resolve() aufgelöst, sodass er danach beurteilt wird, worauf er tatsächlich zeigt

test_dotdot_traversal_is_denied, test_symlink_pointing_outside_root_is_denied

Agent fordert das Löschen eines Pfads an, den er nie gescannt hat

reclaim akzeptiert IDs, keine Pfade. Es gibt keinen pfadförmigen Weg zum Löschen irgendwo in der API

test_there_is_no_way_to_delete_by_path

Das Verzeichnis ändert sich zwischen Scan und Löschen

Jeder Fund wird zum Zeitpunkt des Löschens erneut gegen das Live-Dateisystem geprüft – immer noch enthalten, immer noch ein Verzeichnis, immer noch kein Link, Marker-Datei noch vorhanden

test_revalidate_refuses_a_directory_swapped_for_a_symlink

Versehentliche Zerstörung

Trockenlauf ist die Voreinstellung. Löschen erfordert exakt confirm="delete"; alles andere wird als Nein behandelt

test_a_wrong_confirmation_string_stays_a_dry_run

Zwei kleinere, aus demselben Grund:

  • Ticket-IDs sind zufällig, nicht sequenziell. f-3a91c02b77de, nicht 1. Eine Zähl-ID lädt einen Agenten ein, zu iterieren, bis etwas gelöscht wird.

  • Tool-Beschreibungen sind Zeichenkettenliterale. Sie werden niemals aus etwas zusammengesetzt, das von der Festplatte gelesen wird, sodass ein Verzeichnis namens ignore-previous-instructions das Modell als Daten und nicht als Satz erreicht (test_tool_descriptions_are_static).

Related MCP server: MCP Files

Wogegen es nicht schützt

Die obigen Kontrollen sind genau das wert, was sie abdecken, und nicht mehr.

  • Eine falsch konfigurierte Root. Starten Sie es mit --root / und es wird fröhlich durch Ihr Dateisystem arbeiten. Die Allowlist ist nur so gut wie das, was Sie hineinlegen, und nichts hier stellt diese Wahl in Frage.

  • Ein bösartiger Client. Die Absicherung beschränkt, was gelöscht werden darf, niemals wer fragt. Ein Client, der legitim scannt und dann legitim bestätigt, bekommt genau das, was er verlangt hat.

  • Ein Agent, der dazu überredet wurde. Statische Tool-Beschreibungen halten Dateisysteminhalte aus den Anweisungen des Modells heraus, aber nichts hier kann einen Agenten aufhalten, der aus eigenen, schlechten Gründen beschließt, ein echtes node_modules zu löschen, das es tatsächlich gefunden hat.

  • Die letzten Millisekunden. revalidate() verengt das Fenster zwischen Prüfung und Löschung; es schließt es nicht. Um es richtig zu schließen, müssten Dateideskriptoren des Verzeichnisses über den Vorgang hinweg gehalten werden, was shutil.rmtree nicht portabel anbietet. Dies ist eine echte Race-Condition, und sie ist kleiner, nicht abwesend.

  • Windows-Junctions unter Python 3.11. os.path.isjunction kam in 3.12. Darunter fällt die Junctions-Erkennung auf Symlinks zurück – derselbe Kompromiss, den sweep selbst eingeht, hier statt vergraben angegeben.

  • Berechtigungen. Dies ist keine Sandbox. Es läuft mit den Rechten dessen, der es gestartet hat.

Scanner-Ergebnisse

Ausgeführt gegen agent-audit 0.19.2 am 18. August 2026.

Statischer Scan – 0 Funde, Risikowert 0.0 (NIEDRIG), 7 Dateien.

Ein niedriger Fund erschien beim ersten Durchlauf: AGENT-110, Source-Map-Artefakte nicht vom Vertrieb ausgeschlossen. Dieses Paket enthält kein JavaScript, also gab es keine Source-Maps, die hätten durchsickern können, aber der Ausschluss ist jetzt trotzdem in pyproject.toml deklariert – es kostet nichts, und mit einer Lieferketten-Checkliste zu streiten ist eine schlechte Nutzung des Nachmittags von irgendjemandem.

Tool-Inspektion – 0 Tool-Funde. Keine Tool-Vergiftung, Cross-Origin- oder Rug-Pull-Muster in einer der drei Definitionen erkannt.

Die zugewiesenen Risikobewertungen sind es wert, reproduziert zu werden, weil sie auf lehrreiche Weise falsch sind:

Tool

Bewertet

Abgeleitete Berechtigungen

list_targets

MITTEL

SHELL_EXEC, FILE_READ

scan

HOCH

FILE_DELETE, SHELL_EXEC, FILE_READ

reclaim

HOCH

FILE_DELETE, SHELL_EXEC, FILE_READ

scan kann nichts löschen. Es ist schreibgeschützt, deklariert mit read_only_hint=True, und es gibt einen Test, der bestätigt, dass es so bleibt. Es wurde mit HOCH und einer FILE_DELETE-Berechtigung bewertet, weil der Scanner Schlüsselwörter mit der Beschreibung abgleicht, und die scan-Beschreibung dieses Servers enthält den Satz:

"Read-only: this never deletes anything."

Das Wort deletes steht auf der FILE_DELETE-Schlüsselwortliste. SHELL_EXEC kommt vom Wort command, in "the command that regenerates it" – dieser Server führt überhaupt keinen Shell-Befehl aus.

Die Beschreibung könnte umformuliert werden, um besser abzuschneiden. Das wurde nicht getan, weil die Zielgruppe der Beschreibung ein Sprachmodell ist, das entscheidet, ob es das Tool aufrufen soll, und "this never deletes anything" ist der mit Abstand nützlichste Satz darin. Ein Schlüsselwort-Scanner ist ein Rauchmelder, kein Richter – ein sauberer Durchlauf ist es wert, zu haben und zu veröffentlichen, und eine Bewertung, die aus Zeichenkettenabgleich von Prosa abgeleitet wird, ist kein Beleg für das Verhalten in die eine oder andere Richtung.

Zwei Scanner wurden ausprobiert und einer konnte nicht ausgeführt werden: Der mcp-scan von Invariant Labs wurde nach der Übernahme durch Snyk in snyk-agent-scan umbenannt und erfordert jetzt einen SNYK_TOKEN. Der mcp-scanner von Cisco ist nicht auf PyPI veröffentlicht. Der eigene Stdio-Transport von agent-audit timeoutet auch gegen diesen Server unter Windows, während ein manuell durchgeführter Handshake mit der identischen Binärdatei in Millisekunden zurückkommt, daher wurde sein Analysator direkt mit der echten tools/list-Ausgabe gefüttert – der Transport wurde umgangen, die Analyse nicht.

Installieren

pip install -e .

Konfigurieren

Der Server akzeptiert ein oder mehrere --root-Verzeichnisse. Es gibt keine Voreinstellung. Das Starten ohne Root ist ein Fehler, keine Einladung, alles zu scannen:

{
  "mcpServers": {
    "sweep": {
      "command": "sweep-mcp",
      "args": ["--root", "/home/you/code", "--root", "/home/you/work"]
    }
  }
}

Die Tools

Tool

Destruktiv

Was es tut

list_targets

nein

Die Arten von Verzeichnissen, die es zurückzugewinnen weiß, und der Befehl, der jedes neu generiert

scan

nein

Findet zurückgewinnbare Verzeichnisse unter einem Pfad innerhalb der Roots. Gibt IDs, Größen und den Neugenerierungsbefehl zurück

reclaim

ja

Löscht Funde nach ID. Trockenlauf, es sei denn, confirm="delete"

Alle drei tragen MCP ToolAnnotations, sodass ein Client, der destruktive Tools hinter einem Bestätigungsdialog abschirmt, hat, was er braucht: reclaim deklariert destructive_hint=True, die anderen beiden deklarieren read_only_hint=True. Das wird auch in der Testsuite bestätigt – ein Hinweis, der stillschweigend zurückgesetzt wird, wäre schlimmer als keiner.

Eine Sitzung

scan(path="/home/you/code")
  → 12 finds, 3.4 GB
    f-3a91c02b77de  /home/you/code/api/node_modules   1.9 GB  npm install
    f-8e0244fd1b6c  /home/you/code/ml/.venv           842 MB  python -m venv .venv

reclaim(ids=["f-3a91c02b77de"])
  → dry_run: true
    would_delete: 1 path, 1.9 GB
    note: Nothing was deleted. Call again with confirm='delete'.

reclaim(ids=["f-3a91c02b77de"], confirm="delete")
  → deleted: 1 path, reclaimed 1.9 GB

Tests

38 Tests. 34 laufen unter Windows; alle 38 laufen unter Linux.

Die vier, die lokal übersprungen werden, müssen Symlinks erstellen, was Windows ohne Entwicklermodus verweigert – und einer von ihnen deckt den Swap-Zwischen-Scan-und-Lösch-Angriff ab, der mit Abstand wichtigste Test hier. Ihn stillschweigend zu überspringen, würde die Testsuite zur Dekoration machen, daher läuft CI unter Linux und schlägt den Build fehl, wenn diese Tests dort als übersprungen gemeldet werden.

pytest -q --cov=sweep_mcp

Die Codeabdeckung liegt bei 83%. Die Lücke besteht hauptsächlich aus main() und der argparse-Verdrahtung, die die Testsuite stattdessen über build_server antreibt – der Transport ist der Teil, der am wenigsten nachgeahmt werden sollte und am unwahrscheinlichsten die Quelle des Schadens ist.

Nichts in der Testsuite ahmt das Dateisystem nach. Ein nachgeahmter Path würde jeden Test hier bestehen, während der Server immer noch das falsche Verzeichnis löscht.

Aufbau

src/sweep_mcp/
  guard.py    212 lines - the allowlist, the tickets, the re-check. Imports no MCP.
  server.py   280 lines - three tools. Translation only.
tests/
  test_guard.py    23 tests - one per rule, each named for the attack it stands in for
  test_server.py   15 tests - driven through call_tool, the way a client would

guard.py weiß bewusst nichts über MCP. Jede Entscheidung, die jemanden seine Daten kosten könnte, ist ohne einen Client, einen Transport oder einen Agenten in der Schleife testbar. Wenn eine Regel so aussieht, als würde sie in server.py durchgesetzt, ist das ein Fehler – sie gehört eine Ebene tiefer, wo die Tests sie erreichen können.

Lizenz

MIT.

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    -
    quality
    D
    maintenance
    Provides secure filesystem access for AI assistants with optimizations like file reading limits and depth-limited traversal to improve token efficiency. It enables AI models to read, write, and search files within explicitly allowed directories while automatically skipping large system folders.
    3
  • A
    license
    -
    quality
    C
    maintenance
    Provides a secure, constrained filesystem workspace for LLM agents to manage files, notes, and code artifacts via stdio or remote HTTP. It features granular access controls, including extension whitelisting, storage quotas, and immutable paths for safe automated file operations.
    BSD 3-Clause
  • F
    license
    -
    quality
    B
    maintenance
    Enables AI agents to clean disk space by scanning and removing temporary files, caches, and duplicates through natural language commands via MCP protocol.
    1

View all related MCP servers

Related MCP Connectors

  • Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.

  • Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.

  • Securely search and manage workspace context files for AI agents and teams.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/les-k/sweep-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server