Summarize the day's Microsoft Teams channels into decisions and open questions

Every weekday at 17:00: decisions, open questions and shared links from the Teams channels you choose, so you can skip the scrollback.

Runs
Weekdays at 17:00
Posts
Report card

From your apps to your board

How the skill works: your agent reads today's threads from Microsoft Teams; team and channels from What you tell it, weekdays at 17:00, and gives you report card and the report in the chat.

Reads

  • Microsoft TeamsToday's threads
  • What you tell itTeam and channels
reads
Your agentClaude Code, Codex, Cursor or GeminiWeekdays at 17:00
posts

You get

  • Report cardOn your board, updated in place every run
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Decisions made today, with channel and who made them.
  • Open questions with no answer yet, with who asked and when.
  • Links shared, grouped by channel.
  • One line on the question that blocks the most work.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

AcmeMicrosoft Teams channel digest · Claude Code

3 decisions and 4 open questions in 3 channels

Across Product, Eng platform and Q4 launch today: 3 decisions, 4 questions still waiting for an answer, and 6 links shared.

TypeChannelWhatWho
DecisionQ4 launchLaunch moves to Nov 18 to fit the security reviewDana
DecisionEng platformKeep the v1 webhook endpoint until MarchTheo
DecisionProductAnnual plan gets 2 months free instead of 15% offPriya
QuestionQ4 launchWho owns the customer email for the launch?Lena, 10:40
QuestionEng platformCan the SDK drop Node 18 this quarter?Sam, 13:15
QuestionProductDo enterprise trials get SSO?Marco, 14:02
QuestionQ4 launchIs the press embargo Nov 17 or 18?Lena, 16:20

The launch email owner has been an open question since 10:40, and the email goes to customers on Nov 18.

Done
An example with made-up numbers. Your agent posts your real ones.

What it does

Busy Teams channels bury the two messages that matter under forty that don't: the decision made in a reply thread at 11, and the question that nobody answered. Catching up means scrolling every channel after the last meeting of the day.

The agent reads today's threads in the channels you name and sorts them into decisions, open questions and links. Product managers and engineers read the day in a minute, and an unanswered question gets seen before it turns into tomorrow's blocker.

How it works

  1. 1Read today's threads

    For each channel call GET https://graph.microsoft.com/v1.0/teams/{team-id}/channels/{channel-id}/messages?$top=50&$expand=replies. Threads come back ordered by their last change, so follow @odata.nextLink until a thread's lastModifiedDateTime is before the start of today.

  2. 2

    2Clean up the messages

    Keep items whose messageType is message, strip the HTML from body.content, and keep the author, time, replies and webUrl. Links come from anchors in the body and from attachments[].contentUrl.

  3. 3

    3Sort into decisions and questions

    A decision is a thread that ends in agreement ("let's go with", "approved", "we'll ship Tuesday") that nobody pushed back on. An open question is a question with no reply from someone else. Everything else is context and stays out.

  4. 4

    4Write the digest

    Decisions first, then open questions with who asked and how long ago, then links, each with its channel and a link to the message.

  5. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/microsoft-teams-channel-digest/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the microsoft-teams-channel-digest skill

    Or paste the prompt instead of installing:

    promptUsing Microsoft Graph (or the Microsoft 365 connector), read today's messages and replies in these Teams channels: <team and channel names>. Give me the decisions made (agreements nobody pushed back on), the open questions that no one else has answered, with who asked and when, and the links shared, each with its channel. Skip small talk and system messages. End with the one open question that blocks the most work.
  3. Put it on a schedule

    Weekdays at 17:00, from cron on any machine where Claude Code is signed in:

    crontab0 17 * * 1-5 claude -p "Run the microsoft-teams-channel-digest skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: microsoft-teams-channel-digest
description: "Every weekday at 17:00: decisions, open questions and shared links from the Teams channels you choose, so you can skip the scrollback. Use when the user asks for this, or when it runs on a schedule."
---

# Microsoft Teams channel digest

Every weekday at 17:00: decisions, open questions and shared links from the Teams channels you choose, so you can skip the scrollback.

Busy Teams channels bury the two messages that matter under forty that don't: the decision made in a reply thread at 11, and the question that nobody answered. Catching up means scrolling every channel after the last meeting of the day.

The agent reads today's threads in the channels you name and sorts them into decisions, open questions and links. Product managers and engineers read the day in a minute, and an unanswered question gets seen before it turns into tomorrow's blocker.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Microsoft Graph app with the delegated `ChannelMessage.Read.All` permission, which needs admin consent, or the Claude Microsoft 365 connector (available on every Claude plan with a work or school account), for which a Microsoft Entra Global Administrator grants tenant consent once.
- The team and channel names or IDs to cover.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read today's threads** (Microsoft Teams): For each channel call `GET https://graph.microsoft.com/v1.0/teams/{team-id}/channels/{channel-id}/messages?$top=50&$expand=replies`. Threads come back ordered by their last change, so follow `@odata.nextLink` until a thread's `lastModifiedDateTime` is before the start of today.
2. **Clean up the messages**: Keep items whose `messageType` is `message`, strip the HTML from `body.content`, and keep the author, time, replies and `webUrl`. Links come from anchors in the body and from `attachments[].contentUrl`.
3. **Sort into decisions and questions**: A decision is a thread that ends in agreement ("let's go with", "approved", "we'll ship Tuesday") that nobody pushed back on. An open question is a question with no reply from someone else. Everything else is context and stays out.
4. **Write the digest**: Decisions first, then open questions with who asked and how long ago, then links, each with its channel and a link to the message.

## Route B: the browser

### What you need

