Skip to main content
Glama
epdlr
by epdlr

slack-stdio-mcp

Local MCP stdio bridge to Slack’s hosted MCP server (https://mcp.slack.com/mcp).

Proxies the official tool catalog (slack_send_message, search, history, canvas, …) after user OAuth (PKCE) and keeps tokens fresh. It does not reimplement hosted Slack tools. A small local overlay adds what the hosted server does not: download a file to disk, and list local vs remote tool names.

Approach

Typical result

Host → HTTP mcp.slack.com with built-in OAuth

Often stuck authenticating

Claude Code Slack plugin

Works (partner app + host OAuth)

This bridge (stdio + local OAuth/refresh)

Works for Grok, Cursor, Open Code, Codex, Claude, …

Agent  ──stdio MCP──►  slack-stdio-mcp  ──Bearer──►  mcp.slack.com
                              │
                              ├─ valid access token → reuse
                              ├─ expired + refresh_token → silent refresh
                              ├─ no token → browser OAuth (PKCE)
                              └─ overlay: download, catalog, edit/delete, unreact, scheduled

Requirements

  • Node.js ≥ 20 (Windows, macOS, Linux)

  • Default OAuth app: Claude’s partner Slack app (no app setup required)

    • Client ID: 1601185624273.8899143856786

    • Redirect: http://localhost:3118/callback

  • Own app is optional — see Own Slack app

Related MCP server: slack-mcp-claude-auth

Install

npx -y slack-stdio-mcp

First run may open a browser for Slack Allow. Later runs reuse or refresh tokens under the platform credentials directory (see Auth).

Alternative

Command

Latest git main

npx -y github:epdlr/slack-stdio-mcp

From clone

git clone … && npm install && npm start

Configure a host

Prefer npx so you never hardcode a machine path. Put knobs in args (CLI flags beat env; see Configuration).

Set startup_timeout_sec (or equivalent) ≥ 180 so the first OAuth Allow is not killed by the host.

Grok Build (~/.grok/config.toml)

[mcp_servers.slack-stdio]
command = "npx"
args = ["-y", "slack-stdio-mcp"]
enabled = true
startup_timeout_sec = 180

Own Slack app:

[mcp_servers.slack-stdio]
command = "npx"
args = [
  "-y", "slack-stdio-mcp",
  "--client-id", "YOUR.CLIENT.ID",
  "--oauth-host", "127.0.0.1",
  "--oauth-path", "/oauth/callback",
]
enabled = true
startup_timeout_sec = 180

Claude Code / Cursor / similar (JSON)

{
  "mcpServers": {
    "slack-stdio": {
      "command": "npx",
      "args": ["-y", "slack-stdio-mcp"]
    }
  }
}

Add the same optional flags as in the Grok example when using your own app.

Local clone

{
  "mcpServers": {
    "slack-stdio": {
      "command": "node",
      "args": ["/absolute/path/to/slack-stdio-mcp/src/server.mjs"]
    }
  }
}

Auth

On start, if there is no usable token for the active client_id, the bridge opens a browser (PKCE). Credentials are stored per client_id:

OS

Default root

macOS / Linux

~/.config/slack-stdio-mcp ($XDG_CONFIG_HOME honored)

Windows

%APPDATA%\slack-stdio-mcp

Path: …/by-client/<client_id>.json. Override with --creds-dir / SLACK_STDIO_CREDS_DIR. Unix modes 0600/0700 when supported.

Action

How

OAuth only (no MCP)

npm run auth (from a clone)

Skip browser (CI)

--skip-oauth / SLACK_SKIP_OAUTH=1

Inject token

--token / SLACK_MCP_TOKEN

Token lifecycle

  1. Load credentials for the current client_id

  2. Reuse access token if valid (5‑minute skew before expires_at)

  3. Else refresh via oauth.v2.access (grant_type=refresh_token)

  4. On refresh failure: clear that app’s file → OAuth (or fail if skip-oauth)

No session

stdio starts even when Slack has no usable token. The host handshake does not wait on the browser. The first tool call that needs Slack returns SLACK_REAUTH_REQUIRED and a clickable authorize URL. The agent should ask the user to open that URL and press Allow, then retry.

Mid-session session loss

If a Slack tool fails with an auth error (isError: true or thrown error):

  1. Silent force-refresh + reconnect + one retry

  2. Else open browser and return SLACK_REAUTH_REQUIRED plus the authorize URL in the tool result (clickable in chat)

  3. After Allow, the bridge reconnects in the background — retry the tool

Successful tool payloads are never scanned for auth keywords. Settled re-auth flows are not reused; the next start gets a fresh URL.

Local tool

Purpose

slack_stdio_reauth

Start re-auth; optional wait: true until Allow

slack_stdio_session_status

Pending re-auth + authorize URL if any

slack_stdio_download_file

Write a Slack file_id to disk (hosted slack_read_file is often metadata-only for video). Max 50 MB. files:read

slack_stdio_catalog

JSON of local overlay names vs the current mcp.slack.com catalog

slack_stdio_update_message

Edit a message the user posted (chat.update). Hosted MCP can send only

slack_stdio_delete_message

Delete a message the user posted (chat.delete)

slack_stdio_remove_reaction

Remove a reaction the user added (reactions.remove). Hosted catalog has add/get

slack_stdio_scheduled_messages

action=list or action=cancel for scheduled messages. Hosted slack_schedule_message cannot cancel

Startup OAuth waits up to SLACK_OAUTH_TIMEOUT_MS (default 180000). On timeout the process exits 1 (host must restart). Keep host startup timeout above that value. The authorize URL is always printed on stderr.

Configuration

Precedence: CLI flags > environment > built-in defaults.

CLI flag

Env

Purpose

--client-id <id>

SLACK_CLIENT_ID

OAuth app id (default: Claude partner)

--client-secret <s>

SLACK_CLIENT_SECRET

Confidential apps only

--oauth-host <host>

SLACK_OAUTH_HOST

Redirect host (localhost)

--oauth-path <path>

SLACK_OAUTH_PATH

Redirect path (/callback)

--oauth-port <port>

SLACK_OAUTH_PORT

Loopback port (3118)

--mcp-url <url>

SLACK_MCP_URL

MCP endpoint

--profile <name>

SLACK_STDIO_PROFILE

Named store: ~/.slack-stdio-mcp/profiles/<name> (share across repos)

--creds-dir <dir>

SLACK_STDIO_CREDS_DIR

Absolute credentials root (wins over --profile)

--skip-oauth

SLACK_SKIP_OAUTH=1

Never open browser

--token / --mcp-token

SLACK_MCP_TOKEN

Inject Bearer (tests/CI)

-h / --help

—

Help on stderr

Env only: SLACK_OAUTH_TIMEOUT_MS, SLACK_ALLOW_LEGACY_TOKEN=1 (flat legacy JSON without client_id).

npx -y slack-stdio-mcp -- --profile user_cl
npx -y slack-stdio-mcp -- --client-id 123.456 --oauth-path /oauth/callback
npx -y slack-stdio-mcp -- --skip-oauth --creds-dir /tmp/empty-creds

A leading -- in args (Cursor / npx) is ignored; --profile after it still applies.

Profiles: the same --profile name in every host/repo reuses ~/.slack-stdio-mcp/profiles/<name>/… (no absolute paths in config). Grok does not inject the MCP server key into the process — put the profile string in args yourself (convention: match your team/workspace name).

Platforms

Windows

macOS / Linux

Credentials

%APPDATA%\slack-stdio-mcp

~/.config/… or $XDG_CONFIG_HOME

Open browser

cmd /c start "" "<url>" (URL quoted for &)

open / xdg-open

File modes

omitted (profile ACL)

0600 / 0700

CI: npm test on Ubuntu, Windows, macOS (Node 20 + 22). If the browser cannot open, paste the authorize URL from stderr.

Own Slack app (optional)

Only if you are not using the default Claude partner app.

  1. Slack app → OAuth & Permissions → Redirect URLs must match your --oauth-* / SLACK_OAUTH_* (e.g. http://localhost:3118/callback)

  2. PKCE Opt In (recommended without client_secret)

  3. Enable MCP under App Assistant / Agents & AI Apps
    (else: App is not enabled for Slack MCP server access)

  4. User Token Scopes must match USER_SCOPES in src/oauth-flow.mjs (source of truth; CI checks the README list below)

Scope

Used for

search:read.public

Search public channels

search:read.private

Search private channels

search:read.mpim

Search multi-person DMs

search:read.im

Search 1:1 DMs

search:read.files

Search files

search:read.users

Search users

chat:write

Send messages

channels:history

Public channel history

groups:history

Private channel history

mpim:history

Multi-person DM history

im:history

1:1 DM history

canvases:read / canvases:write

Canvases

users:read / users:read.email

Profiles

reactions:write / reactions:read

Reactions

emoji:read

Custom emoji

files:read

Files

channels:write / groups:write / im:write / mpim:write

Open/manage conversations

channels:read / groups:read / mpim:read

List/metadata

Copy-paste (comma-separated; authorize uses space-separated scope, not user_scope):

search:read.public,search:read.private,search:read.mpim,search:read.im,search:read.files,search:read.users,chat:write,channels:history,groups:history,mpim:history,im:history,canvases:read,canvases:write,users:read,users:read.email,reactions:write,reactions:read,emoji:read,files:read,channels:write,groups:write,im:write,mpim:write,channels:read,groups:read,mpim:read

These are user scopes (xoxp / xoxe.xoxp), not bot scopes. A subset is fine if you only need some tools. Set SLACK_CLIENT_SECRET only if Slack rejects public PKCE exchange.

npx -y slack-stdio-mcp -- \
  --client-id your.client.id \
  --oauth-host 127.0.0.1 \
  --oauth-path /oauth/callback

Scripts

Script

Command

Start bridge

npm start

OAuth only

npm run auth

Tests

npm test

Syntax + English gate

npm run check

Security

See SECURITY.md.

  • Never commit credentials, .env, or token dumps

  • Tokens act as the authorizing user — revoke the app in Slack when done

  • stdout = MCP JSON-RPC only; human logs go to stderr

Contributing

CONTRIBUTING.md · CHANGELOG.md · docs/ARCHITECTURE.md

License

MIT

Available Tools

8 tools
slack_stdio_catalogA

List local overlay tool names vs the current hosted mcp.slack.com catalog. Use to verify the bridge is proxying the full remote set.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. The verb 'List' implies a read-only operation with no side effects, but the description does not explicitly state that it is non-destructive, nor does it mention authentication or rate limits. It is adequate for a listing tool but could be more explicit about side-effect guarantees.

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

Conciseness5/5

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

The description is two sentences with no redundancy. The action and resource are stated first, followed by a precise usage instruction. Every word earns its place, and it is front-loaded with the core purpose.

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 zero-parameter tool with no output schema, the description fully explains what the tool does and when to use it. It does not describe the exact return format, but the purpose of comparing local vs remote catalog is clear. An agent can invoke it correctly without additional context.

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

Parameters4/5

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

The tool has zero parameters, so the baseline is 4. The description does not need to explain parameters, and it adds no parameter-related information beyond the schema, which is already complete (100% coverage with no parameters). This is appropriate.

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

Purpose5/5

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

The description states a specific verb ('List') and a clear resource ('local overlay tool names vs the current hosted mcp.slack.com catalog'). It is distinct from sibling tools like slack_stdio_reauth or slack_stdio_update_message, which perform different actions. The purpose is unambiguous.

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

Usage Guidelines4/5

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

The description explicitly says 'Use to verify the bridge is proxying the full remote set', providing a clear when-to-use context. It does not list exclusions or alternatives, but for a simple catalog-comparison tool this is sufficient. It clearly differentiates its use case from the other tool actions.

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

slack_stdio_delete_messageB

Delete a message the user posted (chat.delete). Hosted Slack MCP cannot delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
channel_idYesChannel, DM, or IM id
message_tsYesTimestamp of the message to delete

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of disclosing behavior. It identifies the endpoint but does not state that deletion is irreversible, what permissions are required, what happens to related data, or what the response looks like. For a destructive operation, this is a significant gap.

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

Conciseness4/5

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

The description is short and front-loaded with the core purpose. The first sentence is highly efficient; the second sentence provides rationale about hosted Slack MCP limitations, though its value is somewhat marginal.

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

Completeness3/5

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

For a simple two-parameter deletion tool, the description is minimally viable. However, with no annotations and no output schema, it omits behavioral details such as irreversibility, permission needs, and response/error behavior, leaving the agent with only partial context.

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

Parameters3/5

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

Schema coverage is 100%, so the parameters are already well-documented. The description adds the 'user posted' constraint but does not add meaning to channel_id or message_ts beyond what the schema provides. It meets the baseline but adds little extra parameter value.

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 clear verb ('Delete') with a specific resource ('a message the user posted') and names the underlying API method (chat.delete). It is distinguishable from sibling tools like update_message and remove_reaction without needing to inspect their schemas.

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 implicitly scopes usage to messages the user themselves posted, which is a useful constraint. However, it does not explicitly state when to prefer this tool over alternatives or describe conditions where it should not be used, leaving some inference to the agent.

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

slack_stdio_download_fileA

Download a Slack file to disk by file_id. Hosted slack_read_file often returns metadata-only for video or large binaries; this writes the bytes to dest_dir (default: OS temp slack-stdio-mcp-downloads) and returns path, mime_type, and size. Max 50 MB. Requires files:read.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesSlack file ID (e.g. F0ABC12345)
dest_dirNoDirectory to write into (created if missing). Default: OS temp.
max_bytesNoOptional lower size cap in bytes (cannot exceed 50 MB).

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that it writes bytes to disk, the default destination, the return fields (path, mime_type, size), the 50 MB limit, and the required permission. It does not detail error handling or behavior on exceeding max_bytes, but the core behavioral traits are clearly stated.

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 tight sentences with no filler. The purpose is front-loaded, the differentiation from slack_read_file comes second, and constraints/permissions close it out. Every sentence earns its place.

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

Completeness4/5

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

For a tool with no output schema, the description names the return values (path, mime_type, size). It covers when to use it, the default destination, the size limit, and the required scope. Missing are error cases and behavior when max_bytes is exceeded, but these are minor for a straightforward download operation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all three parameters. The description adds the specific default directory name ('slack-stdio-mcp-downloads') beyond the schema's generic 'OS temp' and reiterates the 50 MB cap, but this is marginal extra value; the schema handles most semantics.

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

Purpose5/5

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

The description states a clear verb ('Download') and resource ('Slack file') plus the mechanism ('to disk by file_id'). It explicitly differentiates itself from slack_read_file by noting that the hosted tool 'often returns metadata-only for video or large binaries', giving an agent a precise reason to select this tool.

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

Usage Guidelines5/5

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

It names the alternative (slack_read_file) and the condition under which to choose this tool (when you need the actual bytes for video/large binaries). It also states a hard prerequisite ('Requires files:read') and a size constraint (Max 50 MB), leaving no ambiguity about when to call it.

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

slack_stdio_reauthA

No Slack session. Ask the user to authorize Slack (open the URL and press Allow) before any Slack action, then retry. Start Slack re-authorization when the session expired. Opens a browser and returns a clickable authorize URL for the user. Optional argument wait=true blocks until Allow (or timeout). After success, retry the previous Slack tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNoIf true, wait until the user completes Allow (default false).

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are present, so the description carries the full burden. It discloses that a browser opens, returns a URL, and optionally blocks until Allow or timeout. It also mentions retrying the previous tool. Missing details like timeout duration or failure handling are minor given the tool's simplicity.

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

Conciseness4/5

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

The description is logically structured from trigger to action to follow-up, with each sentence adding meaningful detail. It is slightly verbose but not wasteful, earning a solid score.

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?

It covers when to call, what the tool does, what it returns, and the retry action. Since there is no output schema, the description explains the return value (clickable URL). Minor omissions like error handling do not significantly impact usability.

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 100% and already describes wait. The description adds the 'or timeout' nuance and clarifies blocking behavior, which is extra value beyond the schema. This justifies a score above the baseline 3.

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

Purpose5/5

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

The description clearly identifies the tool as initiating Slack re-authorization, opens a browser, and returns a clickable URL. This distinguishes it from sibling tools that handle other Slack operations (catalog, messages, reactions), making the purpose unambiguous.

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

Usage Guidelines5/5

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

Explicitly states when to use: when a Slack session has expired and before any Slack action. It also instructs to retry the previous Slack tool after success, providing a clear trigger and follow-up, which effectively implies when not to use it.

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

slack_stdio_remove_reactionA

Remove an emoji reaction the user added (reactions.remove). Hosted catalog has add/get only. Emoji name without colons.

ParametersJSON Schema
NameRequiredDescriptionDefault
emojiYesReaction name without colons (e.g. thumbsup)
channel_idYesChannel, DM, or IM id
message_tsYesTimestamp of the message

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose that the tool removes a reaction the user added, implying it only works on reactions the user added, and it notes the emoji format. However, it does not disclose what happens if the reaction doesn't exist, whether it fails silently, or whether it requires specific permissions. For a simple mutation tool, this is adequate but not rich.

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

Conciseness5/5

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

Three short sentences with zero waste. The core action is front-loaded, the API method is given for reference, and the emoji formatting note is placed at the end. Every sentence earns its place.

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

Completeness4/5

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

For a simple 3-parameter mutation tool with no output schema, the description covers the essential context: what it does, the API method, the catalog limitation, and the emoji format. It doesn't describe error behavior or permissions, but those are not critical for an agent to invoke the tool correctly. The description is complete enough for the tool's complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds the emoji formatting rule ('without colons') and clarifies that channel_id can be a DM or IM id, which is already in the schema. The description adds marginal value beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('remove'), a specific resource ('emoji reaction the user added'), and the underlying API method (reactions.remove). It also distinguishes itself from the hosted catalog, which only has add/get, making it clear this is the removal counterpart. This is a precise, unambiguous definition that an agent can act on without opening the schema.

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

Usage Guidelines4/5

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

The description explicitly notes that the hosted catalog only has add/get, implying this tool is the way to remove reactions. It also gives a formatting guideline for the emoji parameter. However, it does not explicitly state when to use this tool versus alternatives like update_message or delete_message, though those are clearly different operations. The context is clear enough for an agent to select it correctly.

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

slack_stdio_scheduled_messagesA

List or cancel scheduled messages (chat.scheduledMessages.list / chat.deleteScheduledMessage). Hosted slack_schedule_message cannot cancel. action=list (optional channel_id) or action=cancel (channel_id + scheduled_message_id).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYeslist or cancel
channel_idNoRequired for cancel; optional filter for list
scheduled_message_idNoRequired when action=cancel

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full disclosure burden. It states the actions (list/cancel) but does not specify that cancel is permanently destructive or that list is read-only; nor does it mention permissions, rate limits, or side effects. While the actions are clear, the behavioral consequences are not fully disclosed, leaving meaningful gaps for an agent to infer.

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

Conciseness5/5

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

The description is two succinct sentences with zero fluff. The first sentence names the two operations and the API methods, and the second compactly explains the parameter rules per action. Information is front-loaded, and every clause contributes to understanding how to use the tool.

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

Completeness4/5

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

For a simple tool with only three parameters and no output schema, the description covers all necessary input scenarios and even links a related tool limitation. What's missing are details about return values (e.g., list response format) and potential errors, which would round out the picture but are not critical given the tool's simplicity.

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 schema already documents each parameter individually, but the description adds crucial relational semantics by grouping parameters by action: for list, channel_id is optional; for cancel, both channel_id and scheduled_message_id are required. This clarifies the parameter interplay beyond the schema's flat descriptions, making it easier for an agent to construct valid calls.

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

Purpose5/5

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

The description states specific verbs ('List or cancel') with a concrete resource ('scheduled messages') and includes the underlying API method names, making the tool's function unambiguous. It also implicitly differentiates from siblings (e.g., delete_message, update_message) by name and by the explicit mention of scheduled messages, so no agent would confuse it with related tools.

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

Usage Guidelines4/5

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

The description explicitly notes that 'Hosted slack_schedule_message cannot cancel,' which tells the agent when to choose this tool over its counterpart for cancellation. It also breaks down the two modes (list vs cancel) with their required parameters, providing clear usage context, though it doesn't mention scenarios where listing might be preferred over other tools.

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

slack_stdio_session_statusC

No Slack session. Ask the user to authorize Slack (open the URL and press Allow) before any Slack action, then retry. Report whether a Slack re-auth flow is in progress and the authorize URL if any.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of disclosing behavior. It states the output (re-auth progress and URL) but does not specify whether the tool is read-only, what happens when a session is valid, or any error conditions. The opening 'No Slack session' is misleading—it may be a static message rather than a reflection of tool behavior, and it does not clarify the tool's actual side effects.

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

Conciseness2/5

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

The description is short but not concise because the first sentence is an instruction to the agent ('Ask the user to authorize...') rather than a description of the tool. This waste of space confuses the reader and dilutes the actual functional description. The useful information is buried in the second sentence.

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?

Given there is no output schema, the description must fully explain the return value and behavior. It only mentions reporting re-auth flow and a URL, but does not describe the full set of possible statuses (e.g., session valid, no session, re-auth in progress) or how they are encoded. An agent cannot reliably interpret the tool's result or handle all cases.

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

Parameters4/5

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

The tool has zero parameters and schema coverage of 100% (empty schema), so the description does not need to explain parameter meaning. The baseline for no parameters is 4, and the description does not detract from this; it simply does not add anything beyond what the empty schema already implies.

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 name 'session_status' combined with the description's second sentence clearly states the tool reports whether a Slack re-auth flow is in progress and any authorize URL. This distinguishes it from action-oriented siblings like slack_stdio_reauth or update_message. However, the first sentence 'No Slack session. Ask the user to authorize Slack...' is ambiguous—it reads as a directive rather than a neutral description, muddying the purpose.

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 explicit guidance on when to call this tool versus alternatives. The sentence 'Ask the user to authorize Slack before any Slack action, then retry' implies a precondition check, but does not explicitly state 'use this tool to check if a session exists before invoking other Slack tools.' It also does not mention the sibling slack_stdio_reauth as a fallback or differentiate when to use reauth.

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

slack_stdio_update_messageA

Edit a message the user posted (chat.update). Hosted Slack MCP can send but not edit. Requires channel_id, message_ts, and the new message text.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesReplacement text (Slack mrkdwn)
channel_idYesChannel, DM, or IM id
message_tsYesTimestamp of the message to edit

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the edit scope ('message the user posted') and names the API, but it does not mention permissions, reversibility, error behavior, or what happens when the message_ts is invalid. This is a moderate gap for a mutation tool.

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

Conciseness5/5

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

Two short sentences with no filler. The core purpose is front-loaded, followed by the API name and required parameters. Every sentence earns its place.

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

Completeness4/5

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

For a simple three-parameter edit tool, the description covers purpose, the key limitation, and all required inputs. There is no output schema, but a successful edit's return shape is not critical for invoking the tool correctly. Slightly more detail on failure conditions would make it 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 100%, so the schema already documents all three parameters. The description adds only a restatement: it names channel_id, message_ts, and 'new message text', and clarifies that message is replacement text. This is baseline-adequate but adds little beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Edit a message the user posted', and names the underlying API (chat.update). This clearly distinguishes it from sibling tools like delete_message and remove_reaction, which are different operations.

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

Usage Guidelines4/5

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

The description explicitly notes that 'Hosted Slack MCP can send but not edit', which tells the agent when this custom tool is the right choice. It also lists the required identifiers. It could be stronger by stating when delete_message would be preferred, but the context is sufficiently clear.

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. 8 tool updatesv1.3.2
    • First observedslack_stdio_catalog
    • First observedslack_stdio_delete_message
    • First observedslack_stdio_download_file
    • First observedslack_stdio_reauth
    • First observedslack_stdio_remove_reaction
    • First observedslack_stdio_scheduled_messages
    • First observedslack_stdio_session_status
    • First observedslack_stdio_update_message

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct capability: auth initiation, auth status, file download, catalog inspection, message update/delete, reaction removal, and scheduled message list/cancel. Even the two auth-related tools are clearly separated into start-flow versus status-report roles, so an agent should not confuse them.

Naming Consistency4/5

All tools share the consistent slack_stdio_ prefix and use lowercase snake_case, which makes the set predictable. However, not every name follows verb_noun: reauth, catalog, session_status, and scheduled_messages are deviations, though they remain readable and still fit the overall pattern.

Tool Count5/5

Eight tools is a well-scoped size for a Slack MCP bridge that supplements a hosted catalog with missing operations. Every tool addresses a concrete gap or supporting need, with no redundant clutter.

Completeness5/5

The tool surface covers the stated gaps: reauthorization, file downloads, message editing/deletion, reaction removal, and scheduled message list/cancel. It also includes status and catalog tools to make the bridge self-explanatory, so there are no obvious dead ends for the server's intended role.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    The most powerful MCP server for Slack Workspaces. This integration supports both Stdio and SSE transports, proxy settings and does not require any permissions or bots being created or approved by Workspace admins 😏.
    2
    1,854
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Local stdio MCP proxy for the official Slack MCP endpoint, using Claude's Slack plugin for authentication to enable Slack integration via MCP without needing a custom Slack app.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Bridge that lets stdio-only MCP clients connect to remote MCP servers with OAuth and other auth support, enabling local clients to use remote, authorized MCP servers.
    19 npm
    54
    MIT