skills/tier-2-communication/slack/SKILL.md
Slack team messaging for small businesses. Send messages, manage channels, post automated updates, run daily standups, and coordinate your team. Includes SMB channel structure and team communication best practices.
npx skillsauth add pbc-os/agent-skills-public slackInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Team messaging built for how small businesses actually communicate.
For user lookups and directory management, see the slack-directory skill. This skill covers everything else: sending messages, managing channels, posting automated updates, and organizing your team's communication.
slack-directory skill for user lookupssecrets-manager skill for secure token storage| Scope | What It Enables |
|-------|----------------|
| chat:write | Send messages to channels and DMs |
| channels:read | List and get info about public channels |
| channels:manage | Create and archive public channels |
| groups:read | List private channels the bot is in |
| im:write | Send direct messages |
| users:read | Look up users (for slack-directory) |
| files:write | Upload files to channels |
| reactions:write | Add emoji reactions |
xoxb-...)# GCP Secret Manager (recommended)
echo -n "xoxb-your-token" | gcloud secrets create slack-bot-token --data-file=-
# Or set as environment variable
export SLACK_BOT_TOKEN="xoxb-your-token"
# From GCP Secret Manager
TOKEN=$(gcloud secrets versions access latest --secret="slack-bot-token")
# From environment
TOKEN="$SLACK_BOT_TOKEN"
Every message and channel change is visible to your team and hard to fully unsend. Before the agent posts a message, sends a DM, creates or archives a channel, or uploads a file, show the user the exact text and target and get explicit approval — unless they've pre-approved a specific recurring automation (e.g. a daily briefing to a named channel), in which case state that standing approval the first time and stay within its scope.
TOKEN=$(gcloud secrets versions access latest --secret="slack-bot-token")
curl -s -X POST "https://slack.com/api/chat.postMessage" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0XXXXXXX",
"text": "Morning update: 3 deliveries scheduled, 2 pickups. Full details in the daily brief."
}' | jq '.ok'
# First, look up the user ID (use slack-directory skill)
# Then send a DM
curl -s -X POST "https://slack.com/api/chat.postMessage" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "U09ABC123",
"text": "Hey — vendor delivery moved to 3pm today. Can you be there to receive it?"
}' | jq '.ok'
curl -s -X POST "https://slack.com/api/chat.postMessage" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0XXXXXXX",
"blocks": [
{
"type": "header",
"text": {"type": "plain_text", "text": "Daily Sales Report"}
},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": "*Revenue:*\n$2,450"},
{"type": "mrkdwn", "text": "*vs Forecast:*\n+11%"},
{"type": "mrkdwn", "text": "*Transactions:*\n87"},
{"type": "mrkdwn", "text": "*Avg Ticket:*\n$28.16"}
]
},
{
"type": "context",
"elements": [
{"type": "mrkdwn", "text": "Generated automatically by your AI agent"}
]
}
]
}'
curl -s "https://slack.com/api/conversations.list" \
-H "Authorization: Bearer $TOKEN" \
-G -d "types=public_channel,private_channel" -d "limit=100" | \
jq -r '.channels[] | "\(.id)\t\(.name)\t\(.num_members) members"'
curl -s -X POST "https://slack.com/api/conversations.create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "daily-briefing",
"is_private": false
}' | jq '.channel.id'
# Upload a report or document to a channel
curl -s -X POST "https://slack.com/api/files.uploadV2" \
-H "Authorization: Bearer $TOKEN" \
-F "channel_id=C0XXXXXXX" \
-F "title=Weekly Sales Report" \
-F "file=@./report.pdf"
curl -s -X POST "https://slack.com/api/conversations.setTopic" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0XXXXXXX",
"topic": "Daily ops updates. Agent posts briefings at 7:30am."
}'
# Reply in a thread (use ts from the parent message)
curl -s -X POST "https://slack.com/api/chat.postMessage" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0XXXXXXX",
"thread_ts": "1705300000.000100",
"text": "Update: delivery confirmed for 3pm."
}'
| Channel | Purpose | Who's In | Bot Posts |
|---------|---------|----------|----------|
| #general | Company-wide announcements | Everyone | Major alerts only |
| #daily-briefing | Morning briefing + end-of-day summary | Everyone | Daily automated briefing |
| #orders | Order updates, fulfillment status | Operations team | Order alerts |
| #inventory | Stock levels, reorder alerts | Operations + purchasing | Low stock alerts |
| #sales | Revenue updates, daily numbers | Leadership + sales | Daily sales report |
| #marketing | Ad performance, campaign updates | Marketing team | Ad spend alerts |
| #ops-log | Shift handoffs, equipment issues | Operations team | Shift change reminders |
| #vendor-comms | Vendor updates, delivery tracking | Purchasing + ops | Delivery confirmations |
Don't over-channel. Start with:
| Channel | Purpose |
|---------|---------|
| #general | Everything that doesn't fit elsewhere |
| #daily-briefing | Automated morning briefing |
| #alerts | Anything that needs immediate attention |
Add channels only when a topic generates enough noise to warrant its own space.
Post a structured daily standup every morning:
*Daily Standup — Wednesday, Jan 15*
*Yesterday:*
• Revenue: $2,450 (forecast: $2,200, +11%)
• 87 transactions, avg ticket $28.16
• Vendor delivery received from Fresh Farms
*Today:*
• 3 deliveries scheduled (UPS, Fresh Farms, Packaging Co)
• 2 customer pickups
• Mike out — Sarah covering his shift
*Blockers:*
• Cooler #2 running warm (38°F, target 34°F) — monitoring
• Waiting on quote from new packaging vendor
*Action items:*
• [ ] Follow up with landlord re: lease renewal (Owner)
• [ ] Submit Q1 tax docs by Friday (Owner)
Post at shift change so the next crew knows what's happening:
*Shift Handoff — 3:00 PM*
*Completed:*
• Morning delivery received and checked in
• Inventory count done for deli case
• Customer order #4521 prepped and ready for pickup
*In progress:*
• Cooler reorganization (about 60% done)
*Needs attention:*
• Customer called about catering for Saturday — details in #orders
• Paper towel supply low — reorder needed
• Register 2 jamming on receipts (works if you open/close the paper door)
*Heads up:*
• Evening delivery from Sysco expected at 5pm
• VIP customer (Johnson) picking up at 6pm — special order in walk-in, labeled
Post alerts when metrics cross thresholds:
🚨 *Alert: Revenue significantly below forecast*
Today's revenue: $1,200 (forecast: $2,100)
Shortfall: -43%
Time: 4:30 PM
Possible causes to investigate:
• Weather impact? (check conditions)
• Foot traffic? (compare to normal)
• Missing transactions? (check POS)
📦 *Low Stock Alert*
The following items are below reorder point:
• Ground Beef (8 lbs remaining, reorder at 15)
• Chicken Breast (12 lbs remaining, reorder at 20)
Suggested: Place order with Fresh Farms by EOD for Thursday delivery.
Post a weekly summary every Friday afternoon or Monday morning:
*Weekly Recap — Week of Jan 13*
*Revenue:* $12,450 (target: $11,500, +8.3%)
*Best day:* Tuesday ($2,890)
*Transactions:* 423 total, avg ticket $29.43
*Highlights:*
• New catering client signed (Johnson Corp, $800/week)
• Google Ads ROAS improved to 3.2x (was 2.5x)
*Issues:*
• Cooler #2 still running warm — repair scheduled Monday
• 2 customer complaints (both resolved same-day)
*Next week:*
• Vendor price negotiation with Fresh Farms (Tuesday)
• Monthly inventory count (Thursday)
• Payroll deadline (Friday)
slack-directory — Look up user IDs for DMs and mentionsmorning-briefing — Post the daily briefing to #daily-briefinggmail — Forward important emails as Slack messagesgoogle-sheets — Pull KPI data for automated reportsgoogle-drive — Share Drive links in channelsautoresearch — Post overnight experiment resultsgoogle-ads — Post ad performance summaries#daily-briefing or #alerts rather than spraying every channel.| Endpoint | Method | What It Does |
|----------|--------|-------------|
| chat.postMessage | POST | Send a message |
| chat.update | POST | Edit a message |
| chat.delete | POST | Delete a message |
| conversations.list | GET | List channels |
| conversations.create | POST | Create a channel |
| conversations.invite | POST | Add someone to a channel |
| conversations.setTopic | POST | Set channel topic |
| conversations.setPurpose | POST | Set channel purpose |
| files.uploadV2 | POST | Upload a file |
| reactions.add | POST | Add an emoji reaction |
| users.list | GET | List users (see slack-directory) |
Full docs: api.slack.com/methods
slack-directory — User lookup and caching (prerequisite)google-chat — Alternative for Google Workspace teamsmorning-briefing — Daily digest that can post to Slacksecrets-manager — Secure token storageYour team channel is your operational heartbeat. Keep it structured and it keeps you informed.
tools
Generate and iteratively refine USPTO-style patent figure drawings from provisional patent application markdown files, using nano-banana for v1 generation and targeted single-fix edits for v2+ iteration.
data-ai
Weekly revenue / sales forecasting for small businesses with multiple locations or product lines. Blends recent trend + seasonal baseline + YoY growth with per-entity holiday multipliers and week-of-month adjustments. Ships autoresearch-compatible eval and parameters so you can tune it on your own historical data.
data-ai
Analyze email, calendar, and file patterns to discover repeatable workflows that AI agents can automate.
testing
Automated daily digest for small business owners. Combines email triage, calendar agenda, open tasks, and business KPIs into a single morning briefing. Composable — works with whatever data sources are available. Urgent emails require body inspection and explicit escalation signals — never classified from sender/timing metadata alone.