Back to Blog
RecipeMar 1, 202614 min read

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

NT

Nikhil Tiwari

MCP Playground

🍳 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

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

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

ServerToolUsed For
Slack MCPlist_channelsDiscover available channels
Slack MCPget_channel_historyRead messages from a channel
Slack MCPsearch_messagesSearch across all channels
Slack MCPpost_messagePost the standup summary
Slack MCPget_usersResolve user IDs to real names
Gmail MCPsearch_messagesFind relevant emails by query
Gmail MCPget_messageRead full email content
Gmail MCPlist_messagesList recent inbox messages
Gmail MCPsend_emailSend standup via email (optional)

Best Practices

PracticeWhy It Matters
Limit to 3–5 channelsReading 20 channels creates noise. Pick the highest-signal ones per team
Use a dedicated standup channelKeeps bot output separate from live conversation
Set a 24-hour lookbackPrevents 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 varsNever hardcode Slack or Google credentials in your config files
Review the first 5 runs manuallyTune 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
  • 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.

Related Recipes

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."
NT

Written by Nikhil Tiwari

15+ years in product development. AI enthusiast building developer tools that make complex technologies accessible to everyone.