Node.js Sandbox MCP Server
Execute JavaScript arbitrário em um contêiner Docker isolado com instalação de dependências npm em tempo real.
Documentação
🐢🚀 Node.js Sandbox MCP Server
Servidor Node.js que implementa o Model Context Protocol (MCP) para executar JavaScript arbitrário em contêineres Docker efêmeros com instalação de dependências npm em tempo real.

Recursos
- Iniciar e gerenciar contêineres sandbox Node.js isolados
- Executar comandos shell arbitrários dentro dos contêineres
- Instalar dependências npm especificadas por job
- Executar trechos de JavaScript em módulo ES e capturar o stdout
- Encerrar contêineres de forma limpa
- Modo Destacado: Manter o contêiner ativo após a execução do script (por exemplo, para servidores de longa duração)
Nota: Os contêineres são executados com limites controlados de CPU/memória.
Explore Casos de Uso Interessantes
Se você quer ideias de maneiras interessantes e poderosas de usar esta biblioteca, confira a seção de casos de uso no site. Ela contém uma lista selecionada de prompts, exemplos e experimentos criativos que você pode testar com o Node.js Sandbox MCP Server.
⚠️ Pré-requisitos
Para usar este servidor MCP, o Docker deve estar instalado e em execução na sua máquina.
Dica: Pré-baixe as imagens Docker que você precisará para evitar atrasos durante a primeira execução.
Exemplos de imagens recomendadas:
- node:lts-slim
- mcr.microsoft.com/playwright:v1.55.0-noble
- alfonsograziano/node-chartjs-canvas:latest
Primeiros passos
Para começar com este servidor MCP, primeiro você precisa conectá-lo a um cliente (por exemplo, Claude Desktop).
Depois que estiver em execução, você pode testar se está funcionando totalmente com alguns prompts de teste:
-
Validar que a ferramenta pode ser executada:
Create and run a JS script with a console.log("Hello World")Isso deve executar um console.log e, na resposta da ferramenta, você deve conseguir ver Hello World.
-
Validar que você pode instalar dependências e salvar arquivos
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.Isso deve criar um arquivo no seu diretório montado (por exemplo, a Área de Trabalho) chamado "qrcode.png"
Uso com Claude Desktop
Adicione isto ao seu claude_desktop_config.json:
Você pode seguir o Guia 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"
]
}
}
}
ou com 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: Certifique-se de que seu diretório de trabalho aponte para o servidor compilado e que o Docker esteja instalado/em execução.
Docker
Execute o servidor em um contêiner (monte o socket do Docker se necessário) e passe o diretório de saída desejado do host como uma variável de ambiente:
# 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
Isso faz o bind-mount da sua pasta do host no contêiner no mesmo caminho absoluto e disponibiliza FILES_DIR dentro do servidor MCP.
Uso efêmero – sem armazenamento persistente
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
alfonsograziano/node-code-sandbox-mcp stdio
Uso com VS Code
Botões de instalação rápida (VS Code & Insiders):
Instalar js-sandbox-mcp (NPX) Instalar js-sandbox-mcp (Docker)
Configuração manual: Adicione ao seu settings.json ou .vscode/mcp.json do 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
Ferramentas
run_js_ephemeral
Execute um script JS único em um contêiner descartável totalmente novo.
Entradas:
image(string, opcional): Imagem Docker a ser usada (padrão:node:lts-slim).code(string, obrigatório): Código-fonte JavaScript a ser executado.dependencies(array de{ name, version }, opcional): Pacotes e versões npm a serem instalados (padrão:[]).
Comportamento:
- Cria um contêiner novo.
- Grava seu
index.jse umpackage.jsonmínimo. - Instala as dependências especificadas.
- Executa o script.
- Encerra (remove) o contêiner.
- Retorna o stdout capturado.
- Se o seu código salvar arquivos no diretório atual, esses arquivos serão retornados automaticamente.
- Imagens (por exemplo, PNG, JPEG) são retornadas como conteúdo
image. - Outros arquivos (por exemplo,
.txt,.json) são retornados como conteúdoresource. - Nota: o recurso de salvamento de arquivos está disponível atualmente apenas na ferramenta efêmera.
- Imagens (por exemplo, PNG, JPEG) são retornadas como conteúdo
Dica: Para obter os arquivos de volta, basta salvá-los durante a execução do script.
Exemplo de chamada:
{
"name": "run_js_ephemeral",
"arguments": {
"image": "node:lts-slim",
"code": "console.log('One-shot run!');",
"dependencies": [{ "name": "lodash", "version": "^4.17.21" }],
},
}
Exemplo para salvar um arquivo:
import fs from 'fs/promises';
await fs.writeFile('hello.txt', 'Hello world!');
console.log('Saved hello.txt');
Isso retornará a saída do console e o arquivo hello.txt.
sandbox_initialize
Inicie um contêiner sandbox novo.
- Entrada:
image(string, opcional, padrão:node:lts-slim): Imagem Docker para o sandboxport(number, opcional): Se definido, mapeia esta porta do contêiner para o host
- Saída: String com o ID do contêiner
sandbox_exec
Execute comandos shell dentro do sandbox em execução.
- Entrada:
container_id(string): ID desandbox_initializecommands(string[]): Array de comandos shell a serem executados
- Saída: stdout combinado de cada comando
run_js
Instale dependências npm e execute código JavaScript.
-
Entrada:
container_id(string): ID desandbox_initializecode(string): Código-fonte JS a ser executado (módulos ES suportados)dependencies(array de{ name, version }, opcional, padrão:[]): nomes de pacotes npm → versões semverlistenOnPort(number, opcional): Se definido, mantém o processo em execução e expõe esta porta ao host (Modo Destacado)
-
Comportamento:
- Cria um workspace temporário dentro do contêiner
- Grava
index.jse umpackage.jsonmínimo - Executa
npm install --omit=dev --ignore-scripts --no-audit --loglevel=error - Executa
node index.jse captura o stdout, ou deixa o processo em execução em segundo plano selistenOnPortestiver definido - Limpa o workspace, a menos que esteja em modo destacado
-
Saída: stdout do script ou aviso de execução em segundo plano
sandbox_stop
Encerre e remova o contêiner sandbox.
- Entrada:
container_id(string): ID desandbox_initialize
- Saída: Mensagem de confirmação
search_npm_packages
Pesquise pacotes npm por um termo de busca e obtenha nome, descrição e um trecho do README.
-
Entrada:
searchTerm(string, obrigatório): O termo a ser pesquisado nos pacotes npm. Deve conter todo o contexto relevante. Use sinais de mais (+) para combinar termos relacionados (por exemplo, "react+components" para bibliotecas de componentes React).qualifiers(object, opcional): Qualificadores opcionais para filtrar os resultados da pesquisa:author(string, opcional): Filtrar pelo nome do autor do pacotemaintainer(string, opcional): Filtrar pelo nome do mantenedor do pacotescope(string, opcional): Filtrar pelo escopo npm (por exemplo, "@vue" para pacotes Vue.js)keywords(string, opcional): Filtrar por palavras-chave do pacotenot(string, opcional): Excluir pacotes que correspondam a este critério (por exemplo, "insecure")is(string, opcional): Incluir apenas pacotes que correspondam a este critério (por exemplo, "unstable")boostExact(string, opcional): Reforçar correspondências exatas para este termo nos resultados da pesquisa
-
Comportamento:
- Pesquisa o registro npm usando o termo de busca e os qualificadores fornecidos
- Retorna até 5 pacotes ordenados por popularidade
- Para cada pacote, fornece nome, descrição e trecho do README (primeiros 500 caracteres)
-
Saída: Array JSON contendo detalhes dos pacotes com nome, descrição e trecho do README
Dicas de Uso
- Ferramentas baseadas em sessão (
sandbox_initialize➔run_js➔sandbox_stop) são ideais quando você quer:- Manter um contêiner sandbox de longa duração aberto.
- Executar vários comandos ou scripts no mesmo ambiente.
- Instalar e reutilizar dependências incrementalmente.
- Execução única com
run_js_ephemeralé perfeita para:- Experimentos rápidos ou scripts simples.
- Casos em que você não precisa manter estado ou cache de dependências.
- Execuções limpas e atômicas sem se preocupar com encerramento manual.
- Modo destacado é útil quando você quer:
- Iniciar servidores ou serviços de longa duração em tempo real
- Expor e testar endpoints de contêineres em execução
Escolha o fluxo de trabalho que melhor se adapta ao seu caso de uso!
Build
Compile e empacote:
npm install
npm run build
Licença
Licença MIT
A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e permitir que as pessoas a quem o Software for fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIABILIDADE, ADEQUAÇÃO A UM FIM ESPECÍFICO E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.