AI Search Audit (Full) skill

AI Search Audit (Full) — ai-search-audit-full — Demo/output image published by the author (repo README): A page report from the example run: the headline, what it means for you, the findings to review first and where on the page they are

Illustration · not a resultFrom the Olexan-art/ai-search-audit-full README — shows the whole collection, not only this skill.source ↗

Audits 1 public web page, or at most 50 pages of a site, for search and AI search (SEO and GEO): robots.txt for AI crawlers, noindex, snippets, sitemap, links, images, structured data, hreflang, how an AI retriever reads the page, and the agent's reading of questions, brand and reviews.

by Olexan-art·MIT license·★ 2 Stars on the repo·GitHub ↗

Use now

Files of AI Search Audit (Full)

Olexan-art/main1 file shown
SKILL.md
Show the full text147 lines

Version 2.111.

AI Search Audit (Full)

Purpose

The skill audits 1 public page, or at most 50 pages of a site, against the published rules of Google, Bing and AI assistants. 2 scripts read and check the pages; you write 4 judgement files (questions, style, brand, reviews). The result is an HTML report with a history; it does not measure what any assistant answers.

Requirements

  • Node 20.18 or later (node --version). If it is missing or older, tell the user and stop.
  • Install: none. dist/read.mjs and dist/audit.mjs (with dist/chunks/) run with plain node.
  • $SKILL is the folder of this file: ${CLAUDE_SKILL_DIR} in Claude Code, the path you read it from on claude.ai.
  • Work in a writable directory of your own. Call the scripts by their path.
  • Network: the page, bounded site files and links, 1 DNS lookup, 1 RDAP request to rdap.org (the site's IP). Nothing is uploaded. Site pages: 1 at a time, 1 second apart by default (at least 0.5), only where robots.txt allows.

Rules

R1. Answer in the user's language. R2. Write every JSON file with the file-writing tool, never a shell heredoc (heredocs break on apostrophes). R3. Never re-create the audit by hand. If the scripts cannot run, tell the user what would make them run, and stop. R4. Never fetch the page another way or make a saved copy with a browsing or fetch tool. Use only files the user gives. R5. Never write Russian. The scripts call no model; the only judgement in the report is yours. R6. Brand and reviews: own knowledge only. Do not browse, search, fetch or read the page for them. R7. Never guess agent or model; leave out the one you do not know. R8. Do not claim any assistant indexes, ranks or will cite the page. Add no score of your own. Never say AI wrote the page, or did not. R9. Do not volunteer fixes. When asked, point to "Details for specialists"; label any further advice as yours.

Procedure: one page

  1. Read (script). node "$SKILL/dist/read.mjs" <url> --out reading.json
    • --render adds a render in local Chrome or Chromium; an empty app shell is rendered without it.
    • Result: reading.json and reviews.template.json.
    • On REFUSED <code> (exit 2): go to step 7 with no judgement files (see When the read is refused). Do not try another URL unless asked.
    • Saved copy (--html saved.html --final-url <url>, --robots, --network, --saved-at): see references/network-and-limits.md.
  2. Write questions.json and style.json (judgement). First read the full text of every passage in vs.passages.
  3. Write brand.json (judgement). The brand is the site's own name. Answer the 5 fixed questions.
  4. Write reviews.json (judgement) from reviews.template.json.
  5. Check (script). node "$SKILL/dist/audit.mjs" reading.json --questions questions.json --style style.json --brand brand.json --reviews reviews.json --check
    • Writes nothing. On REFUSED <file>: <reason>, fix that file and run it again. A warning is advice.
  6. Find earlier reports (judgement) of this skill, any page or site: report.html, index.html, export.json, site.json. Look in attached files, the user's folder (Cowork's folder, the outputs folder) and where reports were saved.
  7. Write the report (script). node "$SKILL/dist/audit.mjs" reading.json --questions questions.json --style style.json --brand brand.json --reviews reviews.json --html report.html --md report.md --json export.json
    • Add --history-from <file or folder> once per report from step 6.
    • Add --history <dir> for another history folder (default ~/.ai-search-audit/history), or --no-history to save nothing. Never both --no-history and --history-from.
    • Add --keyword "phrase" for the user's keyword (default: from the h1), --compare old-export.json for an older export.
    • Result: the 3 files, the problems numbered as on the report's map, the export saved in the history.
    • No earlier report and an empty history: tell the user once that the history starts now and the report carries it; keep it and attach it next time.
  8. Show the report (required). The chat summary goes with it, never instead.

