GuideMCPSlack desktop automation

A Slack MCP server with no bot token, because there is no Slack API call

Every Slack MCP server you have seen (Slack's own, korotovsky's, the Workato one, the listings on PulseMCP) is a wrapper around the Slack Web API. It needs a bot token, a workspace admin to install the app, and it can only do what the API exposes. Terminator is a different shape. It gives your coding agent a Slack surface by driving the process:Slack desktop window through OS accessibility APIs. The MCP agent source contains zero references to api.slack.com. That is the whole point.

T
Terminator
10 min read
4.9from Open-source, MIT
No xoxb bot token, no OAuth, no Slack marketplace install
Acts as the logged-in human, so it sees every DM the human sees
Drives huddles, canvases, reactions, anything the UI ships
Same binary also drives Excel, VS Code, Chrome, Teams, Notepad

Two Slack MCP architectures

If you search for slack mcp server, almost every result lands you in the same architecture: a local Node or Go process that holds an xoxb-... bot token, makes HTTPS requests to api.slack.com, and translates MCP tool calls into Slack Web API endpoints. The server is a thin protocol adapter between the LLM and the Slack Web API. That architecture is real, it works, and it is the right answer when you have API access.

But it has a prerequisite most docs gloss over: someone with admin rights on your Slack workspace has to approve the install. If you are at a bank, a healthcare company, a government contractor, or just a large enterprise with a careful admin, that approval often does not come. Terminator sidesteps the prerequisite entirely by going through the surface your human teammates already use: the Slack desktop app they are signed into.

What an MCP tool call actually reaches

Claude Code
Cursor
Windsurf
terminator-mcp-agent
process:Slack
process:EXCEL
process:Cursor
process:chrome

The shape of "nothing Slack-specific"

Four numbers, all pulled from the Terminator repo. They add up to the same claim: this is a general desktop automation MCP server, and Slack comes for free.

0HTTP calls to api.slack.com in the MCP agent source
0Slack OAuth scopes, tokens, or client secrets
0Line in prompt.rs that mentions Slack (process name only)
0Total MCP tools, all generic, all work on Slack
0

bot tokens required

0

admin approvals

0%

of UI reachable

0

MCP server to install

Anchor fact: no Slack Web API code, anywhere

This is the claim that is easy to check and that none of the other Slack MCP server pages can make about themselves. The Terminator MCP agent, the one that implements the MCP tools an LLM sees, does not import a Slack SDK, does not hold a Slack token, and does not send a single request to api.slack.com. You can clone the repo and verify in two commands:

terminator repo: grep for Slack Web API plumbing

The only place "Slack" shows up in the MCP agent crate is a single line inside the system prompt, listing it as one of several common process names the LLM might be asked to automate. Here is that block exactly:

crates/terminator-mcp-agent/src/prompt.rs

That is the whole Slack-specific surface area of the codebase: one word in a process-name list. Everything else is generic. The MCP server does not know Slack is a chat app; it knows process:Slack is a window with an accessibility tree, and tree nodes with names like Message #eng-oncall and Send now behave like any other UI elements.

Bot-token Slack MCP server vs accessibility-driven Slack MCP server

Concrete tradeoffs, not vibes. Pick the one that matches your workspace's security posture and your actual use case.

FeatureSlack Web API MCP serversTerminator MCP
Auth modelBot user OAuth token (xoxb-...), installed by a workspace adminYour existing logged-in Slack desktop session. No token.
Install in a locked-down workspaceBlocked if the admin has not approved the Slack appWorks anyway, because you are not installing anything into Slack
Action surfaceWhatever the Web API exposes: chat.postMessage, conversations.history, files.upload, ...Anything a human can click, type, drag, or keyboard-shortcut inside the Slack client
DMs and private channelsOnly visible if the bot was explicitly addedEvery channel and DM the logged-in human can see
Huddles, Canvases, Lists, WorkflowsOnly the surfaces with API endpointsClickable UI, so whatever ships in the client this week is automatable this week
Rate limitsTier 1-4 rate limits (e.g. 1/sec for chat.postMessage)Throttled by UI response time, not by HTTP quotas
Audit trailShows up as the bot user in audit logsActions attributed to the actual human, like any desktop app use
Enterprise Grid and regulated orgsFrequently blocked; Slack marketplace approval requiredRuns on the endpoint. No inbound network change, no new Slack app
Code surfaceA Slack-specific server per vendor. One more MCP client config per tool.One MCP server (terminator-mcp-agent) that also drives Excel, VS Code, Chrome, Teams

What one tool call looks like end to end

Five steps, all generic, none of them know anything about Slack beyond the process name and the role/name of the elements they target.

slack-deploy-notice.yml

The round trip of that click_element call

