j

jlucaso1

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代码中捕获stdoutstderr
  • 错误报告:报告来自QuickJS的运行时错误以及非零退出码。
  • MCP集成:通过stdio以标准MCP工具的形式公开功能。
  • 使用TypeScript构建:开发过程中提供类型安全。

工作原理

  1. WASM模块:使用预编译的目标WebAssembly系统接口(WASI)的QuickJS引擎 (qjs-wasi.wasm)。
  2. Node.js WASI:利用Node.js中的node:wasi模块实例化并运行WASM模块。
  3. Stdio重定向(临时文件):为了从WASM环境中捕获stdoutstderr,服务器目前依赖于与node:wasi兼容的标准方法:
    • 使用node:fs/promisesnode:os在宿主机文件系统上创建一个临时目录。
    • 在此目录内打开用于stdoutstderr的临时文件。
    • 在初始化期间,将这些文件的真实操作系统文件描述符传递给WASI实例 (stdout: fd, stderr: fd)。
    • QuickJS WASM模块将其输出写入这些描述符,而WASI则将这些输出路由到临时文件。
    • 执行完成后,服务器关闭文件句柄并读取临时文件的内容。
    • 清理临时目录和文件。
    • (注意:尝试使用内存管道或虚拟文件系统如memfs未成功,因为node:wasi当前要求stdio使用真实的操作系统文件描述符。)
  4. MCP通信:服务器使用@modelcontextprotocol/sdk监听通过stdio发送的MCP请求,并根据协议格式化执行结果进行响应。

前提条件

  • Node.js (推荐v23.x或更高版本,请检查您的特定版本对node:wasi的兼容性)
  • npmyarn
  • QuickJS WASM文件 (qjs-wasi.wasm) 必须与编译后的服务器脚本位于同一目录下(例如相对于./dist/server.js的位置是./dist/qjs-wasi.wasm)。您可能需要单独获取或编译这个文件。

安装

  1. 克隆仓库(如果适用)。
  2. 安装依赖项: bash npm install

使用

bash node server.ts

来源