| name | slack |
| description | Router + guardrails for Slack work — search, read, summarize, triage, draft replies, and send messages. Use whenever the user asks to do anything in Slack (read a channel, catch up, reply, post, react, find a message/person). Delegates to the specialized slack-* skills. |
| emoji | 💬 |
Slack
The entry point for Slack work. Route the request to the right specialized skill,
and apply the safety + output rules below on every Slack action.
Slack tools come from whichever backend is configured:
- Native MCP (
NOMOS_SLACK_BACKEND=mcp): Slack's official server, tools named
mcp__slack__* (search messages/files/users/channels/emoji, read channels &
threads, send message, add reactions, read/write canvases, fetch user info, list
members). Confirm exact names by listing tools if unsure.
- In-process (default):
slack_send_message, slack_read_channel,
slack_read_thread, slack_search, slack_list_channels, slack_user_info,
slack_react, slack_edit_message, slack_delete_message, slack_pin_message,
slack_upload_file.
Use the tools that are actually registered this session. If Slack tools ARE
present, they work immediately — just call them; never tell the user Slack is
"connecting", "loading", or "will be available in a moment". If NO Slack tools are
present, say Slack isn't connected (Settings → Slack, or nomos slack connect-mcp)
and stop — do not invent channel names, message contents, or workspace-wide claims.
Routing
- Summarize / "catch me up on" a channel → slack-channel-summarization
- "What happened across my channels today" / a standing digest → slack-daily-digest
- "What needs my attention" / prioritize mentions, threads, DMs → slack-notification-triage
- "Draft replies to what I'm behind on" → slack-reply-drafting
- Compose and send/post a specific message → slack-outgoing-message
- Analysis-only requests stay in chat unless the user asks to deliver to Slack.
Guardrails (apply to every Slack action)
Fail fast on missing coverage. If the connector can't reach a channel or the
needed scope is missing, say so plainly instead of guessing. Never fabricate
channels, users, message text, decisions, or approvals.
Write safety. Before posting, do a fresh read of the destination to resolve
relative targets ("reply to the last message", "in that thread"). Call out
high-impact actions explicitly (channel-wide @channel/@here, customer-facing
posts, DM fan-outs) and prefer a group DM over many individual DMs. An explicit
"post"/"send" bypasses drafting; otherwise draft for approval (respect the user's
message-consent settings).
Rate limits. Slack tools fall into three buckets — search, read, send/write.
On a 429, back off exponentially within that bucket (≈30s → 1m → 2m) rather than
retrying immediately or hammering a different method in the same bucket.
Unsupported actions. If a requested action isn't available (e.g. deleting
someone else's message, creating channels when the tool isn't present), refuse
briefly and offer the closest supported path.
Output standards
Match the surface. In chat: a short opener, a few tight bullets, and a clear ask.
For a Slack-bound message: match the channel's tone, use Slack mrkdwn (*bold*,
_italic_, `code`, <url|text>, <@U…>, <#C…>), and don't over-format.
Distinguish a private summary (for the user) from a post-ready Slack message.
Nomos extras
- IDs:
C/G = channel, D = DM, U/W = user; ts identifies a message
(threading, reactions, edits).
- Action items: when a Slack thread yields a promise or ask, capture it with
todo_add (direction mine = the user owes; theirs = someone owes the user),
setting source: "slack" and sourceRef to the thread ts.
- Listen as the user / background monitoring: nomos can respond as the user
(
nomos slack listen) and run periodic scans via the daemon + autonomous loops
(nomos cron enable slack-digest). Run these yourself with Bash when asked;
if blocked by a permission hook, show the exact command.