Skip to main content
Glama
README.md
# Webby - Comprehensive Website Validator MCP Server

A Model Context Protocol (MCP) server that provides comprehensive website testing across performance, accessibility, SEO, and security dimensions.

## Features

### šŸš€ Performance Testing
- **WebPageTest** āœ… - Real browser testing via Playwright automation (300 tests/month free, no API key)
- **Google PageSpeed Insights** āœ… - Core Web Vitals and Google ranking signals (25K API calls/day free)
- **GTmetrix** āœ… - Lighthouse + custom metrics with historical tracking (requires API key)

### ♿ Accessibility Testing
- **Axe DevTools** āœ… - Fast WCAG scans via Playwright + axe-core (free, open-source)
- **WAVE** āœ… - WCAG compliance and contrast analysis (requires API key)

### šŸ” SEO Testing
- **PageSpeed Insights SEO** āœ… - Uses Lighthouse SEO (free, comprehensive)

### šŸ”’ Security Testing
- **Mozilla Observatory** āœ… - HTTP security headers analysis (CSP, HSTS) - Free API, 1 scan/min
- **SSL Labs** āœ… - Comprehensive SSL/TLS certificate testing - Free API (requires email)

## Installation

```bash
cd ~/mcp-servers/servers/src/webby
npm install
npm run build
```

## MCP Tools (11 Total)

### Performance Tools (3)

**`validate_performance_pagespeed`**
```typescript
{
  url: string,
  strategy?: 'mobile' | 'desktop',  // default: mobile
  apiKey?: string                   // optional, for higher quota
}
// Returns: Performance score, Core Web Vitals, metrics
```

**`validate_performance_webpagetest`** ✨ NEW
```typescript
{
  url: string,
  location?: string,              // e.g., 'Dulles:Chrome'
  runs?: number,                  // default: 1
  waitForResults?: boolean,       // default: false (returns test ID immediately)
  timeout?: number                // default: 300000 (5 min)
}
// Returns: Test ID + results URL immediately OR full results if waitForResults=true
// Metrics: Load Time, FCP, LCP, Speed Index, TTI, TBT, CLS, Performance Grade
```

**`validate_performance_gtmetrix`**
```typescript
{
  url: string,
  apiKey: string,                 // required
  location?: string,              // e.g., 'vancouver-canada'
  browser?: string                // e.g., 'chrome'
}
// Returns: Lighthouse score, PageSpeed score, load time, page size
```

### Accessibility Tools (2)

**`validate_accessibility_axe`**
```typescript
{
  url: string,
  wcagLevel?: string              // wcag2a, wcag2aa, wcag2aaa, wcag21aa, wcag22aa
}
// Returns: Violations by severity (critical, serious, moderate, minor), passes, incomplete
```

**`validate_accessibility_wave`**
```typescript
{
  url: string,
  apiKey: string,                 // required
  reporttype?: 1 | 2 | 3 | 4     // detail level (default: 2)
}
// Returns: Errors, contrast errors, alerts, WAVE report URL, credits remaining
```

### Security Tools (2)

**`validate_security_mozilla_observatory`**
```typescript
{
  url: string,
  forceRescan?: boolean           // default: false
}
// Returns: Grade (A+ to F), score, tests passed/failed, details URL
```

**`validate_security_ssl_labs`**
```typescript
{
  url: string,
  email: string,                  // required by API
  maxAge?: number,                // cached report age in hours
  startNew?: boolean,             // force new assessment
  waitForComplete?: boolean,      // wait for completion (can take 2-5 min)
  maxWaitMinutes?: number         // default: 5
}
// Returns: Grade (A+ to F), endpoint details, protocol info, status
```

### Category Runners (4)

**`validate_all_performance`**
```typescript
{
  url: string,
  pagespeedApiKey?: string,
  gtmetrixApiKey?: string,
  webpagetestEnabled?: boolean,        // enable browser automation
  webpagetestWaitForResults?: boolean  // wait for WPT completion
}
// Returns: Results from PageSpeed + optionally WebPageTest + optionally GTmetrix
```

**`validate_all_accessibility`**
```typescript
{
  url: string,
  waveApiKey?: string,            // optional
  wcagLevel?: string              // for Axe
}
// Returns: Results from Axe + optionally WAVE
```

**`validate_all_seo`**
```typescript
{
  url: string
}
// Returns: SEO analysis from PageSpeed Insights (Lighthouse SEO)
```

**`validate_all_security`**
```typescript
{
  url: string,
  email: string,                  // for SSL Labs
  waitForSSL?: boolean            // wait for SSL Labs completion
}
// Returns: Results from Mozilla Observatory + SSL Labs
```

### Master Runner (1)

**`validate_comprehensive`**
```typescript
{
  url: string,
  email: string,                  // required for SSL Labs
  categories?: string[],          // ['performance', 'accessibility', 'seo', 'security']
  pagespeedApiKey?: string,
  gtmetrixApiKey?: string,
  waveApiKey?: string,
  wcagLevel?: string,
  waitForSSL?: boolean
}
// Returns: Complete analysis across all selected categories with overall health score
```

## Response Format

```json
{
  "tool": "webpagetest",
  "success": true,
  "url": "https://example.com",
  "test_id": "250107_AiDcA4_ABC",
  "results_url": "https://www.webpagetest.org/result/250107_AiDcA4_ABC/",
  "status": "complete",
  "summary": {
    "loadTime": 2500,
    "firstContentfulPaint": 1200,
    "speedIndex": 2300,
    "largestContentfulPaint": 2100,
    "timeToInteractive": 3500,
    "totalBlockingTime": 250,
    "cumulativeLayoutShift": 0.05
  },
  "performance_grade": "A",
  "security_grade": "A+"
}
```

