npm @vertaaux/mcp-serverstdioMITupdated 2mo ago
The only MCP server with an autonomous audit, fix, and verify loop. Detects UX and accessibility issues across 7 categories, generates framework-aware patches (React, Vue, Angular, Svelte), opens atomic GitHub PRs via the Git Trees API, and verifies the fix landed in production. Built for CI/CD pipelines with policy-as-code thresholds.
What can you do with vertaaux mcp?
VertaaUX MCP Server
The only MCP server with an autonomous audit, fix, and verify loop. Detects UX and accessibility issues across 7 categories, generates framework-aware patches (React, Vue, Angular, Svelte), opens atomic GitHub PRs via the Git Trees API, and verifies the fix landed in production. Built for CI/CD pipelines with policy-as-code thresholds.
Why this server is different
verify_fixesloop: close the audit, fix, re-audit cycle without leaving the agent loop. Budget-capped at 3 iterations to prevent runaway billing.- Framework-aware patches:
suggest_fixdetects React/Vue/Angular/Svelte/Nuxt via the nearestpackage.jsonand emits idiomatic patches (JSX rewrites for React, HTML attrs preserved elsewhere). - Atomic Git Trees PRs:
generate_prapplies N patches in a single commit or zero. Conflict graph + AST gate (Babel, vue-eslint-parser, svelte/compiler) refuse unparseable patches before they reach the PR. - Deterministic finding IDs:
rule:hashformat stable across audit runs so agents can reference findings without storing state. - Multi-engine a11y:
audit_a11ycombines axe-core, AccessLint, and VertaaUX analyzers in a single call. - Policy-as-code:
policy_checkmirrors the GitHub Action's threshold evaluator exactly so CI and agent verdicts match.
Features
- 38 Tools across audit, fix, PR, schedule, webhook, policy, and a11y categories
- 7 Prompt Templates for common workflows
- 8 Resource URIs for audit data and UX guidelines
- Enterprise Controls: domain allowlist, rate limiting, PII redaction
- Dual Transport: stdio (CLI/Desktop) + HTTP streaming (web)
- Official MCP SDK: spec-compliant via
@modelcontextprotocol/sdk
Install
MCP Official Registry
npx -y @modelcontextprotocol/cli install io.github.PetriLahdelma/vertaaux-mcp
npm
npm install -g @vertaaux/mcp-server
VERTAAUX_API_KEY=vx_live_... vertaaux-mcp
Drift policy:
smithery.yaml,glama.json, andserver.jsonare auto-generated from the live MCP tool registry bynpm run generate:manifests. Never hand-edit them. Seedocs/REGISTRY-PUBLISHING.mdfor the runbook.
Quick Start
# Install & build
npm install && npm run build
# Run (stdio transport, for Claude Desktop, VS Code, Cursor)
VERTAAUX_API_KEY=vx_live_... npm start
# Run (HTTP transport, for web clients)
VERTAAUX_API_KEY=vx_live_... npm run start:http
IDE Integration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"vertaaux": {
"command": "node",
"args": ["/path/to/mcp-server/dist/index.js"],
"env": {
"VERTAAUX_API_KEY": "vx_live_..."
}
}
}
}
VS Code (with MCP extension)
Add to .vscode/settings.json:
{
"mcp.servers": {
"vertaaux": {
"command": "node",
"args": ["./mcp-server/dist/index.js"],
"env": {
"VERTAAUX_API_KEY": "vx_live_..."
}
}
}
}
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"vertaaux": {
"command": "node",
"args": ["/path/to/mcp-server/dist/index.js"],
"env": {
"VERTAAUX_API_KEY": "vx_live_..."
}
}
}
}
Environment Variables
| Variable | Required | Default | Purpose |
|---|---|---|---|
VERTAAUX_API_KEY |
Yes | ā | API authentication key |
VERTAAUX_API_BASE |
No | https://vertaaux.ai/api/v1 |
API endpoint URL |
PORT |
No | 8787 |
HTTP transport port |
GITHUB_TOKEN |
No | ā | GitHub API access for generate_pr |
Tools
Audit Tools (Core)
| Tool | Description |
|---|---|
audit_url |
Run UX & accessibility audit on a deployed URL. Returns top 5 issues with severity breakdown. |
audit_repo |
Static analysis on local codebase (React/Vue/Svelte/HTML). Finds missing alt text, unlabeled buttons/inputs/links. |
audit_artifact |
Audit from HAR files (response times, failed requests, large payloads) or Lighthouse JSON (accessibility findings). |
get_findings |
Retrieve findings from a completed audit with filtering by severity, rule, and pagination. |
get_audit |
Get audit job status and results by job ID. |
Fix & Verify Tools
| Tool | Description |
|---|---|
explain_finding |
Deep-dive into a finding: WCAG criteria, repro steps, fix guidance, before/after code examples. |
suggest_fix |
Generate search/replace patch with confidence score. Supports single and batch mode. |
generate_patch |
Generate accessibility fix patch for a specific issue from an audit. |
run_verification_suite |
Verify a patch fixes the issue without regressions via before/after audit. |
generate_pr |
Create a draft GitHub PR with fix patches. Requires GITHUB_TOKEN. |
create_pr_comment |
Generate a PR comment with suggestion blocks, ordered by severity. |
Analysis Tools
| Tool | Description |
|---|---|
analyze_component |
Heuristic UX review of component code (no browser needed). Checks images, buttons, inputs, links. |
run_llm_audit |
Provider-agnostic LLM audit (Mistral/OpenAI via Vertaa adapter). |
capture_screenshot |
Capture screenshot by running a quick audit. |
compare_competitors |
Compare UX metrics against competitor URLs with category-level score deltas. |
explain_issue |
Format an issue into developer-friendly markdown guidance. |
Management Tools
| Tool | Description |
|---|---|
create_webhook |
Register webhook for audit notifications. |
list_webhooks / delete_webhook |
Manage webhooks. |
create_schedule |
Cron-based scheduled audits with score threshold alerts. |
get_schedule / list_schedules / update_schedule / delete_schedule |
Manage schedules. |
get_quota |
Check plan and remaining credits. |
get_engines |
List available engine versions. |
Accessibility Tools (Multi-Engine)
| Tool | Description |
|---|---|
audit_a11y |
Multi-engine accessibility audit using axe-core, AccessLint, and custom analyzers. Returns WCAG-mapped findings with structured fix suggestions and fixability ratings. Supports min_impact filtering and mode (basic/standard/deep). |
diff_a11y |
Compare current accessibility findings against a saved baseline. Returns fixed, new, and unchanged findings with net change summary. Requires a prior audit_a11y call to establish the baseline. |
Deprecated
| Tool | Description |
|---|---|
run_audit |
DEPRECATED ā Use audit_url instead. |
Prompt Templates
Pre-built workflow prompts for common audit scenarios:
| Prompt | Description | Arguments |
|---|---|---|
quick_audit |
Audit a URL and summarize top issues with fix recommendations | url |
fix_accessibility |
Full audit ā patch ā PR comment workflow | url |
compare_ux |
Compare against competitors and identify UX gaps | url, competitors, industry? |
monitor_regression |
Set up scheduled monitoring with alerts | url, frequency? |
audit_codebase |
Static analysis on local codebase | path |
Resources
The server exposes MCP resources via vertaa:// URIs:
| URI Pattern | Description |
|---|---|
vertaa://audits/{auditId} |
Full audit result |
vertaa://audits/{auditId}/summary |
Lightweight summary |
vertaa://audits/{auditId}/findings/{findingId} |
Single finding detail |
vertaa://screenshots/{auditId} |
Screenshot metadata |
vertaa://screenshots/{auditId}/annotated |
Annotated screenshot |
vertaa://history/{encodedUrl} |
Audit history for URL |
vertaa://history/{encodedUrl}/trend |
Score trend analysis |
vertaa://guidelines/{topic} |
UX guidelines (buttons, forms, navigation, color-contrast, errors, content) |
Enterprise Controls
Configure domain allowlists, rate limits, and PII redaction programmatically:
import { configureEnterpriseControls } from './server.js';
configureEnterpriseControls({
allowlist: {
allowed_domains: ['*.example.com'],
denied_domains: ['internal.example.com'],
},
budget: {
max_requests: 100,
max_pages: 50,
max_duration_ms: 60000,
max_concurrency: 3,
},
redaction: {
redact_emails: true,
redact_phone_numbers: true,
redact_credit_cards: true,
custom_patterns: [
{ name: 'api_key', pattern: 'sk_[a-zA-Z0-9]{20,}', replacement: '[REDACTED]' }
],
},
});
Example: Audit-to-PR Workflow
1. audit_url({ url: "https://example.com", mode: "deep" })
ā Returns audit_id with top 5 issues
2. get_findings({ audit_id: "...", severity: "critical" })
ā Returns all critical findings with deterministic IDs
3. suggest_fix({ audit_id: "...", finding_id: "button-name:a1b2c3d4" })
ā Returns search/replace patch with 85% confidence
4. run_verification_suite({ url: "...", selector: "button.submit", rule_id: "button-name" })
ā Verifies fix resolves the issue
5. create_pr_comment({ file_path: "src/Button.tsx", patches: [...] })
ā Generates PR comment with suggestion blocks
Development
Project Structure
mcp-server/
āāā src/
ā āāā index.ts # Main entry, tool registration
ā āāā server.ts # MCP server config, resources, middleware
ā āāā a11y-tools.ts # Multi-engine a11y audit & baseline diffing tools
ā āāā http.ts # HTTP transport entry point
ā āāā prompts.ts # MCP prompt templates
ā āāā analysis.ts # Component analysis engine
ā āāā patch.ts # Patch generation
ā āāā verification.ts # Patch verification
ā āāā pr-comment.ts # PR comment generation
ā āāā tools/
ā ā āāā audit-url.ts # audit_url tool
ā ā āāā audit-repo.ts # audit_repo tool (static analysis)
ā ā āāā audit-artifact.ts # audit_artifact tool (HAR/Lighthouse)
ā ā āāā get-findings.ts # get_findings tool
ā ā āāā explain-finding.ts# explain_finding tool
ā ā āāā suggest-fix.ts # suggest_fix tool
ā ā āāā generate-pr.ts # generate_pr tool
ā ā āāā index.ts # Tool exports
ā āāā transports/
ā ā āāā stdio.ts # Stdio transport (default)
ā ā āāā http.ts # HTTP streaming transport
ā āāā middleware/
ā ā āāā allowlist.ts # Domain/path allowlist
ā ā āāā budget.ts # Rate limiting & quotas
ā ā āāā redaction.ts # PII redaction
ā ā āāā index.ts # Middleware stack
ā āāā resources/
ā ā āāā audit-results.ts # vertaa://audits/* resources
ā ā āāā screenshots.ts # vertaa://screenshots/* resources
ā ā āāā historical.ts # vertaa://history/* resources
ā ā āāā legacy.ts # Guidelines resources
ā ā āāā index.ts # Resource exports
ā āāā schemas/
ā ā āāā audit.ts # Audit schemas (mode, findings)
ā ā āāā findings.ts # Finding schemas
ā ā āāā controls.ts # Enterprise control schemas
ā ā āāā errors.ts # Error schemas
ā ā āāā index.ts
ā āāā utils/
ā ā āāā error-recovery.ts # Structured errors with recovery guidance
ā ā āāā change-tracker.ts # Baseline change tracking
ā ā āāā deterministic-id.ts # Stable finding IDs
ā āāā index.test.ts # Test suite
āāā README.md
āāā package.json
āāā tsconfig.json
āāā vitest.config.ts
Testing
npm test # Run test suite
npm run test:watch # Watch mode
npm run test:coverage # Coverage report
Building
npm run build # TypeScript ā dist/
Error Handling
All errors include structured recovery guidance:
{
"code": "AUDIT_NOT_FOUND",
"message": "Audit abc123 not found.",
"recovery": {
"action": "Start a new audit for this URL",
"tool": "audit_url",
"params": { "url": "https://example.com" }
}
}
Error codes follow JSON-RPC 2.0: -32700 (parse), -32600 (invalid request), -32601 (method not found), -32602 (invalid params), -32603 (internal error).
API Reference
The MCP server communicates with the VertaaUX API v1. See the API Documentation.
License
MIT
Install
Add vertaaux mcp to your client. Pick the one you use.
claude mcp add mcp-server -- npx -y @vertaaux/mcp-servercodex mcp add mcp-server -- npx -y @vertaaux/mcp-serveramp mcp add mcp-server -- npx -y @vertaaux/mcp-server{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"mcp-server","command":"npx","args":["-y","@vertaaux/mcp-server"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"mcp-server": {
"command": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"mcp-server": {
"type": "local",
"command": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"mcp-server": {
"command": {
"path": "npx",
"args": [
"-y",
"@vertaaux/mcp-server"
]
}
}
}
}Add to your Zed `settings.json`.
npx -y @vertaaux/mcp-serverRun `goose configure`, choose **Add Extension ā Command-line Extension**, and paste this command.
Score
78 / 100
Good
- Documentation25/25
- Maintenance22/25
- Trust16/20
- Capability3/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 76 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint ā no local install
Version history
| Versions | Published |
|---|---|
| 1.2.2Latest | May 12, 2026 |
| 1.2.1 | May 6, 2026 |
| 1.1.1 | Apr 9, 2026 |