Skip to main content
Glama
oviron

slack-personal-mcp

by oviron

slack-personal-mcp

An MCP server that works in Slack with your own user token (xoxp-). Messages, files, reactions and status changes come from you, without the "via app" badge a bot token adds.

  • Every tool that touches Slack takes an explicit workspace alias, so a read or a send never lands in the wrong workspace by default.

  • A style gate checks outgoing text for AI typography (em dash, curly quotes, ellipsis character), stock AI phrases and unapproved promises before anything is sent.

  • SLACK_READ_ONLY=1 hides every tool that changes Slack or local files; SLACK_WRITE_CHANNELS limits writes to listed conversations.

It runs over stdio on your machine. The official Slack MCP server is a hosted service with OAuth and admin approval; this one is for a person who wants their own token on their own computer.

Tools

30 tools. In the table, R is read-only, W writes to Slack, D deletes or overwrites something. SLACK_READ_ONLY=1 leaves the 19 R tools.

Tool

What it does

User token scopes

slack_list_workspaces()

R

Configured aliases and whose token each one is (auth.test)

none

slack_lint(text)

R

Run the style gate on a draft without sending

none

slack_send_message(workspace, channel_id, text, thread_ts?, reply_broadcast?, format?, unfurl_links?, allow_promise?)

W

Post as you

chat:write

slack_edit_message(workspace, channel_id, ts, text, format?, allow_promise?)

W

Edit one of your messages

chat:write; *:history by type to check the author

slack_delete_message(workspace, channel_id, ts)

D

Delete one of your messages

chat:write; *:history by type to check the author

slack_schedule_message(workspace, channel_id, text, post_at, thread_ts?, reply_broadcast?, format?, allow_promise?)

W

Schedule a message up to 120 days ahead

chat:write

slack_list_scheduled(workspace, channel_id?, limit?, cursor?)

R

Your scheduled messages, soonest first

none

slack_cancel_scheduled(workspace, channel_id, scheduled_message_id)

D

Cancel a scheduled message

chat:write

slack_get_permalink(workspace, channel_id, ts)

R

Link to a message

none

slack_add_reaction(workspace, channel_id, ts, name)

W

React as you (name without colons, e.g. eyes)

reactions:write

slack_remove_reaction(workspace, channel_id, ts, name)

D

Remove your reaction

reactions:write

slack_get_reactions(workspace, channel_id, ts)

R

Reactions on a message, with who reacted

reactions:read, users:read

slack_set_status(workspace, text?, emoji?, expires_in_minutes?, allow_promise?)

W

Set or clear your status

users.profile:write

slack_mark_read(workspace, channel_id, ts)

W

Move your read marker

channels:write, groups:write, im:write or mpim:write by conversation type

slack_unread(workspace, channel_ids, limit?)

R

Messages after your read marker in up to 20 named conversations

*:read and *:history by type

slack_read_channel(workspace, channel_id, limit?, cursor?, oldest?, latest?, inclusive?)

R

One page of channel or DM history

channels:history, groups:history, im:history, mpim:history by type

slack_read_thread(workspace, channel_id, thread_ts, limit?, cursor?, oldest?, latest?, inclusive?, all_pages?, max_pages?)

R

A thread, one page or all of it

same as above

slack_search_messages(workspace, query, count?, page?, sort?, sort_dir?, in_channel?, from_user?, before?, after?, has?)

R

Message search with Slack query syntax

search:read

slack_search(workspace, query, content_types?, cursor?, limit?, channel_types?)

R

Real-time Search over messages, files, channels and users

search:read.public; search:read.private, search:read.im, search:read.mpim, search:read.files, search:read.users for those types

slack_find_user(workspace, query, limit?, refresh?)

R

People by name, exact email or U... id

users:read; users:read.email for email

slack_find_channel(workspace, query, limit?, refresh?, types?)

R

Conversations by name, including DMs with types="im,mpim"

channels:read, groups:read, im:read, mpim:read by type; users:read for DM names

slack_user_info(workspace, user_id)

R

Name, title, email, timezone, status

users:read; users:read.email for the email

slack_channel_info(workspace, channel_id)

R

Name, topic, purpose, member count, your read marker

*:read by type

slack_list_usergroups(workspace, include_users?)

R

User groups and member counts

usergroups:read

slack_list_emoji(workspace, query?)

R

Custom emoji

emoji:read

slack_read_canvas(workspace, canvas_id, content_type?)

R

Canvas as Markdown or HTML

canvases:read

slack_upload_file(workspace, channel_id, file_path, initial_comment?, title?, thread_ts?, allow_promise?)

W

Upload a local file as you

files:write

slack_file_info(workspace, file_id)

R

File metadata and every message that shares it

files:read

slack_list_files(workspace, channel_id?, user_id?, types?, count?, page?)

R

Files in a channel or by a person, newest first

files:read

slack_download_file(workspace, file_id, dest_dir?)

D

Save a file locally (default ~/Downloads/slack)

files:read

*:read and *:history stand for the channels:, groups:, im: or mpim: scope that matches the conversation type. Message authors get names from a directory cache, which needs users:read. In every writing tool channel_id may be a user id U...: the message, file or reaction goes to your DM with that person, which needs im:write.

If a scope is missing, the error names it. Add it under User Token Scopes, reinstall the app and put the new token in .env.

Related MCP server: Slack MCP Server

How the tools behave

Sending. format="markdown" (the default) sends standard Markdown as markdown_text, up to 12,000 characters; format="mrkdwn" sends Slack's own markup as text, up to 40,000. Link previews are off unless unfurl_links=true. To reply in a thread, pass the ts of the thread's first message as thread_ts, not the ts of a reply. reply_broadcast=true also shows the reply in the channel.

Your messages only. slack_edit_message and slack_delete_message check the author first and refuse messages by anyone else, even when an admin token could change them.

Approval. The MCP client, not this server, asks you before it calls a tool. Tools carry MCP annotations (read-only, destructive, idempotent), so a client can ask only for writes. Keep approval on for writes and uploads and read the text or path before you allow it.

Files. slack_upload_file reads and slack_download_file writes only inside SLACK_FILE_ROOTS (default: home and the temp folders). Hidden files and folders such as ~/.ssh or .env, and ~/Library under the default roots, are refused, symlinks included. Downloads go to a temporary file and replace an existing copy only once the size matches. Files stored outside Slack return their external_url instead.

Pages. Reads return one page at a time and say whether more exist. slack_read_channel returns {messages, next_cursor, has_more}: pass next_cursor back as cursor with the same other arguments. slack_read_thread adds complete, and with all_pages=true follows the cursor up to max_pages (default 10). slack_search_messages returns {messages, total, page, pages}; slack_search and slack_list_scheduled return next_cursor. oldest and latest take Slack timestamps such as 1729612345.123456.

Messages. Each message keeps Slack's ts and text and adds time (ISO 8601, UTC), user_id and user_name, thread fields, reactions and files. Text from legacy attachments is in attachments_text, text from blocks in blocks_text; a rich_text block that only repeats text is left out. Empty fields are dropped.

Names. slack_find_user and slack_find_channel search full users.list and conversations.list directories, cached in memory for an hour per workspace; refresh=true reloads. An exact email goes through users.lookupByEmail and a U... id through users.info, without the directory.

Unread. Slack's API has no unread inbox like the app has. slack_unread takes the conversations you name and counts messages from others after your read marker.

Search. slack_search_messages uses the classic search.messages. slack_search uses the Real-time Search API, which works for internal apps; if your workspace does not offer it, the error says so.

Results. Tools return structured content with an output schema. Errors come back as MCP tool errors.

