v4.8.0 — tool profiles and request pacing
No MCP tool contracts changed. This release addresses the two running costs of a browser-session Slack server: the tool schema a client carries on every turn, and the request velocity Slack's session-anomaly detection watches.
Tool profiles
SLACK_MCP_TOOLS=essentials|read|all, or --tools=<comma-separated tool names>.
| profile | tools | est. tokens of schema per turn |
|---|---|---|
all (default) |
21 | ~3,600 |
read |
12 | ~1,690 |
essentials |
6 | ~985 |
essentials covers the common case: unread, history, search, thread, user lookup, send.
The default stays all, so existing installs are unchanged. Filtering changes what is advertised, not what is callable — every handler stays wired, and an unrecognized value falls back to all rather than to zero. npm run measure:tools reproduces the numbers (a ~4-chars-per-token estimate, not tokenizer-exact).
Request pacing, on by default
Outbound calls are spaced by a minimum inter-request interval and capped in concurrency, to stay under the burst thresholds Slack's session-anomaly detection watches — most aggressively on Enterprise Grid.
SLACK_MCP_MIN_REQUEST_INTERVAL_MS— default 350;0disables spacing.SLACK_MCP_MAX_CONCURRENCY— default 3.
Pacing lowers that risk; it does not remove it. On Grid, the hosted OAuth tier or Slack's official MCP remains the session-safe path.
Documentation
New README section, "Grid, credentials, and caching": the Enterprise Grid session-anomaly risk and the pacing that mitigates it; the credential extraction path (Chrome LevelDB token, cookie SQLite database, Keychain Safe Storage, local PBKDF2 + AES-128-CBC decryption, local-only writes); its similarity to the access pattern credential stealers use; and the contents of the single user-name cache. The local/hosted boundary is stated: local never contacts us, hosted never receives a browser cookie.
Fixed
--tools --setup consumed --setup as the tool-profile value and removed it from the child arguments, so the setup wizard silently never ran. The same defect existed on --profile. Both separated-operand forms are now guarded: a following --option means the value is missing, which exits 1 with usage.
Full changelog: https://github.com/jtalk22/slack-mcp-server/blob/main/CHANGELOG.md