mcp-qa-toolbox
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., "@mcp-qa-toolboxRun quality gate on the latest test run"
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.
mcp-qa-toolbox
Servidor MCP con tres herramientas de QA que un agente de IA puede usar: parsear reportes JUnit, detectar tests flaky y evaluar un quality gate. Todo opera sobre archivos locales, sin red.
¿Qué es MCP en 3 líneas? El Model Context Protocol es un protocolo abierto para conectar modelos de lenguaje con herramientas y datos. Un servidor MCP expone herramientas tipadas y descriptas; un cliente (la app donde corre el agente) las lista y las invoca. Este repo implementa el lado servidor con el SDK oficial de Python (mcp, FastMCP) sobre transporte stdio.
Las tres herramientas
parse_junit(path)
Parsea un reporte JUnit XML y devuelve totales, fallos con mensaje y classname, errores, salteados y tiempos. Salida real del demo (recortada):
{
"totales": { "tests": 6, "pasados": 2, "fallos": 1, "errores": 1, "salteados": 2 },
"tiempo_segundos": 5.033,
"fallos": [
{
"test": "test_pago_con_tarjeta",
"classname": "tests.checkout.test_pago.TestPago",
"tipo": "AssertionError",
"mensaje": "assert response.status_code == 200, obtuve 502"
}
],
"errores": [
{
"test": "test_quita_item",
"tipo": "ConnectionError",
"mensaje": "no pude conectarme a la base de datos de prueba (timeout 5s)"
}
]
}flakiness_report(path_glob, min_runs)
Dado un glob con N reportes de corridas sucesivas de la misma suite, computa la tasa de fallo por test y clasifica: estable (nunca falla), flaky (falla intermitente), roto (falla siempre) o datos_insuficientes (menos de min_runs ejecuciones, típico de un test recién agregado). Salida real sobre las 5 corridas de testdata/corridas/ (recortada):
{
"corridas_analizadas": 5,
"tests": [
{ "id": "tests.checkout.test_pago.TestPago::test_cupon_descuento", "fallos": 5, "tasa_fallo": 1.0, "clasificacion": "roto" },
{ "id": "tests.checkout.test_pago.TestPago::test_pago_con_tarjeta", "fallos": 2, "tasa_fallo": 0.4, "clasificacion": "flaky" },
{ "id": "tests.checkout.test_envio.TestEnvio::test_envio_internacional", "corridas_presentes": 3, "tasa_fallo": 0.0, "clasificacion": "estable" }
],
"resumen": { "estables": 3, "flaky": 1, "rotos": 1, "datos_insuficientes": 0 }
}quality_gate(path, max_failures, max_flaky_rate)
Decisión pass/fail con razones explícitas. Con un archivo verifica los fallos de esa corrida; con un glob verifica además la proporción de tests flaky. Salida real (recortada):
{
"decision": "fail",
"razones": [
"FALLA: 1 test(s) fallidos en la última corrida (testdata/corridas/corrida_05.xml), máximo permitido 0. Tests: test_cupon_descuento.",
"FALLA: 1 de 5 tests clasificados son flaky (tasa 0.2), máximo permitido 0.0. Tests: tests.checkout.test_pago.TestPago::test_pago_con_tarjeta."
]
}Related MCP server: mcp-lab-agent
Probalo sin un cliente MCP
python -m venv .venv && source .venv/bin/activate
pip install -e '.[dev]'
python -m mcp_qa demo # corre las 3 herramientas contra testdata/ e imprime los resultados
pytest -q # 29 testsConectarlo a un cliente MCP
El servidor habla stdio: el cliente lo lanza como subproceso. Configuración genérica (el formato exacto varía según el cliente, pero siempre es command + args):
{
"mcpServers": {
"mcp-qa-toolbox": {
"command": "/ruta/al/repo/.venv/bin/python",
"args": ["-m", "mcp_qa", "serve"]
}
}
}Las rutas que reciben las herramientas se resuelven relativas al directorio de trabajo del servidor; usá rutas absolutas si el cliente no lo lanza desde la raíz del repo.
La descripción de una herramienta es prompt engineering
Lo único que el modelo ve de este servidor son los nombres, descripciones y schemas de las tools. Esa descripción decide si el agente elige la herramienta correcta, con qué argumentos, y qué espera de la salida. Por eso las docstrings de src/mcp_qa/server.py no dicen solo qué hace cada tool: dicen cuándo usarla ("cuando tengas VARIOS reportes de corridas sucesivas..."), cuándo no ("para comparar varias corridas usá flakiness_report"), qué forma tiene la salida y qué pasa en los casos de error. Escribirlas es el mismo trabajo que escribir un buen prompt.
Por qué la lógica vive fuera del servidor
La tesis de diseño del repo: lógica pura + capa de protocolo fina.
src/mcp_qa/junit.py,flakiness.pyygate.pyson módulos puros: reciben rutas y parámetros, devuelven dicts, levantanValueError/FileNotFoundErrorcon mensajes claros. No importan nada de MCP y se testean con pytest a secas (25 de los 29 tests).src/mcp_qa/server.pysolo declara las tools y delega. Los 4 tests de integración usan el cliente in-memory del SDK (mcp.shared.memory.create_connected_server_and_client_session), que conecta unClientSessionreal por streams en memoria: se ejercita el protocolo completo (initialize,tools/list,tools/call) sin procesos ni red.
Beneficios concretos: los casos borde (XML malformado, suite vacía, glob sin matches, test que aparece en unas corridas y no en otras) se prueban rápido y sin ceremonia; y si mañana estas herramientas se exponen por otra vía (CLI, HTTP), la lógica no se toca — de hecho python -m mcp_qa demo ya es esa segunda vía.
Estructura
src/mcp_qa/
junit.py # parseo JUnit XML (puro)
flakiness.py # clasificación estable/flaky/roto (puro)
gate.py # decisión pass/fail con razones (puro)
server.py # servidor FastMCP: 3 tools que delegan
__main__.py # python -m mcp_qa {serve,demo}
testdata/ # fixtures JUnit escritas a mano: verde, con fallos,
# con errores y skips, malformada, suite vacía,
# y 5 corridas para flakiness
tests/ # 29 tests: lógica pura + integración MCP in-memoryQué NO demuestra
No incluye un agente ni llama a ningún modelo. Es solo el lado servidor de MCP; el agente lo pone el cliente que lo conecte.
No reemplaza al humano que decide. Las herramientas resumen evidencia; interpretar por qué un test es flaky y qué hacer con eso sigue siendo trabajo de una persona.
El gate es un ejemplo de política, no una recomendación universal. Umbrales como
max_failures=0o "flaky = falla intermitente en N corridas" son decisiones de cada equipo; acá son parámetros, no verdades.No es un parser JUnit exhaustivo. Cubre los reportes que emiten pytest/Surefire/Gradle en sus formas comunes (
<testsuites>o<testsuite>raíz); no cubre extensiones propietarias.
Licencia
MIT.
Available Tools
3 toolsflakiness_reportA
Clasifica tests como estables, flaky o rotos a partir de N corridas.
Usá esta herramienta cuando tengas VARIOS reportes JUnit de corridas sucesivas de la misma suite (por ejemplo, los artefactos de los últimos builds de CI) y quieras distinguir qué tests fallan siempre (rotos), qué tests fallan a veces (flaky) y cuáles nunca fallan (estables). Un test con menos de min_runs ejecuciones queda como "datos_insuficientes" en lugar de recibir una clasificación apurada.
Args: path_glob: patrón glob que matchea los reportes, por ejemplo "testdata/corridas/*.xml". El orden alfabético de los archivos se toma como orden cronológico. min_runs: mínimo de ejecuciones para clasificar un test (default 3).
Returns: "tests" (uno por test con corridas_presentes, ejecuciones, fallos, tasa_fallo y clasificacion, ordenados de peor a mejor tasa), "resumen" con los conteos por clasificación, y la lista de "archivos" analizados.
| Name | Required | Description | Default |
|---|---|---|---|
| min_runs | No | ||
| path_glob | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains the classification logic, the min_runs threshold, and the return structure. It does not mention any destructive actions, authentication needs, or rate limits, but for a read-only analysis tool, the provided information is adequate.
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 well-structured with a summary line, usage context, and clearly separated args/returns. It is concise and contains no unnecessary words.
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 existence of an output schema, the description provides a sufficient summary of return values and includes all necessary input details. The classification logic and ordering are explained, making it complete for an agent to use 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?
The input schema has 0% description coverage, but the description adds meaning for both parameters: path_glob is explained with an example and note on alphabetical order, min_runs is explained with default value. This fully compensates for the missing schema descriptions.
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 tool's purpose: classifies tests as stable, flaky, or broken from multiple successive JUnit reports. It specifies the verb 'clasifica' and resource 'tests', and implicitly distinguishes from sibling tool 'parse_junit' which handles single reports.
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 explicitly says when to use: when you have several successive JUnit reports from the same suite. It provides context about the classification output and mentions 'datos_insuficientes' for cases with insufficient runs, but does not explicitly state when not to use or directly name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_junitA
Parsea UN reporte JUnit XML y devuelve un resumen estructurado.
Usá esta herramienta cuando tengas la ruta a un archivo de resultados JUnit XML (lo que emiten pytest, Maven Surefire, Gradle, etc.) y quieras saber qué pasó en esa corrida: cuántos tests corrieron, cuáles fallaron y con qué mensaje, cuáles dieron error o se saltearon, y cuánto tardó cada suite. Para comparar varias corridas usá flakiness_report.
Args: path: ruta (absoluta o relativa al directorio del servidor) a un único archivo JUnit XML.
Returns: "totales" (tests, pasados, fallos, errores, salteados), "fallos" y "errores" (lista con test, classname, tipo y mensaje), "salteados" (con motivo), "suites" y "tiempo_segundos". Si el archivo no existe o el XML está malformado, la herramienta falla con un mensaje que explica el problema.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It does so by stating that if the file doesn't exist or XML is malformed, the tool fails with an explanatory message. It also outlines the return structure. However, it doesn't explicitly state that the tool is read-only (non-destructive), which is a minor gap but acceptable given the context.
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 moderately concise, with a clear first sentence, usage guidance, and parameter details. It could be slightly more compact (e.g., merging the parameter and return details), but it remains well-structured and informative without unnecessary fluff.
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 tool's simplicity (1 parameter, output schema exists), the description is complete. It covers purpose, usage, parameter semantics, return structure, and error behavior. The sibling tool is mentioned, providing full context for an agent to understand the tool's role.
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 only defines 'path' as a string. The description adds critical semantics: it specifies the path can be absolute or relative to the server directory, and that it must point to a single JUnit XML file. Since schema description coverage is 0%, the description fully compensates and adds value.
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 tool's purpose: 'Parsea UN reporte JUnit XML y devuelve un resumen estructurado.' It uses a specific verb ('parse') and resource ('JUnit XML report'), and distinguishes from sibling tool flakiness_report by noting it is for a single file, while flakiness_report is for comparing runs.
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 explicitly says when to use this tool ('cuando tengas la ruta a un archivo de resultados JUnit XML... y quieras saber qué pasó en esa corrida') and provides an alternative for different needs ('Para comparar varias corridas usá flakiness_report'). This clear guidance helps the agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quality_gateA
Decide pass/fail sobre reportes JUnit, con razones explícitas.
Usá esta herramienta cuando necesites una decisión accionable (por ejemplo, "¿se puede promover este build?") en vez de datos crudos. Con un solo archivo verifica los fallos de esa corrida; con un glob de varias corridas verifica además la proporción de tests flaky. La política de este gate es un ejemplo: los umbrales los define quien llama, y la decisión final sigue siendo de una persona.
Args: path: ruta a un reporte JUnit, o glob con varias corridas (por ejemplo "testdata/corridas/*.xml"). max_failures: máximo de tests fallidos (fallos + errores) tolerados en la última corrida (default 0). max_flaky_rate: proporción máxima de tests flaky sobre los tests clasificados, entre 0 y 1 (default 0.0; solo aplica con varias corridas). min_runs: mínimo de ejecuciones para clasificar un test (default 3).
Returns: "decision" ("pass" o "fail"), "aprobado" (bool), "razones" (lista de oraciones que explican cada verificación) y "verificaciones" (los valores medidos contra cada umbral).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| min_runs | No | ||
| max_failures | No | ||
| max_flaky_rate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses behavior: checks failures for single file, adds flaky check for multiple files, clarifies thresholds are caller-defined, and notes final decision is human. No destructive or side-effect info needed as it's a read-only analysis tool.
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?
Well-structured into purpose, usage, args, and returns. No unnecessary sentences. However, the first sentence could be slightly tighter (e.g., 'Decides pass/fail on JUnit reports with explicit reasons'). Still, it earns its space.
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 tool's complexity (4 params, output schema exists), the description covers usage scenarios, parameter meanings, and return fields. Minor gap: does not explain exact flaky rate calculation, but this is acceptable as an implementation detail. Overall sufficient 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 has 0% description coverage, so the description must compensate. It provides thorough explanations for all 4 parameters: path (with glob example), max_failures, max_flaky_rate (with range and applicability), min_runs (with default). This adds substantial meaning beyond the schema's basic types and defaults.
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 tool decides pass/fail on JUnit reports, differentiating it from sibling tools that provide raw data (flakiness_report, parse_junit). It specifies the resource (JUnit reports) and the action (decide pass/fail with explicit reasons).
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?
Explicitly states when to use (actionable decision vs raw data) and describes behavior with single vs multiple runs. Lacks explicit 'when not to use' but provides sufficient context through contrast with 'datos crudos' and sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: flakiness_report analyzes multiple runs for flaky tests, parse_junit details a single run, and quality_gate makes a pass/fail decision. Descriptions are detailed and avoid overlap.
Tool names use snake_case but lack a consistent verb_noun pattern: 'flakiness_report' and 'quality_gate' are noun_noun, while 'parse_junit' is verb_noun. This inconsistency could confuse agents expecting uniform conventions.
Three tools is well-scoped for a focused JUnit analysis toolbox. Each tool earns its place, covering core needs without redundancy or excess.
The tool set covers the full workflow: parsing a single report, comparing multiple reports for flakiness, and making a decision based on thresholds. No obvious gaps remain for the stated purpose.
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
Official MCP server for Qase — manage test cases, runs, suites, defects via AI tools.
MCP server for AI access to SmartBear tools, including BugSnag, Reflect, Swagger, PactFlow, QTM4J.
Scan any MCP server for tool-poisoning, security, auth & license. Trust score before install.
Conformance checker for MCP servers. Free, no key, verdicts recomputable and re-measured daily.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP-compliant server that enables the execution of pytest test suites and the storage of results into a QA platform database. It allows AI models to trigger test runs, track execution progress, and retrieve historical test data through specialized tool interfaces.1
- AlicenseBqualityDmaintenanceAutonomous QA testing MCP server that analyzes, fixes, and learns from test failures. Integrates with IDE and Slack to provide cause and fix in plain language.3125MIT
- AlicenseAqualityCmaintenanceAn MCP server that reads test reports and provides regression analysis tools for comparing runs, identifying regressions, fixes, and persistent failures.3MIT
- AlicenseAqualityAmaintenanceKeyless, local MCP server bringing ISTQB / OWASP / IEEE / ISO / EU AI Act QA standards into your AI client. Standards-grounded retrieval, deterministic QA effort estimation, automated QA document quality review (0-100 rubric), and JUnit/CSV test-results flakiness analysis.54Apache 2.0
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/fercarballo/mcp-qa-toolbox'
If you have feedback or need assistance with the MCP directory API, please join our Discord server