Proč test spadl? Ať se AI asistent podívá sám
Test v Cypressu spadne a vy chcete, aby vám s tím pomohl AI asistent. Co následuje, zná každý: zkopírovat chybu z terminálu, vložit ji do chatu, asistent se zeptá, jak vypadala stránka, vy hledáte snímek obrazovky, a tak pořád dokola. Asistent umí test napsat, ale nevidí, co se při jeho běhu stalo.
Na to jsem napsal cypress-mcp, malý MCP server, přes který si asistent výsledky posledního běhu přečte sám.
Co už existuje a kde to končí
Cypress má pro AI asistenty dva vlastní nástroje:
cypress tapdává asistentovi přístup k otevřenému oknucypress open. Hodí se, když test právě píšete. Neumí bezhlavé běhycypress run, a tedy ani CI.- Cypress Cloud MCP čte běhy nahrané do Cypress Cloud. Potřebuje účet v cloudu a k lokálnímu běhu se nedostane.
Zbývá mezera: test běží bezhlavě, u vás nebo v pipeline, bez cloudu. A to je přesně situace, kdy padá nejčastěji.
Nastavení
Tři kroky. Nainstalovat:
npm install -D @miroslavmyrha/cypress-mcp
Zapojit plugin a podpůrný soubor:
// cypress.config.ts
import { defineConfig } from 'cypress'
import { cypressMcpPlugin } from '@miroslavmyrha/cypress-mcp/plugin'
export default defineConfig({
e2e: {
setupNodeEvents(on, config) {
cypressMcpPlugin(on, config)
},
},
})
// cypress/support/e2e.ts
import '@miroslavmyrha/cypress-mcp/support'
A říct asistentovi, kde server najde. V Claude Code:
claude mcp add cypress -- npx -y @miroslavmyrha/cypress-mcp --project /cesta/k/projektu
Od té chvíle si plugin při každém cypress run zapíše ke každému testu výpis příkazů a u testu, který spadl, uloží i stav stránky.
Jak to vypadá v praxi
Mějme test, který hledá počítadlo hotových úkolů:
it('shows a counter of finished items', () => {
cy.get('.todo-list li').first().find('input[type=checkbox]').check()
cy.get('[data-test=finished-count]').should('contain', '1')
})
Test spadne. Asistent zavolá nástroj get_last_run a dostane tohle (zkráceno):
{
"title": "Todo list > shows a counter of finished items",
"state": "failed",
"commands": [
{ "name": "visit", "message": "https://example.cypress.io/todo" },
{ "name": "get", "message": ".todo-list li" },
{ "name": "first", "message": "" },
{ "name": "find", "message": "input[type=checkbox]" },
{ "name": "check", "message": "" },
{ "name": "get", "message": "[data-test=finished-count]" }
],
"error": "AssertionError: Timed out retrying after 2000ms: Expected to find element: `[data-test=finished-count]`, but never found it."
}
Vidí tedy, které příkazy proběhly a na kterém to skončilo. Pak se podívá do stránky tak, jak vypadala ve chvíli pádu. Nástrojem query_dom se zeptá na selektor .todo-count:
{
"selector": ".todo-count",
"totalMatches": 1,
"results": [
{
"breadcrumb": "body > section.todoapp-wrapper > div.todoapp > footer.footer > span.todo-count",
"outerHTML": "<span class=\"todo-count\"><strong>1</strong> item left</span>"
}
]
}
Počítadlo na stránce je, jen pod jiným selektorem a s jiným textem, než test čekal. Asistent test opraví a nikdo nemusel nic kopírovat do chatu.
Co dalšího server umí
list_specsaread_specvypíšou a přečtou soubory s testy.get_screenshotvrátí snímek obrazovky z pádu jako obrázek.run_specspustí jeden soubor s testy a počká na výsledek.get_configpřečte nastavení Cypressu.
Dvě věci k bezpečnosti
Výsledky testů obsahují text z testované aplikace, a ten může obsahovat cokoli, včetně pokynů určených pro asistenta. Server proto vše, co pochází ze stránky, označí jako nedůvěryhodná data. Hodnoty, které vypadají jako hesla nebo tokeny, před odesláním začerní.
Kdy co použít
Píšete test a máte otevřený Cypress: cypress tap. Běhy nahráváte do Cypress Cloud: Cloud MCP. Testy běží bezhlavě a chcete vědět, proč jeden spadl: cypress-mcp.
Server je pod licencí MIT, vyvíjený a zkoušený s Cypressem 13.