1

LLM emits an MCP tool call

Claude or Cursor picks type_into_element and ships JSON-RPC over stdio to the local terminator-mcp-agent process.

2

dispatch_tool routes it

server.rs has one match arm per tool; the Slack case uses the same arms as Notepad, Excel, or VS Code. There is no Slack-specific code path.

3

Selector resolves against the Slack UIA tree

process:Slack >> role:Edit && name:Message #eng-oncall is matched against the live accessibility tree the Slack client publishes to Windows UI Automation.

4

Terminator performs the native action

Focuses the element, sends the text through the OS input pipeline, optionally captures a before/after tree diff so the agent can confirm the UI actually changed.

5

Result returns to the LLM

Slack renders the message. Terminator returns the accessibility diff to the agent. The agent picks the next step (reply in thread, add a reaction, open a canvas).

What this unlocks that a Web API server cannot

The Slack Web API is intentionally narrow. The desktop client is whatever Slack has shipped this quarter. Driving the client gets you the whole thing.

Send as the logged-in human

Type into the message composer, press Send now, add @mentions, thread replies, scheduled sends, all from the same account the user is actually signed in as.

Read DMs the bot cannot

A bot user only sees DMs it is invited to. The desktop client sees every DM and private channel the human can see. Agents inherit that.

Start or join huddles

No Slack API endpoint for that. A click on role:Button && name:Huddle is a click on role:Button && name:Huddle.

Drive Slack Canvas and Lists

Whatever ships in the Slack client this month, Terminator can drive next morning. New UI is new selectors, not a wait on Slack API parity.

Bulk react with emoji

The agent opens the reaction picker, types the emoji name, presses Enter. No rate limit beyond UI responsiveness.

Search history like a user

Ctrl+G opens Slack's native search. Agents type the query, read the results pane directly out of the accessibility tree.

0 bot tokens

A desktop automation MCP is the only Slack MCP that does not need your workspace admin to say yes first.

Terminator docs

Selectors your agent will actually emit

These are the kinds of strings that end up inside click_element and type_into_element when the LLM is working inside Slack. They look a lot like CSS selectors for your UI tree.

process:Slack >> role:Edit && name:Messageprocess:Slack >> role:Button && name:Send nowprocess:Slack >> role:Button && name:Huddleprocess:Slack >> role:Edit && name:Jump to...process:Slack >> role:Button && name:Add reactionprocess:Slack >> role:TabItem && name:Threadsprocess:Slack >> role:Edit && name:Searchprocess:Slack >> role:Button && name:Bookmarkprocess:Slack >> role:Button && name:Start a huddleprocess:Slack >> role:TreeItem && name:DMs

Install it as your Slack MCP server

One command, the Slack desktop app you already have open, and any MCP-aware editor. No Slack app to create, no OAuth consent screen to click through, no admin to email.

Claude Code, from empty machine to first Slack action

The honest tradeoff

A Slack MCP server that acts as you is strictly more powerful than one that acts as a sanctioned bot. It is also strictly more you-shaped: the agent reads your DMs, posts as your account, and shows up in audit logs as you, not as a bot. For a lot of real engineering work that is exactly the right posture, because the thing you want is an assistant, not a colleague. For any workflow that needs a separate identity, an approved app, or a server-side audit trail independent of a human login, use the Web API path. These two are complementary, not competitive.

Frequently asked questions

What is a Slack MCP server?

