@jtalk22/slack-mcp 1.2.1 → 1.2.2

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 CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  <p align="center">
8
8
  <em>Give Claude the same Slack access you have.<br>
9
- DMs, threads, history—no admin approval.</em>
9
+ DMs, threads, history—using your existing Slack session.</em>
10
10
  </p>
11
11
 
12
12
  <p align="center">
@@ -39,7 +39,7 @@
39
39
 
40
40
  ### Why This Exists
41
41
 
42
- I built this because I was working with someone to help me manage a complex workload, and we kept hitting walls. They needed context from my messages—"what did X say about Y?"—but Slack's API blocks access to DMs without admin approval.
42
+ I built this because I was working with someone to help me manage a complex workload, and we kept hitting walls. They needed context from my messages—"what did X say about Y?"—and standard app/OAuth flows were too constrained for that workflow.
43
43
 
44
44
  Screenshotting messages is not a workflow.
45
45
 
@@ -100,6 +100,16 @@ Instead of authenticating as a bot, this server leverages your existing Chrome s
100
100
 
101
101
  **Runtime:** Node.js 20+
102
102
 
103
+ ### 2-Minute Verify
104
+
105
+ ```bash
106
+ npx -y @jtalk22/slack-mcp --version
107
+ npx -y @jtalk22/slack-mcp --setup
108
+ npx -y @jtalk22/slack-mcp --status
109
+ ```
110
+
111
+ If `--status` returns valid workspace/user info, your install path is working.
112
+
103
113
  ### Option A: npm (Recommended)
104
114
 
105
115
  ```bash
@@ -131,7 +141,7 @@ docker pull ghcr.io/jtalk22/slack-mcp-server:latest
131
141
  The interactive setup wizard handles token extraction and validation automatically:
132
142
 
133
143
  ```bash
134
- npx @jtalk22/slack-mcp --setup
144
+ npx -y @jtalk22/slack-mcp --setup
135
145
  ```
136
146
 
137
147
  - **macOS**: Auto-extracts tokens from Chrome (have Slack open in a tab)
@@ -142,7 +152,7 @@ npx @jtalk22/slack-mcp --setup
142
152
  #### Check Token Status
143
153
 
144
154
  ```bash
145
- npx @jtalk22/slack-mcp --status
155
+ npx -y @jtalk22/slack-mcp --status
146
156
  ```
147
157
 
148
158
  #### Alternative: Manual Token Scripts
@@ -283,14 +293,14 @@ If you're using claude.ai in a browser (which doesn't support MCP), you can use
283
293
 
284
294
  ```bash
285
295
  npm run web
286
- # Or: npx @jtalk22/slack-mcp web
296
+ # Or: npx -y @jtalk22/slack-mcp web
287
297
  ```
288
298
 
289
299
  **Magic Link:** The console prints a one-click URL with the API key embedded:
290
300
 
291
301
  ```
292
302
  ════════════════════════════════════════════════════════════
293
- Slack Web API Server v1.2.1
303
+ Slack Web API Server v1.2.2
294
304
  ════════════════════════════════════════════════════════════
295
305
 
296
306
  Dashboard: http://localhost:3000/?key=smcp_xxxxxxxxxxxx
@@ -309,6 +319,16 @@ Just click the link - no copy-paste needed. The key is saved to your browser and
309
319
 
310
320
  ---
311
321
 
322
+ ## Operations Guides
323
+
324
+ - [Deployment Modes](docs/DEPLOYMENT-MODES.md) - Choose the right operating model (`stdio`, `web`, hosted HTTP, Smithery/Worker)
325
+ - [Use Case Recipes](docs/USE_CASE_RECIPES.md) - 12 copy/paste prompts mapped to current tool contracts
326
+ - [Support Boundaries](docs/SUPPORT-BOUNDARIES.md) - Scope, response targets, and solo-maintainer capacity limits
327
+
328
+ If you're evaluating team rollout, start with [Deployment Modes](docs/DEPLOYMENT-MODES.md) before exposing remote endpoints.
329
+
330
+ ---
331
+
312
332
  ## Troubleshooting
313
333
 
314
334
  ### Tokens Expired
@@ -0,0 +1,58 @@
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
+
13
+ ## Issue Reply Template
14
+
15
+ ```md
16
+ Thanks for reporting this.
17
+
18
+ Status: fixed in `<version>`.
19
+
20
+ Included:
21
+ - `<change 1>`
22
+ - `<change 2>`
23
+
24
+ Install/update:
25
+ - `npx -y @jtalk22/slack-mcp`
26
+ - `npm i -g @jtalk22/slack-mcp@<version>`
27
+ ```
28
+
29
+ ## Release Notes Template
30
+
31
+ ````md
32
+ ## <version> — <short title>
33
+
34
+ ### Fixed
35
+ - <item>
36
+ - <item>
37
+
38
+ ### Runtime / Security
39
+ - <item>
40
+
41
+ ### Verify
42
+ ```bash
43
+ <command>
44
+ <command>
45
+ ```
46
+ ````
47
+
48
+ ## Changelog Entry Template
49
+
50
+ ```md
51
+ ## [<version>] - YYYY-MM-DD
52
+
53
+ ### Fixed
54
+ - <item>
55
+
56
+ ### Changed
57
+ - <item>
58
+ ```
@@ -0,0 +1,48 @@
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 | Remote endpoint | Requires runtime hardening and monitoring |
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. Confirm `slack_get_thread`, `slack_search_messages`, and `slack_users_info` behavior.
48
+ 3. Confirm token handling mode (ephemeral vs env persistence) is documented.
package/docs/SETUP.md CHANGED
@@ -25,16 +25,22 @@ npm install
25
25
 
