Skip to main content
Glama

nomos-slack-mcp

An MCP server that lets AI agents read and write Slack messages as you — not as a bot. Messages, reactions, and status updates appear exactly as if you typed them yourself.

Built for Claude Code and any MCP-compatible client. Supports multiple Slack workspaces with independent authentication.

Why?

Existing Slack integrations send messages as a bot with an APP badge. This uses Slack user tokens (xoxp-) so your agent operates as you — indistinguishable from you being at the keyboard.

Related MCP server: slack-fast-mcp

Features

  • Send as you — no bot badge, no "APP" indicator

  • Multi-workspace — manage 2+ Slack workspaces with separate tokens and permissions

  • 10 tools — read, write, search, react, set status

  • Smart resolution — use #channel-name, @username, or raw channel IDs

  • Local only — tokens stay on your machine at ~/.nomos/slack/config.json with 0600 permissions

Quick Start

1. Create a Slack App

For each workspace you want to connect:

  1. Go to api.slack.com/appsCreate New AppFrom app manifest

  2. Paste the contents of slack-app-manifest.yml (or use the JSON version)

  3. Click Create

  4. Go to Install AppInstall to WorkspaceAllow

TIP

The manifest pre-configures all required User Token Scopes and the OAuth redirect URL. No manual scope configuration needed.

2. Install

git clone https://github.com/project-nomos/nomos-slack-mcp.git
cd nomos-slack-mcp
pnpm install
pnpm build

3. Add Your Workspaces

Option A: OAuth flow (recommended)

pnpm add-workspace

You'll be prompted for:

  • A workspace alias (e.g. work, side-project)

  • Your Slack App's Client ID and Client Secret (found under Basic Information in your Slack App settings)

The script opens your browser for OAuth authorization and stores the user token automatically.

Option B: Manual token

pnpm add-workspace -- --manual

Paste your xoxp- token directly. Find it in your Slack App under OAuth & PermissionsUser OAuth Token.

Repeat for each workspace.

4. Connect to Claude Code

claude mcp add nomos-slack -- node /path/to/nomos-slack-mcp/dist/src/index.js

Or add to your MCP config manually:

{
  "mcpServers": {
    "nomos-slack": {
      "command": "node",
      "args": ["/path/to/nomos-slack-mcp/dist/src/index.js"]
    }
  }
}

Tools

Tool

Description

slack_list_workspaces

List configured workspaces and which is default

slack_list_channels

Browse channels, DMs, groups — filter by type or name

slack_read_messages

Read recent messages from any channel or DM

slack_read_thread

Read all replies in a thread

slack_send_message

Send a message as you

slack_reply_thread

Reply in a thread as you

slack_search

Search messages with Slack operators (from:, in:, before:, etc.)

slack_list_users

List or search workspace members

slack_set_status

Set your status emoji and text

slack_react

Add a reaction to a message

Channel Resolution

All tools that accept a channel parameter understand:

  • #general — public/private channel by name

  • @john — opens a DM with that user

  • C0123ABCDEF — raw Slack channel ID

Multi-Workspace

Every tool accepts an optional workspace parameter. Omit it to use your default workspace.

"Read my DMs in the side-project workspace"
→ slack_read_messages({ workspace: "side-project", channel: "@alice" })

Configuration

Config is stored at ~/.nomos/slack/config.json:

{
  "workspaces": {
    "work": {
      "token": "xoxp-...",
      "teamId": "T01ABC123",
      "teamName": "Acme Corp",
      "userId": "U01XYZ789",
      "addedAt": "2026-03-26T10:00:00Z"
    },
    "side-project": {
      "token": "xoxp-...",
      "teamId": "T02DEF456",
      "teamName": "Side Project",
      "userId": "U02UVW012",
      "addedAt": "2026-03-26T11:00:00Z"
    }
  },
  "defaultWorkspace": "work"
}

File permissions are set to 0600 (owner read/write only).

Required Slack Scopes

All scopes are User Token Scopes (not Bot Token Scopes). The included app manifest configures these automatically.