Style gate

src/slack_personal_mcp/style.py checks every message, edit, scheduled message, status, upload comment and file title before it leaves:

  • Errors block the send: AI typography (em and en dash, ellipsis character, curly quotes, non-breaking space, bullet character) and stock AI phrases.

  • Warnings block the send unless allow_promise=true: concrete promises and deadlines.

Code, URLs, Slack mentions (<@U...>, <#C...>, <!here>) and quoted lines are not checked; link labels are. Each finding gives a zero-based character range. Phrase lists cover English and Russian. SLACK_STYLE_GATE=off turns the gate off for sends; slack_lint works either way.

Setup

Requires Python 3.10+ and uv.

git clone https://github.com/oviron/slack-personal-mcp
cd slack-personal-mcp
uv sync

uv run pytest runs the offline tests.

Slack app and token

Each workspace needs its own Slack app.

  1. At https://api.slack.com/apps choose Create New App, then From an app manifest, pick the workspace and paste slack-app-manifest.yaml.

  2. Install to Workspace. Workspaces that need admin approval for apps ask an admin first.

  3. Copy the User OAuth Token (xoxp-...) from OAuth & Permissions.

The manifest asks for every scope in the table above. Remove the ones you don't need before installing; the matching tools then fail with missing_scope. channels:write and groups:write are only for slack_mark_read, but they also allow managing channels, so leave them out if you don't need it.

Keep token rotation off: the manifest sets token_rotation_enabled: false. With rotation on, Slack issues xoxe.xoxp- tokens that expire after 12 hours, this server does not refresh them, and Slack does not let you turn rotation off again. An app with rotation on has to be replaced by a new one.

The app is internal to your workspace, so Slack's May 2025 rate limits for commercially distributed apps (one conversations.history call a minute) do not apply. Don't distribute one app to other workspaces: create one per workspace.

Configuration

Tokens come from the environment, or from .env next to server.py (ignored by git; keep it chmod 600). Copy .env.example to start:

SLACK_USER_TOKEN_ACME=xoxp-...
SLACK_USER_TOKEN_SIDE_PROJECT=xoxp-...

Each SLACK_USER_TOKEN_<ALIAS> adds a workspace; SIDE_PROJECT becomes the alias side-project. slack_list_workspaces shows whose token each alias holds:

{"workspaces": [{"workspace": "acme", "configured": true, "team": "Acme", "team_id": "T0123",
  "url": "https://acme.slack.com/", "user": "jane", "user_id": "U0456"}]}

Variable

Meaning

SLACK_USER_TOKEN_<ALIAS>

User token for one workspace

SLACK_ENV_FILE

Read this file instead of .env next to server.py; empty reads none

SLACK_STYLE_GATE

off sends without the style gate (default on)

SLACK_READ_ONLY

1 hides every tool that changes Slack or local files

SLACK_FILE_ROOTS

Folders, separated by :, that uploads read from and downloads write to; default home and temp

SLACK_WRITE_CHANNELS

Comma-separated ids (C..., D..., U...) writes may target; a DM by user id needs that U... listed; unset allows any

Registering with a client

The server speaks MCP over stdio. Point the client at the clone's Python and server.py; the examples use /path/to/slack-personal-mcp.

Claude Code:

claude mcp add slack-personal -- /path/to/slack-personal-mcp/.venv/bin/python /path/to/slack-personal-mcp/server.py

Codex, in ~/.codex/config.toml:

[mcp_servers.slack-personal]
command = "/path/to/slack-personal-mcp/.venv/bin/python"
args = ["/path/to/slack-personal-mcp/server.py"]

Claude Desktop (claude_desktop_config.json) and Cursor (.cursor/mcp.json):

{
  "mcpServers": {
    "slack-personal": {
      "command": "/path/to/slack-personal-mcp/.venv/bin/python",
      "args": ["/path/to/slack-personal-mcp/server.py"]
    }
  }
}

Without a clone, uv runs a tagged release straight from GitHub. There is no server.py next to it, so name the env file:

SLACK_ENV_FILE=~/.config/slack-personal-mcp/.env uvx --from git+https://github.com/oviron/slack-personal-mcp@v0.2.3 slack-personal-mcp

Troubleshooting

Error

What to do

missing_scope

Add the scope the error names, reinstall the app, replace the token

not_in_channel

Join the conversation in Slack first

channel_not_found

Check the id; private conversations and DMs need you to be a member

invalid_auth, token_revoked, account_inactive

Create a new user token and replace it in .env

token_expired

Token rotation is on and cannot be turned off: create a new app from the manifest and use its token

ratelimited

The server already waited for Retry-After within 30 seconds; try again later

outcome unknown

A send failed after it left your machine and was not retried; check the channel before sending again

feature_not_enabled from slack_search

Real-time Search is not available in this workspace; use slack_search_messages

Changes to the code or .env take effect when the client restarts the server.

Releasing

The package is not published to PyPI or the MCP Registry; releases are git tags.

  1. Bump the version in pyproject.toml and src/slack_personal_mcp/__init__.py, run uv lock, then merge.

  2. Tag vX.Y.Z on main and create a GitHub release.

License

MIT

Available Tools

30 tools
slack_add_reactionA
Idempotent

Add an emoji reaction to a message AS THE USER (reactions.add, needs reactions:write). channel_id: as in slack_send_message. ts: the message timestamp. name: emoji name without colons, e.g. eyes.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes
nameYes
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare non-readOnly, idempotent, non-destructive. The description adds real value beyond them: the reaction is posted as the authenticated user and requires the reactions:write scope, which is auth context an agent needs. It stops short of noting side effects like notifications to the message author.

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

Conciseness4/5

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

Four tight lines, each doing work, with the critical 'AS THE USER' scoping front-loaded. The trailing newline and slightly clipped last fragment cost a little polish but nothing is wasted.

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

Completeness3/5

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

The output schema handles return values and annotations cover safety, but with 4 required parameters at 0% schema coverage the description leaves 'workspace' completely undefined and only indirectly defines channel_id. That omission matters for a call that will fail without a valid workspace.

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

Parameters3/5

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

Schema coverage is 0%, so the description must carry parameter meaning. It explains ts ('message timestamp') and name ('emoji name without colons, e.g. eyes') well, but punts channel_id to another tool's docs and says nothing at all about the required 'workspace' parameter.

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

Purpose5/5

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

States a specific verb and resource ('Add an emoji reaction to a message'), names the underlying API operation, and clarifies the acting identity ('AS THE USER'). This cleanly separates it from slack_remove_reaction and slack_get_reactions in the sibling list.

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

Usage Guidelines3/5

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

Usage is implied by the operation but there is no explicit guidance on when to prefer this over alternatives or any preconditions beyond the scope requirement. An agent can infer the use case, but nothing is spelled out.

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

slack_cancel_scheduledC
DestructiveIdempotent

Cancel a scheduled message (chat.deleteScheduledMessage, chat:write).

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceYes
channel_idYes
scheduled_message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the risk profile is covered. The description adds genuinely useful context by naming the required scope (chat:write) and the API method, but says nothing about irreversibility, failure when the message already posted, or rate limiting.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the parenthetical method/scope hint is terse and useful. It is efficient, though the tightness comes partly from under-specification rather than disciplined editing.

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

Completeness2/5

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

An output schema exists so return values need not be explained, but for a destructive, open-world mutation with 0% parameter documentation the description should say where the scheduled message ID comes from and what happens on failure. Those gaps leave the agent under-informed for a 3-required-parameter write operation.

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

Parameters2/5

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

Schema description coverage is 0% across three required parameters, so the schema offers only bare titles. The description does not clarify any of them — e.g. whether workspace is a name or ID, or what format scheduled_message_id takes — so it fails to compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb and resource ('Cancel a scheduled message') and even names the underlying API method, which cleanly separates it from slack_delete_message (deletes an already-posted message) and slack_schedule_message. It does not explicitly call out those siblings, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: nothing tells the agent where scheduled_message_id comes from (presumably slack_list_scheduled), nor how this differs from simply deleting a message. Usage is only inferable from the tool name and the required ID parameter.

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

slack_channel_infoB
Read-only

Name, kind, topic, purpose, member count and your read marker via conversations.info; needs channels:read/groups:read/im:read/mpim:read for the conversation type.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description earns credit for adding what annotations cannot: the specific OAuth scopes required and the fact that the needed scope varies with the conversation type (channel/group/im/mpim). That is actionable pre-flight information an agent would otherwise only discover from an auth failure.

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

Conciseness4/5

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

Two dense clauses with zero filler: the returned fields first, then the auth precondition. It is telegraphic to the point of being fragmentary, but every phrase carries information and the structure is front-loaded.

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

Completeness3/5

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

An output schema exists, so return values need no prose, and the auth scopes are covered. What remains missing is anything about the two required inputs — particularly how workspace is identified and whether channel_id type must be known in advance — which is material for a lookup tool that can't be called correctly without that.

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

Parameters2/5

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

Schema description coverage is 0% and neither parameter has a title beyond the raw field name, so the description carries the full burden and falls short: it never explains what 'workspace' means (slug, ID, or name) or that 'channel_id' must match the conversation type implied by the scopes. Only the loosest hint ('for the conversation type') gestures at the ID's semantics.

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

Purpose4/5

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

The description names the operation precisely by enumerating the fields returned (name, kind, topic, purpose, member count, read marker) and cites the underlying API call (conversations.info), which tells an agent this is a single-conversation lookup rather than a search. It does not explicitly contrast with siblings like slack_find_channel, but the field list makes the distinction inferable.

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

Usage Guidelines3/5

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

Usage is only implied: the mention of conversation-type-specific scopes hints that the caller must already know the conversation type, and by extension that this tool operates on a known channel_id. There is no explicit statement of when to prefer this over slack_find_channel or slack_read_channel, nor any when-not guidance.

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

slack_delete_messageA
Destructive

Delete one of YOUR messages (chat.delete, chat:write). Messages by others are refused even with an admin token. Cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered structurally. The description adds real value beyond them: the irreversibility warning, the ownership restriction that even an admin token cannot bypass, and the required OAuth scope. It doesn't cover response shape or error behavior, but that is partly handled by the output schema.

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

Conciseness5/5

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

Three short sentences, each carrying distinct information: what it deletes, the ownership/auth constraint, and the irreversibility. Everything is front-loaded with zero filler.

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

Completeness3/5

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

Annotations and the output schema cover the safety profile and return values, so the description doesn't need to. However, with 0% schema coverage on three parameters, the description leaves a meaningful gap around how to identify the target message—the single most error-prone part of this call.

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

Parameters2/5

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

Schema description coverage is 0% and none of the three parameters (ts, workspace, channel_id) are explained in the description. Notably, 'ts'—the message timestamp identifier, which is a Slack-specific concept an agent could easily get wrong—is left entirely undocumented in both places.

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

Purpose4/5

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

States a specific verb+resource ('Delete one of YOUR messages') and names the underlying Slack API call plus required scope (chat.delete, chat:write). Ownership scoping is spelled out clearly. It doesn't explicitly differentiate from the closest sibling slack_edit_message, but the verb makes the distinction obvious enough.

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

Usage Guidelines4/5

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

'Delete one of YOUR messages' establishes the applicable context, and 'Messages by others are refused even with an admin token' functions as an explicit when-not constraint. It doesn't point to an alternative tool, but the boundary is unambiguous for this operation.

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

slack_download_fileA
Destructive

Download a Slack file by id to a local folder (needs files:read). Returns the saved path. Saved as <file_id>-, replacing an earlier copy only once the new one is complete. dest_dir: inside SLACK_FILE_ROOTS, like slack_upload_file. External files (Google Drive and the like) are not downloaded: the reply gives their external_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYes
dest_dirNo~/Downloads/slack
workspaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

With annotations already flagging destructiveHint/openWorldHint, the description still adds real context: required OAuth scope, returned saved path, the <file_id>-<name> naming convention, and above all the atomic 'replace only once the new one is complete' overwrite semantics that explain the destructive flag. External files returning external_url rather than downloading is also disclosed.

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

Conciseness4/5

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

Front-loaded with the action and permission need, then the return value and the two constraints that actually change behavior. Dense but each clause earns its place; the line-broken layout is slightly harder to scan than a single tight paragraph.

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

Completeness4/5

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

An output schema exists, so return-shape detail is optional, yet the description still names the path and external fallback. Combined with the safety annotations, almost everything needed to call correctly is present; only the workspace parameter and the dest_dir default (~/Downloads/slack) are unaddressed.

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

Parameters4/5

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

Schema coverage is 0%, so the description must carry the load; it does for dest_dir (must live inside SLACK_FILE_ROOTS, matching slack_upload_file) and implies file_id is the Slack file identifier. The workspace parameter is left completely unexplained, which is the remaining gap.

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

Purpose5/5

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

States a specific verb and resource ('Download a Slack file by id to a local folder') and immediately scopes the behavior further by excluding external files such as Google Drive. It is clearly distinguishable from slack_upload_file and slack_file_info by naming the counterpart tool and the external_url fallback.

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

Usage Guidelines4/5

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

The 'needs files:read' prerequisite and the SLACK_FILE_ROOTS restriction tell the agent when calling will fail, and the external-file exclusion routes the agent to reading external_url instead. No explicit 'use this instead of X' framing, but the conditional guidance is strong.

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

slack_edit_messageA
Idempotent

Replace the text of one of YOUR messages (chat.update, chat:write). Messages by others are refused even with an admin token. Same style gate and format as slack_send_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes
textYes
formatNomarkdown
workspaceYes
channel_idYes
allow_promiseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare mutation, idempotency, and non-destructiveness. The description adds useful context beyond annotations: ownership enforcement even for admins, required Slack scopes, and that formatting follows slack_send_message. It does not discuss rate limits or failure modes beyond ownership refusal.

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

Conciseness5/5

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

The description is three short sentences, front-loaded with the core action and immediately followed by the most important constraint. Every sentence adds useful information.

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

Completeness3/5

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

Given the mutation behavior and annotations, the description covers safety and ownership well, and an output schema exists. However, with six parameters and 0% schema description coverage, it leaves important parameter semantics undocumented.

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

Parameters2/5

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

Schema description coverage is 0% for six parameters, so the description must carry the burden. It only clarifies that text is the replacement content and implies format follows slack_send_message, but it does not explain ts, channel_id, workspace, or allow_promise.

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

Purpose5/5

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

The description uses a specific verb and resource: replace the text of one of YOUR messages. It distinguishes this from sending and deleting messages by stating the ownership constraint and naming the underlying Slack API methods.

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

Usage Guidelines4/5

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

It clearly states the primary condition for use: only your own messages can be edited, and messages by others are refused even with an admin token. It does not explicitly compare against delete_message or send_message alternatives, but the ownership constraint gives strong practical guidance.

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

slack_file_infoA
Read-only

File metadata by id (files.info, needs files:read): name, type, size, owner, mode, and every message that shares it (channel, ts, thread_ts). External files carry external_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYes
workspaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already cover the read-only/open-world profile, and the description adds real context beyond them: the required OAuth scope, the backing API method, and the notable behavior that every message sharing the file is returned (channel, ts, thread_ts). The external_url caveat for external files is a useful conditional disclosure.

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

Conciseness5/5

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

A single dense sentence that front-loads the resource, scope requirement, and returned shape with no filler; the parenthetical field enumeration is compact and each clause earns its place.

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

Completeness4/5

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

With an output schema present, the description needn't restate return values, yet it usefully summarizes them; scope and safety are covered via annotation plus the 'files:read' note. The remaining gap is the undocumented workspace parameter, which is required.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry parameter meaning and largely does not. It clarifies that file_id is an identifier but not its format (Slack file id vs. permalink), and the required 'workspace' parameter is never mentioned at all — no hint whether it takes a name, subdomain, or id.

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

Purpose4/5

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

States a specific resource and operation ('File metadata by id'), names the backing API method (files.info), and enumerates returned fields, which distinguishes it cleanly from slack_list_files and slack_download_file. It stops short of explicitly naming those siblings, but the verb+resource pairing is unambiguous.

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

Usage Guidelines3/5

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

'needs files:read' gives a concrete prerequisite and calling it 'by id' implies you must already have a file id (e.g. from slack_list_files). However, it never names an alternative, so the agent must infer that slack_download_file is for content and slack_list_files is for discovery.

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

slack_find_channelA
Read-only

Find non-archived conversations by name; types: public_channel,private_channel,im,mpim (comma-separated). Needs channels:read/groups:read/im:read/mpim:read by type; users:read for DM names. Refresh reloads the cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
typesNopublic_channel,private_channel
refreshNo
workspaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds genuinely new context: it excludes archived conversations, states which OAuth scopes are needed per type (including users:read for DM name resolution), and explains that 'refresh' reloads a cache — a non-obvious side effect. No return-format detail, but that is minor given the output schema.

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

Conciseness4/5

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

Two dense sentences, front-loaded with the core action and no filler. The telegraphic style ('Needs channels:read/groups:read/...') is efficient but borders on cryptic for the permission clause.

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

Completeness3/5

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

Output schema exists so return values need not be explained, and permission/caching behavior is covered well. However, for a name-lookup tool with zero schema parameter descriptions, the absence of any statement about how 'query' is matched (substring, prefix, fuzzy) or what 'limit' controls leaves a real gap an agent needs to call it correctly.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It usefully enumerates the valid 'types' values and the comma-separated format (no enums exist in the schema) and explains 'refresh' as a cache reload, but says nothing about 'query' matching semantics, 'workspace', or 'limit', leaving three of five parameters undocumented.

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

Purpose4/5

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

States a specific verb and resource ('Find non-archived conversations by name') with a scope qualifier (non-archived) and enumerates the conversation types it covers. An agent can tell this apart from slack_channel_info or slack_search, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

Usage is implied by the scope ('by name', non-archived) but there is no explicit guidance on when to prefer this over slack_channel_info, slack_search, or slack_list_workspaces. The type/permission notes hint at configuration choices rather than routing decisions.

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

slack_find_userA
Read-only

Find people by name via cached users.list (users:read); refresh bypasses the one-hour cache. Exact email uses users.lookupByEmail (users:read.email); U.../W... uses users.info (users:read).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
refreshNo
workspaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value with the one-hour cache and the refresh-bypass behavior plus the required scopes per path. It stops short of describing result shape or lookup failure modes.

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

Conciseness4/5

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

Two dense, front-loaded sentences with no filler; the main name-lookup path is stated first. The final line is truncated ('U.../W... uses users.info'), which slightly hurts readability.

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

Completeness4/5

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

An output schema exists so return values need not be described. Query and refresh semantics plus the cache/permission context are covered; only 'limit' and 'workspace' are left implicit, which is a minor gap for a 4-param tool.

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

Parameters3/5

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

Schema coverage is 0%, so the description must carry parameter meaning. It effectively explains what 'query' may contain (name, email, ID) and what 'refresh' does, but 'limit' and 'workspace' are never addressed.

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

Purpose5/5

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

States a specific verb and resource ('Find people by name via cached users.list') and immediately distinguishes the underlying API path by query type (name vs email vs U.../W... ID). An agent can tell this is a user-lookup tool and not a generic search tool.

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

Usage Guidelines4/5

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

Gives explicit routing rules: exact email goes to users.lookupByEmail, U.../W... IDs go to users.info, everything else hits the cached users.list. It does not explicitly contrast with sibling slack_user_info, which is the closest ambiguity, so it falls short of a 5.

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

slack_get_reactionsA
Read-only

Get message reaction names, counts and users; users_complete flags partial lists. Needs reactions:read and users:read for cached user names.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, yet the description adds real behavioral context beyond them: the required scopes (reactions:read, users:read) and the fact that user lists can be partial, flagged by users_complete. The partial-data warning is exactly the kind of caveat annotations cannot express.

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

Conciseness5/5

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

Two short sentences, zero filler, front-loaded with what is returned and followed by the prerequisite scopes. Every clause carries information.

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

Completeness3/5

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

Return values are covered by the output schema and safety by the annotations, and permissions are stated. But with three undocumented required parameters and no format guidance for ts, an agent can still mis-call it; the description is adequate rather than complete.

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

Parameters2/5

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

All three required parameters (workspace, channel_id, ts) have 0% schema description coverage, so the description carries the full burden. It does not explain any of them, and in particular gives no hint about the ts message-timestamp format, which is the one parameter an agent is most likely to get wrong.

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

Purpose4/5

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

States a specific verb and resource ('Get message reaction names, counts and users') and names the fields returned, which separates it from the write-side siblings slack_add_reaction and slack_remove_reaction by implication. It stops short of explicitly contrasting itself with those siblings, so it is clear but not sibling-differentiated.

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

Usage Guidelines3/5

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

There is no explicit when-to-use or when-not-to-use statement and no named alternative. Usage is only implied by the name and the returned fields: an agent infers this is the read counterpart to add/remove reaction. That is implied usage, not guidance.

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

slack_lintA
Read-only

Dry-run the style gate on a draft without sending. clean=true means it would pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful detail that nothing is transmitted and that the result field clean=true signals a pass — genuine context beyond the annotations.

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

Conciseness5/5

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

Two short sentences with the non-sending guarantee and the key output flag front-loaded; nothing is wasted.

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

Completeness4/5

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

Trivial schema, an output schema that documents the return shape, and annotations for safety. The gist of the output flag is called out in the description; only the draft-parameter mapping is unspoken, which is minor here.

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

Parameters3/5

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

A single required param named 'text' with 0% schema description coverage; the description only loosely implies it holds the draft content. The parameter is self-evident from its name, so this is adequate but adds little.

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

Purpose4/5

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

States a specific verb and resource ('dry-run the style gate on a draft') and explicitly notes it does not send, which separates it from slack_send_message. It never names a sibling tool, but the intent is unambiguous.

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

Usage Guidelines3/5

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

'without sending' and 'dry-run' imply the use case is validating a draft before a real send, but no alternative is named and no explicit when/when-not condition is stated.

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

slack_list_emojiA
Read-only

List custom emoji by case-insensitive name substring, with URLs or alias targets. Needs emoji:read.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
workspaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description isn't burdened with the safety profile. It still adds real value by disclosing the required OAuth scope ('Needs emoji:read') and what the results contain (URLs or alias targets) — both facts absent from the structured fields.

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

Conciseness5/5

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

Two compact sentences with no filler; the core capability and matching rule come first, the permission caveat second. Every clause earns its place.

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

Completeness4/5

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

Output schema exists so return-value explanation isn't required, and the auth requirement plus match semantics cover the essentials for a simple read tool. The only real gap is the unexplained 'workspace' parameter.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It does explain 'query' well (case-insensitive name substring, implicitly optional since default is empty), but says nothing about the required 'workspace' parameter, leaving that half of the schema undocumented.

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

Purpose4/5

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

States a specific verb and resource ('List custom emoji') plus the matching semantics ('case-insensitive name substring') and return shape ('URLs or alias targets'). It doesn't need sibling differentiation since none of the 29 siblings touch emoji, but it also names no alternative.

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

Usage Guidelines3/5

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

Usage is implied by the substring-matching note and the permission requirement, so an agent can infer this is for looking up custom emoji by partial name. However, there is no explicit when-to-use, when-not-to-use, or pointer to any alternative tool.

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

slack_list_filesA
Read-only

List files, newest first (files.list, needs files:read). Filter by channel_id and/or user_id (uploader). types: comma list of all, spaces, snippets, images, gdocs, zips, pdfs. page: 1-based; the reply says how many pages there are.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
countNo
typesNo
user_idNo
workspaceYes
channel_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds valuable context beyond that: newest-first ordering, required OAuth scope, filter semantics, and pagination behavior ('the reply says how many pages there are') – all useful behavioral details not present in the schema.

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

Conciseness4/5

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

Front-loads the core action ('List files, newest first') and then delivers scoping, filters, and pagination details in a dense but efficient manner. Every sentence contributes information, though the shorthand style is slightly terse.

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

Completeness4/5

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

Given an output schema exists, the description needn't explain return values. It covers ordering, filters, types, pagination, and auth scope, which is sufficient for an agent to invoke the tool correctly. The only notable omission is any mention of the required workspace parameter, but the schema marks it required and its meaning is conventional.

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

Parameters3/5

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

With 0% schema description coverage, the description must carry parameter meaning. It explains types (with a concrete list of values), page (1-based), channel_id, and user_id well, but completely omits the required workspace parameter and the count parameter, leaving significant gaps.

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

Purpose4/5

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

States a specific verb and resource ('List files, newest first') and names the underlying API method (files.list), so the operation is unambiguous. It does not explicitly differentiate from siblings like slack_search or slack_file_info, but the listing scope is clear enough to distinguish it.

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

Usage Guidelines3/5

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

Provides an important precondition ('needs files:read') and explains the intended filtering use case (by channel_id and/or user_id). However, it never states when to prefer this over alternatives such as slack_search or slack_file_info, leaving usage guidance implied 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_list_scheduledB
Read-only

Your messages scheduled but not yet sent (chat.scheduledMessages.list), soonest first within a page. Pass next_cursor as cursor for the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
workspaceYes
channel_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds two useful behavioral facts beyond that: results are ordered soonest-first and pagination is cursor-based per page. It does not say whether results are scoped to the required workspace or span all workspaces.

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

Conciseness4/5

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

Two short sentences, front-loaded with what the tool returns and the ordering, with pagination in the trailing clause. No filler, though the line break inside the description is gratuitous and the sentence is slightly fragmented.

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

Completeness4/5

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

An output schema exists, so return shape need not be described, and the read-only safety profile comes from annotations. What remains missing is a statement of how the required workspace parameter scopes the listing and what channel_id filters, which matters for a four-parameter tool.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the parameter burden. It explains only the cursor, and usefully so (the API names it next_cursor, so the mapping avoids a wrong guess). The required 'workspace' parameter and the 'channel_id' and 'limit' parameters get no semantic explanation at all.

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

Purpose4/5

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

States a specific verb+resource: lists the caller's scheduled-but-unsent messages, and even names the underlying API method (chat.scheduledMessages.list). This implicitly separates it from slack_schedule_message and slack_cancel_scheduled, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

The pagination instruction ('Pass next_cursor as cursor for the next page') gives real operational guidance, but there is no statement of when to use this versus slack_cancel_scheduled or slack_schedule_message, and no prerequisites are mentioned.

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

slack_list_usergroupsA
Read-only

List user groups and counts; include_users adds member IDs. Needs usergroups:read.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceYes
include_usersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the bar is lower; the description still contributes the required OAuth scope ('usergroups:read') and the behavioral effect of include_users on the payload. It leaves out pagination/result-size behavior, which matters for a list call.

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

Conciseness4/5

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

Two short clauses, front-loaded with the action and its scope requirement last. Nothing is wasted, though the terseness comes at the cost of the missing workspace semantics rather than being purely efficient.

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

Completeness3/5

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

An output schema exists, so return values need not be described. However, for a two-parameter list tool the description leaves the required workspace parameter and any pagination/limit behavior unaddressed, which an agent needs before a correct call.

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

Parameters3/5

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

Schema coverage is 0%, so the description must carry parameter meaning. It explains include_users well (adds member IDs) but says nothing about 'workspace' — whether it takes an ID, a name, or a slug — which is the one required parameter.

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

Purpose4/5

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

States a specific verb and resource ('List user groups and counts') plus the optional enrichment ('include_users adds member IDs'). No sibling covers usergroups, so differentiation is implicit but unambiguous among the listed tools.

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

Usage Guidelines3/5

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

Usage is only implied by the object type; the description never says when to reach for this versus e.g. slack_find_user or slack_user_info, nor any preconditions beyond the scope. An agent can infer the intent but gets no explicit when/when-not guidance.

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

slack_list_workspacesA
Read-only

List configured workspace aliases and verify token identities (auth.test; no extra scopes).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations cover read-only and open-world, and the description adds real context beyond them: it discloses that it performs an auth.test call and that no extra scopes are required, which tells the agent about permission requirements. It stops short of describing failure behavior for invalid tokens.

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

Conciseness5/5

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

A single compact sentence that front-loads the primary action and parenthetically qualifies the verification behavior — no filler.

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

Completeness4/5

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

With no parameters and an existing output schema (so return values need not be explained), the description supplies enough to call it correctly. Minor gap: no hint about what aliases look like or what happens when a token is invalid.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a no-param tool applies.

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

Purpose4/5

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

States a concrete verb+resource ('List configured workspace aliases') plus a secondary verification function ('verify token identities'), which no sibling tool covers. It is clearly distinguishable from the message/channel/file siblings, though the dual purpose (aliases vs. token verification) slightly blurs the primary action.

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

Usage Guidelines3/5

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

Usage is only implied — an agent can infer this is a discovery/setup call before other Slack operations — but the description never says when to reach for it versus, say, slack_find_user or slack_channel_info, nor any preconditions.

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

slack_mark_readA
Idempotent

Move your read marker in a channel/DM to ts (conversations.mark; needs channels:write, groups:write, im:write or mpim:write for that kind of conversation).

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already establish mutation, idempotency, non-destructiveness, and open-world behavior. The description adds useful material context beyond annotations: the conversations.mark operation and the exact OAuth scopes needed for channels, groups, IMs, or MPIMs.

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

Conciseness5/5

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

One focused sentence with the action front-loaded and the permission scopes compactly parenthesized. Every part contributes useful information without padding.

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

Completeness3/5

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

A simple, well-annotated write tool with an output schema, so return values need not be described. Still, the description leaves a notable gap around the required workspace parameter and does not clarify selection versus unread/read-channel siblings.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It partially clarifies ts as the read-marker target and channel/DM as the conversation, but it never explains the required workspace parameter or the expected ts format.

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

Purpose4/5

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

States a specific verb and resource: moving a read marker in a channel/DM to a given ts, with the underlying conversations.mark API named. It is clear enough to distinguish from read/unread siblings, but it does not explicitly name an alternative to choose between.

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

Usage Guidelines3/5

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

Implies when to use it by describing the read-marker move and listing required scopes per conversation type. However, it gives no explicit when-not guidance or comparison to related tools such as slack_unread.

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

slack_read_canvasA
Read-only

Read full canvas content as Markdown (default) or HTML via canvases.getContent. Needs canvases:read.

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idYes
workspaceYes
content_typeNomarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds value beyond that by naming the required scope 'canvases:read' and signaling that the entire content is returned ('full'), which annotations do not convey.

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

Conciseness4/5

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

A single compact sentence with zero waste and the core action front-loaded. The only minor redundancy is re-explaining the content_type default and citing the API method, both of which the schema/annotations already imply.

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

Completeness4/5

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

With an output schema present, return values need no explanation, and the readOnly hint plus the explicit scope requirement make it callable. The remaining gap is the unexplained workspace and canvas_id identity parameters, which an agent still has to infer.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for three undocumented parameters. It only mentions the content_type options ('Markdown (default) or HTML'), which merely restates the schema enum/default, and says nothing about what workspace or canvas_id mean or where to obtain them.

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

Purpose5/5

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

States a specific verb ('Read') and resource ('full canvas content') and names the exact API call (canvases.getContent), so an agent knows precisely what it returns. No sibling tool reads canvases, so the operation is unambiguous against the surrounding message/search/file tools.

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

Usage Guidelines3/5

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

The description implies when to use it (when you need canvas content) and gives a precondition ('Needs canvases:read'), but it never addresses alternatives or exclusions. There is no guidance on when to prefer Markdown over HTML or how it relates to slack_read_channel/thread.

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

slack_read_channelA
Read-only

Read one history page with cursor and Slack timestamp bounds; returns messages/next_cursor/has_more. Needs the conversation's channels:history, groups:history, im:history or mpim:history; users:read for names.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
latestNo
oldestNo
inclusiveNo
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly and openWorld, so the description is not carrying the safety burden. It still adds real context beyond annotations: the required OAuth scopes per conversation type (channels:history, groups:history, im:history, mpim:history) and users:read for name resolution, which tells an agent what auth failures may mean.

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

Conciseness5/5

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

Two compact, front-loaded sentences: capabilities and pagination model first, prerequisites second. No filler, and the return-shape mention is brief rather than restating the output schema at length.

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

Completeness3/5

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

Covers pagination model, auth scopes, and references return fields, with an output schema handling the return shape. However, for a 7-parameter tool with zero schema descriptions, the direction/ordering of messages and the meaning of limit and inclusive are unaddressed, which is a meaningful gap for correct invocation.

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

Parameters3/5

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

Schema description coverage is 0%, so the description should compensate for all 7 parameters; it only explains cursor and timestamp bounds (oldest/latest). It says nothing about limit semantics, what 'inclusive' toggles, or the workspace/channel_id role, leaving ambiguity for the remaining params.

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

Purpose4/5

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

States a specific verb and resource ('Read one history page') and scopes it with cursor/timestamp bounds, so an agent knows this is paginated channel history retrieval. It does not name or contrast with the closest siblings (slack_read_thread, slack_unread, slack_search_messages), so the differentiator is only implicit.

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

Usage Guidelines3/5

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

'Read one history page' implies incremental pagination and distinguishes it loosely from bulk export, but there is no explicit when-to-use guidance versus thread reading, unread listing, or message search. Usage is inferable rather than stated.

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-only

Read thread pages from cursor within timestamp bounds; all_pages stops at max_pages (default 10). Returns complete=false while more remain. Needs channels:history/groups:history/im:history/mpim:history; users:read.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
latestNo
oldestNo
all_pagesNo
inclusiveNo
max_pagesNo
thread_tsYes
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries real weight here: it discloses pagination semantics ('Returns complete=false while more remain'), the max_pages default and its stop condition, and the exact OAuth scopes required. It does not cover rate limits or ordering of returned messages, but the added context is substantial.

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

Conciseness4/5

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

Three short clauses, no filler, and the pagination/default information is front-loaded where an agent will read it. Slightly dense with semicolons, but every clause carries information.

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

Completeness4/5

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

An output schema exists so return values needn't be spelled out, though the description usefully explains the complete flag anyway. For a 10-parameter paginated read with 0% schema coverage, a few parameters (inclusive, limit) remain unexplained, keeping it just short of complete.

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

Parameters3/5

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

Schema description coverage is 0% across 10 parameters, so the description must compensate. It meaningfully explains cursor, latest/oldest bounds, all_pages and max_pages, but leaves limit, inclusive, thread_ts, workspace and channel_id (including how to obtain a thread_ts) entirely undocumented.

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

Purpose4/5

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

States a specific verb and resource ('Read thread pages') and scopes it with cursor and timestamp bounds, which distinguishes it from slack_read_channel (channel-level) and slack_search_messages. It does not name a sibling alternative explicitly, but the thread-vs-channel distinction is clear from the resource named.

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

Usage Guidelines3/5

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

The description implies when to use it (when you need a thread's replies, possibly paginated), and gives some operational guidance ('all_pages stops at max_pages'), but never says when to choose this over slack_read_channel or slack_search_messages, nor any prerequisites for obtaining thread_ts.

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

slack_remove_reactionA
DestructiveIdempotent

Remove the user's emoji reaction from a message (reactions.remove, needs reactions:write).

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes
nameYes
workspaceYes
channel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered; the description adds genuinely new context by disclosing the required OAuth scope 'needs reactions:write'. It stops short of saying whether removing a non-existent reaction errors or silently succeeds, which is the one behavior an agent would still want.

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

Conciseness5/5

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

One sentence, operation front-loaded, parenthetical metadata trailing. Nothing wasted and nothing that could be reordered for better scanning.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the scope requirement is a nice addition. But for a 4-required-parameter mutation tool with 0% schema coverage, the definition is thin: timestamp format and the self-only restriction deserve explicit statement.

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

Parameters2/5

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

Schema description coverage is 0% and all four parameters are required, yet the description says nothing about any of them. The critical gap is 'ts', whose Slack timestamp format ('1700000000.123456') is non-obvious and undocumented anywhere, and 'name' vs 'channel_id' vs 'workspace' distinctions are left entirely to inference.

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

Purpose4/5

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

States a specific verb and resource ('Remove the user's emoji reaction from a message') and names the underlying API method, which pins down the operation precisely. It does not explicitly name slack_add_reaction as the counterpart, but the verb 'remove' makes the direction obvious.

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

Usage Guidelines3/5

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

The phrase 'the user's emoji reaction' usefully implies scope: only the authenticated user's own reaction can be removed, not someone else's. However, there is no explicit when-to-use framing, no mention of what to do if the reaction is absent, and no named alternative such as slack_add_reaction.

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

slack_schedule_messageA

Schedule a message AS THE USER (chat.scheduleMessage, chat:write). post_at: ISO 8601 with a timezone (2026-10-23T09:00:00+03:00) or unix seconds, up to 120 days ahead. Other arguments and the style gate as in slack_send_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
formatNomarkdown
post_atYes
thread_tsNo
workspaceYes
channel_idYes
allow_promiseNo
reply_broadcastNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare a non-readOnly, open-world, non-idempotent write; the description adds genuinely new behavior: it posts as the user under chat:write, the post_at must carry a timezone, and the horizon is capped at 120 days. The 120-day limit and identity/scope disclosure are exactly the kind of pre-call constraints annotations cannot convey.

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

Conciseness4/5

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

Three sentences, none wasted: the action and identity come first, the tricky time parameter second, and the delegation pointer last. The dense parentheticals carry real information rather than filler.

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

Completeness4/5

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

Annotations cover the safety profile and an output schema exists, so the description need not explain returns. It fills the highest-risk gaps (identity, timezone format, scheduling horizon) but leaves the channel/thread/format semantics to a sibling's description.

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

Parameters3/5

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

Schema description coverage is 0% across 8 parameters, but post_at — the only non-obvious one — gets a concrete format example, timezone requirement, unix-seconds alternative, and the 120-day cap. The remaining seven (text, channel_id, workspace, format, thread_ts, allow_promise, reply_broadcast) are deferred entirely to 'as in slack_send_message,' which requires opening another tool's docs.

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

Purpose4/5

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

States a specific verb and resource ('Schedule a message'), names the underlying API (chat.scheduleMessage) and scope (chat:write), and stresses AS THE USER. It is distinguishable from slack_send_message by the scheduling verb, though the distinction is left implicit rather than stated as a contrast.

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

Usage Guidelines3/5

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

Scheduling versus immediate sending is implied by the verb, and the description points to slack_send_message for 'other arguments and the style gate.' It never explicitly says when to pick this over slack_send_message or how it relates to slack_list_scheduled/slack_cancel_scheduled, so the agent must infer the workflow.

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

slack_search_messagesB
Read-only

Search visible messages with raw Slack query and optional filters; returns total/page/pages. Needs search:read and users:read for cached author names; count is 1-100.

ParametersJSON Schema
NameRequiredDescriptionDefault
hasNo
pageNo
sortNoscore
afterNo
countNo
queryYes
beforeNo
sort_dirNodesc
from_userNo
workspaceYes
in_channelNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already cover read-only and open-world behavior, and the description adds real value on top: it names the exact scopes required (search:read, users:read) and notes that author names are cached, which warns of a degradation mode. Pagination is signposted via the total/page/pages return note, though rate limits and result-window limits are not mentioned.

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

Conciseness4/5

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

Two tight sentences that lead with the action and follow with operational constraints; minimal waste. Minor redundancy in restating the count 1-100 range that the schema already enforces via minimum/maximum.

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

Completeness3/5

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

An output schema exists, so return values need no prose, and auth is covered. But for an 11-parameter query tool with zero schema descriptions, the description leaves most filter semantics undefined, and it never explains how this differs from the sibling slack_search.

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

Parameters2/5

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

Schema description coverage is 0% across 11 parameters, so the description carries the full burden and largely fails it: only count is clarified (1-100), while has, from_user, in_channel, after, before, page, sort, and sort_dir are never explained or given expected formats. The generic "optional filters" phrase does not compensate for that gap.

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

Purpose4/5

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

The description gives a specific verb+resource ("Search visible messages") plus the query mechanism ("raw Slack query and optional filters") and return shape. It does not, however, differentiate itself from the sibling slack_search, leaving an agent to guess which search entry point to use.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this over slack_search, slack_read_channel, or slack_read_thread, and no statement of preconditions beyond the auth scopes. The phrase "optional filters" implies they exist but never says when to apply them.

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

slack_send_messageA

Post a Slack message AS THE USER (no app badge), via personal user token. Style gate (enforced before send unless SLACK_STYLE_GATE=off): no AI typography (em/en dash, ellipsis char, curly quotes, nbsp, bullet) - use plain ASCII; no AI-slop phrases; no concrete promises/deadlines unless allow_promise=true. Write short and plain, in the user's own voice and language. workspace: explicit alias from slack_list_workspaces. channel_id: C.../G.../D..., or a user id U... to write into the DM with that person (needs im:write). thread_ts: reply in a thread. reply_broadcast: with thread_ts, also show the reply in the channel. format: markdown (default; standard Markdown, up to 12,000 chars) or mrkdwn (Slack's own: bold, <url|label>). unfurl_links: show link previews (off by default).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
formatNomarkdown
thread_tsNo
workspaceYes
channel_idYes
unfurl_linksNo
allow_promiseNo
reply_broadcastNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the generic write/open-world/non-idempotent profile; the description adds genuinely non-obvious behavior: the message posts under the user's identity with no app badge, a style gate actively rewrites or blocks output unless SLACK_STYLE_GATE=off, promises are blocked unless allow_promise=true, and unfurls are off by default. These are exactly the side effects an agent must know before calling.

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

Conciseness4/5

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

Front-loaded with identity and scope, then per-parameter guidance in a tight run of fragments; little is wasted. The style-gate block is dense and reads as one long sentence chain rather than clearly delimited rules, which slightly slows scanning.

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

Completeness4/5

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

With an output schema present, return values needn't be explained, and all six non-obvious parameters are covered. What's missing is failure behavior: what an agent sees when the style gate rejects a message, and whether any rate limiting applies to high-volume posting.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: it defines workspace provenance, the three channel_id id classes including the U→DM case, thread_ts for threaded replies, reply_broadcast as 'also show in channel,' format options with length/charset differences, unfurl_links default, and allow_promise semantics. Only 'text' is left implicit, which is self-evident.

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

Purpose5/5

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

States a specific verb and resource ('Post a Slack message') plus the distinguishing scope 'AS THE USER (no app badge), via personal user token,' which separates it from sibling send paths. An agent can tell this apart from slack_schedule_message or slack_edit_message without inspecting schemas.

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

Usage Guidelines4/5

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

Gives concrete routing guidance: workspace must be an explicit alias from slack_list_workspaces, channel_id accepts C/G/D ids or a U id to open a DM (requiring im:write), and reply_broadcast only applies with thread_ts. It stops short of explicitly naming when to prefer slack_schedule_message over an immediate send, so it's strong context without full alternative routing.

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

slack_set_statusA
Idempotent

Set the user's Slack status (users.profile.set, needs users.profile:write). Empty text and emoji clear it. emoji: name like palm_tree. expires_in_minutes: 0 keeps it until changed. The style gate applies to text: everyone in the workspace sees it.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
emojiNo
workspaceYes
allow_promiseNo
expires_in_minutesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing the required OAuth scope (users.profile:write), that the status is visible to everyone in the workspace, and what clearing/expiry semantics do to existing state. The annotations already cover idempotency and non-destructiveness, so this added context is the right kind of value for a 4.

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

Conciseness4/5

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

Front-loaded with the action and API method, then parameter notes in short clauses; no filler. The parenthetical scope note interrupts slightly but still earns its place.

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

Completeness3/5

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

An output schema exists so return values need no explanation, and the mutation's safety profile is covered by annotations. But for a five-parameter tool, the unexplained workspace and allow_promise parameters leave a real gap an agent may stumble on in multi-workspace setups.

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

Parameters3/5

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

With 0% schema description coverage the description must carry parameter meaning, and it does explain text (empty clears it, style gate applies), emoji (format like palm_tree), and expires_in_minutes (0 = until changed). However, the required workspace parameter and allow_promise are never explained, leaving two of five parameters opaque.

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

Purpose5/5

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

States a specific verb and resource ("Set the user's Slack status") plus the underlying API method (users.profile.set), so the action is unambiguous. No sibling tool sets a status, so it is clearly distinguished from the listing/search/read siblings.

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

Usage Guidelines3/5

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

Gives useful operational rules ("Empty text and emoji clear it", "expires_in_minutes: 0 keeps it until changed") but never states when an agent should set status versus, say, sending a message or reacting. There are no explicit alternatives or when-not-to-use conditions.

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

slack_unreadA
Read-only

How many messages arrived after your read marker in each of up to 20 channels/DMs (conversations.info + conversations.history). Slack's API has no full unread inbox like the app, so name the channels. count stops at limit; has_more tells there are more.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
workspaceYes
channel_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely useful behavior beyond that: it is capped at 20 conversations, it is backed by conversations.info plus conversations.history, and count stops at limit with has_more signaling truncation. Only the per-channel return shape is left unstated, and an output schema exists.

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

Conciseness4/5

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

Three tight sentences with the core purpose front-loaded and the API caveat placed where it matters. The parenthetical API call list is slightly noisy but short enough to earn its place.

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

Completeness4/5

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

With annotations covering the safety profile and an output schema covering return values, the remaining burden is small. The one real gap is the undocumented workspace parameter, which leaves an agent guessing at required input semantics.

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

Parameters3/5

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

Schema coverage is 0%, so the description must carry parameter meaning. It does explain channel_ids indirectly via 'up to 20 channels/DMs' and explains limit's truncation semantics, but the required workspace parameter is never mentioned and the 20-conversation cap is not tied explicitly to the array.

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

Purpose4/5

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

The description gives a specific verb and resource: it counts messages that arrived after the read marker per channel/DM, which separates it from slack_read_channel and slack_search. It never names a sibling explicitly, so the differentiation is left to inference, but the purpose itself is unambiguous.

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

Usage Guidelines3/5

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

It communicates a real usage constraint: there is no full unread inbox like the app, so the caller must name channels. That implies when the tool is appropriate, but it never states when to prefer slack_read_channel or slack_search instead, or what to do when the channel set is unknown.

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

slack_upload_fileA

Upload a local file to a Slack channel/DM AS THE USER, with an optional comment. Same style gate as slack_send_message applies to initial_comment and title. channel_id: C.../G.../D..., or a user id U... to upload into the DM with that person (your own id = your self-DM; needs im:write). thread_ts: upload as a thread reply. file_path: absolute path inside SLACK_FILE_ROOTS (default: home and temp folders; hidden files and ~/Library refused). title: file title, defaults to the filename.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
file_pathYes
thread_tsNo
workspaceYes
channel_idYes
allow_promiseNo
initial_commentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the description's job is to add context: it does, disclosing that the file is uploaded as the user, that a self-DM requires im:write, that filesystem access is sandboxed to SLACK_FILE_ROOTS, and that the message style gate applies. It omits size limits and failure behavior, so not a 5.

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

Conciseness4/5

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

Front-loads the action, then lists per-parameter guidance in a compact line-per-parameter layout with little waste. The cross-reference to slack_send_message's style gate assumes prior knowledge of a sibling, which costs a bit of clarity.

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

Completeness4/5

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

For a mutating, multi-parameter upload tool with an output schema and annotations, the description covers identity, scoping, threading, and path sandboxing. Gaps remain around the undocumented workspace/allow_promise parameters and any size or failure constraints, but nothing critical to calling it is missing.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate and it largely does: channel_id formats, thread_ts semantics, file_path constraints, title default to filename, and initial_comment via the style gate. Two of seven parameters, workspace and allow_promise, are never explained.

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

Purpose5/5

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

States a specific verb and resource (upload a local file to a Slack channel/DM) plus the identity it acts under (AS THE USER) and an optional comment. It is trivially distinguishable from slack_download_file and from the message-editing siblings.

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

Usage Guidelines4/5

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

Gives concrete usage conditions: channel_id accepts C/G/D or a U id for a DM (with im:write caveat) and thread_ts turns the upload into a thread reply. It also states exclusions (hidden files and ~/Library are refused, path must be inside SLACK_FILE_ROOTS). It stops short of naming an alternative tool or when-not to upload.

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

slack_user_infoB
Read-only

A user's name, title, email, timezone, status and role via users.info. Needs users:read, and users:read.email for the email.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes
workspaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover read-only and open-world behavior, but the description adds genuinely new operational context: which OAuth scopes are required, and specifically that the email field needs an extra scope. That scope-dependency is exactly the kind of thing an agent cannot infer from schema or annotations, though it says nothing about error behavior on missing scopes.

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

Conciseness4/5

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

Two short sentences, the returned-fields summary front-loaded and the permission caveat second. Efficient, with no filler; the only weakness is that the scope note is terse enough to be slightly cryptic about what happens without the email scope.

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

Completeness3/5

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

An output schema exists so return values need not be explained, and the description usefully enumerates the main fields anyway. However, with 0% schema description coverage on two required parameters, the definition leaves a material gap about how to supply user_id and workspace.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry both parameters, but it mentions neither user_id nor workspace. An agent gets no hint about user ID format (U-prefixed vs name) or what 'workspace' identifies — a real gap for a 2-required-param tool.

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

Purpose4/5

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

States a specific resource (a user's profile fields) and names the underlying API (users.info), so an agent knows this is a profile lookup. It does not explicitly contrast with the sibling slack_find_user, which is the most likely point of confusion, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description gives a prerequisite (users:read and users:read.email) but never says when to use this versus slack_find_user or other user-related siblings. Usage is implied by the field list rather than stated.

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

Tool Schema Changelog

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

  1. 30 tool updatesv0.2.3
    • First observedslack_add_reaction
    • First observedslack_cancel_scheduled
    • First observedslack_channel_info
    • First observedslack_delete_message
    • First observedslack_download_file
    • First observedslack_edit_message
    • First observedslack_file_info
    • First observedslack_find_channel
    • First observedslack_find_user
    • First observedslack_get_permalink
    • First observedslack_get_reactions
    • First observedslack_lint
    • First observedslack_list_emoji
    • First observedslack_list_files
    • First observedslack_list_scheduled
    • First observedslack_list_usergroups
    • First observedslack_list_workspaces
    • First observedslack_mark_read
    • First observedslack_read_canvas
    • First observedslack_read_channel
    • First observedslack_read_thread
    • First observedslack_remove_reaction
    • First observedslack_schedule_message
    • First observedslack_search
    • First observedslack_search_messages
    • First observedslack_send_message
    • First observedslack_set_status
    • First observedslack_unread
    • First observedslack_upload_file
    • First observedslack_user_info

TDQS

B3.4/5.0

Scored across 30 tools

Disambiguation3/5

Most tools target a distinct resource+action, but slack_search and slack_search_messages are genuinely confusable: both search messages, one via RTS with cursors and one via raw query with filters, and an agent can easily pick the wrong one. A few others (slack_unread vs slack_read_channel, slack_lint vs the style gate inside slack_send_message) require reading descriptions carefully to separate.

Naming Consistency4/5

The dominant pattern is slack_verb_noun (send_message, edit_message, list_files, add_reaction), which is predictable once learned. Minor deviations exist: bare-verb slack_search, and noun-only names like slack_user_info, slack_channel_info, slack_file_info, and slack_unread break the verb-first convention, while verbs vary between get/read/find for similar lookups.

Tool Count3/5

30 tools is on the heavy side for a personal Slack client, and the surface spans many sub-domains (messages, files, channels, users, reactions, scheduling, status, canvases, emoji, usergroups). Each tool covers real functionality, but the count is borderline and a few could be folded together.

Completeness4/5

Message lifecycle is well covered (send, edit, delete, schedule, cancel, reactions, thread reading, permalink), along with files, users, and info lookups. Gaps remain: there is no tool to list the channels/conversations you belong to (slack_find_channel requires a name, and slack_unread requires naming channels), and no pin/bookmark or channel create/join operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables interaction with Slack workspaces as a user, supporting channel listing, message posting, threading, reactions, and user management via the Slack API.
    8
    11
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants like Cursor and Claude Desktop to interact with Slack workspaces, allowing message sending, channel reading, user management, and file operations through natural language.
    MIT