Why does the agent claim a message was posted but nothing appears in the channel?
The silent failure of Slack automation, with two root causes. First: the bot was never invited — chat.postMessage returns not_in_channel, and several community servers map non-ok responses into a generic success object, so the agent reports victory into the void. Second: a blocks payload exceeding Slack limits (50 blocks, 3000 characters per text field) is rejected with invalid_blocks logged only to the server stderr, invisible to the agent. The engineering fix: invite the bot to every target channel, always populate the plain text field (Slack requires it as notification fallback anyway), and tail the MCP server logs during your first week of operation.
Bot token (xoxb) vs user token (xoxp) — does it matter?
Critically. A bot token acts as a distinct bot identity with a clean audit trail. A user token acts AS YOU — every agent message appears under your name, your account absorbs the rate-limit hits, and your compliance team loses the ability to distinguish human from machine action. Never hand an agent an xoxp token.
Can it read direct messages?
Only with im:history scope and only in DMs where the bot is a participant. Workspace-wide DM access is architecturally off-limits — this is a Slack platform constraint, not a server limitation.
How do rate limits affect agent loops?
chat.postMessage has a special limit of roughly one message per second per channel, plus workspace-wide Tier 2 caps. Bursts receive HTTP 429 with a Retry-After header. Instruct the agent to batch updates into single messages instead of streaming sentence-by-sentence.