check_pwa_readiness
Audit any URL to evaluate Progressive Web App readiness, assess compliance with PWA standards, and generate actionable insights for optimization. Supports desktop and mobile device emulation.
Instructions
Check Progressive Web App readiness and requirements
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device to emulate (default: desktop) | desktop |
| includeDetails | No | Include detailed metrics and recommendations | |
| url | Yes | URL to audit |
Implementation Reference
- src/tools/audit.ts:237-292 (handler)The MCP tool handler function for 'check_pwa_readiness' that calls the PWA helper, processes results, structures response, and handles errors.async ({ url, device, includeDetails }) => { try { const result = await checkPwaReadiness(url, device, includeDetails); const data: Record<string, unknown> = { pwaScore: result.pwaScore, fetchTime: result.fetchTime, includeDetails, }; if (includeDetails && "audits" in result) { data.audits = result.audits.map((audit) => ({ title: audit.title, score: audit.score !== null ? Math.round((audit.score || 0) * 100) : null, description: audit.description, displayValue: audit.displayValue || "N/A", })); } const structuredResult = createStructuredAudit("PWA Readiness Check", result.url, result.device, data, [ "Create a web app manifest file", "Implement service worker for offline functionality", "Ensure HTTPS deployment", "Add app icons for different platforms", "Configure viewport meta tag for mobile", ]); return { content: [ { type: "text" as const, text: JSON.stringify(structuredResult, null, 2), }, ], }; } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [ { type: "text" as const, text: JSON.stringify( { error: "PWA readiness check failed", url, device: device || "desktop", message: errorMessage, }, null, 2, ), }, ], isError: true, }; }
- src/tools/audit.ts:233-294 (registration)Registration of the 'check_pwa_readiness' tool with the MCP server inside registerAuditTools function.server.tool( "check_pwa_readiness", "Check Progressive Web App readiness and requirements", detailedAuditSchema, async ({ url, device, includeDetails }) => { try { const result = await checkPwaReadiness(url, device, includeDetails); const data: Record<string, unknown> = { pwaScore: result.pwaScore, fetchTime: result.fetchTime, includeDetails, }; if (includeDetails && "audits" in result) { data.audits = result.audits.map((audit) => ({ title: audit.title, score: audit.score !== null ? Math.round((audit.score || 0) * 100) : null, description: audit.description, displayValue: audit.displayValue || "N/A", })); } const structuredResult = createStructuredAudit("PWA Readiness Check", result.url, result.device, data, [ "Create a web app manifest file", "Implement service worker for offline functionality", "Ensure HTTPS deployment", "Add app icons for different platforms", "Configure viewport meta tag for mobile", ]); return { content: [ { type: "text" as const, text: JSON.stringify(structuredResult, null, 2), }, ], }; } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [ { type: "text" as const, text: JSON.stringify( { error: "PWA readiness check failed", url, device: device || "desktop", message: errorMessage, }, null, 2, ), }, ], isError: true, }; } }, );
- src/schemas.ts:48-52 (schema)Input schema (detailedAuditSchema) used for the tool, validating url, device, and includeDetails parameters.export const detailedAuditSchema = { url: baseSchemas.url, device: baseSchemas.device, includeDetails: baseSchemas.includeDetails, };
- src/lighthouse-categories.ts:48-64 (helper)Core helper function that executes Lighthouse PWA audit and returns base data or detailed audits.export async function checkPwaReadiness(url: string, device: "desktop" | "mobile" = "desktop", includeDetails = false) { const result = await runLighthouseAudit(url, ["pwa"], device); const categoryData = result.categories.pwa; const baseData = { url: result.url, device: result.device, pwaScore: categoryData?.score || 0, fetchTime: result.fetchTime, }; if (includeDetails) { const { audits } = await getDetailedAuditResults(url, "pwa", device); return { ...baseData, audits }; } return baseData;