Skip to main content
Glama

slack-mcp

A Model Context Protocol (MCP) server that enables AI assistants to interact with Slack workspaces. This server provides a bridge between AI tools and Slack, allowing you to read messages, post content, and manage Slack channels programmatically through MCP-compatible clients.

Disclaimer: This is not an official Red Hat tool.

What is this and why should I use it?

This MCP server transforms your Slack workspace into an AI-accessible environment. It provides 21+ tools for comprehensive Slack interaction:

Message & Thread Operations

  • Read channel history with date filtering and thread support

  • Post messages and replies to threads

  • Search messages across workspace or within specific channels

  • Execute Slack commands

Channel Management

  • List, join, create, and rename channels

  • Look up channel IDs by name

  • Invite users to channels

Reactions & Users

  • Add and view emoji reactions

  • Send direct messages and group DMs

  • Manage usergroups (clear members)

Utility

  • Check authentication status

  • Cache management for performance

Key Benefits

  • Seamless Integration: Connect your AI assistant directly to Slack without manual copy-pasting

  • Automated Workflows: Build AI-powered Slack bots that can read, analyze, and respond to messages

  • Enhanced Productivity: Let AI help manage notifications, summarize conversations, or automate routine Slack tasks

  • Real-time Collaboration: Enable AI assistants to participate in team discussions and provide instant insights

Use Cases

  • Team Assistant: Have an AI that can read team updates and provide summaries

  • Notification Manager: Automatically categorize and respond to incoming messages

  • Knowledge Base: AI that can search through channel history and provide context

  • Meeting Scheduler: AI that can read meeting requests and help coordinate schedules

Related MCP server: Slack MCP Server

Setting Up with Claude Code

This repo ships as a Claude Code plugin with a guided setup skill. Claude will walk you through the entire process — no manual config editing required.

Run the setup script. It handles everything — venv, Playwright, token extraction, wrapper script, and Claude Code registration. The only interaction required is logging in to Slack when the browser opens, and entering an optional channel ID for server logs, if desired.

