ReqStorm
Analizador de rendimiento de API MCP
Documentación
ReqStorm
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/healthcon 10 conexiones durante 10 segundos.
ReqStorm necesita Node.js 18 o superior.
Referencia de herramientas
Pruebas de rendimiento
| Herramienta | Úsala para |
|---|---|
benchmark | Medir el rendimiento y la latencia p50/p95/p99/p999. Los resultados incluyen datos generales, de calentamiento y de estado estable. |
smoke | Comprobar rápidamente que un endpoint responde con el estado y el cuerpo esperados. |
load-test | Ejecutar tráfico sostenido y evaluar los umbrales de estado estable de maxP95, maxP99 y maxErrorRate. |
spike | Ejecutar fases de línea base, aumento repentino y recuperación; medir la recuperación frente a la latencia de la línea base. |
soak | Ejecutar 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-test | Aumentar la concurrencia paso a paso hasta que los umbrales de latencia o tasa de error identifiquen un punto de ruptura. |
compare | Comparar dos endpoints o configuraciones lado a lado, repitiendo opcionalmente cada objetivo hasta cinco veces. |
Pruebas funcionales y de contrato
| Herramienta | Úsala para |
|---|---|
validate | Enviar una solicitud y verificar valores JSONPath, tipos, comparaciones, expresiones regulares, propiedades de arrays y umbrales de tiempo de respuesta. |
chain | Ejecutar hasta 20 solicitudes ordenadas, extraer valores de las respuestas, interpolarlos en solicitudes posteriores y verificar cada paso. |
contract-check | Comprobar 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. |
fuzz | Mutar cuerpos de solicitud con estrategias de límite, cambio de tipo, inyección, desbordamiento, campo faltante, Unicode, formato y campo nulo. |
regression | Comparar 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-scan | Ejecutar 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. |
profile | Inspeccionar 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
urldeben ser accesibles desde la máquina que ejecuta el servidor MCP. headerses un objeto de cadena a cadena y puede transportar autenticación, cookies o claves de API.- Los campos HTTP
bodyson cadenas JSON, no objetos de JavaScript. Establece una cabeceraContent-Typeadecuada al enviar JSON. - Los métodos que usan JSONPath aceptan expresiones como
$.user.id,$.items[0],$..emaily$.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