# Slack (npm · @mindstone/mcp-server-slack)

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

- Trust score: 69/100 (medium)
- Change this week: +27
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-05

## Components

- npm · `@mindstone/mcp-server-slack`: 69/100 (this document), [markdown](https://verifymcp.io/servers/mindstone-mcp-server-slack/mindstone-mcp-server-slack.md), [page](https://verifymcp.io/servers/mindstone-mcp-server-slack/mindstone-mcp-server-slack)

## Channel facts

- Registry: `npm`
- Package: `@mindstone/mcp-server-slack`
- Version: `0.2.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-05.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (123 of 124), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (123 of 124), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 84/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to mindstone/mcp-servers).
  - License check failed: the license (FSL-1.1-MIT) isn't a recognized OSI-approved license.
  - Actively maintained (last published 5 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 41/100
  - 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 30/100
  - Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 85/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 56% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add mindstone-mcp-server-slack -- npx -y @mindstone/mcp-server-slack
```

### Codex

```bash
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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add mindstone-mcp-server-slack --command npx --arg -y --arg @mindstone/mcp-server-slack
```

### Hermes

```yaml
mcp_servers:
  mindstone-mcp-server-slack:
    command: "npx"
    args: ["-y", "@mindstone/mcp-server-slack"]
```

### Other

```json
{
  "mcpServers": {
    "mindstone-mcp-server-slack": {
      "command": "npx",
      "args": [
        "-y",
        "@mindstone/mcp-server-slack"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-04 (score 69, +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.

### 2026-08-02 (score 68, +51)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: mindstone/mcp-servers
- [functional regression] License: unverified → fail
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Stability: unverified → 0.20
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional] Licence: FSL-1.1-MIT

### 2026-07-31 (score 17, +11)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 6, −36)

- [security regression] Malware scan: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.1.6 → 0.2.0

### 2026-07-27 (score 42)

First indexed and scored.

## MCP tools (25)

### `authenticate_slack_workspace` (~129 tokens)

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)

### `list_slack_workspaces` (~93 tokens)

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.

### `search_slack_messages` (~159 tokens)

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.

Input parameters:

- `count` (integer)
- `page` (integer)
- `query` (string, required): Search query (supports Slack modifiers)
- `response_format` (string)
- `sort` (string)
- `sort_dir` (string)
- `to_me` (boolean)

### `get_slack_saved_messages` (~107 tokens)

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.

Input parameters:

- `count` (integer)
- `page` (integer)
- `query` (string)
- `response_format` (string)
- `sort` (string)
- `sort_dir` (string)

### `get_slack_message_by_link` (~173 tokens)

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).

Input parameters:

- `include_thread` (boolean)
- `url` (string, required): Slack message permalink URL

### `send_myself_a_note` (~111 tokens)

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.

Input parameters:

- `text` (string, required): Note text to send to yourself. Use the text parameter, not message or note.

### `compose_slack_message` (~159 tokens)

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.

Input parameters:

- `target` (string, required): Where to send — channel ID (e.g., C1234567890), #channel-name (e.g., #general), or a DM channel (D…)
- `text` (string, required): Message text (supports Slack markdown)

### `post_slack_message` (~228 tokens)

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.

Input parameters:

- `channel` (string, required): Channel target — channel ID (e.g., C1234567890) or #channel-name (e.g., #general)
- `intended_recipient` (string): For DMs only: expected recipient User ID. If the DM channel belongs to a different user, the message is NOT sent.
- `text` (string, required): Message text (supports Slack markdown)

### `reply_to_slack_thread` (~114 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `text` (string, required): Reply text
- `thread_ts` (string, required): Parent message timestamp — input key is thread_ts (not ts or timestamp). Use ts_slack value from get_slack_channel_history.

### `schedule_slack_message` (~103 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `post_at` (integer, required): Unix timestamp IN SECONDS (not ms) for when to post
- `text` (string, required): Message text (supports Slack markdown)

### `list_slack_channels` (~140 tokens)

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).

Input parameters:

- `channel_name` (string): Filter by name (case-insensitive partial match) — current page only
- `cursor` (string)
- `limit` (integer)
- `response_format` (string)
- `types` (string): public_channel,private_channel,mpim,im

### `get_slack_channel_history` (~176 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `cursor` (string)
- `limit` (integer)
- `response_format` (string)

### `create_slack_channel` (~72 tokens)

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.

Input parameters:

- `is_private` (boolean)
- `name` (string, required): Channel name (lowercase)

### `mark_slack_channel_as_read` (~132 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID (C... / D... for DMs) or #channel-name
- `includePrivate` (boolean)
- `include_private` (boolean)
- `ts` (string, required): Timestamp to mark as read up to — input key is ts (not thread_ts or timestamp). Use ts_slack from a message.

### `get_slack_unread_messages` (~105 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name. DMs require channel ID.
- `includePrivate` (boolean)
- `include_private` (boolean)
- `limit` (integer)

### `invite_user_to_channel` (~104 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `force` (boolean)
- `users` (string, required): User ID(s) — single ID or comma-separated list (max 1000)

### `get_slack_thread_replies` (~132 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `cursor` (string)
- `limit` (integer)
- `ts` (string, required): Parent message timestamp — input key is ts (not thread_ts or timestamp). Use ts_slack from get_slack_channel_history.

### `add_slack_reaction` (~130 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `name` (string, required): Emoji name without colons (e.g., thumbsup, heart, eyes)
- `timestamp` (string, required): Message timestamp to react to — input key is timestamp (not ts or thread_ts). Use ts_slack value from get_slack_channel_history.

### `list_slack_users` (~123 tokens)

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.

Input parameters:

- `cursor` (string)
- `limit` (integer)
- `name` (string): Filter 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_format` (string)

### `get_slack_user_profile` (~67 tokens)

Get detailed profile for a specific Slack user.

Get user ID from list_slack_users or from a message, or use @username format.

Input parameters:

- `user` (string, required): User ID (e.g., U1234567890) or @username (e.g., @john)

### `lookup_user_by_email` (~166 tokens)

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: "alice@company.com" }) → 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).