## Implementation Status

### āœ… Fully Implemented (9 tools)
- `validate_performance_pagespeed` - Google PageSpeed Insights API
- `validate_performance_webpagetest` - Playwright browser automation ✨
- `validate_performance_gtmetrix` - GTmetrix API
- `validate_accessibility_axe` - Playwright + axe-core
- `validate_accessibility_wave` - WAVE API
- `validate_security_mozilla_observatory` - Mozilla Observatory API
- `validate_security_ssl_labs` - SSL Labs API with polling
- `validate_all_*` - All 4 category orchestrators
- `validate_comprehensive` - Master orchestrator

### āœ… All Tools Functional
No placeholders - all 11 tools are fully implemented and working!

## API Quotas & Limits

| Tool | Free Limit | API Key Required | Implementation |
|------|------------|------------------|----------------|
| Mozilla Observatory | 1 scan/min per domain | No | āœ… Direct API |
| SSL Labs | Unlimited (rate limited) | Email only | āœ… Direct API |
| PageSpeed Insights | 25,000/day | Optional (free) | āœ… Direct API |
| WebPageTest | 300/month | No | āœ… **Browser automation** |
| GTmetrix | Limited credits | Yes (free tier) | āœ… Direct API |
| Axe | Unlimited | No | āœ… **Browser automation** |
| WAVE | Varies by plan | Yes (paid) | āœ… Direct API |

## Browser Automation

WebPageTest and Axe use **Playwright** for headless browser automation:

- **Singleton browser instance** - Reused across tests for efficiency
- **Configurable timeouts** - Default 5 minutes for WebPageTest, 1 minute for Axe
- **Graceful cleanup** - Browser closed on MCP server shutdown
- **No API keys needed** - Free access via web UI automation

## Project Structure

```
webby/
ā”œā”€ā”€ src/
│   ā”œā”€ā”€ performance/
│   │   ā”œā”€ā”€ pagespeed.ts          āœ… Google API
│   │   ā”œā”€ā”€ webpagetest.ts        āœ… Playwright automation
│   │   └── gtmetrix.ts           āœ… GTmetrix API
│   ā”œā”€ā”€ accessibility/
│   │   ā”œā”€ā”€ axe.ts                āœ… Playwright + axe-core
│   │   └── wave.ts               āœ… WAVE API
│   ā”œā”€ā”€ security/
│   │   ā”œā”€ā”€ mozilla-observatory.ts āœ… Mozilla API
│   │   └── ssl-labs.ts           āœ… SSL Labs API + polling
│   ā”œā”€ā”€ shared/
│   │   └── browser-utils.ts      āœ… Playwright utilities
│   └── orchestrator/
│       └── run-all.ts            āœ… All orchestrators
ā”œā”€ā”€ dist/                         # Compiled JavaScript
ā”œā”€ā”€ index.ts                      # Main MCP server entry
ā”œā”€ā”€ package.json
└── README.md
```

## Usage Examples

### Quick WebPageTest (instant response)
```typescript
validate_performance_webpagetest("https://example.com")
// Returns test ID immediately, check results later at provided URL
```

### Complete WebPageTest (wait for results)
```typescript
validate_performance_webpagetest("https://example.com", {
  waitForResults: true,
  timeout: 300000  // 5 minutes
})
// Waits for test completion, returns full metrics
```

### Run all performance tests
```typescript
validate_all_performance("https://example.com", {
  webpagetestEnabled: true,        // Enable browser automation
  webpagetestWaitForResults: false // Get test ID instantly
})
// Returns: PageSpeed + WebPageTest results
```

### Comprehensive validation
```typescript
validate_comprehensive("https://example.com", {
  email: "your@email.com",         // For SSL Labs
  categories: ["performance", "security"],
  webpagetestEnabled: true
})
// Returns: Full analysis with overall health score
```

## License

MIT

TDQS

B3.4/5.0

Scored across 12 tools

Disambiguation3/5

The tools have clear distinctions between categories (accessibility, performance, security, SEO) and specific tool implementations (e.g., Axe vs. WAVE), but there is significant overlap in the 'validate_all_' and 'validate_comprehensive' tools, which aggregate other tools and could cause confusion about when to use individual vs. bundled validations. The descriptions help clarify, but the redundancy creates ambiguity in tool selection.

Naming Consistency5/5

All tool names follow a consistent 'validate_' prefix with descriptive suffixes (e.g., 'accessibility_axe', 'performance_pagespeed'), using snake_case uniformly. This predictable pattern makes it easy for agents to understand the purpose and category of each tool at a glance, with no deviations in naming style.

Tool Count4/5

With 12 tools, the count is reasonable for a web validation server covering multiple domains (accessibility, performance, security, SEO), though it feels slightly heavy due to the inclusion of both individual and aggregated tools. The scope is well-defined, and each tool serves a specific purpose, but the aggregation tools add some bulk that might be streamlined.

Completeness5/5

The tool set provides comprehensive coverage for web validation, including multiple tools per category (e.g., three performance tools, two accessibility tools) and aggregated options for broader testing. There are no obvious gaps; agents can perform detailed or holistic validations across all key web quality aspects without dead ends.