26
26
  ### 3. Get Slack Tokens
27
27
 
28
- **Option A: Automatic Extraction**
28
+ **Option A: Setup Wizard (recommended)**
29
29
 
30
30
  1. Open Chrome
31
31
  2. Navigate to https://app.slack.com and log in
32
32
  3. Run:
33
33
  ```bash
34
- npm run tokens:auto
34
+ npx -y @jtalk22/slack-mcp --setup
35
35
  ```
36
36
 
37
- **Option B: Manual Extraction**
37
+ **Option B: Automatic Extraction (repo clone workflow)**
38
+
39
+ ```bash
40
+ npm run tokens:auto
41
+ ```
42
+
43
+ **Option C: Manual Extraction**
38
44
 
39
45
  1. Open https://app.slack.com in Chrome
40
46
  2. Press F12 to open DevTools
@@ -114,7 +120,7 @@ You should see your username and team name.
114
120
 
115
121
  ### "No credentials found"
116
122
 
117
- Run `npm run tokens:auto` with Slack open in Chrome, or `npm run tokens:refresh` to enter manually.
123
+ Run `npx -y @jtalk22/slack-mcp --setup` with Slack open in Chrome, or `npm run tokens:refresh` to enter manually.
118
124
 
119
125
  ### "invalid_auth" Error
120
126
 
@@ -0,0 +1,49 @@
1
+ # Support Boundaries
2
+
3
+ This document sets expectations for issue triage, support scope, and rollout safety.
4
+
5
+ ## In Scope
6
+
7
+ - Reproducible bugs in published release behavior.
8
+ - Install and setup blockers for supported Node/runtime paths.
9
+ - Regressions in existing tools (`slack_get_thread`, `slack_search_messages`, etc.).
10
+ - Documentation corrections with clear technical evidence.
11
+
12
+ ## Out of Scope
13
+
14
+ - Custom Slack policy/legal interpretation for a specific organization.
15
+ - Workspace-specific data migrations or bespoke integrations.
16
+ - Real-time operational support for third-party hosting providers.
17
+ - Urgent production incident ownership for self-hosted external deployments.
18
+
19
+ ## Intake Requirements
20
+
21
+ Include the following in every issue:
22
+
23
+ 1. Version (`npm view @jtalk22/slack-mcp version` output).
24
+ 2. Runtime mode (`stdio`, `web`, `http`, or Worker/Smithery).
25
+ 3. OS and Node version.
26
+ 4. Minimal reproduction steps and exact error text.
27
+ 5. Whether this blocks individual use or team rollout.
28
+
29
+ ## Response Windows (Best Effort)
30
+
31
+ - Installation/blocker bugs: initial response target within 2 business days.
32
+ - Non-blocking bugs: initial response target within 5 business days.
33
+ - Feature requests: triaged in backlog batches.
34
+
35
+ ## Solo Maintainer Capacity Guardrail
36
+
37
+ - Weekly support budget target: <= 2 hours/week.
38
+ - If inbound support exceeds this cap, new feature work may be paused.
39
+ - High-context requests may be deferred until reproducible artifacts are provided.
40
+
41
+ ## Security and Data Handling
42
+
43
+ - Do not post raw tokens/cookies in issues.
44
+ - Use redacted logs.
45
+ - If credentials are exposed, rotate immediately and update issue with redaction.
46
+
47
+ ## Deployment Escalation Rule
48
+
49
+ For team/hosted usage, open a deployment intake issue before broad rollout.
@@ -54,10 +54,13 @@ slack_list_conversations limit=50
54
54
  # Option 1: In Claude Code/Desktop
55
55
  slack_refresh_tokens
56
56
 
57
- # Option 2: CLI
57
+ # Option 2: Package setup wizard
58
+ npx -y @jtalk22/slack-mcp --setup
59
+
60
+ # Option 3: Repo CLI
58
61
  npm run tokens:auto
59
62
 
60
- # Option 3: Manual
63
+ # Option 4: Manual
61
64
  npm run tokens:refresh
