Ejecutor QuickJS de MCP
Un servidor que implementa el Protocolo de Contexto de Modelo (MCP) que proporciona una herramienta para ejecutar de forma segura código JavaScript arbitrario dentro de un motor QuickJS compilado en WebAssembly (WASM) y ejecutado utilizando la implementación WASI incorporada de Node.js.
Descripción
Este servidor actúa como proveedor de herramientas MCP. Expone una única herramienta, run_javascript_code , que recibe una cadena de código JavaScript como entrada. El código se ejecuta dentro de un entorno WASM QuickJS aislado. El servidor captura los flujos de salida estándar ( stdout ) y error estándar ( stderr ) de la ejecución y los devuelve, junto con cualquier error de ejecución, al cliente MCP.
Esto permite que los modelos de lenguaje u otros clientes MCP ejecuten de forma segura fragmentos de código JavaScript potencialmente no confiables sin comprometer el sistema host.
Related MCP server: MCP-ShellJS
Características
Ejecución segura: ejecuta JavaScript en un entorno sandbox de WASM utilizando QuickJS y Node.js WASI.
Captura de E/S estándar: captura
stdoutystderrdel código JavaScript ejecutado.Informe de errores: informa errores de tiempo de ejecución de QuickJS y códigos de salida distintos de cero.
Integración MCP: expone la funcionalidad como una herramienta MCP estándar sobre
stdio.Desarrollado con TypeScript: proporciona seguridad de tipos durante el desarrollo.
Cómo funciona
Módulo WASM: utiliza un motor QuickJS precompilado (
qjs-wasi.wasm) orientado a la interfaz del sistema WebAssembly (WASI).Node.js WASI: aprovecha el módulo
node:wasien Node.js para instanciar y ejecutar el módulo WASM.Redirección de Stdio (archivos temporales): para capturar
stdoutystderrdel entorno WASM, el servidor actualmente se basa en el enfoque estándar compatible connode:wasi:Se crea un directorio temporal en el sistema de archivos del host utilizando
node:fs/promisesynode:os.Los archivos temporales para
stdoutystderrse abren dentro de este directorio.Los descriptores de archivos del sistema operativo reales para estos archivos se pasan a la instancia
WASIdurante la inicialización (stdout: fd,stderr: fd).El módulo WASM de QuickJS escribe su salida en estos descriptores, que son enrutados por WASI a los archivos temporales.
Una vez finalizada la ejecución, el servidor cierra los controladores de archivos y lee el contenido de los archivos temporales.
Se limpian el directorio y los archivos temporales.
(Nota: los intentos de utilizar tuberías en memoria o sistemas de archivos virtuales como
Comunicación MCP: el servidor utiliza
@modelcontextprotocol/sdkpara escuchar las solicitudes MCP a través destdioy responder con los resultados de la ejecución formateados de acuerdo con el protocolo.
Prerrequisitos
Node.js (se recomienda v23.x o posterior, verifique la compatibilidad
node:wasipara su versión específica)El archivo WASM de QuickJS (
qjs-wasi.wasm) debe estar en el mismo directorio que el script de servidor compilado (p. ej.,./dist/qjs-wasi.wasmen relación con./dist/server.js). Es posible que deba obtenerlo o compilarlo por separado.
Instalación
Clonar el repositorio (si corresponde).
Instalar dependencias:
npm install