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.
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
stdout
ystderr
del 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:wasi
en Node.js para instanciar y ejecutar el módulo WASM. - Redirección de Stdio (archivos temporales): para capturar
stdout
ystderr
del 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/promises
ynode:os
. - Los archivos temporales para
stdout
ystderr
se abren dentro de este directorio. - Los descriptores de archivos del sistema operativo reales para estos archivos se pasan a la instancia
WASI
durante 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
memfs
no tuvieron éxito porquenode:wasi
actualmente requiere descriptores de archivos del sistema operativo reales para stdio).
- Se crea un directorio temporal en el sistema de archivos del host utilizando
- Comunicación MCP: el servidor utiliza
@modelcontextprotocol/sdk
para escuchar las solicitudes MCP a través destdio
y 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:wasi
para su versión específica) - npm o hilo
- 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.wasm
en relación con./dist/server.js
). Es posible que deba obtenerlo o compilarlo por separado.
Instalación
- Clonar el repositorio (si corresponde).
- Instalar dependencias:Copy
Uso
This server cannot be installed
Proporciona la ejecución segura de código JavaScript arbitrario dentro de un entorno QuickJS WASM aislado, lo que permite que los modelos de lenguaje u otros clientes MCP ejecuten de forma segura fragmentos de código JavaScript sin comprometer el sistema host.