62
65
  ```
63
66
 
@@ -0,0 +1,69 @@
1
+ # Use Case Recipes
2
+
3
+ Copy and paste any prompt into your MCP client. Each recipe maps to existing tools and parameters.
4
+
5
+ ## 1) Fast Health Check
6
+
7
+ Prompt:
8
+ `Run slack_health_check and tell me if my workspace connection is valid.`
9
+
10
+ ## 2) Token Age and Cache Snapshot
11
+
12
+ Prompt:
13
+ `Run slack_token_status and summarize token age, health, and cache stats.`
14
+
15
+ ## 3) List Recent DMs
16
+
17
+ Prompt:
18
+ `Use slack_list_conversations with types="im,mpim" and limit=50. Return names and IDs.`
19
+
20
+ ## 4) Summarize a Channel for the Last 3 Days
21
+
22
+ Prompt:
23
+ `Use slack_conversations_history with channel_id="<CHANNEL_ID>", oldest="<UNIX_TS_3_DAYS_AGO>", limit=100, resolve_users=true, then summarize decisions and action items.`
24
+
25
+ ## 5) Pull a Full Thread
26
+
27
+ Prompt:
28
+ `Use slack_get_thread with channel_id="<CHANNEL_ID>" and thread_ts="<THREAD_TS>". Summarize timeline and owners.`
29
+
30
+ ## 6) Search for Decisions
31
+
32
+ Prompt:
33
+ `Use slack_search_messages with query="decision OR approved after:2026-01-01" and count=50. Group results by channel.`
34
+
35
+ ## 7) Find Messages from One Person
36
+
37
+ Prompt:
38
+ `Use slack_search_messages with query="from:@<USERNAME> after:2026-01-01" and count=30. Return top themes.`
39
+
40
+ ## 8) Export Conversation History
41
+
42
+ Prompt:
43
+ `Use slack_get_full_conversation with channel_id="<CHANNEL_ID>", max_messages=2000, include_threads=true, output_file="q1-export.json".`
44
+
45
+ ## 9) Lookup a User Profile
46
+
47
+ Prompt:
48
+ `Use slack_users_info with user_id="<USER_ID>" and return role, timezone, and status fields.`
49
+
50
+ ## 10) Send a Channel Update
51
+
52
+ Prompt:
53
+ `Use slack_send_message with channel_id="<CHANNEL_ID>" and text="Daily update: build passed, deploy at 4 PM ET."`
54
+
55
+ ## 11) Reply in a Thread
56
+
57
+ Prompt:
58
+ `Use slack_send_message with channel_id="<CHANNEL_ID>", thread_ts="<THREAD_TS>", text="Acknowledged. I will post follow-up logs in 30 minutes."`
59
+
60
+ ## 12) Directory Snapshot
61
+
62
+ Prompt:
63
+ `Use slack_list_users with limit=500. Return a compact list of users with admin/bot flags.`
64
+
65
+ ## Notes
66
+
67
+ - Replace placeholders before running (`<CHANNEL_ID>`, `<THREAD_TS>`, `<USER_ID>`, `<USERNAME>`, timestamps).
68
+ - Timestamp parameters are Unix seconds in string form.
69
+ - For large workspaces, start with smaller limits, then expand.
package/docs/WEB-API.md CHANGED
@@ -7,6 +7,8 @@ The Slack Web Server exposes all MCP tools as REST endpoints, accessible from an
7
7
  ```bash
8
8
  cd ~/slack-mcp-server
9
9
  npm run web
