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-zipaún no está publicado en npm, así que un comandonpx -y @theluckystrike/mcp-zipfallará. Las tres rutas anteriores son las que funcionan y cada una es probada por CI.

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
| herramienta | qué hace |
|---|---|
zip_create | Empaqueta archivos, o un árbol de directorios con patrones glob, en un nuevo .zip |
zip_list | Cada entrada con su tamaño, tamaño comprimido y proporción, y todo lo peligroso en ella, marcado |
zip_extract | Desempaqueta en un directorio, con protecciones contra traversal, enlaces simbólicos y bombas zip, y un dry_run |
zip_add | Añade archivos a un archivo que ya existe |
zip_extract_text | Lee una entrada de texto en línea, sin descomprimir nada |
zip_bundle_month | Un mes de facturas, presupuestos y exportaciones de los servidores hermanos, en un solo archivo |
zip_history | Lo que has creado y cuánto de la asignación gratuita de este mes queda |
license_status, license_activate | Gratis o Pro, y activar una clave |
Gratis vs Pro
| Gratis | Pro | |
|---|---|---|
| Archivos por mes calendario | 20 | Ilimitado |
| Tamaño del archivo | Hasta 25 MB | Ilimitado |
| Entradas por archivo | Hasta 200 | Ilimitado |
Lectura: zip_list, zip_extract, zip_extract_text | Ilimitada | Ilimitada |
| Protecciones contra bombas, traversal y enlaces simbólicos | Sí | 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ó.
| archivo | tipo | bytes | comprimido | proporción |
|---|---|---|---|---|
una factura de 12 páginas de mcp-pdf | 15,125 | 14,118 | 1.07x | |
un contrato de 400 párrafos de mcp-docx | DOCX | 9,897 | 7,311 | 1.35x |
| 4,000 filas de CSV de facturación, valores variados | CSV | 321,329 | 134,049 | 2.40x |
el propio index.ts de este servidor | fuente | 39,498 | 11,938 | 3.31x |
package-lock.json | JSON | 138,835 | 33,223 | 4.18x |
| 20,000 líneas de un registro de aplicación | registro | 1,603,390 | 106,261 | 15.09x |
| 4,000 filas de CSV de facturación, 40 clientes repetidos | CSV | 338,549 | 4,094 | 82.69x |
| 50 MB de bytes cero | bomba | 52,428,800 | 51,294 | 1022x |
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ón | medido |
|---|---|
zip_create, 200 archivos, 4.0 MB | 74 ms |
zip_list, 200 entradas | 2 ms |
zip_extract, 200 entradas | 47 ms |
zip_extract_text, una entrada | 1 ms |
| rechazar una bomba de 500 MB | 3 ms |
| suite de pruebas completa, 38 pruebas, cinco archivos | 3.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:
- URL MCP de documentos: https://gitmcp.io/theluckystrike/mcp-zip