# Peec Content Intel

> 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 oppo…

- **Type:** Skill
- **Install:** `agentstack add skill-antonioblago-peec-ai-skills-peec-content-intel`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [AntonioBlago](https://agentstack.voostack.com/s/antonioblago)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [AntonioBlago](https://github.com/AntonioBlago)
- **Source:** https://github.com/AntonioBlago/peec-ai-skills/tree/main/skills/peec-content-intel
- **Website:** https://antonioblago.de

## Install

```sh
agentstack add skill-antonioblago-peec-ai-skills-peec-content-intel
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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 from `setup_state.json` per 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 from `setup_state.json` (`prompt_language`); user can override per-run, but never default to `en` silently
- `target_country` — read from `setup_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 filters
- `page_type` — **required**. Must be one of the values in `setup_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 from `setup_state.json`. Used to validate `page_type` selection against the allowed taxonomy matrix.
- `audience` — read from `setup_state.json`. `audience.primary` and `audience.pain_points` feed 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/_/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:

```yaml
---
brief_id:      _
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 /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 /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:///",
  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:
1. Synonym (same intent, different wording)
2. Decision ("what does it cost", "when to switch")
3. Comparison ("X vs Y")
4. Problem ("why doesn't X work")
5. Long-tail (narrow niche)
6. 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//comments//...")
```

Procedure:
1. From Phase 1, list all `classification=DISCUSSION` + `domain=reddit.com` URLs
2. For the top 3 by retrieval, call `get_url_content`
3. Extract: verbatim pain quotes, tool mentions, competitor mentions, sentiment

**Gutefrage / t3n / OMR**:
```
WebSearch("site:gutefrage.net ")
WebSearch("site:t3n.de/forum ")
WebSearch("site:omr.com ")
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="", limit=10, location="Germany")
mcp__visiblyai__onpage_analysis(url="", keyword="")   # 15 credits, top 3 only
mcp__peec-ai__get_url_content(project_id, url="")                    # for outline mining
mcp__visiblyai__get_keywords(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 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 (_/brief.md`. Schema below.

---

## Brief schema

```markdown
## Content Brief: 

### Goal
Win Peec prompt: ""
Funnel stage: Awareness | Consideration | Decision | Retention
Current own visibility: X%  →  Target: Y% in 90 days

### Buyer language (forum pain, verbatim)
- ""  (source: r/selbststaendig, 2026-03)
- ""  (source: Gutefrage)
- ""

### Sub-queries (Query Fan-Out)
1. 
2. 
...

### 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
 — based on dominant URL class

### Title (draft, ≤60 chars)

### Meta description (≤155 chars)

### Outline (H2 / H3)
1. 
2. 
3. 
4. 
5. 
6. 

### Focus + secondary keywords
- Focus:   (volume, intent)
- Secondary: , ,    (from keyword gap)

### Backlink strategy
- : editorial pitch (template)
- : join thread (URL)
- : 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_backlinks` per top-3 competitor domain (cheap, often ~0)
- 3× `onpage_analysis` → 45
- 1× `get_keywords` per 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 `WebFetch` Gutefrage (403) — use WebSearch snippets instead
- Do not run `onpage_analysis` on 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

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [AntonioBlago](https://github.com/AntonioBlago)
- **Source:** [AntonioBlago/peec-ai-skills](https://github.com/AntonioBlago/peec-ai-skills)
- **License:** MIT
- **Homepage:** https://antonioblago.de

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-antonioblago-peec-ai-skills-peec-content-intel
- Seller: https://agentstack.voostack.com/s/antonioblago
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