Scope

Purpose

channels:history

Read messages in public channels

channels:read

List public channels

groups:history

Read messages in private channels

groups:read

List private channels

im:history

Read direct messages

im:read

List direct messages

mpim:history

Read group DMs

mpim:read

List group DMs

chat:write

Send messages as you

users:read

List workspace members

users:read.email

See member emails

search:read

Search messages

users.profile:write

Set your status

reactions:write

Add reactions

reactions:read

Read reactions

Development

# Install dependencies
npm install

# Build
npm run build

# Type-check without emitting
pnpm check

# Watch mode
pnpm dev

Project Structure

src/
├── index.ts                 # MCP server entry point (stdio transport)
├── config/
│   ├── config-manager.ts    # Read/write ~/.nomos/slack/config.json
│   └── types.ts             # TypeScript interfaces
├── slack/
│   ├── client-manager.ts    # Per-workspace WebClient instances + channel/user resolution
│   └── formatters.ts        # Format Slack API responses for LLM consumption
├── tools/
│   ├── index.ts             # Tool registry
│   ├── list-workspaces.ts
│   ├── list-channels.ts
│   ├── read-messages.ts
│   ├── read-thread.ts
│   ├── send-message.ts
│   ├── reply-thread.ts
│   ├── search.ts
│   ├── list-users.ts
│   ├── set-status.ts
│   └── react.ts
├── oauth/
│   ├── flow.ts              # OAuth 2.0 token exchange
│   └── server.ts            # Local callback server for OAuth
scripts/
└── add-workspace.ts         # CLI for adding workspaces

Security

  • Tokens are stored locally at ~/.nomos/slack/config.json with 0600 file permissions

  • User tokens (xoxp-) are sensitive — they can act as you. Treat them like passwords

  • No data leaves your machine except Slack API calls and whatever you send to your LLM provider as context

  • Bot tokens are rejected — the config manager validates that tokens start with xoxp-

Troubleshooting

"No workspaces configured" Run pnpm add-workspace to add a workspace.

"Token must be a user token (xoxp-...)" You're using a bot token (xoxb-). Go to your Slack App → OAuth & Permissions → copy the User OAuth Token, not the Bot User OAuth Token.

"Channel #foo not found" The user token can only see channels you've joined. Join the channel in Slack first.

"missing_scope" errors Your Slack App is missing required scopes. Re-create the app using the provided manifest or manually add the missing scope under OAuth & Permissions → User Token Scopes, then reinstall the app.

Rate limiting The Slack SDK handles 429 responses with automatic retry. If you hit persistent rate limits, reduce the frequency of requests. History endpoints are Tier 2 (~20 req/min), most others are Tier 3 (~50 req/min).

License

MIT

Available Tools

10 tools
slack_list_channelsC

List Slack channels, DMs, and group chats in a workspace. Filter by type or search by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by channel type. Defaults to 'all'.
limitNoMax channels to return (default 50).
queryNoFilter channels whose name or purpose contains this string.
workspaceNoWorkspace alias. Omit to use default.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the behavioral burden, but it only states the high-level action and filtering options. It does not disclose pagination behavior, the meaning of the default limit, whether archived channels are included, or what the return structure looks like. The read-only nature is implied but never explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the primary action and resource. The second sentence efficiently summarizes the filtering and search capabilities. No redundant wording is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description and schema together cover the basic input contract, but there is no output schema and the description does not explain return format, default behavior when workspace is omitted, or how results are ordered/paginated. For a simple list tool, this is adequate but leaves some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters with defaults and descriptions. The description adds only a generic mention of type filtering and name search, which partially mirrors the type and query parameters but does not add meaningful detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific action ('List') on a specific resource ('Slack channels, DMs, and group chats') and notes the filtering/search capabilities. It is clear enough to distinguish from siblings like slack_send_message and slack_read_messages, though it does not explicitly name any sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for listing and filtering channels but gives no explicit guidance on when to use it versus slack_search, slack_list_users, or slack_list_workspaces. No exclusions or alternative recommendations are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_list_usersA

