qa-mcp
The qa-mcp server automates the generation and execution of QA artifacts for software projects, integrating with LLMs via MCP sampling or assisted mode. It provides the following tools:
autoCompleteRfCu: Completes or generates therf-cu.mdrequirements document by inferring functional requirements (RF) from OpenAPI specs and frontend app routing, and estimating use cases (CU) using LLM analysis. Supports both sampling and assisted (prompt-based) modes.generateRestTests: Generates API tests using Rest Assured (Java) based on the configured OpenAPI specification, outputting to the designated path.generateE2ETests: Generates end-to-end tests with Cypress, automatically setting up the Cypress environment (config, helpers, baselines). Features an iterative auto-fix loop that runs generated tests, captures failures, and requests corrections until tests pass or iteration limits are reached. Supports LLM-guided generation (with sampling) and assisted mode (providing prompts for one RF at a time, with persistent state on disk for resumable workflows). Includes automatic detection and repair of Cypress cache errors.exportETPAsExcel: Exports the Execution Test Plan (ETP) to an Excel file using a configured template and exceljs.exportETPAsWord: Exports the ETP to a Word document using docx.
Additional capabilities include configuration via mcp.config.json (paths, templates, proxy, Cypress execution settings), context-clean subtask delegation for orchestration tools (e.g., Roo Code), and dual-mode operation (sampling or assisted) for environments with or without LLM integration.
Generates E2E tests for Cypress, including baseline snapshots and configuration.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@qa-mcpgenerate E2E tests for the login page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
QA MCP
Servidor MCP para automatizar generación de artefactos de QA:
tests API con Rest Assured (
generateRestTests): Java + JUnit 5 + Rest-Assured, cubriendo todos los resultados de cada endpoint, con ejecución/feedback (runRestTests)tests E2E con Cypress (
generateE2ETests) y ejecución/feedback (runE2ETests)documentación ETP en Excel (
exportETPAsExcel) y Word (exportETPAsWord)informe de evidencias Rest Assured en Excel (
exportRestTestsAsExcel)autocompletado de
rf-cu.md(autoCompleteRfCu)
Usa mcp.config.json en la raíz del proyecto para localizar OpenAPI, frontend, rutas de salida y plantillas.
Generación de tests REST (generateRestTests)
Genera tests de integración Java + JUnit 5 + Rest-Assured guiados por LLM. Todo su comportamiento (reglas, convenciones y alcance) está definido en prompts/rest.md, configurable con prompts.rest en mcp.config.json.
Entrada: el contrato
openApi(se parsean todos lospaths, parámetros, request bodies y todos los códigos de respuesta declarados) y el código real del backend (backend.root), del que se derivan rutas efectivas,context-path, validaciones, cuerpos de error de@ControllerAdvice, reglas de negocio (404/409) y seguridad (401/403).Cobertura: un
@Testcomo mínimo por cada resultado posible de cada endpoint. El servidor calcula ese mínimo y lo verifica.Salida: un fichero
*ApiTest.javapor grupo funcional (tag de OpenAPI o primer segmento de la ruta) dentro derestTests, en el paquete deducido del backend (<paquete-raíz>.api).Alcance cerrado: la tool solo crea o modifica tests bajo
restTests; nunca toca el código de la aplicación ni añade dependencias.Convención obligatoria: cada
@Test(y cada clase/@Nested) lleva un@DisplayNameexplícito en español, descriptivo y funcional. Está prohibida la generación automática de nombres (@DisplayNameGeneration,ReplaceUnderscores). Ese@DisplayNamees exactamente lo que el ETP Excel exporta como «Objetivo Funcionalidad».Validación del contrato: antes de persistir cada fichero, el servidor comprueba
@DisplayNameexplícito en todos los tests, ausencia de@Disabled/TODO, uso real de Rest-Assured/JUnit 5 y cobertura de cada código de estado; si falla, reintenta la generación con el diagnóstico (maxIterations, 3 por defecto).Ejecución iterativa hasta verde: cumplido el contrato estático, el servidor ejecuta la clase contra el backend (wrapper
mvnw/gradlewdetectado, orestRunCommand), lee el informe JUnit XML de Surefire/Failsafe/Gradle y persiste el estado de cada método@Test. Si algo falla, reinyecta al modelo la salida real (errores de compilación y detalle de los tests en rojo) y vuelve a generar, hasta verde o agotarmaxIterations. Una clase sólo queda verde si cumple el contrato y todos sus@Testpasan; un build que no ejecuta ningún test nunca cuenta como verde.Reactores multi-módulo: Surefire/Gradle escriben el informe en
<módulo>/target/surefire-reports, no en la raíz del proyecto. El servidor busca el XML en todo el árbol (raíz y submódulos, en anchura) y se queda con el más reciente posterior al arranque de la ejecución. Sin esto, un build multi-módulo con todos sus tests en verde se leería como «no ejecutado» y la clase nunca podría ponerse verde. También se contempla que la clase esté en el paquete por defecto, en cuyo caso el XML se llamaTEST-<Clase>.xmlsin prefijo de paquete.Estado persistido:
restTests/.qa-mcp-rest-status.jsonguarda por clasegreen,contractVersion,attempts,validationErrors,totalsy la lista detestsconpassed/skippedy la causa del fallo. Las clases ya verdes se omiten en llamadas posteriores (skipGreen: falsepara forzar su regeneración).Log por clase:
restTests/<Clase>.log, sobrescrito en cada iteración, con el comando lanzado, el resultado por test, la salida completa del build sin truncar, el resumen inyectado al modelo y el prompt de corrección. Permite distinguir si el problema está en la ejecución real o en el prompt.Build bloqueado por otra clase que no compila: Maven/Gradle compilan todo
src/test/javaantes de aplicar el filtro-Dtest=, así que un*ApiTest.javaroto impide ejecutar a todas las demás clases. El servidor atribuye cada error de compilación a su fichero y, si el culpable es otro test bajorestTests, lo repara (con sampling, reescribiéndolo hastamaxCompileRepairRounds, 3 por defecto; sin sampling, devolviendo sus errores y un PROMPT DE REPARACIÓN por fichero) en vez de quemar intentos reescribiendo la clase en curso, que no es la que rompe el build. La reparación debe conservar todos los@Testy@DisplayName: está prohibido borrar el fichero, comentar tests o marcarlos@Disabledpara esquivar el error. Los errores de compilación del código de la aplicación nunca se tocan.Verificadores de formato desactivados: los tests generados son evidencias, no código de producto. Un
spotless:check(o Checkstyle) enganchado al ciclo del build aborta antes de Surefire, así que la clase no llega a ejecutarse y jamás puede ponerse en verde por un salto de línea. El servidor añade-Dspotless.check.skip=true -Dcheckstyle.skip=true(Maven) o-x spotlessCheck(Gradle) a la invocación —también a unrestRunCommandpropio— sin modificar la configuración del proyecto. Si necesitas los ficheros formateados, ejecutamvn spotless:applyaparte.Fallos de entorno: si el build no existe, no hay dependencias, el proxy corporativo devuelve HTTP 407 o el backend está caído, se detecta como error de ENTORNO, se corta el bucle y se devuelve un diagnóstico accionable en vez de quemar intentos reescribiendo un test que no es el problema. Un error de compilación nunca se clasifica como fallo de entorno: lo provoca un
.javagenerado por la tool y se arregla reescribiéndolo.Proxy corporativo (HTTP 407): ante un
Proxy Authentication Requiredal resolver dependencias, el servidor reintenta automáticamente en modo offline (-o/--offline) contra el repositorio local. Si aun así falla, indica cómo resolverlo: credenciales del proxy en~/.m2/settings.xml, variablesHTTP_PROXY/HTTPS_PROXY/NO_PROXY(víarestEnv), orestOffline: truesi~/.m2ya tiene las dependencias.Parámetros:
tags(limita a uno o varios grupos de endpoints),promptOverride,maxIterations,assisted,validateOnly,runTests(falsegenera y valida sin ejecutar),runTimeoutMs,skipGreenymaxCompileRepairRounds.Sin sampling (Roo Code, Cline, opencode…): devuelve el prompt completo, las rutas exactas de los ficheros y el índice del código de backend para que el agente los abra y escriba los tests sólo de las clases que aún no están en verde; después debe llamar a
runRestTestspara ejecutarlas e iterar corrección→ejecución hasta que todas pasen.
Bucle de auto-corrección REST (runRestTests)
Equivalente a runE2ETests para la capa API: aunque el cliente no tenga sampling, el servidor sí puede ejecutar los tests y devolver el resultado como feedback. Trabaja una clase en curso cada vez (la primera que no está en verde) y no avanza hasta que pasa:
generateRestTests→ escribe los*ApiTest.javapendientes en sus rutas exactas.runRestTests→ el servidor ejecuta esa clase, persistegreeny el estado de cada@Testen.qa-mcp-rest-status.json, y escribe su.log. Si pasa, indica avanzar; si falla, devuelve la salida real del build + un PROMPT DE CORRECCIÓN.El agente reescribe el fichero y vuelve a llamar a
runRestTests(misma clase) hasta que pase.
Si el build ni siquiera compila por culpa de otras clases de test, runRestTests no pide corregir la clase en curso: lista los ficheros que no compilan con sus errores (- [línea,columna] mensaje) y entrega un PROMPT DE REPARACIÓN por fichero, con la orden de repararlos y volver a llamar. Así el bucle nunca se queda atascado corrigiendo una clase que no es la culpable.
Cada respuesta termina con una SIGUIENTE_ACCIÓN_OBLIGATORIA concreta para que el agente no dé por cerrado el bucle tras un solo intento. Como todo el estado vive en disco, el ciclo es reanudable desde una tarea nueva con contexto limpio: el servidor reengancha la primera clase no verde.
Parámetros de runRestTests: tags, promptOverride, runTimeoutMs, allFixes (ejecuta todas las clases pendientes en vez de parar en la primera que falla) y skipGreen.
Ajustes opcionales de ejecución en mcp.config.json: backend.mvn.path y backend.java.path (Maven y JDK concretos, ver abajo), restRunCommand (comando base si no vale el wrapper detectado), restEnv (variables de entorno, p. ej. HTTP_PROXY/NO_PROXY), restTimeoutMs (timeout por clase, 15 min por defecto) y restOffline (true fuerza -o/--offline desde el primer intento; útil detrás de un proxy que exige autenticación).
Maven y JDK a usar (backend.mvn.path / backend.java.path)
Cuando el Maven o el Java del PATH no son los correctos (varias versiones instaladas, Maven corporativo con su settings.xml y proxy ya configurados), se declaran explícitamente en mcp.config.json:
"backend": {
"root": "./backend",
"language": "java",
"build": "maven",
"mvn": { "path": "C:\\apache-maven-3.9.6" },
"java": { "path": "C:\\Program Files\\Java\\jdk-17" }
}backend.mvn.path: admite el ejecutable (...\bin\mvn.cmd), su carpetabino el directorio de instalación. Tiene prioridad sobre el wrappermvnwdel repositorio y sobre elmvndelPATH.backend.java.path: admite el home del JDK, su carpetabino el ejecutablejava. Se exporta comoJAVA_HOMEy subinse antepone alPATHde la ejecución.Ambas pueden ser relativas a
mcp.config.json. Si la ruta no existe o no contiene el binario esperado, se reporta como fallo de ENTORNO con el motivo concreto, sin reescribir ningún test.
Para generateE2ETests, la generación es genérica y guiada por LLM (MCP sampling): para cada CU, el modelo del cliente genera un spec Cypress real (con cy.intercept, interacción con selectores derivados del código frontend y aserciones), no un esqueleto de cy.log. Cada CU se genera en su propio fichero .cy.js (un describe del RF con un único it del CU), de modo que cada ejecución de Cypress corre solo ese CU y el bucle itera más rápido y de forma aislada. Antes de empezar, la tool consulta .qa-mcp-e2e-status.json: conserva y omite los CU cuyo spec existe, tiene green: true y fue validado con la versión actual del contrato E2E; genera los specs que faltan y ejecuta/repara los existentes que aún no están en verde. Si cambia un contrato incompatible (por ejemplo, la forma segura de escribir inputs), los verdes antiguos se revocan y se regeneran una sola vez.
Puedes definir las reglas de estilo/interacción con
prompts.e2eenmcp.config.json(opcional). Si no se indica, usaprompts/e2e.mddel servidor MCP.También puedes pasar
promptOverrideen la invocación de la tool para ajustar una ejecución puntual.Requiere un cliente MCP que soporte sampling (p. ej. VS Code Copilot 1.102+). Si el cliente no soporta sampling (Roo Code, Cline, opencode…), la tool pasa a modo asistido (ver más abajo).
Modo asistido (sin MCP sampling): si el cliente conectado no declara la capacidad sampling, generateE2ETests y autoCompleteRfCu no pueden pedir la generación al modelo por sí mismas. En su lugar:
generateE2ETestsprepara el entorno Cypress (helpers, config y baseline) y trabaja con UN CU no verde por llamada. Si su spec no existe, devuelve el prompt de generación y la ruta de salida exacta; si ya existe, indica que debe ejecutarse conrunE2ETestspara validarlo o repararlo. En vez de embeber el código frontend (que desborda el contexto del cliente), el prompt lista las rutas de los ficheros relevantes para que el agente los abra con sus propias herramientas de fichero.autoCompleteRfCudevuelve el prompt y la ruta de salida para que el agente genere y escribarf-cu.md.El modo asistido se activa automáticamente al detectar la falta de sampling. También puedes forzarlo con el parámetro
assisted: trueen la invocación.
Decenas de CU sin llamadas ni prompts manuales: sin MCP sampling, el servidor no puede generar por sí solo el contenido de los specs, por lo que técnicamente el flujo necesita varias llamadas MCP (
generateE2ETests→ escribir spec →runE2ETests→ corregir/volver a ejecutar → siguiente CU). El usuario, sin embargo, solo tiene que invocargenerateE2ETestsuna vez. La descripción de la tool y todas sus respuestas asistidas ya incorporan un MANDATO DE AUTOCONTINUACIÓN para que el agente escriba/corrija los specs y encadene las llamadas necesarias sin pedir confirmación ni detenerse entre CU..qa-mcp-e2e-status.jsonconserva el progreso. Si el cliente no puede encadenar tools, será necesario usar un orquestador; esa es una limitación del cliente, no hace falta suplirla con un prompt del usuario.
Invocación inicial en modo asistido (también se activa automáticamente cuando no hay sampling):
{
"assisted": true
}Bucle de auto-corrección en modo asistido (runE2ETests), CU a CU hasta verde: aunque el cliente no tenga sampling, el servidor sí puede ejecutar Cypress y devolver el resultado como feedback. El flujo trabaja un CU en curso cada vez (el primero que no está en verde) y no avanza al siguiente hasta que el actual pasa:
generateE2ETests(modo asistido) → devuelve el prompt de generación del CU en curso (si su.cy.jsno existe). El agente lo escribe.runE2ETests→ el servidor ejecuta SOLO ese CU (limpiando el baseline entre intentos). Si pasa, lo marca en verde (estado persistido en disco) y te indica avanzar; si falla, devuelve la salida real de Cypress + un PROMPT DE CORRECCIÓN.El agente aplica el prompt reescribiendo el fichero y vuelve a llamar a
runE2ETests(mismo CU) hasta que pase.Con el CU en verde, se llama de nuevo a
generateE2ETestspara el siguiente CU. Repetir hasta que todos estén en verde.
Contexto limpio por CU: todo el estado vive en disco (los .cy.js + .qa-mcp-e2e-status.json con los CU en verde), no en la conversación del cliente. Por eso el bucle es reanudable: si el cliente admite subtasks, el mandato integrado le indica que delegue automáticamente el siguiente CU con contexto limpio; si no, continúa en la tarea actual. El usuario no tiene que iniciar otra tarea ni repetir la instrucción. El servidor detecta el siguiente CU pendiente automáticamente y cada llamada emite solo el CU en curso (frontend como lista de rutas, no código embebido) para minimizar el footprint.
Automatizar el contexto limpio con subtasks (Roo Code / Orchestrator): en clientes con orquestación de subtasks (Boomerang / Orchestrator, p. ej. Roo Code), no hace falta iniciar la tarea nueva a mano. Cada respuesta de generateE2ETests / runE2ETests incluye una SEÑAL DE SUBTASK con un campo QUEDA_TRABAJO (sí/no) y la instrucción de si seguir en el mismo subtask o delegar el siguiente paso en un new_task con contexto limpio. Como todo el estado está en disco, cada subtask arranca limpio y el servidor resuelve solo el CU pendiente.
Higiene de contexto en el bucle de corrección: el contexto se llena sobre todo al iterar correcciones dentro de un mismo CU (cada vuelta reinyecta spec + salida de Cypress + reglas, y el agente reescribe el fichero entero). Por eso se delega un subtask por CU (contexto limpio para cada CU), y dentro de ese subtask el agente itera corrección→
runE2ETestshasta que ESE CU pase. Si aun así el contexto de un CU muy largo se llena, hay un offload OPCIONAL: cierra la tarea y deja que una tarea/subtask NUEVA reanude EL MISMO CU (el.cy.jsy el estado quedan en disco; el servidor reengancha el primer CU no verde). El offload es un alivio puntual, no un fin del bucle: nunca cierres un CU en rojo dándolo por terminado.
IMPORTANTE — modos de Roo y acceso MCP: el modo Orchestrator NO tiene acceso directo a tools MCP (solo delega vía
new_task); si le pides que llame aautoCompleteRfCu/generateE2ETestsdirectamente, responderá que "no es una tool reconocida". La llamada a la tool debe ocurrir dentro del subtask, en un modo con el grupomcpyedit. Usa modo Code (mode: "code") para los subtasks: como Roo no soporta sampling, las tools corren en modo asistido y el agente debe escribir los ficheros (rf-cu.md,.cy.js), así que hace falta editar. (Architect solo edita markdown; Ask no edita.)
Prompt listo para pegar en la tarea padre (Roo en modo Orchestrator):
Eres el orquestador del bucle E2E de qa-mcp. Objetivo: dejar TODOS los CU en verde.
Delega UN subtask por CU (contexto limpio por CU); el estado vive en disco y el
servidor reengancha el CU pendiente en cada subtask.
Repite este ciclo:
1. Crea un new_task EN MODO CODE (mode: "code") con contexto limpio y este objetivo
(el modo Code es obligatorio: tiene acceso a las tools MCP y puede escribir ficheros;
tú, como Orchestrator, NO puedes llamar a las tools qa-mcp directamente):
"Deja EN VERDE el CU pendiente de qa-mcp (se resuelve solo desde disco):
- Si no tiene spec: llama a generateE2ETests, escribe el .cy.js en la ruta EXACTA
indicada y llama a runE2ETests.
- Si ya tiene spec: llama a runE2ETests.
Si FALLA, aplica el PROMPT DE CORRECCIÓN (reescribe el .cy.js completo) y VUELVE A
LLAMAR a runE2ETests. Repite corrección→runE2ETests hasta que ESTE CU pase. NO cierres
la tarea con el CU en rojo. (Solo si el contexto se te llena, puedes cerrar y dejar
que otra tarea reanude ESTE MISMO CU desde disco.) Cuando pase, termina con
attempt_completion indicando 'CU en verde' y copia la línea QUEDA_TRABAJO de la
SEÑAL DE SUBTASK."
2. Cuando el subtask termine, lee su resultado (la línea QUEDA_TRABAJO).
3. Si QUEDA_TRABAJO: sí (siguiente CU), vuelve al paso 1.
4. Si QUEDA_TRABAJO: no (TODOS los CU en verde), termina.
No generes ni ejecutes tests tú mismo: delega SIEMPRE cada CU en un subtask en modo
Code con contexto limpio.En clientes CON sampling no hace falta ni el bucle manual ni los subtasks: generateE2ETests reanuda el estado de .qa-mcp-e2e-status.json, genera lo que falta y ejecuta/repara los CU no verdes por sí misma.
Ejecución iterativa (auto-fix): por defecto, generateE2ETests ejecuta Cypress sobre cada CU pendiente. Si el spec no existe, primero lo genera; si ya existe, no está verde y cumple el contrato actual, lo conserva y lo ejecuta directamente. Si usa una interacción de input insegura o le faltan evidencias, primero solicita su reparación al modelo. Cuando Cypress falla, pide al modelo que corrija el spec usando la salida de error real, repitiendo hasta que pase o se agoten los intentos. Cada resultado se persiste como green: true/false y contractVersion en .qa-mcp-e2e-status.json. Parámetros de la tool:
runTests(bool, por defectotrue): ejecuta Cypress e itera. Ponlo afalsepara solo generar.maxIterations(número, por defecto3): intentos máximos por CU (1 generación + N-1 correcciones).rf(string, opcional): limita estrictamente todo el ciclo a un único RF, p. ej."RF-3". Es la opción recomendada para ejecutar una tarea/contexto independiente por RF.rfFilter(array de ids, opcional): compatibilidad para limitar a varios RF, p. ej.["RF-01","RF-03"]. No se combina conrf.promptOverride(string, opcional). Entre cada intento se limpian las claves de baseline del CU en curso para que la re-ejecución vuelva a autocapturar. El contrato v2 separa acciones humanas y operaciones técnicas: una acción humana puede agrupar varios controles relacionados, pero Cypress ejecuta y captura cada operación de forma independiente (rf1_cu1_01.png,rf1_cu1_02.png, etc.). Si Cypress reintenta un test, el MCP reconoce(attempt N), exige que el último intento tenga el juego completo y normaliza los nombres sin mezclar intentos. Todas las evidencias deben medir 1920×1080 con DPR 1 (100 %). Losset-controlusansetDocumentedControl, que aplica el dato exacto, espera re-renderizados, resuelve controles nativos, centra el elemento, comprueba oclusiones, verifica el estado visible y captura el PNG. Las demás operaciones usancy.screenshot()tras completarse. Un CU sólo queda verde con spec vigente, contrato coherente, baseline correcto y todas sus evidencias Full HD.
Un contexto por RF
Para generar únicamente los tests de un requisito funcional:
{
"rf": "RF-3"
}La tool sólo considera los CU de RF-3: no genera, ejecuta, repara ni cambia el estado de otros RF. En modo asistido, todas las respuestas incorporan el mismo argumento en las llamadas posteriores (runE2ETests({ "rf": "RF-3" }) y generateE2ETests({ "rf": "RF-3" })) y ordenan continuar en la misma tarea mientras quede algún CU de ese RF en rojo. Cada respuesta termina además con una SIGUIENTE_ACCIÓN_OBLIGATORIA concreta para evitar que el agente dé por finalizado el bucle después de una sola ejecución. Sólo cuando todos sus CU están verdes, la respuesta termina el ámbito y ordena no saltar a otro RF. Se puede entonces abrir una tarea o contexto nuevo e invocar la tool con el siguiente RF; el progreso anterior se recupera desde disco.
Related MCP server: API Tester MCP
Exportación del ETP a Excel
exportETPAsExcel genera un libro con la misma tabla y estilos de la plantilla configurada en evidence.excelTemplate. Si esa ruta no existe en el proyecto consumidor, usa automáticamente el templates/evidences.xlsx empaquetado con qa-mcp. Las filas de ejemplo que contenga la plantilla se eliminan y se sustituyen por los tests reales disponibles:
una fila
REST-NNNpor cada método Java anotado con@Testencontrado bajorestTests;una fila
E2E-NNNpor cadait()otest()encontrado en los.cy.jsbajoe2eTests;RF, CU, objetivo y acciones se obtienen de
rf-cu.mdcuando el test puede relacionarse con él; en las filasREST, el «Objetivo Funcionalidad» es el@DisplayNameliteral del método@Test;las filas muestran primero todos los casos
RESTy después todos losE2E; dentro de cada bloque se ordenan porR. Funcionaly luego porNombre(CU), usando orden natural para los identificadores numéricos;los E2E usan
.qa-mcp-e2e-status.jsony su.logpara mostrarOK,KO,PASSoFAIL;los Rest Assured usan
.qa-mcp-rest-status.jsony su.logpara mostrarOK,KOuOMITIDO; si la clase aún no se ha ejecutado, aparecen comoNO EJECUTADO;it.skipy@Disabledse muestran comoOMITIDO.
La tool acepta opcionalmente outputFileName; si no se indica, escribe ETP.xlsx dentro de evidence.output. Funciona si solo existen tests REST, solo E2E o ambos. No ejecuta los tests durante la exportación: refleja los resultados persistidos que estén disponibles. Si no encuentra ningún @Test, it() o test(), devuelve un error claro en vez de crear un ETP vacío.
Informe de evidencias Rest Assured (exportRestTestsAsExcel)
exportRestTestsAsExcel genera un informe Excel exclusivo de los tests REST generados previamente con generateRestTests, reutilizando la misma tabla y estilos de evidence.excelTemplate (o del templates/evidences.xlsx empaquetado). Escribe una fila REST-NNN por cada método @Test encontrado bajo restTests:
R. Funcional,NombreyObjetivo Funcionalidad: el@DisplayNameliteral del método (si falta, se humaniza el nombre Java);Aplicacion: el proyecto derivado debackend.root, con el sufijoBACKEND;Requisitos Previos / Restricciones:Entorno: <DES|PRE|PRO|INT|LOCAL> | Inicio: <fecha de ejecución>; el entorno se deriva del host realmente invocado (o delserversde OpenAPI) y la hora de inicio, del informe de ejecución;Acciones: la petición real, con el formatoGET <url> => <código>. Si hay log de Rest Assured en el informe se usa la URI y el status reales; si no, se reconstruyen desde el propio test (get/post/...,queryParam,pathParam, constantesStringde la clase ystatusCode(...));Resultado:OK,KO,OMITIDO(@Disabled/skipped) oNO EJECUTADO;Resultado reproducido:PASS | ...,FAIL | ... | <mensaje del fallo>,SKIPPED | ...oPENDIENTE | <fichero>#<método>.
Los resultados provienen de una ejecución local previa: la tool no ejecuta los tests, sólo lee los informes JUnit ya existentes (surefire-reports, failsafe-reports o build/test-results/**) bajo backend.root, quedándose con la ejecución más reciente de cada método. Si no encuentra ningún informe, exporta igualmente el inventario completo con todos los casos como NO EJECUTADO y lo advierte en la respuesta.
Detalles que evitan informes incompletos o engañosos:
Sólo las clases generadas:
restTestssuele ser elsrc/test/javadel módulo, compartido con los tests unitarios escritos a mano. El informe se limita a las clases registradas en.qa-mcp-rest-status.json, de modo que no se cuelan tests ajenos (que además aparecerían con nombres en inglés, sin@DisplayNameen castellano).Anotaciones multilínea: el formateador (google-java-format/Spotless) parte los
@DisplayNamelargos en varias líneas. El parseo recorre las anotaciones con paréntesis equilibrados en vez de con un patrón de una línea, así que no se pierde ningún@Test.Clases
@Nested: Surefire escribe enclassnameel@DisplayNamedel grupo (p. ej.GET /destinations), no el nombre Java. El emparejamiento usa el nombre de la suite, que sí es la clase de nivel superior; si no, todos los tests anidados saldrían comoNO EJECUTADOpese a haberse ejecutado.URL base parametrizada: los tests generados usan
System.getProperty("api.base.uri", "https://…"). Se resuelve el valor por defecto y se respeta que la ruta ya sea absoluta; sin ello, la columnaAccionesmostraría «petición no deducible del test» en casi todas las filas.
Parámetros (todos opcionales):
Parámetro | Descripción |
| Nombre del fichero dentro de |
| Ruta completa (absoluta o relativa a |
| URL base para reconstruir las peticiones de los tests sin log de ejecución. Por defecto, el |
{
"outputPath": "C:/Users/usuario/Downloads/restassured-evidences.xlsx"
}Si no existe ningún método @Test bajo restTests, devuelve un error claro en vez de generar un informe vacío.
Exportación del ETP a Word
exportETPAsWord construye el documento a partir de rf-cu.md: crea un encabezado de nivel 1 por cada RF y, dentro de él, un encabezado de nivel 2 por cada CU. Sólo muestra las acciones para ejecución manual; nunca exporta componentes, selectores ni instrucciones Cypress. Bajo cada acción agrupa uno o varios PNG (rfx_cuy_NN.png), uno por operación técnica. Los RF, CU y acciones siguen orden natural.
El Word sólo se exporta si todos los CU están en verde y existe una captura PNG válida por cada operación. Si falta alguna evidencia, la tool devuelve un error con los CU y ficheros pendientes en vez de generar un documento incompleto. Ejecuta antes generateE2ETests hasta completar el conjunto.
Para autoCompleteRfCu, la generación es genérica y guiada por LLM (no usa plantillas ni heurísticas de dominio) y es UI-first: los RF/CU describen lo que el usuario puede reproducir DESDE LA UI, no la API completa.
Con
frontend.rootconfigurado (modo UI-first): los RF se derivan de lo que la UI expone (rutas deappRouting, componentes/pantallas y acciones que el usuario puede disparar) y los CU son los flujos concretos ejercitables desde la interfaz. OpenAPI se usa solo como referencia para entender el comportamiento, no como checklist de cobertura: no se crea un RF por endpoint ni se prueban casos que la UI no permite. La cobertura exhaustiva de la API es tarea degenerateRestTests.Sin
frontend.root(modo fallback OpenAPI-first):frontend.rootes opcional; si no se define, no hay UI que analizar y los RF se infieren directamente de los endpoints de OpenAPI (un RF por operación/funcionalidad relevante), con CU a nivel de comportamiento esperado del endpoint.Los CU los estima el modelo del cliente analizando el código frontend real (componentes, plantillas, servicios), vía MCP sampling (
sampling/createMessage).Requiere un cliente MCP que soporte sampling (p. ej. VS Code Copilot 1.102+). Sin sampling, la tool devuelve el prompt para que el agente del cliente genere y escriba
rf-cu.md; después debe llamar aautoCompleteRfCuconvalidateOnly: truey corregir el documento hasta que el servidor lo acepte.El prompt de instrucciones está externalizado en
prompts/rfcu.md(configurable conprompts.rfcuenmcp.config.json, opcional). Si no se indica, usa elprompts/rfcu.mddel servidor MCP.Si ya existe un
rf-cu.mdparcial, se completa respetando lo ya definido.Cada CU contiene dos proyecciones enlazadas:
Acciones para ejecución manual, que alimenta Excel/Word y no expone selectores ni Cypress, y unContrato de automatizaciónestructurado que alimenta los tests. Una acción humana puede agrupar varias operaciones, pero cada operación conserva su selector, valor y evidencia independiente:Toda acción manual indica el valor literal de cada campo: fecha, hora, número, texto y texto visible exacto de cada dropdown. Expresiones como «una opción disponible», «un valor válido» o «indicar la fecha y la hora» se rechazan. Datepicker, timepicker y textarea se registran técnicamente como
input;set-controlsólo admiteinput,selectycheckbox.El servidor extrae un inventario compacto de controles de todas las plantillas Angular y valida la cadena
frontend → contrato técnico → acción humana. Un CU que pulse una acción de cálculo/consulta no puede omitir silenciosamente fecha, hora u otro control de su componente. En modo sampling se realizan hasta tres intentos de autocorrección antes de rechazar el documento.
- **CU-1: Cálculo nominal.**
- **Acciones para ejecución manual:**
1. Acceder al Simulador de facturas.
2. Seleccionar «Org. Ventas de AASA» en Sociedad e introducir 180000 en Peso de la aeronave.
3. Comprobar que Importe total muestra el importe calculado.
- **Contrato de automatización:**
- `A01.1` | acción `01` | operación `visit` | etiqueta `Simulador de facturas` | destino `/simulador-de-facturas`
- `A02.1` | acción `02` | operación `set-control` | clave `sociedad` | tipo `select` | etiqueta `Sociedad` | selector `#sociedad` | valor `Org. Ventas de AASA`
- `A02.2` | acción `02` | operación `set-control` | clave `pesoAeronave` | tipo `input` | etiqueta `Peso de la aeronave` | selector `#pesoAeronave input` | valor `180000`
- `A03.1` | acción `03` | operación `verify` | etiqueta `Importe total` | selector `#importeTotal` | resultado `muestra el importe calculado`Los documentos v1 siguen siendo legibles durante la migración, pero autoCompleteRfCu genera exclusivamente el contrato v2. Los CU verdes anteriores se revalidan porque cambia la relación entre acciones y evidencias.
La generación E2E incluye baseline autocapturable de snapshots genéricos (API/UI):
asegura Cypress en el frontend (
devDependencies.cypress) y scriptse2e/e2e:openasegura
cypress.config.jsy registraregisterBaselineTasks(on)ensetupNodeEvents(omite la inyección si tu config ya define las tareasreadBaseline/writeBaseline, para no duplicarlas)usa
e2eBaseUrldemcp.config.jsonparacy.visit(...)en los specs generadoscrea
cypress/support/e2e-baseline.jscrea
cypress/fixtures/e2e-baseline.json; si detecta snapshots contaminados con[object Event], elimina sólo esas entradas, revoca el verde de sus CU y las vuelve a capturar en la siguiente ejecucióncrea
cypress/support/baseline-tasks.jscon tareasreadBaselineywriteBaselinecrea
cypress/support/e2e-helpers.js: librería compartida que incluyesetDocumentedControl(clave, tipo, selector, valor, captura). Parainputusa el setter nativo y eventos de la ventana AUT, evitando[object Event]; paraselectelige y verifica el texto visible exacto aunque Angular use[ngValue]; paracheckboxestablece y verificatrue/false. En los tres casos vuelve a resolver el DOM tras el cambio, lleva el control al viewport, lo resalta, genera el PNG y registra el dato bajoinputspara compararlo conrf-cu.md.
Antes de lanzar Cypress, es necesario ejecutar:
set NO_PROXY=localhost,127.0.0.1,.aena.es
Además, en la configuración de proxy del sistema, la IP/host del proxy debe ser:
proxym.aena.es
sin incluir http://.
En cypress.config.js, registra esas tareas desde setupNodeEvents(on):
const { registerBaselineTasks } = require('./cypress/support/baseline-tasks'); registerBaselineTasks(on);
Configuración en VS Code Copilot (MCP)
Configuración recomendada: por proyecto, en .vscode/mcp.json (no en configuración global de usuario).
En la raíz del proyecto que quieres documentar, crea .vscode/mcp.json con:
{
"servers": {
"qa-mcp": {
"type": "stdio",
"command": "C:\\Program Files\\nodejs\\node.exe",
"args": ["C:\\EnvAena\\workspace\\qa-mcp\\dist\\index.js"],
"cwd": "${workspaceFolder}"
}
}
}Y elimina qa-mcp de la configuración global (MCP: Open User Configuration) para evitar conflictos entre proyectos.
Uso en un proyecto (guía rápida)
En el proyecto a documentar, crea/ajusta
mcp.config.jsonen su raíz con rutas de backend, frontend, OpenAPI y salidas de tests/evidencias.Para fijar el Maven y el JDK con los que se ejecutan los tests REST, añade
backend.mvn.pathybackend.java.path(ejecutable o directorio de instalación).Si quieres controlar explícitamente de dónde derivar CU, añade
appRoutingcon la ruta delapp-routing.module.ts.Para fijar la URL de ejecución E2E, añade
e2eBaseUrl(ej.https://mi-entorno.aena.es).Para ejecutar Cypress con un Node concreto (p. ej. instalación nvm), añade
e2eNodePathcon el directorio que contienenode.exe/npx(por defectoC:\Users\aena\AppData\Roaming\nvm\v24.16.0); se antepone alPATHde la ejecución de Cypress.Para pasar variables de entorno a la ejecución de Cypress (proxy, etc.), añade
e2eEnvcomo objeto clave/valor. Por defecto se estableceNO_PROXY=localhost,127.0.0.1,.aena.es; puedes sobreescribirlo o añadir más variables. Ej.:"e2eEnv": { "NO_PROXY": "localhost,127.0.0.1,.aena.es", "HTTP_PROXY": "" }.Para ver el navegador mientras Cypress ejecuta (modo headed), añade
"e2eHeaded": true: el runner del MCP añade--headed, así que ves cada spec en un navegador visible (se cierra al terminar; NO se usa--no-exitpara no colgar la llamada MCP). Opcionalmente"e2eBrowser": "chrome"(oedge/firefox/electron) para elegir navegador — debe estar instalado; por defecto Electron.
⚠️ Timeout MCP en Roo/Cline (
MCP error -32001: Request timed out): una corrida real de Cypress (arranque + navegador + tests) supera con facilidad el timeout por defecto de 60 s de las llamadas MCP. Sube eltimeoutdel servidorqa-mcpen la config MCP del cliente (Roo permite hasta 3600 s; recomendado 600). Es imprescindible además si la tool tiene que reparar la caché de Cypress (descarga del binario, ver abajo).⚠️
Invalid or incompatible cached data (cachedDataRejected)al lanzar Cypress: es un error de ENTORNO (caché V8 del binario de Cypress corrupta/incompatible con la versión de Node), no del spec.runE2ETests/generateE2ETestslo detectan y reparan automáticamente una vez (cypress cache clear+install+verify) y reintentan; si persiste, devuelven un aviso claro (NO reescriben el test). Repara manualmente en el frontend, con el Node configurado en el PATH:npx cypress cache clear && npx cypress install && npx cypress verify. La reparación descarga el binario: asegura conectividad adownload.cypress.io(revisaNO_PROXY) y sube el timeout MCP (arriba).En VS Code Copilot, configura y arranca el servidor MCP
qa-mcpconcwdapuntando a ese proyecto.En Copilot Chat (modo Agent), ejecuta las tools según necesidad:
autoCompleteRfCu: completarf-cu.md. Infiere RF desde OpenAPI +appRoutingy estima los CU con el LLM del cliente (MCP sampling) analizando el frontend.generateRestTests: genera tests de integración de API (Java + JUnit 5 + Rest-Assured) desde OpenAPI + código de backend, los ejecuta y persiste su estado por test.runRestTests: ejecuta los tests REST ya escritos y devuelve el prompt de corrección para iterar hasta verde.generateE2ETests: genera tests E2E (Cypress) y deja Cypress/baseline configurado en frontend.exportETPAsExcel/exportETPAsWord: exportan el plan de pruebas con evidencias.exportRestTestsAsExcel: exporta el informe de evidencias de los tests Rest Assured con el resultado de la última ejecución local.
Revisa los artefactos generados en:
tests API: ruta configurada en
restTeststests E2E: ruta configurada en
e2eTestsevidencias: carpeta configurada en
evidence.output
Nota: las tools usan siempre mcp.config.json desde la raíz del proyecto en el que se ejecuta el MCP (cwd).
Available Tools
5 toolsautoCompleteRfCuC
Completa RF/CU/pasos en rf-cu.md según formato requerido.
| Name | Required | Description | Default |
|---|---|---|---|
| configPath | No | ||
| requirementsPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It mentions completing a file, but does not disclose side effects (e.g., overwrites, authorization needs) or details on the operation's impact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no superfluous content, but it is too brief and sacrifices necessary detail for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and low schema coverage, the description fails to provide sufficient context about the expected input format, output, or behavioral implications. It leaves many gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explain the parameters configPath and requirementsPath. No parameter information is provided, leaving the AI without guidance on input meanings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it completes RF/CU/pasos in rf-cu.md, specifying a verb and resource. However, it does not explicitly differentiate from sibling tools like export or test generation, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives or when not to use it. The context of when to invoke autoCompleteRfCu is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportETPAsExcelC
Exporta el ETP a Excel usando exceljs y plantilla configurada.
| Name | Required | Description | Default |
|---|---|---|---|
| configPath | No | ||
| outputFileName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits, but it only notes the use of a template and library. It does not indicate if the operation is destructive, requires specific permissions, or handles errors (e.g., missing configPath).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundancy, but it lacks necessary details. It is concise in length but incomplete in content, leaving the agent with significant ambiguity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has two parameters, no output schema, and no annotations. The description fails to explain what ETP is, what the configPath expects (file path? directory?), and the output format behavior (e.g., overwrite or create new). This information is minimal for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the meaning of 'configPath' or 'outputFileName'. Both parameters are strings with no additional context, so the description adds no semantic value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Exporta el ETP a Excel' (exports ETP to Excel) and mentions the technology used (exceljs y plantilla configurada). It distinguishes itself from the sibling tool 'exportETPAsWord' by specifying the output format, though it does not explicitly name the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like exportETPAsWord. There are no prerequisites, conditions, or common scenarios described.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportETPAsWordC
Exporta el ETP a Word usando docx.
| Name | Required | Description | Default |
|---|---|---|---|
| configPath | No | ||
| outputFileName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description should disclose behavioral traits (e.g., file creation, overwrite behavior). The mention of 'using docx' is a technical detail that does not clarify side effects or requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is too brief, sacrificing essential information for brevity. A single sentence is insufficient for a tool with two undocumented parameters and no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of schema descriptions, output schema, and annotations, the description is severely incomplete. It omits crucial details about return values, error handling, and parameter usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, and the tool description does not explain the meaning or usage of 'configPath' or 'outputFileName'. The agent has no semantic understanding of these parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (export) and the resource (ETP) and output format (Word). However, it does not differentiate from the sibling tool 'exportETPAsExcel', which could lead to confusion for an AI agent deciding between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'exportETPAsExcel'. The description lacks context on prerequisites or decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generateE2ETestsC
Genera tests E2E Cypress en la ruta configurada.
| Name | Required | Description | Default |
|---|---|---|---|
| configPath | No | ||
| promptOverride | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description does not disclose any behavioral traits such as side effects (e.g., file creation), required authentication, or return value. This is a critical gap for a tool that likely modifies the file system.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief (1 line in Spanish) but omits essential information. It front-loads the purpose but is not adequately informative for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and two undocumented parameters, the description is severely incomplete. It does not cover return values, side effects, or parameter details, leaving the agent with insufficient context to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fails to explain what configPath or promptOverride mean. It only mentions 'in the configured path,' which vaguely hints at configPath but provides no concrete semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it generates E2E Cypress tests in the configured path, using a specific verb and resource. It implicitly distinguishes from the sibling tool 'generateRestTests' by focusing on E2E Cypress, but does not explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like generateRestTests, nor are there any prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generateRestTestsC
Genera tests API Rest Assured en la ruta configurada.
| Name | Required | Description | Default |
|---|---|---|---|
| configPath | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description alone must convey behavior. It does not disclose whether tests are appended or overwritten, if any setup is required, or what the return value is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, but it is underspecified rather than concise. Important details are missing, making it insufficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of schema descriptions, annotations, and output schema, the description fails to provide an adequate understanding of the tool's operation and side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, configPath, lacks schema description, and the description only vaguely mentions 'the configured path' without explaining its format or purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies that the tool generates API Rest Assured tests in a configured path, which clearly identifies the action and resource. It differentiates from sibling tools like generateE2ETests by mentioning 'Rest Assured'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor any context about prerequisites or exclusions. It only states what it does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
autoCompleteRfCu - First observed
exportETPAsExcel - First observed
exportETPAsWord - First observed
generateE2ETests - First observed
generateRestTests
TDQS
The tools are mostly distinct: autoCompleteRfCu for document completion, exports to two formats (Excel/Word), and two test generators (E2E/API). The export pair could be confused by name alone, but descriptions clarify the format difference.
All tool names follow a consistent camelCase pattern with verb+object (autoComplete, export, generate). Abbreviations like RfCu, ETP, Excel, Word, E2E, Rest are used consistently. No mixing of styles.
5 tools is well-scoped for a QA server covering document management, export, and test generation. Not too few or too many.
The tools cover test preparation and generation but lack execution, reporting, or defect management. Could be more complete for a QA server, but covers core generation tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
327 dev tools via REST API and MCP. Generate Dockerfiles, schemas, K8s, APIs, and more.
AI Agent with Architectural Memory. Impact analysis (free), tests and code from the graph (pro).
End-to-end API testing — generate and run tests from OpenAPI, curl, Postman, or real user traffic.
- typeshipOAuthdev.typeship
Generate a typed SDK, CLI, and MCP server from any OpenAPI or GraphQL spec, and keep them current.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables LLM clients to generate standardized test cases, perform quality control with lint scoring, convert to Xray/Jira format, and compose test suites (Smoke/Regression/E2E) with coverage analysis.92MIT
- AlicenseBqualityCmaintenanceEnables QA/SDET engineers to test APIs by ingesting Swagger/OpenAPI specs and Postman collections, generating and executing tests in multiple languages and frameworks with real-time progress tracking.11356MIT
- FlicenseAqualityDmaintenanceGenerates structured, comprehensive test cases from user stories, API specs, or raw text, with automatic Excel export and Playwright automation code generation.61-
- FlicenseNot gradedqualityBmaintenanceEnables automated QA testing by running a pipeline of AI agents that generate test scenarios, architect test layers, write Playwright tests, and review code, all grounded in feature requirements and API contracts.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/davidpoza/qa-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server