python3 <(curl -fsSL https://raw.githubusercontent.com/redhat-community-ai-tools/slack-mcp/main/scripts/setup-slack-mcp.py)

Or clone the repo first and run it locally:

git clone https://github.com/redhat-community-ai-tools/slack-mcp
python3 slack-mcp/scripts/setup-slack-mcp.py

Options:

Flag

Description

--logs-channel DXXXXXXXXX

Slack channel ID for server logs (optional; logs go to stderr if omitted)

--workspace https://myco.slack.com

Specific Slack workspace to open

--refresh-tokens

Re-extract tokens when they expire (skips all other steps)

--skip-verify

Skip the post-setup smoke test

When tokens expire, just run:

python3 slack-mcp/scripts/setup-slack-mcp.py --refresh-tokens

Desktop App Token Refresh (Linux)

If you have the Slack desktop app installed, you can refresh tokens without opening a browser:

slack-mcp/scripts/slack-refresh-tokens --validate

This reads tokens directly from the desktop app's local storage on disk — no DevTools, no Playwright, no manual steps. Requires the Slack app to be signed in.

Flag

Description

--validate

Verify tokens against Slack's API after extraction

--env

Print tokens as env vars to stdout (for piping into other tools)

--output FILE

Write tokens to a custom path (default: ~/.local/share/slack-mcp/tokens.env)

Requirements: python3, python3-cryptography, secret-tool (libsecret/gnome-keyring), curl, jq

This is useful for CI hooks or session startup scripts that need to silently refresh tokens before launching the MCP server.


For better security, use a Slack App bot token (xoxb-) instead of browser session tokens. Bot tokens provide:

  • Scoped access — only the OAuth permissions you grant, not full user access

  • Distinct identity — actions appear as the bot, not as your user account

  • Central management — IT can audit and revoke via the Slack admin panel

  • No browser DevTools — tokens are generated once in the Slack App settings

Setup

  1. Create a Slack App at api.slack.com/apps

  2. Add OAuth scopes: channels:read, channels:history, channels:manage, groups:read, groups:history, groups:write, chat:write, reactions:read, reactions:write, search:read, users:read, commands, mpim:write

  3. Install to your workspace and copy the Bot User OAuth Token (xoxb-...)

  4. Invite the bot to channels it needs access to

Running with a bot token

Set SLACK_BOT_TOKEN instead of SLACK_XOXC_TOKEN/SLACK_XOXD_TOKEN:

{
  "mcpServers": {
    "slack": {
      "command": "podman",
      "args": [
        "run", "-i", "--rm",
        "-e", "SLACK_BOT_TOKEN",
        "-e", "LOGS_CHANNEL_ID",
        "quay.io/redhat-ai-tools/slack-mcp"
      ],
      "env": {
        "SLACK_BOT_TOKEN": "xoxb-...",
        "LOGS_CHANNEL_ID": "C7000000"
      }
    }
  }
}

LOGS_CHANNEL_ID is optional. When omitted, tool activity is written to stderr instead of posted to Slack.

If both SLACK_BOT_TOKEN and SLACK_XOXC_TOKEN/SLACK_XOXD_TOKEN are set, the bot token takes precedence.

Read-only mode

For agents or automation that should browse and search Slack without posting, reacting, running commands, or joining channels, enable read-only mode.

  • Environment variable: set SLACK_MCP_READ_ONLY to a truthy value (1, true, yes, or on, case-insensitive).

  • CLI: pass --read-only when starting the server (e.g. slack-mcp --read-only, equivalent to setting the variable).

In read-only mode, tools that mutate Slack state (post_message, send_dm, post_command, add_reaction, join_channel) raise a clear error. Read tools (history, search, threads, whoami, channel listing, cache refresh helpers, and so on) behave as usual. Tool activity that would normally be mirrored to LOGS_CHANNEL_ID is written to stderr instead.

On startup, the server logs a line to stderr when read-only mode is active.

For Podman or Docker, add -e SLACK_MCP_READ_ONLY=true (and the matching key in env) when you want the container to run read-only.

Running as a uv tool (local, no container)

Prefer not to run a container? Install slack-mcp as a uv tool. This puts a slack-mcp command on your PATH that runs the server directly.

Requires uv and Python ≥ 3.10.

# from a clone of this repo
uv tool install .

# or straight from git
uv tool install git+https://github.com/redhat-community-ai-tools/slack-mcp

Run slack-mcp --help for a summary of flags and environment variables.

Tokens from tokens.env (recommended)

slack-mcp reads Slack session tokens from ~/.local/share/slack-mcp/tokens.env when they are not already set in the environment — the same file the token tooling writes:

scripts/slack-refresh-tokens          # or: python3 scripts/setup-slack-mcp.py

Then the MCP client config needs no env block — just the command:

{
  "mcpServers": {
    "slack": {
      "command": "slack-mcp"
    }
  }
}

The file uses SLACK_MCP_XOXC_TOKEN / SLACK_MCP_XOXD_TOKEN; the server maps those onto the SLACK_XOXC_TOKEN / SLACK_XOXD_TOKEN it uses. Override the path with SLACK_MCP_TOKENS_FILE. Real environment variables always take precedence over the file, so you can still override per-client.

Tokens from the client config (alternative)

To keep tokens in the MCP config instead of a file, pass them in env:

{
  "mcpServers": {
    "slack": {
      "command": "slack-mcp",
      "env": {
        "SLACK_XOXC_TOKEN": "xoxc-...",
        "SLACK_XOXD_TOKEN": "xoxd-...",
        "LOGS_CHANNEL_ID": "C7000000"
      }
    }
  }
}

A bot token works the same way — set SLACK_BOT_TOKEN in env instead of the xoxc/xoxd pair. If the client does not inherit your PATH, use the absolute path (~/.local/bin/slack-mcp after uv tool install), or launch via uv run --directory /path/to/slack-mcp slack-mcp.

The user cache and the default tokens.env live under ~/.local/share/slack-mcp/ (override with SLACK_MCP_DATA).

Claude Code (bot token):

claude mcp add slack -e SLACK_BOT_TOKEN=xoxb-... -- slack-mcp

Or, with tokens.env already in place, no env needed:

claude mcp add slack -- slack-mcp

Running with Podman or Docker

You can run the slack-mcp server in a container using Podman or Docker:

Example configuration for running with Podman:

{
  "mcpServers": {
    "slack": {
      "command": "podman",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e", "SLACK_XOXC_TOKEN",
        "-e", "SLACK_XOXD_TOKEN",
        "-e", "MCP_TRANSPORT",
        "-e", "LOGS_CHANNEL_ID",
        "quay.io/redhat-ai-tools/slack-mcp"
      ],
      "env": {
        "SLACK_XOXC_TOKEN": "xoxc-...",
        "SLACK_XOXD_TOKEN": "xoxd-...",
        "MCP_TRANSPORT": "stdio",
        "LOGS_CHANNEL_ID": "C7000000"
      }
    }
  }
}

LOGS_CHANNEL_ID is optional. When omitted, tool activity is written to stderr instead of posted to Slack.

Activity logging

By default, tool activity is written to stderr (visible in your terminal or process logs). To mirror activity to a Slack channel instead, set LOGS_CHANNEL_ID to any channel the bot or session user has access to — a self-DM or a DM with Slackbot works well for personal use.

LOGS_CHANNEL_ID=C7000000

In read-only mode, LOGS_CHANNEL_ID is ignored and all activity is always written to stderr.

Running with non-stdio transport

To run the server with a non-stdio transport (such as SSE), set the MCP_TRANSPORT environment variable to a value other than stdio (e.g., sse).

Example configuration to connect to a non-stdio MCP server:

{
  "mcpServers": {
    "slack": {
      "url": "https://slack-mcp.example.com/sse",
      "headers": {
        "X-Slack-Web-Token": "xoxc-...",
        "X-Slack-Cookie-Token": "xoxd-..."
      }
    }
  }
}

Extract your Slack XOXC and XOXD tokens easily using browser extensions or Selenium automation: https://github.com/maorfr/slack-token-extractor.

Available Tools

22 tools
add_reactionB

Add a reaction to a message.

ParametersJSON Schema
NameRequiredDescriptionDefault
reactionYes
channel_idYes
message_tsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

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

The description only restates the basic action and adds no behavioral context beyond what annotations already convey. It does not mention idempotency, failure behavior, permissions, or side effects despite being a mutating open-world operation.

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 short, direct sentence with no wasted words. It front-loads the core operation immediately.

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

Completeness2/5

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

