In-house flow
Build the design, then go and look
An agent implementing a design generates pixels and reasons in text. It will tell you the header is blue and centred while it renders red and left. Four items that make it read exact values, wait for the page to settle, actually look, and then keep looking after you have gone.
The failure this is for
The agent writes the component. It reads its own source back, confirms the class names say what it intended, and reports that the header is blue with the logo centred. The header renders red and left-aligned, because a parent rule won and nothing in this loop ever displayed a pixel.
This is not carelessness. The agent is generating a visual artifact while reasoning entirely in text, and the only feedback available to it is the text it just wrote. Of course it agrees with itself.
| The failure | What it looks like | What answers it |
|---|---|---|
| Measuring the design by eye | 12px read as "about 14", a shade off | the design as data |
| Screenshotting too early | compares against a loading skeleton | wait for the network to settle |
| Reasoning about pixels in prose | "I have implemented the blue header" | an actual render |
| The match rots | a refactor removes a label, silently | an assertion that re-runs |
The pair that looks redundant
Chrome DevTools and Playwright are the two items anybody would suspect of being the same item twice. They are not, and the distinction is worth having because it generalises past this stack.
Chrome DevTools is for looking. It drives a live browser inside the build loop and hands back a picture, a DOM, and a console, right now, interactively. Playwright's own README brags about needing no vision model, which sounds like a weakness in a stack about pixels and is exactly the point: an assertion over an accessibility tree is deterministic, cheap, and can be written to a file. One proves the match happened. The other stops it from silently un-happening.
The second one is the one people leave out. Everybody remembers to look at the screenshot once. Almost nobody turns that look into something the next refactor has to get past.
There is no visual diff tool here, on purpose
The obvious fifth item is a pixel-diff: something to compare the render against the design and return a similarity score. Its absence is the sort of thing a catalog papers over, so here is the actual reason.
Nothing first-party exists for it. Searching this catalog for pixelmatch, odiff, resemble, percy, backstop and visual regression returns single-digit-star personal forks and enormous skill-dump repositories that bundle thousands of unrelated files. Recommending one of those would be inventing rigour.
The better reason is that the job does not need a tool. The model already has vision. Putting the render next to the design and asking is the entire mechanism, and a similarity score would mostly launder that judgment into a number that looks more objective than it is. What the stack has to guarantee is that the agent looks at all, which is what the other four items are for.
Where the design lives
This reads the design through a community server rather than Figma's own Dev Mode MCP, and that is a deliberate trade rather than an oversight.
Figma's official server does something this one cannot: Code Connect, which maps the design's components onto the ones already in your codebase, so generated code reuses your button instead of inventing a second one. That is genuinely better output. It also assumes you have already done the Code Connect mapping, and it puts the richer tools behind a beta endpoint limited to an approved client list.
The item here needs a personal access token and nothing else. If your team has Code Connect set up, use theirs; the rest of this stack is unchanged either way.
Set it all up
4 of 4, in order
claude mcp add figma-context -- npx -y figma-developer-mcp
npx -y skills add anthropics/skills --skill webapp-testing
claude mcp add chrome-devtools -- npx -y chrome-devtools-mcp
claude mcp add playwright -- npx -y @playwright/mcpSome of these are the commands their projects publish and some are assembled from repository paths. Each one is labelled where it appears below. Nobody here has run them as a set.
How it goes
Their working order, our numbers
Read the design as data before building anything. Exact hex, exact spacing, the real type scale, and the actual icon files rather than the agent's redrawing of them. An agent working from a flattened screenshot is measuring by eye, and 12px padding read as "about 14" is a drift that lands in every property nobody thinks to check.
Figma Context MCPMCP server
GLips/Figma-Context-MCP/io.github.GLips/Figma-Context-MCP15,559★ repoMIT
claude mcp add figma-context -- npx -y figma-developer-mcpAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
Then learn when a screenshot is worth taking. This is the reconnaissance pattern: navigate, wait for the network to go quiet, and only then capture. Unglamorous, and it is the step whose absence produces the two worst outcomes below, a false mismatch against a loading skeleton and a false match against a half-painted page.
Webapp testingSkill
anthropics/skills/skills/webapp-testing164,354★ repono licenseno license
npx -y skills add anthropics/skills --skill webapp-testingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
Then look at it. A real Chrome, driven over the DevTools protocol, handing back the rendered screenshot, the DOM, the console and the network. This is the pivot of the whole flow: every other step produces a claim about the render, and this one produces the render.
Chrome DevTools MCPMCP server
ChromeDevTools/chrome-devtools-mcp/io.github.ChromeDevTools/chrome-devtools-mcp48,306★ repoApache-2.0
claude mcp add chrome-devtools -- npx -y chrome-devtools-mcpAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
Then stop it un-happening. Deliberately the opposite philosophy to the step above, and its README says so: accessibility tree rather than pixels, no vision model needed. That is what makes an assertion you can save and re-run. The step above proves the match today; this one is why it still holds after a refactor nobody connected to the design.
Playwright mcpMCP server
microsoft/playwright-mcp/io.github.microsoft/playwright-mcp35,714★ repoApache-2.0
claude mcp add playwright -- npx -y @playwright/mcpAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
More of these
Stacks are written by hand and there are not many. The catalog underneath is large, and its default ordering puts whatever has been picked at the front.