Technical SEO Audit
Crawlability
Search engines must be able to discover and access your pages. Crawlability issues block indexing entirely.
Robots.txt
Controls which URLs crawlers can access.
# Allow all crawlers access to everything
User-agent: *
Allow: /
# Block specific paths
User-agent: *
Disallow: /admin/
Disallow: /api/
Disallow: /staging/
Disallow: /*?sort=
Disallow: /*?filter=
# Sitemap reference (always include)
Sitemap: https://example.com/sitemap.xml
Critical rules:
- Never block CSS/JS files (Google needs them to render pages)
- Never block important content paths accidentally
- Test with
analyze_robots_txtbefore deploying changes Crawl-delayis ignored by Google (honored by Bing/Yandex)
Meta Robots & X-Robots-Tag
Page-level crawl and index directives.
| Directive | Effect |
|---|---|
index | Allow indexing (default) |
noindex | Prevent indexing — removes from search results |
follow | Follow links on this page (default) |
nofollow | Don't follow any links on this page |
noarchive | Don't show cached version |
nosnippet | Don't show text snippet in results |
max-snippet:N | Limit snippet to N characters |
max-image-preview:large | Allow large image previews |
<!-- In HTML head -->
<meta name="robots" content="noindex, follow">
<!-- Via HTTP header (for non-HTML files) -->
X-Robots-Tag: noindex, nofollow
MCP Tool: analyze_page extracts both meta robots and HTTP header directives.
Indexing
Canonical Tags
The definitive way to tell search engines which URL is the preferred version.
Rules:
- Every indexable page: self-referencing canonical
- Absolute URLs only (
https://example.com/page, not/page) - Must be consistent: canonical URL must return 200 (not redirect or 404)
- One canonical per page (if multiple, Google uses the first)
- HTTP header canonical overrides HTML canonical if both present
Noindex vs Canonical
| Scenario | Use |
|---|---|
| Page should never appear in search | noindex |
| Duplicate page, prefer another version | canonical to preferred version |
| URL parameter variants | canonical to clean URL |
| Paginated content | Self-referencing canonical on each page |
Sitemap Submission
- Submit via Google Search Console
- All indexable pages should be in the sitemap
- Noindex pages should NOT be in the sitemap
- Keep sitemaps under 50,000 URLs / 50MB per file (use sitemap index for larger sites)
MCP Tools: analyze_sitemap validates structure, gsc_sitemaps checks submission status.
Core Web Vitals
Google's page experience signals. Measured from real user data (CrUX) and lab data (Lighthouse).
Thresholds (2024+)
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| LCP (Largest Contentful Paint) | ≤ 2.5s | ≤ 4.0s | > 4.0s |
| INP (Interaction to Next Paint) | ≤ 200ms | ≤ 500ms | > 500ms |
| CLS (Cumulative Layout Shift) | ≤ 0.1 | ≤ 0.25 | > 0.25 |
LCP Optimization
Largest Contentful Paint measures when the largest visible element finishes rendering.
Common causes of poor LCP:
- Slow server response (TTFB > 800ms) → optimize server, use CDN
- Render-blocking resources → defer non-critical CSS/JS
- Slow resource load → optimize/compress LCP image, use
preload - Client-side rendering → server-side render critical content
Quick wins:
- Preload LCP image:
<link rel="preload" href="hero.webp" as="image"> - Use CDN for static assets
- Optimize server response (caching, database queries)
- Avoid lazy-loading the LCP element
INP Optimization
Interaction to Next Paint measures responsiveness to user input.
Common causes of poor INP:
- Long JavaScript tasks blocking main thread → break into smaller tasks
- Heavy event handlers → debounce, use
requestAnimationFrame - Large DOM size → reduce DOM nodes (target < 1,500)
- Third-party scripts → defer or lazy-load
CLS Optimization
Cumulative Layout Shift measures visual stability.
Common causes of poor CLS:
- Images without dimensions → always set
widthandheight - Ads/embeds without reserved space → use
aspect-ratioormin-height - Web fonts causing FOIT/FOUT → use
font-display: swap+ preload - Dynamically injected content → reserve space before injection
MCP Tool: check_core_web_vitals returns all metrics with specific optimization suggestions.
Page Speed Optimization
Beyond Core Web Vitals, overall page speed impacts user experience and crawl budget.
Critical rendering path
- Minimize render-blocking resources (critical CSS inline, defer JS)
- Enable compression (Brotli preferred, gzip minimum)
- Set cache headers (
Cache-Control: max-age=31536000for static assets) - Use HTTP/2 or HTTP/3
- Minimize main-thread work (reduce JS execution time)
Image optimization
- Use modern formats (WebP/AVIF)
- Serve responsive images (
srcset) - Lazy load below-the-fold images
- Compress aggressively (80-85% quality)
Resource hints
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preload" href="/critical.css" as="style">
<link rel="prefetch" href="/next-page.html">
<link rel="dns-prefetch" href="https://analytics.example.com">
Mobile-Friendliness
Google uses mobile-first indexing — the mobile version of your site is what gets indexed.
Requirements
- Viewport meta tag:
<meta name="viewport" content="width=device-width, initial-scale=1"> - Responsive design (content adapts to screen size)
- No horizontal scrolling
- Tap targets: minimum 48x48px with 8px spacing
- Font size: minimum 16px for body text
- No intrusive interstitials (popups covering content)
- Content parity: mobile version has same content as desktop
MCP Tool: check_mobile_friendly evaluates all mobile usability factors.
HTTPS & Security
HTTPS requirements
- All pages served over HTTPS (no HTTP pages in index)
- Valid SSL certificate (not expired, correct domain)
- No mixed content (HTTPS page loading HTTP resources)
- HSTS header recommended:
Strict-Transport-Security: max-age=31536000; includeSubDomains - HTTP pages 301 redirect to HTTPS
Common HTTPS issues
| Issue | Impact | Fix |
|---|---|---|
| Mixed content | Medium | Update all resource URLs to HTTPS |
| Expired certificate | Critical | Renew SSL certificate immediately |
| HTTP pages indexed | High | 301 redirect HTTP → HTTPS + update canonical |
| Missing HSTS | Low | Add HSTS header |
Redirects
Redirect types
| Code | Type | When to Use | SEO Impact |
|---|---|---|---|
| 301 | Permanent | URL changed permanently, content moved | Passes ~95% link equity |
| 302 | Temporary | Temporary move (A/B test, maintenance) | Does not pass link equity |
| 307 | Temporary (strict) | Same as 302 but preserves HTTP method | Does not pass link equity |
| 308 | Permanent (strict) | Same as 301 but preserves HTTP method | Passes link equity |
Redirect issues
- Redirect chains: A → B → C → D. Maximum 2 hops recommended. Fix by pointing A directly to D.
- Redirect loops: A → B → A. Critical error — page becomes inaccessible.
- Soft 404s: Page returns 200 but shows "not found" content. Should return actual 404.
- 302 where 301 needed: Temporary redirect for permanent move wastes link equity.
XML Sitemaps
Requirements
- Located at
/sitemap.xml(or referenced in robots.txt) - Valid XML format
- Only indexable pages (no noindex, no 404s, no redirects)
- Include
<lastmod>with accurate dates (ISO 8601) - Maximum 50,000 URLs per sitemap file
- Maximum 50MB uncompressed per file
- Use sitemap index for larger sites
Validation
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/page</loc>
<lastmod>2026-01-15</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
MCP Tool: analyze_sitemap parses, validates, and reports issues.
Hreflang (International SEO)
For multi-language or multi-region sites. Tells Google which language/region version to show.
Syntax
<link rel="alternate" hreflang="en-us" href="https://example.com/page">
<link rel="alternate" hreflang="en-gb" href="https://example.co.uk/page">
<link rel="alternate" hreflang="es" href="https://example.com/es/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/page">
Rules
- Bidirectional: If page A references page B, page B must reference page A
- Self-referencing: Each page must include a hreflang pointing to itself
- x-default: Include for the fallback/language selector page
- Return tags: Every referenced URL must return the same hreflang set
- Use ISO 639-1 language codes, optionally with ISO 3166-1 region codes
HTTP Status Codes (SEO Impact)
| Code | Meaning | SEO Action |
|---|---|---|
| 200 | OK | Expected for all indexable pages |
| 301 | Moved Permanently | Passes link equity. Use for permanent URL changes |
| 302 | Found (Temporary) | Does NOT pass link equity. Use only for temporary moves |
| 304 | Not Modified | Good — efficient caching |
| 404 | Not Found | Remove from sitemap, fix internal links pointing here |
| 410 | Gone | Permanently removed. Stronger signal than 404 for deindexing |
| 500 | Server Error | Fix immediately — blocks crawling and indexing |
| 503 | Service Unavailable | Temporary. Google retries. Use for planned maintenance |
Technical Audit Workflow
Recommended order for a complete technical audit:
- Crawlability:
analyze_robots_txt→ check for blocking issues - Sitemap:
analyze_sitemap→ validate structure and URLs - Page-level:
analyze_page→ meta robots, canonical, redirects, status - Performance:
check_core_web_vitals→ LCP, INP, CLS scores - Mobile:
check_mobile_friendly→ viewport, tap targets, fonts - Schema:
extract_schema→ structured data validation - GSC data:
gsc_index_coverage→ real indexing status from Google
See ERROR_CATALOG.md for the complete issue catalog. See AUDIT_WORKFLOW.md for detailed audit methodology. See HTTP_STATUS_REFERENCE.md for complete status code reference.