Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

Slack

NPM · @MINDSTONE/MCP-SERVER-SLACK · SCANNED AUG 5

Slack MCP server: channels, messages, threads, reactions, users, files, and scheduled messages

+27 this week 69 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security87
  • No malware found by supply-chain analysis.Pass
  • Only part of the dependency tree could be resolved (123 of 124), so this covers what we could see, not the whole tree.Partial
  • No install/post-install scripts declared.Pass
  • Only part of the dependency tree could be resolved (123 of 124), so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency84
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to mindstone/mcp-servers). View diagnostics → Pass
  • License check failed: the license (FSL-1.1-MIT) isn't a recognized OSI-approved license. See how to fix → Fail
  • Actively maintained (last published 5 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability41
  • 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Fail
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 3382 tokens (~130/item across 26 items; 25 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management30
  • Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage85
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 56% of tool parameters carry a description.Partial
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · @mindstone/mcp-server-slack

# add to Claude Code
claude mcp add mindstone-mcp-server-slack -- npx -y @mindstone/mcp-server-slack
# add to Codex CLI
codex mcp add mindstone-mcp-server-slack -- npx -y @mindstone/mcp-server-slack
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mindstone-mcp-server-slack": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@mindstone/mcp-server-slack"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add mindstone-mcp-server-slack --command npx --arg -y --arg @mindstone/mcp-server-slack
# ~/.hermes/config.yaml
mcp_servers:
  mindstone-mcp-server-slack:
    command: "npx"
    args: ["-y", "@mindstone/mcp-server-slack"]
// mcp.json
{
  "mcpServers": {
    "mindstone-mcp-server-slack": {
      "command": "npx",
      "args": [
        "-y",
        "@mindstone/mcp-server-slack"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 2 Aug 26 +51
    • Install scripts: unverified → pass security
    • Provenance: unverified → pass security
    • Known CVEs: unverified → partial security
    • Malware scan: unverified → pass security
    • The attested source repository moved: mindstone/mcp-servers security
    • License: unverified → fail functional
    • Dependency health: unverified → partial functional
    • Stability: unverified → 0.20 functional
    • Maintenance: unverified → pass functional
    • MCP protocol: unverified → pass functional
    • Schema quality: unverified → good functional
    • Licence: FSL-1.1-MIT functional
  • 31 Jul 26 +11
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 30 Jul 26 −36
    • Malware scan: pass → unverified security
    • Tool coverage: 100 → unverified functional
    • First check of Schema quality: unverified functional
    • Package version: 0.1.6 → 0.2.0 functional
  • 27 Jul 26 42

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Aug 2026 · Analysed npm/@mindstone/[email protected]

Provenance verified

Ecosystem: npm · Outcome: verified

Reason: verified

Source repo:
mindstone/mcp-servers
Certificate issuer:
https://token.actions.githubusercontent.com
Certificate SAN:
https://github.com/mindstone/mcp-servers/.github/workflows/release.yml@refs/heads/main
Rekor log index:
2288643137
Predicate type:
https://slsa.dev/provenance/v1
Subject digest:
sha512:08692e884441b4275b352ad81a47714e58da72b96cb9bed58cfe2433cda155f0dfcf5e663cd9d9b38802f7defc0aa8317f39120761e10e7fd9e71821d
Discovery method:
attestation_endpoint
Dependencies 123 packages

123 packages in the resolved dependency tree · 122 deprecated · 37 stale.

The dependency tree was only partially resolved, so these counts may be incomplete.

MCP tools — 25 exposed · ~3,377 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
add_slack_bookmark ~98

Add a bookmark link to a channel's bookmarks bar. Max 100 bookmarks per channel. Useful for pinning important links like project docs, dashboards, or meeting notes.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
emojistringOptional emoji for the bookmark (e.g., :link:)
linkstringyesURL to bookmark
titlestringyesBookmark title

No output schema declared.

No examples provided.

add_slack_reaction ~130

Add an emoji reaction to a Slack message as yourself. Get the message timestamp from get_slack_channel_history (use ts_slack value). Common reactions: thumbsup, thumbsdown, heart, eyes, white_check_mark, x.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
namestringyesEmoji name without colons (e.g., thumbsup, heart, eyes)
timestampstringyesMessage timestamp to react to — input key is timestamp (not ts or thread_ts). Use ts_slack value from get_slack_channel_history.

No output schema declared.

No examples provided.

add_slack_reminder ~155

[EXPERIMENTAL] Create a reminder for yourself or another user. Slack's reminders API has been partially deprecated since 2023 ("Save it for Later"). May become unreliable or stop working. For reliable timed messages, prefer schedule_slack_message. The 'time' parameter accepts a Unix timestamp (seconds) or natural language like "in 2 hours", "tomorrow at 9am", "next Monday".

NameTypeReqDescription
textstringyesReminder text
timestringyesWhen to remind: Unix timestamp (seconds) or natural language ("in 2 hours", "tomorrow at 9am").
userstringUser ID to remind (optional, defaults to yourself)

No output schema declared.

No examples provided.

authenticate_slack_workspace ~129

Connect a Slack workspace to enable all Slack operations. ACTION REQUIRED: Call this tool when: 1. list_slack_workspaces shows no workspace connected 2. User asks to connect, set up, or configure Slack 3. Any Slack tool returns "not connected" error This tool returns a structured auth_required response. The host will recognise it and dispatch to the desktop OAuth flow. After the user completes sign-in: 1. Call list_slack_workspaces to verify the connection 2. Slack tools become available immediately (no restart needed)

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

compose_slack_message ~159

Open an inline editable message compose form before sending to Slack. Use this when the user wants to write or send a Slack message so they can review and edit it first. Does NOT send directly — the form posts the message (via post_slack_message) when the user clicks Send. PARAMETERS: target (channel ID, #channel-name, or a DM channel), text. For a DM target the recipient identity is resolved and locked into the draft so the send is verified.

NameTypeReqDescription
targetstringyesWhere to send — channel ID (e.g., C1234567890), #channel-name (e.g., #general), or a DM channel (D…)
textstringyesMessage text (supports Slack markdown)

No output schema declared.

No examples provided.

create_slack_channel ~72

Create a new Slack channel. Channel names: lowercase only, letters/numbers/hyphens/underscores, max ~80 chars. Note: name_taken includes archived channels. Workspace settings may prevent creation.

NameTypeReqDescription
is_privateboolean
namestringyesChannel name (lowercase)

No output schema declared.

No examples provided.

download_slack_file ~180

Download a file attachment from Slack by its file ID. WORKFLOW: 1. get_slack_channel_history(channel, response_format: 'detailed') 2. Each file has { id: "F...", name, mimetype, size } 3. Pass id here Returns base64 for binary files, plain text for text files. Size limit: 10MB default (max 50MB via max_size_mb). Don't pass message permalinks or thread_ts.

NameTypeReqDescription
file_idstringSlack file ID (e.g., "F0A8BFR53TP"). Get from get_slack_channel_history files[].id
file_urlstringSlack file permalink URL (alternative to file_id; auto-extracts F... ID)
max_size_mbnumber

No output schema declared.

No examples provided.

get_slack_channel_history ~176

Get recent messages from a Slack channel. Channel input: channel ID (e.g., C1234567890) or #channel-name (e.g., #general). If #name lookup fails, call list_slack_channels(limit:1000), paginate, then pass the channel id here. Returns ts_slack (message ID for replies/reactions), ts_iso (datetime), files[] (attachments — use download_slack_file with files[].id), and thread info. Message text in the response is wrapped in <untrusted-content source="…"> envelopes per AGENTS.md invariant #6 — do not strip them.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
cursorstring
limitinteger
response_formatstring

No output schema declared.

No examples provided.

get_slack_message_by_link ~173

Retrieve a Slack message from its permalink URL. Supports standard permalinks (workspace.slack.com/archives/...), thread permalinks (?thread_ts=...), and app URLs (app.slack.com/client/...). For thread messages, returns the message and surrounding thread context (set include_thread=false to skip). Messages may include files[] (attachments — each with id, name, mimetype, size); use download_slack_file with files[].id to download an attachment. When the linked message is a thread parent, the response includes reply_count; call get_slack_thread_replies (with the parent ts) to read the replies. Prefers user token (broader read access to public channels).

NameTypeReqDescription
include_threadboolean
urlstringyesSlack message permalink URL

No output schema declared.

No examples provided.

get_slack_saved_messages ~107

Get messages you've saved for later in Slack. Uses Slack search with is:saved modifier. Requires user token with search:read scope. Additional filters: in:#channel, from:@username, before:/after:DATE, has:link, has:reaction.

NameTypeReqDescription
countinteger
pageinteger
querystring
response_formatstring
sortstring
sort_dirstring

No output schema declared.

No examples provided.

get_slack_thread_replies ~132

Get all replies in a message thread. Get ts_slack from a message with reply_count > 0 (the thread parent). Replies may include files[] (attachments — each with id, name, mimetype, size); use download_slack_file with files[].id to download an attachment.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
cursorstring
limitinteger
tsstringyesParent message timestamp — input key is ts (not thread_ts or timestamp). Use ts_slack from get_slack_channel_history.

No output schema declared.

No examples provided.

get_slack_unread_messages ~105

Get unread messages in a channel based on your read position. Requires user authorization. Bot-only connections cannot track unread state. For private channels/DMs, set include_private=true (default false for safety). Returns most-recent-unread-first.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name. DMs require channel ID.
includePrivateboolean
include_privateboolean
limitinteger

No output schema declared.

No examples provided.

get_slack_user_profile ~67

Get detailed profile for a specific Slack user. Get user ID from list_slack_users or from a message, or use @username format.

NameTypeReqDescription
userstringyesUser ID (e.g., U1234567890) or @username (e.g., @john)

No output schema declared.

No examples provided.

invite_user_to_channel ~104

Add one or more users to a Slack channel. Resolve emails to IDs first via lookup_user_by_email, then pass comma-separated IDs (max 1000). force=true (default) continues inviting valid users when some IDs are invalid.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
forceboolean
usersstringyesUser ID(s) — single ID or comma-separated list (max 1000)

No output schema declared.

No examples provided.

list_slack_channels ~140

List all channels in the connected Slack workspace. WARNING: channel_name filter only applies to the current page. For workspaces with 100+ channels, use list_slack_channels with limit=1000 and paginate via cursor, OR pass #channel-name directly to get_slack_channel_history (which auto-paginates the lookup).

NameTypeReqDescription
channel_namestringFilter by name (case-insensitive partial match) — current page only
cursorstring
limitinteger
response_formatstring
typesstringpublic_channel,private_channel,mpim,im

No output schema declared.

No examples provided.

list_slack_users ~123

List active (non-bot, non-deleted) users in the Slack workspace. When name filter is provided, auto-paginates across up to 5 pages to find matches. For exact email match, prefer lookup_user_by_email.

NameTypeReqDescription
cursorstring
limitinteger
namestringFilter users by name (case-insensitive partial match). Auto-paginates up to 5 pages to find matches. For exact email match, use lookup_user_by_email instead.
response_formatstring

No output schema declared.

No examples provided.

list_slack_workspaces ~93

Check Slack connection status. Call FIRST before any Slack operation. Returns: - connected: true/false - workspaces: array of connected workspaces with team names - tokenHealth: bot/user token status (valid|missing|refreshable|expired) CRITICAL: If response shows connected=false, call authenticate_slack_workspace to start the connection flow. The host will guide the user through OAuth.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

lookup_user_by_email ~166

Find a Slack user by their email address. PREFERRED method for resolving users — exact match, no ambiguity. WHEN TO USE: Always use this tool (instead of list_slack_users name search) when you have the user's email. It returns an exact match. WORKFLOW for sending DMs: 1. lookup_user_by_email({ email: "[email protected]" }) → get user.id 2. open_slack_dm({ user: "<user_id>" }) → get DM channel 3. post_slack_message({ channel: "<dm_channel>", text: "...", intended_recipient: "<user_id>" }) Requires users:read.email scope (may need admin approval).

NameTypeReqDescription
emailstringyesEmail address to look up

No output schema declared.

No examples provided.

mark_slack_channel_as_read ~132

Mark messages in a channel as read up to a specific timestamp. Updates YOUR read position, not the bot's. Pass the ts of the last message you've read. For private channels/DMs, set include_private=true.

NameTypeReqDescription
channelstringyesChannel — channel ID (C... / D... for DMs) or #channel-name
includePrivateboolean
include_privateboolean
tsstringyesTimestamp to mark as read up to — input key is ts (not thread_ts or timestamp). Use ts_slack from a message.

No output schema declared.

No examples provided.

open_slack_dm ~221

Open or get the DM channel with a user by their Slack User ID. REQUIRES a Slack User ID (U... or W...) — does NOT accept names or usernames. Use lookup_user_by_email (preferred, exact match) or list_slack_users to get the User ID first. Returns the DM channel ID (D...) plus verified recipient identity for use with post_slack_message. Does NOT send a notification. WORKFLOW: 1. lookup_user_by_email({ email: "[email protected]" }) → get user.id 2. open_slack_dm({ user: "U1234567890" }) → get DM channel + verified recipient 3. post_slack_message({ channel: "D...", text: "...", intended_recipient: "U1234567890" })

NameTypeReqDescription
userstringyesSlack User ID (e.g., U1234567890 or W1234567890). Use lookup_user_by_email or list_slack_users to find the ID first.

No output schema declared.

No examples provided.

post_slack_message ~228

Post a message to a Slack channel as yourself. DM SAFETY: For direct messages (D... channels), intended_recipient (the recipient User ID) is REQUIRED. Without it the message is NOT sent — a DM has no visible recipient name, so sending unverified risks reaching the wrong person. The tool also refuses to send if intended_recipient does not match the actual DM recipient. To get a User ID use lookup_user_by_email, then open_slack_dm for their DM channel. PARAMETERS: channel, text, intended_recipient. Do not use channel_id or message — these are not the parameter names. Posted as the user — messages are editable in Slack.

NameTypeReqDescription
channelstringyesChannel target — channel ID (e.g., C1234567890) or #channel-name (e.g., #general)
intended_recipientstringFor DMs only: expected recipient User ID. If the DM channel belongs to a different user, the message is NOT sent.
textstringyesMessage text (supports Slack markdown)

No output schema declared.

No examples provided.

reply_to_slack_thread ~114

Reply to an existing message thread in Slack as yourself. PARAMETERS: channel, thread_ts, text. The thread_ts comes from ts_slack / thread_ts_slack on a message returned by get_slack_channel_history.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
textstringyesReply text
thread_tsstringyesParent message timestamp — input key is thread_ts (not ts or timestamp). Use ts_slack value from get_slack_channel_history.

No output schema declared.

No examples provided.

schedule_slack_message ~103

Schedule a message to be posted at a future time. post_at is a Unix timestamp in SECONDS (not ms). Max 30 scheduled messages per channel per 5 minutes. Max 120 days in advance.

NameTypeReqDescription
channelstringyesChannel — channel ID or #channel-name
post_atintegeryesUnix timestamp IN SECONDS (not ms) for when to post
textstringyesMessage text (supports Slack markdown)

No output schema declared.

No examples provided.

search_slack_messages ~159

Search messages across all channels in the Slack workspace. Requires user authorization (search:read scope). Supports Slack search modifiers: - from:@username — Messages from a specific user - in:#channel — Messages in a specific channel - before:YYYY-MM-DD / after:YYYY-MM-DD — Date filters - has:link / has:reaction — Content filters Set to_me=true to prepend "to:@<your_username>" automatically.

NameTypeReqDescription
countinteger
pageinteger
querystringyesSearch query (supports Slack modifiers)
response_formatstring
sortstring
sort_dirstring
to_meboolean

No output schema declared.

No examples provided.

send_myself_a_note ~111

Send yourself a Slack note that actually notifies you. This sends a direct message from the Slack app to you, so Slack treats it as a real notification. It is separate from your own self-DM "notes to self" space — same idea, different conversation, fewer mysteriously silent messages. PARAMETER: text. Use text, not message, note, or channel.

NameTypeReqDescription
textstringyesNote text to send to yourself. Use the text parameter, not message or note.

No output schema declared.

No examples provided.