qualien-mcp
Puerta de enlace MCP para trabajo de QA/SDET: Playwright, sistema de archivos, GitHub, Jira, Postgres y más de 15 servidores MCP detrás de una sola conexión, con permisos de permitir/denegar por herramienta y bases de datos de solo lectura por defecto.
Documentación
qualien-mcp
Un servidor MCP que le brinda a tu asistente de IA un kit de herramientas de QA: Playwright, tus archivos de prueba, GitHub, Jira, Postgres y más, detrás de una sola conexión.
qualien-mcp es una puerta de enlace MCP compuesta para trabajo de SDET/QE. Agrega servidores del Protocolo de Contexto de Modelo detrás de una conexión, con un catálogo curado de 21 servidores relevantes para pruebas, permisos de permitir/denegar por herramienta y salvaguardas de solo lectura por defecto. Agrega un servidor a Claude Code, Claude Desktop, Cursor o VS Code en lugar de cinco.
npx qualien-mcp
De fábrica, sirve el par inicial de QE: Playwright MCP (automatización de navegador, DOM, capturas de pantalla) y Filesystem MCP (lectura/edición de archivos de proyecto, objetos de página, utilidades de prueba), con configuración cero. Las herramientas se exponen a tu asistente con el espacio de nombres playwright__… y filesystem__….
¿Por qué una puerta de enlace?
Tu asistente ya puede conectarse directamente a muchos servidores MCP, por lo que una puerta de enlace se gana su lugar haciendo lo que un montón de servidores no puede:
- Un solo punto final para agregar a cualquier cliente (Claude Code, Claude Desktop, Cursor, …).
- Curación: habilitar/deshabilitar por servidor y por herramienta. Menos herramientas, mejor nombradas = mejor selección de herramientas por parte del modelo (arrojarle 200 herramientas lo empeora peor).
- Una superficie de enrutamiento/registro: cada llamada se registra en stderr con el servidor descendente, la herramienta y la latencia.
- Ciclo de vida limpio: inicia cada servidor descendente como un proceso hijo y los cierra todos al salir (sin procesos de navegador huérfanos).
- Curado para QE: un kit de herramientas SDET con opinión, no un proxy genérico.
Úsalo con tu asistente
Claude Code:
claude mcp add qualien -- npx -y qualien-mcp
o en .mcp.json / configuración de usuario:
{
"mcpServers": {
"qualien": { "command": "npx", "args": ["-y", "qualien-mcp"] }
}
}
Claude Desktop (claude_desktop_config.json) y Cursor (~/.cursor/mcp.json o .cursor/mcp.json): la misma forma bajo mcpServers.
VS Code (.vscode/mcp.json):
{
"servers": {
"qualien": { "command": "npx", "args": ["-y", "qualien-mcp"] }
}
}
Esa única entrada le da a tu asistente todas las herramientas de cada servidor agregado.
Agrega más servidores
Coloca un qualien-mcp.config.json en tu directorio de trabajo (o pasa --config <path>). Las entradas se fusionan sobre los valores predeterminados integrados: redefine una clave para cambiarla, o establece enabled: false para desactivar un valor predeterminado. No se necesita una nueva versión.
{
"servers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/abs/path/to/allow"]
},
"sequential-thinking": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
},
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@latest"]
},
"playwright": {
"command": "npx",
"args": ["-y", "@playwright/mcp@latest"],
"tools": { "deny": ["browser_close"] }
}
}
}
Consulta qualien-mcp.config.example.json para ver la forma completa (command, args, env, enabled, tools.allow / tools.deny).
Catálogo integrado
qualien-mcp incluye un catálogo curado de 21 servidores conocidos (cada uno verificado contra npm), por lo que puedes habilitar uno por clave solo con tus secretos, sin necesidad de recordar paquetes o comandos:
{
"servers": {
"chrome-devtools": { "enabled": true },
"postgres": { "enabled": true, "env": { "DATABASE_URI": "postgres://…" } },
"slack": { "enabled": true, "env": { "SLACK_MCP_XOXP_TOKEN": "xoxp-…" } }
}
}
Ejecuta npx qualien-mcp catalog para listarlos todos con lo que cada uno necesita. Catálogo actual:
| Clave | Qué hace | Necesita |
|---|---|---|
playwright (predeterminado) | Automatización de navegador, DOM, capturas de pantalla | — |
filesystem (predeterminado) | Leer/editar archivos de proyecto | un directorio permitido (por defecto, el directorio de trabajo) |
github | PRs, issues, revisión de código | login github (ver abajo) |
sequential-thinking | Razonamiento estructurado / depuración | — |
memory | Grafo de conocimiento persistente | — |
chrome-devtools | Red, consola, rendimiento, almacenamiento | — |
postgres | SQL / validar datos de backend | DATABASE_URI |
mysql | SQL / validar datos de backend | variables de entorno de MySQL |
slack | Leer/publicar en Slack | SLACK_MCP_XOXP_TOKEN |
docker | Gestionar contenedores | demonio de Docker |
kubernetes | Inspeccionar/operar un clúster | kubeconfig |
openapi | Manejar cualquier API REST desde su especificación | API_BASE_URL, OPENAPI_SPEC_PATH |
jira | Leer/actualizar issues de Jira | token de API de Atlassian en variable de entorno |
figma | Leer diseños de Figma | FIGMA_API_KEY |
confluence | Planes de prueba, notas de versión, documentación viva | token de API de Atlassian en variable de entorno |
azure-devops | Elementos de trabajo, repos, pipelines, planes de prueba | tu organización de ADO como argumento + inicio de sesión |
selenium | Manejar un navegador mediante Selenium WebDriver | un navegador + controlador en PATH |
webdriverio | Automatización de navegador y móvil nativo | — (credenciales de nube opcionales) |
browserstack | Nube real de navegador/dispositivo; leer ejecuciones de prueba | BROWSERSTACK_USERNAME, BROWSERSTACK_ACCESS_KEY |
ms-365 | Excel, Word, Outlook, Teams, SharePoint | AZURE_CLIENT_ID, AZURE_TENANT_ID |
sentry | Errores reales visibles por el usuario → nuevas pruebas | un token de autenticación de Sentry |
use monta un servidor del catálogo bajo una clave diferente (por ejemplo, dos bases de datos): { "db-prod": { "use": "postgres", "enabled": true, "env": {…} } }. Cualquier cosa que no esté en el catálogo la defines por completo (command/args o type/url).
Servidores remotos y OAuth (por ejemplo, GitHub)
Los servidores descendentes pueden ser remotos (HTTP Streamable) además de locales. Un servidor remoto es { "type": "http", "url": "…" }, y si necesita OAuth, cada usuario inicia sesión con su propia cuenta: los tokens se almacenan por usuario en ~/.qualien-mcp/credentials.json (0600), en la máquina de ese usuario, y nunca se agrupan, comparten ni envían a ningún lugar por qualien-mcp.
El MCP alojado de GitHub es el caso de referencia, y no necesita configuración más allá de un comando:
- Actívalo en
qualien-mcp.config.json:{ "servers": { "github": { "enabled": true } } } - Autoriza una vez:
npx qualien-mcp login github
login imprime un código corto y una URL; lo apruebas en github.com y listo. No hay una aplicación OAuth que registrar ni un secreto de cliente en ningún lugar.
¿Por qué el flujo de dispositivo?
GitHub requiere un client_secret para intercambiar un código de autorización: PKCE no elimina eso, porque GitHub no distingue entre clientes públicos y confidenciales. qualien-mcp se distribuye en npm, por lo que un secreto en el paquete sería un secreto publicado. El flujo de dispositivo es la única concesión que GitHub permite sin un secreto, y es la concesión que GitHub recomienda para CLI. Por lo tanto, qualien-mcp solo incluye un id de cliente público: un identificador, no una credencial, y los tokens de cada usuario se acuñan en su propia máquina y permanecen allí.
Para usar tu propia aplicación OAuth de GitHub en lugar de la incluida, establece clientId (y habilita el flujo de dispositivo en ella en Configuración → Configuración de desarrollador → Aplicaciones OAuth):
{
"servers": {
"github": { "clientId": "<your client id>", "enabled": true }
}
}
Si un servidor remoto aún no ha iniciado sesión, la puerta de enlace lo omite con una pista (run: npx qualien-mcp login github) y sigue sirviendo todo lo demás: nunca bloquea el inicio. Los servidores que admiten registro dinámico de clientes no necesitan clientId en absoluto.
Seguro por defecto
qualien-mcp aplica salvaguardas de forma centralizada, antes de reenviar una llamada, por lo que se mantienen sin importar lo que permita el servidor descendente, y las herramientas compuestas tampoco pueden omitirlas:
- Las bases de datos son de solo lectura: las llamadas
postgres/mysqlque contienen SQL de escritura/DDL (INSERT/UPDATE/DELETE/DROP/…) se rechazan. Opta por participar con{ "postgres": { "readOnly": false } }. - Raíces del sistema de archivos:
{ "filesystem": { "roots": ["./src", "./tests"] } }rechaza cualquier llamada cuyo argumento de ruta escape de esos directorios. - Herramientas de infraestructura destructivas bloqueadas: las herramientas
docker/kubernetescuyo nombre parezca destructivo (delete/remove/prune/kill/…) se rechazan a menos que{ "allowDestructive": true }. - Además, curación por servidor de
tools.deny/tools.allow.
Alcance honesto: estas detienen a un LLM de causar daño accidentalmente. La verificación de SQL se basa en palabras clave (heurística), no en un analizador sintáctico: no es un sandbox adversarial. El aislamiento real requiere los permisos propios del servidor descendente o un contenedor.
Herramientas QE compuestas
Más allá del paso directo, qualien-mcp incluye herramientas que implementa él mismo (espacio de nombres qe__) que orquestan varios servidores descendentes en una sola llamada: el beneficio QE de una puerta de enlace.
qe__verify_api_vs_db: consistencia integral API↔DB en una sola llamada. Dale dos subllamadas (herramientas con espacio de nombres que puedes descubrir mediante tools/list); ejecuta ambas y compara las cargas útiles:
{
"api": { "tool": "openapi__getUser", "arguments": { "id": 1 } },
"db": { "tool": "postgres__query", "arguments": { "sql": "select id, name from users where id = 1" } },
"match": "subset" // every field the DB returns must match the API (default)
}
// → { "match": false, "differences": [ { "path": "name", "api": "Ann", "db": "Bob" } ], … }
Las herramientas compuestas aparecen solo cuando sus servidores descendentes requeridos están conectados (qe__verify_api_vs_db necesita un servidor database). Habrá más (reproducir desde Jira, objeto de página desde URL, clasificación de pruebas inestables).
Cómo funciona
En un solo proceso, qualien-mcp es a la vez un servidor MCP para tu asistente y un cliente MCP para cada servidor descendente:
assistant ⇄ qualien-mcp ⇄ playwright-mcp
⇄ filesystem-mcp
⇄ …
tools/listse distribuye a cada servidor descendente, filtra según tus reglas de curación y asigna espacio de nombres a cada uno como<server>__<tool>.tools/callenruta por ese prefijo al servidor propietario y pasa la respuesta directamente.- Los recursos y avisos se agregan de la misma manera cuando un servidor descendente los proporciona.
- Un servidor descendente que no se inicia se registra y se omite: la puerta de enlace sigue sirviendo el resto.
- Los registros van a stderr (stdout es el protocolo); tu host los muestra en sus registros MCP.
Hoja de ruta
- ✅ Playwright + Filesystem, espacios de nombres, curación, registro, ciclo de vida limpio
- ✅ Catálogo de 21 servidores configurable, servidores remotos/OAuth (GitHub mediante flujo de dispositivo), salvaguardas seguras por defecto,
qe__verify_api_vs_db - Siguiente: más herramientas QE compuestas (reproducir desde Jira, objeto de página desde URL, clasificación de pruebas inestables)
Comentarios
¿Encontraste un error, quieres que se agregue un servidor al catálogo o tienes una idea? Envía un correo a contact@qualien.ai o abre un issue. qualien-mcp es parte de qualien.ai, que también crea agentes de IA que prueban aplicaciones web (Olympus) y aplicaciones nativas de Android (Pulse) desde inglés sencillo.
Licencia
MIT