For a three-parameter mutation with no parameter descriptions, this is thin. An agent gets no guidance on how to supply channel_id and message_ts correctly or what valid reaction values look like; the output schema helps only on the return side.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needed to compensate, but it only hints at the 'reaction' parameter. The meanings and formats of channel_id and message_ts are left entirely to inference from their names.

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 names a specific verb ('add') and a clear resource ('a reaction to a message'), which distinguishes it from message-posting tools like post_message. It does not explicitly differentiate itself from get_reactions, so it loses the top score.

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 intended use is implied: use this when you need to attach a reaction to a message. However, it provides no explicit guidance about when not to use it or how it relates to alternatives like get_reactions.

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

clear_usergroupA
Destructive

Clear all users from a Slack usergroup.

Since Slack API doesn't support empty usergroups, this uses a workaround by setting the usergroup to contain only a randomly selected deleted user. This effectively clears the usergroup.

Args: usergroup_id: The usergroup ID (S...) to clear

Returns: True if usergroup was cleared successfully, False otherwise

ParametersJSON Schema
NameRequiredDescriptionDefault
usergroup_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses the non-obvious workaround: the usergroup is set to contain only a randomly selected deleted user. This is meaningful behavioral context beyond the destructiveHint and readOnlyHint annotations, and it also documents the return behavior.

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 compact and well-structured: a clear one-line purpose, a brief workaround explanation, then Args and Returns sections. Every sentence earns its place with no filler.

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 one-parameter mutation tool, the description covers purpose, the reason for the workaround, the parameter semantics, and return values. Combined with the annotations, an agent has enough information to invoke and interpret the tool correctly.

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

Parameters5/5

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

The input schema provides no description, but the Args section fully explains the single parameter: 'the usergroup ID (S...) to clear.' This adds semantic meaning and a format hint that the schema lacks.

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 opens with a specific verb and resource: 'Clear all users from a Slack usergroup.' This clearly distinguishes the tool from siblings like update_usergroup_members, which manage membership rather than clear it entirely.

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 explains the context and rationale for the tool: Slack API doesn't support empty usergroups, so this tool uses a workaround. This makes the intended use clear, though it does not explicitly name alternatives or state when not to use the tool.

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

create_channelA
Destructive

Create a new Slack channel.

Args: name: Channel name (will be sanitized: lowercase, hyphens, no spaces) is_private: Create as private channel (default: False for public)

Returns: Channel ID on success, None on failure

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
is_privateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate a non-read-only, state-changing tool. The description adds useful behavioral detail beyond annotations, including name sanitization, the default for is_private, and the return contract of Channel ID or None. This is valuable context for predicting tool behavior.

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 compact and front-loaded with the core purpose, followed by a structured Args/Returns breakdown. Every sentence provides necessary information with no filler.

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 low-complexity tool with two parameters and an output schema present, the description covers the essential operational details: channel creation, parameter semantics, defaults, and failure return. Nothing critical is missing for correct invocation.

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

Parameters5/5

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

The input schema has 0% description coverage, but the description fully compensates by explaining both parameters: name's sanitization rules and is_private's default and meaning. This is exactly the semantic information an agent needs beyond raw types.

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 'Create a new Slack channel' with a specific verb and resource, clearly distinguishing it from siblings like join_channel and rename_channel. The purpose is immediately obvious and unambiguous.

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 indicates this tool is for creating new channels, which is a distinct use case from joining, renaming, or messaging. It does not explicitly name alternatives or exclusion conditions, but the usage context is clear enough for an agent to route correctly.

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

get_channel_historyA
Read-only

Get the history of a channel with pagination support. Limit parameter controls max messages to fetch (default 1000).

Optional date filtering (accepts ISO 8601 dates or Unix timestamps):

  • oldest: Only messages after this date (e.g., "2024-01-15" or "2024-01-15T10:30:00")

  • latest: Only messages before this date (e.g., "2024-01-20" or "2024-01-20T18:00:00")

  • include_threads: If True, also fetch all replies in threads (default False)

Note: For date-only formats, 'oldest' defaults to start of day (00:00:00) and 'latest' to end of day (23:59:59).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
latestNo
oldestNo
channel_idYes
include_threadsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/openWorld hints, the description discloses pagination support, default limits, acceptable date formats, thread-inclusion behavior, and boundary semantics for date-only values. This is materially richer than the annotations alone.

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 summary line is front-loaded, and the optional parameters are organized as a scannable list with examples. Every sentence adds value; the date-boundary note closes the one genuinely non-obvious behavior.

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?

The description covers all parameters, defaults, and date parsing in detail, and an output schema exists to explain return values. It leaves a small gap around how pagination actually works and how include_threads interacts with limit/date filters, but nothing blocks a competent agent from making a correct call.

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

Parameters5/5

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

With 0% schema description coverage, the description carries full responsibility for documenting parameters, and it does so thoroughly: limit's meaning and default, oldest/latest formats with examples, and include_threads behavior. Only channel_id is left to the schema, where its name is self-explanatory.

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 opening sentence states the exact operation and resource: retrieving a channel's message history. It adds pagination and thread behavior, distinguishing it from thread-specific or search-based sibling tools even though it doesn't name them.

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 provides clear context: it is for fetching a channel's full history, with optional date filters and thread inclusion. It does not explicitly exclude search_channel_messages or get_thread, so it misses the 'when not to use' guidance that would earn a 5.

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

get_channel_id_by_nameA
Read-only

Get the channel ID by channel name. The channel name can be with or without the # prefix.

