实现模型上下文协议(MCP)的Node.js服务器,用于在临时Docker容器中运行任意JavaScript,并即时安装npm依赖。

👉 查看官方网站
注意:容器以受控的CPU/内存限制运行。
如果你想要一些酷炫且强大的使用方法,请查看网站上的用例部分。它包含了一组精选的提示、示例和创意实验,你可以尝试使用Node.js沙箱MCP服务器。
要使用此MCP服务器,您的机器上必须已安装并正在运行Docker。
提示: 预先拉取您需要的任何Docker镜像,以避免首次执行时出现延迟。
推荐的镜像:
为了开始使用此MCP服务器,首先需要将其连接到客户端(例如Claude Desktop)。
一旦运行起来,您可以使用几个测试提示来验证其是否完全正常工作:
验证工具能否运行:
创建并运行一个带有console.log("Hello World")的JS脚本
这应该运行一个console.log,并在工具响应中可以看到“Hello World”。
验证能否安装依赖项并保存文件
创建并运行一个生成URL `https://nodejs.org/en` 的二维码的JS脚本,并将其保存为`qrcode.png` **提示:** 使用`qrcode`包。
这应该在挂载的目录(例如桌面)中创建一个名为“qrcode.png”的文件。
将以下内容添加到您的claude_desktop_config.json中:
您可以按照官方指南来安装这个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", // 可选
"-e",
"SANDBOX_CPU_LIMIT=0.75", // 可选
"mcp/node-code-sandbox"
]
}
}
}
或者使用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", // 可选
"SANDBOX_CPU_LIMIT": "0.75" // 可选
}
}
}
}
注意:确保您的工作目录指向构建好的服务器,并且已经安装并运行了Docker。
在容器中运行服务器(如果需要挂载Docker套接字),并通过环境变量传递所需的主机输出目录:
# 如果有必要,本地构建
# 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
这将把您的主机文件夹绑定挂载到容器中的相同绝对路径,并在MCP服务器内部使FILES_DIR可用。
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
alfonsograziano/node-code-sandbox-mcp stdio
快速安装按钮(VS Code & Insiders):
安装js-sandbox-mcp (NPX) 安装js-sandbox-mcp (Docker)
手动配置:添加到您的VS Code settings.json或.vscode/mcp.json:
"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", // 可选
"-e", "FILES_DIR=$HOME/Desktop/sandbox-output", // 可选
"-e", "SANDBOX_MEMORY_LIMIT=512m",
"-e", "SANDBOX_CPU_LIMIT=1",
"mcp/node-code-sandbox"
]
}
}
}
在一个全新的可丢弃容器中运行一次性JS脚本。
输入:
image (字符串,可选):使用的Docker镜像(默认:node:lts-slim)。code (字符串,必需):要执行的JavaScript源代码。dependencies (数组,可选):NPM包及其版本(默认:[])。行为:
index.js和最小的package.json。image内容返回。.txt、.json)作为resource内容返回。提示: 若要获取文件,只需在脚本执行期间保存它们即可。
示例调用:
{
"name": "run_js_ephemeral",
"arguments": {
"image": "node:lts-slim",
"code": "console.log('一次性运行!');",
"dependencies": [{ "name": "lodash", "version": "^4.17.21" }],
},
}
保存文件的示例:
import fs from 'fs/promises';
await fs.writeFile('hello.txt', '你好世界!');
console.log('保存了hello.txt');
这将返回控制台输出以及hello.txt文件。
启动一个新的沙箱容器。
image (字符串,可选,默认值:node:lts-slim):沙箱的Docker镜像port (数字,可选):如果设置,则将此容器端口映射到主机在运行的沙箱中执行shell命令。
container_id (字符串):来自sandbox_initialize的IDcommands (字符串数组):要执行的shell命令数组安装npm依赖项并执行JavaScript代码。
输入:
container_id (字符串):来自sandbox_initialize的IDcode (字符串):要运行的JS源代码(支持ES模块)dependencies (数组,可选,默认值:[]):npm包名 → 版本号listenOnPort (数字,可选):如果设置,则让进程在后台运行并暴露此端口给主机(分离模式)行为:
index.js和最小的package.jsonnpm install --omit=dev --ignore-scripts --no-audit --loglevel=errornode index.js并捕获标准输出,或者如果设置了listenOnPort则在后台留下进程运行输出:脚本标准输出或后台执行通知
终止并移除沙箱容器。
container_id (字符串):来自sandbox_initialize的ID通过搜索词搜索npm包,并获取它们的名称、描述和README片段。
输入:
searchTerm (字符串,必需):要在npm包中搜索的术语。应包含所有相关上下文。使用加号(+)组合相关术语(例如,“react+components”用于React组件库)。qualifiers (对象,可选):可选限定符以过滤搜索结果:
author (字符串,可选):按包作者名称过滤maintainer (字符串,可选):按包维护者名称过滤scope (字符串,可选):按npm范围过滤(例如,“@vue”用于Vue.js包)keywords (字符串,可选):按包关键字过滤not (字符串,可选):排除匹配此标准的包(例如,“不安全”)is (字符串,可选):仅包括匹配此标准的包(例如,“不稳定”)boostExact (字符串,可选):在搜索结果中提升此术语的确切匹配行为:
输出:包含包详细信息的JSON数组,包括名称、描述和README片段
sandbox_initialize ➔ run_js ➔ sandbox_stop)非常适合以下情况:
run_js_ephemeral非常适合:
选择最适合您使用场景的工作流程!
编译和打包:
npm install
npm run build
MIT许可证
在此授权下,任何人获得该软件及关联文档文件(以下简称“软件”)的副本,均可不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件的副本,并允许向他们提供软件的人这样做,但须遵守以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或实质部分中。
软件按“原样”提供,不附带任何形式的担保,无论是明示的还是默示的,包括但不限于对适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人都不对因软件或与软件的使用或其他交易而引起的任何索赔、损害或其他责任负责,无论是在合同、侵权行为或其他情况下。