# Build an AI Standup Bot with Slack + Gmail MCP (Complete Recipe)

> Step-by-step guide to building an AI standup bot that reads your Slack channels and Gmail inbox, synthesises key updates, and posts a daily summary to your team channel automatically. Uses Slack MCP + Gmail MCP + Claude.

**Source:** https://mcpplaygroundonline.com/blog/slack-email-standup-bot-mcp-recipe  
**Author:** Nikhil Tiwari  
**Published:** 2026-03-01  
**Updated:** 2026-03-01  
**Category:** Recipe  
**Reading time:** 14 min read

---

🍳 MCP Recipe

-   **What you'll build:** An AI bot that reads Slack and Gmail, then posts a structured daily standup to your team channel
-   **MCP servers used:** Slack MCP + Gmail MCP
-   **Time to complete:** 30–45 minutes
-   **Difficulty:** Beginner–Intermediate

Standups are supposed to take 15 minutes. In reality, half the team doesn't know what happened yesterday, key updates are buried in Slack threads, and important emails never make it into the conversation.

This recipe solves that. By connecting Claude to both Slack and Gmail via MCP, you get an AI assistant that reads everything that happened across your channels and inbox, synthesises it into a clean standup summary, and posts it directly to your team channel — every morning, without manual effort.

By the end of this recipe, you'll have a working standup bot that:

-   Reads specific Slack channels for updates, decisions, and blockers from the past 24 hours
-   Scans your Gmail inbox for relevant team emails and threads
-   Generates a structured standup with: what happened, what's planned, and any blockers
-   Posts the summary directly to your designated standup Slack channel
-   Formats everything cleanly — no walls of text

Table of Contents