ParametersJSON Schema
NameRequiredDescriptionDefault
channel_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already mark this as read-only and open-world, so the safety profile is covered. The description adds a useful behavioral detail about accepting the optional '#' prefix, but it does not disclose behavior for missing channels, case sensitivity, or which set of channels is searched.

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 filler. The primary action is stated first, and the key formatting exception is given immediately after. Every word 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?

The tool is simple and an output schema exists, so return values do not need to be described. However, the description omits useful scope information (e.g., whether the lookup covers all channels or only channels the bot has joined) and does not address not-found behavior, which matters for deciding whether to call join_channel first.

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?

With 0% schema description coverage, the description must carry the parameter meaning. It does add the important rule that the channel name may be with or without the '#' prefix, which is not present in the schema. It leaves some ambiguity about exact formatting, but for a single required string parameter this is meaningful guidance.

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 ('get') and resource ('channel ID') and identifies the exact input ('channel name'). It is clearly distinct from sibling tools like get_channel_history or resolve_user_id, which operate on different resources or return different data.

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 the tool should be used whenever a channel ID is needed from a channel name, but it does not explicitly contrast it with alternatives or state prerequisites such as whether the channel must be joined. No exclusions or 'use X instead' guidance is provided.

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

get_reactionsB
Read-only

Get reactions to a message.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo
channel_idYes
message_tsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, so the safety profile is covered. The description adds no extra behavior such as whether 'full' affects the payload, pagination, or ordering; with annotations present a neutral 3 is appropriate.

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?

A single short sentence that immediately communicates the operation with no filler. It could slightly improve by front-loading parameter-relevant behavior, but for its size it is efficient.

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 tool is simple and has an output schema plus read-only annotations, so the minimal description is mostly adequate. However, the unlabeled 'full' parameter and lack of any usage/routing context leave a clear completeness gap for an agent invoking it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needed to compensate, but it explains none of the three parameters. channel_id and message_ts are inferable from names, but 'full' (boolean, default true) has no explanation and is genuinely ambiguous.

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 uses a clear verb and resource ('Get reactions to a message') and is not a tautology. It is readily distinguishable from sibling add_reaction as the read counterpart, though it does not explicitly contrast with any sibling.

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 for when to prefer this tool over add_reaction or other reaction-related operations. The intended context is implied by the name, but there are no explicit conditions, exclusions, or alternatives.

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

get_threadA
Read-only

Get all messages in a thread given a channel ID and the parent message timestamp.

Use this to read a full conversation thread before replying to it. The thread_ts is the timestamp of the parent message that started the thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
thread_tsYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already mark this as readOnlyHint=true, so the description does not need to restate safety. It adds context by clarifying that thread_ts is the parent message timestamp, but does not disclose ordering, pagination effects of limit, or behavior when no thread exists.

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?

Three concise sentences, each earning its place: the action, the recommended use case, and key parameter clarification. The most important identifying phrase 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 fetch with an output schema available, this is largely complete. It gives the purpose, usage context, and defines the critical parameter. The only notable omission is how limit affects returned messages, but this is optional and defaults to 100.

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 0%, so the description must compensate. It does explain thread_ts as 'the timestamp of the parent message' and mentions channel ID as an input. However, it ignores the optional limit parameter entirely, leaving its meaning to the schema's default.

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?

Description opens with a specific verb-resource pair: 'Get all messages in a thread' and names the two required inputs. This clearly differentiates it from sibling get_channel_history by focusing on thread context rather than channel history.

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?

Explicitly guides usage: 'Use this to read a full conversation thread before replying to it.' This gives clear context but stops short of listing alternatives or when-not-to-use conditions like get_channel_history would be preferred.

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

invite_users_to_channelA
Destructive

Invite multiple users to a channel.

Args: channel_id: Target channel ID (C...) user_ids: List of user IDs to invite (U...)

Returns: True if all invitations succeeded, False otherwise

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idsYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate mutation and potential destructive effects, so no credit is given for that. The description adds the return contract — 'True if all invitations succeeded, False otherwise' — which is useful, but it does not disclose partial-failure behavior, duplicate handling, or permission requirements.

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 compact and well-structured with a one-sentence purpose, Args block, and Returns block. There is no filler; every sentence adds information needed to invoke the tool.

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 two-parameter tool, the description is largely complete: it explains both inputs, their format, and the boolean result. The main gap is absence of usage context and edge-case behavior, but given the low complexity and supportive annotations, the remaining gaps are minor.

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?

Although schema coverage is 0%, the description compensates by defining both parameters with meaningful hints: channel_id is a target C... channel ID and user_ids is a list of U... user IDs. This provides format and role information not present in the schema's bare type declarations.

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 opens with a specific verb and resource: 'Invite multiple users to a channel.' It clearly identifies the action, the target, and the object. This differentiates it from sibling tools like join_channel, create_channel, and send_dm without needing 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 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 choose this over alternatives such as join_channel, create_channel, or send_group_dm. It does not state prerequisites or exclusions, so an agent gets no direct usage-vs-alternative direction.

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

join_channelC

Join a channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
skip_logNo
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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

Annotations say readOnlyHint=false, so the tool is a mutation, but the description adds nothing about side effects, membership implications, permissions, or failure cases. It does not contradict the annotations, so not a 1, but it provides no behavioral context beyond the annotations.

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

Conciseness3/5

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

The description is a single, short sentence with no filler, so it is concise in a superficial sense. However, it is so sparse that it resembles under-specification rather than deliberate, well-structured communication.

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

Completeness2/5

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

