Install
$ agentstack add skill-amirjahfar1-automate-seo-with-claude-seo-content-audit ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
> Example output: [examples/seo-content-audit-stripe-rate-limiters-20260514/VERDICT.md](../../examples/seo-content-audit-stripe-rate-limiters-20260514/VERDICT.md)
Content Quality Audit
Score an existing piece of content against modern E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) and CITE (Clear answer, Include primary stats, Timestamp, Entity authority) rubrics. Surface veto items that block publication regardless of overall score. Produce a clear publish / publish-with-fixes / no-publish verdict with the top 5 fixes.
Prerequisites
- DataForSEO MCP server connected.
- Claude's
WebFetchtool available. - User provides: (a) the URL of an existing piece of content (or pasted content + intended URL), (b) target keyword the content is meant to rank for. Optional: target country (default
us).
Process
- Fetch content
WebFetch(always) +mcp__firecrawl-mcp__firecrawl_scrape(when available)
- Validate target & preflight. See
skills/seo-firecrawl/references/preflight.mdfor the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes: - DataForSEO bills per call; this skill issues ~10–15 calls typical (AIO context + LLM-mention sampling for the target keyword + audited URL). Use the documented
limit/filtersparams to cap. - Firecrawl: optional with WebFetch fallback, 1 Firecrawl credit per URL audited (default cap 50 URLs, hard cap 200). Surface the projected Firecrawl credit count before continuing. Pass
--no-firecrawlto force WebFetch-only inspection (lower-confidence veto checks; see step 4 caveat). - Google APIs: tier 2 (GA4 available) unlocks step 3b (GA4 organic traffic on the audited URL) after the AIO context step. See
skills/seo-google/references/cross-skill-integration.md§ "seo-content-audit" for the full recipe. - WebFetch first (free, instant): pull the markdown for word count, H-tag hierarchy, source citations (links to authorities, numbered references), images, tables, code blocks, comment thread.
- Page-type detection. From the URL pattern, H1 phrasing, and JSON-LD
@type, classify the page as one of: ultimate guide / pillar, how-to, listicle / best-of, comparison (X vs Y), explainer, review (single product), landing page (commercial). Look up the corresponding word-count floor fromreferences/core-eeat.md→ "Word-count floors by page type". Surface the detected type, the applied floor, and the actual word count inevidence/01-content-snapshot.md. If the actual word count is materially below the floor, flag it for the depth E-E-A-T items (auto ✗ unless the auditor justifies the exception). - Firecrawl second — recovers what WebFetch's markdown loses:
- From
metadata: canonical URL, robots, lang,og:title. - From the returned
html: every `block. Parse forArticle/BlogPostingschema and extractauthor(name,@type: Person, optionalurl+sameAs),datePublished/dateModified(ISO 8601),publisher,mainEntityOfPage. DetectPerson` schema standalone if present. - DOM-level byline detection: locate the structural byline (`
,,,[itemprop="author"]). Distinguish a real byline element from prose mentions ("Written by Jane in collaboration..." in body text is not a byline;Jane Doe` is). - If Firecrawl unavailable: WebFetch portion runs unchanged. Mark schema-type detection and structural byline detection as
(skipped — Firecrawl required)inevidence/01-content-snapshot.md. Step 4's veto checks #1 and #4 fall back to prose-level inspection (less reliable) — surface that caveat inVERDICT.md.
- AIO context
mcp__dataforseo__serp_organic_live_advanced(AIO block) andmcp__dataforseo__ai_opt_llm_ment_top_domains
- For the target keyword: is there a Google AI Overview? (read the AIO block from the
serp_organic_live_advancedresponse). - Who is cited in the AIO / who gets mentioned across LLMs (
ai_opt_llm_ment_top_domains)? - Is the candidate URL cited?
- What patterns characterise the cited sources (publication tier, freshness, structure)?
- LLM mention sampling
mcp__dataforseo__ai_opt_llm_ment_search
- Sample LLM mentions where the target URL's domain appears as a source. For an actual live answer, use
mcp__dataforseo__ai_optimization_chat_gpt_scraper/mcp__dataforseo__ai_optimization_llm_response. - Cross-reference with the candidate URL — does it show up in any sampled mentions?
3b. GA4 organic traffic on the audited URL (only if google-api.json is present, tier ≥ 2)
- Replaces the implicit traffic estimation with actual measured organic sessions for the audited URL.
- Pull the top organic landing pages (last 28 days):
python3 scripts/ga4_report.py --report top-pages --days 28 --json
- Filter the result client-side for the audited URL's path. Surface in
VERDICT.md"## Snapshot" alongside the existing AIO citation cross-check: - GA4 organic last 28d:
{sessions} sessions / {users} users / avg engagement {n}s - If the URL doesn't appear in the top-100 organic landing pages: "GA4: not in top-100 organic landing pages last 28d — low or zero traffic."
- This is a signal, not a veto. Low GA4 traffic on a YMYL page with high E-E-A-T is informative ("we're not earning the visibility our content quality should support") but doesn't change the publish decision.
- See
skills/seo-google/references/cross-skill-integration.md§ "seo-content-audit" for the full recipe.
- Score E-E-A-T using
references/core-eeat.md
- 60-item rubric across 4 dimensions (15 items each).
- Per-item: yes/no/partial. Compute dimension scores (0–100% each).
- Score the 8-item AI-content markers subsection (see references/core-eeat.md → "AI-content markers"). Mark each fired/not-fired.
- Apply 4 veto checks. Any veto = no-publish.
- Anonymous author on YMYL topic. (High-confidence with Firecrawl-recovered author schema + DOM byline; medium-confidence with prose-only inspection.)
- Factual claims with no sources cited.
- Undisclosed affiliate / sponsored relationships.
- AI-generated YMYL content with no human-review markers (≥4 AI-content markers fired AND YMYL topic AND no editor byline / "reviewed by" credit / "last reviewed" or "fact-checked on" date). The "editor byline / reviewed by" check uses Firecrawl-recovered DOM byline + Article-schema
authorwhen available; falls back to prose-level pattern match if Firecrawl is absent (lower confidence — note inVERDICT.md).
- Score CITE using
references/cite.md
- 30-item CITE rubric (Clear answer in 1st 200 words, Include primary stats, Timestamp freshness, Entity authority).
- Per-item: yes/no/partial. Compute dimension scores.
- Apply 3 veto checks (no answer in first 300 words / no datestamp on time-sensitive content / no entity disambiguation for proper-noun queries).
- Cross-check against AIO winners
- For the patterns characteristic of cited sources (from step 2), evaluate the candidate against each: does it have what the cited sources have?
- Surface specific gaps.
- Synthesise verdict using
templates/verdict.md
- Publish: E-E-A-T ≥ 75%, CITE ≥ 70%, no vetoes triggered.
- Publish with fixes: E-E-A-T 60–74% OR CITE 55–69%, no vetoes. Top 5 fixes specified.
- No publish: any veto triggered, OR E-E-A-T Audited {YYYY-MM-DD} · Target keyword: "{keyword}" · Country: {country}
Verdict: {PUBLISH | PUBLISH WITH FIXES | NO PUBLISH}
{One sentence summary of why}
Scores
| Dimension | Score | Threshold | Status | |---|---|---|---| | Experience | {n}% | 75% | {✓/✗} | | Expertise | {n}% | 75% | {✓/✗} | | Authoritativeness | {n}% | 75% | {✓/✗} | | Trustworthiness | {n}% | 75% | {✓/✗} | | E-E-A-T composite | {n}% | 75% | {✓/✗} | | Clear answer | {n}% | 70% | {✓/✗} | | Include stats | {n}% | 70% | {✓/✗} | | Timestamp | {n}% | 70% | {✓/✗} | | Entity authority | {n}% | 70% | {✓/✗} | | CITE composite | {n}% | 70% | {✓/✗} |
Veto checks
- Anonymous author on YMYL: {triggered / not triggered}
- Unsourced factual claims: {triggered / not triggered}
- Undisclosed affiliate / sponsored: {triggered / not triggered}
- AI-generated YMYL with no human review: {triggered / not triggered} ({n}/8 AI-content markers fired)
- ...
AI Search readiness
- AIO present for "{keyword}": {yes/no}
- Top citation patterns: {list}
- Candidate URL cited in any sampled AIO: {yes/no}
- Gap vs cited sources: {bulleted gaps}
Snapshot (measured)
- GA4 organic last 28d: {sessions} sessions / {users} users / avg engagement {n}s (or
not in top-100/not configured (Tier 2 required))
Top 5 fixes
- {Specific fix linked to a low-scored item or veto}
- ...
- ...
Detailed scoring
See:
- 03-eeat-scoring.md (item-by-item E-E-A-T)
- 04-cite-scoring.md (item-by-item CITE)
- 05-aio-winner-comparison.md (gap analysis)
## Tips
- DataForSEO allows up to 2,000 calls/min, 30 concurrent. AIO + LLM-mention queries are ~5–10 calls; plenty of headroom.
- DataForSEO bills per call; no pre-run credit gate. ~10–15 DataForSEO calls typical, plus 1 Firecrawl credit per URL audited when Firecrawl is installed (default cap 50 URLs). Use the documented `limit`/`filters` params to cap.
- The thresholds (75% E-E-A-T, 70% CITE) are starting points. Tune per domain — a YMYL site (medical, financial) should require higher (85%/80%); a general-interest blog can run lower (65%/60%).
- The veto checks are not negotiable. A piece with anonymous authorship on a YMYL topic doesn't pass regardless of score.
- For pieces that score "publish with fixes," the top-5 list is the deliverable. Hand it to the writer; re-audit after fixes.
- Pair with `seo-content-brief` for the new-article counterpart: this skill audits existing content, content-brief produces new content.
- Pair with `seo-sxo` if the page has technical/page-type issues — that's a different diagnosis.
- The 60-item E-E-A-T rubric and 30-item CITE rubric are in `references/`. They are opinionated — adjust for your domain's editorial standards.
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [amirjahfar1](https://github.com/amirjahfar1)
- **Source:** [amirjahfar1/automate-seo-with-claude](https://github.com/amirjahfar1/automate-seo-with-claude)
- **License:** MIT
- **Homepage:** https://nextbrainsolutions.com/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.