AgentStack
SKILL verified MIT Self-run

Seo Content Audit

skill-amirjahfar1-automate-seo-with-claude-seo-content-audit · by amirjahfar1

E-E-A-T + CITE quality audit for an EXISTING piece of content. Scores Experience, Expertise, Authoritativeness, Trustworthiness, and citation-readiness for AI search; surfaces veto items that block publication; produces a publish / publish-with-fixes / no-publish verdict. Distinct from `seo-content-brief` (produces a NEW article from a topic) and from `seo-page` (URL-level keyword/traffic intelli…

No reviews yet
0 installs
2 views
0.0% view→install

Install

$ agentstack add skill-amirjahfar1-automate-seo-with-claude-seo-content-audit

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No 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.

Are you the author of Seo Content Audit? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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 WebFetch tool 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

  1. Fetch content WebFetch (always) + mcp__firecrawl-mcp__firecrawl_scrape (when available)
  • Validate target & preflight. See skills/seo-firecrawl/references/preflight.md for 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/filters params 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-firecrawl to 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 from references/core-eeat.md → "Word-count floors by page type". Surface the detected type, the applied floor, and the actual word count in evidence/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 for Article / BlogPosting schema and extract author (name, @type: Person, optional url + sameAs), datePublished / dateModified (ISO 8601), publisher, mainEntityOfPage. Detect Person` 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) in evidence/01-content-snapshot.md. Step 4's veto checks #1 and #4 fall back to prose-level inspection (less reliable) — surface that caveat in VERDICT.md.
  1. AIO context mcp__dataforseo__serp_organic_live_advanced (AIO block) and mcp__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_advanced response).
  • 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)?
  1. 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.
  1. 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.
  1. Anonymous author on YMYL topic. (High-confidence with Firecrawl-recovered author schema + DOM byline; medium-confidence with prose-only inspection.)
  2. Factual claims with no sources cited.
  3. Undisclosed affiliate / sponsored relationships.
  4. 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 author when available; falls back to prose-level pattern match if Firecrawl is absent (lower confidence — note in VERDICT.md).
  1. 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).
  1. 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.
  1. 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

  1. {Specific fix linked to a low-scored item or veto}
  2. ...
  3. ...

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.

Versions

  • v0.1.0 Imported from the upstream source.