Všechny články
12. října 2026

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 tap dává asistentovi přístup k otevřenému oknu cypress open. Hodí se, když test právě píšete. Neumí bezhlavé běhy cypress 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_specs a read_spec vypíšou a přečtou soubory s testy.
  • get_screenshot vrátí snímek obrazovky z pádu jako obrázek.
  • run_spec spustí jeden soubor s testy a počká na výsledek.
  • get_config př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.

© 2026 Myrha Software