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 Files
Что он не защищает
Приведённые выше контроли стоят ровно столько, сколько покрывают, и не более.
Неправильно настроенный корень. Запустите его с
--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 installed
Maintenance
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
- Flicense-qualityDmaintenanceProvides 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
- Alicense-qualityCmaintenanceProvides 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
- Flicense-qualityBmaintenanceEnables 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
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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