Slack MCP Server
This server gives your AI agent full Slack access via 21 tools, using browser session tokens instead of OAuth — no admin approval required.
Authentication & Token Management
Check token validity, age, and health (
slack_health_check,slack_token_status)Auto-extract and refresh tokens from Chrome on macOS (
slack_refresh_tokens)
Reading Messages & Conversations
List all channels and DMs with resolved user names
Fetch message history, full conversations, and threads (with opt-in rich fields: attachments, blocks, files, reactions)
Get channels/DMs with unread messages, sorted by unread count
Searching
Search messages across the entire workspace with Slack syntax (
from:@user,in:#channel)Search users by name, display name, or email
Writing & Interacting
Send messages to any channel or DM, including threaded replies
Add or remove emoji reactions
Mark conversations as read
User Management
Get detailed info on specific users; list all workspace users (paginated)
Workflow Profiles (Local)
Save and manage workflow profiles binding a
workflow_kind(incident_room,exec_brief,support_inbox,product_launch_watch,custom) to channels, priority people, retention mode, and summary cadence
Hosted AI Brain (Paid/Free Tier — requires sign-up at mcp.revasserlabs.com)
slack_smart_search— Semantic + lexical hybrid search across indexed Slack history with relevance scoresslack_catch_me_up— AI-structured digest against a workflow profile (e.g.,incident_summary,timeline,open_risks,next_actions)slack_triage— Classify and route threads by priority (low/medium/high/urgent), suggested owner, and escalation flag
Deployment
Works as a stdio MCP server with Claude, Cursor, Copilot, Windsurf, Gemini CLI, Codex CLI, and any MCP client
Docker support and hosted HTTP mode available for remote endpoints
Quick setup via
npx --setup
Provides tools for reading and writing Slack messages, searching conversations, managing reactions, and extracting structured workflow summaries from Slack workspaces using session tokens instead of OAuth.
Click on "Install 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., "@Slack MCP Serversearch for deployment thread from last week"
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.
npx -y @jtalk22/slack-mcp --setupIt’s Monday, 9:07. Slack has already formed opinions.
You ask “what blew up overnight?” and the agent reads the workspace instead of you. It reconstructs the 2 AM P1 from #incidents—owner, resolution, and the runbook step that is still wrong. It finds the printer PIN that has been waiting in #facilities for five months. Then it closes the handled loops—replies, reactions, read-state changes—only where you approve.
This is not screenshot automation. The agent calls Slack through a real MCP tool surface and receives typed results it can search, summarize, export, or act on.
Related MCP server: Slack MCP Server
Built past the demo
The difficult part is not another chat tool. It is the operating layer underneath: browser-session extraction that names its failure stages, a credential lifecycle built for rotation, full-fidelity reads, guarded writes, and typed workflow output. The code is plain JavaScript in this repository—audit it before trusting it with a session.
1. The browser-session engine
--setup turns the Slack identity Chrome already holds into a local MCP server:
finds the newest
xoxc-token in Chrome's on-disk LevelDB;snapshots the cookie SQLite database with its WAL sidecars;
retrieves Chrome Safe Storage from the macOS Keychain;
runs Chrome-compatible PBKDF2 + AES-128-CBC decryption locally;
requires no DevTools, clipboard step, browser flag, or live Slack tab;
names the failed extraction stage—
keychain_timeout,no_slack_cookie_row,cookie_decrypt_failed, and more—instead of returning one opaque error.
2. Credential lifecycle, not credential paste
Session credentials rotate. The server is built around that reality:
auto,keychain-only, andfilestorage backends;owner-only token files and a Keychain-only path with no plaintext credentials on disk;
atomic file writes, verified Keychain migration, cross-process locks, and refresh mutexes;
proactive health checks and automatic macOS refresh;
last-known-good in-memory credentials when persistence is temporarily unavailable;
isolated profiles for work and personal Slack;
fail-closed handling for invalid storage or profile configuration.
3. Full-fidelity Slack reads
Read DMs and channels, search the workspace, export complete histories with threads, inspect unread state, and resolve users. Opt into blocks, attachments, files, reactions, metadata, and bot/app markers when text alone is not the real message.
4. The agent can finish the job
Send a reply, add or remove a reaction, and mark a conversation read. Every workspace write path carries an MCP destructive annotation so compatible clients can put approval where it belongs.
5. Slack in, typed JSON out
Save workflow profiles for incident rooms, executive briefs, support inboxes, launch watches, and custom operations. The OSS primitives are local JSON; the optional hosted brain renders them into contract-shaped briefs.
Two ways into Slack
Slack already knows who you are. The official path is a Slack-managed remote integration governed by workspace policy—a strong fit for organization-sanctioned deployments, documented by Slack with integration settings under admin control. This project is the direct local path: session-based auth from the browser session already in Chrome, local stdio, any stdio MCP client, and no Slack app or admin request. Same Slack identity. Same underlying permissions. A radically shorter path from your workspace to your agent.
Slack official MCP | Slack MCP Server — local | |
Starting point | A Slack-managed remote integration | The Slack session already in Chrome |
Workspace control | Governed by workspace integration settings | No Slack app or admin request for the local path |
Transport | Streamable HTTP | Local stdio |
Client surface | Slack's supported partner integrations | Any stdio MCP client |
Authentication | OAuth | Existing browser session |
Credential lifetime | Managed OAuth | Rotating session with health checks and refresh |
Product surface | Broad Slack-native capabilities | 19 focused tools across read, act, and automate |
Protocol | Slack-managed | MCP 2026-07-28 and every 2025 revision, from the same binary |
Runtime | Slack-managed | MIT code on your machine |
Treat browser-session automation as an acceptable-use decision for you and your workspace. The server acts as your signed-in Slack identity and cannot read a channel you cannot read or act as another user. It does not evade server-side retention, DLP, compliance exports, or audit controls.
"No admin request" means there is no Slack app installation to approve. It does not mean workspace activity disappears from Slack's systems. If your policy requires a sanctioned OAuth integration, use the official MCP or the optional hosted OAuth path.
Grid, credentials, and caching
Enterprise Grid. Grid runs aggressive session-anomaly detection. Browser-session automation can trip it, which flags the session and kills it, regardless of which tool drives the traffic. Outbound calls are paced by default to stay under burst thresholds (SLACK_MCP_MIN_REQUEST_INTERVAL_MS, default 350; SLACK_MCP_MAX_CONCURRENCY, default 3). Pacing lowers that risk; it does not remove it. On Grid, use the hosted OAuth tier or Slack's official MCP instead.
Credential extraction. --setup reads the newest xoxc- token from Chrome's on-disk LevelDB, snapshots the cookie SQLite database, retrieves Chrome Safe Storage from the macOS Keychain, and runs PBKDF2 + AES-128-CBC decryption locally. It writes the token file, Keychain entries, and non-secret metadata. It transmits nothing — the server talks to Slack and nowhere else.
This is the same access pattern credential stealers use. Chrome App-Bound Encryption exists to make this class of read harder, and infostealer families (Lumma, Vidar, Meduza) bypass it to lift live sessions. The mechanism here is comparable. What differs is that you run it, on your own machine, against your own session, and nothing leaves the host. The source is plain JavaScript in this repository; audit it before handing it a live session.
User cache. One cache exists: user-name lookups, populated on demand, 500 entries maximum, one-hour TTL. No message content, no channel history, and no persistent copy of the workspace is stored.
Install
Node 22 or 24 recommended. Node 20 remains supported for the v4 line.
npx -y @jtalk22/slack-mcp --setupPrefer a persistent CLI: npm install -g @jtalk22/slack-mcp then slack-mcp --setup.
Then:
Pick your client in the setup guide.
Register the generated stdio command.
Fully restart the client.
Ask the agent to run
slack_health_check.A workspace name in the response means the connection is live.
Use the same server command everywhere:
{
"command": "npx",
"args": ["-y", "@jtalk22/slack-mcp"]
}On macOS, setup can extract from Chrome and persist the selected storage backend. On other platforms, provide SLACK_TOKEN and SLACK_COOKIE through the client's environment configuration. Docker, HTTP, and detailed client examples live in docs/SETUP.md and docs/DEPLOYMENT-MODES.md.
Client | Configuration surface | Status |
Claude Code |
| Documented |
Claude Desktop | Desktop MCP configuration | Verified |
Cursor |
| Documented |
GitHub Copilot |
| Documented |
Windsurf |
| Documented |
Gemini CLI |
| Documented |
Codex CLI |
| Documented |
Other clients | Any stdio MCP configuration | Protocol-compatible |
19 tools: read, act, automate
The local surface ships 19 tools today: 12 read-only Slack operations, 4 write-path tools that each carry an MCP destructive annotation so clients can gate workspace writes, and 3 local workflow tools including the catch-up itself. Every tool does its work here — reads Slack or local state — and none is a placeholder for something you would have to pay for. Four read tools accept include_rich_message_fields: true to surface attachments, blocks, files, reactions, and metadata—complete inputs and response contracts live in docs/API.md.
Speaks MCP 2026-07-28 and every 2025 revision from the same binary — era-negotiated over stdio, stateless per request over HTTP (no Mcp-Session-Id; GET/DELETE answer 405). The claim is a test, not a sentence: test/mcp-era.test.js drives the real SDK client at both eras against the real entry points.
Advertising fewer tools. A client pays for the tool schema on every turn that carries it. SLACK_MCP_TOOLS=essentials advertises six tools — unread, history, search, thread, user lookup, send — costing roughly 985 estimated tokens of schema per turn against about 3,134 for all 19. SLACK_MCP_TOOLS=read advertises the 12 read-only Slack operations listed below, near 1,690. --tools=slack_x,slack_y takes an explicit set. The default stays all 19. Filtering changes what is advertised, not what is callable. Reproduce the numbers with node scripts/measure-tool-schema.js (a ~4-chars-per-token estimate).
12 read-only Slack operations
Tool | Purpose |
| Verify credentials and workspace identity |
| Inspect credential age, health, cache, profile, and storage state |
| Refresh local credentials from the browser session on macOS—reads Slack, writes only local state |
| List channels and DMs |
| Read channel or DM history with optional rich fields |
| Export complete history and threads |
| Search across the workspace |
| Read all replies in a thread |
| Resolve a user |
| Page through large workspace directories |
| Search users by name, display name, or email |
| Prioritize conversations with unread messages |
Act in the workspace — 4 write-path tools
Tool | Purpose | MCP safety |
| Send to a channel or DM | destructive |
| Add an emoji reaction | destructive |
| Remove an emoji reaction | destructive |
| Mark a conversation read | destructive |
Automate locally — 3 workflow tools
Tool | Purpose |
| Save a typed workflow profile to |
| List saved workflow profiles |
| Read a profile's channels since its cadence window and return structured catch-up evidence |
slack_refresh_tokens reads Slack and writes only local credential state.
Typed workflows: Slack in, JSON out
Bind a workflow kind to channels, priority people, retention, and cadence. slack_catch_me_up then reads that scope locally and hands your agent the evidence: which threads went unanswered and for how long, what your priority people said or were pinned on, which conversations actually moved. It does the gathering; your agent writes the summary against the contract below.
There is no server-side model in that path, because there does not need to be one — the client calling this server is already a language model. Hosted adds what genuinely needs infrastructure: running the same catch-up on a schedule while your laptop is shut, on an OAuth token that does not rotate.
npx -y @jtalk22/slack-mcp --apply-template oncall-handoff --channels C012345,C067890Workflow kind | Contract |
|
|
|
|
|
|
|
|
|
|
Six editable templates ship in the package: oncall-handoff, support-triage, exec-monday, sprint-tracker, customer-feedback, and incident-room.
Where credentials live
Resolution is deterministic; first hit wins:
SLACK_TOKEN+SLACK_COOKIEtoken file (
chmod 600)macOS Keychain
Chrome extraction on macOS
Session credentials commonly rotate after one or two weeks. When Slack returns invalid_auth, not_authed, token_expired, token_revoked, account_inactive, or HTTP 401, run npx -y @jtalk22/slack-mcp --setup to recover locally. On macOS, slack_refresh_tokens or --refresh-tokens refreshes without leaving the client; the optional LaunchAgent in docs/SETUP.md keeps long-idle installations healthy.
Mode | Behavior |
| Token file plus Keychain backup |
| Keychain only; verified writes and no plaintext credential file |
| Owner-only token file; Keychain is never touched |
The selected backend is remembered in non-secret metadata and used by the server, CLI, and optional refresh job. An unrecognized mode fails at startup instead of silently downgrading storage.
{
"mcpServers": {
"slack-work": {
"command": "npx",
"args": ["-y", "@jtalk22/slack-mcp"],
"env": { "SLACK_MCP_PROFILE": "work" }
},
"slack-personal": {
"command": "npx",
"args": ["-y", "@jtalk22/slack-mcp"],
"env": { "SLACK_MCP_PROFILE": "personal" }
}
}
}Each profile gets its own token file, Keychain entries, metadata, and lock. Add SLACK_MCP_CHROME_PROFILE when the workspaces live in different Chrome profiles.
Free local when you’re driving. Hosted when it must drive itself.
When local control is enough, stop here—everything above is MIT-licensed and runs on your machine. The local product is complete, not a crippled trial: hosted earns the upgrade through continuity, intelligence, and collaboration, not by holding ordinary Slack access hostage. Hosted exists for work that must survive a rotating browser session:
permanent OAuth;
scheduled catch-up;
contract-validated workflow briefs;
shared profiles and managed workspace continuity.
Local mode never contacts us; it runs on your machine and talks only to Slack. Hosted never receives a browser cookie; it runs on permanent OAuth, for work that has to survive a rotating session — unattended schedules, Enterprise Grid. Everything above is MIT-licensed and complete on its own.
Security and provenance
Credential files are owner-only; Keychain-only mode keeps plaintext credentials off disk.
Configuration fails closed for unknown storage modes and invalid profiles.
Writes are atomic and shared credential state is process-locked.
The local web server binds to localhost; workspace write tools carry destructive annotations.
Every release publishes from CI with npm provenance.
Provenance: don't take my word for it
npm audit signaturesA clean result verifies that the package signatures and attestations trace back through the published release chain. Inspect the package before handing it a live Slack session. Full policy: SECURITY.md.
Documentation
Setup · API · Architecture · Compatibility · Deployment modes · Recipes · Troubleshooting · Roadmap
Contributing
PRs are welcome. Read CONTRIBUTING.md and run node --check on touched JavaScript before submitting.
License
MIT — see LICENSE.
Disclaimer
Not affiliated with Slack Technologies, Inc. This server uses browser-session credentials. Review your workspace's acceptable-use policy before running it.
Your Slack. Your agent. One command.
npx -y @jtalk22/slack-mcp --setupIf this removes a Slack tab from your day, star the repository. Stars are how the next admin-blocked developer finds the local path.
Available Tools
19 toolsslack_add_reactionADestructiveIdempotentInspect
Add an emoji reaction to a message
| Name | Required | Description | Default |
|---|---|---|---|
| reaction | Yes | Emoji name without colons (e.g., 'thumbsup', 'eyes', 'white_check_mark') | |
| timestamp | Yes | Message timestamp to react to | |
| channel_id | Yes | Channel or DM ID containing the message |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint and idempotentHint. Description adds no further behavioral context beyond the annotation.
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?
Single sentence, no fluff, directly states the action.
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 action tool, the description and schema together cover the necessary info. Lacks guidance on when to use, but not critical for such a 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% with parameter descriptions. The description does not add additional meaning 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 states the verb (add), the resource (emoji reaction), and the target (message). It distinguishes itself from sibling tool slack_remove_reaction.
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 on when to use this tool versus alternatives, no prerequisites mentioned, and no context for appropriate usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_catch_me_upARead-onlyInspect
Catch up on a saved workflow profile. Reads the profile's channels (or everything currently unread if the profile names none), pulls messages since the cadence window or an explicit since, expands active threads, and returns structured evidence: which threads are unanswered and for how long, what the profile's priority people said or were pinned on, and which conversations moved most. Runs locally against your own session — no hosted account, no server-side model. The response carries an output_contract naming the keys to compose for this workflow_kind; write the summary from the returned signals and conversations, citing conversation names and timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Optional ISO 8601 timestamp — only consider messages newer than this. Defaults to the profile's cadence window: 24 hours for on_demand and daily_8am, 7 days for weekly_monday. | |
| profile_name | Yes | Name of a workflow profile saved via slack_workflow_save (list them with slack_workflows) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds valuable context beyond that: it runs locally (no hosted account, no server-side model), and it returns an `output_contract` that instructs how to compose the final summary. This goes beyond the structured fields without contradicting them.
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 dense but efficient—each sentence serves a purpose: stating the action, describing the process, clarifying execution context, and explaining output usage. It is slightly long but front-loaded with the core purpose and contains no fluff. A minor trim could improve it, but it earns a 4.
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 explains the full workflow: reading channels, filtering by time, expanding threads, returning structured evidence, and how to use the output (`output_contract`, `signals`, `conversations`). It lacks explicit handling of edge cases (e.g., no conversations, partial failures), but for an agent invoking the tool, the provided information is sufficient to understand what to expect and how to act on results.
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 provides 100% coverage of both parameters with clear descriptions (profile_name and since, including default cadence). The description only mentions `since` in passing and does not add deeper semantic meaning (e.g., format validation or edge-case handling) beyond what the schema already provides, so the baseline of 3 is appropriate.
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 ('catch up on a saved workflow profile'), identifies the resource (workflow profile), and enumerates the outcomes (threads unanswered, priority people, active conversations). This clearly differentiates it from sibling tools like slack_get_thread or slack_conversations_history, which serve narrower raw-data purposes.
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?
It clearly implies when to use the tool—when you have a saved workflow profile and want a structured summary rather than raw message history. However, it does not explicitly name alternatives or when not to use it, so there is no exclusion clause, but the context is clear enough for an agent to select it over related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_conversations_historyBRead-onlyIdempotentInspect
Get messages from a channel or DM with user names resolved
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Messages to fetch (max 100, default 50) | |
| latest | No | Unix timestamp - get messages before this time (boundary timestamp included) | |
| oldest | No | Unix timestamp - get messages after this time (boundary timestamp included) | |
| channel_id | Yes | Channel or DM ID (e.g., D063M4403MW) | |
| resolve_users | No | Convert user IDs to names (default true) | |
| include_all_metadata | No | Pass Slack's include_all_metadata option to conversations.history | |
| include_rich_message_fields | No | Include Slack message attachments, blocks, metadata, files, and reactions when present |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, covering safety and idempotency. The description adds minimal behavioral context (e.g., user name resolution) but does not address pagination or rate limits.
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?
Single sentence, no filler, front-loaded with key action and resource.
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?
With 7 parameters (all with schema descriptions) and no output schema, the description is too brief. It does not mention return format, pagination behavior, or how to handle large histories.
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 fully explains each parameter. The description adds no additional parameter meaning beyond what is already in 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 uses a specific verb ('Get') and resource ('messages from a channel or DM'), and mentions a distinct feature ('with user names resolved'). However, it does not differentiate from sibling tools such as slack_get_full_conversation or slack_get_thread.
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 on when to use this tool versus alternatives like slack_get_full_conversation or slack_get_thread. Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_conversations_markADestructiveIdempotentInspect
Mark a conversation as read up to a specific message timestamp
| Name | Required | Description | Default |
|---|---|---|---|
| timestamp | Yes | Message timestamp to mark as read up to (all messages at or before this are marked read) | |
| channel_id | Yes | Channel or DM ID to mark as read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, signaling state change and safe retry. The description adds no additional behavioral context beyond what annotations provide, such as side effects on unread badges 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded and contains no extraneous words. It efficiently conveys the tool's purpose.
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?
Given the tool's simplicity (2 required params, no output schema, clear annotations), the description provides enough information for an agent to use it correctly. Context like the timestamp parameter's inclusive nature is clear from the schema description.
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 both parameters are well-documented in the schema. The description does not add meaning beyond what the schema already provides for channel_id and timestamp.
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 (mark as read) and the scope (up to a specific message timestamp). It distinguishes from sibling tools like slack_conversations_unreads (unread count) and slack_conversations_history (history retrieval).
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 usage for marking conversations as read but lacks explicit guidance on when to use versus alternatives like slack_catch_me_up (which might batch mark) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_conversations_unreadsARead-onlyIdempotentInspect
Get channels and DMs with unread messages, sorted by unread count (highest first)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum conversations to return (default 50) | |
| types | No | Comma-separated types: im, mpim, public_channel, private_channel (default all) | im,mpim,public_channel,private_channel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint, idempotentHint, openWorldHint. Description adds sorting behavior (by unread count) but lacks details on pagination, rate limits, or result format. With annotations present, this is marginal.
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?
Single sentence, direct, no filler. Efficiently conveys core purpose and key behavioral trait (sorting).
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?
No output schema, so description should hint at return format. It states what is returned (channels and DMs with unread messages) but does not specify fields or structure. Adequate for a simple read tool, but could be more complete.
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% with both parameters described. The description reinforces the sorting context but adds no new parameter-level detail. Baseline 3 is appropriate.
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 (Get) and resource (channels and DMs with unread messages), and distinguishes from siblings like slack_conversations_history by specifying 'unread' and sorting by count.
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 explicit when-to-use or alternative guidance. The description implies usage for fetching unread conversations, but does not contrast with related tools like slack_conversations_history or slack_search_messages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_get_full_conversationARead-onlyIdempotentInspect
Export FULL conversation history with all messages, threads, and user names. Can save to file.
| Name | Required | Description | Default |
|---|---|---|---|
| latest | No | Unix timestamp end (boundary timestamp included) | |
| oldest | No | Unix timestamp start (e.g., 1733011200 = Dec 1, 2025; boundary timestamp included) | |
| channel_id | Yes | Channel or DM ID | |
| output_file | No | Filename to save export (saved to ~/.slack-mcp-exports/) | |
| max_messages | No | Maximum messages to retrieve (default 2000, max 10000) | |
| include_threads | No | Fetch thread replies (default true) | |
| include_all_metadata | No | Pass Slack's include_all_metadata option to conversations.history and conversations.replies | |
| include_rich_message_fields | No | Include Slack message attachments, blocks, metadata, files, and reactions when present |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true (safe read) and idempotentHint=true. The description adds only 'Can save to file' as behavioral context. It does not disclose potential slowness, rate limits, or behavior when the channel is very large. With annotations covering the safety profile, the description adds marginal value.
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, front-loaded with the main purpose. Every word earns its place. No fluff 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?
There is no output schema, so the description should clue the agent about what the tool returns (e.g., raw JSON, file path). It only says 'Can save to file' but doesn't describe the default output. Given 8 parameters and high complexity, the description is adequate but leaves gaps about return format and default behavior.
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%: all 8 parameters have descriptions in the input schema. The tool description does not add any extra meaning beyond what the schema already provides. For example, 'max_messages' default is only in schema. Thus baseline 3 is appropriate.
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 specific verbs 'Export FULL conversation history' and identifies resources (messages, threads, user names). It clearly distinguishes from siblings like 'slack_get_thread' which focuses on a single thread. The phrase 'FULL' implies completeness, setting it apart from partial history 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?
The description implies usage for full export but provides no explicit when-to-use or when-not-to-use guidance. No alternatives are named despite 20 sibling tools. The agent must infer usage from the tool name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_get_threadARead-onlyIdempotentInspect
Get all replies in a message thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_ts | Yes | Thread parent message timestamp | |
| channel_id | Yes | Channel or DM ID | |
| include_all_metadata | No | Pass Slack's include_all_metadata option to conversations.replies | |
| include_rich_message_fields | No | Include Slack message attachments, blocks, metadata, files, and reactions when present |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only and idempotent. The description adds no extra behavioral details such as pagination, response structure, or rate limits. It meets the basic requirement but does not enhance the agent's understanding beyond annotations.
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 a single, clear sentence that conveys the essential purpose without any unnecessary words. It is well-front-loaded and highly concise.
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?
Given no output schema and a moderately complex sibling set, the description could be more complete. It does not mention that replies are returned in order or that the tool may paginate. It adequately conveys the core function 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?
All parameters have schema descriptions (100% coverage), so the description adds no new meaning. The baseline score of 3 is appropriate as the schema already documents the parameters adequately.
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 tool retrieves all replies in a message thread, which distinguishes it from sibling tools like slack_conversations_history (channel history) and slack_get_full_conversation (full conversation).
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 provided on when to use this tool versus alternatives, nor any prerequisites or exclusions. For example, it does not advise that this tool is for replies only, while slack_conversations_history is for channel messages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_health_checkARead-onlyIdempotentInspect
Check if Slack tokens are valid and show authentication status
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and openWorldHint, so the tool's safety and idempotence are clear. The description adds that it checks token validity and auth status, which aligns with annotations but does not provide additional behavioral context beyond them.
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?
Single sentence that is concise and front-loaded. Every word is necessary; no superfluous 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?
Given the tool's simplicity (no parameters, no output schema), the description is adequately complete. It explains the core functionality without omission.
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?
No parameters are defined; schema coverage is 100% as there are none. The description does not need to add parameter semantics, and its simplicity is appropriate.
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?
Description clearly states it checks Slack token validity and authentication status. It is a specific verb+resource pair. However, it does not explicitly distinguish from the sibling tool 'slack_token_status', which may serve a similar function.
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 on when to use this tool versus alternatives like 'slack_refresh_tokens' or 'slack_token_status'. The description only states what it does without context on appropriate usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_list_conversationsARead-onlyIdempotentInspect
List all DMs and channels with user names resolved. Uses cached DMs by default for speed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default 100) | |
| types | No | Comma-separated types: im, mpim, public_channel, private_channel | im,mpim |
| discover_dms | No | If true, actively discover all DMs (slower, may hit rate limits on large workspaces). Default false uses cached DMs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only and idempotent behavior. The description adds that it uses cached DMs by default and can be slower with rate limits when discovering all DMs, which is valuable beyond annotations.
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, front-loaded, no wasted words. Efficient and clear.
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 covers key behaviors and caching, but lacks details on return format or pagination beyond the limit parameter. With no output schema, more detail on the response structure would help completeness.
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 description adds little extra meaning about parameters. It does clarify the caching behavior related to discover_dms, but overall the schema already documents parameters adequately.
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 tool lists DMs and channels with resolved user names. It distinguishes from sibling tools like slack_get_full_conversation or slack_conversations_history by focusing on the list of all conversations.
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 mentions cached DMs by default and the discover_dms parameter for slower full discovery, providing context on when to use each. However, it does not explicitly state when not to use this tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_list_usersBRead-onlyIdempotentInspect
List all users in the workspace
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum users to return (default 500, supports pagination) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds minimal behavioral context beyond 'all users' – no mention of pagination behavior, user status (active vs deactivated), or rate limits. Description carries no contradiction with annotations.
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?
Single sentence, directly states purpose. Efficient but could include a brief usage hint without harming conciseness.
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?
With no output schema and multiple sibling tools, description lacks critical context: what 'all users' includes (bots, deactivated?), pagination details, and expected output structure. Bare minimum not fully met.
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% for the single 'limit' parameter, which explains maximum and pagination. Description adds no additional meaning beyond schema, so baseline 3 is appropriate.
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?
Description 'List all users in the workspace' clearly specifies verb (list) and resource (users), and includes scope (all, workspace). It distinguishes from siblings like slack_users_info (specific user) and slack_users_search (search), making purpose unambiguous.
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 on when to use this tool versus alternatives such as slack_users_info or slack_users_search. Missing context on limitations or exclusions, leaving agents to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_refresh_tokensAIdempotentInspect
Force refresh tokens by extracting from Chrome (requires Slack tab open in Chrome)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true, but the description adds no behavioral context such as side effects, error conditions, or safety. It only states the requirement, which is not a behavior.
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?
A single sentence that is clear and concise with no extraneous information. Every word 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 parameterless tool with no output schema, the description covers the essentials: action, method, and a prerequisite. However, it lacks detail on the outcome (e.g., tokens become valid) or post-conditions, leaving minor 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?
With zero parameters and 100% schema coverage, the description adds meaning by explaining the mechanism ('extracting from Chrome'), which goes beyond the empty schema. Baseline for zero parameters is 4, but the extra context justifies a 5.
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 tool's action ('Force refresh tokens') and method ('by extracting from Chrome'). It includes a prerequisite, distinguishing it from sibling tools that deal with messages or reactions.
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 provides a prerequisite ('requires Slack tab open in Chrome') but does not specify when to use the tool (e.g., token expiration) or when not to. No alternatives are mentioned, leaving the agent without clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_remove_reactionBDestructiveIdempotentInspect
Remove an emoji reaction from a message
| Name | Required | Description | Default |
|---|---|---|---|
| reaction | Yes | Emoji name without colons (e.g., 'thumbsup', 'eyes') | |
| timestamp | Yes | Message timestamp to remove reaction from | |
| channel_id | Yes | Channel or DM ID containing the message |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the agent knows this is a modifying operation. However, the description adds no additional behavioral context (e.g., that only your own reactions can be removed, or that removing a non-existent reaction might silently succeed). The description does not contradict annotations.
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 a single, concise sentence that conveys the essential purpose without any wasted words. It is appropriately front-loaded and easy to parse.
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 removal tool with 3 required parameters and no output schema, the description is adequate but not fully complete. Missing details like 'only your own reactions' or 'idempotent: safe to retry' would improve completeness. The annotations fill in some gaps (destructive, idempotent).
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 baseline is 3. The description does not add any meaning beyond what the schema already provides for the three parameters (channel_id, timestamp, reaction). No additional guidance on format or constraints.
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 verb ('remove') and the resource ('emoji reaction from a message'), making the purpose immediately understandable. It effectively distinguishes from the sibling tool 'slack_add_reaction'.
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 provides no guidance on when to use this tool versus alternatives (e.g., no mention of only being able to remove your own reactions, or that the reaction must exist). An agent would have no context for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_search_messagesBRead-onlyIdempotentInspect
Search messages across the Slack workspace
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of results (max 100, default 20) | |
| query | Yes | Search query (supports Slack syntax like from:@user, in:#channel) | |
| include_rich_message_fields | No | Include Slack message attachments, blocks, metadata, files, and reactions when present |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds no behavioral context beyond 'search', so it does not enhance transparency for an agent.
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?
One concise sentence with no fluff. It could be slightly more structured (e.g., specifying behavior), but for a simple read tool it is adequate.
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?
Given full schema descriptions and comprehensive annotations, the tool is well-specified for a search operation. No output schema exists but search results are standard in Slack API.
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 each parameter is well-described (query syntax, count limit, include_rich_message_fields). The description does not add additional meaning 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?
Title 'Search Messages' and description 'Search messages across the Slack workspace' clearly state the action and scope. It implicitly distinguishes from siblings like slack_conversations_history (channel specific) but doesn't name 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 workspace-wide search but provides no explicit when-to-use or when-not-to-use guidance. No alternatives are mentioned, though the sibling list offers similar tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_send_messageADestructiveInspect
Send a message to a channel or DM
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Message text (supports Slack markdown) | |
| thread_ts | No | Thread timestamp to reply to (optional) | |
| channel_id | Yes | Channel or DM ID to send to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true (mutation) and readOnlyHint=false. The description adds no additional behavioral context beyond stating the operation, which is adequate but minimal.
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?
Single sentence with no unnecessary words. Front-loaded with the core action and target.
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?
Given the low complexity, 3 parameters with full schema descriptions, and no output schema, the description is sufficient. It could mention error conditions or permissions, but not necessary.
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 description adds no extra meaning beyond the parameter names and their schema descriptions. Baseline score 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 clearly states the action (send), resource (message), and target (channel or DM). It distinguishes from sibling tools like slack_add_reaction which perform different actions.
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 explicit guidance on when to use or when not to use this tool. Usage is implied by the description but lacks explicit context or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_token_statusARead-onlyIdempotentInspect
Check token health, age, auto-refresh status, and cache stats
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint true. The description adds meaningful context by listing exactly what is checked (health, age, auto-refresh, cache stats), enhancing transparency beyond annotations. No contradiction.
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 a single, concise sentence that front-loads the key information. Every word earns its place, with no superfluous 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?
Given the tool's simplicity (no params, no output schema, strong annotations), the description fully addresses what the tool does. It is complete for an agent to invoke correctly.
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 add parameter semantics as there are none.
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 specific verbs and resources: 'check token health, age, auto-refresh status, and cache stats'. It clearly distinguishes from sibling tools like slack_health_check (general health) and slack_refresh_tokens (token refresh).
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 (to check token status), but does not provide explicit when-not-to-use or alternatives. However, with zero parameters and a simple read-only purpose, the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_users_infoBRead-onlyIdempotentInspect
Get detailed information about a Slack user
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | Slack user ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint, idempotentHint, and openWorldHint, so the description's lack of behavioral details is partly excused. The description adds no extra context beyond annotations, but does not contradict them.
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 a single, concise sentence with no wasted words. It could be slightly more informative, but it is efficiently structured.
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?
Given the low complexity (1 param, no output schema, good annotations), the description is minimally adequate. However, it lacks information about what detailed information is returned (e.g., profile fields, presence), which would help an agent without 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?
Schema coverage is 100% (1 parameter with a brief description). The description adds no additional meaning beyond what the schema provides for 'user_id', so baseline of 3 is appropriate.
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 'Get detailed information about a Slack user' has a clear verb ('Get') and resource ('detailed information about a Slack user'). However, it does not differentiate from siblings like 'slack_list_users' or 'slack_users_search', which also return user data.
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 provides no guidance on when to use this tool vs alternatives. It doesn't mention prerequisites (e.g., requiring a user ID) or when not to use it (e.g., for listing all users). Sibling tools exist for searching and listing, so this omission is significant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_users_searchARead-onlyIdempotentInspect
Search workspace users by name, display name, or email. Case-insensitive partial match.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (default 20) | |
| query | Yes | Search term to match against name, display name, real name, or email |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds value by specifying case-insensitive partial match and the exact fields searched (name, display name, email). No contradictions.
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?
Single sentence with no waste. Efficiently conveys key information.
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?
Given low complexity (two parameters, one required) and no output schema, the description is largely complete. It covers purpose, behavior, and input fields. However, it omits details about output structure or pagination behavior (e.g., limit parameter behavior).
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 schema descriptions are thorough. Description's mention of searchable fields largely overlaps with schema description. Adds minimal new information beyond what schema already provides.
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?
Clearly states it searches workspace users by specific fields (name, display name, email) and describes the match behavior (case-insensitive partial match). Distinguishes from siblings like slack_list_users and slack_users_info.
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?
Clear context that this tool is for searching users by query, but does not explicitly contrast with alternatives or provide when-not-to-use guidance. Implicit from sibling names but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_workflowsARead-onlyIdempotentInspect
List all saved workflow profiles from ~/.slack-mcp-workflows.json. Optionally filter by workflow_kind. Returns profile_name, channels, priority_people, retention_mode, summary_cadence, structured_keys, created_at, updated_at.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_kind | No | Optional filter — return only profiles of this workflow_kind |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), the description adds the specific source file (~/.slack-mcp-workflows.json) and lists the return fields, providing operational context. No contradictions with annotations.
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 with no waste: front-loaded with the main action, then filtering, then return fields. Every sentence adds value. Highly efficient.
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?
Given the tool's simplicity (list with one optional filter), the description fully covers purpose, source, return fields, and filtering. No output schema needed as fields are enumerated. Completeness for this tool is high.
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% for the single parameter. The tool description reiterates the optional filter but does not add new meaning beyond the schema's description. Baseline 3 is appropriate.
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 'List all saved workflow profiles from ~/.slack-mcp-workflows.json', specifying the action (list), resource (workflow profiles), and source (local file). It distinguishes from sibling slack_workflow_save which is for saving/updating workflows.
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 provides clear context for when to use this tool (to retrieve saved workflow profiles) but does not explicitly state when not to use it or compare with alternatives like slack_workflow_save. However, the purpose is obvious from the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_workflow_saveAIdempotentInspect
Save or update a workflow profile that binds a workflow_kind (support_inbox | incident_room | exec_brief | product_launch_watch | custom) to channels, priority people, retention mode, and summary cadence. Stored locally at ~/.slack-mcp-workflows.json. slack_catch_me_up reads the profile by name and returns evidence shaped by its workflow_kind.
| Name | Required | Description | Default |
|---|---|---|---|
| channels | No | Slack channel IDs to read (e.g. ['C012345', 'C067890']) | |
| profile_name | Yes | Unique name for this workflow profile (e.g. 'morning-exec-brief', 'on-call-rotation') | |
| workflow_kind | Yes | Workflow kind. Determines the output_contract keys slack_catch_me_up returns for this profile. | |
| retention_mode | No | Retention preference recorded on the profile. Default ephemeral. | |
| priority_people | No | Slack user IDs whose messages get extra weight in summaries | |
| summary_cadence | No | How often this profile expects to be caught up on. Sets slack_catch_me_up's default window: 24 hours for on_demand and daily_8am, 7 days for weekly_monday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description adds beyond that by disclosing the local storage path (~/.slack-mcp-workflows.json) and explaining that workflow_kind influences the output contract of slack_catch_me_up, which is additional behavioral context not present in annotations. No contradiction exists.
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 exactly two sentences. The first sentence states the action and the bound elements; the second reveals storage and consumer linkage. Every phrase earns its place, and the most important action verb is front-loaded. No fluff 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 tool with 6 parameters, all documented in schema, and no output schema, the description is complete: it explains the purpose, storage, and how the saved profile is used by a sibling. It omits error handling and return values, but those are either covered by schema or not needed given annotations and the tool's nature. An agent can correctly decide when to call it and what to expect.
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?
Although the schema covers all parameters at 100%, the description adds significant cross-tool semantics: it explains that summary_cadence sets slack_catch_me_up's default window (24h vs 7d) and that workflow_kind determines which output_contract keys are returned. This goes beyond the schema property descriptions, giving the agent a deeper understanding of how parameters affect downstream behavior.
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 ('Save or update') and resource ('workflow profile'), enumerates what the profile binds (workflow_kind, channels, priority people, retention mode, summary cadence), and lists the valid workflow_kind values. It clearly differentiates from siblings by noting that slack_catch_me_up reads the profile by name, positioning this tool as the write counterpart. No ambiguity remains.
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 provides clear context by explaining that the profile is stored locally and later consumed by slack_catch_me_up, implicitly establishing when to use this tool (to create/update profiles) vs. when to use the consumer. However, it does not explicitly state exclusions or alternative tools (e.g., 'use slack_workflows to list profiles'), so it stops short of fully explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool has a distinct action and target resource: threads, reactions, unread counts, user search, message sending, token management, workflow profiles, and conversation history all occupy clear boundaries. Even overlapping areas like token_status, health_check, and refresh_tokens address different facets (status vs. refresh). No two tools appear to do the same thing.
All tools follow a consistent `slack_` prefix and snake_case naming. Most use an intuitive verb_noun order (get_thread, add_reaction, send_message), though a few like `slack_conversations_mark` and `slack_conversations_unreads` invert to noun_verb. Overall the pattern is predictable and easy to scan, with only minor deviations.
At 19 tools, the surface is slightly larger than the typical 3–15 sweet spot, but the breadth is justified given the domain spans messaging, reactions, search, user administration, token management, and a custom workflow system. No tools feel redundant, though a few (e.g., `slack_users_info` vs. `slack_users_search`) overlap slightly in purpose. The count is on the high side but still well-scoped.
The toolset covers core lifecycle actions for messages, threads, reactions, and users, plus advanced features like workflow profiles and full conversation exports. Obvious gaps include editing/deleting messages, creating or leaving channels, and pinning content, but these are minor and agents can work around them. The inclusion of token management and workflow automation makes the surface feel complete for its intended use case.
Maintenance
Related MCP Connectors
OAuth 2.1 short-link tools for AI agents with scoped tokens, approvals, audit logs, and revocation.
Full LinkedIn access for AI agents: leads, messaging, and campaigns with safe limits built in.
SaaS intelligence for AI agents. 5 unified tools cover 1,000+ services with 91-96% token savings.
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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.
- AlicenseAqualityDmaintenanceIntegrates AI assistants with Slack workspaces using OAuth 2.0 authenticated user tokens for secure, multi-functional interaction. It enables comprehensive operations including channel management, message searching, file handling, and reaction management through natural language.20169MIT
- FlicenseAqualityDmaintenanceEnables AI agents to interact with Slack using a user token, providing full access to message search, channel history, DMs, and posting as the user.8
- AlicenseBqualityCmaintenanceEnables AI assistants to interact with Slack workspaces, providing tools for reading messages, posting content, managing channels, and more.2236MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jtalk22/slack-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server