Skip to main content
Glama
Palgenius

Claude Code ⇄ Slack

by Palgenius

Claude Code ⇄ Slack

tests license: MIT node

Talk to Claude Code from a Slack channel, and watch it work while it answers.

An MCP server that runs a Slack app in Socket Mode — no tunnel, no public IP, nothing leaves your machine except what you send to Slack.

What it looks like in Slack

You @mention the bot in a channel. Your message gets 👀 the moment Claude picks it up, and ✅ when it finishes — so a question that was never seen is obvious without reading anything.

Ali        10:14
           @claude why is the login page redirecting to itself?
           👀

claude  ᴀᴘᴘ 10:14
           ⏳ Working…  ·  1m 12s  ·  14 tools  ·  7.8k tokens
           why is the login page redirecting to itself?

           …3 earlier
           Bash  Run the full test suite
           Read  auth.ts
           Edit  routes.ts
              └ 2 replies

The card is one message that rewrites itself — the clock ticks, tool calls scroll past. When the turn ends it becomes a summary of what changed:

claude  ᴀᴘᴘ 10:16
           ✅ Done  ·  2m 40s  ·  23 tools  ·  31k tokens
           why is the login page redirecting to itself?

           touched  auth.ts  routes.ts
              └ 2 replies

Claude's actual answer arrives in the thread, under your question:

              └ claude  ᴀᴘᴘ
                The guard tested `req.path`, which Express strips to the
                router-relative path, so its exemption never matched. Fixed in
                routes.ts — only new accounts had the flag, which is why only
                new users hit it.

A quick answer posts no card at all. The card appears once a turn calls a tool or runs past ten seconds; below that the reply in the thread is the whole record, and the channel stays quiet.

The channel always says whether anyone is home

claude  ᴀᴘᴘ 10:02
           🟢 Claude is connected · my-project
           Listening here since 10:02 — @mention me and I'll pick it up.

And if the server is up but nothing is delivering messages to the session, it says that instead — because "connected" would be a lie of omission:

claude  ᴀᴘᴘ 10:04
           🟡 Claude is connected but not listening · my-project
           Nothing is delivering messages to the session, so anything written
           here will wait unread. The session needs to start its mention watcher.

That is the whole reason you never have to ask whether it is working. The one failure that looks like silence announces itself in the channel.

And if you @mention while it is in that state, you get an answer rather than nothing:

              └ claude  ᴀᴘᴘ
                🟡 Got this, but nothing is delivering it to the session yet —
                so it is saved and unread rather than answered.

Worth knowing why this happens at all: Claude Code does nothing at session open. It acts only when prompted, so the CLAUDE.md instruction that starts the watcher runs on the session's first message rather than when the session opens. Open a session, go straight to Slack, and nothing is listening yet.

Exactly one of these per channel, moved to the bottom whenever it changes — so it is never buried under a day of conversation. When the session ends, the same line becomes:

           ⚪ Claude is offline · my-project
           Was connected 10:02–18:30 (8h 28m). Nothing is listening in this
           channel right now.

Without it, a quiet channel and a dead one look identical.

A checklist for longer jobs

slack_progress keeps a multi-step job to one self-rewriting message:

claude  ᴀᴘᴘ 11:31
           Deploy
           ✅ read the deployed file
           ✅ upload the release
           ⏳ run the deploy script      ← bold: the one running now
           ⏳ verify

Related MCP server: claude-slack-bridge

Why this exists

Claude Code delivers notifications/claude/channel only when the session was started with --channels, a research-preview flag the desktop app does not pass. The notification is accepted and then dropped by a capability gate — silently, with no error in any log, in Slack, or on screen.

So the obvious design (MCP server pushes the message at Claude) cannot work on most machines. This project works around it: mentions are written to a per-channel inbox on disk, and a small watcher turns each new one into an event in the session. Outbound has no counterpart API at all, so the live view is built by tailing the session transcript Claude Code already writes.

Everything here was verified against a live workspace. Where something is a recommendation rather than a fact about the code, the docs say so.


Features

Conversation

  • Replies land in the thread you asked in, not at the top of the channel

  • Markdown is converted to Slack's dialect — **bold**, headings, links and fenced code render properly instead of showing their syntax

  • Long messages are split on line boundaries, never truncated and never cut inside a code fence

  • Direct messages work without an @mention

  • Images and files you send are downloaded so Claude can actually look at them