Procedure: a site

  1. Read (script). node "$SKILL/dist/read.mjs" --urls urls.txt --out-dir readings (1 URL per line, # comments), or node "$SKILL/dist/read.mjs" --sitemap https://example.com/sitemap.xml --out-dir readings (same host; at most 5 child sitemaps).
    • --max N lowers the cap (at most 50). --delay ms lengthens the pause (default 1000, at least 500).
    • Result: readings/<page>.json, readings/site.json, readings/reviews.template.json; prints evaluated N of M and what was left out, and why.
  2. Write judgement files (judgement). Per page: questions/<page>.json, style/<page>.json (<page> = reading file name without .json). Once: brand.json, reviews.json. A page without its file is audited without that judgement.
  3. Check (script). node "$SKILL/dist/audit.mjs" --site readings/site.json --questions-dir questions --style-dir style --brand brand.json --reviews reviews.json --check
  4. Find earlier reports, as in one-page step 6.
  5. Write the report (script). node "$SKILL/dist/audit.mjs" --site readings/site.json --questions-dir questions --style-dir style --brand brand.json --reviews reviews.json --out-dir report
    • Add --history-from, --history <dir> or --no-history, and --keyword, as in one-page step 7. --compare old-site.json takes an older site.json; pages match by URL.
    • Result: report/index.html (the site report), report/site.md, report/site.json, and report/pages/<page>.html|md|json.
  6. Show the site report, report/index.html.

When the read is refused

  1. Run the report step with no judgement files, show the report, and tell the user the code's line from Refusal codes.
  2. unreachable: also follow If the page cannot be fetched in references/network-and-limits.md.
  3. refused_ru_* and refused_language_ru: 1 line in the chat, the report, and stop. Do not analyse the page another way.
  4. Site: refused_ru_domain, refused_ru_hosting or refused_ru_audience after the list refuses the whole site (run stopped, earlier readings deleted, the rest site_refused). Run node "$SKILL/dist/audit.mjs" --site readings/site.json --out-dir report with no judgement files, show it, say why, and stop.
  5. Site: refused_language_ru refuses only that page; continue.

Judgement files

Read references/judgement-files.md first: schemas, examples, the 5 brand questions, the review template.

  • All 4: top-level agent (your product) and model (your model's name), at most 60 characters each. Questions in the page's language; brand and review answers in English. The script refuses a letter Russian uses and the page's language does not (on a Ukrainian page, the 4 letters only Russian writes); quotes are checked against the page.
  • questions.json: topic; 8 to 12 questions with id, question, axes, passage (the index of a passage in vs.passages, 0-based, or null), verdict, citable, quote, miss.
    • axes: 1 to 3 of urgency, device, object, obstacle; each used somewhere. verdict: complete, partial, missing.
    • quote: verbatim from that passage, at most 400 characters, none when missing.
    • miss: every partial and missing answer, 1 line, at most 200 characters, what the page lacks (the report's answer map).
    • First-person speech, mostly without the keyword, no wake words, no padded duplicates, at least 1 the page probably does not answer. Judge from the passages only.
  • style.json: every passage once, specific or generic by the swap test (would it fit a competitor's page with only the brand changed?). evidence verbatim, at most 200 characters; why optional. Not an AI detector.
  • brand.json: brand, basis: "own_knowledge", the 5 questions once each with knows and answer (at most 1,500 characters).
    • Known: "knows": true. Half-known: "knows": true, and say in the answer that you are not sure ("Not sure: …", "…, but I am not certain"). Unknown: "knows": false, "answer": "".
    • The script counts an answer as "knows": false, without a refusal, when its first 400 characters disclaim knowledge ("I don't have information", "not familiar with", "unable to find"; more in the reference). "Not sure" and "not certain" do not count.
    • Do not soften a guess into a fact or copy the page.
  • reviews.json: the template's platforms, each once, none added or removed; fill in brand. Each: "knows": true with rating on its scale (5; TrustRadius 10; Product Hunt whole upvotes), or "knows": false. reviews (whole count) optional. Judge each platform separately, from your own knowledge of the brand on that platform.

Verification

  • Every JSON file was written with the file-writing tool.
  • The final runs printed no REFUSED (a refused read excepted).
  • The HTML report exists where the user keeps files.
  • No file holds Russian or a guessed agent or model.

Show the report

The HTML is the result; a chat message or a file name alone has not delivered it. Save it where the user keeps files, never only in a scratch folder (the next run's history needs it).

If the user or caller said not to publish or open anything, stop when the HTML file exists and give its absolute path. This overrides the bullets below.

Present one file: report.html (for a site, report/index.html). Keep report.md and export.json beside it; do not present, attach, open or preview them. Never open or preview export.json or report.md as the result, and never end the reply on either: the HTML is the report. If the environment shows the last file presented, it must be the HTML.

  • claude.ai or the Claude desktop app: save it in the folder your environment names for user files, then present only report.html, not even the JSON after it. For a site, zip report, present only the zip, and say index.html is the start. Do not retype the report into an artifact.
  • Claude Code: publish only report.html with an HTML or artifact tool, if there is one, and give the link (for a site, open index.html locally). Otherwise run start "" "<absolute path>" (Windows), open "<absolute path>" (macOS) or xdg-open "<absolute path>" (Linux), and give the path.
  • Codex, opencode, Hermes Agent or any other agent: give the absolute path and offer to open it. Name the other files only if asked.

The report works offline. It opens in English and in the light theme; add #lang=uk, #lang=pl or #theme=dark (report.html#lang=pl&theme=dark). Give a Ukrainian or Polish user that #lang.

Chat summary

  • First: a blocked crawler (ai_search_blocked, search_engine_blocked, robots_unreachable), snippet_blocked or noindex.
  • The verdict line and severity counts. Site: pages evaluated of found, left out, problems on most pages.
  • Problems 1 to 5, with where, in the report's words.
  • Changes since the last run; --compare counts; the history size the run prints; if it started empty, that the report carries it.
  • Every cap printed (links past 30, images past 20, alternates past 10, child sitemaps past 5, pages past 50, merged map sections, a failed render).
  • Once: the checks are deterministic, each on a published rule or a named threshold; questions, brand and reviews are your judgement as 1 named model, not ChatGPT, Gemini or Perplexity (the web Brandscope and Reviewscope ask 3).
  • 1 line: Pattern score and band, marker words per 1,000 words, passages you judged generic.

Refusal codes

Code Tell the user
invalid_url Not a web address; ask for a page's full URL.
blocked_scheme Only http and https pages can be read.
blocked_host, blocked_address Not a public page: localhost, a private network or a non-standard port.
unreachable The page could not be reached; it may be down, or the name does not resolve.
http_error An error status, or more than 5 redirects.
blocked The site turns automated readers away (401, 403, 429); retrying will not help.
not_html A file such as a PDF or an image, not an HTML page.
too_large Over the 3 MB ceiling.
empty No readable text once navigation and boilerplate were removed.
refused_ru_domain, refused_ru_hosting, refused_ru_audience, refused_language_ru Not analysed: a Russian domain zone (.ru, .su, .рф, .москва, .moscow) or hosting in Russia (RDAP country RU), both not fetched; a declared Russian-language version (hreflang, og:locale, Content-Language); a page in Russian.

References

File Read when
references/judgement-files.md Before writing a judgement file.
references/network-and-limits.md A fetch fails, no network, a read-only skill folder, a saved copy, or questions on requests and limits.
references/checks.md Questions on a code, a check, a threshold, or why something was flagged.
references/outputs-and-history.md Questions on a file, the export format, history, drift or --compare.
1---
2name: ai-search-audit-full
3description: Audits 1 public web page, or at most 50 pages of a site, for search and AI search (SEO and GEO): robots.txt for AI crawlers, noindex, snippets, sitemap, links, images, structured data, hreflang, how an AI retriever reads the page, and the agent's reading of questions, brand and reviews. Each problem has its rule source and a fix direction; a history is kept. Use for an SEO or GEO audit, AI search readiness, why Google, ChatGPT or Perplexity do not show or quote a page, or what changed since the last audit. Also «SEO-аудит сайту», «audyt SEO serwisu». For passages only, use vectorscope. For a quick check of 1 page, use ai-search-audit.
4---
5 
6Version 2.111.
7 
8# AI Search Audit (Full)
9 
10## Purpose
11 
12The skill audits 1 public page, or at most 50 pages of a site, against the published rules of Google, Bing and AI assistants. 2 scripts read and check the pages; you write 4 judgement files (questions, style, brand, reviews). The result is an HTML report with a history; it does not measure what any assistant answers.
13 
14## Requirements
15 
16- Node 20.18 or later (`node --version`). If it is missing or older, tell the user and stop.
17- Install: none. `dist/read.mjs` and `dist/audit.mjs` (with `dist/chunks/`) run with plain `node`.
18- `$SKILL` is the folder of this file: `${CLAUDE_SKILL_DIR}` in Claude Code, the path you read it from on claude.ai.
19- Work in a writable directory of your own. Call the scripts by their path.
20- Network: the page, bounded site files and links, 1 DNS lookup, 1 RDAP request to `rdap.org` (the site's IP). Nothing is uploaded. Site pages: 1 at a time, 1 second apart by default (at least 0.5), only where robots.txt allows.
21 
22## Rules
23 
24R1. Answer in the user's language.
25R2. Write every JSON file with the file-writing tool, never a shell heredoc (heredocs break on apostrophes).
26R3. Never re-create the audit by hand. If the scripts cannot run, tell the user what would make them run, and stop.
27R4. Never fetch the page another way or make a saved copy with a browsing or fetch tool. Use only files the user gives.
28R5. Never write Russian. The scripts call no model; the only judgement in the report is yours.
29R6. Brand and reviews: own knowledge only. Do not browse, search, fetch or read the page for them.
30R7. Never guess `agent` or `model`; leave out the one you do not know.
31R8. Do not claim any assistant indexes, ranks or will cite the page. Add no score of your own. Never say AI wrote the page, or did not.
32R9. Do not volunteer fixes. When asked, point to "Details for specialists"; label any further advice as yours.
33 
34## Procedure: one page
35 
361. **Read (script).** `node "$SKILL/dist/read.mjs" <url> --out reading.json`
37 - `--render` adds a render in local Chrome or Chromium; an empty app shell is rendered without it.
38 - Result: `reading.json` and `reviews.template.json`.
39 - On `REFUSED <code>` (exit 2): go to step 7 with no judgement files (see *When the read is refused*). Do not try another URL unless asked.
40 - Saved copy (`--html saved.html --final-url <url>`, `--robots`, `--network`, `--saved-at`): see `references/network-and-limits.md`.
412. **Write `questions.json` and `style.json` (judgement).** First read the full `text` of every passage in `vs.passages`.
423. **Write `brand.json` (judgement).** The brand is the site's own name. Answer the 5 fixed questions.
434. **Write `reviews.json` (judgement)** from `reviews.template.json`.
445. **Check (script).** `node "$SKILL/dist/audit.mjs" reading.json --questions questions.json --style style.json --brand brand.json --reviews reviews.json --check`
45 - Writes nothing. On `REFUSED <file>: <reason>`, fix that file and run it again. A `warning` is advice.
466. **Find earlier reports (judgement)** of this skill, any page or site: `report.html`, `index.html`, `export.json`, `site.json`. Look in attached files, the user's folder (Cowork's folder, the outputs folder) and where reports were saved.
477. **Write the report (script).** `node "$SKILL/dist/audit.mjs" reading.json --questions questions.json --style style.json --brand brand.json --reviews reviews.json --html report.html --md report.md --json export.json`
48 - Add `--history-from <file or folder>` once per report from step 6.
49 - Add `--history <dir>` for another history folder (default `~/.ai-search-audit/history`), or `--no-history` to save nothing. Never both `--no-history` and `--history-from`.
50 - Add `--keyword "phrase"` for the user's keyword (default: from the h1), `--compare old-export.json` for an older export.
51 - Result: the 3 files, the problems numbered as on the report's map, the export saved in the history.
52 - No earlier report and an empty history: tell the user once that the history starts now and the report carries it; keep it and attach it next time.
538. **Show the report** (required). The chat summary goes with it, never instead.
54 
55## Procedure: a site
56 
571. **Read (script).** `node "$SKILL/dist/read.mjs" --urls urls.txt --out-dir readings` (1 URL per line, `#` comments), or `node "$SKILL/dist/read.mjs" --sitemap https://example.com/sitemap.xml --out-dir readings` (same host; at most 5 child sitemaps).
58 - `--max N` lowers the cap (at most 50). `--delay ms` lengthens the pause (default 1000, at least 500).
59 - Result: `readings/<page>.json`, `readings/site.json`, `readings/reviews.template.json`; prints `evaluated N of M` and what was left out, and why.
602. **Write judgement files (judgement).** Per page: `questions/<page>.json`, `style/<page>.json` (`<page>` = reading file name without `.json`). Once: `brand.json`, `reviews.json`. A page without its file is audited without that judgement.
613. **Check (script).** `node "$SKILL/dist/audit.mjs" --site readings/site.json --questions-dir questions --style-dir style --brand brand.json --reviews reviews.json --check`
624. **Find earlier reports**, as in one-page step 6.
635. **Write the report (script).** `node "$SKILL/dist/audit.mjs" --site readings/site.json --questions-dir questions --style-dir style --brand brand.json --reviews reviews.json --out-dir report`
64 - Add `--history-from`, `--history <dir>` or `--no-history`, and `--keyword`, as in one-page step 7. `--compare old-site.json` takes an older `site.json`; pages match by URL.
65 - Result: `report/index.html` (the site report), `report/site.md`, `report/site.json`, and `report/pages/<page>.html|md|json`.
666. **Show the site report**, `report/index.html`.
67 
68## When the read is refused
69 
701. Run the report step with no judgement files, show the report, and tell the user the code's line from *Refusal codes*.
712. `unreachable`: also follow *If the page cannot be fetched* in `references/network-and-limits.md`.
723. `refused_ru_*` and `refused_language_ru`: 1 line in the chat, the report, and stop. Do not analyse the page another way.
734. Site: `refused_ru_domain`, `refused_ru_hosting` or `refused_ru_audience` after the list refuses the whole site (run stopped, earlier readings deleted, the rest `site_refused`). Run `node "$SKILL/dist/audit.mjs" --site readings/site.json --out-dir report` with no judgement files, show it, say why, and stop.
745. Site: `refused_language_ru` refuses only that page; continue.
75 
76## Judgement files
77 
78Read `references/judgement-files.md` first: schemas, examples, the 5 brand questions, the review template.
79 
80- **All 4:** top-level `agent` (your product) and `model` (your model's name), at most 60 characters each. Questions in the page's language; brand and review answers in English. The script refuses a letter Russian uses and the page's language does not (on a Ukrainian page, the 4 letters only Russian writes); quotes are checked against the page.
81- **questions.json:** `topic`; 8 to 12 questions with `id`, `question`, `axes`, `passage` (the `index` of a passage in `vs.passages`, 0-based, or `null`), `verdict`, `citable`, `quote`, `miss`.
82 - `axes`: 1 to 3 of `urgency`, `device`, `object`, `obstacle`; each used somewhere. `verdict`: `complete`, `partial`, `missing`.
83 - `quote`: verbatim from that passage, at most 400 characters, none when `missing`.
84 - `miss`: every `partial` and `missing` answer, 1 line, at most 200 characters, what the page lacks (the report's answer map).
85 - First-person speech, mostly without the keyword, no wake words, no padded duplicates, at least 1 the page probably does not answer. Judge from the passages only.
86- **style.json:** every passage once, `specific` or `generic` by the swap test (would it fit a competitor's page with only the brand changed?). `evidence` verbatim, at most 200 characters; `why` optional. Not an AI detector.
87- **brand.json:** `brand`, `basis: "own_knowledge"`, the 5 questions once each with `knows` and `answer` (at most 1,500 characters).
88 - Known: `"knows": true`. Half-known: `"knows": true`, and say in the answer that you are not sure ("Not sure: …", "…, but I am not certain"). Unknown: `"knows": false`, `"answer": ""`.
89 - The script counts an answer as `"knows": false`, without a refusal, when its first 400 characters disclaim knowledge ("I don't have information", "not familiar with", "unable to find"; more in the reference). "Not sure" and "not certain" do not count.
90 - Do not soften a guess into a fact or copy the page.
91- **reviews.json:** the template's platforms, each once, none added or removed; fill in `brand`. Each: `"knows": true` with `rating` on its scale (5; TrustRadius 10; Product Hunt whole upvotes), or `"knows": false`. `reviews` (whole count) optional. Judge each platform separately, from your own knowledge of the brand on that platform.
92 
93## Verification
94 
95- [ ] Every JSON file was written with the file-writing tool.
96- [ ] The final runs printed no `REFUSED` (a refused read excepted).
97- [ ] The HTML report exists where the user keeps files.
98- [ ] No file holds Russian or a guessed `agent` or `model`.
99 
100## Show the report
101 
102The HTML is the result; a chat message or a file name alone has not delivered it. Save it where the user keeps files, never only in a scratch folder (the next run's history needs it).
103 
104If the user or caller said not to publish or open anything, stop when the HTML file exists and give its absolute path. This overrides the bullets below.
105 
106**Present one file: `report.html`** (for a site, `report/index.html`). Keep `report.md` and `export.json` beside it; do not present, attach, open or preview them. Never open or preview `export.json` or `report.md` as the result, and never end the reply on either: the HTML is the report. If the environment shows the last file presented, it must be the HTML.
107 
108- **claude.ai or the Claude desktop app:** save it in the folder your environment names for user files, then present **only `report.html`**, not even the JSON after it. For a site, zip `report`, present only the zip, and say `index.html` is the start. Do not retype the report into an artifact.
109- **Claude Code:** publish only `report.html` with an HTML or artifact tool, if there is one, and give the link (for a site, open `index.html` locally). Otherwise run `start "" "<absolute path>"` (Windows), `open "<absolute path>"` (macOS) or `xdg-open "<absolute path>"` (Linux), and give the path.
110- **Codex, opencode, Hermes Agent or any other agent:** give the absolute path and offer to open it. Name the other files only if asked.
111 
112The report works offline. It opens in English and in the light theme; add `#lang=uk`, `#lang=pl` or `#theme=dark` (`report.html#lang=pl&theme=dark`). Give a Ukrainian or Polish user that `#lang`.
113 
114## Chat summary
115 
116- First: a blocked crawler (`ai_search_blocked`, `search_engine_blocked`, `robots_unreachable`), `snippet_blocked` or `noindex`.
117- The verdict line and severity counts. Site: pages evaluated of found, left out, problems on most pages.
118- Problems 1 to 5, with where, in the report's words.
119- Changes since the last run; `--compare` counts; the history size the run prints; if it started empty, that the report carries it.
120- Every cap printed (links past 30, images past 20, alternates past 10, child sitemaps past 5, pages past 50, merged map sections, a failed render).
121- Once: the checks are deterministic, each on a published rule or a named threshold; questions, brand and reviews are your judgement as 1 named model, not ChatGPT, Gemini or Perplexity (the web Brandscope and Reviewscope ask 3).
122- 1 line: Pattern score and band, marker words per 1,000 words, passages you judged generic.
123 
124## Refusal codes
125 
126| Code | Tell the user |
127|---|---|
128| `invalid_url` | Not a web address; ask for a page's full URL. |
129| `blocked_scheme` | Only http and https pages can be read. |
130| `blocked_host`, `blocked_address` | Not a public page: localhost, a private network or a non-standard port. |
131| `unreachable` | The page could not be reached; it may be down, or the name does not resolve. |
132| `http_error` | An error status, or more than 5 redirects. |
133| `blocked` | The site turns automated readers away (401, 403, 429); retrying will not help. |
134| `not_html` | A file such as a PDF or an image, not an HTML page. |
135| `too_large` | Over the 3 MB ceiling. |
136| `empty` | No readable text once navigation and boilerplate were removed. |
137| `refused_ru_domain`, `refused_ru_hosting`, `refused_ru_audience`, `refused_language_ru` | Not analysed: a Russian domain zone (.ru, .su, .рф, .москва, .moscow) or hosting in Russia (RDAP country RU), both not fetched; a declared Russian-language version (hreflang, og:locale, Content-Language); a page in Russian. |
138 
139## References
140 
141| File | Read when |
142|---|---|
143| `references/judgement-files.md` | Before writing a judgement file. |
144| `references/network-and-limits.md` | A fetch fails, no network, a read-only skill folder, a saved copy, or questions on requests and limits. |
145| `references/checks.md` | Questions on a code, a check, a threshold, or why something was flagged. |
146| `references/outputs-and-history.md` | Questions on a file, the export format, history, drift or `--compare`. |
147 

Discussion

Alternatives

Agentic Browsing ReadinessAudit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).Marketing · MITBacklink Profile AnalysisBacklink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis. Works with free APIs (Moz, Bing Webmaster, Common Crawl) and DataForSEO extension. Use when user says backlinks, link profile, referring domains, anchor text, toxic links, link gap, link building, disavow, or backlink audit.Marketing · MIT/setup-cmsConnect a CMS to notfair SEO tools. Guides users through configuring WordPress, Strapi, Contentful, or Ghost — tests the connection, and writes credentials to .env.local. Once set up, seo-analysis automatically cross- references CMS content against Google Search Console data. Use whenever the user says "connect my CMS", "set up WordPress", "configure Strapi", "add Contentful", "connect Ghost", or "CMS setup". Also trigger if the user asks why no CMS data appears in a seo-analysis report. · MITBacklink checkBacklink profile for any domain — referring domains, authority, anchors, new/lost links, and a side-by-side vs a competitor. Use when asked "check my backlinks", "backlink profile of X", "who links to them", or "link gap vs competitor".Marketing · MIT