Install
openclaw skills install @asale-ai/seo-technicalTechnical SEO audit across 9 categories: crawlability, indexability, security, URL structure, mobile, Core Web Vitals, structured data, JavaScript rendering, and IndexNow protocol. Use when user says "technical SEO", "crawl issues", "robots.txt", "Core Web Vitals", "site speed", or "security headers".
openclaw skills install @asale-ai/seo-technicalseogeo sitemap-discovery <url> --json; require a
valid entry in found, and report stale or unsafe robots.txt declarations
separately from working fallback locations/crawling/ipranges/ and googlebot.json was renamed common-crawlers.json.As of 2025-2026, AI companies actively crawl the web to train models and power AI search. Managing these crawlers via robots.txt is a critical technical SEO consideration.
Known AI crawlers:
| Crawler | Company | robots.txt token | Purpose |
|---|---|---|---|
| GPTBot | OpenAI | GPTBot | Model training |
| ChatGPT-User | OpenAI | ChatGPT-User | Real-time browsing |
| ClaudeBot | Anthropic | ClaudeBot | Model training |
| PerplexityBot | Perplexity | PerplexityBot | Search index + training |
| Bytespider | ByteDance | Bytespider | Model training |
| Google-Extended | Google-Extended | Gemini training (NOT search) | |
| CCBot | Common Crawl | CCBot | Open dataset |
Key distinctions:
Google-Extended prevents Gemini training use but does NOT affect Google Search indexing or AI Overviews (those use Googlebot)GPTBot prevents OpenAI training but does NOT prevent ChatGPT from citing your content via browsing (ChatGPT-User)Example, selective AI crawler blocking:
# Allow search indexing, block AI training crawlers
User-agent: GPTBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: Bytespider
Disallow: /
# Allow all other crawlers (including Googlebot for search)
User-agent: *
Allow: /
Recommendation: Consider your AI visibility strategy before blocking. Being cited by AI systems drives brand awareness and referral traffic. Cross-reference the seo-geo skill for the full AI crawler/fetcher taxonomy.
User-triggered fetchers ignore robots.txt by design. Google now documents Google-Agent (Project Mariner, agentic browsing) plus Google-NotebookLM and Google Messages as user-triggered fetchers that cannot be blocked via robots.txt. Use server-side access controls instead. By contrast,
Google-ExtendedandGoogle-CloudVertexBotobey robots.txt. Emerging: Web Bot Auth (RFC 9421) lets bots authenticate cryptographically via aSignature-Agentheader + key directory atagent.bot.goog(used by Google-Agent); reverse-DNS verification remains the fallback.
history.pushState/replaceState (including scripts injected by third-party ad/library platforms). Added to Google's spam policies 2026-04-13; enforcement live since 2026-06-15 (manual actions + automated demotions): treat as Critical.Page experience is guidance, not a single ranking system. Only Core Web Vitals feeds ranking directly; HTTPS is a confirmed but lightweight signal (affects <~1% of queries). Relevance can still win even when page experience is sub-par, so don't over-weight security headers. Note: the standalone Page Experience report was removed from Search Console (monitor via the Core Web Vitals + HTTPS reports).
Google updated its JavaScript SEO documentation in December 2025 with critical clarifications:
<meta name="robots" content="noindex"> but JavaScript removes it, Google MAY still honor the noindex from raw HTML. Serve correct robots directives in the initial HTML response.Best practice: Serve critical SEO elements (canonical, meta robots, structured data, title, meta description) in the initial server-rendered HTML rather than relying on JavaScript injection.
AI agents (not just AI summarizers) increasingly read sites through three
channels: vision models on screenshots, raw HTML/DOM, and the accessibility
tree (the cleanest signal). Audit criteria: semantic HTML (real <button>
and <a>, not <div onclick>), label associations, interactive target sizing,
layout stability across templates, cursor: pointer correctness, live in
references/agent-friendly-pages.md.
Google now ships a Lighthouse Agentic Browsing category (default-on since
Lighthouse 13.3.0, Chrome 150+; buckets: agent-centric accessibility, CLS +
llms.txt, three WebMCP audits). It reports a fractional pass-ratio (X of N),
not a 0-100 score, keep that distinct from this skill's own Agent-UX 0-100
heuristic below. The PSI REST API does not expose it; run via Lighthouse CLI
--only-categories=agentic-browsing, DevTools, or the PSI web UI. See
references/agent-friendly-pages.md.
# Render with headless Chrome + capture accessibility tree, then score
seogeo agent-ux https://example.com --json
The scanner outputs an Agent-UX score (0-100) plus itemized issues:
<div onclick> widgets, semantic
landmarks, inputs without <label for>, inputs without ARIA labelsrole="generic" ratioThe accessibility-tree snapshot uses headless Chrome's
page.accessibility.snapshot(interesting_only=False). To capture the tree
without scoring, use seogeo render <url> --a11y-tree --json.
Surface findings as opportunities, not failures; don't gate audits on a sub-100 Agent-UX score. WebMCP origin-trial/sign-up status needs verification, and absence of WebMCP support is still an opportunity, not a defect.
| Category | Status | Score |
|---|---|---|
| Crawlability | pass/warn/fail | XX/100 |
| Indexability | pass/warn/fail | XX/100 |
| Security | pass/warn/fail | XX/100 |
| URL Structure | pass/warn/fail | XX/100 |
| Mobile | pass/warn/fail | XX/100 |
| Core Web Vitals | pass/warn/fail | XX/100 |
| Structured Data | pass/warn/fail | XX/100 |
| JS Rendering | pass/warn/fail | XX/100 |
| IndexNow | pass/warn/fail | XX/100 |
If DataForSEO MCP tools are available, use on_page_instant_pages for real page analysis (status codes, page timing, broken links, on-page checks), on_page_lighthouse for Lighthouse audits (performance, accessibility, SEO scores), and domain_analytics_technologies_domain_technologies for technology stack detection.
If Google API credentials are configured, use seogeo pagespeed <url> --json for real PSI + CrUX field data (replaces lab-only CWV estimates), seogeo crux-history <url> --json for 25-week CWV trends, and seogeo gsc-inspect <url> --json for real indexation status per URL.
| Scenario | Action |
|---|---|
| URL unreachable | Report connection error with status code. Suggest verifying URL, checking DNS resolution, and confirming the site is publicly accessible. |
| robots.txt not found | Note that no robots.txt was detected at the root domain. Recommend creating one with appropriate directives. Continue audit on remaining categories. |
| HTTPS not configured | Flag as a critical issue. Report whether HTTP is served without redirect, mixed content exists, or SSL certificate is missing/expired. |
| Core Web Vitals data unavailable | Note that CrUX data is not available (common for low-traffic sites). Suggest using Lighthouse lab data as a proxy and recommend increasing traffic before re-testing. |
# Page fetch with security headers and redirect chain
seogeo fetch https://example.com --json
# SPA-aware render: raw fetch, escalating to headless Chrome only if needed
seogeo render https://example.com --mode auto --json
# Speculation Rules, bfcache killers, prerender, LCP preload hints
seogeo preload-check https://example.com --json
# robots.txt + a live fetch as each major crawler UA
seogeo robots https://example.com --json
# Sitemap discovery via robots.txt and the well-known paths
seogeo sitemap-discovery https://example.com --json
# Core Web Vitals: lab (Lighthouse) and field (CrUX)
seogeo pagespeed https://example.com --strategy both --json
# Which LCP phase is actually slow
seogeo lcp-subparts https://example.com --form-factor PHONE --json
# SSRF policy check for any URL before you fetch it elsewhere
seogeo url-safety https://example.com --strict --json
# Submit changed URLs to IndexNow
seogeo indexnow --host example.com --urls-file changed.txt --json
Order matters. Run fetch and robots first: a page that does not resolve,
or that returns 403 to crawlers, makes every downstream metric meaningless.
render --mode auto is the default choice — it does a raw HTTP fetch and
only starts a browser when the raw HTML looks like an SPA shell. Compare
raw_word_count against rendered_word_count: a large gap means the
content depends on JavaScript, which costs you with every crawler that does
not execute it.
preload-check scores out of 100 across four independent 25-point checks
and exits non-zero below 75. lcp-subparts needs a Google API key and is
the one that turns a slow LCP into a specific task.