For a simple tool with two parameters, the description covers the core action but leaves skip_log semantics, usage boundaries, and behavioral consequences unstated. Even with an output schema and annotations, the definition is not complete enough for an agent to call it with confidence.

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

Parameters2/5

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

Schema description coverage is 0%, and the description offers no parameter explanation. channel_id is inferable from the resource, but skip_log is entirely unexplained, and the description does not compensate for the missing schema documentation.

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 states a clear action ('Join') and resource ('a channel'), and the required channel_id reinforces the purpose. It is not a tautology, but it does not explicitly distinguish itself from siblings like invite_users_to_channel or create_channel.

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?

There is no guidance about when to use this tool versus invite_users_to_channel, create_channel, or list_joined_channels. The description simply restates the name and gives no context, prerequisites, or exclusions.

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

list_joined_channelsA
Read-only

List channels the authenticated user is a member of.

Uses Slack's users.conversations API. By default returns public and private channels only. To include DMs and group DMs, set types to e.g. "public_channel,private_channel,im,mpim".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
typesNopublic_channel,private_channel
exclude_archivedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description adds value by explaining the default channel types and how to include DMs. This matches the read-only nature and does not contradict the annotations. The extra context about types improves transparency beyond the annotation flags.

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, no redundant phrasing. The primary purpose is front-loaded, and the parameter guidance is integrated efficiently in a single follow-up sentence. Every word 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 listing tool with an output schema and all-optional parameters, the description covers the essential usage: what it lists, the default scope, and how to broaden it. It omits clarification on limit and exclude_archived, but these are minor given the tool's simplicity and the output schema presence. Complete enough for typical invocations.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It only explains the 'types' parameter with a concrete example, leaving 'limit' and 'exclude_archived' undocumented. While their names are somewhat self-explanatory, the description does not fully mitigate the schema gap, especially for agents that rely on the description for all parameter meaning.

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 ('List channels') with a precise scope (channels the authenticated user is a member of), clearly distinguishing it from sibling tools like get_channel_history (which fetches message history) or get_channel_id_by_name (which resolves IDs). The purpose is unambiguous.

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?

It provides clear context on default behavior (public and private channels only) and how to extend to DMs via the types parameter, which helps agents decide when to call this tool. However, it does not explicitly mention alternative tools or give 'when not to use' guidance, so it stops short of a full 5.

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

post_commandC
Destructive

Post a command to a channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
commandYes
skip_logNo
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

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

The annotations already indicate readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the description does not contradict the safety profile. However, it adds no extra behavioral context, such as whether the command is executed, what side effects it may have, or whether it requires special permissions.

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 a single short sentence with no wasted words and the key action is front-loaded. It is concise, though the brevity comes at the cost of useful detail that other dimensions require.

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

Completeness2/5

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

For a destructive, open-world mutation tool with four parameters and a sibling post_message, this description is too sparse. It does not explain what a 'command' is, how it differs from a normal message, or what side effects the caller should expect, leaving important context missing.

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

Parameters2/5

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

Schema description coverage is 0%, and the description only weakly illuminates the parameters: 'command' and 'channel' align with the command and channel_id fields, but text and skip_log remain completely unexplained. The description does not compensate for the missing schema parameter descriptions.

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 states a clear verb and resource: 'Post a command to a channel.' It is understandable and partially distinguishes this tool from the sibling post_message by using 'command' rather than 'message', but it does not explicitly contrast the two.

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 post_message, send_dm, or send_group_dm. The intended usage is only implied by the tool name and the terse description, with no exclusions or conditions provided.

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

post_messageA
Destructive

Post a message to a channel. Optionally pass Block Kit blocks as a JSON string for rich formatting (e.g. nested lists via rich_text blocks). When blocks is provided, message is used as the plaintext fallback.

ParametersJSON Schema
NameRequiredDescriptionDefault
blocksNo
messageYes
skip_logNo
thread_tsNo
channel_idYes
unfurl_linksNo
unfurl_mediaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so no contradiction. The description adds a non-obvious behavioral detail: when blocks is provided, message serves as the plaintext fallback, and blocks must be a JSON string. This goes beyond the structured fields and helps the agent predict rendering behavior.

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 focused sentences with no filler. The core operation is front-loaded, and the Block Kit fallback detail is delivered in a compact, scannable way. Every sentence adds value.

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?

For a tool with 7 parameters and 0% schema coverage, the description is adequate for the simple send-message case but incomplete for advanced usage. It explains blocks well but omits meaningful behavior for thread replies and link unfurling. The presence of an output schema reduces the need to describe return values, but the missing optional parameter semantics remain a gap.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the burden of explaining parameters. It explains blocks and its relationship to message, but does not clarify thread_ts, skip_log, unfurl_links, or unfurl_media. Those parameter names may be suggestive, but an agent cannot reliably determine their semantics from the description alone.

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: 'Post a message to a channel.' It clearly distinguishes this from sibling DM tools like send_dm and send_group_dm, and from post_command by framing the operation as a message. The Block Kit mention adds meaningful scope without ambiguity.

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 makes the target context explicit ('to a channel'), so an agent can infer this is the right tool for channel messages rather than direct messages. It does not explicitly name alternatives or state when not to use it, but the channel scoping is sufficient for basic routing.

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

refresh_channel_cacheA