- Signed in to Microsoft Teams with a work or school account that is a member of each team; private and shared channels only show up for their members.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://teams.microsoft.com. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open each channel**: Open `https://teams.microsoft.com`, click **Teams** in the left rail and open the first channel you follow. Scroll the **Posts** tab up to the first post from today.
2. **Expand the threads**: For every post from today, or with a reply from today, click **See more replies** (or **N replies**) so the whole thread is visible, and read author, time and text. Skip joined and left notices, meeting started notices and reactions.
3. **Sort into decisions and questions**: A decision is a thread that ends in agreement, such as "approved" or "we'll ship Tuesday", that nobody pushed back on. An open question is a question with no reply from someone else. Collect links from the messages and the thread's shared files.
4. **Write the digest**: Decisions first, then open questions with who asked and how long ago, then links grouped by channel. Use **...** > **Copy link** on a message to link to it.

Note: Teams loads older posts as you scroll, so a channel with hundreds of posts a day takes time, and collapsed threads must be expanded one by one. The web app needs a desktop browser; the mobile layout hides reply counts.

## The report

- **Decisions** made today, with channel and who made them.
- **Open questions** with no answer yet, with who asked and when.
- **Links** shared, grouped by channel.
- One line on the question that blocks the most work.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "microsoft-teams-channel-digest/<date of this run, e.g. 2026-10-16>",
  "item_key": "microsoft-teams-channel-digest",
  "project": "Acme",
  "source": "Microsoft Teams channel digest skill",
  "kind": "update",
  "title": "3 decisions and 4 open questions in 3 channels",
  "summary": "Across **Product**, **Eng platform** and **Q4 launch** today: **3 decisions**, **4 questions** still waiting for an answer, and 6 links shared.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Type",
          "Channel",
          "What",
          "Who"
        ],
        "align": [
          "left",
          "left",
          "left",
          "left"
        ],
        "rows": [
          [
            "Decision",
            "Q4 launch",
            "Launch moves to Nov 18 to fit the security review",
            "Dana"
          ],
          [
            "Decision",
            "Eng platform",
            "Keep the v1 webhook endpoint until March",
            "Theo"
          ],
          [
            "Decision",
            "Product",
            "Annual plan gets 2 months free instead of 15% off",
            "Priya"
          ],
          [
            "Question",
            "Q4 launch",
            "Who owns the customer email for the launch?",
            "Lena, 10:40"
          ],
          [
            "Question",
            "Eng platform",
            "Can the SDK drop Node 18 this quarter?",
            "Sam, 13:15"
          ],
          [
            "Question",
            "Product",
            "Do enterprise trials get SSO?",
            "Marco, 14:02"
          ],
          [
            "Question",
            "Q4 launch",
            "Is the press embargo Nov 17 or 18?",
            "Lena, 16:20"
          ]
        ]
      }
    },
    {
      "type": "Links",
      "props": {
        "items": [
          {
            "label": "Q4 launch plan",
            "url": "https://example.com/docs/q4-launch-plan"
          },
          {
            "label": "Webhook v1 deprecation notes",
            "url": "https://example.com/docs/webhooks-v1"
          },
          {
            "label": "Annual plan pricing sheet",
            "url": "https://example.com/docs/annual-pricing"
          }
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "The launch email owner has been an open question since 10:40, and the email goes to customers on Nov 18.",
        "tone": "warn"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 17:00 (`0 17 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 17 * * 1-5 claude -p "Run the microsoft-teams-channel-digest skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/microsoft-teams-channel-digest#schedule

Source: https://briefkin.dev/skills/microsoft-teams-channel-digest

What your agent needs

  • A Microsoft Graph app with the delegated ChannelMessage.Read.All permission, which needs admin consent, or the Claude Microsoft 365 connector (available on every Claude plan with a work or school account), for which a Microsoft Entra Global Administrator grants tenant consent once.

  • The team and channel names or IDs to cover.

Connecting Microsoft Teams

  1. Microsoft 365 connector in Claude. Anthropic's connector reads Teams chats and channel discussions and Teams meeting information, summaries and attendance, along with Outlook, SharePoint and OneDrive. It's available on every Claude plan but needs a work or school account, and a Microsoft Entra Global Administrator grants tenant consent once. Reading is on by default; sending Teams messages is a write action an admin has to allow (docs). Connectors added in claude.ai also appear in Claude Code when you sign in with that account.
  2. Work IQ MCP server. Microsoft's own MCP server for Microsoft 365 data, chats included, is in preview (as of October 2026) and needs a tenant admin to set it up.
  3. Microsoft Graph with your own app. Register an app in Microsoft Entra ID with delegated Chat.Read and ChannelMessage.Read.All, plus OnlineMeetingTranscript.Read.All for transcripts (some of these need admin consent), and sign in once with the device code flow. The skill reads MS_TENANT_ID, MS_CLIENT_ID and MS_REFRESH_TOKEN. Reading channel messages with application permissions is a protected API that Microsoft must approve first.

Delegated read permissions see only the teams and chats the signed-in user is part of, so a digest can't reach beyond your own conversations, and none of them can post.

Questions

Why does it need an admin?

Reading channel messages through Microsoft Graph uses ChannelMessage.Read.All, which needs an administrator's consent for the tenant. The Claude Microsoft 365 connector has the same rule: a Microsoft Entra Global Administrator grants tenant consent once (on Team and Enterprise plans a Claude Owner also adds the connector for the organization), then each person connects their own account.

Does it read private channels and chats?

It reads only the channels you name, and only those the connected account can see; private channels need that account to be a member. The Microsoft 365 connector can also read one-to-one and group chats, but this skill does not ask for them.

Do I need Briefkin to use the Microsoft Teams channel digest skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Microsoft Teams pages themselves: the agent opens teams.microsoft.com in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.