List users in a Slack workspace. Optionally filter by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax users to return (default 50).
queryNoFilter users whose display name or real name contains this string.
workspaceNoWorkspace alias. Omit to use default.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. The verb 'List' clearly signals a read-only operation and the optional filter adds useful behavior, but pagination behavior, default workspace selection, and any auth/rate concerns are not disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no fluff. The main verb and object are front-loaded, and the optional filtering behavior is stated economically. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with no required parameters and a fully documented schema, this description is nearly sufficient. It lacks an explicit return-format or pagination note and does not mention that workspace defaults to the default workspace, but the schema covers the invocation parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with limit, query, and workspace all documented, including the default for limit and the matching rule for query. The description adds no meaning beyond the schema; 'filter by name' is actually less precise than the schema's display-name/real-name detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List users in a Slack workspace.' It also adds a distinct behavior, 'Optionally filter by name,' which clearly separates it from sibling listing tools such as slack_list_channels and slack_list_workspaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrasing implies this tool is for retrieving Slack users, but it provides no explicit when-to-use guidance and does not reference alternatives. An agent must infer that this is the user-listing tool rather than channels/workspaces/search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_list_workspacesA

List all configured Slack workspaces. Shows workspace aliases, team names, and which one is the default.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. 'List all configured' conveys a read-only operation and the scope, while the second sentence discloses exactly what information is returned. It does not mention authentication or failure modes, but these are minor for a zero-parameter listing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, purposeful sentences. The primary action is front-loaded, and the second sentence adds valuable output details without any filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, parameterless listing tool, the description is fully complete. It states what the tool lists, the scope of that listing, and the specific fields an agent can expect in the response, compensating for the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to explain parameter meaning, and the input schema already documents everything vacuously. There is no ambiguity for an agent selecting or invoking the tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('configured Slack workspaces'), and explicitly names the output fields: aliases, team names, and the default workspace. This clearly distinguishes it from sibling tools like slack_list_channels or slack_list_users, which operate on different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is clear: call this tool when you need to discover the set of configured Slack workspaces and their identifiers. It does not explicitly name alternatives or exclusions, but the resource-focused wording makes the appropriate context obvious, and there are no closely overlapping siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_reactA

