code-executionsecurity-and-iam
311 查看 · 2026-07-07 更新
MCP QuickJS Runner
一个实现了模型上下文协议(MCP)的服务器,提供了一个工具来安全地在编译为WebAssembly (WASM) 的QuickJS引擎中执行任意JavaScript代码,并使用Node.js内置的WASI实现运行。
描述
该服务器充当MCP工具提供者。它暴露了一个名为run_javascript_code的工具,该工具接受一段JavaScript代码字符串作为输入。然后这段代码会在一个沙箱化的QuickJS WASM环境中执行。服务器会捕获执行过程中的标准输出(stdout)和标准错误(stderr)流,并将它们连同任何执行错误一起返回给MCP客户端。
这使得语言模型或其他MCP客户端能够安全地执行潜在不可信的JavaScript代码片段而不危及主机系统。
特性
- 安全执行:使用QuickJS和Node.js WASI在WASM沙箱中运行JavaScript。
- 标准I/O捕获:从执行的JavaScript代码中捕获
stdout和stderr。 - 错误报告:报告来自QuickJS的运行时错误以及非零退出码。
- MCP集成:通过
stdio以标准MCP工具的形式公开功能。 - 使用TypeScript构建:开发过程中提供类型安全。
工作原理
- WASM模块:使用预编译的目标WebAssembly系统接口(WASI)的QuickJS引擎 (
qjs-wasi.wasm)。 - Node.js WASI:利用Node.js中的
node:wasi模块实例化并运行WASM模块。 - Stdio重定向(临时文件):为了从WASM环境中捕获
stdout和stderr,服务器目前依赖于与node:wasi兼容的标准方法:- 使用
node:fs/promises和node:os在宿主机文件系统上创建一个临时目录。 - 在此目录内打开用于
stdout和stderr的临时文件。 - 在初始化期间,将这些文件的真实操作系统文件描述符传递给WASI实例 (
stdout: fd,stderr: fd)。 - QuickJS WASM模块将其输出写入这些描述符,而WASI则将这些输出路由到临时文件。
- 执行完成后,服务器关闭文件句柄并读取临时文件的内容。
- 清理临时目录和文件。
- (注意:尝试使用内存管道或虚拟文件系统如
memfs未成功,因为node:wasi当前要求stdio使用真实的操作系统文件描述符。)
- 使用
- MCP通信:服务器使用
@modelcontextprotocol/sdk监听通过stdio发送的MCP请求,并根据协议格式化执行结果进行响应。
前提条件
- Node.js (推荐v23.x或更高版本,请检查您的特定版本对
node:wasi的兼容性) - npm 或 yarn
- QuickJS WASM文件 (
qjs-wasi.wasm) 必须与编译后的服务器脚本位于同一目录下(例如相对于./dist/server.js的位置是./dist/qjs-wasi.wasm)。您可能需要单独获取或编译这个文件。
安装
- 克隆仓库(如果适用)。
- 安装依赖项: bash npm install
使用
bash node server.ts
来源
- 来源:github
- 链接:https://github.com/jlucaso1/mcp-javascript-sandbox