Zip MCP

Comprime y descomprime archivos desde el chat: empaqueta carpetas, extrae archivos, lista contenidos. Todo local, sin subidas.

Documentación

mcp-zip

Servidor MCP para archivos zip: crear, inspeccionar y extraer. Crea un zip, mira su interior y descomprime uno, todo en tu máquina.

Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Model Context Protocol. Se ejecuta en tu propia máquina, o alojado sin instalación.

Página del producto: https://mcp.zovo.one/s/zip — qué hace, las herramientas que expone y un endpoint de token en vivo.

Instalación

Alojado, nada que instalar. Obtén un token de https://mcp.zovo.one/mcp/connect (la página de conexión) o https://mcp.zovo.one/mcp/token (el mismo token como JSON); se emite uno anónimo gratuito al instante y una clave Pro funciona igual. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/zip a través de streamable-http y envía el token como Authorization: Bearer <token>.

Si tu cliente no puede configurar cabeceras, pon el token en la ruta en su lugar: https://mcp.zovo.one/mcp/zip/t/<token>. Ambas formas funcionan. La URL desnuda sin token responde 401 en tools/call, así que el token no es opcional.

Claude Desktop, un clic. Descarga zip.mcpb desde la última versión y haz doble clic en él.

Desde el código fuente. El espejo es autocontenido: cada dependencia de @theluckystrike/* está incluida, así que un clon nuevo compila sin configuración adicional.

git clone https://github.com/theluckystrike/mcp-zip.git
cd mcp-zip
npm install && npm run build

Luego apunta tu cliente al punto de entrada compilado:

{
  "mcpServers": {
    "zip": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-zip/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-zip aún no está publicado en npm, así que un comando npx -y @theluckystrike/mcp-zip fallará. Las tres rutas anteriores son las que funcionan y cada una es probada por CI.

zip demo

Espejo de solo lectura de mcp-servers/servers/zip. Ver MIRROR.md.

Crea un zip, mira su interior y descomprime uno, en la conversación en la que ya estás. Empaqueta una carpeta con un glob (**/*.csv, todo excepto node_modules). Lee el único README de un archivo sin descomprimirlo. Pregunta qué hay dentro de un zip que alguien te envió y que te lo digan antes de abrirlo: rutas absolutas, .., enlaces simbólicos, nombres duplicados y la entrada que dice tener 200 MB dentro de un archivo de 199 KB. Agrupa un mes de facturas, presupuestos y exportaciones en un solo archivo para enviarlo a un contable. Todo se ejecuta en tu máquina: sin subida, sin cuenta, sin clave API y sin ninguna llamada de red de ningún tipo.

En el Registro MCP oficial (io.github.theluckystrike/zip-archive-create-extract-bomb-guard).

La publicación en npm para @theluckystrike/mcp-zip está pendiente, así que npx -y @theluckystrike/mcp-zip devuelve 404 hoy. Hasta entonces, el paquete de un clic de .mcpb o un clon+compilación es la ruta que funciona.

Instalación

Claude Desktop, ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "zip": { "command": "npx", "args": ["-y", "@theluckystrike/mcp-zip"] }
  }
}

Claude Code:

claude mcp add zip -- npx -y @theluckystrike/mcp-zip

Cursor, .cursor/mcp.json:

{
  "mcpServers": {
    "zip": { "command": "npx", "args": ["-y", "@theluckystrike/mcp-zip"] }
  }
}

Herramientas

herramientaqué hace
zip_createEmpaqueta archivos, o un árbol de directorios con patrones glob, en un nuevo .zip
zip_listCada entrada con su tamaño, tamaño comprimido y proporción, y todo lo peligroso en ella, marcado
zip_extractDesempaqueta en un directorio, con protecciones contra traversal, enlaces simbólicos y bombas zip, y un dry_run
zip_addAñade archivos a un archivo que ya existe
zip_extract_textLee una entrada de texto en línea, sin descomprimir nada
zip_bundle_monthUn mes de facturas, presupuestos y exportaciones de los servidores hermanos, en un solo archivo
zip_historyLo que has creado y cuánto de la asignación gratuita de este mes queda
license_status, license_activateGratis o Pro, y activar una clave

Gratis vs Pro

GratisPro
Archivos por mes calendario20Ilimitado
Tamaño del archivoHasta 25 MBIlimitado
Entradas por archivoHasta 200Ilimitado
Lectura: zip_list, zip_extract, zip_extract_textIlimitadaIlimitada
Protecciones contra bombas, traversal y enlaces simbólicosSíSí

La lectura nunca se mide. El nivel gratuito es un límite en lo que escribes, porque un archivo que alguien te envió es exactamente el que más necesitas inspeccionar antes de abrirlo, y un muro de pago delante de eso sería un muro de pago delante de la comprobación de seguridad.

Obtén Pro: https://mcp.zovo.one/buy/zip - $19 una vez, o $39 para todos los servidores de la suite, de por vida. Las claves se verifican sin conexión; no se envía nada a ningún sitio.

Por qué fflate y no un escritor escrito a mano

La elección fue fflate (JS puro, 0 dependencias, zipSync/inflateSync síncronos) contra escribir un escritor STORE/DEFLATE en node:zlib, que está disponible sin ninguna dependencia.

El formato del contenedor se escribe aquí de cualquier manera. Este servidor lee el directorio central por sí mismo, en src/zipfile.ts, aproximadamente 200 líneas: tamaños, nombres, métodos, CRCs, atributos externos. Tiene que hacerlo, porque cada protección en el servidor es una decisión tomada de esas cabeceras antes de que se infle nada, y una biblioteca que devuelve {name: bytes} ya ha descomprimido la bomba para cuando puedes mirarla. Así que el argumento para una biblioteca nunca fue "me ahorra el formato".

