atris/skills/slack/SKILL.md
Slack integration via AtrisOS API. Read messages, send as yourself, search conversations, manage DMs. Use when user asks about Slack, messages, channels, or team communication.
npx skillsauth add atrislabs/atris 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.
Drop this in
~/.claude/skills/slack/SKILL.mdand Claude Code becomes your Slack assistant.
Before any Slack operation, run this bootstrap to ensure everything is set up:
#!/bin/bash
set -e
# 1. Check if atris CLI is installed
if ! command -v atris &> /dev/null; then
echo "Installing atris CLI..."
npm install -g atris
fi
# 2. Check if logged in to AtrisOS
if [ ! -f ~/.atris/credentials.json ]; then
echo "Not logged in to AtrisOS."
echo ""
echo "Option 1 (interactive): Run 'atris login' and follow prompts"
echo "Option 2 (non-interactive): Get token from https://atris.ai/auth/cli"
echo " Then run: atris login --token YOUR_TOKEN"
echo ""
exit 1
fi
# 3. Extract token
if command -v node &> /dev/null; then
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
elif command -v python3 &> /dev/null; then
TOKEN=$(python3 -c "import json,os; print(json.load(open(os.path.expanduser('~/.atris/credentials.json')))['token'])")
elif command -v jq &> /dev/null; then
TOKEN=$(jq -r '.token' ~/.atris/credentials.json)
else
echo "Error: Need node, python3, or jq to read credentials"
exit 1
fi
# 4. Check Slack connection status
STATUS=$(curl -s "https://api.atris.ai/api/integrations/slack/status" \
-H "Authorization: Bearer $TOKEN")
if echo "$STATUS" | grep -q "Token expired\|Not authenticated"; then
echo "Token expired. Please re-authenticate:"
echo " Run: atris login --force"
exit 1
fi
if command -v node &> /dev/null; then
CONNECTED=$(node -e "try{console.log(JSON.parse('$STATUS').connected||false)}catch(e){console.log(false)}")
elif command -v python3 &> /dev/null; then
CONNECTED=$(echo "$STATUS" | python3 -c "import sys,json; print(json.load(sys.stdin).get('connected', False))")
else
CONNECTED=$(echo "$STATUS" | jq -r '.connected // false')
fi
if [ "$CONNECTED" != "true" ] && [ "$CONNECTED" != "True" ]; then
echo "Slack not connected. Getting authorization URL..."
AUTH=$(curl -s -X POST "https://api.atris.ai/api/integrations/slack/start" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"personal"}')
if command -v node &> /dev/null; then
URL=$(node -e "try{console.log(JSON.parse('$AUTH').auth_url||'')}catch(e){console.log('')}")
elif command -v python3 &> /dev/null; then
URL=$(echo "$AUTH" | python3 -c "import sys,json; print(json.load(sys.stdin).get('auth_url', ''))")
else
URL=$(echo "$AUTH" | jq -r '.auth_url // empty')
fi
echo ""
echo "Open this URL to connect your Slack:"
echo "$URL"
echo ""
echo "After authorizing, run your command again."
exit 0
fi
echo "Ready. Slack is connected."
export ATRIS_TOKEN="$TOKEN"
Base: https://api.atris.ai/api/integrations
All requests require: -H "Authorization: Bearer $TOKEN"
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
These use your personal Slack token. Messages appear as YOU, not a bot.
curl -s "https://api.atris.ai/api/integrations/slack/me/channels" \
-H "Authorization: Bearer $TOKEN"
curl -s "https://api.atris.ai/api/integrations/slack/me/dms" \
-H "Authorization: Bearer $TOKEN"
curl -s "https://api.atris.ai/api/integrations/slack/me/messages/{channel_id}?limit=20" \
-H "Authorization: Bearer $TOKEN"
curl -s -X POST "https://api.atris.ai/api/integrations/slack/me/send" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0123CHANNEL",
"text": "Hey team, here is the update..."
}'
Reply in a thread:
curl -s -X POST "https://api.atris.ai/api/integrations/slack/me/send" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0123CHANNEL",
"text": "Following up on this...",
"thread_ts": "1234567890.123456"
}'
curl -s -X POST "https://api.atris.ai/api/integrations/slack/me/dm" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slack_user_id": "U0123USER",
"text": "Hey, quick question about the project..."
}'
curl -s "https://api.atris.ai/api/integrations/slack/me/search?q=quarterly+report&count=20" \
-H "Authorization: Bearer $TOKEN"
curl -s "https://api.atris.ai/api/integrations/slack/channels" \
-H "Authorization: Bearer $TOKEN"
curl -s "https://api.atris.ai/api/integrations/slack/users" \
-H "Authorization: Bearer $TOKEN"
curl -s "https://api.atris.ai/api/integrations/slack/users/search?q=justin" \
-H "Authorization: Bearer $TOKEN"
Searches by name, display name, or email. Much faster than pulling the full user list.
curl -s -X POST "https://api.atris.ai/api/integrations/slack/test-send" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"channel": "C0123CHANNEL",
"message": "Hello from Atris!"
}'
curl -s "https://api.atris.ai/api/integrations/slack/status" \
-H "Authorization: Bearer $TOKEN"
curl -s -X DELETE "https://api.atris.ai/api/integrations/slack" \
-H "Authorization: Bearer $TOKEN"
GET /slack/me/dmsGET /slack/me/messages/{channel_id}?limit=5GET /slack/usersGET /slack/users/search?q=NAMEPOST /slack/me/dm with {slack_user_id, text}GET /slack/me/channelsGET /slack/me/messages/{channel_id}POST /slack/me/send with {channel, text}GET /slack/me/search?q=XGET /slack/users/search?q=NAME (get user ID)GET /slack/me/dms (find DM channel with that user)GET /slack/me/messages/{channel_id}/slack/me/*) send messages as YOU, not a bot/slack/channels, /slack/test-send) use the bot tokenthread_ts to reply in a thread instead of creating a new messageU0123ABC. Get them from /slack/users endpointC0123ABC. Get them from /slack/me/channels| Error | Meaning | Solution |
|-------|---------|----------|
| Token expired | AtrisOS session expired | Run atris login |
| Slack not connected | OAuth not completed | Re-run bootstrap |
| Personal Slack not connected | No user token | Re-connect Slack (needs re-auth for personal access) |
| 401 Unauthorized | Invalid/expired token | Run atris login |
| channel_not_found | Invalid channel ID | Use /slack/me/channels to find correct ID |
| not_in_channel | User not in channel | Join the channel first |
~/.atris/credentials.json): Your AtrisOS auth token, stored locally.# Setup (one time)
npm install -g atris && atris login
# Get token
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
# Check connection
curl -s "https://api.atris.ai/api/integrations/slack/status" -H "Authorization: Bearer $TOKEN"
# List your DMs
curl -s "https://api.atris.ai/api/integrations/slack/me/dms" -H "Authorization: Bearer $TOKEN"
# Read messages
curl -s "https://api.atris.ai/api/integrations/slack/me/messages/CHANNEL_ID" -H "Authorization: Bearer $TOKEN"
# Send as yourself
curl -s -X POST "https://api.atris.ai/api/integrations/slack/me/send" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"channel":"C0123","text":"Hello!"}'
# DM someone as yourself
curl -s -X POST "https://api.atris.ai/api/integrations/slack/me/dm" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"user_id":"U0123","text":"Hey!"}'
# Search messages
curl -s "https://api.atris.ai/api/integrations/slack/me/search?q=project+update" -H "Authorization: Bearer $TOKEN"
# List workspace users
curl -s "https://api.atris.ai/api/integrations/slack/users" -H "Authorization: Bearer $TOKEN"
# Search users by name
curl -s "https://api.atris.ai/api/integrations/slack/users/search?q=justin" -H "Authorization: Bearer $TOKEN"
testing
Detects AI slop and fixes it, especially in memos, docs, READMEs, messages, PRDs, and other written output. Based on Wikipedia's AI Cleanup patterns plus memo-specific anti-slop rules. Triggers on "copy edit", "review writing", "humanize", "deslopper", "ai patterns", "make it sound human", "AI slop", "anti-slop", "memo".
tools
Use when an agent needs to inspect or send local macOS iMessage through Atris CLI. Triggers on iMessage, Messages.app, local text messages, chat.db, or texting someone from the user's Mac.
databases
Submit, list, resolve, close, or delete Atris customer feedback. Use when user types /feedback or asks to triage the feedback queue.
development
Fast research sweep — arxiv, semantic scholar, github, web. Finds papers, scores relevance, extracts actionable insights, stores to wiki. Triggers on: research search, find papers, latest research, arxiv, what's new in, sweep papers, research sweep.