Skip to main content
Glama
RichardDillman

SEO Audit MCP Server

seo-issues.json31.9 kB
{ "version": "1.1.0", "lastUpdated": "2025-12-04", "issues": { "sitemap_no_lastmod": { "id": "sitemap_no_lastmod", "category": "Sitemaps", "severity": "critical", "title": "Sitemap URLs missing lastmod dates", "description": "URLs in sitemap do not include lastmod (last modified) dates, preventing search engines from efficiently prioritizing crawl of updated content.", "revenue_impact": "high", "detection": { "check": "sitemap.stats.hasLastmod / sitemap.stats.urlCount < 0.5", "threshold": "< 50% of URLs have lastmod" }, "recommendation": { "summary": "Add lastmod dates to all sitemap URLs", "details": "Include <lastmod> tags with ISO 8601 formatted dates (YYYY-MM-DD or full datetime) for every URL in your sitemaps. For job boards, use the job posting date or last update date.", "effort": "low", "implementation": { "example": "<url>\n <loc>https://example.com/job/12345</loc>\n <lastmod>2025-12-04T10:30:00+00:00</lastmod>\n</url>", "notes": [ "Use the actual content modification date, not the sitemap generation date", "Keep lastmod accurate - false dates can hurt crawl efficiency", "Update lastmod when job details change (salary, description, status)" ] } }, "references": [ "https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap", "https://www.sitemaps.org/protocol.html" ] }, "missing_hreflang": { "id": "missing_hreflang", "category": "International SEO", "severity": "high", "title": "Missing hreflang annotations", "description": "Pages available in multiple languages lack hreflang tags, causing duplicate content issues and serving wrong language to international users.", "revenue_impact": "high", "detection": { "check": "!page.seo.hreflang || page.seo.hreflang.length === 0", "notes": "Check for alternate language versions (e.g., /es/, /fr/ paths or subdomains)" }, "recommendation": { "summary": "Add hreflang annotations linking all language versions", "details": "Add hreflang link elements in <head> or HTTP headers for each language/region variant. Include x-default for the fallback version.", "effort": "medium", "implementation": { "example": "<link rel=\"alternate\" hreflang=\"en\" href=\"https://example.com/jobs/developer\" />\n<link rel=\"alternate\" hreflang=\"es\" href=\"https://example.com/es/jobs/developer\" />\n<link rel=\"alternate\" hreflang=\"x-default\" href=\"https://example.com/jobs/developer\" />", "notes": [ "Must be bidirectional - each page must reference all variants including itself", "Use correct language-region codes (en-US, en-GB, es-MX)", "Include x-default to indicate the default/fallback page", "Can also implement via sitemap or HTTP headers for large sites" ] } }, "references": [ "https://developers.google.com/search/docs/specialty/international/localized-versions" ] }, "slow_page_load": { "id": "slow_page_load", "category": "Performance", "severity": "high", "title": "Slow page load time", "description": "Page load time exceeds recommended thresholds, negatively impacting Core Web Vitals, user experience, and search rankings.", "revenue_impact": "high", "detection": { "check": "page.technical.loadTimeMs > 3000", "thresholds": { "warning": "> 3000ms", "critical": "> 5000ms" } }, "recommendation": { "summary": "Optimize page load speed to under 3 seconds", "details": "Multiple optimizations needed to improve load time: lazy loading, code splitting, critical CSS, image optimization.", "effort": "medium-high", "implementation": { "steps": [ "Implement lazy loading for below-the-fold images (loading='lazy')", "Preload critical resources (fonts, hero images)", "Defer non-critical JavaScript", "Inline critical CSS, defer non-critical styles", "Use efficient image formats (WebP, AVIF)", "Enable compression (gzip/brotli)", "Leverage browser caching", "Use a CDN for static assets" ] } }, "references": [ "https://web.dev/vitals/", "https://developers.google.com/speed/docs/insights/v5/about", "https://www.patterns.dev/vanilla/loading-sequence/" ] }, "unoptimized_images": { "id": "unoptimized_images", "category": "Performance", "severity": "high", "title": "Large unoptimized images", "description": "High-resolution or improperly sized images significantly slow page load times. This is one of the most common performance issues.", "revenue_impact": "high", "detection": { "check": "Look for images > 100KB, images without width/height, images not using modern formats", "notes": "Check for JPEG/PNG that could be WebP, images larger than display size" }, "recommendation": { "summary": "Compress, resize, and modernize image formats", "details": "Optimize all images for web delivery. Use modern formats, proper sizing, and responsive images.", "effort": "medium", "implementation": { "steps": [ "Convert images to WebP or AVIF format (60-80% smaller than JPEG)", "Resize images to match display dimensions (don't serve 2000px image in 400px container)", "Use srcset for responsive images across devices", "Set explicit width and height to prevent layout shift (CLS)", "Compress images with tools like ImageOptim, Squoosh, or Sharp" ], "example": "<img \n src=\"hero.webp\" \n srcset=\"hero-400.webp 400w, hero-800.webp 800w, hero-1200.webp 1200w\"\n sizes=\"(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px\"\n width=\"1200\" \n height=\"600\" \n alt=\"Hero image\"\n/>", "notes": [ "WebP has 90%+ browser support, AVIF is newer but smaller", "Use <picture> element for format fallbacks", "Always specify width/height to prevent Cumulative Layout Shift" ] } }, "references": [ "https://web.dev/optimize-images/", "https://web.dev/serve-responsive-images/" ] }, "hero_image_lazy_loaded": { "id": "hero_image_lazy_loaded", "category": "Performance", "severity": "medium", "title": "Hero image incorrectly lazy loaded", "description": "Above-the-fold hero images have loading='lazy', delaying LCP (Largest Contentful Paint) and harming Core Web Vitals.", "revenue_impact": "medium", "detection": { "check": "Find <img> in viewport with loading='lazy'", "notes": "Usually the first large image in the visible viewport" }, "recommendation": { "summary": "Remove lazy loading from above-the-fold hero images", "details": "Hero images should load immediately. Use loading='eager' or omit the loading attribute. Consider preloading critical images.", "effort": "low", "implementation": { "example_bad": "<img src=\"hero.jpg\" loading=\"lazy\" alt=\"Hero\" />", "example_good": "<img src=\"hero.jpg\" loading=\"eager\" alt=\"Hero\" fetchpriority=\"high\" />\n\n<!-- In head -->\n<link rel=\"preload\" as=\"image\" href=\"hero.jpg\" />", "notes": [ "fetchpriority='high' tells browser to prioritize this image", "Preloading in <head> starts download even earlier", "Only apply lazy loading to images below the fold" ] } }, "references": [ "https://web.dev/lcp/", "https://web.dev/browser-level-image-lazy-loading/", "https://www.patterns.dev/vanilla/preload/" ] }, "offscreen_images_loading": { "id": "offscreen_images_loading", "category": "Performance", "severity": "medium", "title": "Off-screen images loading immediately", "description": "Images below the fold load immediately instead of being lazy loaded, wasting bandwidth and slowing initial page load.", "revenue_impact": "medium", "detection": { "check": "Images outside viewport without loading='lazy'", "notes": "Look for images in footer, related content, or beyond first scroll" }, "recommendation": { "summary": "Add lazy loading to below-the-fold images", "details": "Apply loading='lazy' to images that are not visible on initial page load to defer their loading until user scrolls near them.", "effort": "low", "implementation": { "example": "<img src=\"footer-partner.png\" loading=\"lazy\" alt=\"Partner logo\" />", "notes": [ "Works natively in modern browsers without JavaScript", "Safe to apply to all images below the fold", "Consider intersection observer for older browsers if needed" ] } }, "references": [ "https://web.dev/browser-level-image-lazy-loading/" ] }, "render_blocking_scripts": { "id": "render_blocking_scripts", "category": "Performance", "severity": "high", "title": "Render-blocking scripts in document head", "description": "JavaScript files in <head> without defer/async block page rendering, delaying First Contentful Paint and Time to Interactive.", "revenue_impact": "high", "detection": { "check": "script tags in <head> without defer/async/type='module'", "notes": "Especially impactful if scripts are large or from slow third parties" }, "recommendation": { "summary": "Defer or async load non-critical scripts", "details": "Add defer or async attribute to scripts, or move them to bottom of body. Critical scripts should be inlined or preloaded.", "effort": "medium", "implementation": { "example_bad": "<head>\n <script src=\"analytics.js\"></script>\n <script src=\"vendor.js\"></script>\n</head>", "example_good": "<head>\n <!-- Critical inline script if needed -->\n <script>\n // minimal critical JS\n </script>\n</head>\n<body>\n <!-- content -->\n <script src=\"vendor.js\" defer></script>\n <script src=\"analytics.js\" async></script>\n</body>", "notes": [ "defer: Downloads in parallel, executes in order after DOM ready", "async: Downloads in parallel, executes immediately when ready (good for analytics)", "type='module': Automatically deferred", "Inline truly critical JS only (< 1KB)" ] } }, "references": [ "https://web.dev/render-blocking-resources/", "https://www.patterns.dev/vanilla/loading-sequence/" ] }, "render_blocking_css": { "id": "render_blocking_css", "category": "Performance", "severity": "high", "title": "Render-blocking CSS", "description": "Large CSS files block page rendering until fully downloaded and parsed. Unused CSS or inefficient stylesheets add unnecessary load.", "revenue_impact": "high", "detection": { "check": "Large CSS files in <head>, unused CSS rules", "notes": "Check for CSS > 50KB, unused styles (Coverage tab in DevTools)" }, "recommendation": { "summary": "Inline critical CSS and defer non-critical styles", "details": "Extract and inline above-the-fold CSS, then load remaining styles asynchronously.", "effort": "medium", "implementation": { "example": "<head>\n <!-- Critical CSS inlined -->\n <style>\n /* Only styles needed for above-fold content */\n header, .hero, nav { ... }\n </style>\n \n <!-- Non-critical CSS loaded async -->\n <link rel=\"preload\" href=\"styles.css\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet'\">\n <noscript><link rel=\"stylesheet\" href=\"styles.css\"></noscript>\n</head>", "notes": [ "Critical CSS should be < 14KB (fits in first TCP roundtrip)", "Use tools like Critical or Critters to extract critical CSS", "Remove unused CSS with PurgeCSS or similar", "Consider CSS-in-JS for component-based critical CSS" ] } }, "references": [ "https://web.dev/defer-non-critical-css/", "https://web.dev/extract-critical-css/" ] }, "excessive_third_party_scripts": { "id": "excessive_third_party_scripts", "category": "Performance", "severity": "high", "title": "Excessive third-party scripts", "description": "Each third-party script (analytics, ads, widgets, tracking) adds HTTP requests, DNS lookups, and execution time. They often block rendering and can be slow or unreliable.", "revenue_impact": "high", "detection": { "check": "Count external script domains, total third-party JS size", "notes": "Common culprits: Google Tag Manager with many tags, ad networks, chat widgets, social buttons" }, "recommendation": { "summary": "Audit and minimize third-party scripts", "details": "Reduce third-party scripts to essentials only. Use resource hints and defer loading where possible.", "effort": "medium", "implementation": { "steps": [ "Audit all third-party scripts - remove unused ones", "Self-host critical third-party resources when possible", "Use dns-prefetch and preconnect for required third parties", "Load non-critical third parties after page load (setTimeout or requestIdleCallback)", "Consider facade patterns for heavy widgets (load placeholder, full widget on interaction)" ], "example": "<!-- Preconnect to required third parties -->\n<link rel=\"preconnect\" href=\"https://www.googletagmanager.com\">\n<link rel=\"dns-prefetch\" href=\"https://www.google-analytics.com\">\n\n<!-- Load non-critical scripts after page load -->\n<script>\n window.addEventListener('load', () => {\n setTimeout(() => {\n // Load chat widget, social buttons, etc.\n }, 3000);\n });\n</script>", "notes": [ "Each third-party domain adds ~100-300ms DNS + connection time", "Third parties can be slow or go down, affecting your site", "Consider using a tag manager to control loading order" ] } }, "references": [ "https://www.patterns.dev/vanilla/third-party/", "https://web.dev/optimizing-content-efficiency-loading-third-party-javascript/" ] }, "slow_server_response": { "id": "slow_server_response", "category": "Performance", "severity": "high", "title": "Slow server response time (TTFB)", "description": "Time to First Byte (TTFB) is slow, often caused by poor hosting, overwhelmed servers, or inefficient database queries.", "revenue_impact": "high", "detection": { "check": "TTFB > 600ms", "thresholds": { "good": "< 200ms", "needs_improvement": "200-600ms", "poor": "> 600ms" } }, "recommendation": { "summary": "Reduce server response time to under 200ms", "details": "Optimize server configuration, database queries, and consider CDN or edge caching.", "effort": "high", "implementation": { "steps": [ "Upgrade hosting if on shared/cheap plans", "Optimize database queries (add indexes, reduce N+1 queries)", "Implement server-side caching (Redis, Memcached)", "Use a CDN with edge caching for static and dynamic content", "Enable HTTP/2 or HTTP/3", "Consider SSG (Static Site Generation) for pages that don't change often" ], "notes": [ "TTFB includes DNS, connection, and server processing time", "Database queries are often the bottleneck", "CDN can dramatically reduce TTFB for geographically distributed users" ] } }, "references": [ "https://web.dev/ttfb/" ] }, "no_browser_caching": { "id": "no_browser_caching", "category": "Performance", "severity": "medium", "title": "Missing browser caching headers", "description": "Static assets lack proper Cache-Control headers, forcing browsers to re-download resources on every visit.", "revenue_impact": "medium", "detection": { "check": "Check Cache-Control headers on static assets (JS, CSS, images, fonts)", "notes": "Missing headers or max-age=0 indicates no caching" }, "recommendation": { "summary": "Implement proper browser caching for static assets", "details": "Set appropriate Cache-Control headers based on resource type. Use content hashing for cache busting.", "effort": "low", "implementation": { "example": "# Static assets with content hash in filename (immutable)\nCache-Control: public, max-age=31536000, immutable\n\n# HTML pages (short cache, revalidate)\nCache-Control: public, max-age=0, must-revalidate\n\n# API responses (no cache)\nCache-Control: private, no-cache, no-store", "notes": [ "Use content hashing in filenames for JS/CSS (e.g., app.abc123.js)", "immutable tells browser the file will never change", "For HTML, use short TTL with revalidation", "Consider stale-while-revalidate for better UX" ] } }, "references": [ "https://web.dev/http-cache/" ] }, "no_cdn": { "id": "no_cdn", "category": "Performance", "severity": "medium", "title": "Not using a CDN", "description": "Static assets served from origin server only, causing slow load times for geographically distant users.", "revenue_impact": "medium", "detection": { "check": "Check response headers for CDN indicators (e.g., cf-ray for Cloudflare)", "notes": "Also check if assets are served from origin domain vs CDN domain" }, "recommendation": { "summary": "Serve static assets through a CDN", "details": "Use a Content Delivery Network to cache and serve assets from edge locations worldwide.", "effort": "medium", "implementation": { "steps": [ "Choose a CDN provider (Cloudflare, Fastly, CloudFront, Akamai)", "Configure CDN for static assets (images, JS, CSS, fonts)", "Consider full-site CDN for HTML pages too", "Set appropriate cache headers for CDN caching", "Enable CDN features like image optimization, Brotli compression" ], "notes": [ "CDN can reduce latency by 50-70% for distant users", "Many CDNs offer free tiers (Cloudflare)", "Modern CDNs can also cache dynamic content at edge" ] } }, "references": [ "https://web.dev/content-delivery-networks/" ] }, "missing_preload": { "id": "missing_preload", "category": "Performance", "severity": "medium", "title": "Critical resources not preloaded", "description": "Important resources like fonts, hero images, or key scripts are discovered late in the loading process, delaying rendering.", "revenue_impact": "medium", "detection": { "check": "Check for fonts/images needed for LCP that aren't preloaded", "notes": "Resources needed immediately but loaded via CSS or JavaScript" }, "recommendation": { "summary": "Preload critical resources for faster discovery", "details": "Use <link rel='preload'> to tell the browser about important resources needed early in the page lifecycle.", "effort": "low", "implementation": { "example": "<head>\n <!-- Preload hero image -->\n <link rel=\"preload\" as=\"image\" href=\"/hero.webp\" fetchpriority=\"high\">\n \n <!-- Preload critical font -->\n <link rel=\"preload\" as=\"font\" type=\"font/woff2\" href=\"/fonts/main.woff2\" crossorigin>\n \n <!-- Preload critical JavaScript -->\n <link rel=\"preload\" as=\"script\" href=\"/critical.js\">\n</head>", "notes": [ "Only preload truly critical resources (3-5 max)", "Over-preloading can hurt performance by competing with other resources", "Use fetchpriority='high' for most important resources", "Fonts need crossorigin attribute even if same-origin" ] } }, "references": [ "https://www.patterns.dev/vanilla/preload/", "https://web.dev/preload-critical-assets/" ] }, "missing_prefetch": { "id": "missing_prefetch", "category": "Performance", "severity": "low", "title": "Navigation resources not prefetched", "description": "Resources needed for likely next pages aren't prefetched during idle time, causing slower subsequent navigations.", "revenue_impact": "low", "detection": { "check": "Check for prefetch hints on common navigation paths", "notes": "Useful for multi-page sites with predictable navigation" }, "recommendation": { "summary": "Prefetch resources for likely next navigations", "details": "Use <link rel='prefetch'> to fetch resources needed for probable next pages during browser idle time.", "effort": "low", "implementation": { "example": "<!-- On job listing page, prefetch first few job details -->\n<link rel=\"prefetch\" href=\"/jobs/12345\">\n<link rel=\"prefetch\" href=\"/jobs/12346\">\n\n<!-- Or dynamically on hover/focus -->\n<script>\n document.querySelectorAll('a.job-link').forEach(link => {\n link.addEventListener('mouseenter', () => {\n const hint = document.createElement('link');\n hint.rel = 'prefetch';\n hint.href = link.href;\n document.head.appendChild(hint);\n }, { once: true });\n });\n</script>", "notes": [ "Prefetch happens at low priority during idle time", "Don't prefetch too many resources (wastes bandwidth)", "Consider user's data saver preferences", "Good for pagination, search results, common next actions" ] } }, "references": [ "https://www.patterns.dev/vanilla/prefetch/", "https://web.dev/link-prefetch/" ] }, "title_too_long": { "id": "title_too_long", "category": "SEO", "severity": "medium", "title": "Title tag exceeds recommended length", "description": "Page title is longer than 60 characters and will be truncated in search results, potentially losing important keywords.", "revenue_impact": "medium", "detection": { "check": "page.seo.title.length > 60", "threshold": "60 characters (Google typically shows 50-60)" }, "recommendation": { "summary": "Trim title to 55-60 characters", "details": "Keep primary keywords in first 55 characters. Consider removing brand name or moving to end if space is tight.", "effort": "low", "implementation": { "example_bad": "Legal Jobs in Cincinnati, OH - Find Legal Careers, Attorney Positions & Paralegal Jobs Near You | Talent.com", "example_good": "Legal Jobs in Cincinnati, OH | Talent.com", "notes": [ "Front-load important keywords", "Brand name at end is fine, can be truncated", "Use | or - as separators", "Each page should have a unique title" ] } }, "references": [ "https://developers.google.com/search/docs/appearance/title-link" ] }, "missing_job_detail_sitemaps": { "id": "missing_job_detail_sitemaps", "category": "Sitemaps", "severity": "medium", "title": "Job detail pages not in sitemaps", "description": "Individual job posting pages (with JobPosting schema) are not included in sitemaps, reducing their discoverability by search engines.", "revenue_impact": "high", "detection": { "check": "Job detail URLs (/view, /job/, etc.) not found in sitemaps", "notes": "Common in job boards that only sitemap landing pages" }, "recommendation": { "summary": "Create dedicated sitemaps for job detail pages", "details": "Add individual job posting URLs to sitemaps with accurate lastmod dates. Consider Google Indexing API for real-time indexing.", "effort": "medium", "implementation": { "steps": [ "Create job-specific sitemaps (e.g., sitemap-jobs-1.xml)", "Include individual job URLs with JobPosting schema", "Add lastmod reflecting posting/update date", "Remove expired jobs promptly", "Consider implementing Google Indexing API" ], "notes": [ "Google Indexing API provides near-instant indexing for job postings", "Sitemaps can have up to 50,000 URLs each", "Use lastmod to signal job freshness" ] } }, "references": [ "https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap", "https://developers.google.com/search/apis/indexing-api/v3/quickstart" ] }, "no_indexing_api": { "id": "no_indexing_api", "category": "Indexing", "severity": "medium", "title": "Not using Google Indexing API for job postings", "description": "High-volume job board not using Google Indexing API, resulting in delayed indexing of new job postings.", "revenue_impact": "medium", "detection": { "check": "Manual review - no Indexing API implementation detected", "notes": "Relevant for sites with JobPosting schema" }, "recommendation": { "summary": "Implement Google Indexing API for faster job indexing", "details": "Use the Indexing API to notify Google immediately when jobs are posted, updated, or removed. Much faster than waiting for crawl.", "effort": "medium", "implementation": { "steps": [ "Set up Google Search Console verification", "Create service account in Google Cloud", "Add service account to Search Console property", "Implement API calls on job CRUD operations", "Batch updates for efficiency (up to 100 per call)" ], "notes": [ "Only works for JobPosting and BroadcastEvent schema types", "Quota: 200 requests/day (can request increase)", "Use 'URL_UPDATED' for new/changed, 'URL_DELETED' for removed" ] } }, "references": [ "https://developers.google.com/search/apis/indexing-api/v3/quickstart" ] }, "sitemap_not_compressed": { "id": "sitemap_not_compressed", "category": "Sitemaps", "severity": "low", "title": "Large sitemaps not gzip compressed", "description": "Sitemaps over 10,000 URLs are served uncompressed, increasing bandwidth and crawl time.", "revenue_impact": "low", "detection": { "check": "sitemap.stats.urlCount > 10000 && !sitemap.stats.compressionUsed" }, "recommendation": { "summary": "Enable gzip compression for large sitemaps", "details": "Serve sitemaps as .xml.gz files with Content-Encoding: gzip. Reduces file size by 60-80%.", "effort": "low", "implementation": { "example": "# Serve as sitemap.xml.gz\n# Ensure Content-Encoding: gzip header is set\n# Reference in robots.txt: Sitemap: https://example.com/sitemap.xml.gz", "notes": [ "All major search engines support gzipped sitemaps", "Can use same URL with transparent gzip encoding", "Or use .gz extension explicitly" ] } }, "references": [ "https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap" ] }, "too_many_http_requests": { "id": "too_many_http_requests", "category": "Performance", "severity": "medium", "title": "Too many HTTP requests", "description": "Page makes excessive HTTP requests, often from numerous small files, plugins, or unbundled assets.", "revenue_impact": "medium", "detection": { "check": "Total requests > 100, or many small requests < 5KB each", "notes": "Check DevTools Network tab for request count" }, "recommendation": { "summary": "Reduce HTTP requests through bundling and optimization", "details": "Combine files, use sprites, inline small assets, and eliminate unnecessary requests.", "effort": "medium", "implementation": { "steps": [ "Bundle JavaScript and CSS files (webpack, Rollup, esbuild)", "Use CSS sprites or inline SVG for icons", "Inline small CSS/JS (< 1KB) directly in HTML", "Remove unused plugins and scripts", "Use HTTP/2 or HTTP/3 for better multiplexing", "Consider code splitting for large bundles" ], "notes": [ "HTTP/2 multiplexing helps but each request still has overhead", "Balance bundling vs caching (smaller bundles cache better)", "Modern bundlers can tree-shake unused code" ] } }, "references": [ "https://web.dev/reduce-network-payloads-using-text-compression/" ] }, "no_compression": { "id": "no_compression", "category": "Performance", "severity": "medium", "title": "Text resources not compressed", "description": "HTML, CSS, JavaScript, and JSON responses not using gzip or Brotli compression, transferring 60-80% more data than necessary.", "revenue_impact": "medium", "detection": { "check": "Check Content-Encoding header for gzip or br", "notes": "All text-based assets should be compressed" }, "recommendation": { "summary": "Enable gzip or Brotli compression for text assets", "details": "Configure server to compress all text-based responses. Brotli offers better compression than gzip.", "effort": "low", "implementation": { "example": "# Nginx\ngzip on;\ngzip_types text/plain text/css application/json application/javascript text/xml application/xml;\ngzip_min_length 1000;\n\n# For Brotli (if supported)\nbrotli on;\nbrotli_types text/plain text/css application/json application/javascript;\n\n# Apache (.htaccess)\nAddOutputFilterByType DEFLATE text/html text/css application/javascript application/json", "notes": [ "Brotli (br) provides 15-25% better compression than gzip", "Brotli has 95%+ browser support", "Don't compress already-compressed formats (images, videos)", "Most CDNs handle compression automatically" ] } }, "references": [ "https://web.dev/uses-text-compression/" ] } } }

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/RichardDillman/seo-audit-mcp'

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