Slack messaging, channels, and notifications - send messages, manage channels, interact with users, upload files, and add reactions...
This skill provides Slack API operations with progressive disclosure for optimal context usage.
Context Savings: ~90% reduction
chat:write - Send messageschannels:read - List channelschannels:history - Read channel historyusers:read - List usersfiles:write - Upload filesreactions:write - Add reactionsSLACK_BOT_TOKEN environment variableThe skill provides 14 tools across 5 categories:
| Category | Tools | Confirmation Required |
|---|---|---|
| Messaging | post-message, post-thread, update-message, delete-message | Yes (all) |
| Channels | list-channels, get-channel, channel-history | No |
| Users | list-users, get-user, user-presence | No |
| Files | upload-file, list-files | Yes (upload only) |
| Reactions | add-reaction, get-reactions | No |
# Post message to channel
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channel": "C1234567890", "text": "Hello from Claude!"}'
# List channels
curl -X GET "https://slack.com/api/conversations.list" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
# Upload file
curl -X POST https://slack.com/api/files.upload \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-F "channels=C1234567890" \
-F "file=@report.pdf" \
-F "title=Weekly Report"
Send a message to a Slack channel.
Parameters:
channel (required): Channel ID or name (e.g., "C1234567890" or "#general")text (required): Message text (supports Slack markdown)thread_ts (optional): Parent message timestamp for threadingblocks (optional): Rich message blocks (JSON array)Example:
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C1234567890",
"text": "Deployment successful!",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Deployment Status*\n:white_check_mark: Production deployed successfully"
}
}
]
}'
Reply to a message in a thread.
Parameters:
channel (required): Channel IDthread_ts (required): Parent message timestamptext (required): Reply textExample:
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C1234567890",
"thread_ts": "1234567890.123456",
"text": "Thread reply here"
}'
Update an existing message.
Parameters:
channel (required): Channel IDts (required): Message timestamptext (required): New message textExample:
curl -X POST https://slack.com/api/chat.update \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C1234567890",
"ts": "1234567890.123456",
"text": "Updated message"
}'
Delete a message.
Parameters:
channel (required): Channel IDts (required): Message timestampExample:
curl -X POST https://slack.com/api/chat.delete \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C1234567890",
"ts": "1234567890.123456"
}'
List all channels in workspace.
Parameters:
types (optional): Comma-separated channel types (default: "public_channel")limit (optional): Max channels to return (default: 100)Example:
curl -X GET "https://slack.com/api/conversations.list?types=public_channel,private_channel" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Get channel information.
Parameters:
channel (required): Channel IDExample:
curl -X GET "https://slack.com/api/conversations.info?channel=C1234567890" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Get channel message history.
Parameters:
channel (required): Channel IDlimit (optional): Max messages to return (default: 100)oldest (optional): Start of time range (Unix timestamp)latest (optional): End of time range (Unix timestamp)Example:
curl -X GET "https://slack.com/api/conversations.history?channel=C1234567890&limit=50" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Security Note: Channel history may contain sensitive information. Use with caution.
List all users in workspace.
Parameters:
limit (optional): Max users to return (default: 100)Example:
curl -X GET "https://slack.com/api/users.list" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Get user profile information.
Parameters:
user (required): User IDExample:
curl -X GET "https://slack.com/api/users.info?user=U1234567890" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Get user online status.
Parameters:
user (required): User IDExample:
curl -X GET "https://slack.com/api/users.getPresence?user=U1234567890" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Upload a file to Slack channel.
Parameters:
channels (required): Comma-separated channel IDsfile (required): File path to uploadtitle (optional): File titleinitial_comment (optional): Message textExample:
curl -X POST https://slack.com/api/files.upload \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-F "channels=C1234567890" \
-F "file=@C:\reports\weekly.pdf" \
-F "title=Weekly Report" \
-F "initial_comment=Here is this week's report"
List files in channel.
Parameters:
channel (optional): Channel ID to filter byuser (optional): User ID to filter bycount (optional): Max files to return (default: 100)Example:
curl -X GET "https://slack.com/api/files.list?channel=C1234567890" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Add emoji reaction to a message.
Parameters:
channel (required): Channel IDtimestamp (required): Message timestampname (required): Emoji name (without colons, e.g., "thumbsup")Example:
curl -X POST https://slack.com/api/reactions.add \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C1234567890",
"timestamp": "1234567890.123456",
"name": "thumbsup"
}'
Get reactions on a message.
Parameters:
channel (required): Channel IDtimestamp (required): Message timestampExample:
curl -X GET "https://slack.com/api/reactions.get?channel=C1234567890×tamp=1234567890.123456" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
# Notify channel of successful deployment
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "#deployments",
"text": ":rocket: Production deployment completed",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Production Deployment*\n:white_check_mark: v1.2.3 deployed successfully\n*Duration:* 5m 23s"
}
}
]
}'
# Alert on-call team of incident
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "#incidents",
"text": "<!channel> :rotating_light: High severity incident detected",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Incident INC-1234*\n:rotating_light: *Severity:* P1\n*Service:* API Gateway\n*Status:* 503 errors increasing"
}
}
]
}'
# Post test results
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "#qa",
"text": "Test suite completed",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Test Results*\n:white_check_mark: 245 passed\n:x: 3 failed\n:warning: 2 skipped"
}
}
]
}'
| Error | Cause | Solution |
|---|---|---|
not_authed |
Missing or invalid token | Check SLACK_BOT_TOKEN is set correctly |
channel_not_found |
Invalid channel ID | Verify channel ID with list-channels |
missing_scope |
Bot lacks required permission | Add scope in Slack App settings |
rate_limited |
Too many requests | Implement exponential backoff |
message_not_found |
Invalid timestamp | Check message timestamp is correct |
For rate limiting errors, implement exponential backoff:
Slack API rate limits:
Methods by tier:
chat.postMessage: Tier 3 (50/min)conversations.list: Tier 2 (20/min)users.list: Tier 2 (20/min)files.upload: Tier 4 (100/min)Before starting:
Read .claude/context/memory/learnings.md
After completing:
.claude/context/memory/learnings.md.claude/context/memory/issues.md.claude/context/memory/decisions.mdASSUME INTERRUPTION: If it's not in memory, it didn't happen.