UNPKG

@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
"use strict"; 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"), };