Jump to related tools in the same category or review the original source on GitHub.

Web & Frontend Development @mattvalenta Updated 6/28/2026 2,971 downloads 1 stars Security: Pass

Pls Seo Audit OpenClaw Plugin & Skill | ClawHub

Looking to integrate Pls Seo Audit into your AI workflows? This free OpenClaw plugin from ClawHub helps you automate web & frontend development tasks instantly, without having to write custom tools from scratch.

What this skill does

Scan content and websites for SEO gaps, identify opportunities to outrank competitors.

Install

ClawHub CLI
openclaw skills install @mattvalenta/pls-seo-audit
Node.js (npx)
npx clawhub@latest install pls-seo-audit

Full SKILL.md

Open original

SKILL.md content below is scrollable.


name: seo-audit description: Scan content and websites for SEO gaps, identify opportunities to outrank competitors. Use when: (1) Analyzing page SEO, (2) Checking meta tags and structured data, (3) Reviewing content for keyword optimization, (4) Auditing technical SEO factors.

SEO Audit

Comprehensive SEO analysis for content and websites.

Quick Audit Checklist

On-Page SEO

- [ ] Title tag (50-60 chars, keyword near front)
- [ ] Meta description (150-160 chars, compelling)
- [ ] H1 tag (one per page, includes target keyword)
- [ ] H2-H6 hierarchy (logical structure)
- [ ] Image alt text (descriptive, keyword-relevant)
- [ ] Internal links (3-5 per page minimum)
- [ ] URL structure (short, descriptive, hyphens)
- [ ] Canonical tags (prevent duplicate content)

Technical SEO

- [ ] Page speed (<3s load time)
- [ ] Mobile-friendly (responsive design)
- [ ] HTTPS (SSL certificate valid)
- [ ] XML sitemap (submitted to Search Console)
- [ ] Robots.txt (properly configured)
- [ ] Structured data (Schema.org markup)
- [ ] Core Web Vitals (LCP, FID, CLS)

Content Quality

- [ ] Keyword in first 100 words
- [ ] Content length matches intent
- [ ] No keyword stuffing (<2% density)
- [ ] Readable (Flesch-Kincaid score)
- [ ] Unique value (not duplicate content)
- [ ] Fresh content (updated regularly)

Technical SEO Commands

Page Speed Analysis

# Using PageSpeed Insights API
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&strategy=mobile"

# Using lighthouse locally
npx lighthouse https://example.com --view

Check Robots.txt

curl https://example.com/robots.txt

Check Sitemap

curl https://example.com/sitemap.xml | xmllint --format -

SSL Certificate Check

openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

Mobile-Friendly Test

# Google's Mobile-Friendly Test API
curl "https://searchconsole.googleapis.com/v1/urlTestingTools/mobileFriendlyTest:run?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

Content Analysis

Keyword Density

import re
from collections import Counter

def keyword_density(text, keyword):
    words = re.findall(r'\b\w+\b', text.lower())
    keyword_count = text.lower().count(keyword.lower())
    density = (keyword_count / len(words)) * 100
    return {
        "keyword": keyword,
        "count": keyword_count,
        "total_words": len(words),
        "density": f"{density:.2f}%"
    }

# Target: 1-2% density

Readability Score

import textstat

text = "Your content here..."

flesch = textstat.flesch_reading_ease(text)
# 90-100: Very Easy
# 60-70: Standard
# 0-30: Very Difficult

grade = textstat.flesch_kincaid_grade(text)
# Target: 8-9 for general audience

Content Structure Analysis

from bs4 import BeautifulSoup

def analyze_headings(html):
    soup = BeautifulSoup(html, 'html.parser')
    headings = {
        'h1': soup.find_all('h1'),
        'h2': soup.find_all('h2'),
        'h3': soup.find_all('h3'),
    }
    
    issues = []
    if len(headings['h1']) == 0:
        issues.append("Missing H1 tag")
    elif len(headings['h1']) > 1:
        issues.append("Multiple H1 tags (should be one)")
    
    return {
        "counts": {k: len(v) for k, v in headings.items()},
        "issues": issues
    }

Meta Tag Analysis

Extract Meta Tags

from bs4 import BeautifulSoup
import requests

def audit_meta_tags(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    title = soup.find('title')
    description = soup.find('meta', attrs={'name': 'description'})
    keywords = soup.find('meta', attrs={'name': 'keywords'})
    
    issues = []
    
    if not title or len(title.text) < 30:
        issues.append("Title too short or missing")
    elif len(title.text) > 60:
        issues.append("Title too long (>60 chars)")
    
    if not description:
        issues.append("Meta description missing")
    elif len(description.get('content', '')) < 120:
        issues.append("Meta description too short")
    elif len(description.get('content', '')) > 160:
        issues.append("Meta description too long")
    
    return {
        "title": title.text if title else None,
        "description": description.get('content') if description else None,
        "issues": issues
    }

Structured Data Check

Validate Schema Markup

# Using Google's Rich Results Test
curl "https://searchconsole.googleapis.com/v1/urlTestingTools/richResultsTest:run" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

Common Schema Types

// Article
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Title",
  "author": {"@type": "Person", "name": "Author"},
  "datePublished": "2026-01-01"
}

// Local Business
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Business Name",
  "address": {"@type": "PostalAddress", "streetAddress": "123 Main"},
  "telephone": "+1-555-555-5555"
}

// FAQ
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [{
    "@type": "Question",
    "name": "Question?",
    "acceptedAnswer": {"@type": "Answer", "text": "Answer"}
  }]
}

Competitor Analysis

Compare Page Metrics

import requests
from bs4 import BeautifulSoup

def compare_seo(target_url, competitor_url):
    def get_metrics(url):
        r = requests.get(url)
        soup = BeautifulSoup(r.text, 'html.parser')
        return {
            "title_len": len(soup.find('title').text) if soup.find('title') else 0,
            "h1_count": len(soup.find_all('h1')),
            "h2_count": len(soup.find_all('h2')),
            "word_count": len(soup.get_text().split()),
            "images": len(soup.find_all('img')),
            "images_no_alt": len([i for i in soup.find_all('img') if not i.get('alt')])
        }
    
    return {
        "target": get_metrics(target_url),
        "competitor": get_metrics(competitor_url)
    }

SEO Audit Report Template

# SEO Audit Report

## Summary
- **Score:** X/100
- **Critical Issues:** X
- **Warnings:** X
- **Passed:** X

## Critical Issues
1. [Issue description]
   - Impact: [High/Medium/Low]
   - Fix: [Recommended action]

## Technical SEO
| Factor | Status | Notes |
|--------|--------|-------|
| Page Speed | ⚠️ | 4.2s load time |
| Mobile | ✅ | Responsive |
| HTTPS | ✅ | Valid SSL |
| Sitemap | ✅ | Submitted |

## On-Page SEO
| Factor | Status | Notes |
|--------|--------|-------|
| Title | ✅ | 55 chars |
| Meta Desc | ⚠️ | Too short |
| H1 | ✅ | Present |
| Images | ⚠️ | 3 missing alt |

## Recommendations
1. [Priority 1]
2. [Priority 2]
3. [Priority 3]
ClawHub Registry URL: https://clawhub.ai/mattvalenta/skills/pls-seo-audit

Related skills

If this matches your use case, these are close alternatives in the same category.