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.
Every weekday at 17:00: decisions, open questions and shared links from the Teams channels you choose, so you can skip the scrollback.
Reads
You get
The card on the right is a sample. Yours shows your own numbers and updates in place every run.
What lands on your board
Across Product, Eng platform and Q4 launch today: 3 decisions, 4 questions still waiting for an answer, and 6 links shared.
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.
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.
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.
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.
Decisions first, then open questions with who asked and how long ago, then links, each with its channel and a link to the message.
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.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
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 | shAsk Claude Code:
promptRun the microsoft-teams-channel-digest skillOr 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.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.
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
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
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.
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.
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.
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.
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.
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.
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.
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.