plugins/workiq-productivity/skills/channel-audit/SKILL.md
Audit Teams channels across your teams — identify inactive channels, low‑engagement conversations, channels with no recent posts, and recommend cleanup actions.
npx skillsauth add microsoft/work-iq channel-auditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.business
Generates a Microsoft Planner status report for one plan, using task status, owners, dates, priorities, buckets, risks, wins, progress, upcoming commitments, and milestones.
tools
Adds Microsoft Entra SSO (single sign-on, no OBO) to a Microsoft 365 Copilot declarative agent whose tools are served by an MCP server — for BOTH widget standards: (1) the MCP Apps standard (from create-mcp-app / the MCP Apps SDK): a plugin manifest such as readiness_plugin.json (or another *_plugin.json with a runtimes[] block) and an EXPRESS-based MCP server; and (2) the OpenAI Apps (OAI Apps) layout from the ui-widget-developer skill: appPackage/mcpPlugin.json and a raw-http MCP server. When the layout is ambiguous, DEFAULT to the MCP Apps standard (most projects use it). The skill auto-detects the layout, reuses the existing named devtunnel + env/.env.local (never creates a second tunnel), registers the Entra app + ATK OAuth (MicrosoftEntra), patches the plugin manifest's runtimes[] auth to OAuthPluginVault, injects a minimal JWKS bearer-token guard into the existing server (an EXPRESS middleware for MCP Apps, or a raw-http guard WITHOUT rewriting to Express for OAI Apps), validates, sideloads, and prints an app-registration summary. SSO only — no OBO. Triggered by: "add sso to my mcp server", "wire entra sso for my copilot agent", "setup sso for mcp apps", "add sso after create-mcp-app", "add sso after ui-widget-developer", "add entra auth to my express mcp server", "configure only sso no obo"
tools
WorkIQ - Microsoft 365 tool surface for agents. Use for any workplace question or write action where data lives in M365. Supports semantic `ask` plus tools (`fetch`, create/update/delete, actions, functions, fetch_blob, path/schema discovery) for mail, meetings/calendar, documents/files, Teams chats/channels, OneDrive/SharePoint, and people. Read triggers, "what did [person] say", priorities/top of mind, meeting decisions/action items, summarize thread/chat, find emails/docs, list meetings/messages/files/channels, project status/updates, "what changed since", download file content. Write triggers, send/reply/forward email, create/update/accept/decline meetings, mark read, delete drafts/items, send/post/reply/react in Teams, set presence. Discovery triggers, available endpoints/paths, fields, request body, schema/data model. Prefer `ask` for synthesis; use entity tools for exact reads/writes.
tools
Build MCP servers for Copilot Chat using the OpenAI Apps SDK or MCP Apps SDK widget rendering support (any language). Use this skill when: - Creating MCP servers that integrate with M365 Copilot declarative agents - Building rich interactive widgets (React + Fluent UI) that render in Copilot Chat - Implementing tools that return structuredContent for widget rendering - Adapting an existing MCP server to support Copilot widget rendering - Setting up devtunnels for localhost MCP server exposure - Configuring mcpPlugin.json manifests with RemoteMCPServer runtime Do NOT use this skill for general agent development (scaffolding, manifests, deployment) — use declarative-agent-developer instead. This skill is ONLY for MCP server + widget development. Triggers: "MCP server for Copilot", "OpenAI Apps SDK", "Copilot widget", "structuredContent", "MCP plugin", "devtunnels MCP", "OAI app", "widget rendering", "UI widget"