Help us improve
Share bugs, ideas, or general feedback.
From nodeshub-seo-skills
Audits content against live SERP data using NodesHub APIs and Jina Reader to identify keyword gaps, missing topics, and optimization opportunities by comparing your page against competitor content.
npx claudepluginhub senuto/nodeshub-seo-skills --plugin nodeshub-seo-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/nodeshub-seo-skills:nod-content-auditorThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Audit content against current SERP and keyword data using NodesHub APIs + Jina Reader for real competitor content crawling.
Audits website SEO with keyword research, on-page analysis, content gaps, technical checks, and competitor benchmarks. Outputs prioritized action plans for quick wins and strategies.
Generates data-driven SEO content briefs by combining SERP competitor analysis, keyword expansion, and competitor content crawling via NodesHub and Jina Reader APIs.
On-page SEO scoring (0-100), E-E-A-T analysis, title/meta optimization, heading structure, keyword density, SERP preview, content readability, featured snippet optimization, content gap and decay detection, and pre-publish checklists.
Share bugs, ideas, or general feedback.
Audit content against current SERP and keyword data using NodesHub APIs + Jina Reader for real competitor content crawling.
# Audit content for a keyword (crawls top 5 competitors)
python3 .claude/skills/nod-content-auditor/scripts/audit.py "target keyword" --gl us --hl en
# Audit YOUR page vs competitors
python3 .claude/skills/nod-content-auditor/scripts/audit.py "target keyword" --gl us --hl en --url https://example.com/page
# Crawl more competitors (top 10)
python3 .claude/skills/nod-content-auditor/scripts/audit.py "target keyword" --gl us --hl en --top 10
# SERP-only mode (no crawling, like before)
python3 .claude/skills/nod-content-auditor/scripts/audit.py "target keyword" --gl us --hl en --no-crawl
Cost: ~8.5 NodesHub tokens (standard) or ~31 (reasoning). Jina Reader is free (20 RPM without key, 200 RPM with key).
Requires NODESHUB_API_KEY. Run:
python3 .claude/skills/nod-nodeshub-api/scripts/check_setup.py
Optional: JINA_API_KEY for higher rate limits. Without it, Jina works at 20 RPM (enough for 5-10 pages). Get a free key at jina.ai for 200 RPM + 10M free tokens.
Save Jina key: add "JINA_API_KEY": "jina_xxx" to env in .claude/settings.local.json.
r.jina.ai)--url provided--url)| Param | Description |
|---|---|
keyword | Target keyword to audit against (required) |
--gl | Country code (default: us) |
--hl | Language code (default: en) |
--mode | standard (8.5 tokens) or reasoning (31 tokens) |
--url | URL of your page to audit — enables gap comparison |
--top | Number of top SERP results to crawl (default: 5) |
--no-crawl | Skip Jina crawling, SERP-only mode |
--raw | Output raw JSON |
--url when you have existing content — this unlocks the real gap analysis--top 5 is usually enough — more pages = more time but marginal gains--no-crawl is useful for quick checks or when Jina is unavailableThe shared jina_reader.py module lives in nod-nodeshub-api/scripts/ and can be reused by other skills:
from jina_reader import JinaReader
reader = JinaReader() # auto-loads JINA_API_KEY if available
result = reader.fetch("https://example.com") # → {url, title, content, word_count, ok}
results = reader.fetch_batch(["url1", "url2"], max_workers=3)
When generating HTML audit reports, use the branding assets from assets/branding/:
brand-config.json — company name, colors, fonts for report stylinglogo-light.svg / logo-dark.svg — company logo in report headerfrom branding import load_brand, render_header, render_footer, brand_css
brand = load_brand()
If no branding is configured, default styling is used. See assets/branding/README.md for setup.
After collecting data, ask the user:
"Add results to an HTML report?"
- New report — creates a branded HTML report in
reports/- Existing report — appends a section to a chosen report
- Skip — no report
Use render_report_section(result_data) from audit.py, then create_report() or append_section() from report.py.