JavaScript安全执行工具

一个基于QuickJS和WASM的服务器,用于安全执行JavaScript代码,捕获标准输出和错误,并与MCP协议集成。

  • by jlucaso1
  • TypeScript
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 jlucaso1/mcp-javascript-sandbox

使用说明

MCP QuickJS运行程序

实现模型上下文协议(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捕获: 捕获 stdout 和 stderr 从执行的JavaScript代码中。
  • 错误报告: 报告QuickJS的运行时错误和非零退出代码。
  • MCP集成: 将功能作为标准MCP工具公开 stdio.
  • 使用TypeScript构建: 在开发过程中提供类型安全。

原理

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

先决条件

  • Node.js (建议使用v23.x或更高版本,请检查 node:wasi 与您的特定版本兼容)
  • npm 或 纱线
  • QuickJS WASM文件(qjs-wasi.wasm)必须与编译的服务器脚本位于同一目录中(例如。, ./dist/qjs-wasi.wasm 相对于 ./dist/server.js).您可能需要单独获取或编译此文件。

安装

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

用法

node server.ts