ReqStorm

Analizador de rendimiento de API MCP

Documentación

ReqStorm

npm version Downloads License: MIT Listed on mcpservers.org

ReqStorm es un servidor de Protocolo de Contexto de Modelo (MCP) para pruebas de API, análisis de rendimiento, validación de contratos, fuzzing y comprobaciones de seguridad ligeras. Se ejecuta sobre stdio, por lo que funciona con clientes MCP como Claude Desktop, VS Code, Cursor y otros hosts compatibles.

ReqStorm se publica como reqstorm y proporciona 14 herramientas:

  • Rendimiento: benchmark, smoke, load-test, spike, soak, stress-test, compare
  • Funcional y de contrato: validate, chain, contract-check, fuzz, regression
  • Seguridad y perfilado: security-scan, profile

Inicio rápido

Añade ReqStorm a la configuración de tu host MCP:

{
  "mcpServers": {
    "reqstorm": {
      "command": "npx",
      "args": ["-y", "reqstorm"]
    }
  }
}

La primera ejecución descarga el paquete desde npm. Para un binario instalado globalmente en su lugar:

npm install --global reqstorm

Luego pide a tu cliente MCP que ejecute una herramienta, por ejemplo:

Ejecuta un benchmark de ReqStorm contra https://api.example.com/health con 10 conexiones durante 10 segundos.

ReqStorm necesita Node.js 18 o superior.

Referencia de herramientas

Pruebas de rendimiento

HerramientaÚsala para
benchmarkMedir el rendimiento y la latencia p50/p95/p99/p999. Los resultados incluyen datos generales, de calentamiento y de estado estable.
smokeComprobar rápidamente que un endpoint responde con el estado y el cuerpo esperados.
load-testEjecutar tráfico sostenido y evaluar los umbrales de estado estable de maxP95, maxP99 y maxErrorRate.
spikeEjecutar fases de línea base, aumento repentino y recuperación; medir la recuperación frente a la latencia de la línea base.
soakEjecutar tráfico de larga duración en bloques periódicos para encontrar fugas de memoria, agotamiento y desviación de rendimiento. La duración predeterminada es de 30 minutos.
stress-testAumentar la concurrencia paso a paso hasta que los umbrales de latencia o tasa de error identifiquen un punto de ruptura.
compareComparar dos endpoints o configuraciones lado a lado, repitiendo opcionalmente cada objetivo hasta cinco veces.

Pruebas funcionales y de contrato

HerramientaÚsala para
validateEnviar una solicitud y verificar valores JSONPath, tipos, comparaciones, expresiones regulares, propiedades de arrays y umbrales de tiempo de respuesta.
chainEjecutar hasta 20 solicitudes ordenadas, extraer valores de las respuestas, interpolarlos en solicitudes posteriores y verificar cada paso.
contract-checkComprobar una API en ejecución contra un documento OpenAPI 3.x JSON/YAML, incluidos códigos de estado, esquemas, tipos de contenido y campos obligatorios.
fuzzMutar cuerpos de solicitud con estrategias de límite, cambio de tipo, inyección, desbordamiento, campo faltante, Unicode, formato y campo nulo.
regressionComparar el rendimiento en estado estable con una línea base guardada de .reqstorm/ y, opcionalmente, guardar la ejecución actual como la nueva línea base.

Seguridad y perfilado

HerramientaÚsala para
security-scanEjecutar comprobaciones seleccionadas para omisión de autenticación, IDOR, cabeceras de seguridad, exposición de datos, limitación de tasa, anulación de método, discrepancia de tipo de contenido y traversal de rutas.
profileInspeccionar la distribución de latencia, los recuentos de códigos de estado, la estabilidad del rendimiento y los desgloses de errores/tiempos de espera.

Convenciones de entrada comunes

  • Los valores de url deben ser accesibles desde la máquina que ejecuta el servidor MCP.
  • headers es un objeto de cadena a cadena y puede transportar autenticación, cookies o claves de API.
  • Los campos HTTP body son cadenas JSON, no objetos de JavaScript. Establece una cabecera Content-Type adecuada al enviar JSON.
  • Los métodos que usan JSONPath aceptan expresiones como $.user.id, $.items[0], $..email y $.tags[*].
  • Las salidas se devuelven como texto formateado en la respuesta de la herramienta MCP.
  • Las herramientas de rendimiento usan la fase de estado estable para la evaluación de umbrales; los resultados de calentamiento se siguen informando en lugar de descartarse.

Ejemplos

Benchmark de un endpoint

{
  "url": "https://api.example.com/users",
  "connections": 50,
  "duration": 30,
  "warmUpDuration": 5,
  "headers": {
    "Authorization": "Bearer <token>"
  }
}

Validar una respuesta JSON