Refresh the channel cache. Use this when new channels are created or if channel lookups are failing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already convey mutation and non-destructiveness, and the description adds context about stale-channel-cache scenarios. However, it does not explain what the refresh actually does internally, such as invalidation, refetching, or potential side effects beyond the cache.

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 sentences with no filler. The primary action is front-loaded and the usage guidance is immediate.

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 zero-parameter cache refresh tool, the description and existing annotations fully enable an agent to decide when to invoke it. The presence of an output schema covers return-value expectations.

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 input schema is empty and there are zero parameters, so the description has no parameter semantics to add; the baseline of 4 applies because nothing needs documenting.

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 clearly identifies the action ('Refresh the channel cache') and the resource affected, so an agent knows what the tool does. It is distinct from sibling refresh_user_cache because it targets the channel cache rather than the user cache.

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?

It explicitly instructs when to use the tool: 'when new channels are created or if channel lookups are failing.' It does not name alternative tools or provide exclusion conditions, but the trigger context is clear and actionable.

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

refresh_user_cacheA

Clear the user cache. Use this when user handles are outdated or if user lookups are failing. Returns the number of cached entries cleared.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses the mutation ('Clear the user cache') and adds a behavioral detail beyond the annotations: it 'Returns the number of cached entries cleared.' It does not contradict the readOnlyHint=false annotation, and it provides useful context about the operation's effect despite destructiveHint=false.

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, each earning its place: the first states the action, the second provides both usage context and the return value. There is no filler, redundancy, or unnecessary technical speculation.

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 zero-parameter cache-clearing tool with an output schema already present, the description is fully sufficient. It explains what the tool does, when to use it, and what it returns, leaving no meaningful gap for an agent to call it correctly.

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 description does not need to explain parameter behavior. Baseline for zero-parameter tools is 4, and the description correctly adds no irrelevant parameter information.

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 ('clear') and resource ('user cache'), and explicitly differentiates from the sibling refresh_channel_cache by naming the cache type. Even with the generic title, the first sentence gives an agent a clear, unambiguous action.

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 gives an explicit trigger: 'Use this when user handles are outdated or if user lookups are failing.' This is clear contextual guidance, though it does not state exclusions or name an alternative tool for resolving lookups, so it falls just short of full when-not/alternatives coverage.

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

rename_channelA
Destructive

Rename a Slack channel.

Args: channel_id: Target channel ID (C...) new_name: New channel name (will be sanitized: lowercase, hyphens, no spaces)

Returns: True if rename succeeded, False otherwise

ParametersJSON Schema
NameRequiredDescriptionDefault
new_nameYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: the new_name is sanitized to lowercase with hyphens and no spaces, and the tool returns True/False to indicate success. This gives the agent a clear expectation of input transformation and result reporting.

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 compact and well-structured with clear Args and Returns sections. Every line adds necessary information, and the primary purpose appears first.

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?

The tool is simple, annotations already convey destructiveness and mutability, and the description covers parameters, sanitization, and return behavior. It is missing only minimal context such as permission requirements or side effects of renaming, but nothing essential is absent for invoking it correctly.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates by explaining both parameters: channel_id is the target channel ID with format C..., and new_name is the new name with sanitization rules. This is essential information that the schema completely lacks.

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 opens with a specific verb and resource: 'Rename a Slack channel.' This is unambiguous and tells an agent exactly what the tool does. It does not explicitly distinguish from sibling tools like create_channel, but the verb 'rename' is specific enough to avoid confusion.

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?

There is no guidance on when to use this tool versus alternatives, and no mention of prerequisites or exclusions. The agent must infer usage from the name and description alone, which is insufficient for choosing between rename_channel and related channel tools.

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

resolve_user_idA
Read-only

Resolve a Slack user ID from a name, @handle, or email address.

Searches the full workspace member list (cached for 24h). Returns up to 5 matches sorted by relevance: exact handle > exact email > case-insensitive name > partial substring match. Each result contains id, handle, real_name, display_name, and email.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Even with readOnlyHint and destructiveHint annotations already present, the description adds substantial behavioral detail: 24-hour cache, full workspace member list, search relevance ordering, and result fields. This gives an agent accurate expectations beyond what annotations provide.

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 four sentences with no filler: purpose, scope/cache, matching semantics, and result shape. Every sentence contributes meaningful information and the most important purpose is front-loaded.

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?

Given the single parameter, presence of an output schema, and helpful annotations, the description covers everything needed to call the tool correctly: accepted input, scope, relevance order, result count, and returned fields. No critical operational detail is missing.

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?

Schema coverage is 0%, so the description must carry the parameter meaning, and it does by explaining that query accepts a name, @handle, or email address. This directly compensates for the sparse schema, though it could be slightly more specific about exact matching behavior for handles or emails.

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 opens with a specific verb and resource: 'Resolve a Slack user ID from a name, @handle, or email address.' It clearly distinguishes this tool from channel-related siblings and similar lookup tools with the mention of full workspace member search and match format.

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 provides clear context on when to use it: whenever a user ID needs to be resolved from identifying information. It states the input formats and search scope, though it does not explicitly name alternatives or give when-not-to-use guidance, so it stops short of a 5.

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

search_channel_messagesA
Read-only

Search for messages within a specific channel.

Uses Slack's search API with an 'in:' filter.

Args: channel_id: The channel ID to search within. query: The search query text. sort: Sort results by "timestamp" (newest first) or "score" (relevance). limit: Max number of results to return (default 100).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNotimestamp
limitNo
queryYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With readOnlyHint and openWorldHint already present, the description adds useful behavior: Slack search API usage, in:<channel> filtering, sort semantics for timestamp vs score, and default limit. This goes beyond the annotations without requiring redundant safety 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 compact and front-loaded, with a one-sentence purpose, a relevant API detail, and a clean Args list. Every line adds useful information without padding.

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?

