@nyx-intelligence/val-mcp
v0.12.0
Published
Val: a 100% MCP QA agent for vibecoders. Drives a real browser to catch UX bugs (broken links, 404s, console errors, broken images) so your coding agent can fix them.
Readme
Val: QA agent for vibecoded apps
Val is a paid MCP server that turns your coding assistant (Claude, Cursor, Codex, Windsurf) into a real QA engineer. It drives a real browser, reads your pull requests, runs deep audits, and files findings as PR comments with screenshots and reproduction steps.
npx -y @nyx-intelligence/val-mcp # MCP server on stdioRequires VAL_LICENSE_KEY. Subscribe at val.nyx-intelligence.com.
What makes Val different
Val is host-driven. The reasoning happens in your IDE's agent (Claude Opus 4.7, GPT-5, Cascade), and Val supplies the eyes, hands, and notebook:
- Eyes: real Chromium via Playwright. Screenshots, DOM, console, network.
- Hands: click every button, fill every form, walk multi-step funnels.
- Notebook: read PR diff via
gh, file findings as PR comments, dedupe against existing issues, sign 30-day screenshot URLs in Supabase.
You do not pay for an LLM on top of Val. Your coding agent does the reasoning over Val's structured output.
Install (MCP)
Add to your MCP client config (Claude Code, Cursor, Windsurf, Codex):
{
"mcpServers": {
"val": {
"command": "npx",
"args": ["-y", "@nyx-intelligence/val-mcp"],
"env": { "VAL_LICENSE_KEY": "vk_..." }
}
}
}First run downloads Chromium if needed (npx playwright install chromium).
Tools
Passive crawl
| Tool | What it does |
|---|---|
| val_scan | Crawl an app, same-origin links, report broken links, JS errors, broken images, layout overflow, CLS, a11y essentials |
| val_scan_devices | Same crawl on multiple device profiles (desktop, iPhone 14, Pixel 7). Mobile-only and desktop-only bugs are tagged accordingly |
| val_check | Re-run passive checks on a single page (fix verification) |
| val_screenshot | Capture a PNG of a URL (full-page or viewport, optional device emulation) |
Interactive session
| Tool | What it does |
|---|---|
| val_open | Open a URL in the persistent browser session |
| val_snapshot | List every clickable / fillable element with a stable [ref] |
| val_click | Click an element by [ref] or visible text. Reports nav, mutations, errors |
| val_type | Fill an input by [ref] or label |
| val_exercise | Click every visible button on the current page, flag dead controls |
| val_exercise_forms | Find every form, fill it with plausible data, submit, classify outcome |
| val_state | Current URL + title + any errors since the last action |
| val_close | Close the browser session |
Agentic QA
| Tool | What it does |
|---|---|
| val_review | One-shot: pass a URL or PR, Val runs the full battery and returns a structured report (status green / yellow / red, findings, markdown summary), posts to the PR if the target is one |
| val_pr_context | Read a PR via gh: title, body, files, diff, commits, linked issues, preview URL |
| val_describe | Structured snapshot of a page for the LLM: screenshot (signed 30d URL), DOM outline, visible text, console / page / network errors |
| val_act | Execute a planned sequence (click / type / scroll / wait / open / screenshot), returns a transcript with a screenshot per step |
| val_invariants | Watch a page for NaN / undefined / null / [object Object] / 5xx / page errors |
| val_a11y_audit | Run axe-core (WCAG 2.0/2.1 A + AA + best-practice). Returns each violation with impact, help, offending elements |
| val_lighthouse | Run a full Lighthouse audit (performance, accessibility, best-practices, SEO). Returns category scores and the core Web Vitals (LCP, FCP, TBT, CLS, Speed Index, TTI) |
| val_capture_network | Record every HTTP request the page fires for N seconds. Catches the "HTTP 200 with { ok: false }" class of bug |
| val_console | Record every console.log / warn / error / info plus uncaught errors for N seconds |
| val_compare | Snapshot two URLs (before / after) and diff their visible text. The host LLM judges if a fix actually landed |
| val_login | Log into an app with an email and password so every subsequent val tool runs as the authenticated user |
| val_detect_paywall | Detect Stripe, Paddle, LemonSqueezy, or Gumroad on the current page. Reports mode (test / live for Stripe) and whether Val can safely bypass with a test card |
| val_pay_stripe_test | If Stripe is in test mode, fill the Elements iframe with the 4242 test card. Refuses on live mode so a real charge never fires |
| val_file_finding | Post a finding as a PR comment (updating in place) or open a new issue |
| val_dedupe | Search existing issues before filing a duplicate |
| val_verify_fix | Bundle: read PR, infer touched routes, run describe + invariants on each, return for LLM judgement |
End-to-end agentic loop
You: "Test PR #42 on val.nyx-intelligence.com"
Claude → val_pr_context(#42)
→ "PR changes apps/web/src/app/checkout/page.tsx. Preview = pr-42.vercel.app."
Claude → val_describe(pr-42.vercel.app/checkout)
→ Screenshot + DOM. "Pay button looks like a placeholder Lorem ipsum."
Claude → val_act(pr-42.vercel.app/checkout, [
{ action: "click", target: "Pay" },
{ action: "type", target: "card", text: "4242 4242 4242 4242" },
{ action: "click", target: "Confirm" }
])
→ Transcript. "After Confirm, page went blank. Console error: undefined is not a function."
Claude → val_capture_network(pr-42.vercel.app/checkout, 8000)
→ "POST /api/checkout responded HTTP 200 with body { ok: false, error: STRIPE_KEY missing }."
Claude → val_dedupe("owner/repo", "checkout undefined function")
→ "No existing issue."
Claude → val_file_finding(#42, {
title: "Checkout fails with undefined error on Pay",
body: "Repro: ...",
screenshotUrl: "<from val_act>"
})
→ PR comment posted.Push the fix → Claude calls val_verify_fix(#42) → bundle → LLM judges "fixed" or "still broken".
Configuration
| Env var | Purpose |
|---|---|
| VAL_LICENSE_KEY | Your vk_... license. Required for every call. |
| VAL_API_BASE | Override the Val backend (default https://val.nyx-intelligence.com). For self-hosted only. |
The gh CLI must be installed and authenticated (gh auth login) on the machine running Val. PR comments and issues are posted as the authenticated user. A managed nyx-intelligence GitHub App is on the roadmap.
Test without an MCP client
val-mcp scan https://example.com 20
val-mcp scan-devices https://example.com "desktop,iPhone 14" 10
val-mcp exercise https://example.com
val-mcp exercise-forms https://example.comLicense
Source-available, commercial use requires an active Val subscription.
