Sitemap Analysis & Generation
Mode 1: Analyze Existing Sitemap
Discover candidates before reporting a sitemap missing:
claude-seo run sitemap_discovery.py <url> --json
The helper reads every bounded Sitemap: declaration in robots.txt, validates
cross-host targets through the shared SSRF-safe fetch layer, and still probes
common paths when a declared sitemap is stale or invalid. Use only entries in
found; preserve declared failures as findings instead of treating a robots.txt
line alone as proof that a sitemap works.
Validation Checks
- Valid XML format
- Per-file limit: ≤50,000 URLs AND ≤50MB uncompressed (whichever is hit first)
- All URLs return HTTP 200
<lastmod> accurate: must be a valid W3C Datetime and reflect the last
significant content change (main content, structured data, links, not
copyright/boilerplate edits). Google only honours <lastmod> when consistently
and verifiably accurate, so warn when values are suspiciously uniform or newer
than the page's real content.
- No deprecated tags:
<priority> and <changefreq> are ignored by Google
- Sitemap referenced in robots.txt
- Compare crawled pages vs sitemap; flag missing pages
Quality Signals
- Sitemap index file if >50k URLs
- Split by content type (pages, posts, images, videos)
- No non-canonical URLs in sitemap
- No noindexed URLs in sitemap
- No redirected URLs in sitemap
- HTTPS URLs only (no HTTP)
Common Issues
| Issue |
Severity |
Fix |
| >50k URLs in single file |
Critical |
Split with sitemap index |
| >50MB uncompressed single file |
Critical |
Split with sitemap index |
| Non-200 URLs |
High |
Remove or fix broken URLs |
| Noindexed URLs included |
High |
Remove from sitemap |
| Redirected URLs included |
Medium |
Update to final URLs |
| All identical lastmod |
Low |
Use actual modification dates |
| Priority/changefreq used |
Info |
Can remove (ignored by Google) |
Extension sitemaps (image / video / news)
Google documents three subtypes with their own rules, validate per-subtype:
- Image (
http://www.google.com/schemas/sitemap-image/1.1): only two valid
tags remain, <image:image> and <image:loc> (max 1,000 <image:image>
per <url>). <image:caption>/<image:geo_location>/<image:title>/
<image:license> were deprecated (2022), flag as info-level removable.
- Video: required
<video:video> with <video:thumbnail_loc>,
<video:title>, <video:description>, plus <video:content_loc> or
<video:player_loc>; mRSS also supported. Flag deprecated/removed tags
(<video:category>, <video:gallery_loc>, <video:price>, <video:tvshow>,
player autoplay/allow_embed) as info-level removable; recheck Google docs before citing a removal date.
- News: max 1,000
<news:news> per file (not 50,000); include only
articles from the last 2 days; required <news:publication>/<news:name>/
<news:language>/<news:publication_date>/<news:title>; submit/discover through
Search Console or robots.txt/sitemap index; use Publisher Center only for
publication management where relevant. When the news: namespace is detected, override the generic
50k check with the 1,000 cap.
Mode 2: Generate New Sitemap
Process
- Ask for business type (or auto-detect from existing site)
- Load industry template from
../seo-plan/assets/ directory
- Interactive structure planning with user
- Apply quality gates:
- ⚠️ WARNING at 30+ location pages (require 60%+ unique content)
- 🛑 HARD STOP at 50+ location pages (require justification)
- Generate valid XML output
- Split at whichever comes first: 50,000 URLs or 50MB uncompressed, with sitemap index
- Generate STRUCTURE.md documentation
Safe Programmatic Pages (OK at scale)
✅ Integration pages (with real setup docs)
✅ Template/tool pages (with downloadable content)
✅ Glossary pages (200+ word definitions)
✅ Product pages (unique specs, reviews)
✅ User profile pages (user-generated content)
Penalty Risk (avoid at scale)
❌ Location pages with only city name swapped
❌ "Best [tool] for [industry]" without industry-specific value
❌ "[Competitor] alternative" without real comparison data
❌ AI-generated pages without human review and unique value
Sitemap Format
Standard Sitemap
<?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-02-07</lastmod>
</url>
</urlset>
Sitemap Index (for >50k URLs)
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap-pages.xml</loc>
<lastmod>2026-02-07</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-posts.xml</loc>
<lastmod>2026-02-07</lastmod>
</sitemap>
</sitemapindex>
Error Handling
- URL unreachable: Report the HTTP status code and suggest checking if the site is live
- No sitemap found: Run
sitemap_discovery.py and report "not found" only
when its found list is empty after declared and common candidates are checked
- Invalid XML format: Report specific parsing errors with line numbers
- Rate limiting detected: Back off and report partial results with a note about retry timing
Output
For Analysis
VALIDATION-REPORT.md: analysis results
- Issues list with severity
- Recommendations
For Generation
sitemap.xml (or split files with index)
STRUCTURE.md: site architecture documentation
- URL count and organization summary
1---2name: seo-sitemap3description: Analyze existing XML sitemaps or generate new ones with industry templates. Validates format, URLs, and structure. Use when user says "sitemap", "generate sitemap", "sitemap issues", or "XML sitemap".4license: MIT5---6
7# Sitemap Analysis & Generation
8
9## Mode 1: Analyze Existing Sitemap
10
11Discover candidates before reporting a sitemap missing:
12
13```bash
14claude-seo run sitemap_discovery.py <url> --json
15```
16
17The helper reads every bounded `Sitemap:` declaration in robots.txt, validates
18cross-host targets through the shared SSRF-safe fetch layer, and still probes
19common paths when a declared sitemap is stale or invalid. Use only entries in
20`found`; preserve declared failures as findings instead of treating a robots.txt
21line alone as proof that a sitemap works.
22
23### Validation Checks
24- Valid XML format
25- Per-file limit: **≤50,000 URLs AND ≤50MB uncompressed** (whichever is hit first)
26- All URLs return HTTP 200
27- `<lastmod>` accurate: must be a valid **W3C Datetime** and reflect the **last
28 significant content change** (main content, structured data, links, not
29 copyright/boilerplate edits). Google only honours `<lastmod>` when consistently
30 and verifiably accurate, so warn when values are suspiciously uniform or newer
31 than the page's real content.
32- No deprecated tags: `<priority>` and `<changefreq>` are ignored by Google
33- Sitemap referenced in robots.txt
34- Compare crawled pages vs sitemap; flag missing pages
35
36### Quality Signals
37- Sitemap index file if >50k URLs
38- Split by content type (pages, posts, images, videos)
39- No non-canonical URLs in sitemap
40- No noindexed URLs in sitemap
41- No redirected URLs in sitemap
42- HTTPS URLs only (no HTTP)
43
44### Common Issues
45| Issue | Severity | Fix |
46|-------|----------|-----|
47| >50k URLs in single file | Critical | Split with sitemap index |
48| >50MB uncompressed single file | Critical | Split with sitemap index |
49| Non-200 URLs | High | Remove or fix broken URLs |
50| Noindexed URLs included | High | Remove from sitemap |
51| Redirected URLs included | Medium | Update to final URLs |
52| All identical lastmod | Low | Use actual modification dates |
53| Priority/changefreq used | Info | Can remove (ignored by Google) |
54
55### Extension sitemaps (image / video / news)
56
57Google documents three subtypes with their own rules, validate per-subtype:
58- **Image** (`http://www.google.com/schemas/sitemap-image/1.1`): only two valid
59 tags remain, `<image:image>` and `<image:loc>` (max **1,000** `<image:image>`
60 per `<url>`). `<image:caption>`/`<image:geo_location>`/`<image:title>`/
61 `<image:license>` were deprecated (2022), flag as info-level removable.
62- **Video**: required `<video:video>` with `<video:thumbnail_loc>`,
63 `<video:title>`, `<video:description>`, plus `<video:content_loc>` or
64 `<video:player_loc>`; mRSS also supported. Flag deprecated/removed tags
65 (`<video:category>`, `<video:gallery_loc>`, `<video:price>`, `<video:tvshow>`,
66 player autoplay/allow_embed) as info-level removable; recheck Google docs before citing a removal date.
67- **News**: max **1,000** `<news:news>` per file (not 50,000); include only
68 articles from the **last 2 days**; required `<news:publication>`/`<news:name>`/
69 `<news:language>`/`<news:publication_date>`/`<news:title>`; submit/discover through
70 Search Console or robots.txt/sitemap index; use Publisher Center only for
71 publication management where relevant. When the `news:` namespace is detected, override the generic
72 50k check with the 1,000 cap.
73
74## Mode 2: Generate New Sitemap
75
76### Process
771. Ask for business type (or auto-detect from existing site)
782. Load industry template from `../seo-plan/assets/` directory
793. Interactive structure planning with user
804. Apply quality gates:
81 - ⚠️ WARNING at 30+ location pages (require 60%+ unique content)
82 - 🛑 HARD STOP at 50+ location pages (require justification)
835. Generate valid XML output
846. Split at whichever comes first: 50,000 URLs or 50MB uncompressed, with sitemap index
857. Generate STRUCTURE.md documentation
86
87### Safe Programmatic Pages (OK at scale)
88✅ Integration pages (with real setup docs)
89✅ Template/tool pages (with downloadable content)
90✅ Glossary pages (200+ word definitions)
91✅ Product pages (unique specs, reviews)
92✅ User profile pages (user-generated content)
93
94### Penalty Risk (avoid at scale)
95❌ Location pages with only city name swapped
96❌ "Best [tool] for [industry]" without industry-specific value
97❌ "[Competitor] alternative" without real comparison data
98❌ AI-generated pages without human review and unique value
99
100## Sitemap Format
101
102### Standard Sitemap
103```xml
104<?xml version="1.0" encoding="UTF-8"?>
105<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
106 <url>
107 <loc>https://example.com/page</loc>
108 <lastmod>2026-02-07</lastmod>
109 </url>
110</urlset>
111```
112
113### Sitemap Index (for >50k URLs)
114```xml
115<?xml version="1.0" encoding="UTF-8"?>
116<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
117 <sitemap>
118 <loc>https://example.com/sitemap-pages.xml</loc>
119 <lastmod>2026-02-07</lastmod>
120 </sitemap>
121 <sitemap>
122 <loc>https://example.com/sitemap-posts.xml</loc>
123 <lastmod>2026-02-07</lastmod>
124 </sitemap>
125</sitemapindex>
126```
127
128## Error Handling
129
130- **URL unreachable**: Report the HTTP status code and suggest checking if the site is live
131- **No sitemap found**: Run `sitemap_discovery.py` and report "not found" only
132 when its `found` list is empty after declared and common candidates are checked
133- **Invalid XML format**: Report specific parsing errors with line numbers
134- **Rate limiting detected**: Back off and report partial results with a note about retry timing
135
136## Output
137
138### For Analysis
139- `VALIDATION-REPORT.md`: analysis results
140- Issues list with severity
141- Recommendations
142
143### For Generation
144- `sitemap.xml` (or split files with index)
145- `STRUCTURE.md`: site architecture documentation
146- URL count and organization summary