Seeing what's happening

  • A live turn card that ticks with elapsed time, tool count and tokens, then collapses to the list of files the turn changed

  • slack_progress — a checklist kept to one self-rewriting message

  • A presence line per channel: 🟢 connected / ⚪ offline — exactly one message, moved to the bottom of the channel when it changes so it is never buried

  • slack_status — one call answers "is this actually working?"

Not losing things

  • Per-channel inbox and read cursor, so several projects don't read each other's messages

  • A message Slack delivers to the wrong project's server is routed to the right inbox rather than silently dropped

  • Servers exit with their session instead of orphaning and holding a socket

  • Status lines left behind by a crash are corrected by any other live session

Care with secrets (streaming is off by default)

  • thinking blocks have no path to the output

  • Credentials are masked on the way out: pass=, Slack tokens, connection strings, bearer headers, private keys, long hex runs

  • Tool detail, when enabled, uses only fields written to be read — never a command string, never file contents


Creating the Slack app

Do this once per workspace. It takes about five minutes. Every step is in the Slack app settings at https://api.slack.com/apps.

1. Create the app

Create New AppFrom scratch → give it a name (this is what people will @mention, e.g. claude) → pick your workspace → Create App.

2. Turn on Socket Mode

Left sidebar → Socket Mode → toggle Enable Socket Mode on.

It asks for a token name — anything, e.g. socket. It then shows a token starting with xapp-.

Copy it now. This is your SLACK_APP_TOKEN and Slack will not show it again. If you lose it, generate a new one under Basic Information → App-Level Tokens.

3. Add the bot scopes

Left sidebar → OAuth & Permissions → scroll to ScopesBot Token ScopesAdd an OAuth Scope for each:

Required — without these nothing works:

Scope

Needed for

chat:write

Posting, editing and deleting the bot's own messages

channels:history

Reading messages in public channels

groups:history

Reading messages in private channels

Optional — each one adds a feature, and skipping it costs only that feature. Nothing breaks; the log says what was refused:

Scope

Without it

reactions:write

No 👀 / ✅ marks on your message. Everything else works.

im:history

The bot cannot be used in a DM (see step 5)

files:read

Images and files people send cannot be downloaded

files:write

send_slack_image fails

canvases:write

create_slack_canvas fails

pins:write

Only needed if you set SLACK_STATUS_PIN=1

Add nothing else. This token ends up in a config file on your machine, so every extra scope is something it can do if it leaks. In particular you need no User Token Scopes at all — everything runs on the bot token.

4. Subscribe to message events

Left sidebar → Event Subscriptions → toggle Enable Events on.

There is no Request URL to fill in — Socket Mode replaces it. Ignore that box.

Open Subscribe to bot events and add:

Event

For

message.channels

Public channels

message.groups

Private channels

message.im

Direct messages

Then Save Changes at the bottom of the page. It is easy to miss.

5. Let people DM the bot

Left sidebar → App Home → scroll to Show Tabs → turn the Messages Tab on, and tick "Allow users to send Slash commands and messages from the messages tab."

Skip this and the DM box is read-only — you cannot even type to the bot. The scope and the event from the previous steps are not enough on their own, and nothing about the failure points at this setting.

Only needed for DMs. Channels work without it.

6. Install it

Left sidebar → Install AppInstall to WorkspaceAllow.

You now get a Bot User OAuth Token starting with xoxb-. This is your SLACK_BOT_TOKEN.

⚠️ Every time you change a scope after this, come back and click "Reinstall to Workspace" (a yellow banner appears at the top). A new scope does nothing until you do. The usual symptom is a 403 with an HTML page where a file should be.

7. Invite the bot to your channel

In Slack itself, in the channel you want to use:

/invite @YourBotName

Without this the bot receives nothing from that channel, whatever scopes it has.

8. Get the channel ID

Right-click the channel in the sidebar → View channel details → scroll to the bottom. The ID starts with C, e.g. C01ABCDEFGH. This is your SLACK_CHANNEL_ID.

