npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@mintmcp/slack-mcp-server

v0.1.1

Published

MCP server for interacting with Slack, with file upload and download tools

Readme

@mintmcp/slack-mcp-server

MCP Server for the Slack API, enabling LLM agents (Claude Desktop, Claude Code, Cursor, VS Code, etc.) to interact with Slack workspaces.

Tools

  1. slack_list_channels

    • List public or pre-defined channels in the workspace
    • Optional inputs:
      • limit (number, default: 100, max: 200): Maximum number of channels to return
      • cursor (string): Pagination cursor for next page
    • Returns: List of channels with their IDs and information
  2. slack_post_message

    • Post a new message to a Slack channel
    • Required inputs:
      • channel_id (string): The ID of the channel to post to
      • text (string): The message text to post
    • Returns: Message posting confirmation and timestamp
  3. slack_reply_to_thread

    • Reply to a specific message thread
    • Required inputs:
      • channel_id (string): The channel containing the thread
      • thread_ts (string): Timestamp of the parent message
      • text (string): The reply text
    • Returns: Reply confirmation and timestamp
  4. slack_add_reaction

    • Add an emoji reaction to a message
    • Required inputs:
      • channel_id (string): The channel containing the message
      • timestamp (string): Message timestamp to react to
      • reaction (string): Emoji name without colons
    • Returns: Reaction confirmation
  5. slack_get_channel_history

    • Get recent messages from a channel
    • Required inputs:
      • channel_id (string): The channel ID
    • Optional inputs:
      • limit (number, default: 10, max: 1000): Number of messages to retrieve
    • Returns: List of messages with their content and metadata
  6. slack_get_thread_replies

    • Get all replies in a message thread
    • Required inputs:
      • channel_id (string): The channel containing the thread
      • thread_ts (string): Timestamp of the parent message
    • Returns: List of replies with their content and metadata
  7. slack_get_users

    • Get list of workspace users with basic profile information
    • Optional inputs:
      • cursor (string): Pagination cursor for next page
      • limit (number, default: 100, max: 200): Maximum users to return
    • Returns: List of users with their basic profiles
  8. slack_get_user_profile

    • Get detailed profile information for a specific user
    • Required inputs:
      • user_id (string): The user's ID
    • Returns: Detailed user profile information
  9. slack_upload_file

    • Upload a local file to Slack using Slack's external-upload flow (the modern replacement for the deprecated files.upload)
    • Required inputs:
      • file_path (string): Absolute path to a local file on the machine running the MCP server. The calling agent is expected to have placed the file there (e.g. via Bash/Filesystem tools).
    • Optional inputs:
      • channel_id (string): Share the uploaded file to this channel. Omit to upload without sharing.
      • filename (string): Filename to present in Slack (defaults to the basename of file_path)
      • title (string): Title for the file in Slack
      • initial_comment (string): Message to post alongside the file when shared to a channel
      • thread_ts (string): Share the file into an existing thread
    • Returns: { ok, file_id, files, uploaded_bytes }
  10. slack_download_file

    • Download a Slack-hosted file by its file ID and write it to a local path
    • Required inputs:
      • file_id (string): The Slack file ID (starts with F)
      • output_path (string): Absolute local path to write the downloaded bytes to
    • Returns: { ok, file_id, output_path, bytes_written, name, mimetype }

Setup

  1. Create a Slack App:

    • Visit the Slack Apps page
    • Click "Create New App" → "From scratch"
    • Name your app and select your workspace
  2. Configure Bot Token Scopes: Navigate to "OAuth & Permissions" and add these scopes:

    • channels:history — View messages and other content in public channels
    • channels:read — View basic channel information
    • chat:write — Send messages as the app
    • reactions:write — Add emoji reactions to messages
    • users:read — View users and their basic information
    • users.profile:read — View detailed profiles about users
    • files:read — Read file metadata and download bytes (for slack_download_file)
    • files:write — Upload files (for slack_upload_file)
  3. Install the app to your workspace and save the "Bot User OAuth Token" that starts with xoxb-.

  4. Get your Team ID (starts with a T) — see Slack's docs.

  5. Invite the bot to any private channels it needs to access (/invite @your-bot).

Usage with Claude Desktop / Claude Code

Add to your claude_desktop_config.json (or equivalent MCP config):

NPX

{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": ["-y", "@mintmcp/slack-mcp-server"],
      "env": {
        "SLACK_BOT_TOKEN": "xoxb-your-bot-token",
        "SLACK_TEAM_ID": "T01234567",
        "SLACK_CHANNEL_IDS": "C01234567,C76543210"
      }
    }
  }
}

Docker

{
  "mcpServers": {
    "slack": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "SLACK_BOT_TOKEN",
        "-e", "SLACK_TEAM_ID",
        "-e", "SLACK_CHANNEL_IDS",
        "mintmcp/slack-mcp-server"
      ],
      "env": {
        "SLACK_BOT_TOKEN": "xoxb-your-bot-token",
        "SLACK_TEAM_ID": "T01234567",
        "SLACK_CHANNEL_IDS": "C01234567,C76543210"
      }
    }
  }
}

Environment Variables

  1. SLACK_BOT_TOKEN — Required. The Bot User OAuth Token starting with xoxb-.
  2. SLACK_TEAM_ID — Required. Your Slack workspace ID starting with T.
  3. SLACK_CHANNEL_IDS — Optional. Comma-separated list of channel IDs to limit slack_list_channels to (e.g. "C01234567,C76543210"). If not set, all public channels are listed.

File upload/download notes

  • slack_upload_file reads the file from the local filesystem of the MCP server process. The expectation is that the calling agent has shell/filesystem access and has already written the bytes to a path the server can read (e.g. /tmp/something.png). The server does not accept inline base64 data.
  • slack_download_file writes to the local filesystem of the MCP server process. Make sure output_path points to a directory the process can write to.
  • Both tools stream bytes to/from disk rather than buffering, so they handle large files without OOM.
  • Slack's external-upload flow first reserves a URL via files.getUploadURLExternal (POST), uploads the raw bytes to the returned upload_url as application/octet-stream, then finalizes via files.completeUploadExternal. All three calls are issued automatically; the tool surfaces any failure as an isError result.
  • Trust model: any caller of these tools can read or write any file the MCP server process can access. The server is intended for local stdio use where the calling agent already has filesystem access via its own tools (Bash, Filesystem, etc.), so a path allowlist here would not raise the security floor. Do not expose this server over a network without adding your own path-restriction layer.

Troubleshooting

If you encounter permission errors, verify that:

  1. All required scopes are added to your Slack app
  2. The app is properly installed (and re-installed after adding new scopes)
  3. The bot token and workspace ID are correctly set in env
  4. The bot has been added to the channels it needs to access

Build

npm install
npm run build

Docker:

docker build -t mintmcp/slack-mcp-server .

License

MIT — see LICENSE.