cypress tap: Closing the Loop Between Your Agent and Your Suite Cypress has introduced 'cypress tap', a set of CLI commands that let developers and AI agents read and drive an open Cypress session from the terminal, bridging the gap between an agent and the live DOM. The tool provides subcommands for sessions, specs, status, running tests, and inspecting the DOM, all without requiring configuration or an MCP server. Developer David Ingraham demonstrated the tool by deliberately breaking a test and using 'cypress tap' to diagnose the failure entirely from the terminal. Your agent can write the test and run the test. Until now, it couldn't see the page. Test failures will happen. Flake will happen. Writing new tests against a product deadline will happen. We've all been there and will be there again in the future. Software development is predictable that way, and completely fluid at the same time, which is what makes every day a slightly different problem than the one before it. As we've all started folding AI into that work, we've learned it's extremely good at producing a lot of code, fast. And one rule has held up better than any other: the better your inputs and the more context the tool has, the better the output. That's the whole reason we encode conventions as Skills, point agents at tickets through MCP, and hand them our patterns instead of hoping they guess right. But there's a ceiling, and it shows up the moment the agent has to work against a running app. When it's debugging a broken test or writing a new one, it can't see the DOM. It sees whatever I paste in. No matter how good the Skills are or how well-structured the repo is, the agent is reasoning about a page it has never actually looked at. That's the gap, and it sits in the middle of a loop we all run every day: Steps 1, 2, and 4 have been handled for a while now. Step 3 was me, until now. cypress tap https://docs.cypress.io/app/references/command-line cypress-tap is a set of CLI commands that read and drive an open-mode Cypress session from your terminal. Setup is two terminals. cypress open in one, cypress tap from the same project root in the other. No config, no server, no MCP. The subcommands split into three jobs: sessions , specs , status , run reporter , command pin , dom , aria , inspect Everything prints readable output by default and machine-readable JSON with --json . The thing worth noticing is what isn't in that list. There's no tap write . No tap fix . No tap generate . It takes the context the Cypress app was already showing you on screen and puts it somewhere a terminal, or an agent working in one, can actually reach. I have a fake pet adoption site I use for testing out new automation features and for creating workshops against. This exciting new feature was one I hooked up to that repo. To demo what tap actually does, I needed something red to point at, so I broke it deliberately: I renamed an app-side data-testid from favorite-button- to favorite-toggle- and left the spec untouched. Deliberately simple, too. The point here isn't the puzzle in the break, it's how the agent utilizes cypress tap to get to the solution and how this new approach can be scaled to more complicated, real-life scenarios. Here's the whole diagnosis, terminal only. 1. Is there a session I can reach? cypress tap drives an already-open Cypress, so first prove one exists using tap sessions . bash $ npx cypress tap sessions SESSIONS 1 PID PROJECT TYPE BROWSER 29426 /Users/davidingraham/repos/pet-adoption-portal e2e Chrome 2. What can it run? Using tap specs it identifies the open spec from the runner. bash $ npx cypress tap specs SPECS 1 cypress/e2e/favorites.cy.js 9 minutes ago 3. Trigger the failure. Next it runs the open spec so it can capture the current output. bash $ npx cypress tap run cypress/e2e/favorites.cy.js ▶ cypress/e2e/favorites.cy.js 4. The failure as text. The bare reporter command returns the suite summary. As you can see, I only ran one test and I knew it was going to fail. I imagine when you are actively working on building multiple tests at once, the reporter command will be a great translator between what is happening in the runner and what the agent knows as changes are made. bash $ npx cypress tap reporter cypress/e2e/favorites.cy.js started at 7:21:21 PM ✓ -- ✖ 1 ○ -- 00:04 Favorites Feature r3 ✖ adds a pet to favorites 4.2s 5. Expand the failing test. The agent can pass in additional flags to expand on what happened at each step, all the way up until the captured failure. Note the test id, r3 , which every command from here on scopes to. bash $ npx cypress tap reporter --test-id r3 ✖ Favorites Feature adds a pet to favorites failed ROUTES 1 METHOD MATCHER STUBBED ALIAS POST /api/favorites/ no addFavorite - BEFORE EACH · h1 1 request ● POST 200 http://localhost:3000/api/auth/login 2 request ● GET 200 http://localhost:3000/api/favorites 3 visit /pets TEST BODY · r3 1 get data-testid="pets-grid" e1 xhr ● GET 200 http://localhost:3000/api/auth/me e2 xhr ● GET 200 http://localhost:3000/api/auth/me e3 xhr ● GET 200 http://localhost:3000/api/pets?species=&age=&size=&gender=&search=&sortBy=dateAdded&sortOrder=desc&page=1 e4 xhr ● GET 200 http://localhost:3000/api/favorites 2 -assert expected