{"_id":"@algorhythma/slack-mcp-server","name":"@algorhythma/slack-mcp-server","dist-tags":{"latest":"3.0.0"},"versions":{"3.0.0":{"name":"@algorhythma/slack-mcp-server","version":"3.0.0","description":"MCP server for Slack — install-free via npx","type":"module","bin":{"slack-mcp-server":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/calebmwelsh/slack-mcp.git"},"bugs":{"url":"https://github.com/calebmwelsh/slack-mcp/issues"},"homepage":"https://github.com/calebmwelsh/slack-mcp#readme","scripts":{"build":"tsc","prepublishOnly":"npm run build","start":"node dist/index.js","test":"npm run build && node test/smoke.mjs","test:auth":"npm run build && node test/smoke-auth.mjs"},"engines":{"node":">=18"},"keywords":["mcp","slack","model-context-protocol","ai","claude"],"author":{"name":"Algorhythma"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.12.0","@slack/web-api":"^7.16.0"},"devDependencies":{"@types/node":"^20.0.0","typescript":"^5.4.0"},"_id":"@algorhythma/slack-mcp-server@3.0.0","gitHead":"881434d7f00db1bb88a6031c44d5d686f591e20b","_nodeVersion":"22.13.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-gxc2ZcWzx2GceJpPaEuNZN4ywMZ+OKTepK2qaq3uo55e8hld7DUgR1qkLuLUvmDPsRltHcOFOGKXtgQ0gxcgrw==","shasum":"1e1d7ffc1f5b6ecd069816ad3f0eeb3982839fec","tarball":"https://registry.npmjs.org/@algorhythma/slack-mcp-server/-/slack-mcp-server-3.0.0.tgz","fileCount":6,"unpackedSize":213913,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBg67v3JUi1Ha0Hy5ekvf4MFIbrjgNRlvy5Oyqhrmk8pAiEAtYdy/f/DrhdBdyadqbA0OyRIHy2OyTZb2MV2dT/gwlI="}]},"_npmUser":{"name":"algorhythma","email":"admin@algorhythma.com"},"directories":{},"maintainers":[{"name":"algorhythma","email":"admin@algorhythma.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/slack-mcp-server_3.0.0_1781529796316_0.28217163424778446"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-15T13:23:16.132Z","3.0.0":"2026-06-15T13:23:16.467Z","modified":"2026-06-15T13:23:16.721Z"},"maintainers":[{"name":"algorhythma","email":"admin@algorhythma.com"}],"description":"MCP server for Slack — install-free via npx","homepage":"https://github.com/calebmwelsh/slack-mcp#readme","keywords":["mcp","slack","model-context-protocol","ai","claude"],"repository":{"type":"git","url":"git+https://github.com/calebmwelsh/slack-mcp.git"},"author":{"name":"Algorhythma"},"bugs":{"url":"https://github.com/calebmwelsh/slack-mcp/issues"},"license":"MIT","readme":"# @algorhythma/slack-mcp-server\n\nFull-featured MCP server for Slack — **87 tools** across messaging, channels, files,\nsearch, users, app-manifest lifecycle, canvases, audit logs, and OAuth.\nNo installation required — run on demand with `npx`.\n\n## Quick start\n\nAdd to your Claude / MCP client config:\n\n```json\n\"slack\": {\n  \"command\": \"npx\",\n  \"args\": [\"-y\", \"@algorhythma/slack-mcp-server\"],\n  \"env\": {\n    \"SLACK_BOT_TOKEN\": \"xoxb-...\",\n    \"SLACK_USER_TOKEN\": \"xoxp-...\",\n    \"SLACK_CONFIG_TOKEN\": \"xoxe-1-...\"\n  }\n}\n```\n\nYou don't need all of these — **set at least one**, and each unlocks a different\ngroup of tools. A `SLACK_CONFIG_TOKEN` alone is enough to create and manage Slack\napps without first having a bot.\n\n### Tokens\n\n| Variable | Prefix | Unlocks |\n|---|---|---|\n| `SLACK_BOT_TOKEN` | `xoxb-` | Channels, messages, files, users, reactions, canvases — most operations |\n| `SLACK_USER_TOKEN` | `xoxp-` | Search, stars, reminders, DND, user status, DM unreads |\n| `SLACK_CONFIG_TOKEN` | `xoxe-1-` or `xoxe.xoxp-` | App Manifest API — create/update/delete Slack apps |\n| `SLACK_AUDIT_TOKEN` | `xoxp-` (with `auditlogs:read`) | Audit logs (Enterprise Grid only) |\n| `SLACK_APP_TOKEN` | `xapp-` | `slack_app_event_authorizations_list` only |\n\nNone are individually required, but **the server needs at least one of\n`SLACK_BOT_TOKEN`, `SLACK_USER_TOKEN`, or `SLACK_CONFIG_TOKEN`** to start.\n\n### Per-call tokens (multi-workspace)\n\nEvery tool also accepts its token as an **explicit argument**, which overrides the\nenvironment variable for that call. This lets one running server operate against\nmultiple workspaces:\n\n| Argument | Applies to | Overrides |\n|---|---|---|\n| `token` | bot tools | `SLACK_BOT_TOKEN` |\n| `user_token` | user-scoped tools | `SLACK_USER_TOKEN` |\n| `config_token` | app-manifest tools | `SLACK_CONFIG_TOKEN` |\n| `audit_token` | audit-log tools | `SLACK_AUDIT_TOKEN` |\n\nIf you only ever target one workspace, ignore these and use the env vars.\n\n### Config token rotation\n\n`SLACK_CONFIG_TOKEN` accepts either form Slack issues:\n\n- **`xoxe-1-` (refresh token, recommended)** — the server exchanges it for a\n  12-hour access token via `tooling.tokens.rotate` and renews automatically. Because\n  rotation consumes the refresh token, the replacement chain is persisted to\n  `~/.slack-mcp/config-tokens.json` so it survives restarts.\n- **`xoxe.xoxp-` (access token)** — used directly, but expires 12 hours after it was\n  generated, after which you must supply a fresh one.\n\n---\n\n## Tools\n\n### Channels & Conversations (16)\n\n| Tool | Description |\n|---|---|\n| `slack_list_channels` | List channels — filter by type (public, private, DM, MPIM) |\n| `slack_get_channel_info` | Get metadata for a channel |\n| `slack_create_channel` | Create a new public or private channel |\n| `slack_archive_channel` | Archive a channel |\n| `slack_unarchive_channel` | Unarchive a channel |\n| `slack_rename_channel` | Rename a channel |\n| `slack_set_channel_topic` | Set or update a channel's topic |\n| `slack_set_channel_purpose` | Set or update a channel's purpose |\n| `slack_invite_to_channel` | Invite one or more users to a channel |\n| `slack_remove_from_channel` | Remove a user from a channel |\n| `slack_join_channel` | Join a public channel |\n| `slack_leave_channel` | Leave a channel |\n| `slack_open_dm` | Open a DM channel with a user |\n| `slack_get_channel_members` | List members of a channel |\n| `slack_get_channel_history` | Fetch recent messages from a channel |\n| `slack_get_thread_replies` | Fetch all replies in a thread |\n\n### Messages (5)\n\n| Tool | Description |\n|---|---|\n| `slack_send_message` | Post a message (supports threads and reply_broadcast) |\n| `slack_send_ephemeral` | Post a message visible only to a specific user |\n| `slack_update_message` | Edit an existing message |\n| `slack_delete_message` | Delete a message |\n| `slack_get_permalink` | Get a shareable permanent link to a message |\n\n### Scheduled Messages (3)\n\n| Tool | Description |\n|---|---|\n| `slack_schedule_message` | Schedule a message for future delivery |\n| `slack_list_scheduled_messages` | List all pending scheduled messages |\n| `slack_delete_scheduled_message` | Cancel a scheduled message |\n\n### Reactions (2)\n\n| Tool | Description |\n|---|---|\n| `slack_add_reaction` | Add an emoji reaction to a message |\n| `slack_remove_reaction` | Remove an emoji reaction from a message |\n\n### Pins (3)\n\n| Tool | Description |\n|---|---|\n| `slack_pin_message` | Pin a message to a channel |\n| `slack_unpin_message` | Unpin a message |\n| `slack_list_pins` | List all pinned items in a channel |\n\n### Bookmarks (3)\n\n| Tool | Description |\n|---|---|\n| `slack_add_bookmark` | Add a bookmark to a channel |\n| `slack_list_bookmarks` | List bookmarks for a channel |\n| `slack_remove_bookmark` | Remove a bookmark |\n\n### Stars — legacy saved items (3) *(requires `SLACK_USER_TOKEN`)*\n\n| Tool | Description |\n|---|---|\n| `slack_add_star` | Star a message or file |\n| `slack_remove_star` | Unstar a message or file |\n| `slack_list_stars` | List starred items |\n\n### Files (4)\n\n| Tool | Description |\n|---|---|\n| `slack_upload_file` | Upload a text file and optionally share it to a channel |\n| `slack_get_file_info` | Get file metadata |\n| `slack_list_files` | List files in the workspace |\n| `slack_delete_file` | Delete a file |\n\n### Search (2) *(requires `SLACK_USER_TOKEN`)*\n\n| Tool | Description |\n|---|---|\n| `slack_search_messages` | Full-text search with operators: `in:#channel`, `from:@user`, `after:`, `before:` |\n| `slack_search_files` | Search for files |\n\n### Users (6)\n\n| Tool | Description |\n|---|---|\n| `slack_get_user_info` | Get profile info for a workspace member |\n| `slack_list_users` | List active workspace members |\n| `slack_lookup_user_by_email` | Find a user by email address |\n| `slack_get_user_presence` | Get presence status (active/away) |\n| `slack_set_user_status` | Set status emoji and text *(requires `SLACK_USER_TOKEN`)* |\n| `slack_get_user_profile` | Get full profile including custom fields |\n\n### User Groups (5)\n\n| Tool | Description |\n|---|---|\n| `slack_list_usergroups` | List all user groups |\n| `slack_create_usergroup` | Create a new user group |\n| `slack_update_usergroup` | Update a user group's name, handle, or description |\n| `slack_get_usergroup_members` | List members of a user group |\n| `slack_update_usergroup_members` | Replace the full membership list of a user group |\n\n### Reminders (5) *(require `SLACK_USER_TOKEN`)*\n\n| Tool | Description |\n|---|---|\n| `slack_add_reminder` | Create a reminder |\n| `slack_list_reminders` | List reminders |\n| `slack_get_reminder` | Get details for a reminder |\n| `slack_complete_reminder` | Mark a reminder as complete |\n| `slack_delete_reminder` | Delete a reminder |\n\n### Do Not Disturb (5)\n\n| Tool | Description |\n|---|---|\n| `slack_dnd_info` | Get DND status for a user |\n| `slack_dnd_set_snooze` | Enable DND snooze *(requires `SLACK_USER_TOKEN`)* |\n| `slack_dnd_end_snooze` | End active snooze *(requires `SLACK_USER_TOKEN`)* |\n| `slack_dnd_end_dnd` | End the DND period *(requires `SLACK_USER_TOKEN`)* |\n| `slack_dnd_team_info` | Get DND status for all workspace members |\n\n### Team & Workspace (3)\n\n| Tool | Description |\n|---|---|\n| `slack_get_team_info` | Get workspace/team information |\n| `slack_list_emoji` | List all custom emoji |\n| `slack_auth_test` | Test token and return identity (user, team, bot ID) |\n\n### App Manifest Management (5) *(require `SLACK_CONFIG_TOKEN`)*\n\n| Tool | Description |\n|---|---|\n| `slack_app_manifest_create` | Create a new Slack app from a manifest object |\n| `slack_app_manifest_export` | Export the manifest for an existing app |\n| `slack_app_manifest_update` | Update an existing app's manifest |\n| `slack_app_manifest_validate` | Validate a manifest without creating/updating |\n| `slack_app_manifest_delete` | Delete a Slack app (irreversible) |\n\n### App Discovery (4)\n\n| Tool | Description |\n|---|---|\n| `slack_list_apps` | List apps via workspace integration logs |\n| `slack_get_app_info` | Get info for a specific bot/app |\n| `slack_app_permissions_info` | Get permission scopes granted to the current app |\n| `slack_app_event_authorizations_list` | List workspaces/users that authorized events *(requires `SLACK_APP_TOKEN`)* |\n\n### Canvases (7)\n\n| Tool | Description |\n|---|---|\n| `slack_canvas_create` | Create a standalone canvas |\n| `slack_channel_canvas_create` | Create a canvas attached to a channel |\n| `slack_canvas_delete` | Delete a canvas |\n| `slack_canvas_edit` | Edit canvas content |\n| `slack_canvas_set_access` | Grant access to a canvas |\n| `slack_canvas_delete_access` | Revoke access to a canvas |\n| `slack_canvas_lookup_sections` | Look up sections within a canvas |\n\n### Conversation Utilities (2)\n\n| Tool | Description |\n|---|---|\n| `slack_mark_channel_read` | Mark a channel as read up to a timestamp |\n| `slack_get_unreads` | List channels with unread messages *(requires `SLACK_USER_TOKEN`)* |\n\n### Install & OAuth (2)\n\n| Tool | Description |\n|---|---|\n| `slack_generate_install_url` | Build an OAuth install URL for an app |\n| `slack_oauth_exchange` | Exchange an OAuth `code` for access tokens |\n\n> **Security:** `slack_oauth_exchange` returns raw secrets in its result — the bot\n> `access_token` (`xoxb-`) and, when user scopes were requested, the\n> `authed_user.access_token` (`xoxp-`). Treat the response as sensitive: store the\n> tokens in a secret manager, never log the raw values, and prefer passing them back\n> as per-call `token`/`user_token` arguments rather than committing them anywhere.\n\n### Audit Logs — Enterprise Grid (2) *(require `SLACK_AUDIT_TOKEN`)*\n\n| Tool | Description |\n|---|---|\n| `slack_audit_logs` | Query the audit logs API with filters |\n| `slack_audit_log_actions` | List the available audit log action types |\n\n---\n\n## Slack app setup\n\n### Bot Token Scopes\n\nGo to [api.slack.com/apps](https://api.slack.com/apps) → **OAuth & Permissions** → **Bot Token Scopes**:\n\n```\nbookmarks:read         bookmarks:write\ncanvases:read          canvases:write\nchannels:history       channels:join         channels:manage       channels:read\nchat:write             chat:write.customize  chat:write.public\nfiles:read             files:write\ngroups:history         groups:read           groups:write\nim:history             im:read               im:write\nmpim:history           mpim:read             mpim:write\npins:read              pins:write\nreactions:read         reactions:write\nteam:read\nusergroups:read        usergroups:write\nusers:read             users:read.email\n```\n\n> `slack_list_apps` additionally requires the `admin` scope (it reads `team.integrationLogs`); a plain bot token returns `missing_scope`.\n\n### User Token Scopes (optional — for search, stars, reminders, DND, status, unreads)\n\nAdd these under **User Token Scopes**:\n\n```\ndnd:read               dnd:write\nim:history             im:read\nmpim:history           mpim:read\nreminders:read         reminders:write\nsearch:read\nstars:read             stars:write\nusers.profile:write\n```\n\n> The `im:*`/`mpim:*` user scopes back `slack_get_unreads` (DM + group-DM unread counts).\n\n### App-Level Token (optional — for `slack_app_event_authorizations_list`)\n\n`slack_app_event_authorizations_list` needs an **app-level token** (`xapp-`) carrying the\n`authorizations:read` scope, supplied via `SLACK_APP_TOKEN`. Generate it under\n**Basic Information → App-Level Tokens** on your app's config page.\n\n### App Configuration Token (optional — for app manifest management)\n\nApp configuration tokens are tied to your Slack **account and workspace**, not to any\nspecific app — so you can create brand-new apps with one.\n\n1. Go to [api.slack.com/apps](https://api.slack.com/apps).\n2. Scroll to **Your App Configuration Tokens** and click **Generate Token**, then\n   pick the workspace.\n3. You'll get two values per workspace: a **Refresh Token** (`xoxe-1-`) and an\n   **Access Token** (`xoxe.xoxp-`). Use the **refresh token** for `SLACK_CONFIG_TOKEN`\n   — the server rotates it for you and you'll never have to refresh it manually.\n\n---\n\n## State & storage\n\nWhen given a `xoxe-1-` refresh token, the server persists the rotated token chain to\n`~/.slack-mcp/config-tokens.json` (keyed by a hash of the originally supplied token)\nso rotation survives restarts. No other state is written. Delete that file to reset.\n\n## Development\n\n```bash\nnpm install\nnpm run build      # TypeScript → dist/\nnpm start          # run locally (set env vars first)\n```\n\n## Publishing\n\n```bash\nnpm login --scope=@algorhythma\nnpm publish --access public\n```\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","_rev":"1-210ce48336d2a4c85854bb9c8b3bf3d0"}