1.  [Architecture Overview](#architecture)
2.  [Prerequisites](#prerequisites)
3.  [Step 1: Set Up Slack MCP](#step1)
4.  [Step 2: Set Up Gmail MCP](#step2)
5.  [Step 3: Configure Claude Desktop](#step3)
6.  [Step 4: Run Your First Standup](#step4)
7.  [Standup Prompts](#prompts)
8.  [Automate It Daily](#automate)

## Architecture Overview

The standup bot connects four components through MCP:

💬

**Slack**

Channel history, messages, threads

📧

**Gmail**

Inbox threads, team emails

🤖

**Claude**

Reads, synthesises, formats

📢

**Standup Post**

Posted to #standup channel

**How it flows:**

1.  **You trigger Claude** with a standup prompt (or a scheduled script does it)
2.  **Claude → Slack MCP:** Calls `get_channel_history` for each relevant channel
3.  **Claude → Gmail MCP:** Calls `search_messages` for recent team emails
4.  **Claude synthesises** all data into a structured standup format
5.  **Claude → Slack MCP:** Calls `post_message` to publish the summary

## Prerequisites

**Slack Workspace**

Admin access to create a Slack App and generate a Bot Token

**Google Account**

Gmail access with OAuth credentials from Google Cloud Console

**Node.js 18+**

Required to run both MCP servers locally

**Claude Desktop**

Download free at claude.ai/download

## Step 1: Set Up the Slack MCP Server

### 1a — Create a Slack App

1.  Go to [api.slack.com/apps](https://api.slack.com/apps) and click **Create New App → From scratch**
2.  Name it **"MCP Standup Bot"** and select your workspace
3.  Go to **OAuth & Permissions** in the left sidebar
4.  Under **Bot Token Scopes**, add these permissions:
    -   `channels:history` — Read message history in public channels
    -   `channels:read` — View basic info about public channels
    -   `groups:history` — Read message history in private channels
    -   `groups:read` — View basic info about private channels
    -   `chat:write` — Post messages to channels
    -   `users:read` — View user info for displaying names
    -   `search:read` — Search messages across the workspace
5.  Click **Install to Workspace** and approve the permissions
6.  Copy the **Bot User OAuth Token** — it starts with `xoxb-`

⚠️ Important

You must also **invite the bot to each channel** you want it to read. In Slack, type `/invite @MCP Standup Bot` in every relevant channel.

### 1b — Install the Slack MCP Server

```
npm install -g @modelcontextprotocol/server-slack
```

Set your bot token as an environment variable:

```
export SLACK_BOT_TOKEN="xoxb-your-token-here"
```

## Step 2: Set Up the Gmail MCP Server

### 2a — Create Google OAuth Credentials

1.  Go to [Google Cloud Console](https://console.cloud.google.com) and create a new project
2.  Enable the **Gmail API**: APIs & Services → Library → search "Gmail API" → Enable
3.  Go to **Credentials → Create Credentials → OAuth Client ID**
4.  Choose **Desktop App** as the application type
5.  Download the credentials JSON — save it as `credentials.json`
6.  Go to **OAuth Consent Screen** and add your email as a test user

### 2b — Install the Gmail MCP Server

```
npm install -g @modelcontextprotocol/server-gmail
```

Authenticate on first run — this opens a browser window for Google OAuth:

```
GMAIL_CREDENTIALS_PATH=/path/to/credentials.json npx @modelcontextprotocol/server-gmail
```

Complete the OAuth flow in your browser. A `token.json` file is saved locally — subsequent runs use it automatically.

💡 Pro Tip

Use a dedicated Google Workspace service account if deploying for a team. It avoids personal OAuth flows and can access shared inboxes.

## Step 3: Configure Claude Desktop

Open your Claude Desktop config file:

-   **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
-   **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`

Add both MCP servers:

```
{
 "mcpServers": {
 "slack": {
 "command": "npx",
 "args": ["-y", "@modelcontextprotocol/server-slack"],
 "env": {
 "SLACK_BOT_TOKEN": "xoxb-your-slack-bot-token"
 }
 },
 "gmail": {
 "command": "npx",
 "args": ["-y", "@modelcontextprotocol/server-gmail"],
 "env": {
 "GMAIL_CREDENTIALS_PATH": "/absolute/path/to/credentials.json",
 "GMAIL_TOKEN_PATH": "/absolute/path/to/token.json"
 }
 }
 }
}
```

Save and **fully restart Claude Desktop**. Both servers should appear in the MCP tools panel.

⚠️ Always use absolute paths

Use full paths like `/Users/yourname/credentials.json` — not `~/credentials.json`. Claude Desktop may not expand the tilde correctly.

Want to verify your server is working before going further? Test it in your browser first:

[Test Your MCP Connection →](/mcp-test-server)

## Step 4: Run Your First Standup

Start with a quick sanity check in Claude Desktop:

```
List all Slack channels I have access to.
```

If Claude returns a real list of channels, Slack MCP is working. Then verify Gmail:

```
Show me emails I received in the last 24 hours.
```

Once both return real data, you are ready to run the full standup.

## Standup Prompts — Copy and Use

### Prompt 1 — Standard Daily Standup

```
You are a standup facilitator. Do the following:

1. Read message history from these Slack channels for the last 24 hours:
 #engineering, #product, #general

2. Search Gmail for emails from the last 24 hours related to
 project updates, decisions, or blockers.

3. Synthesise into this format:

 ✅ DONE YESTERDAY
 [3–5 bullets of key completed work]

 🔄 TODAY'S PLAN
 [3–5 bullets of what's planned]

 🚧 BLOCKERS
 [Any blockers or items needing decisions — "None" if clear]

 📌 KEY DECISIONS MADE
 [Important decisions from Slack or email]

4. Post this summary to the #standup Slack channel.

Keep each bullet to one clear sentence. No walls of text.
```

### Prompt 2 — Engineering Team Standup

```
Read the last 24 hours of messages from #engineering,
#code-review, and #deployments on Slack.

Also check Gmail for emails about production issues,
deployments, or incidents from the last 24 hours.

Create a standup post:

🛠 SHIPPED
- [Completed PRs, deployments, features]

🔧 IN PROGRESS
- [Active work items and owners]

🐛 ISSUES / BLOCKERS
- [Bugs, incidents, or items needing review]

🚀 DEPLOYMENTS TODAY
- [Planned releases or environment changes]

Post it to #engineering-standup. Use real names where possible.
```

### Prompt 3 — Weekly Leadership Digest

```
Read the last 7 days from #product, #engineering, #sales,
and #customer-success on Slack.

Search Gmail for team emails from the past week with
"update", "report", "decision", or "blocker" in the subject.

Write a weekly leadership digest:

📈 KEY WINS THIS WEEK
[3–5 notable achievements across teams]

⚠️ RISKS AND BLOCKERS
[Issues needing leadership attention]

📋 DECISIONS NEEDED
[Items waiting for sign-off]

🗓 NEXT WEEK PRIORITIES
[Top 3 priorities based on what you've read]

Post to #leadership-updates. Keep it under 400 words.
```

### Prompt 4 — Personal Standup (Just for You)

```
Check my Slack mentions and DMs from the last 24 hours.

Check Gmail for emails I need to respond to or act on today.

Create a personal standup:

📬 MESSAGES NEEDING MY RESPONSE
[Slack threads or emails that need a reply from me]

📋 TASKS ASSIGNED TO ME
[Things people have requested or tagged me on]

🎯 MY TOP 3 PRIORITIES TODAY
[Suggested based on what's waiting]

Don't post anywhere — just show it to me.
```

## Automate It — Run Every Morning Automatically

### Option A — macOS/Linux Cron Job

```
# standup.sh
#!/bin/bash
curl https://api.anthropic.com/v1/messages \
 -H "x-api-key: $ANTHROPIC_API_KEY" \
 -H "anthropic-version: 2023-06-01" \
 -H "content-type: application/json" \
 -d '{
 "model": "claude-opus-4-6",
 "max_tokens": 1024,
 "messages": [{
 "role": "user",
 "content": "Run the daily standup: read last 24h from #engineering and #general on Slack, check Gmail for team emails, write a standup summary, post it to #standup."
 }]
 }'
```

Schedule via crontab (9am, Monday–Friday):

```
crontab -e
# Add:
0 9 * * 1-5 /path/to/standup.sh >> /var/log/standup.log 2>&1
```

### Option B — GitHub Actions (Cloud, No Local Setup)

```
# .github/workflows/daily-standup.yml
name: Daily Standup Bot
on:
 schedule:
 - cron: '0 9 * * 1-5' # 9am UTC, Mon–Fri
 workflow_dispatch:

jobs:
 standup:
 runs-on: ubuntu-latest
 steps:
 - name: Run standup bot
 env:
 ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
 SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
 run: node standup.js
```

## Tools Used From Each MCP Server

Server

Tool

Used For

**Slack MCP**

`list_channels`

Discover available channels

**Slack MCP**

`get_channel_history`

Read messages from a channel

**Slack MCP**

`search_messages`

Search across all channels

**Slack MCP**

`post_message`

Post the standup summary

**Slack MCP**

`get_users`

Resolve user IDs to real names

**Gmail MCP**

`search_messages`

Find relevant emails by query

**Gmail MCP**

`get_message`

Read full email content

**Gmail MCP**

`list_messages`

List recent inbox messages

**Gmail MCP**

`send_email`

Send standup via email (optional)

## Best Practices

Practice

Why It Matters

**Limit to 3–5 channels**

Reading 20 channels creates noise. Pick the highest-signal ones per team

**Use a dedicated standup channel**

Keeps bot output separate from live conversation

**Set a 24-hour lookback**

Prevents duplicate content and keeps summaries focused

**Give Claude a persona in your prompt**

"You are a standup facilitator" produces better output than a bare instruction

**Store tokens in env vars**

Never hardcode Slack or Google credentials in your config files

**Review the first 5 runs manually**

Tune your prompt based on what Claude includes or misses before going hands-off

## Troubleshooting

**Slack tools not appearing in Claude Desktop+**

-   Validate your config JSON at [jsonlint.com](https://jsonlint.com)
-   Confirm `SLACK_BOT_TOKEN` starts with `xoxb-`
-   Fully quit and restart Claude Desktop — closing the window is not enough

**Claude says it cannot access a channel+**

The bot needs to be invited to each channel. In Slack, open the channel and type `/invite @MCP Standup Bot`. Repeat for every channel you want Claude to read.

**Gmail OAuth keeps failing+**

-   Confirm your account is added as a **test user** in the OAuth consent screen
-   Delete `token.json` and re-authenticate from scratch
-   Check the Gmail API is enabled in Google Cloud Console
-   Use absolute paths — not `~/` — in the config

**Standup is missing important messages+**

-   Name channels explicitly: `"Read #engineering, #product, and #customer-success"`
-   Extend the lookback for Mondays: `"from the last 48 hours"`
-   Instruct Claude to prioritise: `"Focus on messages containing decisions, blockers, or updates"`

**Standup is too long or too short+**

-   **Too long:** Add to your prompt — `"Keep the entire standup under 300 words. Max 3 bullets per section."`
-   **Too short:** Add — `"Include at least 5 key updates per section. Don't skip decisions."`

## What You Built

-   ✅ Connected Claude to Slack via MCP — reads channel history and posts messages
-   ✅ Connected Claude to Gmail via MCP — searches and reads inbox threads
-   ✅ Built structured standup prompts that synthesise both sources
-   ✅ Tested the standup flow end-to-end with real data
-   ✅ Set up automation via cron or GitHub Actions to run daily without manual effort

## Next Steps

-   **Add Notion MCP:** Include project board updates in the standup alongside Slack and email
-   **Personalise per team:** Run separate prompts for engineering, product, and sales — post to each team's channel
-   **Add Google Calendar:** Pull today's meetings into the "TODAY'S PLAN" section automatically
-   **Thread replies:** Post the standup as a thread starter so team members can reply with personal updates
-   **Weekly digest:** Use Prompt 3 on Fridays for a leadership summary of the full week

Test Slack MCP and Gmail MCP in Your Browser

Inspect all available tools and run live requests before setting up locally — no install needed.

[Open MCP Playground →](/mcp-test-server) [Browse All MCP Servers](/mcps)

## Related Recipes

-   [Meeting Notes → Jira Tasks with Notion + Jira MCP](/blog/automate-jira-tasks-from-meeting-notes-notion-mcp-recipe)
-   [AI Customer Support Summarizer with Intercom + Zendesk MCP](/blog/customer-support-summarizer-intercom-zendesk-mcp-recipe)
-   [Build an AI GitHub PR Reviewer with MCP](/blog/build-ai-github-pr-reviewer-mcp-recipe)
-   [Automate Meta Ads with Claude AI and MCP](/blog/automate-meta-ads-claude-ai-mcp)

## Frequently Asked Questions

**Can this read private Slack channels?+**

Yes — add `groups:history` and `groups:read` scopes to your Slack app, then invite the bot to the private channel with `/invite @MCP Standup Bot`.

**Will Claude read all my emails?+**

Only what you instruct it to retrieve. The prompts above use targeted Gmail searches scoped to the last 24 hours. Claude doesn't passively browse your inbox between prompts.

**Can multiple team members use this bot?+**

Yes — the Slack bot token is workspace-level, not per-user. Anyone on the team can trigger the standup. For a shared team deployment, consider building a lightweight API wrapper so the standup can be triggered with a Slack slash command.

**What does it cost to run this?+**

The MCP servers are free. If you automate via the Claude API, a typical standup run costs under $0.05 at standard API pricing. For Claude Desktop users running it manually, it uses your existing plan allowance.

**Can I add Google Calendar to include today's meetings?+**

Yes — add Google Calendar MCP to your config and extend your prompt: _"Also check my Google Calendar for today's meetings and include them in the TODAY'S PLAN section."_

---

_Canonical page: https://mcpplaygroundonline.com/blog/slack-email-standup-bot-mcp-recipe — MCP Playground (mcpplaygroundonline.com), the free browser-based tool for testing MCP servers and building AI agents._
