Peec content intel
Production-tested Claude Code skills for Peec AI brand-visibility tracking in LLM search (ChatGPT, Perplexity, Gemini, Google AI Overviews). Includes ai-visibility-setup (9-phase project configuration) and peec-content-intel (content gap analysis + brief generation).
npx -y skills add AntonioBlago/peec-ai-skills --skill peec-content-intelAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Content-intelligence workflow that turns a Peec AI visibility gap into a publish-ready content brief. Combines Peec (prompt visibility, source URLs, scraped chat responses), Visibly AI (backlinks, onpage, keywords, GSC), and Reddit / forum mining. Uses Query Fan-Out to expand one prompt into 5–8 sub-queries and scores competitor URLs for attackability. Use when the user wants to find content opportunities, evaluate competitor content, build a content brief from Peec data, or discover what content wins specific AI prompts.
SKILL.md
11.2 KB, as published. Nobody here has run it
Peec Content Intel
Role
For one Peec prompt that the brand is losing, produce one publish-ready content brief: sub-queries, verbatim buyer pains, competitor breakdown, outline, focus keywords, and outreach targets.
Input
project_id— Peec project (read fromsetup_state.jsonper pre-flight; do not re-resolve)prompt_id— the target prompt (must have ≥24h of data)- optional
date_range— default last 28 days language— read fromsetup_state.json(prompt_language); user can override per-run, but never default toensilentlytarget_country— read fromsetup_state.json; drives forum source picks (DE→reddit/r/de+gutefrage+t3n, AT→reddit+derstandard, US→reddit+quora, CH→reddit/r/de+r/fr) and SERP/GSC market filterspage_type— required. Must be one of the values insetup_state.page_type_taxonomy. If the user doesn't pass it, the skill infers the best fit from the funnel stage of the target prompt + competitor top-url classifications, then ASKS the user to confirm ("Suggested page_type:landing_page(Decision-stage, competitors use PRODUCT_PAGE). OK? [y/n/override]"). Never guess silently — a brief with the wrong page_type is a wasted publish cycle.business_type— read fromsetup_state.json. Used to validatepage_typeselection against the allowed taxonomy matrix.audience— read fromsetup_state.json.audience.primaryandaudience.pain_pointsfeed the brief's "Why this page wins" + "Voice / tonality" sections directly; do not restate them in the brief prose, USE them.
Output
One markdown brief per prompt, saved at briefs/<YYYY-MM-DD>_<prompt-slug>/brief.md, plus the raw data next to it (competitor-urls.json, forum-pains.json, scoring.json). No dashboards.
Every brief starts with a front-matter block that downstream skills (peec-report, peec-learn) consume for attribution:
---
brief_id: <YYYY-MM-DD>_<prompt-slug>
prompt_id: pr_xxxxxx
business_type: b2b-service
page_type: landing_page # MUST be in setup_state.page_type_taxonomy
target_url: /seo-retainer # planned publish path
funnel_stage: Decision # from the prompt's topic
audience:
primary: "Shop-Owner DACH, 3-20 MA, Shopify"
pain_hook: "3 Agenturen gewechselt, keine Ergebnisse"
success_metric_4w:
prompt_visibility: "0% → ≥15%"
zone_visibility: "4% → ≥20%"
---
A brief without this front-matter block is invalid and will be rejected by peec-report.
When to use
- "Which content wins Peec prompt X?"
- "Analyze the sources competitors get cited for on prompt X"
- "What's the content gap between me and competitor.de?"
- Runs after
peec-setup— the project must exist with structured prompts.
Do not use when:
- Prompt has <24h of Peec data (no chats / sources yet)
- No own-brand absence on the prompt (nothing to close)
Pipeline
0. Pre-flight — setup state required
Per _shared/SETUP_STATE.md, this skill refuses to run without a completed setup:
Read <project>/growth_loop/setup_state.json
If missing OR completed_at missing OR phases_completed lacks
{competitors, prompts, topics, tags}:
STOP. Output:
"No Peec setup state found at <project>/growth_loop/setup_state.json.
Run /peec-setup first."
If completed_at older than 90 days: WARN once, continue.
Use peec_project_id from state — don't re-resolve via list_projects.
1. Find the gap URLs
mcp__peec-ai__get_brand_report(
project_id, start_date, end_date,
dimensions=["prompt_id"],
filters=[{field: "prompt_id", operator: "in", values: [prompt_id]}]
)
mcp__peec-ai__get_url_report(
project_id, start_date, end_date,
dimensions=["prompt_id"],
filters=[
{field: "prompt_id", operator: "in", values: [prompt_id]},
{field: "gap", operator: "gt", value: 0}
],
limit=25
)
Output: up to 25 URLs, sorted by retrieval frequency, each with a classification (LISTICLE / ARTICLE / COMPARISON / HOW_TO_GUIDE / PROFILE / DISCUSSION).
Interpretation:
- LISTICLE / COMPARISON → outreach targets (get included)
- HOW_TO_GUIDE / ARTICLE → own-content targets (write and publish)
- PROFILE / DISCUSSION (reddit, youtube) → community targets (participate)
2. Query Fan-Out
Primary path — mcp__visiblyai__query_fanout (Visibly MCP ≥ v0.6.0, ~3–5 credits):
mcp__visiblyai__query_fanout(
url="https://<own-or-competitor-domain>/<page>",
keyword="<focus_keyword>",
data_source="dataforseo", # or "gsc" / "both"
gsc_property=null, # required if data_source includes gsc
language="de" # or "en"
)
Returns: fanout_queries[], coverage_score (0–1), covered_count / total_count, gaps[] (sub-queries not addressed on the URL — this is the content backlog), coverage_details[].
Fire once per top gap URL from Phase 1. Replaces sub-query generation + crawling + semantic match in one call.
Fallback — inline heuristic (if Visibly MCP unavailable or credits tight):
Generate 6 sub-queries along fixed intent axes:
- Synonym (same intent, different wording)
- Decision ("what does it cost", "when to switch")
- Comparison ("X vs Y")
- Problem ("why doesn't X work")
- Long-tail (narrow niche)
- Forum / community (informal phrasing)
Coverage matching is then skipped — flag that explicitly in the brief.
3. Mine forum pain per sub-query
Reddit (tested 2026-04-19): WebFetch against reddit.com is blocked. The workaround that works: Peec has already scraped Reddit threads, so use
mcp__peec-ai__get_url_content(project_id, url="https://reddit.com/r/<sub>/comments/<id>/...")
Procedure:
- From Phase 1, list all
classification=DISCUSSION+domain=reddit.comURLs - For the top 3 by retrieval, call
get_url_content - Extract: verbatim pain quotes, tool mentions, competitor mentions, sentiment
Gutefrage / t3n / OMR:
WebSearch("site:gutefrage.net <query>")
WebSearch("site:t3n.de/forum <query>")
WebSearch("site:omr.com <query>")
WebFetch(url, "Extract the original question verbatim, plus top 3 answers. Note frustrations, decision triggers, competitor/brand mentions.")
Gutefrage blocks WebFetch with 403. Fallback: Google search snippets + archive.org.
Per sub-query, aggregate: 3–5 verbatim pain quotes, competitor mentions with sentiment, top 2–3 thread URLs for later engagement.
4. Score competitor URLs (Visibly deep-dive)
Per top gap URL from Phase 1:
mcp__visiblyai__get_backlinks(domain="<competitor-domain>", limit=10, location="Germany")
mcp__visiblyai__onpage_analysis(url="<competitor-url>", keyword="<focus-keyword>") # 15 credits, top 3 only
mcp__peec-ai__get_url_content(project_id, url="<competitor-url>") # for outline mining
mcp__visiblyai__get_keywords(domain="<competitor-domain>", limit=200, location="Germany")
Backlinks caution: get_backlinks can return 260 KB+ (2,836 backlinks for noahlutz.de). Always pass limit: 10-20 or delegate to a subagent. For headline metrics (total_count, rank, domain_from_rank), limit=1 is enough.
DR interpretation:
- DR <20 → organic authority, realistic to overtake
- DR 20–50 → established, 6–12 months of content + targeted links
- DR >50 → hard to beat head-on; flank with long-tail instead
5. Opportunity scoring
score = (retrieval_freq × gap_size × forum_pain_density)
/ (domain_DR × (1 + content_quality_diff))
Tiers:
- Tier 1 (score >50) — attack now: write + outreach
- Tier 2 (20–50) — 3–6 month horizon
- Tier 3 (<20) — park or flank with long-tail
6. Render brief
Save to briefs/<YYYY-MM-DD>_<prompt-slug>/brief.md. Schema below.
Brief schema
## Content Brief: <prompt text>
### Goal
Win Peec prompt: "<prompt_text>"
Funnel stage: Awareness | Consideration | Decision | Retention
Current own visibility: X% → Target: Y% in 90 days
### Buyer language (forum pain, verbatim)
- "<verbatim quote>" (source: r/selbststaendig, 2026-03)
- "<verbatim quote>" (source: Gutefrage)
- "<decision trigger>"
### Sub-queries (Query Fan-Out)
1. <sub-query>
2. <sub-query>
...
### Competitor landscape
| URL | Class | Retrieval | DR | Opp score | Note |
|---|---|---|---|---|---|
| evergreen.media/ki-seo | ARTICLE | 22% | 47 | 35 | high DR, pitch as contributor |
| noahlutz.de/ki-seo | LISTICLE | 9% | 22 | 68 | direct attack, similar DR |
### Recommended format
<LISTICLE | COMPARISON | HOW-TO | DEFINITION> — based on dominant URL class
### Title (draft, ≤60 chars)
<title>
### Meta description (≤155 chars)
<description using buyer language>
### Outline (H2 / H3)
1. <opening pain>
2. <definition / framework>
3. <decision matrix or checklist>
4. <practice examples>
5. <pitfalls>
6. <CTA>
### Focus + secondary keywords
- Focus: <keyword> (volume, intent)
- Secondary: <kw2>, <kw3>, <kw4> (from keyword gap)
### Backlink strategy
- <domain 1>: editorial pitch (template)
- <subreddit>: join thread (URL)
- <editorial>: contribute to existing article
### KPI
- Prompt visibility after 90 days: Y%
- GSC position for focus keyword: top 10
- ≥3 backlinks from DR >30
Quick reference
| Step | Tool |
|---|---|
| Gap URLs | mcp__peec-ai__get_url_report(filters: gap>0) |
| AI response + sources | mcp__peec-ai__list_chats → get_chat |
| Scraped competitor content | mcp__peec-ai__get_url_content |
| Query Fan-Out + coverage | mcp__visiblyai__query_fanout (≥v0.6.0) |
| Backlink profile | mcp__visiblyai__get_backlinks |
| 24-point onpage audit | mcp__visiblyai__onpage_analysis (15 cr) |
| Competitor keywords | mcp__visiblyai__get_keywords |
| Intent classification | mcp__visiblyai__classify_keywords |
| Full-site crawl | mcp__visiblyai__crawl_website (15–60 cr) |
Credit budget (Visibly)
Per prompt analysis: ~45–75 credits.
- 1×
get_backlinksper top-3 competitor domain (cheap, often ~0) - 3×
onpage_analysis→ 45 - 1×
get_keywordsper top-2 competitor (cheap)
Batch of 10 prompts: ~500–750 credits.
Guardrails (do not do these)
- Do not analyze prompts with <24h of Peec history — phase 1 returns empty
- Do not
WebFetchGutefrage (403) — use WebSearch snippets instead - Do not run
onpage_analysison more than the top-3 URLs — credit drain - Do not mix funnel stages in the fan-out — a MOFU parent must not pull in TOFU sub-queries, or the brief dilutes
- Do not judge a competitor by DR alone — weak content at high DR is still attackable; read the actual content via
get_url_content - Do not run this skill before
peec-setup— depends on structured prompts/topics/tags