The difference from a bot integration is the whole point: messages appear from you, and the token sees the public channels you see rather than only those a bot was invited into. That also draws the boundary — the scopes it asks for cover public channels, posting, reacting and reading profiles, so private channels and DMs are outside what it requests. A user OAuth token is a long-lived credential worth treating like a password, which the project says in as many words.
A Slack server that acts with your own user token: list public channels, read channel history and thread replies, post a message or a threaded reply, react with an emoji, and look up workspace members.
- slack_list_channels returns the workspace's public channels with their IDs, paginated by cursor
- slack_get_channel_history returns recent messages with their metadata, and slack_get_thread_replies returns a whole thread from its parent timestamp
- slack_post_message posts into a channel, and slack_reply_to_thread replies inside an existing thread rather than starting a new one
- slack_add_reaction adds an emoji reaction to a message identified by its timestamp
- slack_get_users lists workspace members with basic profiles, and slack_get_user_profile returns the full detail for one of them
- Everything is sent as you rather than as a bot, because the credential is a user token
A Slack app of your own, created from scratch and installed to the workspace, carrying the user token scopes channels:history, channels:read, chat:write, reactions:write and users:read. The resulting User OAuth Token — the one starting xoxp- — goes into SLACK_TOKEN. An organisation-level token additionally needs the team ID; an ordinary workspace token does not. Built from the repository and launched over stdio.
One command plus a key — npx -y @smithery/cli install @lars-hagen/slack-user-mcp --client claude, then supply credentials
