@danielsogl/lighthouse-mcp
Version:
A comprehensive Model Context Protocol (MCP) server that provides web performance auditing, accessibility testing, SEO analysis, security assessment, and Core Web Vitals monitoring using Google Lighthouse. Enables LLMs and AI agents to perform detailed we
105 lines (104 loc) • 4.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.securityAuditSchema = exports.unusedJavaScriptSchema = exports.lcpOpportunitiesSchema = exports.resourceAnalysisSchema = exports.compareDevicesSchema = exports.performanceBudgetSchema = exports.coreWebVitalsSchema = exports.detailedAuditSchema = exports.basicAuditSchema = exports.auditParamsSchema = exports.baseSchemas = void 0;
const zod_1 = require("zod");
// Enhanced URL validation with security checks
const urlValidator = zod_1.z.string({ description: "URL to audit" }).refine((url) => {
try {
const parsed = new URL(url);
// Only allow HTTP and HTTPS protocols
return ["http:", "https:"].includes(parsed.protocol);
}
catch {
return false;
}
}, {
message: "Must be a valid HTTP or HTTPS URL",
});
// Reusable base schema components
exports.baseSchemas = {
url: urlValidator,
device: zod_1.z.enum(["desktop", "mobile"], { description: "Device to emulate (default: desktop)" }).default("desktop"),
throttling: zod_1.z.boolean({ description: "Whether to throttle the audit (default: false)" }).default(false),
categories: zod_1.z
.array(zod_1.z.enum(["performance", "accessibility", "best-practices", "seo", "pwa"], {
description: "Categories to audit",
}))
.optional(),
includeDetails: zod_1.z.boolean({ description: "Include detailed metrics and recommendations" }).default(false),
threshold: zod_1.z.number({ description: "Score threshold (0-100)" }).min(0).max(100).optional(),
};
// Composed schemas for each tool
exports.auditParamsSchema = {
url: exports.baseSchemas.url,
categories: exports.baseSchemas.categories,
device: exports.baseSchemas.device,
throttling: exports.baseSchemas.throttling,
};
exports.basicAuditSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
};
exports.detailedAuditSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
includeDetails: exports.baseSchemas.includeDetails,
};
exports.coreWebVitalsSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
includeDetails: exports.baseSchemas.includeDetails,
threshold: zod_1.z
.object({
lcp: zod_1.z.number().min(0).optional().describe("Largest Contentful Paint threshold in seconds"),
fid: zod_1.z.number().min(0).optional().describe("First Input Delay threshold in milliseconds"),
cls: zod_1.z.number().min(0).optional().describe("Cumulative Layout Shift threshold"),
})
.optional(),
};
exports.performanceBudgetSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
budget: zod_1.z.object({
performanceScore: exports.baseSchemas.threshold,
firstContentfulPaint: zod_1.z.number().min(0).optional().describe("FCP budget in milliseconds"),
largestContentfulPaint: zod_1.z.number().min(0).optional().describe("LCP budget in milliseconds"),
totalBlockingTime: zod_1.z.number().min(0).optional().describe("TBT budget in milliseconds"),
cumulativeLayoutShift: zod_1.z.number().min(0).optional().describe("CLS budget"),
speedIndex: zod_1.z.number().min(0).optional().describe("Speed Index budget in milliseconds"),
}),
};
exports.compareDevicesSchema = {
url: exports.baseSchemas.url,
categories: exports.baseSchemas.categories,
throttling: exports.baseSchemas.throttling,
includeDetails: exports.baseSchemas.includeDetails,
};
exports.resourceAnalysisSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
resourceTypes: zod_1.z
.array(zod_1.z.enum(["images", "javascript", "css", "fonts", "other"]))
.optional()
.describe("Types of resources to analyze"),
minSize: zod_1.z.number().min(0).optional().describe("Minimum resource size in KB to include"),
};
exports.lcpOpportunitiesSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
includeDetails: exports.baseSchemas.includeDetails,
threshold: zod_1.z.number().min(0).optional().describe("LCP threshold in seconds (default: 2.5)"),
};
exports.unusedJavaScriptSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
minBytes: zod_1.z.number().min(0).default(2048).describe("Minimum unused bytes to report (default: 2048)"),
};
exports.securityAuditSchema = {
url: exports.baseSchemas.url,
device: exports.baseSchemas.device,
checks: zod_1.z
.array(zod_1.z.enum(["https", "mixed-content", "csp", "hsts", "vulnerabilities"]))
.optional()
.describe("Specific security checks to perform"),
};