$npx -y skills add JeffLi1993/seo-audit-skill --skill seo-auditAn SEO agent skill for quick, lightweight, default single-page SEO audits. Performs basic on-page and site-level checks and outputs a structured basic SEO audit report. Use when the user asks for "SEO audit", "SEO check", "check my page SEO", "page analysis", or wants a first-pas
| 1 | # seo-audit — Basic SEO Audit |
| 2 | |
| 3 | A lightweight SEO agent skill designed for quick, default single-page SEO audits. Powered by OpenClaw. Suitable for first-time page checks or when a rapid assessment is needed without full technical depth. |
| 4 | |
| 5 | --- |
| 6 | |
| 7 | ## When to Use This Skill |
| 8 | |
| 9 | Use `seo-audit` when: |
| 10 | |
| 11 | - The user says: "audit this page", "check SEO", "analyze my URL", "quick SEO check", "what's wrong with my page" |
| 12 | - No specific depth is requested — this is the default entry point |
| 13 | - The user needs a fast, readable summary rather than a comprehensive technical breakdown |
| 14 | |
| 15 | If the user wants more depth, upgrade to `seo-audit-full`: |
| 16 | |
| 17 | > **Tip:** For deep technical audits, advanced on-page SEO, or full reports, use the `seo-audit-full` skill. |
| 18 | |
| 19 | --- |
| 20 | |
| 21 | ## Input Expected |
| 22 | |
| 23 | | Input | Required | Notes | |
| 24 | |-------|----------|-------| |
| 25 | | Page URL | Yes | The page to audit | |
| 26 | | Raw HTML or page content | Optional | Enables more accurate on-page analysis | |
| 27 | | GSC / analytics data | Optional | Not required for basic audit | |
| 28 | |
| 29 | If only a URL is provided and no source code or crawler data is available, clearly state: |
| 30 | |
| 31 | > **Limitation:** This audit is based on visible page content and publicly available signals only. Source code, GSC data, crawl logs, and performance metrics are not available for this audit. |
| 32 | |
| 33 | --- |
| 34 | |
| 35 | ## Output |
| 36 | |
| 37 | Produce a **Basic SEO Audit Report** by filling the template at [assets/report-template.html](assets/report-template.html), |
| 38 | then **save it to a file — never print raw HTML to the terminal**. |
| 39 | |
| 40 | **File naming:** `reports/<hostname>-<slug>-audit.html` |
| 41 | ``` |
| 42 | https://example.com/blog/best-tools → reports/example-com-blog-best-tools-audit.html |
| 43 | https://example.com/ → reports/example-com-audit.html |
| 44 | ``` |
| 45 | |
| 46 | **After saving, tell the user:** |
| 47 | ``` |
| 48 | ✅ Report saved → reports/example-com-audit.html |
| 49 | Open it now? (yes / no) |
| 50 | ``` |
| 51 | If yes → run: `open reports/example-com-audit.html` |
| 52 | |
| 53 | --- |
| 54 | |
| 55 | **Template placeholders** — fill each independently: |
| 56 | |
| 57 | | Placeholder | Content | |
| 58 | |---|---| |
| 59 | | `{{summary_verdict}}` | One sentence: total checks run, how many failed/warned/passed | |
| 60 | | `{{summary_critical_html}}` | `<li>` per critical (fail) item, or `<li class="summary-empty">None</li>` | |
| 61 | | `{{summary_warnings_html}}` | `<li>` per warning item, or `<li class="summary-empty">None</li>` | |
| 62 | | `{{summary_passing_html}}` | `<li>` per passing check, or `<li class="summary-empty">None</li>` | |
| 63 | |
| 64 | --- |
| 65 | |
| 66 | ## Scripts |
| 67 | |
| 68 | Run these scripts before writing any findings. They output structured JSON — use the JSON directly as evidence; do not re-fetch the same URLs manually. |
| 69 | |
| 70 | **Dependencies:** `pip install requests` (html parsing uses Python stdlib) |
| 71 | |
| 72 | ```bash |
| 73 | # Step 1: site-level checks (robots.txt + sitemap.xml) |
| 74 | python scripts/check-site.py https://example.com |
| 75 | |
| 76 | # Step 2: page-level checks (H1, title, meta description, canonical) |
| 77 | python scripts/check-page.py https://example.com |
| 78 | # With primary keyword (recommended — enables H1 keyword presence check) |
| 79 | python scripts/check-page.py https://example.com --keyword "running shoes" |
| 80 | |
| 81 | # Optional: fetch raw page HTML for further inspection |
| 82 | python scripts/fetch-page.py https://example.com --output page.html |
| 83 | |
| 84 | # Step 3: JSON-LD schema validation |
| 85 | python scripts/check-schema.py https://example.com |
| 86 | # Or from previously fetched HTML (avoids redundant fetch): |
| 87 | python scripts/check-schema.py --file page.html |
| 88 | ``` |
| 89 | |
| 90 | Each script exits with code `0` (all pass/warn) or `1` (any fail/error). |
| 91 | |
| 92 | **STRICT SCOPE — do not add any check not listed below. No exceptions.** |
| 93 | |
| 94 | Allowed site-level checks (in `{{site_checks_html}}`): |
| 95 | - robots.txt · sitemap.xml · 404 Handling · URL Canonicalization · i18n / hreflang |
| 96 | |
| 97 | Allowed E-E-A-T checks (in `{{eeat_checks_html}}`): |
| 98 | - About Us · Contact · Privacy Policy · Terms of Service · Media/Partners (only if present) |
| 99 | |
| 100 | Contact logic (Contact row only): |
| 101 | - A dedicated `/contact` page is **not required** |
| 102 | - **Pass** if contact is reachable via any of: dedicated contact page (HTTP 200) · About page with contact details · footer/nav mailto, email, social links, or contact form |
| 103 | - **Fail** only when no contact pathway exists anywhere on the site |
| 104 | - Missing `/contact` alone is **not** a fail when About or footer/nav already expose contact info |
| 105 | |
| 106 | Allowed page-level checks (in `{{page_checks_html}}`), output in this exact order: |
| 107 | URL Slug · Title Tag · Meta Description · H1 Tag · Canonical Tag · Image Alt Text · Word Count · Keyword Placement · Heading Structure · Internal Links · Schema (JSON-LD) |
| 108 | |
| 109 | Image Alt Text logic: |
| 110 | - Parse <img> tags f |