@jtalk22/slack-mcp 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -28
- package/docs/SETUP.md +64 -29
- package/docs/TROUBLESHOOTING.md +28 -0
- package/lib/handlers.js +156 -0
- package/lib/slack-client.js +11 -3
- package/lib/token-store.js +6 -5
- package/lib/tools.js +131 -0
- package/package.json +35 -36
- package/public/index.html +10 -6
- package/public/share.html +128 -0
- package/scripts/setup-wizard.js +1 -1
- package/server.json +10 -4
- package/src/server-http.js +16 -1
- package/src/server.js +31 -7
- package/src/web-server.js +119 -4
- package/docs/CLOUDFLARE-BROWSER-TOOLKIT.md +0 -67
- package/docs/COMMUNICATION-STYLE.md +0 -66
- package/docs/COMPATIBILITY.md +0 -19
- package/docs/DEPLOYMENT-MODES.md +0 -55
- package/docs/HN-LAUNCH.md +0 -72
- package/docs/INDEX.md +0 -40
- package/docs/INSTALL-PROOF.md +0 -18
- package/docs/LAUNCH-COPY-v3.0.0.md +0 -73
- package/docs/LAUNCH-MATRIX.md +0 -22
- package/docs/LAUNCH-OPS.md +0 -71
- package/docs/RELEASE-HEALTH.md +0 -90
- package/docs/SUPPORT-BOUNDARIES.md +0 -49
- package/docs/USE_CASE_RECIPES.md +0 -69
- package/docs/WEB-API.md +0 -303
- package/docs/images/demo-channel-messages.png +0 -0
- package/docs/images/demo-channels.png +0 -0
- package/docs/images/demo-claude-mobile-360x800.png +0 -0
- package/docs/images/demo-claude-mobile-390x844.png +0 -0
- package/docs/images/demo-main-mobile-360x800.png +0 -0
- package/docs/images/demo-main-mobile-390x844.png +0 -0
- package/docs/images/demo-main.png +0 -0
- package/docs/images/demo-messages.png +0 -0
- package/docs/images/demo-poster.png +0 -0
- package/docs/images/demo-sidebar.png +0 -0
- package/docs/images/diagram-oauth-comparison.svg +0 -80
- package/docs/images/diagram-session-flow.svg +0 -105
- package/docs/images/web-api-mobile-360x800.png +0 -0
- package/docs/images/web-api-mobile-390x844.png +0 -0
- package/public/demo-claude.html +0 -1958
- package/public/demo-video.html +0 -235
- package/public/demo.html +0 -1196
- package/scripts/build-release-health-delta.js +0 -201
- package/scripts/capture-screenshots.js +0 -146
- package/scripts/check-owner-attribution.sh +0 -80
- package/scripts/check-public-language.sh +0 -25
- package/scripts/check-version-parity.js +0 -176
- package/scripts/cloudflare-browser-tool.js +0 -237
- package/scripts/collect-release-health.js +0 -150
- package/scripts/record-demo.js +0 -162
- package/scripts/release-preflight.js +0 -243
- package/scripts/setup-git-hooks.sh +0 -15
- package/scripts/verify-core.js +0 -159
- package/scripts/verify-install-flow.js +0 -193
- package/scripts/verify-web.js +0 -269
package/src/web-server.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Exposes Slack MCP tools as REST endpoints for browser access.
|
|
6
6
|
* Run alongside or instead of the MCP server for web-based access.
|
|
7
7
|
*
|
|
8
|
-
* @version 3.
|
|
8
|
+
* @version 3.2.0
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import express from "express";
|
|
@@ -30,6 +30,11 @@ import {
|
|
|
30
30
|
handleSendMessage,
|
|
31
31
|
handleGetThread,
|
|
32
32
|
handleListUsers,
|
|
33
|
+
handleAddReaction,
|
|
34
|
+
handleRemoveReaction,
|
|
35
|
+
handleConversationsMark,
|
|
36
|
+
handleConversationsUnreads,
|
|
37
|
+
handleUsersSearch,
|
|
33
38
|
} from "../lib/handlers.js";
|
|
34
39
|
|
|
35
40
|
const app = express();
|
|
@@ -66,6 +71,8 @@ const API_KEY = getOrCreateAPIKey();
|
|
|
66
71
|
// Middleware
|
|
67
72
|
app.use(express.json());
|
|
68
73
|
app.use(express.static(join(__dirname, "../public")));
|
|
74
|
+
// Compatibility alias so local web mode supports GitHub Pages-style /public/* URLs.
|
|
75
|
+
app.use("/public", express.static(join(__dirname, "../public")));
|
|
69
76
|
// Keep /docs URL compatibility for demo media and documentation links.
|
|
70
77
|
app.use("/docs", express.static(join(__dirname, "../docs")));
|
|
71
78
|
|
|
@@ -84,7 +91,7 @@ app.use((req, res, next) => {
|
|
|
84
91
|
res.header("Access-Control-Allow-Origin", origin);
|
|
85
92
|
}
|
|
86
93
|
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
87
|
-
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
94
|
+
res.header("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
88
95
|
if (req.method === "OPTIONS") {
|
|
89
96
|
return res.sendStatus(200);
|
|
90
97
|
}
|
|
@@ -134,7 +141,7 @@ function extractContent(result) {
|
|
|
134
141
|
app.get("/", (req, res) => {
|
|
135
142
|
res.json({
|
|
136
143
|
name: "Slack Web API Server",
|
|
137
|
-
version: "3.
|
|
144
|
+
version: "3.2.0",
|
|
138
145
|
status: "ok",
|
|
139
146
|
code: "ok",
|
|
140
147
|
message: "Web API server is running.",
|
|
@@ -149,6 +156,11 @@ app.get("/", (req, res) => {
|
|
|
149
156
|
"POST /messages",
|
|
150
157
|
"GET /users",
|
|
151
158
|
"GET /users/:id",
|
|
159
|
+
"POST /reactions",
|
|
160
|
+
"DELETE /reactions",
|
|
161
|
+
"POST /conversations/:id/mark",
|
|
162
|
+
"GET /conversations/unreads",
|
|
163
|
+
"GET /users/search",
|
|
152
164
|
],
|
|
153
165
|
docs: "Add Authorization: Bearer <api-key> header to all requests"
|
|
154
166
|
});
|
|
@@ -205,6 +217,19 @@ app.get("/conversations", authenticate, async (req, res) => {
|
|
|
205
217
|
}
|
|
206
218
|
});
|
|
207
219
|
|
|
220
|
+
// Get unread conversations
|
|
221
|
+
app.get("/conversations/unreads", authenticate, async (req, res) => {
|
|
222
|
+
try {
|
|
223
|
+
const result = await handleConversationsUnreads({
|
|
224
|
+
types: req.query.types || "im,mpim,public_channel,private_channel",
|
|
225
|
+
limit: parseInt(req.query.limit) || 50
|
|
226
|
+
});
|
|
227
|
+
res.json(extractContent(result));
|
|
228
|
+
} catch (e) {
|
|
229
|
+
sendStructuredError(res, 500, "unreads_failed", String(e?.message || e));
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
208
233
|
// Get conversation history
|
|
209
234
|
app.get("/conversations/:id/history", authenticate, async (req, res) => {
|
|
210
235
|
try {
|
|
@@ -251,6 +276,28 @@ app.get("/conversations/:id/thread/:ts", authenticate, async (req, res) => {
|
|
|
251
276
|
}
|
|
252
277
|
});
|
|
253
278
|
|
|
279
|
+
// Mark conversation as read
|
|
280
|
+
app.post("/conversations/:id/mark", authenticate, async (req, res) => {
|
|
281
|
+
try {
|
|
282
|
+
if (!req.body.timestamp) {
|
|
283
|
+
return sendStructuredError(
|
|
284
|
+
res,
|
|
285
|
+
400,
|
|
286
|
+
"invalid_request",
|
|
287
|
+
"timestamp is required",
|
|
288
|
+
"Include timestamp in request JSON."
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
const result = await handleConversationsMark({
|
|
292
|
+
channel_id: req.params.id,
|
|
293
|
+
timestamp: req.body.timestamp
|
|
294
|
+
});
|
|
295
|
+
res.json(extractContent(result));
|
|
296
|
+
} catch (e) {
|
|
297
|
+
sendStructuredError(res, 500, "mark_failed", String(e?.message || e));
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
254
301
|
// Search messages
|
|
255
302
|
app.get("/search", authenticate, async (req, res) => {
|
|
256
303
|
try {
|
|
@@ -308,6 +355,28 @@ app.get("/users", authenticate, async (req, res) => {
|
|
|
308
355
|
}
|
|
309
356
|
});
|
|
310
357
|
|
|
358
|
+
// Search users (must be registered before /users/:id to avoid Express matching "search" as an ID)
|
|
359
|
+
app.get("/users/search", authenticate, async (req, res) => {
|
|
360
|
+
try {
|
|
361
|
+
if (!req.query.q) {
|
|
362
|
+
return sendStructuredError(
|
|
363
|
+
res,
|
|
364
|
+
400,
|
|
365
|
+
"invalid_request",
|
|
366
|
+
"Query parameter 'q' is required",
|
|
367
|
+
"Set the q query string and retry."
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
const result = await handleUsersSearch({
|
|
371
|
+
query: req.query.q,
|
|
372
|
+
limit: parseInt(req.query.limit) || 20
|
|
373
|
+
});
|
|
374
|
+
res.json(extractContent(result));
|
|
375
|
+
} catch (e) {
|
|
376
|
+
sendStructuredError(res, 500, "user_search_failed", String(e?.message || e));
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
|
|
311
380
|
// Get user info
|
|
312
381
|
app.get("/users/:id", authenticate, async (req, res) => {
|
|
313
382
|
try {
|
|
@@ -320,6 +389,52 @@ app.get("/users/:id", authenticate, async (req, res) => {
|
|
|
320
389
|
}
|
|
321
390
|
});
|
|
322
391
|
|
|
392
|
+
// Add reaction
|
|
393
|
+
app.post("/reactions", authenticate, async (req, res) => {
|
|
394
|
+
try {
|
|
395
|
+
if (!req.body.channel_id || !req.body.timestamp || !req.body.reaction) {
|
|
396
|
+
return sendStructuredError(
|
|
397
|
+
res,
|
|
398
|
+
400,
|
|
399
|
+
"invalid_request",
|
|
400
|
+
"channel_id, timestamp, and reaction are required",
|
|
401
|
+
"Include channel_id, timestamp, and reaction in request JSON."
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
const result = await handleAddReaction({
|
|
405
|
+
channel_id: req.body.channel_id,
|
|
406
|
+
timestamp: req.body.timestamp,
|
|
407
|
+
reaction: req.body.reaction
|
|
408
|
+
});
|
|
409
|
+
res.json(extractContent(result));
|
|
410
|
+
} catch (e) {
|
|
411
|
+
sendStructuredError(res, 500, "add_reaction_failed", String(e?.message || e));
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
// Remove reaction
|
|
416
|
+
app.delete("/reactions", authenticate, async (req, res) => {
|
|
417
|
+
try {
|
|
418
|
+
if (!req.body.channel_id || !req.body.timestamp || !req.body.reaction) {
|
|
419
|
+
return sendStructuredError(
|
|
420
|
+
res,
|
|
421
|
+
400,
|
|
422
|
+
"invalid_request",
|
|
423
|
+
"channel_id, timestamp, and reaction are required",
|
|
424
|
+
"Include channel_id, timestamp, and reaction in request JSON."
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
const result = await handleRemoveReaction({
|
|
428
|
+
channel_id: req.body.channel_id,
|
|
429
|
+
timestamp: req.body.timestamp,
|
|
430
|
+
reaction: req.body.reaction
|
|
431
|
+
});
|
|
432
|
+
res.json(extractContent(result));
|
|
433
|
+
} catch (e) {
|
|
434
|
+
sendStructuredError(res, 500, "remove_reaction_failed", String(e?.message || e));
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
|
|
323
438
|
// Start server
|
|
324
439
|
async function main() {
|
|
325
440
|
// Check for credentials
|
|
@@ -335,7 +450,7 @@ async function main() {
|
|
|
335
450
|
app.listen(PORT, '127.0.0.1', () => {
|
|
336
451
|
// Print to stderr to keep logs clean (stdout reserved for JSON in some setups)
|
|
337
452
|
console.error(`\n${"═".repeat(60)}`);
|
|
338
|
-
console.error(` Slack Web API Server v3.
|
|
453
|
+
console.error(` Slack Web API Server v3.2.0`);
|
|
339
454
|
console.error(`${"═".repeat(60)}`);
|
|
340
455
|
console.error(`\n Dashboard: http://localhost:${PORT}/?key=${API_KEY}`);
|
|
341
456
|
console.error(`\n API Key: ${API_KEY}`);
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# Cloudflare Browser Toolkit
|
|
2
|
-
|
|
3
|
-
Use Cloudflare Browser Rendering from this repo to run resilient page checks and captures when local browser automation is blocked.
|
|
4
|
-
|
|
5
|
-
## Prerequisites
|
|
6
|
-
|
|
7
|
-
- `CLOUDFLARE_ACCOUNT_ID` set
|
|
8
|
-
- `CLOUDFLARE_API_TOKEN` **or** `CF_TERRAFORM_TOKEN` set
|
|
9
|
-
- Token needs Browser Rendering access
|
|
10
|
-
- Account API tokens are supported (recommended for this workflow)
|
|
11
|
-
|
|
12
|
-
## Verify Access
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
npm run cf:browser -- verify
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
The verifier checks account-token auth (`/accounts/{account_id}/tokens/verify`) first and falls back to user-token verification automatically.
|
|
19
|
-
|
|
20
|
-
## Quick Commands
|
|
21
|
-
|
|
22
|
-
Rendered HTML:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npm run cf:browser -- content "https://example.com"
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Markdown extract:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
npm run cf:browser -- markdown "https://example.com"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Link extraction:
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
npm run cf:browser -- links "https://example.com"
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Selector scrape:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
npm run cf:browser -- scrape "https://example.com" --selectors "h1,.card a"
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Screenshot:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
npm run cf:browser -- screenshot "https://example.com" --out ./tmp/example.png --type png
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
PDF:
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
npm run cf:browser -- pdf "https://example.com" --out ./tmp/example.pdf
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Structured JSON:
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
npm run cf:browser -- json "https://example.com" --schema '{"title":"string","links":["string"]}'
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Notes
|
|
65
|
-
|
|
66
|
-
- This toolkit is for page rendering, extraction, and evidence capture.
|
|
67
|
-
- It does not manage third-party account logins for posting workflows.
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Communication Style Guide
|
|
2
|
-
|
|
3
|
-
Use this guide for release notes, issue replies, and changelog entries.
|
|
4
|
-
|
|
5
|
-
## Rules
|
|
6
|
-
|
|
7
|
-
1. Keep text technical, concise, and factual.
|
|
8
|
-
2. Do not include model/tool credit lines.
|
|
9
|
-
3. Do not include co-author trailers from tooling.
|
|
10
|
-
4. State exact versions and commands when relevant.
|
|
11
|
-
5. Avoid speculative claims.
|
|
12
|
-
6. Release titles use `vX.Y.Z — <concrete operational outcome>`.
|
|
13
|
-
|
|
14
|
-
## Issue Reply Template
|
|
15
|
-
|
|
16
|
-
```md
|
|
17
|
-
Thanks for reporting this.
|
|
18
|
-
|
|
19
|
-
Status: fixed in `<version>`.
|
|
20
|
-
|
|
21
|
-
Included:
|
|
22
|
-
- `<fix 1>`
|
|
23
|
-
- `<fix 2>`
|
|
24
|
-
|
|
25
|
-
Verify:
|
|
26
|
-
- `npx -y @jtalk22/slack-mcp --version`
|
|
27
|
-
- `npx -y @jtalk22/slack-mcp --status`
|
|
28
|
-
|
|
29
|
-
Install/update:
|
|
30
|
-
- `npx -y @jtalk22/slack-mcp`
|
|
31
|
-
- `npm i -g @jtalk22/slack-mcp@<version>`
|
|
32
|
-
|
|
33
|
-
If it still reproduces, reply with OS, Node version, runtime mode (`stdio|web|http|worker`), and exact error output.
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Release Notes Template
|
|
37
|
-
|
|
38
|
-
````md
|
|
39
|
-
## <version> — <short title>
|
|
40
|
-
|
|
41
|
-
### Improved
|
|
42
|
-
- <item>
|
|
43
|
-
- <item>
|
|
44
|
-
|
|
45
|
-
### Compatibility
|
|
46
|
-
- No API/tool schema changes.
|
|
47
|
-
|
|
48
|
-
### Verify
|
|
49
|
-
```bash
|
|
50
|
-
npx -y @jtalk22/slack-mcp --version
|
|
51
|
-
npx -y @jtalk22/slack-mcp --setup
|
|
52
|
-
npx -y @jtalk22/slack-mcp --status
|
|
53
|
-
```
|
|
54
|
-
````
|
|
55
|
-
|
|
56
|
-
## Changelog Entry Template
|
|
57
|
-
|
|
58
|
-
```md
|
|
59
|
-
## [<version>] - YYYY-MM-DD
|
|
60
|
-
|
|
61
|
-
### Fixed
|
|
62
|
-
- <item>
|
|
63
|
-
|
|
64
|
-
### Changed
|
|
65
|
-
- <item>
|
|
66
|
-
```
|
package/docs/COMPATIBILITY.md
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Compatibility Matrix
|
|
2
|
-
|
|
3
|
-
Use this matrix to choose a known working client/runtime path before rollout.
|
|
4
|
-
|
|
5
|
-
| Client | Mode | Token path | Status | Quick verify command |
|
|
6
|
-
|---|---|---|---|---|
|
|
7
|
-
| Claude Desktop (macOS) | `stdio` | `~/.slack-mcp-tokens.json` via `--setup` auto-extract | Supported | `npx -y @jtalk22/slack-mcp --setup && npx -y @jtalk22/slack-mcp --status` |
|
|
8
|
-
| Claude Desktop (Windows) | `stdio` | `env` (`SLACK_TOKEN`, `SLACK_COOKIE`) in config | Supported | `npx -y @jtalk22/slack-mcp --status` |
|
|
9
|
-
| Claude Desktop (Linux) | `stdio` | `env` or token file via guided setup | Supported | `npx -y @jtalk22/slack-mcp --status` |
|
|
10
|
-
| Claude Code CLI | `stdio` | `~/.slack-mcp-tokens.json` or `env` | Supported | `npx -y @jtalk22/slack-mcp --version && npx -y @jtalk22/slack-mcp --status` |
|
|
11
|
-
| Local Browser UI | `web` | token file or `env` | Supported | `npx -y @jtalk22/slack-mcp web` |
|
|
12
|
-
| Hosted Node Runtime | `http` | `env` in host runtime | Supported with operator controls | `node src/server-http.js` then `curl -s http://localhost:8080/health` |
|
|
13
|
-
| Cloudflare Worker / Smithery transport | `worker` | runtime env/query handoff per deployment config | Supported with deployment validation | `wrangler deploy --config workers/wrangler.toml` and verify `/health` |
|
|
14
|
-
|
|
15
|
-
## Notes
|
|
16
|
-
|
|
17
|
-
1. Runtime baseline is Node 20+.
|
|
18
|
-
2. `--doctor` is the fastest first check when setup status is unknown.
|
|
19
|
-
3. For hosted/team deployment, use [DEPLOYMENT-MODES.md](DEPLOYMENT-MODES.md) before production rollout.
|
package/docs/DEPLOYMENT-MODES.md
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# Deployment Modes
|
|
2
|
-
|
|
3
|
-
Use this guide to choose the right operating mode before rollout.
|
|
4
|
-
|
|
5
|
-
## Quick Chooser
|
|
6
|
-
|
|
7
|
-
- Choose `stdio` for personal use in Claude Desktop/Claude Code.
|
|
8
|
-
- Choose local `web` for browser workflows and manual Slack browsing.
|
|
9
|
-
- Choose hosted HTTP only when you need remote execution and can handle token operations.
|
|
10
|
-
- Choose Smithery/Worker only when your consumers require registry-hosted MCP transport.
|
|
11
|
-
|
|
12
|
-
## Mode Matrix
|
|
13
|
-
|
|
14
|
-
| Mode | Start Command | Best For | Auth Material | Exposure | Notes |
|
|
15
|
-
|------|---------------|----------|---------------|----------|-------|
|
|
16
|
-
| Local MCP (`stdio`) | `npx -y @jtalk22/slack-mcp` | Individual daily usage in Claude | `SLACK_TOKEN` + `SLACK_COOKIE` via token file/env | Local process | Lowest ops burden |
|
|
17
|
-
| Local Web UI (`web`) | `npx -y @jtalk22/slack-mcp web` | Browser-first usage, manual search/send | Same as above + generated API key | `localhost` by default | Useful when MCP is not available |
|
|
18
|
-
| Hosted MCP (`http`) | `node src/server-http.js` | Controlled hosted integration | Env-injected Slack token/cookie + HTTP bearer token | Remote endpoint | `/mcp` is bearer-protected by default; configure CORS allowlist |
|
|
19
|
-
| Smithery/Worker | `wrangler deploy` + Smithery publish flow | Registry distribution for hosted consumers | Query/env token handoff | Remote endpoint | Keep worker version parity with npm release |
|
|
20
|
-
|
|
21
|
-
## Team Deployment Guidance
|
|
22
|
-
|
|
23
|
-
If you are deploying for more than one operator:
|
|
24
|
-
|
|
25
|
-
1. Start with one maintainer on local `stdio`.
|
|
26
|
-
2. Document token lifecycle and rotation ownership.
|
|
27
|
-
3. Define support window and incident contact before enabling hosted mode.
|
|
28
|
-
4. Validate `/health` and MCP initialize responses on every release.
|
|
29
|
-
|
|
30
|
-
## Release Checklist by Mode
|
|
31
|
-
|
|
32
|
-
### Local `stdio`
|
|
33
|
-
|
|
34
|
-
1. `npx -y @jtalk22/slack-mcp --status`
|
|
35
|
-
2. `npx -y @jtalk22/slack-mcp --help`
|
|
36
|
-
3. Confirm tool list in Claude client.
|
|
37
|
-
|
|
38
|
-
### Local `web`
|
|
39
|
-
|
|
40
|
-
1. `npx -y @jtalk22/slack-mcp web`
|
|
41
|
-
2. Verify API key generation at `~/.slack-mcp-api-key`.
|
|
42
|
-
3. Verify `/health`, `/conversations`, and `/search` endpoints.
|
|
43
|
-
|
|
44
|
-
### Hosted (`http` or Worker)
|
|
45
|
-
|
|
46
|
-
1. Verify `version` parity across `package.json`, server metadata, and health responses.
|
|
47
|
-
2. Verify HTTP auth behavior:
|
|
48
|
-
- missing `SLACK_MCP_HTTP_AUTH_TOKEN` returns `503`
|
|
49
|
-
- bad bearer token returns `401`
|
|
50
|
-
- valid bearer token succeeds
|
|
51
|
-
3. Verify CORS behavior:
|
|
52
|
-
- denied by default
|
|
53
|
-
- allowed origins work when listed in `SLACK_MCP_HTTP_ALLOWED_ORIGINS`
|
|
54
|
-
4. Confirm `slack_get_thread`, `slack_search_messages`, and `slack_users_info` behavior.
|
|
55
|
-
5. Confirm token handling mode (ephemeral vs env persistence) is documented.
|
package/docs/HN-LAUNCH.md
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# HN Launch Kit (v3.0.0)
|
|
2
|
-
|
|
3
|
-
Use this for Show HN and follow-up comments.
|
|
4
|
-
|
|
5
|
-
## Title Options
|
|
6
|
-
|
|
7
|
-
- `Show HN: Slack MCP Server v3.0.0 (secure-default hosted mode, local-first unchanged)`
|
|
8
|
-
- `Show HN: Slack MCP Server v3.0.0 (session-based Slack access for MCP clients)`
|
|
9
|
-
- `Show HN: Slack MCP Server v3.0.0 (hosted HTTP now auth-by-default)`
|
|
10
|
-
|
|
11
|
-
## Main Post Draft
|
|
12
|
-
|
|
13
|
-
```md
|
|
14
|
-
Released `@jtalk22/slack-mcp@3.0.0`.
|
|
15
|
-
|
|
16
|
-
This release keeps local session-mirroring intact (`stdio`, `web`) and hardens hosted HTTP defaults:
|
|
17
|
-
- `/mcp` requires bearer auth by default
|
|
18
|
-
- CORS requires explicit origin allowlisting
|
|
19
|
-
- no MCP tool renames/removals
|
|
20
|
-
- `--doctor` stays deterministic (`0/1/2/3`)
|
|
21
|
-
- `--status` stays read-only
|
|
22
|
-
|
|
23
|
-
Verify in 30 seconds:
|
|
24
|
-
- `npx -y @jtalk22/slack-mcp@latest --version`
|
|
25
|
-
- `npx -y @jtalk22/slack-mcp@latest --doctor`
|
|
26
|
-
- `npx -y @jtalk22/slack-mcp@latest --status`
|
|
27
|
-
|
|
28
|
-
Repo: https://github.com/jtalk22/slack-mcp-server
|
|
29
|
-
npm: https://www.npmjs.com/package/@jtalk22/slack-mcp
|
|
30
|
-
Release notes: https://github.com/jtalk22/slack-mcp-server/blob/main/.github/v3.0.0-release-notes.md
|
|
31
|
-
Maintainer/operator: `jtalk22` (`james@revasser.nyc`)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## First Comment Draft
|
|
35
|
-
|
|
36
|
-
```md
|
|
37
|
-
Additional operator notes:
|
|
38
|
-
- Local users (`stdio`, `web`) do not need migration.
|
|
39
|
-
- Hosted users need `SLACK_MCP_HTTP_AUTH_TOKEN` and `SLACK_MCP_HTTP_ALLOWED_ORIGINS` configured.
|
|
40
|
-
- Emergency local fallback is available via `SLACK_MCP_HTTP_INSECURE=1`.
|
|
41
|
-
|
|
42
|
-
If something fails, include:
|
|
43
|
-
- OS + Node version
|
|
44
|
-
- runtime mode (`stdio|web|http|worker`)
|
|
45
|
-
- exact command + output
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Reply Macros
|
|
49
|
-
|
|
50
|
-
### Why not Slack OAuth?
|
|
51
|
-
|
|
52
|
-
Session mirroring uses the access already present in the signed-in Slack web session, which is useful for operator workflows where a bot scope model is too limiting.
|
|
53
|
-
|
|
54
|
-
### Is hosted required?
|
|
55
|
-
|
|
56
|
-
No. Local-first use is still the default and fully supported.
|
|
57
|
-
|
|
58
|
-
### Did the tool API change?
|
|
59
|
-
|
|
60
|
-
No MCP tool names were removed or renamed in `v3.0.0`.
|
|
61
|
-
|
|
62
|
-
### Why a major version?
|
|
63
|
-
|
|
64
|
-
Hosted HTTP defaults changed to auth-by-default behavior, which can change existing hosted deployments.
|
|
65
|
-
|
|
66
|
-
### What should users run first?
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
npx -y @jtalk22/slack-mcp@latest --version
|
|
70
|
-
npx -y @jtalk22/slack-mcp@latest --doctor
|
|
71
|
-
npx -y @jtalk22/slack-mcp@latest --status
|
|
72
|
-
```
|
package/docs/INDEX.md
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# Documentation Index
|
|
2
|
-
|
|
3
|
-
Start here for setup, compatibility checks, operations, and support.
|
|
4
|
-
|
|
5
|
-
## Core
|
|
6
|
-
|
|
7
|
-
- [Setup Guide](SETUP.md)
|
|
8
|
-
- [Compatibility Matrix](COMPATIBILITY.md)
|
|
9
|
-
- [API Reference](API.md)
|
|
10
|
-
- [Web API Reference](WEB-API.md)
|
|
11
|
-
- [Troubleshooting](TROUBLESHOOTING.md)
|
|
12
|
-
|
|
13
|
-
## Operations
|
|
14
|
-
|
|
15
|
-
- [Deployment Modes](DEPLOYMENT-MODES.md)
|
|
16
|
-
- [Cloudflare Browser Toolkit](CLOUDFLARE-BROWSER-TOOLKIT.md)
|
|
17
|
-
- [Use Case Recipes](USE_CASE_RECIPES.md)
|
|
18
|
-
- [Support Boundaries](SUPPORT-BOUNDARIES.md)
|
|
19
|
-
|
|
20
|
-
## Launch and Communication
|
|
21
|
-
|
|
22
|
-
- [HN Launch Kit](HN-LAUNCH.md)
|
|
23
|
-
- [Launch Copy (v3.0.0)](LAUNCH-COPY-v3.0.0.md)
|
|
24
|
-
- [Launch Ops Runbook](LAUNCH-OPS.md)
|
|
25
|
-
- [Capability Matrix](LAUNCH-MATRIX.md)
|
|
26
|
-
- [Install Proof Block](INSTALL-PROOF.md)
|
|
27
|
-
- [Release Notes (v3.0.0)](../.github/v3.0.0-release-notes.md)
|
|
28
|
-
- [Communication Style](COMMUNICATION-STYLE.md)
|
|
29
|
-
- [Release Health Guide](RELEASE-HEALTH.md)
|
|
30
|
-
- [Latest Release Health Snapshot](release-health/latest.md)
|
|
31
|
-
- [Version Parity Report](release-health/version-parity.md)
|
|
32
|
-
- [Prepublish Dry Run Report](release-health/prepublish-dry-run.md)
|
|
33
|
-
- [Launch Log Template](release-health/launch-log-template.md)
|
|
34
|
-
- [Changelog](../CHANGELOG.md)
|
|
35
|
-
|
|
36
|
-
## Issue Intake
|
|
37
|
-
|
|
38
|
-
- [Bug Report Template](../.github/ISSUE_TEMPLATE/bug_report.md)
|
|
39
|
-
- [Feature Request Template](../.github/ISSUE_TEMPLATE/feature_request.md)
|
|
40
|
-
- [Deployment Intake Template](../.github/ISSUE_TEMPLATE/deployment-intake.md)
|
package/docs/INSTALL-PROOF.md
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Install Proof Block (v3.0.0)
|
|
2
|
-
|
|
3
|
-
Use this command block in release notes, HN/X/Reddit follow-ups, and issue replies.
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npx -y @jtalk22/slack-mcp@latest --version
|
|
7
|
-
npx -y @jtalk22/slack-mcp@latest --doctor
|
|
8
|
-
npx -y @jtalk22/slack-mcp@latest --status
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Expected:
|
|
12
|
-
- `--version` prints `slack-mcp-server v3.0.0`
|
|
13
|
-
- `--doctor` exits with:
|
|
14
|
-
- `0` ready
|
|
15
|
-
- `1` missing credentials
|
|
16
|
-
- `2` invalid or expired credentials
|
|
17
|
-
- `3` runtime or connectivity issue
|
|
18
|
-
- `--status` is read-only and does not trigger Chrome extraction.
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# Launch Copy (v3.0.0)
|
|
2
|
-
|
|
3
|
-
Canonical text blocks for GitHub release surfaces, listings, and operator updates.
|
|
4
|
-
|
|
5
|
-
## Short Summary (Public)
|
|
6
|
-
|
|
7
|
-
`@jtalk22/slack-mcp v3.0.0` is live. This release keeps local-first operation unchanged (`stdio`, `web`) and hardens hosted HTTP mode with secure defaults. Hosted `/mcp` now requires bearer authentication using `SLACK_MCP_HTTP_AUTH_TOKEN`, and browser-origin access now uses explicit allowlisting via `SLACK_MCP_HTTP_ALLOWED_ORIGINS`. The major version reflects this hosted behavior change; local workflows and MCP tool names remain stable. Diagnostics remain deterministic (`--doctor` returns `0|1|2|3`), and `--status` remains read-only for safe checks. Public demo/media checks are now included in web verification so broken assets are caught before publish. Maintainer/operator: `jtalk22` (`james@revasser.nyc`).
|
|
8
|
-
|
|
9
|
-
## GitHub Release Block
|
|
10
|
-
|
|
11
|
-
```md
|
|
12
|
-
`v3.0.0` secures hosted HTTP defaults while keeping local-first workflows stable.
|
|
13
|
-
|
|
14
|
-
What changed:
|
|
15
|
-
- `/mcp` requires bearer auth by default
|
|
16
|
-
- CORS is origin-allowlist driven (`SLACK_MCP_HTTP_ALLOWED_ORIGINS`)
|
|
17
|
-
- no MCP tool renames/removals
|
|
18
|
-
- deterministic diagnostics are preserved
|
|
19
|
-
|
|
20
|
-
Verify:
|
|
21
|
-
`npx -y @jtalk22/slack-mcp@latest --version`
|
|
22
|
-
`npx -y @jtalk22/slack-mcp@latest --doctor`
|
|
23
|
-
`npx -y @jtalk22/slack-mcp@latest --status`
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Hosted Migration Block
|
|
27
|
-
|
|
28
|
-
```md
|
|
29
|
-
Hosted migration in under a minute:
|
|
30
|
-
`SLACK_TOKEN=xoxc-...`
|
|
31
|
-
`SLACK_COOKIE=xoxd-...`
|
|
32
|
-
`SLACK_MCP_HTTP_AUTH_TOKEN=change-this`
|
|
33
|
-
`SLACK_MCP_HTTP_ALLOWED_ORIGINS=https://claude.ai`
|
|
34
|
-
`node src/server-http.js`
|
|
35
|
-
|
|
36
|
-
Requests must include:
|
|
37
|
-
`Authorization: Bearer <SLACK_MCP_HTTP_AUTH_TOKEN>`
|
|
38
|
-
|
|
39
|
-
Emergency local fallback only:
|
|
40
|
-
`SLACK_MCP_HTTP_INSECURE=1 node src/server-http.js`
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## GitHub Discussion Announcement
|
|
44
|
-
|
|
45
|
-
```md
|
|
46
|
-
`v3.0.0` is published.
|
|
47
|
-
|
|
48
|
-
- Hosted HTTP now enforces auth-by-default and explicit CORS policy.
|
|
49
|
-
- Local-first paths (`stdio`, `web`) remain unchanged.
|
|
50
|
-
- MCP tool names remain unchanged.
|
|
51
|
-
|
|
52
|
-
If you hit a deployment blocker, open deployment intake and include runtime mode + exact output.
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Listing Snippet (awesome-mcp-servers / registries)
|
|
56
|
-
|
|
57
|
-
```md
|
|
58
|
-
Session-based Slack MCP server for local-first operators. `v3.0.0` hardens hosted HTTP defaults (bearer auth + origin allowlist) while keeping local tool contracts stable.
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Support Intake Snippet
|
|
62
|
-
|
|
63
|
-
```md
|
|
64
|
-
Need guided hosted deployment help?
|
|
65
|
-
- Open deployment intake: `https://github.com/jtalk22/slack-mcp-server/issues/new?template=deployment-intake.md`
|
|
66
|
-
- Continue in Discussions: `https://github.com/jtalk22/slack-mcp-server/discussions`
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Propagation Note
|
|
70
|
-
|
|
71
|
-
Use when listing or registry caches lag:
|
|
72
|
-
|
|
73
|
-
`Release is published. Metadata propagation is in progress as of <UTC timestamp>.`
|
package/docs/LAUNCH-MATRIX.md
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Capability Matrix (v3.0.0)
|
|
2
|
-
|
|
3
|
-
Comparison matrix for release notes and channel posts. Keep competitor references unnamed.
|
|
4
|
-
|
|
5
|
-
| Capability | This Release (`v3.0.0`) | Typical Session-Based Alternatives |
|
|
6
|
-
|---|---|---|
|
|
7
|
-
| Read-only status checks | Enforced and verified in install flow | Often undocumented or mixed with refresh side effects |
|
|
8
|
-
| Deterministic doctor exits | Enforced (`0/1/2/3`) with install-path coverage | Often ad-hoc or text-only |
|
|
9
|
-
| Structured diagnostics | Shared fields in MCP/web error payloads | Mixed payload shapes |
|
|
10
|
-
| Hosted HTTP auth default | Bearer required on `/mcp` by default | Often permissive by default |
|
|
11
|
-
| Hosted HTTP CORS | Explicit allowlist (`SLACK_MCP_HTTP_ALLOWED_ORIGINS`) | Often wildcard/implicit |
|
|
12
|
-
| Unknown token age handling | Explicit `unknown_age` semantics | Missing timestamp may appear as stale/failing |
|
|
13
|
-
| Tool contract stability | No MCP tool rename/removal | Varies by release |
|
|
14
|
-
| Local-first operator path | First-class (`stdio`, `web`) | Varies by runtime emphasis |
|
|
15
|
-
| Version parity check | Scripted local/npm/registry report | Often manual |
|
|
16
|
-
| Smithery/registry alignment | Metadata prepared in release wave | Often delayed post-release |
|
|
17
|
-
|
|
18
|
-
## Usage Guidance
|
|
19
|
-
|
|
20
|
-
1. Use this table in release notes and social threads.
|
|
21
|
-
2. Do not name external projects.
|
|
22
|
-
3. Keep claims tied to verifiable commands and docs.
|