@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.
Files changed (59) hide show
  1. package/README.md +63 -28
  2. package/docs/SETUP.md +64 -29
  3. package/docs/TROUBLESHOOTING.md +28 -0
  4. package/lib/handlers.js +156 -0
  5. package/lib/slack-client.js +11 -3
  6. package/lib/token-store.js +6 -5
  7. package/lib/tools.js +131 -0
  8. package/package.json +35 -36
  9. package/public/index.html +10 -6
  10. package/public/share.html +128 -0
  11. package/scripts/setup-wizard.js +1 -1
  12. package/server.json +10 -4
  13. package/src/server-http.js +16 -1
  14. package/src/server.js +31 -7
  15. package/src/web-server.js +119 -4
  16. package/docs/CLOUDFLARE-BROWSER-TOOLKIT.md +0 -67
  17. package/docs/COMMUNICATION-STYLE.md +0 -66
  18. package/docs/COMPATIBILITY.md +0 -19
  19. package/docs/DEPLOYMENT-MODES.md +0 -55
  20. package/docs/HN-LAUNCH.md +0 -72
  21. package/docs/INDEX.md +0 -40
  22. package/docs/INSTALL-PROOF.md +0 -18
  23. package/docs/LAUNCH-COPY-v3.0.0.md +0 -73
  24. package/docs/LAUNCH-MATRIX.md +0 -22
  25. package/docs/LAUNCH-OPS.md +0 -71
  26. package/docs/RELEASE-HEALTH.md +0 -90
  27. package/docs/SUPPORT-BOUNDARIES.md +0 -49
  28. package/docs/USE_CASE_RECIPES.md +0 -69
  29. package/docs/WEB-API.md +0 -303
  30. package/docs/images/demo-channel-messages.png +0 -0
  31. package/docs/images/demo-channels.png +0 -0
  32. package/docs/images/demo-claude-mobile-360x800.png +0 -0
  33. package/docs/images/demo-claude-mobile-390x844.png +0 -0
  34. package/docs/images/demo-main-mobile-360x800.png +0 -0
  35. package/docs/images/demo-main-mobile-390x844.png +0 -0
  36. package/docs/images/demo-main.png +0 -0
  37. package/docs/images/demo-messages.png +0 -0
  38. package/docs/images/demo-poster.png +0 -0
  39. package/docs/images/demo-sidebar.png +0 -0
  40. package/docs/images/diagram-oauth-comparison.svg +0 -80
  41. package/docs/images/diagram-session-flow.svg +0 -105
  42. package/docs/images/web-api-mobile-360x800.png +0 -0
  43. package/docs/images/web-api-mobile-390x844.png +0 -0
  44. package/public/demo-claude.html +0 -1958
  45. package/public/demo-video.html +0 -235
  46. package/public/demo.html +0 -1196
  47. package/scripts/build-release-health-delta.js +0 -201
  48. package/scripts/capture-screenshots.js +0 -146
  49. package/scripts/check-owner-attribution.sh +0 -80
  50. package/scripts/check-public-language.sh +0 -25
  51. package/scripts/check-version-parity.js +0 -176
  52. package/scripts/cloudflare-browser-tool.js +0 -237
  53. package/scripts/collect-release-health.js +0 -150
  54. package/scripts/record-demo.js +0 -162
  55. package/scripts/release-preflight.js +0 -243
  56. package/scripts/setup-git-hooks.sh +0 -15
  57. package/scripts/verify-core.js +0 -159
  58. package/scripts/verify-install-flow.js +0 -193
  59. 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.0.0
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.0.0",
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.0.0`);
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
- ```
@@ -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.
@@ -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)
@@ -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>.`
@@ -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.