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 捕获:**从执行的 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
的临时文件。 - 这些文件的真实 OS 文件描述符在初始化期间传递给
WASI
实例(stdout: fd
,stderr: fd
)。 - QuickJS WASM 模块将其输出写入这些描述符,然后由 WASI 路由到临时文件。
- 执行完成后,服务器关闭文件句柄并读取临时文件的内容。
- 临时目录和文件已被清理。
- (注意:尝试使用内存管道或虚拟文件系统(如
memfs
失败,因为node:wasi
目前需要 stdio 的真实 OS 文件描述符。)
- 使用
- **MCP 通信:**服务器使用
@modelcontextprotocol/sdk
通过stdio
监听 MCP 请求,并以根据协议格式化的执行结果进行响应。
先决条件
- Node.js (建议使用 v23.x 或更高版本,请检查
node:wasi
与您的特定版本的兼容性) - npm或yarn
- QuickJS WASM 文件 (
qjs-wasi.wasm
) 必须与已编译的服务器脚本位于同一目录中(例如,./dist/qjs-wasi.wasm
相对于./dist/server.js
)。您可能需要单独获取或编译该文件。
安装
- 克隆存储库(如果适用)。
- 安装依赖项:Copy
用法
Copy
This server cannot be installed
在沙盒 QuickJS WASM 环境中提供任意 JavaScript 代码的安全执行,允许语言模型或其他 MCP 客户端安全地运行 JavaScript 代码片段,而不会损害主机系统。