Enter to open · arrow keys to move · results come from a build-time index, no network calls

The inspect_localhost_ui tool

VibeLens exposes exactly one tool. One tool with a small, bounded schema is called correctly far more often than a family of narrow ones — the reasoning is in ADR 0004.

Parameters#

ParameterTypeDefaultDescription
urlstring, requiredLocal URL such as http://localhost:3000/dashboard. A missing scheme is assumed to be http://.
viewportdesktop | tablet | mobiledesktopdesktop 1920x1080, tablet 820x1180 at 2x, mobile 390x844 at 2x with touch emulation.
delaynumber, 0 to 150001000Milliseconds to wait after load, for hydration, animation or data fetching.
fullPagebooleanfalseCapture the whole scrollable page instead of the viewport.

What it returns#

Two MCP content blocks. First an image block containing a base64 JPEG at quality 75, then a text block containing JSON:

json
{
  "summary": {
    "url": "http://localhost:3000/health",
    "pageTitle": "Service health",
    "viewport": "desktop (1920x1080)",
    "fullPage": false,
    "waitedMs": 1000,
    "captureMs": 1253,
    "consoleErrors": 1,
    "consoleWarnings": 0,
    "uncaughtPageErrors": 0,
    "failedRequests": 1,
    "domTruncated": false
  },
  "consoleLogs": [
    { "level": "error", "text": "Hydration failed...", "location": "http://localhost:3000/app.js:42:13" }
  ],
  "uncaughtPageErrors": ["TypeError: Cannot read properties of undefined"],
  "failedRequests": [
    { "url": "http://localhost:3000/avatar.png", "method": "GET", "failure": "HTTP 404", "status": 404 }
  ],
  "simplifiedDOM": "<body class=\"...\">...</body>"
}

The DOM snapshot comes last because it is by far the largest field: putting the diagnostics first means they survive any client-side truncation.

Limits it enforces#

LimitValueWhy
DOM snapshot20,000 charsHard cap, with an in-band marker so the model knows the tree is partial.
Text node160 charsLong body copy adds tokens but no layout signal.
Attribute300 charsKills base64 blobs and generated inline data.
Console entries40Per capture.
Console message600 charsPer entry.
Failed requests20Deduplicated by URL and failure.
Navigation30sBounded so a hung page cannot hang the session.

It is read-only#

The tool is annotated readOnlyHint. It observes a page: it cannot click, hover, type, scroll, submit a form or reach a public host. That constraint shapes every skill in the plugin — hover and :focus-visible styles are read from the source rather than observed, and anything behind an interaction has to be rendered by you first.

Errors you can act on#

Every failure comes back as a tool error carrying a code and a next step, never a stack trace: INVALID_URL, CONNECTION_REFUSED, DNS_FAILURE, UNSAFE_PORT, TIMEOUT, BROWSER_NOT_INSTALLED, BROWSER_LAUNCH_FAILED, UNKNOWN. Each one is documented with its cause and fix in Troubleshooting.

Prompts that work well#

text
Check localhost:3000 on mobile and tell me what breaks.
Look at localhost:5173/settings - the cards aren't aligned. Fix it.
Does localhost:3000/checkout throw anything in the console?
This page looks AI-generated. Tell me why, then fix the worst of it.
The accent is just default Tailwind blue - give me a real palette.
Compare localhost:3000 on desktop vs mobile and make the nav responsive.