microsoft/channel-audit
Audit Teams channels across your teams — identify inactive channels, low‑engagement conversations, channels with no recent posts, and recommend cleanup actions.
npx skills add https://github.com/microsoft/work-iq --skill channel-audit
Audit all Microsoft Teams channels across your teams to assess activity levels and engagement health. Identifies inactive channels, stale conversations, and low‑engagement spaces — then presents a prioritized audit report with recommended cleanup actions such as archiving, merging, or reviving channels.
workiq-ask (
question: "What is my profile information including display name, email, and time zone?"
)
Extract displayName, email, and timeZone for date calculations.
List every team and their channels:
workiq-ask (
question: "List all Microsoft Teams teams I belong to. For each team, list all channels including the channel name, description, type (standard, private, shared), and creation date."
)
Build an inventory of every channel:
If the response is too large or truncated, query teams individually:
workiq-ask (
question: "List all channels in the '<team name>' team including channel name, description, type, and creation date."
)
For each channel (or batch of channels within a team), pull recent messages to measure activity:
workiq-ask (
question: "Show me the 10 most recent messages in the '<channel name>' channel of the '<team name>' team. For each message include the sender, date, content summary, reply count, and whether it was from a bot or connector."
)
For each channel, calculate:
For each channel (especially those flagged as low‑activity):
workiq-ask (
question: "How many members are in the '<channel name>' channel of the '<team name>' team? List the member count."
)
Record:
Categorize each channel based on activity metrics:
🟢 Active — Messages within the last 7 days, multiple authors, replies present
🟡 Slow — Last message 7–30 days ago, limited authors
🟠 Stale — Last message 30–90 days ago, very few participants
🔴 Dead — No messages in 90+ days
⚪ Bot‑Only — Recent messages, but only from automated bots or connectors
Compare channel names and descriptions across teams to find potential duplicates:
🔍 CHANNEL AUDIT REPORT
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📅 Audit date: {date}
👤 Audited by: {displayName}
🏢 Teams scanned: {N} · 📢 Channels audited: {N}
📊 HEALTH OVERVIEW
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🟢 Active: {N} channels ({percentage}%)
🟡 Slow: {N} channels ({percentage}%)
🟠 Stale: {N} channels ({percentage}%)
🔴 Dead: {N} channels ({percentage}%)
⚪ Bot‑only: {N} channels ({percentage}%)
🔴 DEAD CHANNELS — Recommend Archive ({count})
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{Team} › #{Channel}
📅 Last post: {date} ({N} days ago)
👥 Members: {N} · 💬 Last author: {name}
💡 Action: Archive
{Team} › #{Channel}
📅 Last post: {date} ({N} days ago)
👥 Members: {N} · 💬 Last author: {name}
💡 Action: Archive
🟠 STALE CHANNELS — Monitor / Consider Archiving ({count})
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{Team} › #{Channel}
📅 Last post: {date} ({N} days ago)
👥 Members: {N} · 📝 Active posters: {N} ({ratio}%)
💡 Action: Notify owner, review purpose
🟡 SLOW CHANNELS — Watch List ({count})
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{Team} › #{Channel}
📅 Last post: {date} ({N} days ago)
👥 Members: {N} · 📝 Active posters: {N}
⚪ BOT‑ONLY CHANNELS ({count})
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{Team} › #{Channel}
🤖 Only automated posts detected
💡 Action: Review if bot output is still needed
🔄 POTENTIAL DUPLICATES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• {Team1} › #{Channel A} ↔ {Team2} › #{Channel B}
Reason: Similar names, overlapping members
💡 Action: Consider merging
🟢 HEALTHY CHANNELS ({count})
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{Team} › #{Channel} — {N} posts last 7d, {N} authors
{Team} › #{Channel} — {N} posts last 7d, {N} authors
📋 RECOMMENDED ACTIONS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 🗑️ Archive {N} dead channels
2. 📧 Notify owners of {N} stale channels
3. 🔄 Review {N} potential duplicate pairs
4. 🤖 Review {N} bot‑only channels
| Parameter | Required | Default | Description |
|-----------|----------|---------|-------------|
| Teams | No | All user's teams | Specific teams to audit |
| Inactive Threshold | No | 30 days | Days without posts to flag as stale |
| Dead Threshold | No | 90 days | Days without posts to flag as dead |
| Include Healthy | No | true | Show healthy channels in the report |
| Include General | No | false | Include default "General" channels |
| Sort By | No | Last activity | Sort order: "last-activity", "member-count", "team" |
| MCP Server | Tool | Purpose |
|---|---|---|
| workiq (Local WorkIQ CLI) | ask | User identity, team/channel discovery, message activity retrieval, and membership data |
Full workspace audit
> "Audit all my Teams channels and tell me which ones I should clean up."
Scans every team the user belongs to, classifies all channels by health status, detects bot-only and duplicate channels, and produces a complete prioritized report with archive and merge recommendations.
Single-team audit with narrow threshold
> "Do a channel health check for the Engineering team — flag anything with no posts in the last 2 weeks."
Scopes the audit to the Engineering team only and applies a custom inactive threshold of 14 days instead of the default 30, surfacing slow channels that would otherwise be missed.
Dead channels only, ready for archiving
> "Show me only the dead channels across all teams — nothing healthy, just what we should archive."
Runs a full scan but filters the output to dead channels (90+ days without posts), listing each with member count, last author, and a direct archive recommendation — ideal for a quick cleanup session.
Cannot retrieve user details
ask returns an authentication or permission error.Team list is empty or incomplete
ask returns no teams or only a subset of expected teams.Channel message retrieval fails for one or more channels
ask returns an error or no data for private or shared channels where the user lacks membership.⚠️ Access Restricted. Request channel membership or ask a channel owner to run the audit.No messages returned but channel exists
Member list unavailable
ask cannot retrieve membership data for a private channel due to permission restrictions.Large workspace timeouts
ask calls and take significant time.Take microsoft/channel-audit from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.