ð¢ð Node.js Sandbox MCP Server
ããŒã«ã«ð¢ð Node.js Sandbox MCP Server ã«ã€ããŠ
Node.js Sandbox MCP Server ã¯ãäœ¿ãæšãŠã® Docker ã³ã³ãããŒå ã§ä»»æã® JavaScript ãå®è¡ããå¿ èŠã«å¿ã㊠npm äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãã Node.js 補㮠MCP ãµãŒããŒã§ããã¹ã¯ãªããã®éé¢å®è¡ããã¡ã€ã«çæãäžæãµãŒãã¹ã®æ€èšŒã«åããŠããŸãããã¹ãã« Docker ãã€ã³ã¹ããŒã«ãããèµ·åããŠããå¿ èŠããããŸãã
äž»ãªæ©èœ
- 01äœ¿ãæšãŠ Docker ã³ã³ãããŒã§ã® JavaScript å®è¡
- 02ãžã§ãããšã® npm äŸåé¢ä¿ã€ã³ã¹ããŒã«
- 03ã¹ã¯ãªããã®æšæºåºåã®ååŸ
- 04ã¹ã¯ãªãããä¿åããç»åãšãã¡ã€ã«ã®è¿åŽ
- 05ã³ã³ãããŒå ãµãŒãã¹ãç¶æããåé¢ã¢ãŒã
- 06ã³ã³ãããŒã®ã©ã€ããµã€ã¯ã«ç®¡çããŒã«
掻çšã·ãŒã³
- 01çæããã JavaScript ã³ãŒãã®éé¢ç°å¢ã§ã®å®è¡
- 02QR ã³ãŒãç»åãªã©ã®ãã¡ã€ã«çæãšã¯ã©ã€ã¢ã³ããžã®è¿åŽ
- 03ã³ã³ãããŒå ã§äžæãµãŒãã¹ãèµ·åãããšã³ããã€ã³ããæ€èšŒ
MCP 察å¿
ãã®ãµãŒããŒã¯ run_js_ephemeralãrun_jsãsandbox_exec ãªã©ã®ããŒã«ã MCP ã¯ã©ã€ã¢ã³ãã«æäŸããnpm ããã±ãŒãžãæ€çŽ¢ãã search_npm_packages ãå«ã¿ãŸãã
èšå®
ããŒã«ã«ãµãŒããŒã®èšå®ã¯ã©ã®ã¯ã©ã€ã¢ã³ãã§ãå ±éã§ããã³ããŒããŠã¯ã©ã€ã¢ã³ãã® MCP èšå®ãã¡ã€ã«ã«è²Œãä»ããŠãã ããã
docker run -i --rm -e FILES_DIR alfonsograziano/node-code-sandbox-mcpFILES_DIRããŒã«ã«ãµãŒããŒã«ã¯ãã·ã³äžã®å®è¡ç°å¢ïŒNode.js 18 以äžãªã©ïŒãå¿ èŠã§ããèšå®ãã¡ã€ã«ã®å Žæã¯ã¯ã©ã€ã¢ã³ãããšã«ç°ãªããŸãã
ããŒã«
ããŒã«ã«ãµãŒããŒã®ããŒã«ã¯ãã·ã³äžã§èµ·åããŠåããŠååŸã§ããŸããã¡ã³ãããŒã¯ãŸã ããŒã«äžèЧãæäŸããŠããŸããã
詳现
ð¢ð Node.js Sandbox MCP ãµãŒããŒ
ãªã³ããã³ãã§ npm ã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããäœ¿ãæšãŠã® Docker ã³ã³ãããŒå ã§ä»»æã® JavaScript ãå®è¡ãããModel Context ProtocolïŒMCPïŒãå®è£ ãã Node.js ãµãŒããŒã§ãã

