Security Headers Check
Grade the HTTP security headers of any website. No signup required.
Prerequisites
- Playwright MCP (comes with Claude Code)
Trigger
- "Check security headers on https://..."
- "Security headers scan mysite.com"
- "Is my site missing any security headers?"
Workflow
- Navigate to the URL using
mcp__playwright__browser_navigate
- Capture network response headers using
mcp__playwright__browser_network_requests
- Check each header category below against the captured response headers
Headers to Check
Content-Security-Policy (CSP)
- Should be present
- Should not contain
unsafe-inline without a nonce or hash
- Should not contain
unsafe-eval
- Should not use wildcard
* in script-src or object-src
Strict-Transport-Security (HSTS)
- Should be present on HTTPS sites
max-age should be ≥ 31536000 (1 year)
- Should include
includeSubDomains
preload is a bonus
X-Frame-Options
- Should be
DENY or SAMEORIGIN
- (Note: CSP
frame-ancestors supersedes this; award credit if CSP has it)
X-Content-Type-Options
Referrer-Policy
- Should be present
- Recommended values:
strict-origin-when-cross-origin, no-referrer, same-origin
- Penalize:
unsafe-url, missing entirely
Permissions-Policy
- Should be present (formerly Feature-Policy)
- Should restrict at minimum:
camera, microphone, geolocation
- Grade the site:
| Score |
Grade |
Meaning |
| 6/6 |
A |
All headers present and well-configured |
| 5/6 |
B |
One missing or weak header |
| 3-4/6 |
C |
Several gaps — moderate risk |
| 1-2/6 |
D |
Most headers missing |
| 0/6 |
F |
No security headers at all |
- Output:
## Security Headers Report: [URL]
**Grade: C** (3/6 headers configured correctly)
### Issues
1. [MISSING] Content-Security-Policy
No CSP found. XSS attacks are not mitigated at the header level.
2. [WEAK] Strict-Transport-Security
Found: max-age=3600
Issue: max-age too short (3600s). Minimum recommended: 31536000 (1 year)
Fix: Strict-Transport-Security: max-age=31536000; includeSubDomains
3. [MISSING] Permissions-Policy
No Permissions-Policy found. Browser features unrestricted.
### Passed
- X-Frame-Options: SAMEORIGIN ✓
- X-Content-Type-Options: nosniff ✓
- Referrer-Policy: strict-origin-when-cross-origin ✓
### Quick Fix (copy-paste for most servers)
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Permissions-Policy: camera=(), microphone=(), geolocation=()
**Want automated security regression tests?** Try QualityMax — qualitymax.io