An MCP server is a local program that exposes tools an AI coding assistant (Claude Code, Cursor, VS Code, Windsurf) can call over the Model Context Protocol. A Slack MCP server is one that makes Slack itself one of those tools. Every popular Slack MCP server today (Slack's own reference implementation, korotovsky/slack-mcp-server, the Workato connector, the PulseMCP listing) is a wrapper around Slack's Web API: you install a Slack app with a bot user, grant it OAuth scopes, and the server translates LLM tool calls into chat.postMessage, conversations.history, and similar HTTP requests. Terminator is a different shape of Slack MCP server: it is a general desktop automation MCP server that already knows how to drive any application, and Slack is one of those applications. The Slack surface comes for free with process:Slack selectors.

Why would I want a Slack MCP server that does not use the Slack API?

Four concrete reasons. First, many corporate and regulated Slack workspaces do not let you install arbitrary bot apps, so the bot-token route is a dead end before you start. Second, bots only see what they have been explicitly invited to; a desktop-driven agent sees every channel and DM the human is signed in to, which is usually the point. Third, Slack ships UI faster than API. Huddles, canvases, lists, and new reaction interactions show up in the client months before, and sometimes without ever, getting a first-class Web API endpoint. Fourth, you do not need to manage yet another token or workspace approval, because you are not installing anything into Slack. You are using the client a human is already using.

How does Terminator actually talk to Slack?

Through the same accessibility APIs a screen reader uses. On Windows that is UI Automation (UIA); on macOS it is the Accessibility API (AX). Slack's desktop client is Electron, and well-behaved Electron apps expose a usable accessibility tree. Terminator's selector engine matches strings like process:Slack >> role:Edit && name:Message against the nodes in that tree, then performs the action (click, type, invoke, press key) through the OS input pipeline. There is no HTTP call to slack.com in any of it. The MCP agent crate in the repo does not import a Slack SDK; a grep for xoxb, api.slack, chat.postMessage, or bot_token inside crates/terminator-mcp-agent/src returns zero matches.

What does the anchor fact actually look like in the code?

Open crates/terminator-mcp-agent/src/prompt.rs. Lines 61-67 are a list of common process names, one of which is Slack. That block is pasted verbatim into the system prompt the MCP server announces at initialize time. It is the only place the string "Slack" appears in the MCP agent. The SDK list in llms.txt repeats the same entry on line 234. The benchmarks file references Slack only as a browser benchmark URL (slack.com/signin), not as an integration. That is the whole surface area of Slack knowledge the codebase has, and it is all accessibility-driven.

Does this work on macOS, Windows, or both?

Both, with caveats. The Terminator core is cross-platform Rust, with platform adapters for Windows UI Automation and macOS AX. Coverage is best on Windows because UIA is the richer accessibility API and the MCP agent ships a Windows binary first. macOS works and is actively used, but depends on the app under automation exposing a clean AX tree. In practice Slack on both platforms is usable; if you hit a subtree the agent cannot match, you can fall back to coordinate-based clicks or OCR. Linux is best-effort via AT-SPI.

How is this different from Claude computer use or OpenAI computer use?

Those approaches take a screenshot, send it to a vision model, have the model decide where to click in pixel coordinates, and then the runtime issues a system-level click at those coordinates. That is one round-trip to an LLM per action and one loss-of-context per screenshot. Terminator uses structured accessibility data instead of pixels, so the LLM sees a tree of typed elements (role:Button, role:Edit, name:Send now) the same way Playwright lets it see a DOM. Actions happen at CPU speed, not LLM-inference speed. Vision is available as a fallback (there is a gemini_computer_use tool) but it is not the main path.

Can an agent read my Slack DMs with this?

Yes, the same way you can: by focusing Slack, clicking into a DM, and reading the message text out of the accessibility tree. That is a strong capability and a strong responsibility. The agent runs on your endpoint under your user account, with whatever network identity you have. Anything it does in Slack is attributable to you, not to a bot. If you are building a Slack MCP workflow that reads DMs, make sure your policy is comfortable with that posture. The tradeoff is exactly the one you get by giving any local automation tool your logged-in session.

What about rate limits?

Slack's Web API has tier-based rate limits; chat.postMessage, for instance, is roughly one per second per channel, and the more expensive endpoints (conversations.history, search.messages) are tighter. Because Terminator does not hit the Web API, those limits do not apply. The effective limit is how fast the Slack client can update its UI and how fast the accessibility tree rebuilds. In practice this is fast enough for interactive agent use. If you are doing bulk data movement (exporting years of channel history) you should still use the Slack Export API or a proper dump tool; accessibility-driven scraping is the wrong shape for that.

How do I install it in Claude Code, Cursor, or VS Code?

claude mcp add terminator "npx -y terminator-mcp-agent@latest" -s user for Claude Code. For Cursor and VS Code there are deep-link install buttons in the Terminator MCP Agent README. The agent is published as an npm package that wraps a Rust binary; the editor spawns it as a child process over stdio by default, or over HTTP if you pass -t http. Once the server is attached, ask the LLM to do anything involving Slack, and it will pick process:Slack selectors on its own because the system prompt lists Slack as a known process.

Where does this approach stop working?

Two places. First, when Slack renders a subtree as custom-painted pixels with no accessibility nodes underneath, selectors cannot match it and you fall back to coordinate clicks or vision. The Slack desktop client is mostly well-behaved about this but not universally. Second, when you need truly headless, server-side execution at scale with no human machine in the loop, accessibility-driven automation is not the right tool; you want the Slack Web API for that. Terminator is built for the case where there is a logged-in human and an agent is acting on their behalf, on their machine, inside the apps they already have open.

Give your coding agent a Slack surface without asking anyone

Terminator is open-source (MIT), runs locally, and attaches to any MCP client. Add it once, and your agent can drive Slack, Excel, VS Code, Chrome, and every other accessible desktop app from the same place.

Open the GitHub repo
terminatorDesktop automation SDK
© 2026 terminator. All rights reserved.