From seo-aeo-pro
Runs a full technical SEO site audit: crawlability, indexability, Core Web Vitals, schema markup, internal linking, canonicals, duplicate content, cannibalization, hreflang, and page speed. Uses firecrawl and curl.
How this skill is triggered — by the user, by Claude, or both
Slash command
/seo-aeo-pro:seo-technical-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Load client context first. See seo-keywords [rules/client-setup.md](../seo-keywords/rules/client-setup.md).
Load client context first. See seo-keywords rules/client-setup.md.
technical/
├── audit-{date}.json # Full audit results
├── sitemap-urls.txt # All discovered URLs
├── homepage.md # Homepage content
├── crawl-data/ # Raw crawl data
├── schema-markup/ # Generated JSON-LD files
│ ├── homepage.jsonld
│ └── {page-slug}.jsonld
├── core-web-vitals-{date}.json # CWV results
├── internal-links.json # Link graph
├── cannibalization.json # Cannibalization report
└── speed-audit-{date}.json # Speed optimization report
Run these sub-audits in parallel where possible, then compile into a single scored report.
# Discover all URLs
firecrawl map {domain} -o .seo/clients/{slug}/technical/sitemap-urls.txt
# Check robots.txt
curl -sI "{domain}/robots.txt" -o .seo/clients/{slug}/technical/crawl-data/robots-headers.txt
firecrawl scrape "{domain}/robots.txt" -o .seo/clients/{slug}/technical/crawl-data/robots.txt
# Check XML sitemap
firecrawl scrape "{domain}/sitemap.xml" -o .seo/clients/{slug}/technical/crawl-data/sitemap.xml
Check for:
curl -sI -o /dev/null -w "%{http_code}" {url}curl -sIL {url} — flag chains > 2 hopsFor homepage + 5-10 key pages:
curl -sI "{url}" -o .seo/clients/{slug}/technical/crawl-data/headers-{slug}.txt
Check for:
X-Robots-Tag — any noindex/nofollow directives in headersLink: <url>; rel="canonical" — HTTP canonical vs HTML canonical conflictsContent-Type — proper charset (UTF-8)Cache-Control / Expires — caching configuredStrict-Transport-Security — HTTPS enforcementContent-Security-Policy — security header presentScrape 10-20 key pages:
firecrawl scrape {url} --format markdown,links -o .seo/clients/{slug}/technical/crawl-data/page-{slug}.json
For each page check:
| Meta Tag | Check | Issue If |
|---|---|---|
<title> | Length 50-60 chars, keyword present, unique | Missing, too long/short, duplicate |
<meta name="description"> | Length 120-155 chars, keyword, CTA | Missing, too long/short, duplicate |
<link rel="canonical"> | Self-referencing, matches actual URL | Missing, points elsewhere, conflicts |
<meta name="robots"> | noindex/nofollow directives | Accidentally blocking important pages |
<meta property="og:title"> | Present, matches title | Missing for shareable pages |
<meta property="og:description"> | Present, compelling | Missing for shareable pages |
<meta property="og:image"> | Present, proper dimensions | Missing (no social preview) |
<meta name="twitter:card"> | Present (summary_large_image) | Missing Twitter Card data |
<link rel="alternate" hreflang> | Correct language codes, reciprocal | Wrong codes, missing return tags |
<meta name="viewport"> | Present with width=device-width | Missing (not mobile-friendly) |
Scrape page HTML to find existing structured data:
firecrawl scrape {url} --html -o .seo/clients/{slug}/technical/crawl-data/html-{slug}.html
Check for:
<script type="application/ld+json">itemscope, itemtype, itemprop)Generate schema markup based on page type. Save to schema-markup/ directory.
LocalBusiness:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "{business_name}",
"image": "{logo_url}",
"address": { "@type": "PostalAddress", "streetAddress": "", "addressLocality": "", "addressRegion": "", "postalCode": "" },
"telephone": "{phone}",
"url": "{domain}",
"openingHours": "Mo-Fr 08:00-17:00",
"priceRange": "$$",
"sameAs": ["{social_urls}"]
}
Article:
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "{title}",
"author": { "@type": "Person", "name": "{author}" },
"datePublished": "{date}",
"dateModified": "{modified_date}",
"publisher": { "@type": "Organization", "name": "{brand}", "logo": { "@type": "ImageObject", "url": "{logo}" } },
"image": "{featured_image}",
"description": "{meta_description}"
}
FAQPage:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "{question}", "acceptedAnswer": { "@type": "Answer", "text": "{answer}" } }
]
}
Also generate when appropriate: Product, HowTo, BreadcrumbList, WebSite (with SearchAction), Organization, Review/AggregateRating.
# Get links from key pages
firecrawl scrape {url} --format links -o .seo/clients/{slug}/technical/crawl-data/links-{slug}.json
Repeat for homepage + top 20 pages. Build a link graph and check:
If PageSpeed Insights API key is available:
curl -s "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={url}&strategy=mobile&key={api_key}" -o .seo/clients/{slug}/technical/crawl-data/psi-{slug}.json
If no API key, instruct user to get one (free) at https://developers.google.com/speed/docs/insights/v5/get-started.
Metrics to extract:
Based on CWV results, provide specific fixes:
| Issue | Fix | Impact |
|---|---|---|
| Render-blocking CSS/JS | Inline critical CSS, defer non-critical JS, use async/defer attributes | High (LCP) |
| Unoptimized images | Convert to WebP/AVIF, add width/height attributes, use responsive srcset, lazy-load below-fold | High (LCP, CLS) |
| No font display swap | Add font-display: swap to @font-face, preload key fonts | Medium (LCP, CLS) |
| Third-party script bloat | Audit and remove unused scripts, defer analytics/chat widgets | Medium (INP) |
| No server caching | Set Cache-Control headers, enable CDN | Medium (TTFB) |
| Large DOM size | Simplify markup, virtualize long lists | Medium (INP) |
| Layout shifts | Set explicit dimensions on images/ads/embeds, avoid inserting content above fold | High (CLS) |
| No compression | Enable gzip/brotli compression | Medium (TTFB) |
From scraped pages, check all <img> tags:
width and height attributes set (prevents CLS)loading="lazy" on below-fold imagessrcset attribute for different screen sizesCheck from scraped HTML:
<meta name="viewport" content="width=device-width, initial-scale=1"> presentFor each key page, assess which rich results it could qualify for:
| Rich Result | Requirements | Page Types |
|---|---|---|
| FAQ | FAQPage schema, Q&A content | Service, product, blog |
| How-To | HowTo schema, step-by-step content | Tutorial, guide |
| Review Stars | AggregateRating schema | Product, service |
| Breadcrumbs | BreadcrumbList schema | All pages |
| Sitelinks Search | WebSite + SearchAction schema | Homepage |
| Video | VideoObject schema, embedded video | Blog, tutorial |
| Product | Product schema with price, availability | Product pages |
From the full URL list, identify pages wasting crawl budget:
Recommend: noindex tag pages, consolidate thin content, use canonical tags for parameter URLs, implement robots.txt blocks for faceted navigation.
If client has languages or regions in config:
<link rel="alternate" hreflang="x-default"> tag/en/, /fr/) over subdomain or ccTLD for most cases<html lang=""> attribute matches page languageCompare all indexed pages to identify keyword overlap:
# Get all page titles from sitemap
firecrawl scrape {url} --format markdown -o .seo/clients/{slug}/technical/crawl-data/page-{n}.md
Detection method:
Recommendations per case:
Calculate overall technical SEO health score (0-100):
| Category | Weight | Checks |
|---|---|---|
| Crawlability | 15 | Robots.txt, sitemap, status codes, redirect chains |
| Meta Tags | 15 | Title, description, canonical, OG, robots |
| Schema Markup | 10 | Valid JSON-LD, appropriate types, required properties |
| Internal Linking | 15 | Orphan pages, link depth, anchor text, broken links |
| Core Web Vitals | 15 | LCP, CLS, INP scores |
| Image Optimization | 10 | Alt text, format, lazy loading, dimensions |
| Mobile | 10 | Viewport, responsive, tap targets, font sizes |
| Security | 5 | HTTPS, HSTS, CSP headers |
| Internationalization | 5 | Hreflang (if applicable, otherwise redistribute) |
Output: overall score, category scores, prioritized fix list with effort (low/medium/high) and impact (low/medium/high) for each issue.
npx claudepluginhub mangollc/claude-seo-skill --plugin seo-aeo-proRuns a complete technical SEO audit covering crawlability, indexation, structured data, Core Web Vitals, site architecture, and JavaScript rendering readiness.
Runs SEO audits with three modes (full/quick/technical) covering crawlability, indexation, meta tags, Core Web Vitals, JS rendering, security, structured data, and more. Auto-detects mode from user intent.
Deep technical SEO analysis for optimizing crawlability, Core Web Vitals, rendering, redirects, and sitemaps. Use when diagnosing page speed, indexation, or site migration issues.