Node.js Sandbox MCP Server
Ejecuta JavaScript arbitrario en un contenedor Docker aislado con instalación de dependencias npm sobre la marcha.
Documentación
🐢🚀 Node.js Sandbox MCP Server
Servidor Node.js que implementa el Protocolo de Contexto de Modelo (MCP) para ejecutar JavaScript arbitrario en contenedores Docker efímeros con instalación de dependencias npm sobre la marcha.

Características
- Iniciar y gestionar contenedores sandbox de Node.js aislados
- Ejecutar comandos de shell arbitrarios dentro de los contenedores
- Instalar dependencias npm especificadas por trabajo
- Ejecutar fragmentos de JavaScript con módulos ES y capturar la salida estándar
- Eliminar contenedores de forma limpia
- Modo Desacoplado: Mantener el contenedor vivo después de la ejecución del script (por ejemplo, para servidores de larga duración)
Nota: Los contenedores se ejecutan con límites controlados de CPU/memoria.
Explora Casos de Uso Interesantes
Si quieres ideas para formas interesantes y potentes de usar esta librería, consulta la sección de casos de uso en el sitio web. Contiene una lista curada de prompts, ejemplos y experimentos creativos que puedes probar con el Node.js Sandbox MCP Server.
⚠️ Requisitos Previos
Para usar este servidor MCP, Docker debe estar instalado y en ejecución en tu máquina.
Consejo: Descarga previamente las imágenes de Docker que necesites para evitar retrasos durante la primera ejecución.
Ejemplos de imágenes recomendadas:
- node:lts-slim
- mcr.microsoft.com/playwright:v1.55.0-noble
- alfonsograziano/node-chartjs-canvas:latest
Primeros Pasos
Para comenzar con este servidor MCP, primero debes conectarlo a un cliente (por ejemplo, Claude Desktop).
Una vez que esté en ejecución, puedes probar que funciona correctamente con un par de prompts de prueba:
-
Validar que la herramienta puede ejecutarse:
Create and run a JS script with a console.log("Hello World")Esto debería ejecutar un console.log y en la respuesta de la herramienta deberías poder ver Hello World.
-
Validar que puedes instalar dependencias y guardar archivos
Create and run a JS script that generates a QR code for the URL `https://nodejs.org/en`, and save it as `qrcode.png` **Tip:** Use the `qrcode` package.Esto debería crear un archivo en tu directorio montado (por ejemplo, el Escritorio) llamado "qrcode.png"
Uso con Claude Desktop
Añade esto a tu claude_desktop_config.json:
Puedes seguir la Guía Oficial para instalar este servidor MCP
{
"mcpServers": {
"js-sandbox": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"/var/run/docker.sock:/var/run/docker.sock",
"-v",
"$HOME/Desktop/sandbox-output:/root",
"-e",
"FILES_DIR=$HOME/Desktop/sandbox-output",
"-e",
"SANDBOX_MEMORY_LIMIT=512m", // optional
"-e",
"SANDBOX_CPU_LIMIT=0.75", // optional
"mcp/node-code-sandbox"
]
}
}
}
o con NPX:
{
"mcpServers": {
"node-code-sandbox-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "node-code-sandbox-mcp"],
"env": {
"FILES_DIR": "/Users/alfonsograziano/Desktop/node-sandbox",
"SANDBOX_MEMORY_LIMIT": "512m", // optional
"SANDBOX_CPU_LIMIT": "0.75" // optional
}
}
}
}
Nota: Asegúrate de que tu directorio de trabajo apunte al servidor compilado y de que Docker esté instalado/en ejecución.
Docker
Ejecuta el servidor en un contenedor (monta el socket de Docker si es necesario) y pasa tu directorio de salida deseado del host como variable de entorno:
# Build locally if necessary
# docker build -t mcp/node-code-sandbox .
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME/Desktop/sandbox-output":"/root" \
-e FILES_DIR="$HOME/Desktop/sandbox-output" \
-e SANDBOX_MEMORY_LIMIT="512m" \
-e SANDBOX_CPU_LIMIT="0.5" \
mcp/node-code-sandbox stdio
Esto monta tu carpeta del host en el contenedor en la misma ruta absoluta y hace que FILES_DIR esté disponible dentro del servidor MCP.
Uso efímero – sin almacenamiento persistente
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
alfonsograziano/node-code-sandbox-mcp stdio
Uso con VS Code
Botones de instalación rápida (VS Code e Insiders):
Instalar js-sandbox-mcp (NPX) Instalar js-sandbox-mcp (Docker)
Configuración manual: Añade a tu settings.json o .vscode/mcp.json de VS Code:
"mcp": {
"servers": {
"js-sandbox": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v", "/var/run/docker.sock:/var/run/docker.sock",
"-v", "$HOME/Desktop/sandbox-output:/root", // optional
"-e", "FILES_DIR=$HOME/Desktop/sandbox-output", // optional
"-e", "SANDBOX_MEMORY_LIMIT=512m",
"-e", "SANDBOX_CPU_LIMIT=1",
"mcp/node-code-sandbox"
]
}
}
}
API
Herramientas
run_js_ephemeral
Ejecuta un script JS único en un contenedor desechable completamente nuevo.
Entradas:
image(string, opcional): Imagen de Docker a utilizar (por defecto:node:lts-slim).code(string, obligatorio): Código fuente de JavaScript a ejecutar.dependencies(array de{ name, version }, opcional): Paquetes y versiones npm a instalar (por defecto:[]).
Comportamiento:
- Crea un contenedor nuevo.
- Escribe tu
index.jsy unpackage.jsonmínimo. - Instala las dependencias especificadas.
- Ejecuta el script.
- Elimina (remueve) el contenedor.
- Devuelve la salida estándar capturada.
- Si tu código guarda archivos en el directorio actual, estos archivos se devolverán automáticamente.
- Las imágenes (por ejemplo, PNG, JPEG) se devuelven como contenido
image. - Otros archivos (por ejemplo,
.txt,.json) se devuelven como contenidoresource. - Nota: la función de guardado de archivos está disponible actualmente solo en la herramienta efímera.
- Las imágenes (por ejemplo, PNG, JPEG) se devuelven como contenido
Consejo: Para recuperar archivos, simplemente guárdalos durante la ejecución de tu script.
Ejemplo de llamada:
{
"name": "run_js_ephemeral",
"arguments": {
"image": "node:lts-slim",
"code": "console.log('One-shot run!');",
"dependencies": [{ "name": "lodash", "version": "^4.17.21" }],
},
}
Ejemplo para guardar un archivo:
import fs from 'fs/promises';
await fs.writeFile('hello.txt', 'Hello world!');
console.log('Saved hello.txt');
Esto devolverá la salida de consola y el archivo hello.txt.
sandbox_initialize
Inicia un contenedor sandbox nuevo.
- Entrada:
image(string, opcional, por defecto:node:lts-slim): Imagen de Docker para el sandboxport(number, opcional): Si se establece, mapea este puerto del contenedor al host
- Salida: Cadena con el ID del contenedor
sandbox_exec
Ejecuta comandos de shell dentro del sandbox en ejecución.
- Entrada:
container_id(string): ID desandbox_initializecommands(string[]): Array de comandos de shell a ejecutar
- Salida: Salida estándar combinada de cada comando
run_js
Instala dependencias npm y ejecuta código JavaScript.
-
Entrada:
container_id(string): ID desandbox_initializecode(string): Código fuente JS a ejecutar (compatible con módulos ES)dependencies(array de{ name, version }, opcional, por defecto:[]): Nombres de paquetes npm → versiones semverlistenOnPort(number, opcional): Si se establece, deja el proceso en ejecución y expone este puerto al host (Modo Desacoplado)
-
Comportamiento:
- Crea un espacio de trabajo temporal dentro del contenedor
- Escribe
index.jsy unpackage.jsonmínimo - Ejecuta
npm install --omit=dev --ignore-scripts --no-audit --loglevel=error - Ejecuta
node index.jsy captura la salida estándar, o deja el proceso en ejecución en segundo plano silistenOnPortestá establecido - Limpia el espacio de trabajo a menos que se ejecute en modo desacoplado
-
Salida: Salida estándar del script o aviso de ejecución en segundo plano
sandbox_stop
Termina y elimina el contenedor sandbox.
- Entrada:
container_id(string): ID desandbox_initialize
- Salida: Mensaje de confirmación
search_npm_packages
Busca paquetes npm por un término de búsqueda y obtén su nombre, descripción y un fragmento del README.
-
Entrada:
searchTerm(string, obligatorio): El término a buscar en los paquetes npm. Debe contener todo el contexto relevante. Usa signos más (+) para combinar términos relacionados (por ejemplo, "react+components" para librerías de componentes React).qualifiers(object, opcional): Calificadores opcionales para filtrar los resultados de búsqueda:author(string, opcional): Filtrar por nombre del autor del paquetemaintainer(string, opcional): Filtrar por nombre del mantenedor del paquetescope(string, opcional): Filtrar por scope de npm (por ejemplo, "@vue" para paquetes de Vue.js)keywords(string, opcional): Filtrar por palabras clave del paquetenot(string, opcional): Excluir paquetes que coincidan con este criterio (por ejemplo, "insecure")is(string, opcional): Incluir solo paquetes que coincidan con este criterio (por ejemplo, "unstable")boostExact(string, opcional): Potenciar coincidencias exactas para este término en los resultados de búsqueda
-
Comportamiento:
- Busca en el registro npm usando el término de búsqueda y los calificadores proporcionados
- Devuelve hasta 5 paquetes ordenados por popularidad
- Para cada paquete, proporciona nombre, descripción y fragmento del README (primeros 500 caracteres)
-
Salida: Array JSON con los detalles de los paquetes, incluyendo nombre, descripción y fragmento del README
Consejos de Uso
- Herramientas basadas en sesión (
sandbox_initialize➔run_js➔sandbox_stop) son ideales cuando quieres:- Mantener un contenedor sandbox de larga duración abierto.
- Ejecutar múltiples comandos o scripts en el mismo entorno.
- Instalar y reutilizar dependencias de forma incremental.
- Ejecución única con
run_js_ephemerales perfecta para:- Experimentos rápidos o scripts simples.
- Casos en los que no necesitas mantener estado ni almacenar en caché dependencias.
- Ejecuciones limpias y atómicas sin preocuparte por la eliminación manual.
- Modo desacoplado es útil cuando quieres:
- Levantar servidores o servicios de larga duración sobre la marcha
- Exponer y probar endpoints desde contenedores en ejecución
¡Elige el flujo de trabajo que mejor se adapte a tu caso de uso!
Compilación
Compilar y empaquetar:
npm install
npm run build
Licencia
Licencia MIT
Por la presente se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y de los archivos de documentación asociados (el "Software"), para tratar el Software sin restricción, incluidos, sin limitación, los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y para permitir a las personas a quienes se les proporcione el Software hacer lo mismo, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGUNA RECLAMACIÓN, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRO MODO, QUE SURJA DE, O EN CONEXIÓN CON, EL SOFTWARE O EL USO U OTRO TIPO DE ACCIONES EN EL SOFTWARE.