Skip to main content
Glama
enemyrr

MCP Server Pagespeed

analyze_pagespeed

Analyze webpage performance using Google PageSpeed Insights to identify optimization opportunities and improve loading speed.

Instructions

Analyzes a webpage using Google PageSpeed Insights API

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to analyze

Implementation Reference

  • index.ts:70-139 (handler)
    The core handler function for the 'analyze_pagespeed' tool. It fetches PageSpeed Insights data from Google's API, processes Lighthouse audits to extract low-scoring insights, computes performance score and loading metrics, sorts insights, and returns a formatted JSON text response with summary, loading experience, and top improvements.
    if (request.params.name === 'analyze_pagespeed') {
        const { url } = request.params.arguments as { url: string };
    
        try {
            const response = await axios.get<any>(
                `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${encodeURIComponent(url)}`
            );
    
            const result = response.data;
            const processedResult: ProcessedPageSpeedResult = {
                performanceScore: Math.round(result.lighthouseResult.categories.performance.score * 100),
                insights: [],
                loadingExperience: {
                    firstContentfulPaint: {
                        category: result.loadingExperience?.metrics?.FIRST_CONTENTFUL_PAINT_MS?.category || 'N/A',
                        percentile: result.loadingExperience?.metrics?.FIRST_CONTENTFUL_PAINT_MS?.percentile || 0
                    },
                    firstInputDelay: {
                        category: result.loadingExperience?.metrics?.FIRST_INPUT_DELAY_MS?.category || 'N/A',
                        percentile: result.loadingExperience?.metrics?.FIRST_INPUT_DELAY_MS?.percentile || 0
                    }
                }
            };
    
            // Process audits and extract insights
            const audits = result.lighthouseResult.audits;
            for (const [key, audit] of Object.entries(audits)) {
                const typedAudit = audit as any;
                if (typedAudit.score !== null && typedAudit.score < 1) {
                    processedResult.insights.push({
                        score: typedAudit.score,
                        title: typedAudit.title,
                        description: typedAudit.description,
                        displayValue: typedAudit.displayValue
                    });
                }
            }
    
            // Sort insights by score (lowest first)
            processedResult.insights.sort((a, b) => a.score - b.score);
    
            return {
                content: [
                    {
                        type: 'text',
                        text: JSON.stringify({
                            summary: `Your page performance score is ${processedResult.performanceScore}/100`,
                            loadingExperience: {
                                firstContentfulPaint: `${processedResult.loadingExperience.firstContentfulPaint.category} (${processedResult.loadingExperience.firstContentfulPaint.percentile}ms)`,
                                firstInputDelay: `${processedResult.loadingExperience.firstInputDelay.category} (${processedResult.loadingExperience.firstInputDelay.percentile}ms)`
                            },
                            topImprovements: processedResult.insights.slice(0, 5).map(insight => ({
                                title: insight.title,
                                description: insight.description,
                                impact: Math.round((1 - insight.score) * 100) + '% improvement possible',
                                currentValue: insight.displayValue
                            }))
                        }, null, 2)
                    }
                ]
            };
        } catch (error) {
            console.error('Error analyzing URL:', error);
            throw {
                code: ErrorCode.InternalError,
                message: 'Failed to analyze URL',
                details: error instanceof Error ? error.message : 'Unknown error'
            };
        }
    }
  • Input schema definition for the 'analyze_pagespeed' tool, specifying an object with a required 'url' string property.
    inputSchema: {
        type: 'object',
        properties: {
            url: {
                type: 'string',
                description: 'The URL to analyze'
            }
        },
        required: ['url']
    }
  • index.ts:50-67 (registration)
    Registration of the ListToolsRequestSchema handler, which advertises the 'analyze_pagespeed' tool including its name, description, and input schema.
    this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
        tools: [
            {
                name: 'analyze_pagespeed',
                description: 'Analyzes a webpage using Google PageSpeed Insights API',
                inputSchema: {
                    type: 'object',
                    properties: {
                        url: {
                            type: 'string',
                            description: 'The URL to analyze'
                        }
                    },
                    required: ['url']
                }
            }
        ]
    }));
  • index.ts:7-27 (helper)
    TypeScript interfaces defining the structure for PageSpeed insights and processed results used in the tool handler.
    interface PageSpeedInsight {
        score: number;
        title: string;
        description: string;
        displayValue?: string;
    }
    
    interface ProcessedPageSpeedResult {
        performanceScore: number;
        insights: PageSpeedInsight[];
        loadingExperience: {
            firstContentfulPaint: {
                category: string;
                percentile: number;
            };
            firstInputDelay: {
                category: string;
                percentile: number;
            };
        };
    }

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/enemyrr/mcp-server-pagespeed'

If you have feedback or need assistance with the MCP directory API, please join our Discord server