AI SEO
by coreyhaines31 / marketingskills
Optimize content for AI search engines, get cited by LLMs, or appear in AI-generated answers.
Get a prioritized SEO + GEO action plan for any website.
Listed ·Updated
Install data from skills.sh
This skill runs scripts from outside its own folder, which a single-skill install does not copy. Install it the way the author's repository describes (as a Claude Code plugin, if it offers one) to get the full tool.
SEO GEO Audit is an AI SEO (GEO and AEO) skill for AI agents, published in the seoskills.sh catalog. Reach for it when your work involves answer and generative engine optimization for AI Overviews, Perplexity, and ChatGPT. Install it with one command and it runs inside your own agent, so the work happens in your workflow, not a separate SEO tool.
Audit a website the way a senior practitioner does: collect verifiable facts first, judge them against a field-tested checklist, benchmark against the competitors that actually rank, and deliver a short list of fixes ordered by impact. The methodology was distilled from 115+ real agency audit calls and updated with sourced 2025-2026 evidence on AI search.
If the working environment contains an Obsidian vault or any local knowledge base (a folder of .md notes, often with a .obsidian directory), read the relevant notes before acting: brand and product facts, target keywords, competitors, and the SEO action log of what was already tried. Ground every recommendation in that context instead of asking the user for facts the vault already holds. At the end of the session, append the actions taken to the vault's SEO action log so the next session starts informed.
Ask only for what is missing; proceed with what exists:
| Input | Required | Note |
|---|---|---|
| Homepage URL | yes | The script also discovers robots.txt, sitemap, llms.txt |
| 1-2 key pages | recommended | Top service, product or article page |
| Competitor URLs | recommended | Enables page-versus-page benchmarking |
| Goals and market | helpful | Local vs national, language, business model |
| GSC / GA4 access | optional | Indexation ratio and traffic facts; otherwise ask the owner for screenshots |
Run the bundled collector on the homepage plus key pages, and on each competitor page cited later in the report:
python3 scripts/seo_audit.py https://example.com /services /blog/top-article
It returns, per page: a page kind (homepage, article, blog hub, product, page), an SEO score and a GEO score out of 100 with a ranked FINDINGS list (same thresholds and weights as the Sorank SEO Analyzer extension, codes explained in checklist section 15), and the facts behind them: HTTP status, HTTPS, platform fingerprint, title (with generic-title flag), meta description length, full heading hierarchy with level jumps, image alt coverage and weight sample, internal versus external link counts, Open Graph, canonical, JSON-LD types, visible word count, meta robots, an em dash and en dash count with samples (checklist 6.4: an AI-writing tell to find-and-replace with commas), a likely_js_rendered flag, bold count and samples, top terms with density and two-word phrases, the keyword placement matrix (title and H1 terms across title, H1, H2-H6, meta, URL, intro, bold, alt), readability (sentence-length buckets, Flesch), citability counts (statistics, definitions, quotes, question headings, snippable paragraphs), link quality (nofollow, sponsored, ugc, empty and generic anchors), social profiles and placeholder links, head tags (charset, favicon, Twitter card, Open Graph keys, meta refresh, hreflang validation), URL hygiene, mixed content, text-to-HTML ratio, DOM size, image format, dimensions and LCP lazy-loading, JSON-LD parse errors and missing or empty required properties per type, and template detection (table of contents, author block and author page link, dates, breadcrumb, commercial links in the body, blog hub card images). Site-wide: robots.txt rules for AI search bots, AI user-fetch agents, and AI training bots (three separate groups), sitemap declaration and URL count, llms.txt presence.
For the site-level view a page audit cannot give (orphans, click depth, weak inbound links, broken links and redirects, duplicate titles and H1, cannibalization candidates, stale pages), crawl the site:
python3 ../seo-internal-linking/scripts/site_crawl.py https://example.com --max-pages 500 --out crawl.json
With Search Console exports for two consecutive periods (and the same period a year earlier), ../seo-traffic-drop/scripts/content_decay.py lists the pages losing traffic and why (ranking, CTR, demand, seasonal), stale pages first.
To compare one page with the pages that outrank it, run the benchmark on the client page and 3-5 competitor pages of the same type:
python3 scripts/page_benchmark.py --type service https://example.com/service https://rival-a.com/service https://rival-b.com/service
It prints one table (scores, words, bold, headings, tables, statistics, placement, schema, template blocks, social profiles, and every block section_audit.py detects), the blocks half or more of the competitors have and the client does not, the schema types they use, the metrics where the client sits below the competitor median, and the vocabulary gap (terms and phrases half the competitors use and the client never does, with the competitor headings that carry them). The page skills (homepage, service, product, collection, comparison, blog, local, page sections) run it as their Phase 3; the 27 requirements every page shares are in references/common-page-spec.md.
It also collects the measurement tags on every page (GA4, GTM, other analytics, Search Console verification meta) and ends with a measurement coverage summary that names the pages where the GA4 tag is missing.
Measurement is collected on EVERY page, not once for the domain: the usual failure is a tag pasted into one template and never into the others, which no site-wide check can see. Three outcomes, and they are not the same finding:
| Report says | What it means | What to do |
|---|---|---|
GA4: G-XXXXXXXX | the tag is in the raw HTML | nothing |
GA4: unknown (a GTM container can load it) | GTM is there, no G- id in the HTML | open the container or the browser Tag Assistant before writing anything; a GTM-loaded GA4 leaves no trace in the source |
NO MEASUREMENT AT ALL | no GA4, no GTM, no other analytics | real finding, and it blocks every later recommendation |
The Search Console line reads the google-site-verification meta tag only. Its absence proves nothing: DNS records, an HTML file, GA4 and GTM verify a property just as well and leave nothing in the page. Ask the owner instead of declaring the property unverified.
Known limits, and what to do about each:
| Limit | Fallback |
|---|---|
likely_js_rendered: true (client-side site) | Open the page in a browser to read the real content, and report that AI crawlers cannot see it (they do not execute JavaScript, see seo-technical) |
| Images loaded as CSS backgrounds | Invisible to the parser (total may read 0); verify visually |
| Real-world speed | Ask the user to run https://pagespeed.web.dev (free, no key) on mobile and desktop and share scores |
| Backlink profile | Use GSC Links report or Bing Webmaster Tools if available; paid indexes (Ahrefs, Semrush, Moz) only as an option |
| GSC indexation ratio, Google Business Profile | Ask the owner; never invent these numbers |
| Tags injected by a consent manager or a server-side container | Invisible in raw HTML; confirm in the browser before reporting a missing GA4 |
Read references/audit-checklist.md now. It contains the full 15-category checklist with thresholds, detection methods, and the reason behind each rule. Work through it in this order, skipping categories that do not apply to the site type:
| # | Category | Applies to |
|---|---|---|
| 1 | Method and framing | all |
| 2 | Tags (title, meta, headings, slugs) | all |
| 3 | Images | all |
| 4 | Performance and indexation | all |
| 5 | Architecture (one intent = one page) | all |
| 6 | Content volume | all |
| 7 | Keywords and intent | all |
| 8 | Blog and articles | sites with a blog (or that need one) |
| 9 | GEO (AI visibility) | all |
| 10 | Conversion signals | all |
| 11 | E-commerce (products, collections) | stores |
| 12 | Backlinks and mentions | all |
| 13 | Local (Google Business Profile) | local businesses |
| 14 | Migration risks | sites about to change domain, CMS or structure |
| 15 | Measured page checks (the script's FINDINGS codes and scores) | all |
While analyzing:
For the same pages, evaluate AI visibility specifically:
Read references/output-templates.md and pick the format:
Rules for both: no em dash (U+2014) and no en dash (U+2013) anywhere in the deliverable, commas instead (a colon, a period or parentheses when a comma loses the sense); the em dash is the most recognizable tell of AI-written text and an audit that reads as machine output loses the authority its findings need. Flag the same thing as a finding when the audited pages carry em dashes: it is a live AI-writing tell on the client's own site, and the fix is a find-and-replace to commas. Then: write in the language of the site, open with what is genuinely good (credibility, and most sites do several things right), keep the verdict honest even when it is "rebuild before investing in content", and state explicitly what was not verified and why. Never print dates, delays or a schedule for the fixes (no "week 1", no When column): the numbered order is the plan, the only date is the audit date.
Reassure before you criticize: lead with honest numbered reference points ("this is already better than 90 percent of the sites I see", "I am very demanding on the score, above 80 percent is very good") so the owner trusts the findings instead of bracing for them. Explain the score as a ratio of errors to pages, where a template-level error repeats across all pages built on that template and one fix corrects it everywhere, so a low number does not warrant panic or a misread comparison against another tool (field heuristic from 115+ agency audits).
| Finding | Skill to apply the fix |
|---|---|
| A dated loss of traffic or rankings, rather than a site that never performed | seo-traffic-drop |
| Crawl, speed, indexation, JS rendering, AI bot access | seo-technical |
| Sitemap format, readable sitemap view, sitemap index, lastmod honesty | seo-sitemap |
| Wrong or missing keywords, cannibalization | seo-keyword-research |
| Weak or thin articles | seo-content-blog |
| Product page issues | seo-content-product-page |
| Thin homepage or sales page (no bold, no proof numbers, generic FAQ, no Organization or Course schema) | seo-content-homepage |
| Article template gaps (no table of contents, author box, dates, CTA) or a blog hub without cover images | seo-content-blog (references/blog-templates.md) |
| Service pages missing or merged | seo-content-service-page |
| Category pages with no content | seo-content-collection-page |
| Whole blocks absent from a page (no FAQ, no breadcrumb, no price in text) | seo-page-sections |
| No comparison or alternatives pages, so competitors own those queries | seo-content-comparison-page |
| Orphan pages, weak internal links | seo-internal-linking |
| Missing or invalid structured data | seo-schema-markup |
| Weak link profile, no brand mentions | seo-backlinks |
| Local visibility, reviews, GBP | seo-local |
| Low AI citation rate | geo-visibility |
| No AI traffic measurement | geo-tracking |
Not using the CLI? Copy the SKILL.md and paste it straight into ChatGPT, Claude, or any agent.