10
+ # Or run directly from npm:
11
+ npx -y @jtalk22/slack-mcp web
10
12
  ```
11
13
 
12
14
  The server will:
package/lib/handlers.js CHANGED
@@ -116,7 +116,7 @@ export async function handleHealthCheck() {
116
116
  return {
117
117
  content: [{
118
118
  type: "text",
119
- text: "NO CREDENTIALS\n\nOptions:\n1. Open Slack in Chrome, then use slack_refresh_tokens\n2. Run: npm run tokens:auto (or npx @jtalk22/slack-mcp tokens:auto)"
119
+ text: "NO CREDENTIALS\n\nOptions:\n1. Open Slack in Chrome, then use slack_refresh_tokens\n2. Run: npx -y @jtalk22/slack-mcp --setup"
120
120
  }],
121
121
  isError: true
122
122
  };
@@ -150,7 +150,7 @@ export async function slackAPI(method, params = {}, options = {}) {
150
150
 
151
151
  const creds = loadTokens(false, logger);
152
152
  if (!creds) {
153
- throw new Error("No credentials available. Run refresh-tokens.sh or open Slack in Chrome.");
153
+ throw new Error("No credentials available. Run npx -y @jtalk22/slack-mcp --setup or open Slack in Chrome.");
154
154
  }
155
155
 
156
156
  // Proactive token health check (non-blocking, only on first attempt)
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@jtalk22/slack-mcp",
3
3
  "mcpName": "io.github.jtalk22/slack-mcp-server",
4
- "version": "1.2.1",
5
- "description": "Full Slack access for Claude - DMs, channels, search. No OAuth. No admin approval. Just works.",
4
+ "version": "1.2.2",
5
+ "description": "Session-based Slack access for Claude - DMs, channels, search, and threads. Local-first with your existing Slack session.",
6
6
  "type": "module",
7
7
  "main": "src/server.js",
8
8
  "bin": {
@@ -17,6 +17,8 @@
17
17
  "http": "node src/server-http.js",
18
18
  "web": "node src/web-server.js",
19
19
  "setup": "node scripts/setup-wizard.js --setup",
20
+ "hooks:setup": "bash scripts/setup-git-hooks.sh",
21
+ "verify:owner-attribution": "bash scripts/check-owner-attribution.sh",
20
22
  "tokens:status": "node scripts/token-cli.js status",
21
23
  "tokens:refresh": "node scripts/token-cli.js refresh",
22
24
  "tokens:auto": "node scripts/token-cli.js auto",
@@ -12,19 +12,19 @@
12
12
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
13
13
  <meta name="author" content="@jtalk22">
14
14
  <title>Slack MCP Server - Claude Desktop Demo</title>
15
- <meta name="description" content="See how Claude uses Slack MCP tools to access your workspace - DMs, channels, search, and more.">
15
+ <meta name="description" content="Session-based Slack access demo showing Claude workflows for DMs, channels, search, and threads.">
16
16
 
17
17
  <!-- Open Graph -->
18
- <meta property="og:title" content="Slack MCP Server - Claude Desktop Demo">
19
- <meta property="og:description" content="Interactive demo showing Claude Desktop using MCP tools to access Slack - search messages, read threads, send updates.">
18
+ <meta property="og:title" content="Slack MCP Server - Session Access Demo">
19
+ <meta property="og:description" content="Interactive demo showing Claude using session-based Slack MCP tools for search, threads, and messaging workflows.">
20
20
  <meta property="og:type" content="website">
21
21
  <meta property="og:url" content="https://jtalk22.github.io/slack-mcp-server/public/demo-claude.html">
22
22
  <meta property="og:image" content="https://assets-worker.james-20a.workers.dev/projects/slack-mcp-server/demo-claude.gif">
23
23
 
24
24
  <!-- Twitter Card -->
25
25
  <meta name="twitter:card" content="summary_large_image">
26
- <meta name="twitter:title" content="Slack MCP Server - Claude Desktop Demo">
27
- <meta name="twitter:description" content="Interactive demo showing Claude using MCP tools to access your Slack workspace.">
26
+ <meta name="twitter:title" content="Slack MCP Server - Session Access Demo">
27
+ <meta name="twitter:description" content="Interactive demo showing Claude using session-based Slack MCP tools for search, threads, and messaging workflows.">
28
28
  <meta name="twitter:image" content="https://assets-worker.james-20a.workers.dev/projects/slack-mcp-server/demo-claude.gif">
29
29
 
30
30
  <!-- Theme -->
@@ -124,6 +124,43 @@
124
124
  color: var(--text-secondary);
125
125
  font-size: 16px;
126
126
  }
127
+ .cta-strip {
128
+ width: 100%;
129
+ max-width: 960px;
130
+ margin-bottom: 16px;
131
+ background: rgba(15, 52, 96, 0.72);
132
+ border: 1px solid rgba(255, 255, 255, 0.15);
133
+ border-radius: 12px;
134
+ padding: 10px 14px;
135
+ display: flex;
136
+ justify-content: space-between;
137
+ align-items: center;
138
+ gap: 10px;
139
+ flex-wrap: wrap;
140
+ font-size: 13px;
141
+ }
142
+ .cta-strip .links {
143
+ display: flex;
144
+ gap: 8px;
145
+ flex-wrap: wrap;
146
+ }
147
+ .cta-strip .links a {
148
+ color: #d8efff;
149
+ text-decoration: none;
150
+ border: 1px solid rgba(255, 255, 255, 0.25);
151
+ border-radius: 999px;
152
+ padding: 4px 8px;
153
+ }
154
+ .cta-strip .links a:hover {
155
+ background: rgba(255, 255, 255, 0.08);
156
+ }
157
+ .cta-strip .note {
158
+ color: rgba(255, 255, 255, 0.78);
159
+ }
160
+ .cta-strip .note a {
161
+ color: #9ee7ff;
162
+ text-decoration: underline;
163
+ }
127
164
 
128
165
  .badge {
129
166
  display: inline-flex;
@@ -1111,10 +1148,20 @@
1111
1148
  </style>
1112
1149
  </head>
1113
1150
  <body>
1151
+ <div class="cta-strip">
1152
+ <div class="links">
1153
+ <a href="https://www.npmjs.com/package/@jtalk22/slack-mcp" target="_blank" rel="noopener noreferrer">Install</a>
1154
+ <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/docs/API.md" target="_blank" rel="noopener noreferrer">API Docs</a>
1155
+ <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer">Changelog</a>
1156
+ </div>
1157
+ <div class="note">
1158
+ Team rollout? Review <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/docs/DEPLOYMENT-MODES.md" target="_blank" rel="noopener noreferrer">Deployment Modes</a>.
1159
+ </div>
1160
+ </div>
1114
1161
  <header class="page-header">
1115
1162
  <h1>
1116
1163
  <span>Slack MCP Server</span>
1117
- <span class="badge">🔧 MCP Demo v1.2</span>
1164
+ <span class="badge">🔧 MCP Demo v1.2.2</span>
1118
1165
  </h1>
1119
1166
  <p>See how Claude uses MCP tools to access your Slack workspace</p>
1120
1167
  </header>
@@ -1186,7 +1233,7 @@
1186
1233
  <div class="title-logo">💬</div>
1187
1234
  <h1>Slack MCP Server</h1>
1188
1235
  <p class="title-tagline">Full Slack access for Claude Desktop</p>
1189
- <p class="title-version">v1.2 • @jtalk22</p>
1236
+ <p class="title-version">v1.2.2 • @jtalk22</p>
1190
1237
  </div>
1191
1238
 
1192
1239
  <!-- Scenario Caption Overlay -->
@@ -1196,9 +1243,9 @@
1196
1243
  <div class="closing-card" id="closingCard">
1197
1244
  <div class="closing-check">✅</div>
1198
1245
  <h2>Demo Complete</h2>
1199
- <p class="closing-cta">Full Slack access. No OAuth. No admin approval.</p>
1246
+ <p class="closing-cta">Session-based Slack access aligned to your existing workspace permissions.</p>
1200
1247
  <div class="closing-links">
1201
- <code>npm install -g @jtalk22/slack-mcp</code>
1248
+ <code>npx -y @jtalk22/slack-mcp --setup</code>
1202
1249
  </div>
1203
1250
  <p class="closing-github">github.com/jtalk22/slack-mcp-server</p>
1204
1251
  <span class="easter-egg">ê</span>
@@ -4,6 +4,16 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Slack MCP Server Demo</title>
7
+ <meta name="description" content="Video demo of session-based Slack access for Claude with DMs, channels, search, and threads.">
8
+ <meta property="og:type" content="website">
9
+ <meta property="og:title" content="Slack MCP Server - Session Access Demo">
10
+ <meta property="og:description" content="Video walkthrough of session-based Slack workflows in Claude.">
11
+ <meta property="og:url" content="https://jtalk22.github.io/slack-mcp-server/public/demo-video.html">
12
+ <meta property="og:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-poster.png">
13
+ <meta name="twitter:card" content="summary_large_image">
14
+ <meta name="twitter:title" content="Slack MCP Server - Session Access Demo">
15
+ <meta name="twitter:description" content="Video walkthrough of session-based Slack workflows in Claude.">
16
+ <meta name="twitter:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-poster.png">
7
17
  <style>
8
18
  * {
9
19
  margin: 0;
@@ -37,6 +47,41 @@
37
47
  margin-bottom: 1.5rem;
38
48
  font-size: 1rem;
39
49
  }
50
+ .cta-strip {
51
+ margin: 0 auto 1rem;
52
+ background: rgba(15, 52, 96, 0.72);
53
+ border: 1px solid rgba(255, 255, 255, 0.16);
54
+ border-radius: 12px;
55
+ padding: 10px 14px;
56
+ display: flex;
57
+ justify-content: space-between;
58
+ align-items: center;
59
+ gap: 10px;
60
+ flex-wrap: wrap;
61
+ font-size: 0.8125rem;
62
+ }
63
+ .cta-strip .links {
64
+ display: flex;
65
+ gap: 8px;
66
+ flex-wrap: wrap;
67
+ }
68
+ .cta-strip .links a {
69
+ color: #d8efff;
70
+ text-decoration: none;
71
+ border: 1px solid rgba(255, 255, 255, 0.24);
72
+ border-radius: 999px;
73
+ padding: 4px 8px;
74
+ }
75
+ .cta-strip .links a:hover {
76
+ background: rgba(255, 255, 255, 0.08);
77
+ }
78
+ .cta-strip .note {
79
+ color: rgba(255, 255, 255, 0.82);
80
+ }
81
+ .cta-strip .note a {
82
+ color: #9ee7ff;
83
+ text-decoration: underline;
84
+ }
40
85
  .video-wrapper {
41
86
  position: relative;
42
87
  border-radius: 12px;
@@ -98,6 +143,16 @@
98
143
  <div class="container">
99
144
  <h1>Slack MCP Server</h1>
100
145
  <p class="subtitle">Full workspace access via local session mirroring</p>
146
+ <div class="cta-strip">
147
+ <div class="links">
148
+ <a href="https://www.npmjs.com/package/@jtalk22/slack-mcp" target="_blank" rel="noopener noreferrer">Install</a>
149
+ <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/docs/API.md" target="_blank" rel="noopener noreferrer">API Docs</a>
150
+ <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer">Changelog</a>
151
+ </div>
152
+ <div class="note">
153
+ Team rollout? Review <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/docs/DEPLOYMENT-MODES.md" target="_blank" rel="noopener noreferrer">Deployment Modes</a>.
154
+ </div>
155
+ </div>
101
156
 
102
157
  <div class="video-wrapper">
103
158
  <video id="demo" poster="../docs/images/demo-poster.png" playsinline>
package/public/demo.html CHANGED
@@ -8,18 +8,18 @@
8
8
  <!-- Open Graph / Social Sharing -->
9
9
  <meta property="og:type" content="website">
10
10
  <meta property="og:url" content="https://jtalk22.github.io/slack-mcp-server/public/demo.html">
11
- <meta property="og:title" content="Slack MCP Server - Direct Access for Claude">
12
- <meta property="og:description" content="Give Claude full access to DMs and Channels without OAuth. Try the interactive simulator.">
11
+ <meta property="og:title" content="Slack MCP Server - Session Access Demo">
12
+ <meta property="og:description" content="Interactive demo for session-based Slack access in Claude: DMs, channels, search, and threads.">
13
13
  <meta property="og:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-main.png">
14
14
 
15
15
  <!-- Twitter Card -->
16
16
  <meta name="twitter:card" content="summary_large_image">
17
- <meta name="twitter:title" content="Slack MCP Server - Direct Access for Claude">
18
- <meta name="twitter:description" content="Give Claude full access to DMs and Channels without OAuth. Try the interactive simulator.">
17
+ <meta name="twitter:title" content="Slack MCP Server - Session Access Demo">
18
+ <meta name="twitter:description" content="Interactive demo for session-based Slack access in Claude: DMs, channels, search, and threads.">
19
19
  <meta name="twitter:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-main.png">
20
20
 
21
21
  <!-- SEO -->
22
- <meta name="description" content="Full Slack access for Claude - DMs, channels, search. No OAuth. No admin approval. Interactive demo simulator.">
22
+ <meta name="description" content="Session-based Slack access for Claude. Interactive demo for DMs, channels, search, and thread workflows.">
23
23
  <link rel="preconnect" href="https://fonts.googleapis.com">
24
24
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
25
25
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
@@ -74,12 +74,45 @@
74
74
  color: white;
75
75
  text-decoration: underline;
76
76
  }
77
+ .cta-strip {
78
+ background: rgba(15, 52, 96, 0.9);
79
+ border-bottom: 1px solid rgba(255, 255, 255, 0.12);
80
+ padding: 10px 16px;
81
+ display: flex;
82
+ justify-content: space-between;
83
+ align-items: center;
84
+ gap: 12px;
85
+ flex-wrap: wrap;
86
+ font-size: 13px;
87
+ }
88
+ .cta-links {
89
+ display: flex;
90
+ gap: 10px;
91
+ flex-wrap: wrap;
92
+ }
93
+ .cta-links a {
94
+ color: #d8efff;
95
+ text-decoration: none;
96
+ padding: 4px 8px;
97
+ border: 1px solid rgba(255, 255, 255, 0.25);
98
+ border-radius: 999px;
99
+ }
100
+ .cta-links a:hover {
101
+ background: rgba(255, 255, 255, 0.1);
102
+ }
103
+ .cta-note {
104
+ color: rgba(255, 255, 255, 0.75);
105
+ }
106
+ .cta-note a {
107
+ color: #9ee7ff;
108
+ text-decoration: underline;
109
+ }
77
110
 
78
111
  /* Main Layout */
79
112
  .split-container {
80
113
  display: grid;
81
114
  grid-template-columns: 420px 1fr;
82
- height: calc(100vh - 44px);
115
+ height: calc(100vh - 88px);
83
116
  overflow: hidden;
84
117
  }
85
118
 
@@ -600,6 +633,16 @@
600
633
  STATIC PREVIEW - No real data. Run <code>npm run web</code> for live dashboard.
601
634
  <a href="https://github.com/jtalk22/slack-mcp-server">View on GitHub</a>
602
635
  </div>
636
+ <div class="cta-strip">
637
+ <div class="cta-links">
638
+ <a href="https://www.npmjs.com/package/@jtalk22/slack-mcp" target="_blank" rel="noopener noreferrer">Install</a>
639
+ <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/docs/API.md" target="_blank" rel="noopener noreferrer">API Docs</a>
640
+ <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer">Changelog</a>
641
+ </div>
642
+ <div class="cta-note">
643
+ Team rollout? Review <a href="https://github.com/jtalk22/slack-mcp-server/blob/main/docs/DEPLOYMENT-MODES.md" target="_blank" rel="noopener noreferrer">Deployment Modes</a>.
644
+ </div>
645
+ </div>
603
646
 
604
647
  <div class="split-container">
605
648
  <!-- LEFT: Claude Chat Panel -->
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ EXPECTED_NAME="${EXPECTED_GIT_NAME:-jtalk22}"
5
+ EXPECTED_EMAIL="${EXPECTED_GIT_EMAIL:-james@revasser.nyc}"
6
+ BANNED_REGEX='(?i)(co-authored-by|generated with|\bclaude\b|\bgpt\b|\bcopilot\b|\bgemini\b|\bai\b)'
7
+
8
+ die() {
9
+ echo "ERROR: $*" >&2
10
+ exit 1
11
+ }
12
+
13
+ contains_banned_markers() {
14
+ local text="$1"
15
+ if command -v rg >/dev/null 2>&1; then
16
+ rg -Niq "$BANNED_REGEX" <<<"$text"
17
+ else
18
+ grep -Eiq '(Co-authored-by|Generated with|Claude|GPT|Copilot|Gemini)' <<<"$text" \
19
+ || grep -Eiq '(^|[^[:alnum:]_])[Aa][Ii]([^[:alnum:]_]|$)' <<<"$text"
20
+ fi
21
+ }
22
+
23
+ if [[ "${SKIP_LOCAL_CONFIG_CHECK:-0}" != "1" ]]; then
24
+ local_name="$(git config --get user.name || true)"
25
+ local_email="$(git config --get user.email || true)"
26
+
27
+ [[ -n "$local_name" ]] || die "Missing repo-local git user.name"
28
+ [[ -n "$local_email" ]] || die "Missing repo-local git user.email"
29
+
30
+ [[ "$local_name" == "$EXPECTED_NAME" ]] \
31
+ || die "Repo-local user.name is '$local_name' (expected '$EXPECTED_NAME')"
32
+ [[ "$local_email" == "$EXPECTED_EMAIL" ]] \
33
+ || die "Repo-local user.email is '$local_email' (expected '$EXPECTED_EMAIL')"
34
+ fi
35
+
36
+ default_range="HEAD"
37
+ if git rev-parse --verify origin/main >/dev/null 2>&1; then
38
+ default_range="origin/main..HEAD"
39
+ fi
40
+
41
+ range="${1:-${GIT_CHECK_RANGE:-$default_range}}"
42
+
43
+ git rev-list --count "$range" >/dev/null 2>&1 || die "Invalid commit range: $range"
44
+ commit_count="$(git rev-list --count "$range")"
45
+
46
+ if [[ "$commit_count" -eq 0 ]]; then
47
+ echo "No commits to validate in range '$range'."
48
+ exit 0
49
+ fi
50
+
51
+ errors=0
52
+
53
+ while IFS= read -r sha; do
54
+ author_name="$(git show -s --format=%an "$sha")"
55
+ author_email="$(git show -s --format=%ae "$sha")"
56
+ committer_name="$(git show -s --format=%cn "$sha")"
57
+ committer_email="$(git show -s --format=%ce "$sha")"
58
+ body="$(git show -s --format=%B "$sha")"
59
+
60
+ if [[ "$author_name" != "$EXPECTED_NAME" || "$author_email" != "$EXPECTED_EMAIL" ]]; then
61
+ echo "Commit $sha has author '$author_name <$author_email>' (expected '$EXPECTED_NAME <$EXPECTED_EMAIL>')." >&2
62
+ errors=1
63
+ fi
64
+
65
+ if [[ "$committer_name" != "$EXPECTED_NAME" || "$committer_email" != "$EXPECTED_EMAIL" ]]; then
66
+ echo "Commit $sha has committer '$committer_name <$committer_email>' (expected '$EXPECTED_NAME <$EXPECTED_EMAIL>')." >&2
67
+ errors=1
68
+ fi
69
+
70
+ if contains_banned_markers "$body"; then
71
+ echo "Commit $sha contains disallowed attribution markers in commit message." >&2
72
+ errors=1
73
+ fi
74
+ done < <(git rev-list "$range")
75
+
76
+ if [[ "$errors" -ne 0 ]]; then
77
+ exit 1
78
+ fi
79
+
80
+ echo "Owner-only attribution check passed for $commit_count commit(s) in '$range'."
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ repo_root="$(git rev-parse --show-toplevel)"
5
+ cd "$repo_root"
6
+
7
+ [[ -d .githooks ]] || {
8
+ echo "Missing .githooks directory." >&2
9
+ exit 1
10
+ }
11
+
12
+ git config core.hooksPath .githooks
13
+ find .githooks -maxdepth 1 -type f -exec chmod +x {} +
14
+
15
+ echo "Configured git hooks path: .githooks"
@@ -16,7 +16,7 @@ import { loadTokens, saveTokens, extractFromChrome, isAutoRefreshAvailable, TOKE
16
16
  import { slackAPI } from "../lib/slack-client.js";
17
17
 
18
18
  const IS_MACOS = platform() === 'darwin';
19
- const VERSION = "1.2.1";
19
+ const VERSION = "1.2.2";
20
20
 
21
21
  // ANSI colors
22
22
  const colors = {
@@ -232,7 +232,7 @@ async function showStatus() {
232
232
  if (!creds) {
233
233
  error("No tokens found");
234
234
  print();
235
- print("Run setup wizard: npx @jtalk22/slack-mcp --setup");
235
+ print("Run setup wizard: npx -y @jtalk22/slack-mcp --setup");
236
236
  process.exit(1);
237
237
  }
238
238
 
@@ -257,7 +257,7 @@ async function showStatus() {
257
257
  error("Status: INVALID");
258
258
  print(`Error: ${e.message}`);
259
259
  print();
260
- print("Run setup wizard to refresh: npx @jtalk22/slack-mcp --setup");
260
+ print("Run setup wizard to refresh: npx -y @jtalk22/slack-mcp --setup");
261
261
  process.exit(1);
262
262
  }
263
263
  }
@@ -268,11 +268,11 @@ async function showHelp() {
268
268
  print("Full Slack access for Claude via MCP. Session mirroring bypasses OAuth.");
269
269
  print();
270
270
  print(`${colors.bold}Usage:${colors.reset}`);
271
- print(" npx @jtalk22/slack-mcp Start MCP server (stdio)");
272
- print(" npx @jtalk22/slack-mcp --setup Interactive token setup wizard");
273
- print(" npx @jtalk22/slack-mcp --status Check token health");
274
- print(" npx @jtalk22/slack-mcp --version Print version");
275
- print(" npx @jtalk22/slack-mcp --help Show this help");
271
+ print(" npx -y @jtalk22/slack-mcp Start MCP server (stdio)");
272
+ print(" npx -y @jtalk22/slack-mcp --setup Interactive token setup wizard");
273
+ print(" npx -y @jtalk22/slack-mcp --status Check token health");
274
+ print(" npx -y @jtalk22/slack-mcp --version Print version");
275
+ print(" npx -y @jtalk22/slack-mcp --help Show this help");
276
276
  print();
277
277
  print(`${colors.bold}npm scripts:${colors.reset}`);
278
278
  print(" npm start Start MCP server");
@@ -345,8 +345,8 @@ async function main() {
345
345
  print(`${colors.green}${colors.bold}Setup complete!${colors.reset}`);
346
346
  print();
347
347
  print("Next steps:");
348
- print(" • Verify: npx @jtalk22/slack-mcp --status");
349
- print(" • Start server: npx @jtalk22/slack-mcp");
348
+ print(" • Verify: npx -y @jtalk22/slack-mcp --status");
349
+ print(" • Start server: npx -y @jtalk22/slack-mcp");
350
350
  print(" • Or add to Claude Desktop config");
351
351
  } else {
352
352
  print(`${colors.red}Setup failed.${colors.reset} See errors above.`);
@@ -30,7 +30,7 @@ import {
30
30
  } from "../lib/handlers.js";
31
31
 
32
32
  const SERVER_NAME = "slack-mcp-server";
33
- const SERVER_VERSION = "1.2.1";
33
+ const SERVER_VERSION = "1.2.2";
34
34
  const PORT = process.env.PORT || 3000;
35
35
 
36
36
  // Create MCP server
package/src/server.js CHANGED
@@ -11,7 +11,7 @@
11
11
  * - Network error retry with exponential backoff
12
12
  * - Background token health monitoring
13
13
  *
14
- * @version 1.2.1
14
+ * @version 1.2.2
15
15
  */
16
16
 
17
17
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
@@ -47,7 +47,7 @@ const BACKGROUND_REFRESH_INTERVAL = 4 * 60 * 60 * 1000;
47
47
 
48
48
  // Package info
49
49
  const SERVER_NAME = "slack-mcp-server";
50
- const SERVER_VERSION = "1.2.1";
50
+ const SERVER_VERSION = "1.2.2";
51
51
 
52
52
  // MCP Prompts - predefined prompt templates for common Slack operations
53
53
  const PROMPTS = [
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 1.2.1
8
+ * @version 1.2.2
9
9
  */
10
10
 
11
11
  import express from "express";
@@ -116,7 +116,7 @@ function extractContent(result) {
116
116
  app.get("/", (req, res) => {
117
117
  res.json({
118
118
  name: "Slack Web API Server",
119
- version: "1.2.1",
119
+ version: "1.2.2",
120
120
  status: "running",
121
121
  endpoints: [
122
122
  "GET /health",
@@ -295,7 +295,7 @@ async function main() {
295
295
  app.listen(PORT, '127.0.0.1', () => {
296
296
  // Print to stderr to keep logs clean (stdout reserved for JSON in some setups)
297
297
  console.error(`\n${"═".repeat(60)}`);
298
- console.error(` Slack Web API Server v1.2.1`);
298
+ console.error(` Slack Web API Server v1.2.2`);
299
299
  console.error(`${"═".repeat(60)}`);
300
300
  console.error(`\n Dashboard: http://localhost:${PORT}/?key=${API_KEY}`);
301
301
  console.error(`\n API Key: ${API_KEY}`);