Add a reaction (emoji) to a Slack message. The reaction appears as if you added it.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesChannel containing the message (#name, @user, or ID).
reactionYesEmoji name without colons (e.g. 'thumbsup', 'eyes', 'white_check_mark').
timestampYesTimestamp (ts) of the message to react to.
workspaceNoWorkspace alias. Omit to use default.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the behavioral disclosure burden. 'The reaction appears as if you added it' provides useful identity/actor context beyond the schema. However, it does not mention potential side effects, failure conditions, or whether reactions are idempotent, so some transparency gaps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, direct sentences with no filler. The core action is front-loaded, and the extra sentence about appearance adds meaningful behavioral context rather than redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with all parameters documented in the schema and no nested structures or enums, the description is mostly sufficient. The only minor gap is not describing the expected return value or error behavior, since there is no output schema to convey that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the schema. The description adds no additional parameter-level meaning beyond what the schema provides, which matches the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Add'), a specific resource ('reaction to a Slack message'), and the emoji context. Among the sibling slack_* tools, this is the only reaction-focused tool, so it is clearly distinguishable without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: whenever an emoji reaction needs to be added to a Slack message. It does not explicitly discuss exclusions or alternatives, so it falls just short of the top score, but the intended usage context is unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_read_messagesA

Read recent messages from a Slack channel, DM, or group chat. Supports #channel-name, @username, or channel ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOnly messages after this Slack timestamp (ts).
limitNoNumber of messages to fetch (default 20, max 100).
beforeNoOnly messages before this Slack timestamp (ts).
channelYesChannel to read from. Use #channel-name, @username (for DM), or a channel ID.
workspaceNoWorkspace alias. Omit to use default.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It signals a non-mutating read operation and scopes to 'recent messages,' but it does not disclose ordering, whether thread replies are included, or pagination behavior beyond schema parameters. This is adequate for a simple read but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence with no filler. The main action is front-loaded, and the supported channel formats immediately follow. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All parameters are documented in the schema and the primary purpose is clear, but there is no output schema and the description does not clarify what the returned message data looks like or how it differs from reading a thread. For a simple read tool this is acceptable, though more context would improve selection confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters. The description repeats the channel format guidance rather than adding new semantic detail, which matches the baseline score for fully covered parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Read recent messages from a Slack channel, DM, or group chat.' It clearly identifies what the tool operates on and supports distinct addressing forms (#channel, @username, channel ID), which sets it apart from siblings like send, react, search, and list tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as slack_read_thread or slack_search. The description does not mention exclusions or direct users to a sibling tool for thread replies or search, so the agent must infer the appropriate choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_read_threadA

Read all replies in a Slack thread. Provide the channel and the thread's parent timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax replies to fetch (default 50, max 200).
channelYesChannel containing the thread (#name, @user, or ID).
thread_tsYesTimestamp of the thread's parent message.
workspaceNoWorkspace alias. Omit to use default.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The 'Read' verb implies a non-mutating operation, which is useful since no annotations are provided. However, the description overstates 'all replies' while the schema caps replies at 200, and it does not disclose truncation, ordering, pagination, or auth requirements. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: one establishes the operation and one tells the agent the required inputs. No fluff, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool, the description plus a fully-covered schema provides enough to invoke it correctly: it names the operation, identifies the target resource, and points to the two required keys. It could add more about response shape or truncation, but those are partially covered by the limit parameter and the simple scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description only restates that channel and the thread's parent timestamp are needed, adding no new format or behavioral detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read'), resource ('replies in a Slack thread'), and the two identifying inputs. This clearly distinguishes it from siblings like slack_read_messages (channel-level reads) and slack_reply_thread (writing replies).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: use this when you have a known channel and parent timestamp and need the thread replies. It does not explicitly name alternatives or exclusion cases, but the thread-specific scope is enough to route an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_reply_threadA

Reply in a Slack thread AS YOU. The reply appears as if you typed it in the thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe reply text. Supports Slack markdown.
channelYesChannel containing the thread (#name, @user, or ID).
thread_tsYesTimestamp of the thread's parent message.
workspaceNoWorkspace alias. Omit to use default.
also_send_to_channelNoAlso post the reply to the channel (default false).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral transparency burden. It does disclose a meaningful behavioral trait: the reply is posted as the user, not as a generic bot. It does not cover permissions, reversibility, or whether the reply is publicly visible, but the identity effect is a useful and non-obvious disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with two short sentences that each add value: one states the action and target, and the other clarifies the identity and visible outcome. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple reply action with a fully documented schema and no output schema, the description is largely complete. It gives the core action and identity effect, and the schema covers parameters like workspace and also_send_to_channel. It only lacks explicit usage boundaries or permission notes, which would be helpful but are not essential for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for all five parameters, so the schema carries the parameter semantics burden. The description adds no extra parameter-level detail, which matches the baseline of 3 for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Reply in a Slack thread.' It clearly distinguishes this tool from siblings like slack_send_message by focusing on thread context, and adds the important nuance that the reply appears 'AS YOU,' which directly defines the tool's identity behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the primary usage context clear: replying in a Slack thread. However, it does not explicitly mention when not to use it or how it differs from alternative tools like slack_send_message or slack_react, leaving some routing decisions to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_send_messageA

Send a Slack message AS YOU (not as a bot). The message will appear exactly as if you typed it. Supports #channel-name, @username (DM), or channel ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe message text to send. Supports Slack markdown (mrkdwn).
channelYesWhere to send: #channel-name, @username (opens DM), or channel ID.
workspaceNoWorkspace alias. Omit to use default.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the burden of behavior disclosure, and it does a solid job: 'AS YOU (not as a bot)' and 'appear exactly as if you typed it' communicate identity and user-visible effect. It does not mention side effects such as messages being immediately visible to others or being effectively irreversible through this tool, but the core behavioral nuance is captured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences deliver the essential information: identity ('as you'), behavior ('appear exactly as if typed'), and destination formats. Every clause earns its place, and the most important behavioral distinction is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter tool with 100% schema coverage and no output schema, the description is nearly complete: it identifies what to send, where, and how the send is attributed. The main gap is not clarifying thread vs. top-level message behavior relative to sibling tools, but that does not prevent a competent agent from calling this tool correctly for normal messages.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents channel and text. The description reinforces the channel formats ('#channel-name, @username (DM), or channel ID') but does not add new meaning beyond the schema, and the workspace parameter is not mentioned in the description at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Send a Slack message') and resource, and adds the important nuance that it sends as the user, not a bot. It also mentions supported destination formats (#channel, @user, channel ID). It does not explicitly distinguish this from sending into a thread, which slack_reply_thread covers, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: whenever a Slack message needs to be sent, with guidance on where (channel, DM, or channel ID). However, it never explicitly says when not to use it or points to alternatives such as slack_reply_thread for thread replies, leaving routing to sibling tools implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slack_set_statusA

Set your Slack status (emoji + text). Use empty text to clear status.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceNoWorkspace alias. Omit to use default.
status_textYesStatus text (e.g. 'In a meeting'). Empty string to clear.
status_emojiNoStatus emoji (e.g. ':calendar:'). Omit to clear emoji.
expiration_minutesNoAuto-clear status after this many minutes. Omit for no expiration.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It reveals the core write effect and clear behavior, but does not mention overwriting an existing status, permission requirements, or how expiration interacts with clearing. This is adequate for a low-risk setter but not deeply informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences carry the core action and the important clearing exception with zero fluff. The most relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Combined with the detailed schema, an agent knows the required parameter, optional parameters, and the clear-status behavior. Missing output schema and annotation context leave a small gap, but this is minor for such a straightforward status-setting tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every parameter already has a meaningful description (e.g., empty string to clear, omit to clear emoji). The description restates the empty-text clearing behavior but adds little beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Set your Slack status') with the resource and content type ('emoji + text') and even covers the clearing use case. It is unambiguous against the sibling tools, none of which perform status updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use empty text to clear status' gives parameter-level usage guidance, but the description does not explain when to choose this tool over alternatives or when not to use it. The when-to-use case is only implied by the tool's purpose and name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.0.5
    • First observedslack_list_channels
    • First observedslack_list_users
    • First observedslack_list_workspaces
    • First observedslack_react
    • First observedslack_read_messages
    • First observedslack_read_thread
    • First observedslack_reply_thread
    • First observedslack_search
    • First observedslack_send_message
    • First observedslack_set_status

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct Slack operation: listing, reading, sending, replying, searching, status, and reactions. There is no meaningful overlap between tools; even read_messages and read_thread are clearly separated by message stream vs. thread replies.

Naming Consistency4/5

All tools follow the slack_ prefix with snake_case and mostly use a verb_noun pattern like slack_list_channels and slack_send_message. The only minor deviation is slack_search, which omits an explicit object, but it remains clear and consistent in style.

Tool Count5/5

Ten tools is well-scoped for a Slack integration server. Each tool covers a distinct common Slack action without unnecessary redundancy or bloat.

Completeness4/5

The toolset covers the core Slack workflows: reading, sending, replying, searching, listing users/channels/workspaces, setting status, and reacting. Minor gaps like file uploads, channel creation, or message deletion exist but do not break typical assistant use cases.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server for Slack workspace integration. This server allows AI assistants to interact directly with your Slack workspace, providing tools to manage channels, send messages, list users, and upload files.
    17,928 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for interacting with Slack using a user token. It allows reading channels, DMs, threads, search, and posting messages as the authenticated user.
    19 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that enables AI agents to send messages, payloads, and Markdown-formatted content to Slack via Incoming Webhooks.
    3
    Apache 2.0