Lo que queda es el compresor, y esa es la parte que no hay que escribir. node:zlib lo haría, pero sus llamadas raw-deflate son asíncronas primero, llevan un viaje de ida y vuelta al grupo de hilos por llamada, y las síncronas construyen cada una un flujo nativo; empaquetar 200 archivos pequeños son 200 de esos. El deflateSync de fflate es una implementación en JS puro sin manejo nativo, empaqueta 200 archivos en 74 ms (medido abajo), y significa que el paquete aún no tiene un paso de compilación nativo, que es la regla para toda esta suite: npx tiene que funcionar en todas partes.

El intercambio se declara claramente: fflate construye el archivo en un solo buffer, así que este servidor rechaza entradas de más de 512 MB en lugar de fingir que transmite, y no lee ZIP64 (más de 4 GB o más de 65,535 entradas), que se rechaza por nombre en lugar de leerse mal.

Medido: el tipo de archivo no predice la proporción de compresión, la repetición sí

Cada archivo abajo fue comprimido al nivel 6 en esta máquina. La columna "tipo" es lo que una persona llamaría al archivo; la proporción es lo que realmente pasó.

archivotipobytescomprimidoproporción
una factura de 12 páginas de mcp-pdfPDF15,12514,1181.07x
un contrato de 400 párrafos de mcp-docxDOCX9,8977,3111.35x
4,000 filas de CSV de facturación, valores variadosCSV321,329134,0492.40x
el propio index.ts de este servidorfuente39,49811,9383.31x
package-lock.jsonJSON138,83533,2234.18x
20,000 líneas de un registro de aplicaciónregistro1,603,390106,26115.09x
4,000 filas de CSV de facturación, 40 clientes repetidosCSV338,5494,09482.69x
50 MB de bytes cerobomba52,428,80051,2941022x

PDF y DOCX apenas se mueven, y eso no es una sorpresa una vez que miras dentro de ellos: ambos ya son contenedores deflate, así que comprimirlos de nuevo es empaquetado, no compresión. Agrupar un mes de facturas vale la pena por el archivo único, no por el espacio.

Las dos filas de CSV son el par interesante. Misma herramienta, misma forma, mismo tamaño, 34x de diferencia: el que tiene cuarenta nombres de clientes repetidos comprime 82.69x, el que tiene valores únicos 2.40x. Nada sobre "es un CSV" predice cuál tienes.

Medido: por qué el techo de bombas es 100x y no 50x

Una bomba de compresión se rechaza por proporción, y el instinto obvio es poner ese techo bajo, muy por debajo del 1022x que alcanza un archivo de ceros. La tabla anterior dice por qué eso está mal: una real exportación CSV, del tipo que zip_bundle_month recoge del rastreador de gastos, alcanzó 82.69x, que es el 83% del camino a un techo de 100x y muy por encima de uno de 50x. Un techo ajustado para estar cómodamente por debajo de una bomba rechazaría una exportación mensual real, y la persona al otro lado aprendería a pasar max_ratio en todo, lo que apaga la protección permanentemente.

Así que la proporción es la segunda protección, no la primera. La primera es el total: los tamaños sin comprimir declarados de las entradas seleccionadas se suman y se comparan contra un techo (1 GB por defecto, max_total_mb para cambiarlo), porque 200 MB de un archivo de 199 KB es una decisión que puedes tomar sobre el archivo en su conjunto sin juzgar ninguna entrada. Ambos se leen del directorio central, así que rechazar una bomba no cuesta ninguna descompresión:

refuse a 500 MB bomb (497.8 KB on disk)   3 ms, nothing inflated, out_dir not even created

Medido: un buffer de salida limitado no es una protección contra bombas

fflate.inflateSync(data, { out: new Uint8Array(n) }) parece la respuesta completa: limita el buffer, limita el daño. No lo es, y la forma en que falla es silenciosa. Una entrada de 100,000 bytes inflada en un buffer de 10 bytes devuelve 10 bytes y no lanza nada. Un archivo cuya cabecera declara 10 bytes para una entrada de 100 KB se extraería como un archivo de 10 bytes, reportado como un éxito, con la truncación invisible.

Así que el buffer limita la memoria y el CRC-32 en el directorio central prueba los bytes. Cada entrada que este servidor escribe se verifica contra la cabecera antes de que llegue al disco, y una discrepancia rechaza la entrada por nombre. Esa es la comprobación que convierte una cabecera mentirosa de pérdida silenciosa de datos en una frase.

Tiempos

Portátil serie M, sobre stdio, por llamada, almacén frío:

operaciónmedido
zip_create, 200 archivos, 4.0 MB74 ms
zip_list, 200 entradas2 ms
zip_extract, 200 entradas47 ms
zip_extract_text, una entrada1 ms
rechazar una bomba de 500 MB3 ms
suite de pruebas completa, 38 pruebas, cinco archivos3.9 s

Privacidad

Todo permanece en tu máquina. No hay código de red en este servidor en absoluto: sin fetch, sin cliente HTTP, sin telemetría. Los archivos se escriben donde dices, y un pequeño registro de lo que se creó vive bajo ~/.local/share/mcp-servers/zip/ (o $XDG_DATA_HOME). Las claves de licencia se verifican sin conexión con una clave pública.

Las contraseñas de zip no son compatibles, y pasar una se rechaza en lugar de ignorarse: el cifrado zip clásico está roto y el cifrado AES zip es una extensión de proveedor en la que no hay dos herramientas de acuerdo, así que un archivo "protegido por contraseña" de aquí sería una promesa falsa.

Construido por theluckystrike. Soporte: support@zovo.one

Usa estos documentos como un servidor MCP

Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente a través de GitMCP — sin instalación: