Skip to main content
Glama

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 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» паттернов ни в одном из трёх определений.

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

Инструмент

Оценка

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

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.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    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
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides git-aware safe file operations, allowing AI agents to delete files while protecting git-tracked source code from accidental deletion.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to audit and clean development workspaces safely by detecting reclaimable artifacts, exposed .env files, and potential secret leaks.
    6
    MIT