/community-pulse
Weekly read on Discord community health — joins, active channels, top contributors, themes, and unanswered questions
$ npx -y skills add cognyai/claude-code-marketing-skills --skill community-pulse --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/community-pulse
Context preview
The summary Claude sees to decide when to auto-load this skill.
Weekly read on Discord community health — joins, active channels, top contributors, themes, and unanswered questions
SKILL.md
community-pulse.SKILL.mdname: community-pulse
description: Weekly read on Discord community health — joins, active channels, top contributors, themes, and unanswered questions
version: "1.0.0"
author: Cogny AI
platforms: [discord]
user-invocable: true
argument-hint: ""
allowed-tools:
# Discord MCP read tools (via Cogny MCP Proxy)
- mcp__cogny__discord__get_current_user
- mcp__cogny__discord__list_guilds
- mcp__cogny__discord__get_guild
- mcp__cogny__discord__list_guild_channels
- mcp__cogny__discord__get_channel
- mcp__cogny__discord__list_guild_members
- mcp__cogny__discord__get_channel_messages
# Findings (premium / cloud-tier)
- mcp__cogny__create_finding
- WebFetch
- Read
- Write
Community Pulse — Discord weekly digest
Surface the signal in a busy Discord server. Who joined, which channels are hot, who's contributing, what's getting asked, and what's left hanging — in one digest you can act on in 15 minutes.
Usage
`/community-pulse` — weekly digest of the connected Discord server.
Pass a guild ID if the bot is in more than one server:
`/community-pulse 123456789012345678`
Prerequisites
The Discord MCP needs **two privileged intents** enabled in the Discord Developer Portal → Bot tab → Privileged Gateway Intents:
- **Server Members Intent** — without it, `list_guild_members` returns only
the bot itself.
- **Message Content Intent** — without it, `get_channel_messages` returns
authors and timestamps but every `content` field comes back empty.
If the report comes back with a 1-element member list or empty message content, this is almost always why. The skill flags the gap loudly at the top of the output rather than silently producing misleading numbers.
The bot also needs **View Channel + Read Message History** in each channel you want analysed — these are channel-level permissions, not intents.
Steps
1. Sanity check the connection
Call `mcp__cogny__discord__get_current_user` to confirm the bot identity. If this fails with an authentication error, the bot token in the cogny warehouse is bad — reconnect at `app.cogny.com/warehouse/<id>/settings/api`.
2. Pick the guild
Call `list_guilds`. If exactly one guild, use it. If multiple, prefer the guild ID passed as an argument. If none was passed and there's more than one, list them and ask the user to specify.
Once chosen, call `get_guild(guild_id, with_counts=True)` for the baseline:
- name, owner, premium tier
- `approximate_member_count` (this is the "members" stat)
- `approximate_presence_count` (online right now)
3. Inventory channels
Call `list_guild_channels(guild_id)`. Bucket channels into:
- **High-signal** — channels matching `intro`, `welcome`, `feedback`,
`support`, `showcase`, `hiring`, `general` (these usually hold the signal for community health)
- **Categories** — group containers (skip; they have no messages)
- **Voice / stage** — skip for the weekly digest
Cap the analysis at **30 channels** to bound runtime.
4. Member growth — last 7 days
Call `list_guild_members(guild_id, limit=1000)`, paginating with `after=<last user id>` until exhausted or 5000 members fetched.
For each member, parse `joined_at` and bucket into:
- **This week** — joined in the last 7 days
- **Last week** — joined 8–14 days ago
- **Existing** — joined >14 days ago
Compute:
- Joins this week (count + list of names/IDs + first-day-of-week breakdown)
- Joins last week (for the WoW comparison)
- WoW change in absolute and %
- Spike call-out if a single day accounts for >40% of weekly joins
5. Channel activity
For each text channel from Step 3 (cap 30, prioritize high-signal):
1. Call `get_channel_messages(channel_id, limit=100)` — most recent batch. 2. From that batch:
- Count messages with `timestamp` in the last 7 days
- Count messages in days 8–14 (for the WoW)
- Unique authors this week
- Most-recent message timestamp
3. If the earliest message in the batch is still within 7 days, paginate one more page with `before=<earliest message id>`. Stop after 200 messages per channel. 4. Classify:
| Class | Criteria | |---|---| | Hot | ≥20 messages this week, ≥5 unique authors | | Steady | 5–19 messages, ≥3 unique authors | | Quiet | 1–4 messages | | Dead | 0 this week, last activity >14 days ago |
6. Top contributors and lurker conversion
Aggregate the message samples from Step 5 by author across all channels:
- Total messages this week
- Channels they posted in
- Reactions received (sum of `reactions[].count` per message)
Then surface:
- **Top 5 contributors** — by message volume
- **Newly active members** — joined >30 days ago, ≥3 messages this week,
zero messages in days 8–14. These are lurkers who just turned the corner.
- **At-risk regulars** — ≥10 messages in days 8–14, ≤2 messages this week.
Going quiet — worth a check-in.
7. Topics and themes
If `content` is non-empty (Message Content Intent is on):
1. Group messages by channel and read the actual text. 2. Identify the **3 dominant topics**. A topic is dominant if it shows up in ≥5 messages or in ≥2 channels. 3. For each topic: one-sentence summary, 1–2 representative quotes (anonymize as "@member said: …"), sentiment (positive / neutral / mixed / concerning). 4. Flag **unanswered questions** — messages ending in "?" with no replies in the sampled thread. These are unmet needs.
If `content` is empty everywhere, skip this step and write a one-line note: *"Topic analysis unavailable — enable Message Content Intent on the bot in the Discord Developer Portal."*
8. Recommend 3–6 actions
Each action must:
- Cite the specific signal that motivated it ("joins this week dropped 38%")
- Be doable in <30 minutes (no big strategic pivots — this is a weekly rhythm)
- Have a clear owner and a clear "done" condition
Useful action shapes:
- Welcome the newly-active members by name in #general
- Re-engage at-risk regulars with a targeted DM or @mention
- Answer unanswered questions
Read more
name: community-pulse description: Weekly read on Discord community health — joins, active channels, top contributors, themes, and unanswered questions version: "1.0.0" author: Cogny AI platforms: [discord] user-invocable: true argument-hint: "" allowed-tools: # Discord MCP read tools (via Cogny MCP Proxy) - mcp__cogny__discord__get_current_user - mcp__cogny__discord__list_guilds - mcp__cogny__discord__get_guild - mcp__cogny__discord__list_guild_channels - mcp__cogny__discord__get_channel - mcp__cogny__discord__list_guild_members - mcp__cogny__discord__get_channel_messages # Findings (premium / cloud-tier) - mcp__cogny__create_finding - WebFetch - Read - Write
Community Pulse — Discord weekly digest
Surface the signal in a busy Discord server. Who joined, which channels are hot, who's contributing, what's getting asked, and what's left hanging — in one digest you can act on in 15 minutes.
Usage
`/community-pulse` — weekly digest of the connected Discord server.
Pass a guild ID if the bot is in more than one server:
`/community-pulse 123456789012345678`
Prerequisites
The Discord MCP needs **two privileged intents** enabled in the Discord Developer Portal → Bot tab → Privileged Gateway Intents:
- **Server Members Intent** — without it, `list_guild_members` returns only
the bot itself.
- **Message Content Intent** — without it, `get_channel_messages` returns
authors and timestamps but every `content` field comes back empty.
If the report comes back with a 1-element member list or empty message content, this is almost always why. The skill flags the gap loudly at the top of the output rather than silently producing misleading numbers.
The bot also needs **View Channel + Read Message History** in each channel you want analysed — these are channel-level permissions, not intents.
Steps
1. Sanity check the connection
Call `mcp__cogny__discord__get_current_user` to confirm the bot identity. If this fails with an authentication error, the bot token in the cogny warehouse is bad — reconnect at `app.cogny.com/warehouse/<id>/settings/api`.
2. Pick the guild
Call `list_guilds`. If exactly one guild, use it. If multiple, prefer the guild ID passed as an argument. If none was passed and there's more than one, list them and ask the user to specify.
Once chosen, call `get_guild(guild_id, with_counts=True)` for the baseline:
- name, owner, premium tier
- `approximate_member_count` (this is the "members" stat)
- `approximate_presence_count` (online right now)
3. Inventory channels
Call `list_guild_channels(guild_id)`. Bucket channels into:
- **High-signal** — channels matching `intro`, `welcome`, `feedback`,
`support`, `showcase`, `hiring`, `general` (these usually hold the signal for community health)
- **Categories** — group containers (skip; they have no messages)
- **Voice / stage** — skip for the weekly digest
Cap the analysis at **30 channels** to bound runtime.
4. Member growth — last 7 days
Call `list_guild_members(guild_id, limit=1000)`, paginating with `after=<last user id>` until exhausted or 5000 members fetched.
For each member, parse `joined_at` and bucket into:
- **This week** — joined in the last 7 days
- **Last week** — joined 8–14 days ago
- **Existing** — joined >14 days ago
Compute:
- Joins this week (count + list of names/IDs + first-day-of-week breakdown)
- Joins last week (for the WoW comparison)
- WoW change in absolute and %
- Spike call-out if a single day accounts for >40% of weekly joins
5. Channel activity
For each text channel from Step 3 (cap 30, prioritize high-signal):
1. Call `get_channel_messages(channel_id, limit=100)` — most recent batch. 2. From that batch:
- Count messages with `timestamp` in the last 7 days
- Count messages in days 8–14 (for the WoW)
- Unique authors this week
- Most-recent message timestamp
3. If the earliest message in the batch is still within 7 days, paginate one more page with `before=<earliest message id>`. Stop after 200 messages per channel. 4. Classify:
| Class | Criteria | |---|---| | Hot | ≥20 messages this week, ≥5 unique authors | | Steady | 5–19 messages, ≥3 unique authors | | Quiet | 1–4 messages | | Dead | 0 this week, last activity >14 days ago |
6. Top contributors and lurker conversion
Aggregate the message samples from Step 5 by author across all channels:
- Total messages this week
- Channels they posted in
- Reactions received (sum of `reactions[].count` per message)
Then surface:
- **Top 5 contributors** — by message volume
- **Newly active members** — joined >30 days ago, ≥3 messages this week,
zero messages in days 8–14. These are lurkers who just turned the corner.
- **At-risk regulars** — ≥10 messages in days 8–14, ≤2 messages this week.
Going quiet — worth a check-in.
7. Topics and themes
If `content` is non-empty (Message Content Intent is on):
1. Group messages by channel and read the actual text. 2. Identify the **3 dominant topics**. A topic is dominant if it shows up in ≥5 messages or in ≥2 channels. 3. For each topic: one-sentence summary, 1–2 representative quotes (anonymize as "@member said: …"), sentiment (positive / neutral / mixed / concerning). 4. Flag **unanswered questions** — messages ending in "?" with no replies in the sampled thread. These are unmet needs.
If `content` is empty everywhere, skip this step and write a one-line note: *"Topic analysis unavailable — enable Message Content Intent on the bot in the Discord Developer Portal."*
8. Recommend 3–6 actions
Each action must:
- Cite the specific signal that motivated it ("joins this week dropped 38%")
- Be doable in <30 minutes (no big strategic pivots — this is a weekly rhythm)
- Have a clear owner and a clear "done" condition
Useful action shapes:
- Welcome the newly-active members by name in #general
- Re-engage at-risk regulars with a targeted DM or @mention
- Answer unanswered questions
AI marketing skills for Claude Code, Cursor, Windsurf, and other AI coding tools. Audit SEO, analyze ads, research competitors, qualify leads — all from your terminal. Free skills need no account. Premium skills connect your real data for $9/mo.
Repo: cognyai/claude-code-marketing-skills
Other skills on claude-code-marketing-skills.
brand-kit
Build a portable brand-kit.json for the user's product — colors, typography, voice — that other skills (video, ad creative, landing page) can consume. Multiple…
cogny
Run Cogny marketing analysis tasks — fetch scheduled tasks, analyze ad accounts via MCP, report findings
conversion-debug
Conversion Tracking Debugger — diagnose discrepancies across GTM, GA4, Google Ads & Meta Pixel with live API access, BigQuery validation queries, and…
crm-icp-analysis
Analyze HubSpot CRM data to build a data-driven Ideal Customer Profile from closed-won deals, contacts, and companies

