aiquaa-api-quality-mcp-server
Allows opening draft pull requests with generated test automation changes directly on GitHub repositories.
Allows generating or extending GitHub Actions workflow files to run Newman tests in CI/CD pipelines.
Allows generating and maintaining Postman collections and environments for API test automation, including running tests via Newman.
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., "@aiquaa-api-quality-mcp-serverCheck API coverage for my-pet-store repo and generate missing tests"
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.
AIQUAA API Quality MCP Server
Servidor MCP (Model Context Protocol) que analiza requisitos y APIs, evalúa la cobertura de pruebas existente y genera o mantiene automatización Postman/Newman — con la opción de abrir un draft pull request en GitHub con los cambios.
No es un generador de colecciones desde cero: es un agente de mantenimiento de automatización de pruebas de API. Lee lo que ya existe (endpoints, DTOs, validadores, colecciones, pipelines) antes de decidir si crear, extender, modificar, mantener o deprecar algo.
Propósito
Dado uno o varios de: un requisito, una historia de usuario, un documento OpenAPI, un comando curl, código fuente de una API o un repositorio de GitHub — el servidor:
Detecta stack, endpoints, autenticación, validadores y contratos.
Estructura requisitos/criterios/reglas con IDs estables (
REQ-,AC-,BR-).Cruza requisitos contra endpoints y la colección Postman existente.
Decide
create/extend/modify/keep/deprecate/blockpor requisito.Genera o modifica únicamente lo necesario: colección, environment, scripts, pipeline CI.
Opcionalmente abre un draft PR con todo lo anterior.
Related MCP server: Code2Postman MCP
Instalación
npx -y aiquaa-api-quality-mcp-serverO como dependencia del proyecto:
npm install aiquaa-api-quality-mcp-serverQuick start
npx -y aiquaa-api-quality-mcp-serverPor defecto expone:
MCP: http://localhost:3000/mcp
Health: http://localhost:3000/healthcurl http://localhost:3000/health
# {"status":"ok","name":"aiquaa-api-quality","version":"0.1.0","transport":"streamable-http"}Configuración MCP
Agregar a la configuración de tu cliente MCP (Claude Code, Claude Desktop, etc.) como servidor HTTP:
{
"mcpServers": {
"aiquaa-api-quality": {
"url": "http://localhost:3000/mcp"
}
}
}Variables de entorno
Variable | Requerida | Descripción |
| no (default | Puerto HTTP del servidor. |
| no (default | Path del endpoint MCP. |
| solo para | Token con permisos |
| no | Para GitHub Enterprise. Default |
| no | Backend AIQUAA para requisitos/reglas remotas. |
| no | JWT para AIQUAA en desarrollo (en producción, |
| no | Default de referencia para el sandbox SQL del patrón pre/post-request. |
| no (default | Binario de CodeGraph. |
| no | Carpetas permitidas para |
| no (default | Binario de Engram. |
| no (default | Prefijo de namespace de memoria por proyecto. |
Nunca se incluyen tokens, passwords ni API keys en los artefactos generados (colecciones, environments, pipelines). Ver Seguridad.
Tools disponibles
Tool | Qué hace |
| Analiza requisitos, repositorio GitHub, OpenAPI, curl o archivos fuente. Detecta stack, endpoints, colecciones y workflows existentes. |
| Convierte historias/criterios/reglas en un modelo estructurado con IDs |
| Devuelve la matriz Requirement → Endpoint → Request → Assertions → Status. |
| Genera o extiende colección Postman v2.1, environment y assertions (modos |
| Valida estructuralmente colección/environment: JSON, schema v2.1, variables, duplicados, secretos. No ejecuta nada. |
| Ejecuta Newman — solo cuando el usuario lo invoca explícitamente. Hosts de producción requieren |
| Clasifica fallos de Newman/JUnit/mensajes de error por categoría (producto, contrato, datos, auth, test desactualizado, flaky, timeout, infraestructura...). |
| Genera o extiende un workflow de GitHub Actions / Azure Pipelines con el job de Newman. |
| Devuelve el plan de cambios ( |
| Crea rama, aplica archivos y abre un draft PR. |
| Reporta uso/costo estimado de tokens de la automatización, agrupado por fase (desarrollo/ejecución) y por tool. Es una estimación por tamaño de payload, no facturación real de un proveedor LLM — el servidor no realiza llamadas a modelos de lenguaje. Con |
Flujo: de requisito a PR
api_analizar → stack, endpoints, colecciones/pipelines existentes
api_requisitos → REQ-/AC-/BR- estructurados
api_cobertura → qué está cubierto, parcial, desactualizado o sin cubrir
api_cambios → plan (create/extend/modify/keep/deprecate/block) antes de tocar nada
api_generar → archivos generados (dry, en memoria)
api_validar → chequeo estructural antes de escribir
api_pr → dry_run=true primero, luego dry_run=false para abrir el PREjemplo desde OpenAPI
Analizá este OpenAPI y generá cobertura para REQ-142 (creación de usuario).Llamada a api_analizar con openapi (JSON o YAML) → api_generar con mode="create" y los endpoints detectados.
Ejemplo desde un repositorio
Analizá el repositorio org/customer-api y el requisito REQ-142.
Revisá los endpoints, DTOs, validadores y las colecciones Postman existentes.
Si la cobertura ya existe, no la dupliques.
Si está incompleta, agregá o modificá únicamente los requests y assertions necesarios.
Prepará los cambios y mostrame el diff.
Después, creá un draft PR contra main.Flujo de tools: api_analizar (con repository) → api_cobertura → api_cambios → api_generar → api_validar → api_pr (dry_run=true para mostrar el diff, luego dry_run=false).
Ejemplo de ampliación de colección existente
Ya tengo tests/postman/C_CUSTOMER_API.json. Agregá cobertura para el nuevo
campo obligatorio "taxId" en POST /customers sin duplicar los requests que
ya existen.api_generar con mode="extend" y existing_collection — solo agrega las assertions faltantes al request existente; no crea un request duplicado (ver src/generators/collection-generator.ts).
Uso de dryRun
api_pr tiene dry_run=true por defecto: devuelve rama, título, cuerpo del PR y archivos planificados sin tocar GitHub. Solo con dry_run=false explícito se crea la rama, se commitean los archivos y se abre el PR (como draft, salvo draft=false explícito).
Patrón de validación SQL pre/post-request
Para endpoints de escritura (POST/PUT/PATCH/DELETE) que necesitan verificar el efecto real en base de datos, api_generar puede armar automáticamente el patrón usado como referencia en aiquaa-sandbox-api (PR #12), en vez de escribirlo a mano en cada colección:
Sandbox SQL como config de primera clase: declarás
sql_sandboxuna sola vez por colección. Sembra dos variables (sqlSandboxBaseUrlno-secreta,sqlSandboxApiKeysecreta — vacía en el archivo generado) y agrega un pre-request script a nivel colección que falla rápido si esas variables no están configuradas.Body por plantilla + mutación: una operación "happy path" con
bodyTemplateVariable+requestBodyExamplesiembra la plantilla como collection variable. Cualquier otra operación que apunte al mismobodyTemplateVariableconbodyMutationsgenera un pre-request script que clona esa plantilla y muta solo el campo bajo prueba — ideal para casos negativos sin repetir el JSON completo.Verificación en base (pre y post):
dbValidation.preConditionagrega, al pre-request del item, unpm.sendRequestcontra el sandbox que aborta el test si el estado inicial de la base no es el esperado.dbValidation.postCheckagrega, al test del item, unpm.test(...)con un segundopm.sendRequestanidado que valida el efecto real después de la respuesta — con trazabilidadREQ-/AC-/BR-en el nombre del test, igual que el resto de las assertions generadas.Datos dinámicos desde la base (
captureAs): tantopreConditioncomopostCheckaceptancaptureAs(nombre de la collection variable a llenar) y opcionalmenteextractPath(path dentro de la respuesta del sandbox, ej."data[0].id"; si se omite, se captura la respuesta completa). En vez de solo validar unexpectfijo, el pre/post-request corre la query, extrae el valor y lo guarda conpm.collectionVariables.set(...)— así el siguiente campo del body o segmento de la URL puede referenciarlo como{{miVariable}}sin necesidad de hardcodear un id de ejemplo.expectes ahora opcional: unpreCondition/postCheckpuede usarse solo para capturar (sin asserción), solo para asertar (comportamiento previo, sin cambios) o ambas cosas a la vez. Casos de uso típicos:Pre-request:
SELECT id FROM usuarios WHERE activo = true LIMIT 1→captureAs: "usuarioIdDinamico"para pegarle a un endpoint con un usuario real en vez de un id fijo que puede no existir en esa corrida del sandbox.Post-request:
SELECT id FROM orders ORDER BY id DESC LIMIT 1→captureAs: "createdOrderId"para encadenar el id real generado por elINSERThacia el siguiente request (GET /orders/{{createdOrderId}}), sin depender de que la API devuelva ese id en el body de la respuesta.
El path getter (
aiquaaGetPath) se declara una única vez, como global implícito, en el mismo pre-request script de colección que ya siembrasqlSandboxBaseUrl/sqlSandboxApiKey— no hay que declarar nada por request.
{
"api_name": "Orders API",
"mode": "create",
"sql_sandbox": {
"base_url_variable": "sqlSandboxBaseUrl",
"api_key_variable": "sqlSandboxApiKey"
},
"operations": [
{
"operationId": "createOrder",
"method": "POST",
"path": "/orders",
"expectedStatus": 201,
"requirementIds": ["REQ-010"],
"requestBodyExample": { "amount": 100, "customerId": "c-1" },
"bodyTemplateVariable": "createOrder_template",
"dbValidation": {
"preCondition": { "query": "SELECT COUNT(*) FROM orders", "expect": 0 },
"postCheck": {
"query": "SELECT id FROM orders WHERE customer_id = 'c-1' ORDER BY id DESC LIMIT 1",
"captureAs": "createdOrderId",
"extractPath": "data[0].id",
"description": "captura el id real de la fila creada para c-1 (falla si no existe)"
}
}
},
{
"operationId": "createOrderNegativeAmount",
"method": "POST",
"path": "/orders",
"expectedStatus": 400,
"requirementIds": ["REQ-010", "BR-003"],
"bodyTemplateVariable": "createOrder_template",
"bodyMutations": { "amount": -1 }
},
{
"operationId": "getOrder",
"method": "GET",
"path": "/orders/{{createdOrderId}}",
"expectedStatus": 200,
"requirementIds": ["REQ-011"]
}
]
}getOrder no necesita dbValidation propio: reutiliza {{createdOrderId}}, sembrado por el postCheck.captureAs de createOrder en la misma corrida — así se encadena el id real generado en la base sin depender de que la API lo devuelva en el body ni de hardcodear un id de ejemplo.
api_validar advierte si una colección declara sql_sandbox (variables sqlSandboxBaseUrl/sqlSandboxApiKey) y algún request de escritura no tiene pre-request script o no verifica el efecto en base (sin pm.sendRequest en su test).
Configuración de GitHub
api_pr necesita GITHUB_TOKEN con permisos de escritura sobre el repositorio (contents:write, pull-requests:write). El flujo:
Verifica permisos de escritura sobre el repo.
Lee la rama base (o usa el default branch).
Reutiliza la rama
test/api-quality/<requirement-or-operation>si ya existe.Crea/actualiza/borra los archivos provistos.
Abre un draft PR con contexto, requisitos evaluados, endpoints afectados, cobertura antes/después, archivos, supuestos, riesgos, secretos requeridos e instrucciones de ejecución.
Antes de escribir, cada archivo pasa por un escaneo de secretos (src/security/secret-scanner.ts); si algo parece un token o clave privada, la operación se aborta.
Seguridad
Los valores marcados como secretos nunca se escriben en environments generados — quedan como
""para completarse fuera de versión.api_validardetecta variables secretas hardcodeadas y patrones de credenciales embebidas (AWS keys, tokens de GitHub, JWT, bloques de clave privada).api_ejecutarbloquea ejecuciones contra hosts que parecen de producción salvoconfirmed_production_run=true.api_prtienedry_run=trueydraft=truepor defecto; nunca sobrescribe un archivo sin leerlo primero (usa el SHA actual de GitHub al hacercreateOrUpdateFileContents).El servidor nunca imprime ni reenvía
GITHUB_TOKEN/AIQUAA_ACCESS_TOKENen las respuestas de las tools.
Integración AIQUAA
src/aiquaa/ define un puerto (AiquaaClientPort) y un adapter HTTP (HttpAiquaaClient) que usa las rutas centralizadas en src/constants.ts (AIQUAA_ENDPOINTS). El core del MCP depende solo de la interfaz, así que cambiar el backend o mockearlo en tests no toca las tools. Las rutas no se asumen definitivas — es el único lugar que hay que tocar si cambian.
CodeGraph
src/codegraph/codegraph-client.ts invoca el binario codegraph (configurable con CODEGRAPH_BIN) para contexto estructural de un repositorio local, restringido a CODEGRAPH_ALLOWED_ROOTS. Es opcional: si no está configurado, la tool que lo use devuelve un error explícito en vez de fallar en silencio.
Engram
src/memory/engram-client.ts invoca el binario engram (configurable con ENGRAM_BIN) para guardar/recuperar memoria persistente, siempre bajo el namespace ENGRAM_PROJECT_PREFIX + projectId. Nunca se guardan secretos; el llamador es responsable de pasar contenido ya curado.
CI/CD
.github/workflows/ci.yml: build + lint + test (npm y pnpm) en cada push/PR amain..github/workflows/publish-npm.yml: publica a npm vía Trusted Publishing/OIDC cuando se publica un release de GitHub, verificando que el tag coincida conpackage.json.api_pipelinegenera el mismo tipo de workflow (con el job de Newman) para el repositorio de la API bajo prueba, no para este servidor.
Publicación en npm
El paquete se publica vía Trusted Publishing (OIDC), sin tokens de npm en secretos de CI:
Crear un release de GitHub con tag
vX.Y.Zigual apackage.json#version.El workflow
publish-npm.ymlcorrenpm run checky luegonpm publishusando elid-token: writedel job.
Desarrollo local
npm install
npm run build
npm test
npm run lint
npm run dev # build + start con --watchdocker build -t aiquaa-api-quality-mcp-server .
docker run -p 3000:3000 aiquaa-api-quality-mcp-serverLimitaciones conocidas
La detección de stack/endpoints es heurística (regex por framework), no un parser AST completo — cubre Express, NestJS, Fastify, Spring Boot, Quarkus, ASP.NET Core, FastAPI, Django y Flask con buena precisión en los casos comunes, pero puede fallar en estructuras muy atípicas. Siempre declara
confidencey dejamissingInformationexplícito.api_ejecutarrequiere quenewmanesté instalable/disponible en el entorno donde corre el servidor.api_analizarconrepositoryrequiereGITHUB_TOKENcon permiso de lectura sobre el repo y usa la API de Git Trees (limita a ~150 archivos relevantes y 200 KB por archivo para mantener el análisis acotado).api_ejecutarpuede generar un reporte PDF propio del resultado (generate_pdf_report=true, víapdfkit, entest-results/newman-report.pdf) además de los reportescli/json/junit/htmlextrade Newman. El HTML enriquecido (newman-reporter-htmlextra) sigue siendo responsabilidad de Newman/CI.api_uso_tokensreporta un estimado de tokens/costo por tamaño de payload de cada invocación de tool (log entest-results/usage-log.jsonl) — no es telemetría real de un proveedor LLM, ya que este servidor no realiza llamadas a modelos de lenguaje.El parseo de JUnit XML es basado en regex para los casos comunes de
<testcase>/<failure>, no un parser XML completo.
Licencia
MIT — ver LICENSE.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
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
End-to-end API testing — generate and run tests from OpenAPI, curl, Postman, or real user traffic.
Screens public GitHub repos and PRs to generate risk maps, findings, and merge-readiness signals.
AI-callable tools for API mocking, testing, monitoring, security, and automation.
API governance for AI agents. Detects breaking changes, scores blast radius, blocks unsafe calls.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAnalyzes API codebases from GitHub and Bitbucket repositories to generate Postman collections, business reports, and detailed code insights. Supports multiple frameworks including FastAPI, Spring Boot, Flask, Express, and OpenAPI/Swagger specifications.MIT
- AlicenseBqualityDmaintenanceAutomatically generates Postman collections from code directories by analyzing API endpoints and parameters, enabling easy testing, documentation, and sharing.143MIT
- 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
- FlicenseNot gradedqualityCmaintenanceA full-stack API automation testing server that parses OpenAPI/Swagger/Postman/HAR specs, generates comprehensive test scenarios and executable code, and provides AI-powered review and auto-fix.-
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/stevenayal/aiquaa-api-quality-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server