Build an AI Standup Bot with Slack + Gmail MCP (Complete Recipe)
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:
π¬
SlackChannel history, messages, threads
π§
GmailInbox threads, team emails
π€
ClaudeReads, synthesises, formats
π’
Standup PostPosted to #standup channel
How it flows:
- You trigger Claude with a standup prompt (or a scheduled script does it)
- Claude β Slack MCP: Calls
get_channel_historyfor each relevant channel - Claude β Gmail MCP: Calls
search_messagesfor recent team emails - Claude synthesises all data into a structured standup format
- Claude β Slack MCP: Calls
post_messageto publish the summary
Prerequisites
Admin access to create a Slack App and generate a Bot Token
Gmail access with OAuth credentials from Google Cloud Console
Required to run both MCP servers locally
Download free at claude.ai/download
Step 1: Set Up the Slack MCP Server
1a β Create a Slack App
- Go to api.slack.com/apps and click Create New App β From scratch
- Name it "MCP Standup Bot" and select your workspace
- Go to OAuth & Permissions in the left sidebar
- Under Bot Token Scopes, add these permissions:
channels:historyβ Read message history in public channelschannels:readβ View basic info about public channelsgroups:historyβ Read message history in private channelsgroups:readβ View basic info about private channelschat:writeβ Post messages to channelsusers:readβ View user info for displaying namessearch:readβ Search messages across the workspace
- Click Install to Workspace and approve the permissions
- 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
- Go to Google Cloud Console and create a new project
- Enable the Gmail API: APIs & Services β Library β search "Gmail API" β Enable
- Go to Credentials β Create Credentials β OAuth Client ID
- Choose Desktop App as the application type
- Download the credentials JSON β save it as
credentials.json - 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
| 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
- Confirm
SLACK_BOT_TOKENstarts withxoxb- - 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.jsonand 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
- Meeting Notes β Jira Tasks with Notion + Jira MCP
- AI Customer Support Summarizer with Intercom + Zendesk MCP
- Build an AI GitHub PR Reviewer with MCP
- Automate Meta Ads with Claude AI and MCP
Frequently Asked Questions
Can this read private Slack channels?+
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?+
Can multiple team members use this bot?+
What does it cost to run this?+
Can I add Google Calendar to include today's meetings?+
Written by Nikhil Tiwari
15+ years in product development. AI enthusiast building developer tools that make complex technologies accessible to everyone.
Related Resources