nomos-slack-mcp
Provides tools to read and write Slack messages, manage channels, search messages, set status, and react to messages, all using your own user identity.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nomos-slack-mcpsend a message to #general saying 'Running late'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 IDsLocal only — tokens stay on your machine at
~/.nomos/slack/config.jsonwith0600permissions
Quick Start
1. Create a Slack App
For each workspace you want to connect:
Go to api.slack.com/apps → Create New App → From app manifest
Paste the contents of
slack-app-manifest.yml(or use the JSON version)Click Create
Go to Install App → Install to Workspace → Allow
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 build3. Add Your Workspaces
Option A: OAuth flow (recommended)
pnpm add-workspaceYou'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 -- --manualPaste your xoxp- token directly. Find it in your Slack App under OAuth & Permissions → User 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.jsOr add to your MCP config manually:
{
"mcpServers": {
"nomos-slack": {
"command": "node",
"args": ["/path/to/nomos-slack-mcp/dist/src/index.js"]
}
}
}Tools
Tool | Description |
| List configured workspaces and which is default |
| Browse channels, DMs, groups — filter by type or name |
| Read recent messages from any channel or DM |
| Read all replies in a thread |
| Send a message as you |
| Reply in a thread as you |
| Search messages with Slack operators ( |
| List or search workspace members |
| Set your status emoji and text |
| 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 userC0123ABCDEF— 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 |
| Read messages in public channels |
| List public channels |
| Read messages in private channels |
| List private channels |
| Read direct messages |
| List direct messages |
| Read group DMs |
| List group DMs |
| Send messages as you |
| List workspace members |
| See member emails |
| Search messages |
| Set your status |
| Add reactions |
| Read reactions |
Development
# Install dependencies
npm install
# Build
npm run build
# Type-check without emitting
pnpm check
# Watch mode
pnpm devProject 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 workspacesSecurity
Tokens are stored locally at
~/.nomos/slack/config.jsonwith0600file permissionsUser tokens (
xoxp-) are sensitive — they can act as you. Treat them like passwordsNo 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 toolsslack_list_channelsC
List Slack channels, DMs, and group chats in a workspace. Filter by type or search by name.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by channel type. Defaults to 'all'. | |
| limit | No | Max channels to return (default 50). | |
| query | No | Filter channels whose name or purpose contains this string. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max users to return (default 50). | |
| query | No | Filter users whose display name or real name contains this string. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel containing the message (#name, @user, or ID). | |
| reaction | Yes | Emoji name without colons (e.g. 'thumbsup', 'eyes', 'white_check_mark'). | |
| timestamp | Yes | Timestamp (ts) of the message to react to. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only messages after this Slack timestamp (ts). | |
| limit | No | Number of messages to fetch (default 20, max 100). | |
| before | No | Only messages before this Slack timestamp (ts). | |
| channel | Yes | Channel to read from. Use #channel-name, @username (for DM), or a channel ID. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max replies to fetch (default 50, max 200). | |
| channel | Yes | Channel containing the thread (#name, @user, or ID). | |
| thread_ts | Yes | Timestamp of the thread's parent message. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The reply text. Supports Slack markdown. | |
| channel | Yes | Channel containing the thread (#name, @user, or ID). | |
| thread_ts | Yes | Timestamp of the thread's parent message. | |
| workspace | No | Workspace alias. Omit to use default. | |
| also_send_to_channel | No | Also post the reply to the channel (default false). |
TDQS
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.
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.
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.
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.
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.
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_searchA
Search for messages across a Slack workspace. Uses Slack's search syntax (from:@user, in:#channel, before:date, after:date, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort results by relevance or time (default: score). | |
| limit | No | Max results to return (default 20, max 100). | |
| query | Yes | Search query. Supports Slack search operators like from:@user, in:#channel, before:2026-03-01, has:link, etc. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It does disclose that the tool accepts Slack-specific search operators, which is important. However, it does not state whether results include snippets, how workspace selection affects scope, whether pagination occurs, or any access/visibility limitations, leaving key runtime behavior unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core purpose followed by the essential syntax constraint. Every sentence contributes, and there is no redundant or tangential content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema and no annotations, the description is adequate for a basic invocation but leaves important context unstated: what a result looks like, whether search is limited to channels the Slack app can access, and when to choose this over read-based siblings. The schema covers parameters well, but the overall description is not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description largely repeats operator examples already in the query schema and adds little meaningful detail about sort, limit, or workspace semantics. It is not misleading, but it does not materially elevate understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action (search) and the resource (messages across a Slack workspace), and the reference to Slack's search syntax adds useful specificity. It does not explicitly differentiate from slack_read_messages or slack_read_thread, but the search-focused verb and workspace-level scope make the intent reasonably distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for finding messages via query syntax, but it does not explain when to use this vs direct channel reads, thread reads, or list operations. No exclusions or alternate tool routing is provided, leaving the when-to-use decision partly to inference.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The message text to send. Supports Slack markdown (mrkdwn). | |
| channel | Yes | Where to send: #channel-name, @username (opens DM), or channel ID. | |
| workspace | No | Workspace alias. Omit to use default. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Workspace alias. Omit to use default. | |
| status_text | Yes | Status text (e.g. 'In a meeting'). Empty string to clear. | |
| status_emoji | No | Status emoji (e.g. ':calendar:'). Omit to clear emoji. | |
| expiration_minutes | No | Auto-clear status after this many minutes. Omit for no expiration. |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.0.5- First observed
slack_list_channels - First observed
slack_list_users - First observed
slack_list_workspaces - First observed
slack_react - First observed
slack_read_messages - First observed
slack_read_thread - First observed
slack_reply_thread - First observed
slack_search - First observed
slack_send_message - First observed
slack_set_status
TDQS
Scored across 10 tools
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.
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.
Ten tools is well-scoped for a Slack integration server. Each tool covers a distinct common Slack action without unnecessary redundancy or bloat.
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
Related MCP Connectors
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA 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 npm1MIT
- FlicenseNot gradedqualityDmaintenanceA Slack MCP server that gives AI assistants tools to read, search, and interact with Slack workspaces.-
- AlicenseNot gradedqualityBmaintenanceMCP server for interacting with Slack using a user token. It allows reading channels, DMs, threads, search, and posting messages as the authenticated user.19 npmMIT
- AlicenseAqualityBmaintenanceAn MCP server that enables AI agents to send messages, payloads, and Markdown-formatted content to Slack via Incoming Webhooks.3Apache 2.0