Happo MCP server

Happo runs an MCP server that lets AI assistants (Claude, ChatGPT, Cursor, and other MCP-aware clients) inspect and resolve your visual-regression comparisons. The server speaks the standard Streamable HTTP transport and authenticates with OAuth 2.1, so most clients can connect with a single URL — you sign in once in your browser and the client takes it from there.

Your assistant already has your code and knows what each change was meant to do, so it brings the context and Happo brings the diffs. Happo never needs access to your repository.

Server URL

When prompted by your MCP client, paste this URL. The client will discover the OAuth endpoints automatically (via /.well-known/oauth-protected-resource) and open a browser window so you can sign in to Happo and pick which account the assistant should connect to.

What the assistant can do

  • list_comparisons_for_sha — given a commit SHA, find every comparison associated with it.
  • get_comparison_details — get the full set of diffs, added/deleted/ignored snapshots for a comparison between two reports, in the order the comparison page lists them, with targets and variants that made the same change folded together. Where Happo measured a diff, it also says how much changed, in how many places, and whether it is only anti-aliasing or a color change too small to see. An accessibility snapshot with violations to show also has a violationsScreenshotUrl: a picture of the part of the page they are in, where each failing element's rect places it.
  • get_diff_measurements — where chosen diffs changed, as a box in each image's own pixels, which content was added or removed, and everything else Happo stored when it measured them.
  • accept_comparison / reject_comparison — resolve a "needs review" comparison after inspecting the diffs. approve_comparison, its earlier name, still works.
  • accept_diff / reject_diff — accept or reject one diff, added snapshot or deleted snapshot, or several at once with pairs, such as a row of the review order and everything folded into it. Rejecting any one rejects the comparison; accepting all of them accepts it too, unless render errors or new accessibility violations block that, in which case it stays in review and the response names what blocks it. A rejection can carry a short note saying why, and get_comparison_details returns the notes reviewers left when they rejected a diff.
  • report_flake — mark a specific diff as a flake/spurious. This both ignores the diff and records a Flake row attributed to the connected user.
  • get_render_logs — read the logs from rendering a report, narrowed to one snapshot, a search or warnings and errors, to find out why a snapshot rendered wrong or differently between runs.

Setup

Claude Code

From the terminal:

Claude Code will print an authorization URL the first time you use any tool — open it, approve the consent screen, and you're connected.

Claude Desktop

Open Settings → Connectors → "Add custom connector" and paste the MCP URL above. Claude Desktop's built-in OAuth flow will walk you through the consent step.

Cursor

Add Happo as a remote MCP server using Streamable HTTP. You can use the global config file (~/.cursor/mcp.json) so Happo is available in every project, or add .cursor/mcp.json at a repository root to share the setup with your team.

Example mcp.json. The url must be the same as the server URL at the top of this page (for self-hosted Happo, use your deployment's origin instead of happo.io).

Save the file, then reload Cursor or toggle the Happo server under Settings → Features → Model Context Protocol. The first time you invoke a Happo tool, Cursor opens a browser so you can sign in to Happo and choose which account the assistant may use.

Permissions and revocation

When you authorize a client, you'll pick which Happo account the connection applies to. The assistant inherits your permissions for that account — it can read everything you can read, and accepting/rejecting comparisons is recorded against your user (just like clicking the buttons in the UI).

You can revoke any connection from the Connected applications section on your account's API tokens page.

Need help?