Input parameters:

- `email` (string, required): Email address to look up

### `open_slack_dm` (~221 tokens)

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: "alice@company.com" }) → get user.id
  2\. open_slack_dm({ user: "U1234567890" }) → get DM channel + verified recipient
  3\. post_slack_message({ channel: "D...", text: "...", intended_recipient: "U1234567890" })

Input parameters:

- `user` (string, required): Slack User ID (e.g., U1234567890 or W1234567890). Use lookup_user_by_email or list_slack_users to find the ID first.

### `download_slack_file` (~180 tokens)

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.

Input parameters:

- `file_id` (string): Slack file ID (e.g., "F0A8BFR53TP"). Get from get_slack_channel_history files[].id
- `file_url` (string): Slack file permalink URL (alternative to file_id; auto-extracts F... ID)
- `max_size_mb` (number)

### `add_slack_bookmark` (~98 tokens)

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.

Input parameters:

- `channel` (string, required): Channel — channel ID or #channel-name
- `emoji` (string): Optional emoji for the bookmark (e.g., :link:)
- `link` (string, required): URL to bookmark
- `title` (string, required): Bookmark title

### `add_slack_reminder` (~155 tokens)

[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".

Input parameters:

- `text` (string, required): Reminder text
- `time` (string, required): When to remind: Unix timestamp (seconds) or natural language ("in 2 hours", "tomorrow at 9am").
- `user` (string): User ID to remind (optional, defaults to yourself)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/mindstone-mcp-server-slack/mindstone-mcp-server-slack#diagnostics

## Score history

- 2026-08-05: 69
- 2026-08-04: 69
- 2026-08-03: 68
- 2026-08-02: 68
- 2026-08-01: 17
- 2026-07-31: 17
- 2026-07-30: 6
- 2026-07-28: 42
- 2026-07-27: 42

## Links

- npm package: https://www.npmjs.com/package/@mindstone/mcp-server-slack
- Socket report: https://socket.dev/npm/package/@mindstone/mcp-server-slack
- Repository: https://github.com/mindstone/mcp-servers
- Changelog RSS feed: https://verifymcp.io/servers/mindstone-mcp-server-slack/mindstone-mcp-server-slack/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/mindstone-mcp-server-slack/mindstone-mcp-server-slack/changelog.json
- HTML version of this page: https://verifymcp.io/servers/mindstone-mcp-server-slack/mindstone-mcp-server-slack
