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

sweep-mcp

Un servidor MCP que elimina directorios — y las barreras de seguridad que hacen que entregar esa capacidad a un modelo de lenguaje sea algo más que una temeridad.

Expone sweep a través del Protocolo de Contexto de Modelo, para que un agente pueda encontrar y recuperar node_modules, .venv, target, __pycache__ y compañía. La parte interesante no es la eliminación. Es todo lo que debe ser cierto antes de que se permita una eliminación.

Una investigación publicada en 2026 encontró problemas de seguridad en el 66% de 1.808 servidores MCP escaneados, con más de 30 CVEs presentados contra implementaciones MCP en un solo trimestre. Este repositorio es un servidor escrito al revés: primero las negativas, luego la funcionalidad.


El modelo de amenazas

Un servidor MCP que puede eliminar directorios es un arma cargada apuntando a todo lo que el proceso pueda alcanzar. Cinco cosas podrían salir mal, y cada una tiene un control y una prueba que lo hace efectivo.

Riesgo

Control

Prueba

El agente escanea / o C:\ y elimina la máquina

Lista blanca raíz, fijada al iniciar el servidor. El agente no puede establecer, extender ni leer más allá de ella. Sin raíces configuradas → cada solicitud es rechazada

test_empty_allowlist_denies_every_path

Se usa ../../ o un enlace simbólico para escapar de la lista blanca

Cada ruta se resolve() antes de la verificación de contención, por lo que se juzga según dónde apunta realmente

test_dotdot_traversal_is_denied, test_symlink_pointing_outside_root_is_denied

El agente pide eliminar una ruta que nunca escaneó

reclaim acepta ids, no rutas. No hay una ruta con forma de directorio hacia la eliminación en ninguna parte de la API

test_there_is_no_way_to_delete_by_path

El directorio cambia entre el escaneo y la eliminación

Cada hallazgo se vuelve a verificar contra el sistema de archivos en vivo en el momento de la eliminación — sigue contenido, sigue siendo un directorio, sigue sin ser un enlace, el archivo marcador sigue presente

test_revalidate_refuses_a_directory_swapped_for_a_symlink

Destrucción accidental

La ejecución en seco es la opción predeterminada. La eliminación requiere confirm="delete" exactamente; cualquier otra cosa se trata como no

test_a_wrong_confirmation_string_stays_a_dry_run

Dos más pequeñas, por la misma razón:

  • Los ids de ticket son aleatorios, no secuenciales. f-3a91c02b77de, no 1. Un id secuencial invita a un agente a iterar hasta que algo se elimine.

  • Las descripciones de herramientas son literales de cadena. Nunca se ensamblan a partir de nada leído del disco, por lo que un directorio llamado ignore-previous-instructions llega al modelo como datos en lugar de como una oración (test_tool_descriptions_are_static).

Related MCP server: MCP Files

Contra lo que no protege

Los controles anteriores valen exactamente lo que cubren, y nada más.

  • Una raíz mal configurada. Inícielo con --root / y trabajará felizmente a través de su sistema de archivos. La lista blanca es tan buena como lo que usted ponga en ella, y nada aquí cuestiona esa elección.

  • Un cliente malicioso. La protección limita qué puede ser eliminado, nunca quién lo solicita. Un cliente que escanea legítimamente y luego confirma legítimamente obtiene exactamente lo que pidió.

  • Un agente que ha sido convencido. Las descripciones estáticas de herramientas mantienen el contenido del sistema de archivos fuera de las instrucciones del modelo, pero nada aquí puede detener a un agente que decide, por sus propias malas razones, eliminar un node_modules real que encontró genuinamente.

  • Los últimos milisegundos. revalidate() reduce la ventana entre la verificación y la eliminación; no la cierra. Cerrarla correctamente necesita descriptores de archivo de directorio mantenidos durante la operación, lo que shutil.rmtree no ofrece de forma portátil. Esta es una carrera real, y es más pequeña, no ausente.

  • Junctions de Windows en Python 3.11. os.path.isjunction llegó en 3.12. Por debajo de eso, la detección de junctions se degrada a solo enlaces simbólicos — el mismo compromiso que sweep mismo hace, declarado aquí en lugar de oculto.

  • Privilegio. Esto no es un entorno aislado. Se ejecuta como quien lo inició.

Resultados del escáner

Ejecutado contra agent-audit 0.19.2 el 18 de agosto de 2026.

Escaneo estático — 0 hallazgos, puntuación de riesgo 0.0 (BAJO), 7 archivos.

Un hallazgo bajo apareció en la primera pasada: AGENT-110, artefactos de mapa fuente no excluidos de la distribución. Este paquete no incluye JavaScript, por lo que no había mapas fuente que filtrar, pero la exclusión ahora está declarada en pyproject.toml de todos modos — no cuesta nada, y discutir con una lista de verificación de la cadena de suministro es un mal uso de la tarde de cualquiera.