ð å ¬åŒãŠã§ããµã€ããèŠã
ðŠ Docker Hub ã§å©çšã§ããŸã
æ©èœ
- åé¢ããã Node.js ãµã³ãããã¯ã¹ã³ã³ãããŒãèµ·åããŠç®¡çããŸã
- ã³ã³ãããŒå ã§ä»»æã®ã·ã§ã«ã³ãã³ããå®è¡ããŸã
- ãžã§ãããšã«æå®ãã npm ã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã
- ES ã¢ãžã¥ãŒã«ã® JavaScript ã¹ãããããå®è¡ããæšæºåºåãååŸããŸã
- ã³ã³ãããŒãé©åã«çµäºããŸã
- ãã¿ããã¢ãŒãïŒ ã¹ã¯ãªããã®å®è¡åŸãã³ã³ãããŒãèµ·åãããŸãŸã«ããŸãïŒé·æé皌åãããµãŒããŒãªã©ïŒ
泚ïŒã³ã³ãããŒã¯ CPU ãšã¡ã¢ãªã®äœ¿çšéãå¶éãããŠå®è¡ãããŸãã
掻çšäŸãèŠã
ãã®ã©ã€ãã©ãªã掻çšããã䟿å©ã§åŒ·åãªæ¹æ³ãç¥ãããå Žåã¯ããŠã§ããµã€ãã®æŽ»çšäŸã®ã»ã¯ã·ã§ã³ãã芧ãã ããã Node.js Sandbox MCP ãµãŒããŒã§è©Šãããå³éžãããããã³ãããäŸãåµé çãªå®éšãæ²èŒãããŠããŸãã
â ïž åææ¡ä»¶
ãã® MCP ãµãŒããŒã䜿çšããã«ã¯ãã䜿ãã®ãã·ã³ã« Docker ãã€ã³ã¹ããŒã«ãããå®è¡äžã§ããå¿ èŠããããŸãã
ãã³ãïŒ ååå®è¡æã®é å»¶ãé¿ãããããå¿ èŠãª Docker ã€ã¡ãŒãžãäºåã«ãã«ããŠãã ããã
æšå¥šã€ã¡ãŒãžã®äŸïŒ
- node:lts-slim
- mcr.microsoft.com/playwright:v1.55.0-noble
- alfonsograziano/node-chartjs-canvas:latest
ã¯ããã«
ãã® MCP ãµãŒããŒã䜿ãå§ããã«ã¯ããŸãã¯ã©ã€ã¢ã³ãïŒClaude Desktop ãªã©ïŒã«æ¥ç¶ããå¿ èŠããããŸãã
èµ·åããããæ¬¡ã®ãã¹ãçšããã³ãããããã€ãå®è¡ããŠãæ£åžžã«åäœããããšã確èªã§ããŸãã
-
ããŒã«ãå®è¡ã§ããããšã確èªããŸãïŒ
Create and run a JS script with a console.log("Hello World")ããã«ãã console.log ãå®è¡ãããããŒã«ã®å¿çã« Hello World ã衚瀺ãããŸãã
-
äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠãã¡ã€ã«ãä¿åã§ããããšã確èªããŸã
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.ããã«ãããããŠã³ããããã£ã¬ã¯ããªïŒãã¹ã¯ããããªã©ïŒã«ãqrcode.pngããšãããã¡ã€ã«ãäœæãããŸãã
Claude Desktop ã§ã®äœ¿çš
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", // optional
"-e",
"SANDBOX_CPU_LIMIT=0.75", // optional
"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", // optional
"SANDBOX_CPU_LIMIT": "0.75" // optional
}
}
}
}
泚ïŒäœæ¥ãã£ã¬ã¯ããªããã«ãæžã¿ãµãŒããŒãæããŠããããšããŸã Docker ãã€ã³ã¹ããŒã«ãããå®è¡äžã§ããããšã確èªããŠãã ããã
Docker
ãµãŒããŒãã³ã³ãããŒå ã§å®è¡ãïŒå¿ èŠã«å¿ã㊠Docker ãœã±ãããããŠã³ãïŒããã¹ãäžã®åºåå ãã£ã¬ã¯ããªãç°å¢å€æ°ãšããŠæž¡ããŸãïŒ
# 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
ãã¹ãã®ãã©ã«ããŒãåã絶察ãã¹ã§ã³ã³ãããŒå
ã«ãã€ã³ãããŠã³ããããMCP ãµãŒããŒå
ã§ FILES_DIR ãå©çšã§ããããã«ãªããŸãã
äœ¿ãæšãŠã§ã®äœ¿çš â æ°žç¶ã¹ãã¬ãŒãžãªã
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
alfonsograziano/node-code-sandbox-mcp stdio
VS Code ã§ã®äœ¿çš
ã¯ã€ãã¯ã€ã³ã¹ããŒã«ãã¿ã³ïŒ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", // optional
"-e", "FILES_DIR=$HOME/Desktop/sandbox-output", // optional
"-e", "SANDBOX_MEMORY_LIMIT=512m",
"-e", "SANDBOX_CPU_LIMIT=1",
"mcp/node-code-sandbox"
]
}
}
}
API
ããŒã«
run_js_ephemeral
äœ¿ãæšãŠã®æ°ããã³ã³ããã§ãäžåºŠéãã® JS ã¹ã¯ãªãããå®è¡ããŸãã
å ¥åïŒ
imageïŒæååãä»»æïŒïŒäœ¿çšãã Docker ã€ã¡ãŒãžïŒããã©ã«ãïŒnode:lts-slimïŒãcodeïŒæååãå¿ é ïŒïŒå®è¡ãã JavaScript ãœãŒã¹ãdependenciesïŒ{ name, version }ã®é åãä»»æïŒïŒã€ã³ã¹ããŒã«ãã NPM ããã±ãŒãžãšããŒãžã§ã³ïŒããã©ã«ãïŒ[]ïŒã
åäœïŒ
- æ°ããã³ã³ãããäœæããŸãã
index.jsãšæå°éã®package.jsonãæžã蟌ã¿ãŸãã- æå®ãããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã
- ã¹ã¯ãªãããå®è¡ããŸãã
- ã³ã³ãããåé€ããŸãã
- ãã£ããã£ããæšæºåºåãè¿ããŸãã
- ã³ãŒããã«ã¬ã³ããã£ã¬ã¯ããªã«ãã¡ã€ã«ãä¿åããå Žåããããã®ãã¡ã€ã«ãèªåçã«è¿ãããŸãã
- ç»åïŒäŸïŒPNGãJPEGïŒã¯
imageã³ã³ãã³ããšããŠè¿ãããŸãã - ãã®ä»ã®ãã¡ã€ã«ïŒäŸïŒ
.txtã.jsonïŒã¯resourceã³ã³ãã³ããšããŠè¿ãããŸãã - 泚ïŒãã¡ã€ã«ä¿åæ©èœã¯çŸåšããšãã§ã¡ã©ã«ããŒã«ã§ã®ã¿å©çšã§ããŸãã
- ç»åïŒäŸïŒPNGãJPEGïŒã¯
ãã³ãïŒ ãã¡ã€ã«ãååŸããã«ã¯ãã¹ã¯ãªããã®å®è¡äžã«ä¿åããã ãã§ãã
åŒã³åºãäŸïŒ
{
"name": "run_js_ephemeral",
"arguments": {
"image": "node:lts-slim",
"code": "console.log('One-shot run!');",
"dependencies": [{ "name": "lodash", "version": "^4.17.21" }],
},
}
ãã¡ã€ã«ãä¿åããäŸïŒ
import fs from 'fs/promises';
await fs.writeFile('hello.txt', 'Hello world!');
console.log('Saved hello.txt');
ããã«ãããã³ã³ãœãŒã«åºåãš hello.txt ãã¡ã€ã«ã®äž¡æ¹ãè¿ãããŸãã
sandbox_initialize
æ°ãããµã³ãããã¯ã¹ã³ã³ãããèµ·åããŸãã
- å
¥åïŒ
imageïŒæååãä»»æãããã©ã«ãïŒnode:lts-slimïŒïŒãµã³ãããã¯ã¹ã«äœ¿çšãã Docker ã€ã¡ãŒãžportïŒæ°å€ãä»»æïŒïŒèšå®ãããšããã®ã³ã³ããããŒãããã¹ãã«ãããã³ã°ããŸã
- åºåïŒã³ã³ãã ID æåå
sandbox_exec
å®è¡äžã®ãµã³ãããã¯ã¹å ã§ã·ã§ã«ã³ãã³ããå®è¡ããŸãã
- å
¥åïŒ
container_idïŒæååïŒïŒsandbox_initializeããååŸãã IDcommandsïŒæåå[]ïŒïŒå®è¡ããã·ã§ã«ã³ãã³ãã®é å
- åºåïŒåã³ãã³ãã®æšæºåºåãçµåãããã®
run_js
npm ã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããJavaScript ã³ãŒããå®è¡ããŸãã
-
å ¥åïŒ
container_idïŒæååïŒïŒsandbox_initializeããååŸãã IDcodeïŒæååïŒïŒå®è¡ãã JS ãœãŒã¹ïŒES ã¢ãžã¥ãŒã«ã«å¯Ÿå¿ïŒdependenciesïŒ{ name, version }ã®é åãä»»æãããã©ã«ãïŒ[]ïŒïŒnpm ããã±ãŒãžå â semver ããŒãžã§ã³listenOnPortïŒæ°å€ãä»»æïŒïŒèšå®ãããšãããã»ã¹ãå®è¡ãããŸãŸã«ãããã®ããŒãããã¹ãã«å ¬éããŸãïŒãã¿ããã¢ãŒãïŒ
-
åäœïŒ
- ã³ã³ããå ã«äžæã¯ãŒã¯ã¹ããŒã¹ãäœæããŸã
index.jsãšæå°éã®package.jsonãæžã蟌ã¿ãŸãnpm install --omit=dev --ignore-scripts --no-audit --loglevel=errorãå®è¡ããŸãnode index.jsãå®è¡ããŠæšæºåºåããã£ããã£ããããlistenOnPortãèšå®ãããŠããå Žåã¯ããã»ã¹ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŸãŸã«ããŸã- ãã¿ããã¢ãŒãã§å®è¡ããŠããªãå Žåãã¯ãŒã¯ã¹ããŒã¹ãã¯ãªãŒã³ã¢ããããŸã
-
åºåïŒã¹ã¯ãªããã®æšæºåºåããŸãã¯ããã¯ã°ã©ãŠã³ãå®è¡ã®éç¥
sandbox_stop
ãµã³ãããã¯ã¹ã³ã³ãããçµäºããŠåé€ããŸãã
- å
¥åïŒ
container_idïŒæååïŒïŒsandbox_initializeããååŸãã ID
- åºåïŒç¢ºèªã¡ãã»ãŒãž
search_npm_packages
æ€çŽ¢èªã䜿çšã㊠npm ããã±ãŒãžãæ€çŽ¢ããååã説æãREADME ã®æç²ãååŸããŸãã
-
å ¥åïŒ
searchTerm(string, required)ïŒnpm ããã±ãŒãžãæ€çŽ¢ããèªå¥ã§ããé¢é£ããæ å ±ããã¹ãŠå«ããŠãã ãããé¢é£ããèªå¥ã¯ãã©ã¹èšå·ïŒ+ïŒã§çµã¿åãããŸãïŒäŸïŒReact ã³ã³ããŒãã³ãã©ã€ãã©ãªã®å Žåã¯"react+components"ïŒãqualifiers(object, optional)ïŒæ€çŽ¢çµæãçµã蟌ãããã®ä»»æã®æ¡ä»¶ã§ããauthor(string, optional)ïŒããã±ãŒãžã®äœæè åã§çµã蟌ã¿ãŸãmaintainer(string, optional)ïŒããã±ãŒãžã®ã¡ã³ãããŒåã§çµã蟌ã¿ãŸãscope(string, optional)ïŒnpm ã¹ã³ãŒãã§çµã蟌ã¿ãŸãïŒäŸïŒVue.js ããã±ãŒãžã®å Žåã¯"@vue"ïŒkeywords(string, optional)ïŒããã±ãŒãžã®ããŒã¯ãŒãã§çµã蟌ã¿ãŸãnot(string, optional)ïŒãã®æ¡ä»¶ã«äžèŽããããã±ãŒãžãé€å€ããŸãïŒäŸïŒ"insecure"ïŒis(string, optional)ïŒãã®æ¡ä»¶ã«äžèŽããããã±ãŒãžã®ã¿ãå«ããŸãïŒäŸïŒ"unstable"ïŒboostExact(string, optional)ïŒæ€çŽ¢çµæã§ããã®èªå¥ãšã®å®å šäžèŽãåªå ããŸã
-
åäœïŒ
- æå®ãããæ€çŽ¢èªãšæ¡ä»¶ã䜿çšã㊠npm ã¬ãžã¹ããªãæ€çŽ¢ããŸã
- 人æ°é ã«æå€§ 5 åã®ããã±ãŒãžãè¿ããŸã
- åããã±ãŒãžã«ã€ããŠãååã説æãREADME ã®æç²ïŒå é 500 æåïŒãæäŸããŸã
-
åºåïŒããã±ãŒãžã®è©³çްïŒååã説æãREADME ã®æç²ïŒãå«ã JSON é å
䜿çšäžã®ãã³ã
- ã»ãã·ã§ã³ããŒã¹ã®ããŒã«ïŒ
sandbox_initializeârun_jsâsandbox_stopïŒã¯ã次ã®ãããªå Žåã«é©ããŠããŸãã- ãµã³ãããã¯ã¹ã³ã³ãããŒãé·æéèµ·åãããŸãŸã«ããå Žåã
- åãç°å¢ã§è€æ°ã®ã³ãã³ããã¹ã¯ãªãããå®è¡ããå Žåã
- äŸåé¢ä¿ã段éçã«ã€ã³ã¹ããŒã«ããŠåå©çšããå Žåã
- åçºå®è¡ã®
run_js_ephemeralã¯ã次ã®ãããªå Žåã«æé©ã§ãã- ææ©ãå®éšãç°¡åãªã¹ã¯ãªãããå®è¡ããå Žåã
- ç¶æ ãäŸåé¢ä¿ã®ãã£ãã·ã¥ãä¿æããå¿ èŠããªãå Žåã
- æåã§çµäºåŠçãè¡ãããšãªããã¯ãªãŒã³ã§ç¬ç«ããå®è¡ãè¡ãå Žåã
- ãã¿ããã¢ãŒãã¯ã次ã®ãããªå Žåã«äŸ¿å©ã§ãã
- ãµãŒããŒãé·æé皌åãããµãŒãã¹ããã®å Žã§èµ·åããå Žåã
- å®è¡äžã®ã³ã³ãããŒãããšã³ããã€ã³ããå ¬éããŠãã¹ãããå Žåã
çšéã«æé©ãªã¯ãŒã¯ãããŒãéžæããŠãã ããã
ãã«ã
ã³ã³ãã€ã«ããŠãã³ãã«ããŸãã
npm install
npm run build
ã©ã€ã»ã³ã¹
MIT ã©ã€ã»ã³ã¹
æ¬ãœãããŠã§ã¢ããã³é¢é£ããããã¥ã¡ã³ããã¡ã€ã«ïŒä»¥äžããœãããŠã§ã¢ãïŒã®è€è£œãååŸãããã¹ãŠã®è ã«å¯Ÿãã䜿çšãè€è£œã倿Žãçµåãå ¬éãé åžããµãã©ã€ã»ã³ã¹ãããã³ïŒãŸãã¯è²©å£²ããæš©å©ãå«ãããœãããŠã§ã¢ãå¶éãªãåãæ±ãããšãç¡åã§èš±å¯ããŸãããŸãããœãããŠã§ã¢ãæäŸãããè ã«åæ§ã®æš©å©ãèš±å¯ããããšãèªããŸãããã ãã以äžã®æ¡ä»¶ã«åŸããã®ãšããŸãã
äžèšã®èäœæš©è¡šç€ºããã³æ¬èš±è«Ÿè¡šç€ºã¯ããœãããŠã§ã¢ã®ãã¹ãŠã®è€è£œãŸãã¯å®è³ªçãªéšåã«å«ãããã®ãšããŸãã
æ¬ãœãããŠã§ã¢ã¯ãçŸç¶ã®ãŸãŸãæäŸãããååæ§ãç¹å®ç®çãžã®é©åæ§ãããã³æš©å©é䟵害ã«é¢ããä¿èšŒãå«ããæç€ºãŸãã¯é»ç€ºãåããããããªãä¿èšŒããããŸãããèäœè ãŸãã¯èäœæš©è ã¯ãæ¬ãœãããŠã§ã¢ãŸãã¯ãã®äœ¿çšã«èµ·å ãŸãã¯é¢é£ããŠçãããããªãè«æ±ãæå®³ããã®ä»ã®è²¬ä»»ã«ã€ããŠããå¥çŽãäžæ³è¡çºããã®ä»ãããªãæ ¹æ ã«ãããã®ã§ãã£ãŠã責任ãè² ããŸããã
ã³ã¡ã³ã
MCP ã¯åããŠã§ããïŒ
ãããã³ã«ã®æŠèŠããæåã®ãµãŒããŒã®å°å ¥ãŸã§ãããããçåã«ãŸãšããŠçããŸãã
AI ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã«ãããŒã¿ãœãŒã¹ã«çµ±äžçãªæ¹æ³ã§æ¥ç¶ããããã®ãªãŒãã³ãªãããã³ã«ã§ããã¯ã©ã€ã¢ã³ãã¯ã¢ãã«ãšã®å¯Ÿè©±ãæ ããMCP ãµãŒããŒã¯ããŒã«ã»ãªãœãŒã¹ã»ããã³ãããã³ãã¬ãŒããæäŸããŸããæšæºã¡ãã»ãŒãžã§ããåãããããã1 ã€ã®ãµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã§åå©çšã§ããŸãã