npx skills add ...
npx skills add microsoft/work-iq --skill channel-audit
npx skills add microsoft/work-iq --skill channel-audit
Audit Teams channels across your teams — identify inactive channels, low‑engagement conversations, channels with no recent posts, and recommend cleanup actions.
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.
Extract displayName, email, and timeZone for date calculations.
List every team and their channels:
Build an inventory of every channel:
If the response is too large or truncated, query teams individually:
For each channel (or batch of channels within a team), pull recent messages to measure activity:
For each channel, calculate:
For each channel (especially those flagged as low‑activity):
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:
| 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.🔍 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