Given the output schema exists and annotations cover safety, the description is nearly complete for correct invocation. It lacks only explicit guidance on adjacent tools like search_messages or get_channel_history, but nothing needed to call the tool correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates fully by explaining every parameter: channel_id, query, sort (with enum meaning), and limit (with default). This is essential because the schema titles alone would be insufficient.

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 names a specific verb and resource: search for messages within a specific channel. The Slack search API and in:<channel> filter make the scope explicit and distinguish it from general search_messages or get_channel_history.

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 conveys this is for channel-scoped message search, which implies the right use case. It does not explicitly name alternatives like search_messages for cross-channel search, but the context is clear enough to route an agent.

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

search_messagesB
Read-only

Search for messages in the workspace with pagination support. Limit parameter controls max results to fetch (default 1000).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNotimestamp
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already mark the operation as read-only and open-world, and the description adds pagination and limit semantics without contradicting those annotations. It does not disclose additional behavioral traits like sort behavior or result shape, though an output schema exists to cover return values.

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 concise sentences with no fluff. The first sentence states the core purpose and scope; the second adds concretely useful parameter behavior about limit and its default. Every sentence 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?

For a simple three-parameter search tool, the description covers scope and limit, and the output schema exists to handle return values. However, it omits guidance on query format and sort semantics, and it does not mention relevant sibling tools for channel-scoped searches, leaving the agent with some inference to do.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the schema's silence. It only clarifies the limit parameter, leaving query and sort without semantic explanation. The sort enum values 'timestamp' and 'score' are not elaborated, and query syntax is not addressed.

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 ('Search for messages') and the workspace scope, which distinguishes it from channel-scoped alternatives like search_channel_messages. However, it does not explicitly name or contrast siblings, so it stops short of full differentiation.

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 explicit guidance is given about when to use this tool versus alternatives such as search_channel_messages or get_channel_history. The phrase 'in the workspace' implies a global search scope, but no exclusions or alternative conditions are provided.

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

send_dmA
Destructive

Send a direct message to a user. Optionally pass Block Kit blocks as a JSON string for rich formatting (e.g. nested lists via rich_text blocks). When blocks is provided, message is used as the plaintext fallback.

ParametersJSON Schema
NameRequiredDescriptionDefault
blocksNo
messageYes
user_idYes
unfurl_linksNo
unfurl_mediaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already convey that this is a side-effectful operation (readOnly=false, destructiveHint=true), lowering the burden. The description adds real behavioral detail beyond annotations: blocks must be a JSON string, rich_text blocks are supported, and message acts as the plaintext fallback. It does not cover unfurl behavior, but nothing contradicts the annotations.

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?

Three sentences with no filler: the first states the action, and the next two concisely explain the optional block behavior and fallback semantics. Information is front-loaded and 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 small side-effectful tool with an output schema and annotations, the core call semantics are covered: recipient, message text, optional rich formatting, and fallback behavior. The main gap is the undocumented unfurl parameters, but they have defaults and self-explanatory names.

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 0%, so the description must compensate. It does explain blocks (JSON string, rich formatting) and message (fallback role), but it says nothing about unfurl_links or unfurl_media, leaving those to inference from their names and defaults.

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 opening sentence, 'Send a direct message to a user', states a clear verb and resource. It implies a 1:1 user recipient, which helps distinguish it from channel-oriented tools, but it does not explicitly name siblings like post_message or send_group_dm.

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 the appropriate context by saying 'to a user' and gives useful formatting guidance, but it never states when to prefer this tool over post_message, send_group_dm, or post_command. There are no explicit exclusions or alternative routing cues.

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

send_group_dmB
Destructive

Send a message to a group DM (multi-party direct message).

Args: user_ids: List of 2+ user IDs to include in group DM message: Message text to send

Returns: True if message sent successfully, False otherwise

ParametersJSON Schema
NameRequiredDescriptionDefault
blocksNo
messageYes
user_idsYes
unfurl_linksNo
unfurl_mediaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already indicate a mutating, non-read-only action (destructiveHint=true, readOnlyHint=false), and the description adds a useful True/False return contract. It does not discuss side effects, unfurling behavior, or optional fields, so the transparency is 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?

The description is compact and well organized: a one-sentence purpose, a short Args list, and a Returns line. Every sentence contributes, with no filler or redundancy.

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

Completeness2/5

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

Even with an output schema present, a 5-parameter tool needs more context than this. Three optional parameters are unexplained, no guidance is given for selecting this tool over send_dm, and the failure behavior beyond 'returns False' is not described.

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

Parameters2/5

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

The description adds meaning for user_ids ('2+ user IDs') and message ('message text'), but schema description coverage is 0% and the optional parameters blocks, unfurl_links, and unfurl_media are completely undocumented. With low coverage, the description needed to compensate for these gaps and did not.

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 opening phrase 'Send a message to a group DM' gives a specific verb, resource, and scope, and 'multi-party direct message' distinguishes this from ordinary DMs. It does not explicitly contrast with siblings like send_dm or post_message, so it falls just short of a perfect score.

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 requirement that user_ids must contain '2+' users implies this tool is meant for group conversations, giving some usage context. However, the description never states when to use this instead of send_dm for one-to-one DMs or post_message for channels, and it names no alternatives or exclusions.

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

