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

sweep-mcp

MCP-сервер, который удаляет каталоги — и ограждения, которые превращают передачу такой возможности языковой модели в нечто большее, чем безрассудство.

Он предоставляет sweep через протокол Model Context Protocol, чтобы агент мог находить и освобождать node_modules, .venv, target, __pycache__ и им подобные. Интересное здесь не в самом удалении. Интересно всё, что должно быть истинным, прежде чем удаление будет разрешено.

Исследование, опубликованное в 2026 году, выявило проблемы безопасности в 66% из 1 808 просканированных MCP-серверов, причём за один квартал было подано более 30 CVE-заявок на реализации MCP. Этот репозиторий — один сервер, написанный наоборот: сначала отказы, потом функциональность.


Модель угроз

MCP-сервер, способный удалять каталоги, — это заряженный пистолет, направленный на всё, что доступно процессу. Пять вещей могут пойти не так, и для каждой есть контроль и тест, который это проверяет.

Риск

Контроль

Тест

Агент сканирует / или C:\ и удаляет машину

Белый список корней, фиксированный при запуске сервера. Агент не может его задать, расширить или выйти за его пределы. Нет настроенных корней → каждый запрос отклонён

test_empty_allowlist_denies_every_path

../../ или симлинк используется для выхода из белого списка

Каждый путь разрешается (resolve()) до проверки нахождения в пределах, поэтому оценивается по тому, куда он ведёт на самом деле

test_dotdot_traversal_is_denied, test_symlink_pointing_outside_root_is_denied

Агент пытается удалить путь, который он никогда не сканировал

reclaim принимает идентификаторы, а не пути. В API нет маршрута, ведущего к удалению через путь

test_there_is_no_way_to_delete_by_path

Каталог изменяется между сканированием и удалением

Каждый найденный объект повторно проверяется на живом файловой системе в момент удаления — всё ещё в пределах, всё ещё каталог, ещё не ссылка, маркерный файл всё ещё присутствует

test_revalidate_refuses_a_directory_swapped_for_a_symlink

Случайное уничтожение

Пробный запуск по умолчанию. Для удаления требуется точно confirm="delete"; всё остальное расценивается как нет

test_a_wrong_confirmation_string_stays_a_dry_run

Два менее значительных, по той же причине:

  • Идентификаторы задач случайны, не последовательны. 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» паттернов ни в одном из трёх определений.

Присвоенные оценки риска стоит воспроизвести, потому что они ошибочны в поучительном смысле:

Инструмент

Оценка

Предполагаемые разрешения

list_targets

MEDIUM

SHELL_EXEC, FILE_READ

scan

HIGH

FILE_DELETE, SHELL_EXEC, FILE_READ

reclaim

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"]
    }
  }
}

Инструменты

Инструмент

Разрушительный

Что он делает

list_targets

нет

Типы каталогов, которые он умеет освобождать, и команда, которая воссоздаёт каждый

scan

нет

Находит освобождаемые каталоги по пути внутри корней. Возвращает идентификаторы, размеры и команду восстановления

reclaim

да

Удаляет находки по идентификатору. Пробный запуск, если не указано confirm="delete"

Все три несут 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 would

guard.py намеренно ничего не знает об MCP. Каждое решение, которое может стоить кому-то данных, можно протестировать без клиента, транспорта или агента. Если правило выглядит так, будто оно применяется в server.py, это ошибка — оно должно быть на один уровень ниже, где тесты могут до него добраться.

Лицензия

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