使用说明
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构建: 在开发过程中提供类型安全。
原理
- WASM模块: 使用预编译的QuickJS引擎(
qjs-wasi.wasm)针对WebAssembly系统接口(WASI)。 - Node.js WASI: 利用
node:wasiNode.js中的模块,用于实例化和运行WASM模块。 - 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需要真实的操作系统文件描述符。)
- 使用以下命令在主机文件系统上创建临时目录
- MCP通信: 服务器使用
@modelcontextprotocol/sdk通过以下方式监听MCP请求stdio并用根据协议格式化的执行结果进行响应。
先决条件
- Node.js (建议使用v23.x或更高版本,请检查
node:wasi与您的特定版本兼容) - npm 或 纱线
- QuickJS WASM文件(
qjs-wasi.wasm)必须与编译的服务器脚本位于同一目录中(例如。,./dist/qjs-wasi.wasm相对于./dist/server.js).您可能需要单独获取或编译此文件。
安装
- 克隆存储库(如果适用)。
- 安装依赖项:
npm install
用法
node server.ts