(It is also the last part of the channel's URL in the browser version.)

You should now have three values

SLACK_APP_TOKEN   xapp-…   from step 2
SLACK_BOT_TOKEN   xoxb-…   from step 6
SLACK_CHANNEL_ID  C…       from step 8

The two tokens are not interchangeable. Swapping them gives not_allowed_token_type on every send, which is a confusing error to debug.


Quick start

1. Create the Slack app — the eight steps above.

2. Install:

git clone https://github.com/Palgenius/claude-code-slack-bridge.git
cd claude-code-slack-bridge && npm install

3. Add .mcp.json to your project:

{
  "mcpServers": {
    "slack-channel": {
      "type": "stdio",
      "command": "npx",
      "args": ["tsx", "/path/to/claude-code-slack-bridge/webhook.ts"],
      "env": {
        "SLACK_APP_TOKEN": "xapp-...",
        "SLACK_BOT_TOKEN": "xoxb-...",
        "SLACK_CHANNEL_ID": "C0..."
      }
    }
  }
}

4. Add the watcher section to your project's CLAUDE.md — copy it from SETUP-NEW-PROJECT.md.

5. Restart Claude Code, then ask it: "is slack connected?"


⚠️ The one thing to know

There are two processes and only one starts by itself.

Starts automatically?

Without it

MCP server

✅ with the session

Nothing works

Mention watcher

no

Messages arrive, are stored correctly, and nothing ever surfaces them

That second failure is the one that will cost you an evening: outbound keeps working, the channel looks alive, and the silence is indistinguishable from nobody having written to you.

So slack_status is the first thing to run whenever Slack seems quiet. The Watcher: line is the answer most of the time.


Documentation

QUICK-REFERENCE.md

One page — the session ritual, symptom→cause table, every tool and command. Start here.

SETUP-NEW-PROJECT.md

Full procedure for wiring a project, and troubleshooting in the order that finds the problem fastest

SLACK_MCP_INTEGRATION.md

Why the design is what it is — the capability gate, Socket Mode load-balancing, the transcript format

CHANGES.md

Every change and the reasoning behind it, including the failures


Tools Claude gets

Tool

For

slack_status

Is the bridge actually working, end to end

send_slack_message

Replying. Pass thread_ts back.

update_slack_message

Rewriting a message in place

slack_progress

A checklist for a multi-step job, kept to one message

send_slack_image

A screenshot or chart, inline

create_slack_canvas

Reference material that shouldn't scroll away

check_slack_inbox

Reading unread mentions manually


Architecture

Slack ──socket──► webhook.ts ──► slack-inbox-<channel>.jsonl
                      │                      │
                      │                      ▼
                      │        watch-mentions.mjs  (Monitor, persistent)
                      │                      │
                      │                      ▼
                      │              Claude Code session
                      │                      │
                      └────◄── tools ◄───────┘

            ~/.claude/projects/…/<session>.jsonl
                        │
                        ▼   tailed, when SLACK_STREAM=1
                  the live turn card

Module

webhook.ts

MCP server: tools, Slack listener, the live view

inbox.ts

Per-channel mention inbox, mention matching, subtype rules

slackRich.ts

Post, edit, upload, canvas, react — fetch injected so it is testable

mrkdwn.ts

Markdown → Slack mrkdwn, and splitting an over-long message

turn.ts

Reading turns out of the transcript, and rendering the live card

progress.ts

The slack_progress checklist

presence.ts

The 🟢/⚪ status line and the heartbeat files

transcript.ts

Finding and tailing the session transcript, and redaction

watch-mentions.mjs

Turns a stored mention into an event in the session


Tests

npm test

236 tests over eight modules using the Node test runner through tsx — no test dependencies. slackRich.ts takes fetch and fs as injected dependencies, so the Slack call sequences are checked without a workspace.

The turn tracker is also replayed against a real session transcript, not only fixtures. That is how the bug where one finished turn swallowed every later one was found: every fixture happened to begin with a user prompt, so the case that breaks it could not appear in one.


Known limits

  • The watcher does not start itself. The CLAUDE.md section makes Claude start it; that is advice to a model, not a hook. Verify with slack_status.

  • Two projects on one Slack app share delivery at random. Socket Mode load-balances across every connection. Strays are recovered through the per-channel inbox, so they are late rather than lost — but prefer one Slack app per project.

  • No way to interrupt Claude from Slack. Nothing in the protocol carries it.

  • The live view is a second or two behind and cannot show a partial sentence.

  • send_slack_image will upload any path it is given, with no allowlist.

  • Markdown tables become monospaced blocks. Slack has no table syntax, so the columns are padded to line up rather than arriving as stray pipes.


Credits

Built on AppGambitStudio/Claude-Code-Slack-Channel by Dhaval Nagar — the original Socket Mode MCP server and the send_slack_message tool. This project extends it with the inbox, threading, markdown conversion, the live view, progress boards, presence and status tooling.

MIT, with the original copyright retained. See LICENSE.

Available Tools

7 tools
check_slack_inboxA

Read Slack messages that @mentioned the bot and have not been read yet. Use this when the session cannot receive channel notifications (started without --channels), or to catch up on anything missed. Each message comes back with its channel id, so you can reply with send_slack_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
peekNoRead without marking the messages as read. Default false.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does add useful return-shape context (each message includes its channel id) plus the reply workflow. However, it never states that reading consumes/marks messages as read, nor any permission or rate-limit behavior — the read-state side effect is only inferable from the schema's peek parameter.

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: purpose first, then when to use, then what comes back and how to act on it. No filler or repetition.

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 one-parameter read tool with no output schema, the description covers purpose, trigger conditions, and the key returned field (channel id). Only the read-state side effect of the call is left to the schema, which is a minor gap.

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% and the single parameter (peek) is fully documented in the schema. The description adds no meaning beyond it, so the baseline 3 applies.

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 (Read) and resource (Slack messages that @mentioned the bot) with an explicit filter (not yet read). This cleanly distinguishes it from every sibling, which are all send/update/status write 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?

It gives two concrete triggers: sessions started without --channels that cannot receive notifications, and catching up on missed messages. It also routes the follow-up action to send_slack_message. No explicit 'do not use when' exclusion is given, keeping it 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.

create_slack_canvasA

Create a Slack canvas in a channel from markdown. Use for reference material people will come back to — a checklist, a runbook, a spec — rather than a message that scrolls away. Supports headings, lists, checkboxes, bold and code.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesCanvas title. Used when the channel already has a canvas and a standalone one is created instead.
channelYesThe Slack channel ID the canvas belongs to
markdownYesThe canvas body, as markdown

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 behavioral burden. It discloses the supported markdown constructs, which is useful, but says nothing about permissions/scopes required, rate limits, or what happens when the channel already has a canvas — a behavior the schema's title description hints at but the prose ignores.

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, front-loaded with the action, then the routing guidance, then the content-format detail. 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?

For a no-annotation, no-output-schema creation tool the description covers purpose, routing, and input format adequately. It omits the pre-existing-canvas behavior and any indication of what the caller gets back (e.g., a canvas ID), which are the remaining meaningful gaps.

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%, so the baseline is 3. The description adds real meaning for the markdown parameter by enumerating supported syntax (headings, lists, checkboxes, bold, code), going beyond the schema's terse 'canvas body, as markdown'.

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 ('Create a Slack canvas in a channel from markdown') and implicitly separates itself from send_slack_message by framing the artifact as durable reference material rather than a scrolling message. An agent can tell exactly what this produces 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?

Gives clear when-to-use guidance ('reference material people will come back to — a checklist, a runbook, a spec') and an explicit when-not ('rather than a message that scrolls away'). It stops short of naming a sibling tool by name, but the contrast against messaging is unambiguous.

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

send_slack_imageA

Upload a local image or file into a Slack channel, so it appears inline rather than as a link. Use for screenshots, diagrams and charts. The path must be a file on this machine.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoTitle shown above the file. Defaults to the filename.
channelYesThe Slack channel ID to upload into (e.g. C0AMZUV0JTZ)
commentNoOptional message posted with the file, explaining what it shows.
file_pathYesAbsolute path to the file on this machine
thread_tsNoUpload into a thread rather than the channel root.

TDQS

A3.8/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 behavioral burden. It usefully discloses that uploads render inline and that the path must be a file on this machine, but says nothing about required Slack scopes, file size/type limits, failure behavior, or what the tool returns on success.

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, front-loaded with the action and its distinguishing behavior. Every sentence carries information: what it does, when to use it, and the path constraint.

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 five-parameter upload tool with no annotations and no output schema, the description covers purpose, usage, and the key input constraint well enough to call it correctly. The main residual gap is post-call behavior (success result, error cases), which is not covered anywhere else.

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 all five parameters (title, channel, comment, file_path, thread_ts) are already documented in the schema. The description only reinforces file_path's local-file constraint and adds no new syntax or format detail beyond that baseline.

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?

Specific verb (upload) plus resource (a local image/file into a Slack channel) and it states the distinguishing outcome: content appears inline rather than as a link. That implicitly separates it from send_slack_message, though no sibling is named outright, so it falls 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 Guidelines4/5

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

"Use for screenshots, diagrams and charts" gives explicit positive usage context, and the inline-vs-link framing hints at when to prefer this over send_slack_message. There are no stated exclusions or prerequisites, so it is clear context without the when-not guidance that would earn a 5.

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

send_slack_messageA

Send a message to a Slack channel. Use this to reply to webhook channel incoming messages from Slack. Returns the message timestamp (ts) — pass it to update_slack_message to rewrite this message later, which is how a progress or "working on it" marker is kept to one line instead of many.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe reply, written as ordinary markdown. It is converted to Slack formatting for you — write **bold**, `code`, fenced blocks and [links](url) normally. A message over Slack's length limit is split across several posts rather than truncated.
channelYesThe Slack channel ID to send the message to (e.g. C0AMZUV0JTZ)
thread_tsNoReply inside a thread. Pass the thread_ts from the incoming message so the answer sits under the question instead of at the top of the channel. Omit only when starting a new topic.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it delivers key behavior: it returns the message timestamp (ts) and explains the chaining pattern with update_slack_message for keeping a progress marker to one line. It omits permissions/auth needs, rate limits, and failure behavior, so it is substantive but not complete.

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 sentences, front-loaded with the core action and the return-value/chaining contract. The second sentence is somewhat dense with a nested clause about the progress marker, but every part 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?

There is no output schema, so the description correctly fills the gap by naming the return value (ts) and its use. Combined with 100% schema coverage on inputs, an agent has nearly everything needed; only auth/error context is missing.

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 channel, text, and thread_ts are already fully documented in the schema, including markdown conversion and length-splitting. The description adds no parameter-level detail beyond that, so baseline 3 applies.

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+resource ('Send a message to a Slack channel') and further scopes it to replying to incoming webhook channel messages. It implicitly separates itself from update_slack_message (rewrite) and send_slack_image (images) by naming the former as the follow-up step.

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 a clear use case ('reply to webhook channel incoming messages from Slack') and points to update_slack_message for later rewriting. It stops short of explicitly stating when NOT to use this tool (e.g., use send_slack_image for images, update_slack_message for edits), so the agent must infer the alternatives from sibling names.

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

slack_progressA

A live checklist in Slack, kept to one message that rewrites itself as the work moves. Call once with steps to post the board and get back a ts; call again with that ts and update to change a step. Use it for any job with several stages — it replaces a run of "doing X now" messages with one line per step that people can glance at. Statuses: pending, active (the one running now), done, failed, skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsNoTimestamp of an existing board, as returned by the first call. Omit to create a new one.
stepsNoThe full checklist. Give plain strings to start every step pending, or objects {text, status} to set them explicitly. Required when creating; on an existing board this replaces the list outright.
titleNoHeading above the checklist, e.g. "Deploy". Optional.
footerNoA line under the checklist — a result, a link, a note. Optional.
updateNoChange individual steps without resending the list. Each entry is {step, status, text}, where `step` is a 0-based index or any substring of that step's text.
advanceNoFinish whatever is active and start the next pending step. The usual call between stages — it cannot leave the board looking stalled the way marking a step done and forgetting the next one does.
channelYesThe Slack channel ID the board lives in
thread_tsNoPost the board inside a thread. Only used when creating it.

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the single-message rewrite model, the ts handoff between calls, and the meaning of every status. It omits permissions/auth needs, rate limits, and failure behavior, which keeps it from 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?

Three sentences, front-loaded with the core concept before the mechanics and the status vocabulary. Nearly every clause earns its place; only the trailing status enumeration is somewhat redundant with the schema enums.

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 an 8-parameter stateful tool with no output schema and no annotations, the description covers the lifecycle and statuses adequately, and the remaining parameters (title, footer, advance, thread_ts) are well documented in the schema. Minor gaps remain around permissions and error cases.

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 ts, steps, update, advance, title, footer, thread_ts and channel. The description reinforces the ts/steps/update relationship but adds no syntax or constraints beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description gives a concrete, vivid verb+resource: a live Slack checklist kept to one self-rewriting message, plus the create/update lifecycle. It is clearly not a generic message tool, though it never names a sibling (e.g. update_slack_message) to sharpen the distinction.

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 states the calling pattern explicitly ('call once with steps... call again with that ts and update') and the intended context ('any job with several stages', replacing a run of 'doing X now' messages). No explicit when-not or named alternative, so it stops short of a 5.

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

slack_statusA

Check whether the Slack bridge is actually working end to end: is this server connected, is the mention watcher running (without it nothing inbound reaches this session), how many messages are waiting, and what other projects are connected to the same Slack app. Call this first whenever Slack seems unresponsive, or after starting a session, instead of guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses diagnostic outputs (connection state, watcher status, queued messages) and the behavioral consequence of the watcher not running ('nothing inbound reaches this session'). It does not mention any read-only guarantee or side effects, but the diagnostic nature is clear from context.

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 front-loaded with the core diagnostic purpose and then lists the specific things checked. It is slightly long but every clause adds distinct information; no filler or repetition.

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

Completeness5/5

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

For a zero-parameter diagnostic tool with no annotations and no output schema, the description fully compensates by detailing what the tool checks and when to call it. An agent has everything needed to invoke it correctly and interpret the results.

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

Parameters4/5

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

With zero parameters, the baseline is 4. The description correctly indicates no inputs are needed and focuses on outputs instead, which is appropriate for a no-arg diagnostic tool.

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 and resource (check the Slack bridge end to end) and enumerates exactly what it returns: connection state, mention watcher status, queued message count, and other connected projects. This clearly distinguishes it from siblings like check_slack_inbox or send_slack_message, which perform 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 Guidelines5/5

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

It provides explicit when-to-use guidance: call it first when Slack seems unresponsive or after starting a session, and explicitly says 'instead of guessing'. This gives the agent a clear decision rule that no sibling tool provides.

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

update_slack_messageA

Rewrite a message already posted, given its timestamp from send_slack_message. Use it to keep a live status marker on one line: post "working on X", then update it as the work moves and once more when it is done. Far better than posting a new message per step. Only messages this bot posted can be rewritten.

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYesTimestamp of the message to rewrite, as returned by send_slack_message
textYesThe replacement text, in full — this is a rewrite, not an append. Ordinary markdown; it is converted for you.
channelYesThe channel the message is in — must match where it was posted

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the critical behavioral constraint (bot-authored messages only) plus replacement-not-append semantics. It is silent on failure modes for stale/deleted timestamps and Slack update rate limits, which leaves a real 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.

Conciseness4/5

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

Front-loaded with the core action in the first clause, and each subsequent sentence carries distinct value (usage pattern, rationale, constraint). The illustrative status-marker example is slightly long but is the justification for the tool's existence.

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 no-annotation mutation tool with no output schema, the description covers what to rewrite, how to obtain the identifier, the recommended pattern, and the authorization boundary. Missing only error/edge behavior (non-bot messages, expired timestamps).

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 all three parameters are already documented, including that ts comes from send_slack_message and that text is a full replacement. The description reinforces the ts provenance but adds no new parameter semantics beyond the schema baseline.

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 (rewrite) and resource (a message already posted), plus the key identifier (timestamp from send_slack_message). An agent can distinguish this from send_slack_message, send_slack_image, and slack_progress without opening any schema.

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?

Gives an explicit workflow (post 'working on X', update as work moves, update once when done) and names the anti-pattern it replaces ('far better than posting a new message per step'). It also states the hard precondition: only messages this bot posted can be rewritten.

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. 7 tool updatesv2.0.0
    • First observedcheck_slack_inbox
    • First observedcreate_slack_canvas
    • First observedsend_slack_image
    • First observedsend_slack_message
    • First observedslack_progress
    • First observedslack_status
    • First observedupdate_slack_message

TDQS

A4/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a fairly distinct purpose: reading, sending, updating, uploading images, progress checklist, canvas creation, and diagnostics. There is mild overlap between slack_progress and update_slack_message since both rewrite an existing message, but descriptions clearly explain when to use each (progress board vs. single status line).

Naming Consistency3/5

Conventions are mixed: check_slack_inbox, send_slack_message, update_slack_message, send_slack_image, create_slack_canvas use verb_slack_noun, while slack_progress and slack_status invert to noun-first. Still readable, but not a predictable pattern across the set.

Tool Count5/5

Seven tools map cleanly onto the Slack bridge's needs—inbound read, outbound send/update, file upload, progress, canvas, and health—without redundancy or thinness.

Completeness4/5

Covers read, reply, edit, upload, structured progress, persistent canvas, and diagnostics, which is strong lifecycle coverage. Missing a few likely operations like reacting to messages, listing channels, or deleting messages, but these are minor gaps agents can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers