Find the Outlook conversations where someone is still waiting on you

Weekday afternoons: Outlook conversations where the last message is from someone else and over 24 hours old, with an offer to draft replies.

Runs
Weekdays at 15:00
Uses
Outlook
Posts
Asks you

What lands on your board

InboxOutlook emails waiting on your reply · Claude Code

5 Outlook conversations waiting on you, oldest 4 days

Want me to draft replies? They go to your Drafts folder in each conversation, and nothing is sent.

5 people wrote last and are waiting. The Halcyon contract question has waited 4 days.

FromSubjectWaiting
Jon Weber, HalcyonContract: liability cap wording4 days
Priya NairBoard deck numbers for October3 days
Marco BianchiSpeaker slot in November?2 days
Finance teamApprove the Q4 software budget2 days
Lea MartinQuick question about the API limits1 day
Resolve
An example with made-up numbers. Your agent posts your real ones.

What it does

Outlook's flags and Focused Inbox help only if you use them every time, and the message that slips is always the one you read on your phone between meetings. A day later the sender is still waiting, and nothing in the inbox says so.

This skill compares what arrived with what you sent in the same conversation. When the last word belongs to a real person and it is more than a day old, the conversation goes on the list, oldest first. It then asks which ones to draft; drafts land in each conversation and nothing is sent.

How it works

  1. 1Read the inbox

    GET /me/mailFolders/inbox/messages?$filter=receivedDateTime ge <14 days ago>&$orderby=receivedDateTime desc&$select=id,conversationId,from,subject,receivedDateTime,toRecipients,ccRecipients,inferenceClassification&$top=200, following @odata.nextLink. Graph requires the $orderby field to appear first in $filter.

  2. 2Read what you sent

    GET /me/mailFolders/sentitems/messages?$filter=sentDateTime ge <14 days ago>&$orderby=sentDateTime desc&$select=conversationId,sentDateTime&$top=200.

  3. 3

    3Find who wrote last

    Per conversationId, compare the newest inbox message with your newest sent message. The conversation waits on you when the inbox message is newer, from someone else, and more than 24 hours old.

  4. 4

    4Drop what is not a person

    Skip senders like noreply@ and notifications@, meeting requests and responses, messages where you are only in Cc, and messages Focused Inbox put in Other (inferenceClassification: other).

  5. 5Rank and ask

    Order by hours waiting and ask which to draft. Drafts are made with POST /me/messages/{id}/createReply, which saves a reply in Drafts for you to edit; nothing is sent.

  6. 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.

What you get

  • Count of conversations waiting on you, and the oldest.
  • Per conversation: sender, subject and how long they have waited.
  • The ask: which conversations to draft replies for, if any.

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/outlook-emails-waiting-on-reply/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the outlook-emails-waiting-on-reply skill

    Or paste the prompt instead of installing:

    promptUsing Microsoft Graph (or the Microsoft 365 connector), read my Outlook inbox messages from the last 14 days and my sent items from the same period, with conversationId, sender and dates. For each conversation, check whether the newest inbox message is newer than my newest sent message, is from someone else, and is more than 24 hours old. Skip noreply and notification senders, meeting requests, messages where I am only in Cc, and anything Focused Inbox put in Other. Rank by how long they have waited and show sender, subject and days waiting. Ask me which ones to draft replies for; create drafts only after I answer and never send.
  3. Put it on a schedule

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

    crontab0 15 * * 1-5 claude -p "Run the outlook-emails-waiting-on-reply 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 question for you. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: outlook-emails-waiting-on-reply
description: "Weekday afternoons: Outlook conversations where the last message is from someone else and over 24 hours old, with an offer to draft replies. Use when the user asks for this, or when it runs on a schedule."
---

# Outlook emails waiting on your reply

Weekday afternoons: Outlook conversations where the last message is from someone else and over 24 hours old, with an offer to draft replies.

Outlook's flags and Focused Inbox help only if you use them every time, and the message that slips is always the one you read on your phone between meetings. A day later the sender is still waiting, and nothing in the inbox says so.

This skill compares what arrived with what you sent in the same conversation. When the last word belongs to a real person and it is more than a day old, the conversation goes on the list, oldest first. It then asks which ones to draft; drafts land in each conversation and nothing is sent.

## 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

- Claude's Microsoft 365 connector (work or school accounts on a Microsoft Entra tenant), whose Outlook tools search your mail, or a Microsoft Graph app with delegated `Mail.ReadBasic`, enough to read senders, subjects and conversations.
- `Mail.ReadWrite` as well, only if the agent should create reply drafts.

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

### Steps

1. **Read the inbox** (Outlook): `GET /me/mailFolders/inbox/messages?$filter=receivedDateTime ge <14 days ago>&$orderby=receivedDateTime desc&$select=id,conversationId,from,subject,receivedDateTime,toRecipients,ccRecipients,inferenceClassification&$top=200`, following `@odata.nextLink`. Graph requires the `$orderby` field to appear first in `$filter`.
2. **Read what you sent** (Outlook): `GET /me/mailFolders/sentitems/messages?$filter=sentDateTime ge <14 days ago>&$orderby=sentDateTime desc&$select=conversationId,sentDateTime&$top=200`.
3. **Find who wrote last**: Per `conversationId`, compare the newest inbox message with your newest sent message. The conversation waits on you when the inbox message is newer, from someone else, and more than 24 hours old.
4. **Drop what is not a person**: Skip senders like `noreply@` and `notifications@`, meeting requests and responses, messages where you are only in Cc, and messages Focused Inbox put in Other (`inferenceClassification: other`).
5. **Rank and ask** (Outlook): Order by hours waiting and ask which to draft. Drafts are made with `POST /me/messages/{id}/createReply`, which saves a reply in Drafts for you to edit; nothing is sent.

## Route B: the browser

### What you need

- Signed in to Outlook on the web as the mailbox owner (or with full access to a shared mailbox), with any 2FA prompt already done.

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

### Steps

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

1. **Open the inbox in conversation view**: For a work or school account open outlook.office.com/mail; a personal account uses outlook.live.com/mail. Under **Settings > Mail > Layout**, make sure **Message organization** is set to show email grouped by conversation, so each thread shows who wrote last.
2. **Filter to the last two weeks**: Search `received>=<date 14 days ago>` in the search box, with **Focused** selected if Focused Inbox is on. Sort by **Date** with oldest first so the longest waits come up first.
3. **Find the threads where someone else wrote last**: Open each conversation. It waits on you when the newest message is from a person, you are in To rather than Cc, and it arrived more than 24 hours ago with no reply from you after it. Skip `noreply@` and `notifications@` senders and meeting invitations or responses.
4. **Rank and ask before drafting**: List the conversations by hours waiting with sender and subject. Ask which to draft; for each one chosen, click **Reply** in the conversation, write the draft, and close it so it stays in **Drafts**. Never click Send.

Note: Conversation view hides your own replies inside the thread, so the agent opens each one; with more than about 50 conversations in two weeks this is slow and the API route is better. The web Sent Items folder shows the same conversations from your side if you want a cross-check.

## The report

- **Count** of conversations waiting on you, and the oldest.
- **Per conversation**: sender, subject and how long they have waited.
- The ask: which conversations to draft replies for, if any.

## 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": "outlook-emails-waiting-on-reply/<date of this run, e.g. 2026-10-16>",
  "item_key": "outlook-emails-waiting-on-reply",
  "project": "Inbox",
  "source": "Outlook emails waiting on your reply skill",
  "kind": "action",
  "title": "5 Outlook conversations waiting on you, oldest 4 days",
  "summary": "**5 people** wrote last and are waiting. The Halcyon contract question has waited **4 days**.",
  "action": {
    "request": "Want me to draft replies? They go to your Drafts folder in each conversation, and nothing is sent.",
    "options": [
      "Draft all 5",
      "Draft the 2 oldest",
      "Remind me tomorrow",
      "Handled elsewhere"
    ]
  },
  "widget": {
    "type": "Table",
    "props": {
      "columns": [
        "From",
        "Subject",
        "Waiting"
      ],
      "align": [
        "left",
        "left",
        "right"
      ],
      "rows": [
        [
          "Jon Weber, Halcyon",
          "Contract: liability cap wording",
          "4 days"
        ],
        [
          "Priya Nair",
          "Board deck numbers for October",
          "3 days"
        ],
        [
          "Marco Bianchi",
          "Speaker slot in November?",
          "2 days"
        ],
        [
          "Finance team",
          "Approve the Q4 software budget",
          "2 days"
        ],
        [
          "Lea Martin",
          "Quick question about the API limits",
          "1 day"
        ]
      ]
    }
  }
}
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 15:00 (`0 15 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 15 * * 1-5 claude -p "Run the outlook-emails-waiting-on-reply 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/outlook-emails-waiting-on-reply#schedule

Source: https://briefkin.dev/skills/outlook-emails-waiting-on-reply

What your agent needs

  • Claude's Microsoft 365 connector (work or school accounts on a Microsoft Entra tenant), whose Outlook tools search your mail, or a Microsoft Graph app with delegated Mail.ReadBasic, enough to read senders, subjects and conversations.

  • Mail.ReadWrite as well, only if the agent should create reply drafts.

Connecting Outlook

  1. Microsoft 365 connector in Claude. Anthropic's connector searches Outlook mail and calendars along with SharePoint, OneDrive and Teams, on every Claude plan. It needs a work or school Microsoft account (personal outlook.com and hotmail.com accounts aren't supported), and a Microsoft Entra Global Administrator grants tenant consent once. Reading and searching are on by default; sending mail and changing events are write actions your admins turn on (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, mail and calendar 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 Mail.Read, Calendars.Read and offline_access, allow public client flows, sign in once with the device code flow, and store MS_TENANT_ID, MS_CLIENT_ID and MS_REFRESH_TOKEN. This route also works for personal Outlook.com accounts through the consumers tenant.

Mail.ReadBasic is enough when a report needs only senders, subjects and dates, not message bodies. If you use application permissions for a shared mailbox, limit the app to that mailbox with RBAC for Applications in Exchange Online.

Questions

Does it work with a personal Outlook.com account?

Through Microsoft Graph, yes: the same mail endpoints work for personal accounts. Claude's Microsoft 365 connector is for work and school accounts only, so a personal mailbox needs your own Graph app registration.

Why read Sent Items instead of the whole conversation?

It is two list calls instead of one call per conversation, and Graph refuses some combinations of conversation filters and sorting. Matching on conversationId across the two folders gives the same answer: whether you have written since they did.

Do I need Briefkin to use the Outlook emails waiting on your reply 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 asks you, 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 Outlook pages themselves: the agent opens outlook.office.com/mail 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.

Answer your agents from one board, or from Telegram

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.