# SEO / GEO pack: audit search visibility and readiness for AI answers

> SEO / GEO: three agents audit search visibility and visibility in AI-generated answers (content quality, structured data, AI-readiness) with 15 commands. Install, keys, examples, limits.

Canonical: https://bmad-plus.rochetta.fr/docs/packs/seo/
Language: en
BMAD+ version: 0.23.1
Documentation reviewed: 2026-10-19
Author: Laurent Rochetta
License: MIT

BMAD+ documentation › [Packs](https://bmad-plus.rochetta.fr/docs/packs/) › SEO / GEO pack: audit search visibility and readiness for AI answers

The SEO / GEO pack audits a website for two things. SEO is visibility in search-engine results. GEO (generative engine optimisation) is visibility in the answers that AI assistants and AI overviews generate: whether their crawlers may read the site, whether the content and structured data are good enough to be quoted, and how ready the pages are for it. The pack brings three agents that share one command, `/seo`: Scout crawls and inspects, Judge assesses content, structured data and AI readiness, and Chief scores, plans and reports. It works with a small Python toolkit when one is available and falls back to a prompts-only mode when it is not, in which case it refuses to invent numbers.

<a id="when-to-use"></a>
## When to use it

- Before a launch or after a redesign, to catch indexing, canonical, redirect and security-header problems.
- When organic traffic drops and you need a prioritised list of causes and a 30, 60 and 90-day plan.
- To check whether AI crawlers can read the site, whether it has an `llms.txt` file, and how citable its passages are.
- To benchmark your site against a competitor, or to track the score over time.

<a id="installed"></a>
## What is installed

SEO is a packaged pack: it lives in `.agents/skills/pack-seo/` with the router `SKILL.md` (the skill is named `seo-engine`), the three agent files `seo-scout.md`, `seo-chief.md` and `seo-judge.md`, a `checklist.md`, a `pagespeed-playbook.md`, reference files in `ref/`, report templates, `requirements.txt` and the Python scripts in `scripts/`. The registry lists no separate skills for this pack.

**Three agents, ten roles**

| Agent | Roles | What it does |
| --- | --- | --- |
| SEO Scout (Technical Scanner) | `Crawler`, `Inspector`, `Photographer` | Crawls and maps the site, runs nine categories of technical checks, takes mobile and desktop screenshots. |
| SEO Judge (Content & AI Analyst) | `Content Expert`, `Schema Master`, `GEO Analyst` | Grades E-E-A-T and content quality, validates structured data, measures AI-search readiness. |
| SEO Chief (Strategist & Reporter) | `Scorer`, `Strategist`, `Reporter`, `Benchmarker` | Computes the SEO Health Score, prioritises issues, writes the plan and the fixes, reports, compares, benchmarks. |

<a id="commands"></a>
### The 15 /seo commands

**Command router**

| Command | Agent | Action |
| --- | --- | --- |
| `/seo full <url>` | Scout, Judge, Chief | All six phases |
| `/seo quick <url>` | Scout, Judge, Chief | Phases 1 to 4 only |
| `/seo technical <url>` | Scout (Inspector) | Phase 2 technical checks only |
| `/seo content <url>` | Judge (Content Expert) | Phase 2 content checks only |
| `/seo geo <url>` | Judge (GEO Analyst) | AI-search readiness (phase 3) |
| `/seo schema <url>` | Judge (Schema Master) | Structured-data detection and validation |
| `/seo images <url>` | Judge (Content Expert) | Image audit subset |
| `/seo hreflang <url>` | Scout (Inspector) | Hreflang audit |
| `/seo pagespeed <url>` | Scout and Chief | PageSpeed perfection loop |
| `/seo plan <type>` | Chief (Strategist) | Strategic plan for saas, ecommerce, local, publisher or agency |
| `/seo fix` | Chief (Strategist) | Generate fixes from the last audit |
| `/seo history` | Chief (Reporter) | Show the score history |
| `/seo compare` | Chief (Reporter) | Compare with the previous audit |
| `/seo competitor <url1> <url2>` | Scout, Judge, Chief | Benchmark two sites |
| `/seo api <url>` | A script | Google APIs: PageSpeed, CrUX, mobile-friendly test |

<a id="phases"></a>
### The six phases of a full audit

1. Reconnaissance: fetch the home page, crawl to a depth of 2 and at most 25 pages, detect the business type (SaaS, e-commerce, local, publisher, agency), look for `robots.txt`, `sitemap.xml` and `llms.txt`. A checkpoint asks whether to continue.
2. Deep scan, run in parallel: Scout checks nine technical categories (crawlability, indexability, security, URL structure, mobile, Core Web Vitals, structured-data detection, JavaScript rendering, IndexNow) while Judge checks E-E-A-T, content quality, schema and images.
3. AI readiness: access for GPTBot, ClaudeBot and PerplexityBot, `llms.txt`, passage citability (blocks of 134 to 167 words), and an AI Readiness Score from 0 to 100.
4. Scoring: the SEO Health Score from 0 to 100, only when every weighted category has verified inputs.
5. Action plan: issues classed critical, high, medium or low, quick wins, a 30, 60 and 90-day roadmap, generated fixes (meta tags, JSON-LD, `robots.txt`, `llms.txt`). A checkpoint asks whether to apply fixes. A PageSpeed loop can follow.
6. Monitoring, optional: save the results under `.bmad-seo/history/` and compare with the previous audit.

**SEO Health Score weights**

| Category | Weight |
| --- | --- |
| Technical SEO | 20 % |
| Content & E-E-A-T | 22 % |
| On-Page SEO | 18 % |
| Schema | 10 % |
| Performance (Core Web Vitals) | 12 % |
| AI Readiness (GEO) | 12 % |
| Images | 6 % |

<a id="quick-start"></a>
## Quick start

1. **Install the pack** Core is added automatically. Prompts-only mode needs nothing else.

   ```sh
   npx bmad-plus install --packs seo
   ```
2. **Optional: provision the Python toolkit** With `--provision-python` the installer builds an isolated environment in `.bmad/venv/seo/` (it needs Python 3.11 or newer, or `uv`, which can fetch one) and checks that `requests`, `bs4`, `defusedxml` and `lxml` import. It is opt-in.

   ```sh
   npx bmad-plus install --packs seo --provision-python
   ```
3. **Optional: set a Google API key** Needed only for live PageSpeed and CrUX data. The key is free and read from the environment; it is sent in a request header, never in a URL.

   ```sh
   $env:GOOGLE_API_KEY = "your-key"
   ```
4. **Run a first audit** Replace the address with the site you are allowed to audit.

   ```sh
   SEO Scout, run a quick audit of https://example.com (the /seo quick route, phases 1 to 4).
   ```

<a id="examples"></a>
## Copyable examples

<a id="example-seo-full-audit"></a>
### Run the full six-phase audit

Use it on a site you own or are mandated to audit. Scout, Judge and Chief work in sequence.

**In your AI assistant**

```text
SEO Scout, run the full six-phase audit of https://example.com (the /seo full route). Stop at each checkpoint so I can decide whether to continue.
```

**What you should get** Phase 1 ends with a discovery summary and the question "Continue with full audit?". Then come the deep scan, AI readiness and scoring, and the action plan, which pauses with "Apply fixes automatically?". If Python is not available, the audit says "prompts-only mode" up front, marks missing data unverified and leaves out any score whose inputs are incomplete, including the overall SEO Health Score.

<a id="example-seo-technical"></a>
### Technical inspection only

Use it when you suspect indexing or infrastructure problems and do not need the content review.

**In your AI assistant**

```text
SEO Scout, run the technical route (/seo technical) on https://shop.example. We moved to a new platform last Friday and pages are dropping out of Google: check robots.txt, noindex directives and canonical tags first.
```

**What you should get** Scout acts as Inspector and returns a technical report over nine categories, with issues sorted into critical, high, medium and low. Core Web Vitals are judged from the source when no live API data exists, and INP is used rather than the retired FID.

<a id="example-seo-hreflang"></a>
### Audit a multilingual site’s hreflang

Use it for sites with several languages or regions, such as `/fr/` and `/de/` variants.

**In your AI assistant**

```text
SEO Scout, audit the hreflang annotations of https://example.com (the /seo hreflang route). The site has /fr/ and /de/ versions: check that every page links back to its translations and that x-default is set.
```

**What you should get** Scout checks self-referencing tags, return tags and `x-default` against the pack’s hreflang rules and reports the pages that break them.

<a id="example-seo-schema"></a>
### Validate structured data

Use it before and after you add JSON-LD. Judge acts as Schema Master.

**In your AI assistant**

```text
SEO Judge, validate the structured data of https://example.com/pricing (the /seo schema route) and tell me whether any type is deprecated or missing.
```

**What you should get** A schema report: what was found, in which format, whether each type is valid and not deprecated, and which missing opportunities are worth adding. Judge recommends JSON-LD, flags retired types, and can generate compliant snippets.

<a id="example-seo-geo"></a>
### Measure AI-search readiness

Use it to decide what to change so assistants can read and quote your pages. Judge acts as GEO Analyst.

**In your AI assistant**

```text
SEO Judge, run the GEO route (/seo geo) on https://docs.example. Can GPTBot, ClaudeBot and PerplexityBot read our documentation, and would an llms.txt help?
```

**What you should get** A GEO report: which AI crawlers `robots.txt` allows or blocks, whether `llms.txt` exists and is well-formed, how many passages fit the citable 134 to 167 word range, and the AI Readiness Score, shown only when its inputs were verified.

<a id="example-seo-pagespeed"></a>
### Raise the PageSpeed scores one fix at a time

Needs `GOOGLE_API_KEY` for live scores. The target is 100 in all four Lighthouse categories.

**In your AI assistant**

```text
SEO Chief, with SEO Scout, run the PageSpeed loop (/seo pagespeed) on https://example.com/landing. My GOOGLE_API_KEY is set. Fix one issue at a time and re-test after each.
```

**What you should get** Scout and Chief loop: measure, fix one issue, re-test, confirm the improvement, move to the next, following the pack’s PageSpeed playbook and checklist. Without a key, the agents say live scores are unavailable instead of estimating them.

<a id="example-seo-plan-and-fix"></a>
### Get a plan for your type of site, then the fixes

Run it after an audit. Plan types are saas, ecommerce, local, publisher and agency.

**In your AI assistant**

```text
SEO Chief, the audit of our site is done. Write the strategic plan for a SaaS site (the /seo plan saas route), then turn that audit into ready-to-apply fixes (/seo fix).
```

**What you should get** Chief writes a strategic plan for a SaaS site (pricing pages, feature comparison, trial calls to action, documentation SEO). Then `/seo fix` turns the last audit into ready-to-apply changes: optimised title and description tags, JSON-LD built from the pack templates, an improved `robots.txt` and an `llms.txt`.

<a id="example-seo-competitor-and-history"></a>
### Benchmark a competitor and track progress

Use it when you want a side-by-side read, or after a second audit to see deltas.

**In your AI assistant**

```text
SEO Chief, benchmark https://example.com against https://competitor.example (the /seo competitor route) and tell me where the rival is ahead. If I saved earlier audits, also show how our score has moved.
```

**What you should get** Chief runs a full audit on both sites and compares scores with deltas (SEO score, E-E-A-T, schema types, GEO score, PageSpeed), then lists the gaps where the rival is ahead, your advantages and what to prioritise. Score history exists only if earlier audits were saved under `.bmad-seo/history/` by the optional monitoring phase (phase 6 of a full audit); then `/seo history` and `/seo compare` can show the evolution, and without a saved audit there is nothing to compare.

<a id="outputs"></a>
## What it writes and where

**Files the SEO pack can create**

| Path | Produced by | Content |
| --- | --- | --- |
| `.bmad-seo/history/<domain>-<date>.json` | Phase 6 (monitoring) | Scores by category and the issue list, for history and comparison |
| `seo-report.html` | `scripts/seo_report.py` | HTML report from an audit JSON file, default file name; used only when every score is verified |
| `screenshot.png` | `scripts/seo_screenshot.py` | Default output name of a page screenshot (`--output` changes it) |
| `.bmad/venv/seo/` | `install --provision-python` | The isolated Python environment |

<a id="data-and-prerequisites"></a>
## Data flows and prerequisites

- Runtimes: Node.js 20 for the installer; Python 3.11 or newer only if you want the toolkit (otherwise prompts-only mode). Python packages: `requests`, `beautifulsoup4`, `defusedxml`, `lxml`.
- Off-machine flows: `seo-site-fetch` (the crawl contacts the site you audit; addresses are checked against server-side request forgery and pinned), `seo-google-apis` (PageSpeed, CrUX and the mobile-friendly test, with your `GOOGLE_API_KEY` sent in the `x-goog-api-key` header), `seo-screenshot` (the browser reaches only the audited host) and `python-provision` (installing the packages, opt-in).
- The pack carries the compliance tag GDPR because Google Analytics or Search Console data can contain personal data; handle such exports under your own rules.

<a id="limits"></a>
## Limits and gotchas

> **Warning · No data, no score** In prompts-only mode, or when a category could not be checked, the agents mark it unverified. They never substitute zero or reweight the other categories, so an incomplete audit shows coverage (pages and checks reviewed, sources, unverified items) instead of an overall number.

> **Note · Screenshots need a browser you install yourself** `requirements.txt` keeps Playwright commented out, and `--provision-python` only verifies `requests`, `bs4`, `defusedxml` and `lxml`. For `seo_screenshot.py`, install `playwright` and Chromium in the same environment yourself. Third-party resources are blocked during a capture and listed as `blocked_requests`, so a missing CDN image is an effect of the capture, not a site defect.

> **Note · Ask in plain words: the /seo names are routes, not slash commands** The `/seo ...` names are the pack’s own router vocabulary. The pack does not register them as slash commands in your AI client, so typed alone they may be answered with an unknown-command message. Write a plain request to an SEO agent and name the route inside the sentence, as the examples above do. For an audit, ask for the `full` route (all six phases) or the `quick` route (phases 1 to 4); the router has no bare `audit` route.

> **Note · Provenance** The SEO Audit 360 base was written by Laurent Rochetta at Oveanet, his company, and integrated into BMAD+.

**See also**

- [All ten packs side by side](https://bmad-plus.rochetta.fr/docs/packs/packs-overview/)
- [Design pack (hand-off before a redesign)](https://bmad-plus.rochetta.fr/docs/packs/design/)
- [Install command reference](https://bmad-plus.rochetta.fr/docs/reference/cli-install/)
- [Data handling and privacy](https://bmad-plus.rochetta.fr/docs/security/data-handling/)

[BMAD+ documentation](https://bmad-plus.rochetta.fr/docs/) · [Packs](https://bmad-plus.rochetta.fr/docs/packs/)

[Source on GitHub](https://github.com/lrochetta/BMAD-PLUS)