update_usergroup_membersA
Destructive

Set the members of a Slack usergroup, replacing the current membership entirely.

Args: usergroup_id: The usergroup ID (S...) to update user_ids: List of user IDs (U...) that should be the members. Must contain at least one user — use clear_usergroup to remove all members.

Returns: True if the membership was updated successfully, False otherwise

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idsYes
usergroup_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description does not need to repeat that this is a mutating operation. It adds value by specifying the exact destructive nature ('replacing the current membership entirely') and the constraint that user_ids must contain at least one user. This goes beyond the annotation and gives the agent important behavioral context. It does not, however, mention any potential failure modes (e.g., invalid usergroup or user IDs), but that is not required given the annotation coverage.

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 well-structured with an Args section and a Returns section. It is concise—only three sentences of core content—and every sentence provides necessary information: the action, parameter explanations, and return value. It is front-loaded with the primary behavior, then details, and ends with the return type. Nothing is redundant or extraneous.

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 two-parameter tool with a simple output (True/False), the description is entirely sufficient. It specifies the return type, explains both parameters, gives constraints, and points to the alternative for a different scenario. There is no missing information that an agent needs to correctly invoke the tool, especially given that annotations already supply the safety profile (destructive, not read-only).

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

Parameters5/5

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

Schema description coverage is 0%, so the description must carry the full burden of explaining parameters. It does so effectively: usergroup_id is described as 'The usergroup ID (S...)' and user_ids as 'List of user IDs (U...)' with the critical constraint 'Must contain at least one user.' This adds format hints and constraints that the schema (which only provides types) does not convey, fully compensating for the lack of schema-level descriptions.

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 clear, specific action: 'Set the members of a Slack usergroup, replacing the current membership entirely.' It names the verb ('set'), the resource ('members of a Slack usergroup'), and the key behavior ('replacing entirely'). It also distinguishes from the sibling clear_usergroup by mentioning the alternative for removing all members, so an agent can immediately tell which tool to use.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool (to set/replace membership) and when NOT to use it: 'Must contain at least one user — use clear_usergroup to remove all members.' This gives a clear exclusion and points to the correct sibling for that case. No ambiguity remains about when to select this tool over alternatives.

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

whoamiA
Read-only

Checks authentication & identity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so no safety contradiction. The description adds the identity/authentication context but no additional behavioral details such as what the response contains or whether any session state is checked. With annotations available, this is adequate but not enriched.

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 a single, compact sentence that fully states the tool's purpose. No filler or redundant information.

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 parameter-less, read-only tool with an output schema, the description is sufficient. It could mention that the tool returns identity information, but the output schema likely covers that; the current text is minimally complete.

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?

There are zero parameters, so the baseline is 4. The description correctly implies no arguments are needed and does not attempt to document nonexistent parameters.

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 identifies the tool's purpose with a specific action ('Checks') and resource ('authentication & identity'). It is distinct from the sibling tools, which focus on channels, messages, and user group operations.

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 the obvious use case—verify authentication status and identity—but does not explicitly state when to use it versus alternatives. For a standard whoami utility with no parameters, the absence of explicit guidance is acceptable but still leaves context implicit.

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. 22 tool updatesv1.0.0
    • First observedadd_reaction
    • First observedclear_usergroup
    • First observedcreate_channel
    • First observedget_channel_history
    • First observedget_channel_id_by_name
    • First observedget_reactions
    • First observedget_thread
    • First observedinvite_users_to_channel
    • First observedjoin_channel
    • First observedlist_joined_channels
    • First observedpost_command
    • First observedpost_message
    • First observedrefresh_channel_cache
    • First observedrefresh_user_cache
    • First observedrename_channel
    • First observedresolve_user_id
    • First observedsearch_channel_messages
    • First observedsearch_messages
    • First observedsend_dm
    • First observedsend_group_dm
    • First observedupdate_usergroup_members
    • First observedwhoami

TDQS

B3.4/5.0

Scored across 22 tools

Disambiguation4/5

Most tools target distinct resources and actions, but get_thread overlaps with get_channel_history's include_threads option, and clear_usergroup is essentially a special case of update_usergroup_members. Otherwise, the boundaries are clear.

Naming Consistency4/5

Tool names mostly follow a consistent verb_noun snake_case pattern (post_message, create_channel, search_messages). Minor deviations like whoami and the somewhat vague post_command keep it from being perfectly uniform.

Tool Count3/5

With 22 tools, the set is at the heavy end for an MCP server, though Slack's broad domain justifies many of them. The inclusion of cache-refresh utilities and several overlapping search/message tools makes the surface feel slightly larger than necessary.

Completeness3/5

The server covers core messaging, channel management, reactions, search, and some usergroup operations. However, there are notable gaps such as message edit/delete, channel archive/delete/leave, and usergroup create/list/get, leaving some lifecycle workflows incomplete.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to interact with Slack workspaces through comprehensive channel management, messaging, direct messages, search functionality, and user management capabilities.
    30
    4
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Slack workspaces through natural language, supporting channel management, message operations, user profiles, reactions, and threaded conversations.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Slack workspaces through secure OAuth 2.0 authentication. Supports posting messages, reading channel history, and listing channels across multiple workspaces with production-ready security features.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to read messages, threads, channel info, user profiles, search conversations, and generate permalinks in Slack workspaces.
    1
    MIT