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并用根据协议格式化的执行结果进行响应。
先决条件
- (建议使用v23.x或更高版本,请检查
node:wasi与您的特定版本兼容) - 或 纱线
- QuickJS WASM文件(
qjs-wasi.wasm)必须与编译的服务器脚本位于同一目录中(例如。,./dist/qjs-wasi.wasm相对于./dist/server.js).您可能需要单独获取或编译此文件。
安装
- 克隆存储库(如果适用)。
- 安装依赖项:
npm install用法
node server.ts