What is Squint?
Squint is a Playwright-based MCP server with four tools, ping, inspect_element, detect_visual_bugs and extract_tokens, that examines a rendered web page by crossing what the browser reports in its DOM and CSS with what is actually painted on screen. It flags clipped text, real contrast failures, overlaps, overflow and font fallbacks without needing a baseline screenshot to compare against.
It is an MCP server that examines a rendered web page by crossing what the browser reports in its DOM and CSS with what is actually painted on screen, and reports the visual problems it finds without needing a baseline to compare against.
It is built for coding agents that have just produced a UI and need to know whether the page actually looks right: which element is broken, and what the evidence is. It drives a real Chromium browser through Playwright.
What changes in an agent's output
- ping confirms the connection and returns the server name and version before anything else runs.
- inspect_element returns one element's computed styles, box model, sampled colors and a crop, so a single suspect element can be checked directly.
- detect_visual_bugs runs five checks across one or more viewports and returns findings ordered by severity, with crops as evidence.
- extract_tokens reads the colors, typography, spacing, radii and shadows a page actually uses, grouped into families with how many elements use each one.
The five visual bug checks
- text-clipped: text cut off by its own box.
- low-contrast-real: text contrast against the background sampled from the painted pixels, below WCAG 2.2 SC 1.4.3, so it is correct even over images and gradients.
- offscreen-overflow: the element making the page scroll horizontally.
- overlap: text another element is painted over, with how much is hidden and which element covers it.
- font-fallback: a declared web font that did not load, with how many elements render in a fallback font instead.
How the setup works
- Install
uvfirst; it installs Python 3.12 for you if it is missing. - Run
uvx --from squint-mcp playwright install chromiumto fetch the exact Chromium build Squint's Playwright expects. - Run
uvx squint-mcpto start the server, or register it directly in your MCP client's config. - Call
pingonce connected to confirm the server responds before running a check.
Who Squint is for
Best for
- Checking UI an agent just produced for clipped text, overlap, real contrast failures and font fallback, with evidence crops attached.
- Pulling the colors, type and spacing a rendered page actually uses, without reading the underlying source.
Not for
- Measuring a built page against an existing reference page's own layout contract property by property, a check pixelpact MCP Server runs instead of a baseline-free scan.
- Running a live mobile or desktop session to return contrast, touch target and overflow findings as plain text, a job uisight MCP Server already does for an exact selector fix.
- Comparing a rendered page against its own Figma frame using tokens and geometry rather than painted pixels, which Designfit MCP already covers with its own fix list.
- Taking a screenshot of a running site at several widths and fixing layout issues directly in source code, work Web Design Reviewer Skill takes on beyond flagging a bug.
Requirements
- Needs
uv, which installs Python 3.12 automatically if it is missing. - Needs Playwright's Chromium build, installed with
uvx --from squint-mcp playwright install chromium; on Linux, add--with-depsfor the system libraries Chromium needs. - The server speaks MCP over stdio and waits for a client; started by hand it just sits idle.
Connect Squint MCP: Catch Visual Bugs by Checking Pixels Against DOM and CSS to your AI client
uvx --from squint-mcp playwright install chromium
uvx squint-mcpInstall uv
Squint requires
uv. It installs Python 3.12 on its own if that is missing, so no separate Python setup is needed first.Install the matching Chromium build
Run
uvx --from squint-mcp playwright install chromiumso the Chromium downloaded is the exact one Squint's Playwright dependency expects. uv's warning thatplaywrightcomes from a dependency is expected. On Linux, add--with-depsto also install the system libraries Chromium needs.Start or register the server
Run
uvx squint-mcpto start it by hand, where it waits silently for a client over stdio, or add the config above to your MCP client directly.Register it in Claude Code
Run
claude mcp add squint -- uvx squint-mcp.Confirm the connection
Call
pingonce the server is registered; it returns the server name, version and the message you sent.
Client configuration
{"mcpServers": {"squint": {"command": "uvx", "args": ["squint-mcp"]}}}What you can do with it
- No baseline neededCrosses what the browser reports in DOM and CSS with what is actually painted, so a visual bug is found without comparing against a prior screenshot.
- Five visual bug checkstext-clipped, low-contrast-real, offscreen-overflow, overlap and font-fallback, each returned with severity and evidence.
- Contrast measured on real pixelslow-contrast-real samples the painted background instead of reading computed styles, so it is correct over images and gradients, checked against WCAG 2.2 SC 1.4.3.
- Single element inspectioninspect_element returns one element's computed styles, box model, sampled colors and a crop, for checking one suspect element directly.
- Design token extractionextract_tokens returns colors, typography, spacing, radii and shadows grouped into eight families, each value with how many elements use it.
- Shadow DOM aware scopingextract_tokens's scope selector reaches into open shadow roots, narrowing the reading to its matches and everything under them.
- Multi-viewport checksdetect_visual_bugs can run across several viewports in one call, with stabilization and crops reported per viewport.
- Built on PlaywrightDrives a real Chromium browser through Playwright rather than a headless rendering approximation, requiring Playwright's own Chromium build to be installed first.
Tools it exposes
ping
Confirms the connection and returns the server name, version and an echoed message.
inspect_element
Returns one element's computed styles, box model, sampled colors, a stabilization flag and a crop, for a URL, selector and optional viewport.
detect_visual_bugs
Runs five checks across one or more viewports and returns findings ordered by severity, each with crops as evidence.
extract_tokens
Reads the colors, typography, spacing, radii and shadows a rendered page actually uses, grouped into eight families with a use count per value.
Frequently asked questions
What is Squint MCP?
It is an MCP server that examines a rendered web page by crossing what the browser reports in its DOM and CSS with what is actually painted on screen. It has four tools: ping, inspect_element, detect_visual_bugs and extract_tokens, and needs no prior screenshot to compare against.
Does Squint need Playwright?
Yes. Squint drives a real Chromium browser through Playwright, and the matching Chromium build must be installed separately with uvx --from squint-mcp playwright install chromium before the server is useful, in addition to installing uv itself.
How do I install and connect it?
Install uv, run uvx --from squint-mcp playwright install chromium to fetch the matching Chromium build, then run uvx squint-mcp or register that same command in your MCP client's config. In Claude Code, claude mcp add squint -- uvx squint-mcp registers it directly.
Which checks does detect_visual_bugs run?
Five: text-clipped for text cut off by its own box, low-contrast-real for text contrast sampled from painted pixels against WCAG 2.2 SC 1.4.3, offscreen-overflow for the element causing horizontal scroll, overlap for text painted over by another element, and font-fallback for a declared web font that did not load.
What does extract_tokens return?
Colors by role, typography families, sizes, weights and line heights, spacing in pixels by role, radii and shadows, eight families in all. Each token includes how many elements use that exact value, and a scope selector can narrow the reading to one part of the page, including inside open shadow roots.
Why does it not need a baseline screenshot?
It compares the browser's own reported DOM and CSS against the pixels actually painted for the same page, so a bug such as clipped text or a failed contrast check shows up on its own, without a before version of the page to diff against.
Can it check more than one screen size at once?
Yes. detect_visual_bugs accepts an optional list of viewports in one call and returns findings for each of them, ordered by severity, along with a stabilization flag and up to five crops per viewport. That lets a single call cover a page at mobile, tablet and desktop widths instead of running the check three separate times and comparing the results by hand afterward.