{
  "url": "https://api.example.com/users/1",
  "assertions": [
    {
      "path": "$.name",
      "match": { "op": "equals", "expected": "Alice" }
    },
    {
      "path": "$.age",
      "match": { "op": "gte", "expected": 18 }
    },
    {
      "path": "$.email",
      "match": { "op": "matches", "pattern": "^[^@]+@[^@]+$" }
    }
  ],
  "timeouts": {
    "maxResponseMs": 500
  },
  "retries": 2
}

Los operadores de coincidencia admitidos son equals, notEquals, contains, matches, gt, lt, gte, lte, exists, notExists, isType, isArray y hasLength.

Encadenar un flujo de trabajo autenticado

{
  "baseUrl": "https://api.example.com",
  "steps": [
    {
      "name": "login",
      "request": {
        "url": "/auth/login",
        "method": "POST",
        "headers": { "Content-Type": "application/json" },
        "body": "{\"username\":\"test\",\"password\":\"<password>\"}"
      },
      "extract": { "token": "$.token" }
    },
    {
      "name": "create-user",
      "request": {
        "url": "/users",
        "method": "POST",
        "headers": {
          "Authorization": "Bearer {{token}}",
          "Content-Type": "application/json"
        },
        "body": "{\"name\":\"Test User\"}"
      },
      "extract": { "id": "$.id" }
    },
    {
      "name": "verify",
      "request": {
        "url": "/users/{{id}}",
        "headers": { "Authorization": "Bearer {{token}}" }
      },
      "assertions": [
        {
          "path": "$.name",
          "match": { "op": "equals", "expected": "Test User" }
        }
      ]
    }
  ]
}

Comprobar un contrato OpenAPI

{
  "specUrl": "https://api.example.com/openapi.json",
  "baseUrl": "https://api.example.com",
  "headers": {
    "Authorization": "Bearer <token>"
  },
  "paths": ["/users"],
  "methods": ["get", "post"],
  "previousSpecUrl": "/absolute/path/to/previous-openapi.yaml"
}

specUrl puede ser una URL HTTP(S), una ruta de archivo absoluta, una ruta file:// o un documento JSON en línea.

Prueba de carga con umbrales

{
  "url": "https://api.example.com/auth",
  "connections": 100,
  "duration": 60,
  "headers": {
    "Authorization": "Bearer <token>"
  },
  "thresholds": {
    "maxP95": 200,
    "maxP99": 500,
    "maxErrorRate": 1
  }
}

Fuzzing de un cuerpo de solicitud JSON

Usa body para una cadena JSON, o bodyTemplate al llamar a la herramienta con un objeto estructurado:

{
  "url": "https://api.example.com/users",
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer <token>"
  },
  "bodyTemplate": {
    "name": "Alice",
    "age": 30
  },
  "depth": "normal",
  "strategies": ["boundary", "injection", "type-swap", "missing-fields"]
}

El ajuste depth controla la intensidad de mutación: quick, normal (predeterminado) o thorough. De forma predeterminada, se envía primero una solicitud de línea base y los estados 500, 502, 503 y 504 se tratan como fallos graves.

Ejecutar un escaneo de seguridad

{
  "url": "https://api.example.com/users/123",
  "headers": {
    "Authorization": "Bearer <token>"
  },
  "authToken": "<token>",
  "resourceId": "123",
  "checks": [
    "auth-bypass",
    "security-headers",
    "data-exposure",
    "idor",
    "path-traversal"
  ]
}

Solo escanea sistemas que te pertenecen o para los que tienes autorización de prueba. Las comprobaciones de seguridad y el fuzzing envían solicitudes adicionales y pueden modificar datos cuando se dirigen a endpoints que cambian de estado.

Resultados y líneas base

Latencia

Los resultados de rendimiento informan la latencia p50, p95, p99 y p999, además del rendimiento y la tasa de error. Los percentiles de cola son más útiles que los promedios para los SLO: un promedio puede parecer saludable mientras un pequeño porcentaje de solicitudes es muy lento.

Calentamiento y estado estable

Las herramientas basadas en benchmark dividen la ejecución en fases de calentamiento y estado estable. El calentamiento se conserva en la salida, mientras que la prueba de carga y otras comprobaciones de umbrales usan métricas de estado estable para que el calentamiento de caché y JIT no distorsione los resultados de aprobado/fallido.

Líneas base de regresión

benchmark puede guardar un resultado con saveAs; regression lee y escribe líneas base con nombre en .reqstorm/. Mantén este directorio con el proyecto o el espacio de trabajo de CI al comparar ejecuciones entre diferentes ejecuciones.

Desarrollo

npm install
npm run build   # compile src/ to dist/
npm run dev     # watch TypeScript changes

Para publicar una versión:

npm run build
npm publish

prepublishOnly ejecuta la compilación automáticamente. El paquete requiere autenticación de npm y el paquete publicado contiene dist/, README.md y LICENSE.

Licencia

MIT