sweep-mcp
sweep-mcp
MCP-сервер, который удаляет каталоги — и ограждения, которые превращают передачу такой возможности языковой модели в нечто большее, чем безрассудство.
Он предоставляет sweep через протокол Model Context Protocol, чтобы агент мог находить и освобождать node_modules, .venv, target, __pycache__ и им подобные. Интересное здесь не в самом удалении. Интересно всё, что должно быть истинным, прежде чем удаление будет разрешено.
Исследование, опубликованное в 2026 году, выявило проблемы безопасности в 66% из 1 808 просканированных MCP-серверов, причём за один квартал было подано более 30 CVE-заявок на реализации MCP. Этот репозиторий — один сервер, написанный наоборот: сначала отказы, потом функциональность.
Модель угроз
MCP-сервер, способный удалять каталоги, — это заряженный пистолет, направленный на всё, что доступно процессу. Пять вещей могут пойти не так, и для каждой есть контроль и тест, который это проверяет.
Риск | Контроль | Тест |
Агент сканирует | Белый список корней, фиксированный при запуске сервера. Агент не может его задать, расширить или выйти за его пределы. Нет настроенных корней → каждый запрос отклонён |
|
| Каждый путь разрешается ( |
|
Агент пытается удалить путь, который он никогда не сканировал |
|
|
Каталог изменяется между сканированием и удалением | Каждый найденный объект повторно проверяется на живом файловой системе в момент удаления — всё ещё в пределах, всё ещё каталог, ещё не ссылка, маркерный файл всё ещё присутствует |
|
Случайное уничтожение | Пробный запуск по умолчанию. Для удаления требуется точно |
|
Два менее значительных, по той же причине:
Идентификаторы задач случайны, не последовательны.
f-3a91c02b77de, а не1. Последовательный идентификатор побуждает агента перебирать, пока что-то не удалится.Описания инструментов — строковые литералы. Они никогда не собираются из чего-то, прочитанного с диска, поэтому каталог с именем
ignore-previous-instructionsпопадает в модель как данные, а не как предложение (test_tool_descriptions_are_static).
Related MCP server: MCP Duplicate File Manager Server
Что он не защищает
Приведённые выше контроли стоят ровно столько, сколько покрывают, и не более.
Неправильно настроенный корень. Запустите его с
--root /, и он будет с радостью работать с вашей файловой системой. Белый список настолько хорош, насколько хорош то, что вы в него поместили, и ничто здесь не подвергает этот выбор сомнению.Вредоносный клиент. Ограничение ограничивает что может быть удалено, но никогда не кто запрашивает. Клиент, который легально сканирует, а затем легально подтверждает, получает именно то, что запросил.
Агент, которого уговорили. Статические описания инструментов не позволяют содержимому файловой системы попасть в инструкции модели, но ничто здесь не может остановить агента, который по своим собственным плохим причинам решает удалить реальный
node_modules, который он действительно нашёл.Последние несколько миллисекунд.
revalidate()сужает окно между проверкой и удалением; оно не закрывает его. Для правильного закрытия нужны файловые дескрипторы каталога, удерживаемые на протяжении всей операции, чегоshutil.rmtreeне предоставляет переносимым образом. Это реальное состояние гонки, и оно меньше, а не отсутствует.Точки соединения Windows на Python 3.11.
os.path.isjunctionпоявился в 3.12. Ниже этой версии обнаружение точек соединения деградирует до симлинков — тот же компромисс, который делает самsweep, указанный здесь, а не спрятанный.Привилегии. Это не песочница. Он работает от имени того, кто его запустил.
Результаты сканера
Запущено против agent-audit 0.19.2 18 августа 2026 года.
Статическое сканирование — 0 находок, оценка риска 0.0 (LOW), 7 файлов.
Одна находка low была обнаружена при первом проходе: AGENT-110, артефакты исходных карт не исключены из дистрибутива. Этот пакет не содержит JavaScript, поэтому утечка исходных карт была невозможна, но исключение теперь объявлено в pyproject.tomл в любом случае — это ничего не стоит, а спорить с контрольным списком цепочки поставок — плохое использование времени любого.
Проверка инструментов — 0 находок. Не обнаружено ни отравления инструментов, ни межсайтовых или «rug-pull» паттернов ни в одном из трёх определений.
Присвоенные оценки риска стоит воспроизвести, потому что они ошибочны в поучительном смысле:
Инструмент | Оценка | Предполагаемые разрешения |
| MEDIUM | SHELL_EXEC, FILE_READ |
| HIGH | FILE_DELETE, SHELL_EXEC, FILE_READ |
| HIGH | FILE_DELETE, SHELL_EXEC, FILE_READ |
scan не может ничего удалить. Он только для чтения, объявлен read_only_hint=True, и есть тест, утверждающий, что он остаётся таковым. Он был оценён как HIGH с разрешением FILE_DELETE, потому что сканер сопоставляет ключевые слова с описанием, и описание scan этого сервера содержит предложение:
"Read-only: this never deletes anything."
Слово deletes есть в списке ключевых слов FILE_DELETE. SHELL_EXEC происходит от слова command в "the command that regenerates it" — этот сервер никогда не выполняет команды оболочки вообще.
Описание можно было бы переписать, чтобы получить лучшую оценку. Но этого не было сделано, потому что аудитория описания — языковая модель, решающая, вызывать ли инструмент, и "this never deletes anything" — это самое полезное предложение в нём. Сканер ключевых слов — это детектор дыма, а не судья — чистый прогон стоит иметь и публиковать, а оценка, полученная из сопоставления строк с прозой, не является доказательством поведения в ту или иную сторону.
Были опробованы два сканера, и один не удалось запустить: mcp-scan от Invariant Labs был переименован в snyk-agent-scan после приобретения Snyk и теперь требует SNYK_TOKEN. mcp-scanner от Cisco не опубликован на PyPI. Собственный транспорт stdio agent-audit также истекает по тайм-ауту против этого сервера в Windows, в то время как ручное рукопожатие с тем же двоичным файлом возвращает результат за миллисекунды, поэтому его анализатору был передан реальный вывод tools/list напрямую — транспорт был обойдён, анализ — нет.
Установка
pip install -e .Настройка
Сервер принимает один или несколько каталогов --root. По умолчанию их нет. Запуск без корня — это ошибка, а не приглашение сканировать всё подряд:
{
"mcpServers": {
"sweep": {
"command": "sweep-mcp",
"args": ["--root", "/home/you/code", "--root", "/home/you/work"]
}
}
}Инструменты
Инструмент | Разрушительный | Что он делает |
| нет | Типы каталогов, которые он умеет освобождать, и команда, которая воссоздаёт каждый |
| нет | Находит освобождаемые каталоги по пути внутри корней. Возвращает идентификаторы, размеры и команду восстановления |
| да | Удаляет находки по идентификатору. Пробный запуск, если не указано |
Все три несут MCP ToolAnnotations, поэтому клиент, который блокирует разрушительные инструменты за подтверждением, получает необходимое: reclaim объявляет destructive_hint=True, два других объявляют read_only_hint=True. Это также подтверждается в наборе тестов — подсказка, которая молча регрессировала бы, была бы хуже, чем её отсутствие.
Сессия
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Тесты
38 тестов. 34 запускаются в Windows; все 38 запускаются в Linux.
Четыре, которые пропускаются локально, требуют создания симлинков, что Windows запрещает без режима разработчика — и один из них покрывает атаку подмены между сканированием и удалением, что является самым важным тестом здесь. Тихий пропуск сделал бы набор тестов украшением, поэтому CI запускается в Linux и завершает сборку ошибкой, если эти тесты сообщаются как пропущенные там.
pytest -q --cov=sweep_mcpПокрытие составляет 83%. Разрыв в основном приходится на main() и обвязку argparse, которые набор тестов вместо этого запускает через build_server — транспорт — это часть, которую меньше всего стоит имитировать и которая с наименьшей вероятностью станет источником ущерба.
Ничто в наборе тестов не имитирует файловую систему. Имитированный Path прошёл бы все тесты здесь, в то время как сервер всё равно удалял бы неправильный каталог.
Структура
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 wouldguard.py намеренно ничего не знает об MCP. Каждое решение, которое может стоить кому-то данных, можно протестировать без клиента, транспорта или агента. Если правило выглядит так, будто оно применяется в server.py, это ошибка — оно должно быть на один уровень ниже, где тесты могут до него добраться.
Лицензия
MIT.
This server cannot be deployed
Maintenance
Related MCP Connectors
Blocks typosquatted or hallucinated npm/PyPI packages before an AI agent installs them.
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.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to clean disk space by scanning and removing temporary files, caches, and duplicates through natural language commands via MCP protocol.1-
- FlicenseAqualityDmaintenanceEnables LLM agents to find and safely delete duplicate files using content-based detection, with smart copy prioritization and dry-run mode.3-
- AlicenseNot gradedqualityBmaintenanceProvides git-aware safe file operations, allowing AI agents to delete files while protecting git-tracked source code from accidental deletion.MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to audit and clean development workspaces safely by detecting reclaimable artifacts, exposed .env files, and potential secret leaks.6MIT