{
  "slug": "com-pulsemcp-slack",
  "name": "com.pulsemcp/slack",
  "title": "slack",
  "description": "MCP server for Slack — read/write messages, manage threads, and react to messages.",
  "version": "0.0.7",
  "publishedAt": "2026-06-14T17:29:31.456649Z",
  "updatedAt": "2026-06-14T17:29:31.456649Z",
  "repoUrl": "https://github.com/pulsemcp/mcp-servers",
  "websiteUrl": null,
  "namespace": {
    "type": "domain",
    "owner": "pulsemcp.com"
  },
  "kind": "local",
  "packages": [
    {
      "registryType": "npm",
      "identifier": "slack-workspace-mcp-server",
      "version": "0.0.7",
      "transport": "stdio",
      "runtimeHint": "npx"
    }
  ],
  "remotes": [],
  "envVars": [
    {
      "name": "SLACK_BOT_TOKEN",
      "isSecret": true,
      "isRequired": true,
      "description": "Slack Bot User OAuth Token starting with xoxb-."
    },
    {
      "name": "ENABLED_TOOLGROUPS",
      "isSecret": false,
      "isRequired": false,
      "description": "Comma-separated list of tool groups to enable (readonly, write)."
    }
  ],
  "category": "communication",
  "subcategory": "chat",
  "company": "",
  "categoryAuto": true,
  "checks": [
    {
      "id": "source-linked",
      "label": "Source repository linked",
      "result": "pass",
      "detail": "https://github.com/pulsemcp/mcp-servers"
    },
    {
      "id": "version-pinned",
      "label": "Version pinned",
      "result": "pass",
      "detail": "Every package has an explicit version"
    },
    {
      "id": "secrets-requested",
      "label": "Secrets requested",
      "result": "info",
      "detail": "Asks for 1 secret: SLACK_BOT_TOKEN"
    },
    {
      "id": "known-registry",
      "label": "Known package registry",
      "result": "pass",
      "detail": "All packages come from npm, PyPI, OCI, NuGet or MCPB"
    },
    {
      "id": "namespace",
      "label": "Namespace ownership",
      "result": "info",
      "detail": "Name verified via domain pulsemcp.com"
    },
    {
      "id": "meta-text",
      "label": "Registry text aimed at the AI",
      "result": "pass",
      "detail": "Description and settings contain no hidden characters or instructions to the AI"
    },
    {
      "id": "install-scripts",
      "label": "Install scripts",
      "result": "pass",
      "detail": "slack-workspace-mcp-server@0.0.7 runs nothing at install"
    },
    {
      "id": "code-flags",
      "label": "Code red flags",
      "result": "pass",
      "detail": "Read 58 files in slack-workspace-mcp-server@0.0.7: no obfuscation, encoded execution, credential reads or data-collection endpoints found"
    },
    {
      "id": "ai-text",
      "label": "Text aimed at the AI",
      "result": "pass",
      "detail": "No hidden characters or instructions to the AI in 58 files, including comments and the README"
    }
  ],
  "scannedAt": "2026-10-29",
  "level": "Scanned",
  "install": [
    {
      "label": "Claude Desktop (npm)",
      "kind": "claude_desktop_json",
      "text": "{\n  \"mcpServers\": {\n    \"slack\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"slack-workspace-mcp-server@0.0.7\"\n      ],\n      \"env\": {\n        \"SLACK_BOT_TOKEN\": \"<your value>\"\n      }\n    }\n  }\n}"
    }
  ],
  "curated": true,
  "stars": 81,
  "archived": false,
  "pushedAt": "2026-10-09T17:32:15Z",
  "review": {
    "package": "slack-workspace-mcp-server",
    "version": "0.0.7",
    "at": "2026-10-31",
    "files": 56,
    "lines": 2796,
    "verdict": "pass-with-notes",
    "summary": "Lets an AI assistant read Slack channels and threads, download shared files, and post, edit, react and upload snippets as your Slack bot. It talks only to Slack, using the bot token you provide; there is no telemetry. Posting tools are on by default and send immediately, so set ENABLED_TOOLGROUPS=readonly if you only want reading.",
    "hosts": [
      {
        "host": "slack.com (https://slack.com/api/*)",
        "when": "Only when a tool is called",
        "sends": "Bot token (Authorization header), channel IDs, message text, reactions, snippet metadata; endpoints conversations.list/info/history/replies, chat.postMessage, chat.update, reactions.add, files.info, files.getUploadURLExternal, files.completeUploadExternal"
      },
      {
        "host": "files.slack.com (url_private / url_private_download returned by Slack files.info)",
        "when": "Only when slack_download_file is called",
        "sends": "Bot token in Authorization header to the download URL Slack returned"
      },
      {
        "host": "Slack presigned upload URL (upload_url returned by files.getUploadURLExternal)",
        "when": "Only when slack_upload_snippet is called",
        "sends": "Snippet content (no auth header)"
      }
    ],
    "env": [
      {
        "name": "SLACK_BOT_TOKEN",
        "sent_to": "slack.com API and Slack file download URLs (Bearer header)"
      },
      {
        "name": "ENABLED_TOOLGROUPS",
        "sent_to": "not sent; local config (readonly, write)"
      },
      {
        "name": "NODE_ENV / DEBUG",
        "sent_to": "not sent; enables debug logging to stderr"
      },
      {
        "name": "SLACK_MOCK_DATA",
        "sent_to": "not sent; only read by the test entry build/index.integration-with-mock.js"
      }
    ],
    "local": "Reads its own package.json at startup. slack_download_file writes downloaded Slack files to <OS temp>/slack-files/<fileId>-<sanitized name> (name sanitized to [a-zA-Z0-9._-], so no path traversal). No other file reads/writes.",
    "exec": "None. No child_process, eval or Function. Dynamic import() is only used for the package's own fixed relative modules (./slack-client/lib/*.js).",
    "telemetry": "None. No analytics or background network calls; nothing contacts the network at startup.",
    "tools": [
      "slack_get_channels",
      "slack_get_channel",
      "slack_get_thread",
      "slack_download_file",
      "slack_post_message",
      "slack_reply_to_thread",
      "slack_update_message",
      "slack_react_to_message",
      "slack_upload_snippet"
    ],
    "toolText": "clean",
    "deps": [
      "@modelcontextprotocol/sdk",
      "zod"
    ],
    "findings": [
      {
        "severity": "note",
        "at": "shared/tools.js:31-43",
        "what": "Write tools (post message, reply to thread with optional channel broadcast, edit message, add reaction, upload snippet) are enabled by default; they post as the bot immediately with no confirmation step. Set ENABLED_TOOLGROUPS=readonly to disable them. Descriptions state clearly that they post/edit."
      },
      {
        "severity": "info",
        "at": "shared/slack-client/lib/download-file.js:5-9",
        "what": "The bot token is sent to whatever url_private_download/url_private Slack's files.info returns, without checking the host. The URL comes from Slack's own API so this is expected, but there is no host allow-list."
      },
      {
        "severity": "info",
        "at": "shared/tools/download-file.js:61-66",
        "what": "Downloaded files are written to the OS temp directory and left there (no cleanup)."
      },
      {
        "severity": "info",
        "at": "shared/tools/get-channel.js:101; shared/tools/get-thread.js:87",
        "what": "Message text from Slack is returned verbatim to the AI; content written by other workspace members could contain prompt-injection text. Normal for chat readers, not a code defect."
      },
      {
        "severity": "info",
        "at": "(package)",
        "what": "package.json was not part of the review set; the dependency list is inferred from import statements, and install scripts (if any) could not be checked."
      }
    ]
  },
  "health": {
    "score": 67,
    "parts": {
      "popularity": 0.48169461913485706,
      "activity": 0.6674452394758004,
      "issues": 0.7096774193548387,
      "security": 1
    },
    "fail": 0,
    "warn": 0,
    "raw": {
      "stars": 81,
      "forks": 10,
      "downloads": 559,
      "hn": {
        "n": 0,
        "pts": 0,
        "t": []
      },
      "issuesOpen": 27,
      "issuesClosed": 66,
      "prsMerged": 491,
      "commits90": 1,
      "release": "2025-07-03T16:10:39Z",
      "pushed": "2026-10-09T17:32:15Z",
      "growth": null,
      "growthDays": null,
      "archived": false
    },
    "at": "2026-10-31T07:42:38.200Z"
  }
}