Inspección de herramientas — 0 hallazgos en herramientas. No se detectaron patrones de envenenamiento de herramientas, de origen cruzado o de tipo "tirar de la alfombra" en ninguna de las tres definiciones.

Vale la pena reproducir las calificaciones de riesgo que asignó, porque son incorrectas de una manera instructiva:

Herramienta

Calificada

Permisos inferidos

list_targets

MEDIO

SHELL_EXEC, FILE_READ

scan

ALTO

FILE_DELETE, SHELL_EXEC, FILE_READ

reclaim

ALTO

FILE_DELETE, SHELL_EXEC, FILE_READ

scan no puede eliminar nada. Es de solo lectura, declarado read_only_hint=True, y hay una prueba que afirma que se mantiene así. Fue calificado como ALTO con un permiso FILE_DELETE porque el escáner compara palabras clave con la descripción, y la descripción de scan de este servidor contiene la oración:

"Solo lectura: esto nunca elimina nada."

La palabra elimina está en la lista de palabras clave de FILE_DELETE. SHELL_EXEC proviene de la palabra comando, en "el comando que lo regenera" — este servidor nunca ejecuta un comando de shell en absoluto.

La descripción podría reformularse para obtener una mejor puntuación. No se ha hecho, porque la audiencia de la descripción es un modelo de lenguaje que decide si llamar a la herramienta, y "esto nunca elimina nada" es la oración más útil en ella. Un escáner de palabras clave es un detector de humo, no un juez — una ejecución limpia vale la pena tenerla y vale la pena publicarla, y una calificación derivada de la coincidencia de cadenas en prosa no es evidencia sobre el comportamiento en ninguna dirección.

Se probaron dos escáneres y uno no pudo ejecutarse: mcp-scan de Invariant Labs ha sido renombrado a snyk-agent-scan tras la adquisición de Snyk y ahora requiere un SNYK_TOKEN. mcp-scanner de Cisco no está publicado en PyPI. El transporte stdio propio de agent-audit también se agota contra este servidor en Windows mientras que un protocolo de enlace manual al binario idéntico regresa en milisegundos, por lo que su analizador fue alimentado con la salida real de tools/list directamente — el transporte fue omitido, el análisis no.

Instalar

pip install -e .

Configurar

El servidor toma uno o más directorios --root. No tiene valor predeterminado. Iniciarlo sin una raíz es un error en lugar de una invitación a escanear todo:

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

Las herramientas

Herramienta

Destructiva

Qué hace

list_targets

no

Los tipos de directorio que sabe cómo recuperar, y el comando que regenera cada uno

scan

no

Encuentra directorios recuperables bajo una ruta dentro de las raíces. Devuelve ids, tamaños y el comando de regeneración

reclaim

Elimina hallazgos por id. Ejecución en seco a menos que confirm="delete"

Las tres llevan ToolAnnotations de MCP, por lo que un cliente que bloquea herramientas destructivas detrás de un mensaje de confirmación tiene lo que necesita: reclaim declara destructive_hint=True, las otras dos declaran read_only_hint=True. Eso está afirmado en el conjunto de pruebas también — una pista que retrocediera silenciosamente sería peor que ninguna.

Una sesión

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

Pruebas

38 pruebas. 34 se ejecutan en Windows; las 38 se ejecutan en Linux.

Las cuatro que se saltan localmente necesitan crear enlaces simbólicos, lo que Windows rechaza sin el modo de desarrollador — y una de ellas cubre el ataque de intercambio entre escaneo y eliminación, que es la prueba más importante aquí. Saltarla silenciosamente haría que el conjunto de pruebas fuera una decoración, por lo que CI se ejecuta en Linux y falla la compilación si esas pruebas se reportan como saltadas allí.

pytest -q --cov=sweep_mcp

La cobertura se sitúa en el 83%. La brecha es principalmente main() y el cableado de argparse, que el conjunto de pruebas impulsa a través de build_server en su lugar — el transporte es la parte que menos vale la pena simular y donde es menos probable que provenga el daño.

Nada en el conjunto de pruebas simula el sistema de archivos. Un Path simulado pasaría todas las pruebas aquí mientras el servidor aún eliminara el directorio incorrecto.

Diseño

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 deliberadamente no sabe nada sobre MCP. Cada decisión que podría costarle a alguien sus datos es comprobable sin un cliente, un transporte o un agente en el bucle. Si una regla parece que se aplica en server.py, eso es un error — pertenece una capa más abajo, donde las pruebas pueden alcanzarla.

Licencia

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