@chinchillaenterprises/mcp-slack 3.1.1 → 4.0.1

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/dist/index.js CHANGED
@@ -5,331 +5,275 @@ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextpro
5
5
  import { WebClient } from "@slack/web-api";
6
6
  import { z } from "zod";
7
7
  import { promises as fs } from "fs";
8
+ import { realpathSync } from "fs";
8
9
  import path from "path";
9
10
  import os from "os";
10
11
  import crypto from "crypto";
11
12
  import { tmpdir } from "os";
12
13
  import { execFile } from "child_process";
13
14
  import { promisify } from "util";
15
+ import { fileURLToPath } from "url";
14
16
  import Fuse from "fuse.js";
15
17
  const execFileAsync = promisify(execFile);
16
18
  // =====================================================================================
17
- // CREDENTIAL MANAGER CLASS
19
+ // OUTPUT FORMATTING HELPERS (Bundle 0)
20
+ // -------------------------------------------------------------------------------------
21
+ // These are the shared, framework-free building blocks the later UX bundles reuse.
22
+ //
23
+ // WHY THIS EXISTS: this server's single biggest token cost is that verbose tool
24
+ // RESULTS linger in the session context window and get re-sent every turn (measured
25
+ // at ~21% of a user's usage). Pretty-printed JSON (JSON.stringify(x, null, 2)) is the
26
+ // main offender. leanResult() establishes the convention: compact by default, fuller
27
+ // only when the caller explicitly asks for verbose. Keep these together.
18
28
  // =====================================================================================
19
- class CredentialManager {
20
- SERVICE_NAME = 'mcp-slack';
21
- CONFIG_DIR = path.join(os.homedir(), '.mcp-slack');
22
- CONFIG_FILE = path.join(this.CONFIG_DIR, 'accounts.json');
23
- ENCRYPTION_KEY_FILE = path.join(this.CONFIG_DIR, '.key');
24
- keytar = null;
25
- isKeytarAvailable = false;
26
- initPromise;
27
- encryptionKey = null;
28
- constructor() {
29
- this.initPromise = this.initialize();
30
- }
31
- async initialize() {
32
- // Initialize keytar
33
- try {
34
- this.keytar = await import('keytar');
35
- this.isKeytarAvailable = true;
36
- console.error('[CredentialManager] Keytar initialized successfully');
37
- }
38
- catch (error) {
39
- console.error('[CredentialManager] Keytar not available, using file-based storage:', error);
40
- this.isKeytarAvailable = false;
41
- }
42
- // Ensure config directory exists
43
- try {
44
- await fs.mkdir(this.CONFIG_DIR, { recursive: true });
45
- // Set directory permissions to be readable only by the user
46
- await fs.chmod(this.CONFIG_DIR, 0o700);
47
- }
48
- catch (error) {
49
- console.error('[CredentialManager] Failed to create config directory:', error);
50
- }
51
- // Initialize or load encryption key for file-based storage
52
- await this.initializeEncryptionKey();
53
- }
54
- async initializeEncryptionKey() {
55
- try {
56
- // Try to read existing key
57
- this.encryptionKey = await fs.readFile(this.ENCRYPTION_KEY_FILE);
58
- }
59
- catch (error) {
60
- // Generate new key if doesn't exist
61
- this.encryptionKey = crypto.randomBytes(32);
62
- try {
63
- await fs.writeFile(this.ENCRYPTION_KEY_FILE, this.encryptionKey);
64
- await fs.chmod(this.ENCRYPTION_KEY_FILE, 0o600); // Read/write for owner only
65
- }
66
- catch (writeError) {
67
- console.error('[CredentialManager] Failed to save encryption key:', writeError);
68
- }
69
- }
70
- }
71
- encrypt(text) {
72
- if (!this.encryptionKey)
73
- return text; // Fallback to plain text if no key
74
- const iv = crypto.randomBytes(16);
75
- const cipher = crypto.createCipheriv('aes-256-cbc', this.encryptionKey, iv);
76
- let encrypted = cipher.update(text, 'utf8', 'hex');
77
- encrypted += cipher.final('hex');
78
- return iv.toString('hex') + ':' + encrypted;
79
- }
80
- decrypt(encryptedText) {
81
- if (!this.encryptionKey || !encryptedText.includes(':'))
82
- return encryptedText;
83
- try {
84
- const [ivHex, encrypted] = encryptedText.split(':');
85
- const iv = Buffer.from(ivHex, 'hex');
86
- const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, iv);
87
- let decrypted = decipher.update(encrypted, 'hex', 'utf8');
88
- decrypted += decipher.final('utf8');
89
- return decrypted;
90
- }
91
- catch (error) {
92
- console.error('[CredentialManager] Failed to decrypt:', error);
93
- return encryptedText; // Return as-is if decryption fails
94
- }
95
- }
96
- async ensureInitialized() {
97
- await this.initPromise;
98
- }
99
- async saveAccount(account) {
100
- await this.ensureInitialized();
101
- const persistedAccount = {
102
- ...account,
103
- addedAt: new Date().toISOString(),
104
- lastUsed: new Date().toISOString()
105
- };
106
- // Try keytar first
107
- if (this.isKeytarAvailable && this.keytar) {
108
- try {
109
- await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
110
- console.error(`[CredentialManager] Account ${account.id} saved to keychain`);
111
- return; // Success with keytar
112
- }
113
- catch (error) {
114
- console.error('[CredentialManager] Keytar save failed, falling back to file:', error);
115
- }
116
- }
117
- // Fallback to file-based storage
118
- await this.saveToFile(persistedAccount);
119
- }
120
- async saveToFile(account) {
121
- try {
122
- // Read existing accounts
123
- const accounts = await this.loadFromFile();
124
- // Encrypt sensitive data
125
- const encryptedAccount = {
126
- ...account,
127
- botToken: this.encrypt(account.botToken),
128
- userToken: account.userToken ? this.encrypt(account.userToken) : undefined
129
- };
130
- // Update or add account
131
- accounts[account.id] = encryptedAccount;
132
- // Save back to file
133
- await fs.writeFile(this.CONFIG_FILE, JSON.stringify(accounts, null, 2), 'utf8');
134
- await fs.chmod(this.CONFIG_FILE, 0o600); // Read/write for owner only
135
- console.error(`[CredentialManager] Account ${account.id} saved to file`);
136
- }
137
- catch (error) {
138
- console.error('[CredentialManager] Failed to save account to file:', error);
139
- throw error;
140
- }
141
- }
142
- async loadFromFile() {
143
- try {
144
- const data = await fs.readFile(this.CONFIG_FILE, 'utf8');
145
- return JSON.parse(data);
146
- }
147
- catch (error) {
148
- // File doesn't exist or is invalid
149
- return {};
150
- }
151
- }
152
- async updateAccount(account) {
153
- await this.ensureInitialized();
154
- // Get existing to preserve addedAt
155
- const existing = await this.getAccount(account.id);
156
- const persistedAccount = {
157
- ...account,
158
- addedAt: existing?.addedAt || new Date().toISOString(),
159
- lastUsed: new Date().toISOString()
160
- };
161
- // Try keytar first
162
- if (this.isKeytarAvailable && this.keytar) {
163
- try {
164
- await this.keytar.setPassword(this.SERVICE_NAME, `slack-${account.id}`, JSON.stringify(persistedAccount));
165
- console.error(`[CredentialManager] Account ${account.id} updated in keychain`);
166
- return; // Success with keytar
167
- }
168
- catch (error) {
169
- console.error('[CredentialManager] Keytar update failed, falling back to file:', error);
170
- }
171
- }
172
- // Fallback to file-based storage
173
- await this.saveToFile(persistedAccount);
174
- }
175
- async loadAllAccounts() {
176
- await this.ensureInitialized();
177
- const accounts = [];
178
- // Try keytar first
179
- if (this.isKeytarAvailable && this.keytar) {
180
- try {
181
- const credentials = await this.keytar.findCredentials(this.SERVICE_NAME);
182
- for (const cred of credentials) {
183
- try {
184
- const account = JSON.parse(cred.password);
185
- accounts.push(account);
186
- }
187
- catch (error) {
188
- console.error(`[CredentialManager] Failed to parse keytar account ${cred.account}:`, error);
189
- }
190
- }
191
- if (accounts.length > 0) {
192
- console.error(`[CredentialManager] Loaded ${accounts.length} accounts from keychain`);
193
- return accounts;
194
- }
195
- }
196
- catch (error) {
197
- console.error('[CredentialManager] Failed to load from keychain:', error);
198
- }
199
- }
200
- // Fallback to file-based storage
201
- try {
202
- const fileAccounts = await this.loadFromFile();
203
- for (const [id, encryptedAccount] of Object.entries(fileAccounts)) {
204
- try {
205
- // Decrypt sensitive data
206
- const account = {
207
- ...encryptedAccount,
208
- botToken: this.decrypt(encryptedAccount.botToken),
209
- userToken: encryptedAccount.userToken ? this.decrypt(encryptedAccount.userToken) : undefined
210
- };
211
- accounts.push(account);
212
- }
213
- catch (error) {
214
- console.error(`[CredentialManager] Failed to process file account ${id}:`, error);
215
- }
216
- }
217
- console.error(`[CredentialManager] Loaded ${accounts.length} accounts from file`);
218
- }
219
- catch (error) {
220
- console.error('[CredentialManager] Failed to load from file:', error);
221
- }
222
- return accounts;
223
- }
224
- async getAccount(accountId) {
225
- await this.ensureInitialized();
226
- // Try keytar first
227
- if (this.isKeytarAvailable && this.keytar) {
228
- try {
229
- const password = await this.keytar.getPassword(this.SERVICE_NAME, `slack-${accountId}`);
230
- if (password) {
231
- return JSON.parse(password);
232
- }
233
- }
234
- catch (error) {
235
- console.error(`[CredentialManager] Failed to get account ${accountId} from keychain:`, error);
236
- }
237
- }
238
- // Fallback to file-based storage
239
- try {
240
- const accounts = await this.loadFromFile();
241
- const encryptedAccount = accounts[accountId];
242
- if (encryptedAccount) {
243
- // Decrypt sensitive data
244
- const account = {
245
- ...encryptedAccount,
246
- botToken: this.decrypt(encryptedAccount.botToken),
247
- userToken: encryptedAccount.userToken ? this.decrypt(encryptedAccount.userToken) : undefined
248
- };
249
- return account;
250
- }
251
- }
252
- catch (error) {
253
- console.error(`[CredentialManager] Failed to get account ${accountId} from file:`, error);
254
- }
255
- return null;
256
- }
257
- async deleteAccount(accountId) {
258
- await this.ensureInitialized();
259
- // Try keytar first
260
- if (this.isKeytarAvailable && this.keytar) {
261
- try {
262
- await this.keytar.deletePassword(this.SERVICE_NAME, `slack-${accountId}`);
263
- console.error(`[CredentialManager] Account ${accountId} deleted from keychain`);
264
- }
265
- catch (error) {
266
- console.error('[CredentialManager] Failed to delete from keychain:', error);
267
- }
268
- }
269
- // Also delete from file-based storage
270
- try {
271
- const accounts = await this.loadFromFile();
272
- delete accounts[accountId];
273
- await fs.writeFile(this.CONFIG_FILE, JSON.stringify(accounts, null, 2), 'utf8');
274
- console.error(`[CredentialManager] Account ${accountId} deleted from file`);
29
+ /**
30
+ * Compact result formatter. Default (lean) form is single-line / minimal — NO
31
+ * pretty-print — so it doesn't bloat the context window. Pass { verbose: true } for
32
+ * the fuller, indented form when a human actually needs to read every field.
33
+ *
34
+ * Accepts an already-prepared `data` value. Callers are expected to have already
35
+ * trimmed to the fields that matter for the lean case (see the READ tools), but this
36
+ * function is also safe to hand a full object for the verbose path.
37
+ */
38
+ export function leanResult(data, opts = {}) {
39
+ if (opts.verbose) {
40
+ return JSON.stringify(data, null, 2);
41
+ }
42
+ // Lean: single-line JSON. For arrays of flat objects we additionally collapse to
43
+ // a compact NDJSON-ish form which reads better and tokenizes smaller than one
44
+ // giant single-line array for long lists.
45
+ if (Array.isArray(data) && data.length > 0 && data.every(isFlatObject)) {
46
+ return data.map((row) => JSON.stringify(row)).join("\n");
47
+ }
48
+ return JSON.stringify(data);
49
+ }
50
+ // A "flat" object has only primitive / null values (no nested objects or arrays).
51
+ export function isFlatObject(v) {
52
+ if (typeof v !== "object" || v === null || Array.isArray(v))
53
+ return false;
54
+ return Object.values(v).every((val) => val === null || typeof val !== "object");
55
+ }
56
+ /**
57
+ * Render tabular data as a clean, column-aligned monospace ASCII table using
58
+ * box-drawing characters. The output is meant to be dropped inside a Slack code
59
+ * block (```) so it renders with a fixed-width font and column alignment survives.
60
+ *
61
+ * Accepts any of:
62
+ * - array of flat objects → columns inferred from keys (or pass `columns`)
63
+ * - 2D array (string[][]) → first row treated as header
64
+ * - a markdown table string (| a | b |\n|---|---|\n| 1 | 2 |)
65
+ *
66
+ * Long cells are truncated with an ellipsis past a per-column max width (default 40).
67
+ * Numeric-looking columns are right-aligned automatically unless overridden.
68
+ */
69
+ export function renderTable(rows, columns) {
70
+ const DEFAULT_MAX = 40;
71
+ let headers = [];
72
+ let body = [];
73
+ let colMeta = [];
74
+ if (typeof rows === "string") {
75
+ // Parse a markdown table string.
76
+ const parsed = parseMarkdownTable(rows);
77
+ headers = parsed.headers;
78
+ body = parsed.body;
79
+ colMeta = headers.map((h) => ({ key: h, label: h }));
80
+ }
81
+ else if (Array.isArray(rows) && rows.length > 0 && Array.isArray(rows[0])) {
82
+ // 2D array: first row is the header.
83
+ const grid = rows;
84
+ headers = (grid[0] || []).map((c) => String(c ?? ""));
85
+ body = grid.slice(1).map((r) => r.map((c) => cellToString(c)));
86
+ colMeta = headers.map((h) => ({ key: h, label: h }));
87
+ }
88
+ else {
89
+ // Array of objects.
90
+ const objRows = rows;
91
+ if (columns && columns.length > 0) {
92
+ colMeta = columns;
275
93
  }
276
- catch (error) {
277
- console.error('[CredentialManager] Failed to delete from file:', error);
94
+ else {
95
+ const keys = new Set();
96
+ for (const r of objRows)
97
+ Object.keys(r || {}).forEach((k) => keys.add(k));
98
+ colMeta = Array.from(keys).map((k) => ({ key: k, label: k }));
99
+ }
100
+ headers = colMeta.map((c) => c.label ?? c.key);
101
+ body = objRows.map((r) => colMeta.map((c) => cellToString(r?.[c.key])));
102
+ }
103
+ if (headers.length === 0)
104
+ return "(empty table)";
105
+ const colCount = headers.length;
106
+ // Decide alignment: explicit override wins; otherwise right-align columns whose
107
+ // every body cell looks numeric.
108
+ const aligns = colMeta.map((c, i) => {
109
+ if (c?.align)
110
+ return c.align;
111
+ const allNumeric = body.length > 0 &&
112
+ body.every((r) => {
113
+ const v = (r[i] ?? "").trim();
114
+ return v === "" || /^-?[\d,]+(\.\d+)?%?$/.test(v);
115
+ });
116
+ return allNumeric ? "right" : "left";
117
+ });
118
+ const maxWidths = colMeta.map((c) => c?.maxWidth ?? DEFAULT_MAX);
119
+ // Truncate then compute column widths.
120
+ const trunc = (s, max) => s.length > max ? s.slice(0, Math.max(0, max - 1)) + "…" : s;
121
+ const hdr = headers.map((h, i) => trunc(h, maxWidths[i]));
122
+ const cells = body.map((r) => Array.from({ length: colCount }, (_, i) => trunc(r[i] ?? "", maxWidths[i])));
123
+ const widths = Array.from({ length: colCount }, (_, i) => Math.max(hdr[i].length, ...cells.map((r) => r[i].length), 1));
124
+ const pad = (s, w, align) => align === "right" ? s.padStart(w) : s.padEnd(w);
125
+ const top = "┌" + widths.map((w) => "─".repeat(w + 2)).join("┬") + "┐";
126
+ const sep = "├" + widths.map((w) => "─".repeat(w + 2)).join("┼") + "┤";
127
+ const bottom = "└" + widths.map((w) => "─".repeat(w + 2)).join("┴") + "┘";
128
+ const fmtRow = (r) => "│ " + r.map((c, i) => pad(c, widths[i], aligns[i])).join(" │ ") + " │";
129
+ const lines = [top, fmtRow(hdr), sep, ...cells.map(fmtRow), bottom];
130
+ return lines.join("\n");
131
+ }
132
+ export function cellToString(v) {
133
+ if (v === null || v === undefined)
134
+ return "";
135
+ if (typeof v === "object")
136
+ return JSON.stringify(v);
137
+ return String(v);
138
+ }
139
+ // Parse a markdown pipe-table string into { headers, body }.
140
+ export function parseMarkdownTable(md) {
141
+ const lines = md
142
+ .split("\n")
143
+ .map((l) => l.trim())
144
+ .filter((l) => l.includes("|"));
145
+ if (lines.length === 0)
146
+ return { headers: [], body: [] };
147
+ const splitRow = (line) => line
148
+ .replace(/^\|/, "")
149
+ .replace(/\|$/, "")
150
+ .split("|")
151
+ .map((c) => c.trim());
152
+ const headers = splitRow(lines[0]);
153
+ // Drop the separator row (e.g. |---|---|) if present.
154
+ const bodyLines = lines.slice(1).filter((l) => !/^\|?[\s:|-]+\|?$/.test(l));
155
+ const body = bodyLines.map(splitRow);
156
+ return { headers, body };
157
+ }
158
+ /**
159
+ * Render a unicode progress bar, e.g. renderProgressBar(40) => "▰▰▰▰▱▱▱▱▱▱ 40%".
160
+ */
161
+ export function renderProgressBar(pct, width = 20) {
162
+ const clamped = Math.max(0, Math.min(100, Math.round(pct)));
163
+ const filled = Math.round((clamped / 100) * width);
164
+ const empty = width - filled;
165
+ return "▰".repeat(filled) + "▱".repeat(empty) + ` ${clamped}%`;
166
+ }
167
+ /**
168
+ * Build a Slack Block Kit blocks[] array: a header block, section blocks (each with
169
+ * optional two-column fields), dividers between sections, and an optional context
170
+ * footer. Used by slack_send_card and the task-lifecycle summary cards.
171
+ *
172
+ * Returns { blocks } always, plus { attachments } when a color bar is requested
173
+ * (Slack only supports the colored left-bar via the legacy attachments wrapper).
174
+ */
175
+ export function buildCard(opts) {
176
+ const blocks = [];
177
+ blocks.push({
178
+ type: "header",
179
+ text: { type: "plain_text", text: truncatePlain(opts.header, 150), emoji: true },
180
+ });
181
+ const sections = opts.sections ?? [];
182
+ sections.forEach((section, idx) => {
183
+ const block = { type: "section" };
184
+ if (section.text) {
185
+ block.text = { type: "mrkdwn", text: section.text };
186
+ }
187
+ if (section.fields && section.fields.length > 0) {
188
+ block.fields = section.fields.slice(0, 10).map((f) => ({
189
+ type: "mrkdwn",
190
+ text: f.label ? `*${f.label}*\n${f.value}` : f.value,
191
+ }));
278
192
  }
193
+ // A section block must carry either text or fields.
194
+ if (block.text || block.fields)
195
+ blocks.push(block);
196
+ if (idx < sections.length - 1)
197
+ blocks.push({ type: "divider" });
198
+ });
199
+ if (opts.context) {
200
+ blocks.push({
201
+ type: "context",
202
+ elements: [{ type: "mrkdwn", text: opts.context }],
203
+ });
279
204
  }
280
- async isAvailable() {
281
- await this.ensureInitialized();
282
- return this.isKeytarAvailable;
205
+ if (opts.color) {
206
+ // Colored cards must be wrapped in an attachment to get the left color bar.
207
+ return { blocks: [], attachments: [{ color: opts.color, blocks }] };
283
208
  }
209
+ return { blocks };
210
+ }
211
+ export function truncatePlain(s, max) {
212
+ return s.length > max ? s.slice(0, max - 1) + "…" : s;
284
213
  }
285
214
  // =====================================================================================
286
- // VALIDATION SCHEMAS - Account Management Tools
215
+ // VALIDATION SCHEMAS - Account Management Tools (read-only)
287
216
  // =====================================================================================
288
217
  const ListAccountsArgsSchema = z.object({});
289
- const SwitchAccountArgsSchema = z.object({
290
- account_id: z.string().describe("Account ID to switch to")
291
- });
292
- const AddAccountArgsSchema = z.object({
293
- name: z.string().describe("Human-friendly name for this account"),
294
- bot_token: z.string().describe("Bot User OAuth Token (starts with xoxb-)"),
295
- user_token: z.string().optional().describe("User OAuth Token (starts with xoxp-) - optional"),
296
- team_id: z.string().describe("Slack team ID")
297
- });
298
- const RemoveAccountArgsSchema = z.object({
299
- account_id: z.string().describe("Account ID to remove")
300
- });
301
218
  const GetActiveAccountArgsSchema = z.object({});
302
- const SetDefaultAccountArgsSchema = z.object({
303
- account_id: z.string().describe("Account ID to set as default")
304
- });
305
- const UpdateAccountArgsSchema = z.object({
306
- account_id: z.string().describe("Account ID to update"),
307
- bot_token: z.string().optional().describe("New Bot User OAuth Token (starts with xoxb-)"),
308
- user_token: z.string().optional().describe("New User OAuth Token (starts with xoxp-)")
309
- });
310
219
  // =====================================================================================
311
220
  // EXISTING TOOL SCHEMAS (from original mcp-slacker)
312
221
  // =====================================================================================
313
222
  const ListChannelsArgsSchema = z.object({
314
223
  types: z.string().optional().describe("Comma-separated list of channel types: public_channel, private_channel, mpim, im"),
315
- limit: z.number().optional().describe("Maximum number of channels to return (default: 100)")
224
+ limit: z.number().optional().describe("Maximum number of channels to return (default: 100)"),
225
+ verbose: z.boolean().optional().describe("Return the full raw channel objects. Default false returns lean output: id + name + is_private + num_members.")
316
226
  });
227
+ // Shared session-identity fields (Bundle 4). Requires the chat:write.customize bot
228
+ // scope; Slack ignores them gracefully otherwise. Defaults can be set once via the
229
+ // SLACK_SESSION_USERNAME / SLACK_SESSION_ICON env vars.
230
+ const IdentityFields = {
231
+ username: z.string().optional().describe("Post under this display name (e.g. 'Claude · ChillMCP'). Requires chat:write.customize scope. Falls back to SLACK_SESSION_USERNAME env var."),
232
+ icon_emoji: z.string().optional().describe("Icon emoji like ':robot_face:'. Requires chat:write.customize. Falls back to SLACK_SESSION_ICON env var."),
233
+ icon_url: z.string().optional().describe("Icon image URL (overrides icon_emoji). Requires chat:write.customize.")
234
+ };
317
235
  const SendMessageArgsSchema = z.object({
318
236
  channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #general)"),
319
237
  text: z.string().describe("Text content of the message"),
320
- thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread")
238
+ thread_ts: z.string().optional().describe("Timestamp of the parent message to reply in thread"),
239
+ ...IdentityFields
321
240
  });
322
241
  const GetChannelHistoryArgsSchema = z.object({
323
242
  channel: z.string().describe("Channel ID to fetch history from"),
324
- limit: z.number().optional().describe("Number of messages to return (default: 100)")
243
+ limit: z.number().optional().describe("Number of messages to return (default: 100)"),
244
+ verbose: z.boolean().optional().describe("Return the full raw API payload. Default false returns lean output: verbatim message text + user + ts, with metadata exhaust stripped.")
325
245
  });
326
246
  const AddReactionArgsSchema = z.object({
327
247
  channel: z.string().describe("Channel ID where the message is"),
328
248
  timestamp: z.string().describe("Timestamp of the message to react to"),
329
249
  name: z.string().describe("Reaction emoji name (without colons)")
330
250
  });
251
+ // ----- Legate pull/polling tools (multi-session shared-bot coordination) --------------
252
+ const PollArgsSchema = z.object({
253
+ channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
254
+ call_sign: z.string().describe("This Legate's NATO call-sign (e.g., Alpha, Bravo)"),
255
+ limit: z.number().optional().describe("Max messages to scan/return (default: 15)"),
256
+ since: z.string().optional().describe("Slack ts to poll from; overrides the stored cursor"),
257
+ include_chatter: z.boolean().optional().describe("Include messages not addressed to anyone (default: false)")
258
+ });
259
+ const ClaimLaneArgsSchema = z.object({
260
+ channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
261
+ call_sign: z.string().describe("This Legate's NATO call-sign"),
262
+ task: z.string().describe("The work being claimed (free text; normalized to a lane key)"),
263
+ ttl_minutes: z.number().optional().describe("How long a claim stays valid (default: 20)"),
264
+ lookback: z.number().optional().describe("How many recent messages to scan for prior claims (default: 30)"),
265
+ release: z.boolean().optional().describe("If true, post a LANE RELEASE for this task instead of claiming (default: false)")
266
+ });
267
+ const CheckinArgsSchema = z.object({
268
+ channel: z.string().describe("Channel ID or name (e.g., C1234567890 or #echelon)"),
269
+ call_sign: z.string().describe("This Legate's NATO call-sign"),
270
+ status: z.string().describe("One-line status to post"),
271
+ force: z.boolean().optional().describe("Post even if the status is unchanged (default: false)"),
272
+ heartbeat_minutes: z.number().optional().describe("If >0, re-post an unchanged status once this many minutes have elapsed (default: 0)")
273
+ });
331
274
  const ListUsersArgsSchema = z.object({
332
- limit: z.number().optional().describe("Maximum number of users to return (default: 100)")
275
+ limit: z.number().optional().describe("Maximum number of users to return (default: 100)"),
276
+ verbose: z.boolean().optional().describe("Return the full raw user objects. Default false returns lean output: id + name + real_name only.")
333
277
  });
334
278
  const GetUserByNameArgsSchema = z.object({
335
279
  name: z.string().describe("Name or display name to search for")
@@ -345,18 +289,21 @@ const SearchFilesArgsSchema = z.object({
345
289
  const SearchMessagesArgsSchema = z.object({
346
290
  query: z.string().describe("Search query for messages"),
347
291
  count: z.number().optional().describe("Number of results to return (default: 20)"),
348
- page: z.number().optional().describe("Page number of results (default: 1)")
292
+ page: z.number().optional().describe("Page number of results (default: 1)"),
293
+ verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + user + channel + ts + permalink.")
349
294
  });
350
295
  const SearchByUserArgsSchema = z.object({
351
296
  user_id: z.string().describe("User ID to search messages from"),
352
297
  query: z.string().optional().describe("Additional search query"),
353
- count: z.number().optional().describe("Number of results to return (default: 20)")
298
+ count: z.number().optional().describe("Number of results to return (default: 20)"),
299
+ verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + channel + ts + permalink.")
354
300
  });
355
301
  const SearchByDateRangeArgsSchema = z.object({
356
302
  from_date: z.string().describe("Start date (YYYY-MM-DD)"),
357
303
  to_date: z.string().describe("End date (YYYY-MM-DD)"),
358
304
  query: z.string().optional().describe("Additional search query"),
359
- count: z.number().optional().describe("Number of results to return (default: 20)")
305
+ count: z.number().optional().describe("Number of results to return (default: 20)"),
306
+ verbose: z.boolean().optional().describe("Return the full raw search payload. Default false returns lean output: verbatim text + user + channel + ts + permalink.")
360
307
  });
361
308
  const PinMessageArgsSchema = z.object({
362
309
  channel: z.string().describe("Channel ID where the message is"),
@@ -392,11 +339,62 @@ const CreateReminderArgsSchema = z.object({
392
339
  });
393
340
  const ListRemindersArgsSchema = z.object({});
394
341
  const GetCustomEmojiArgsSchema = z.object({});
395
- const GetWorkspaceStatsArgsSchema = z.object({});
342
+ const GetWorkspaceStatsArgsSchema = z.object({
343
+ verbose: z.boolean().optional().describe("Return the fuller stats payload (indented). Default false returns a lean one-line summary.")
344
+ });
345
+ const SendTableArgsSchema = z.object({
346
+ channel: z.string().describe("Channel ID or name to post the table to"),
347
+ title: z.string().optional().describe("Optional bold title rendered above the table"),
348
+ rows: z.union([
349
+ z.array(z.record(z.any())), // array of objects
350
+ z.array(z.array(z.any())), // 2D array (first row = header)
351
+ z.string() // markdown table string
352
+ ]).describe("Table data: array of objects, a 2D array (first row = header), OR a markdown pipe-table string"),
353
+ as_code_block: z.boolean().optional().describe("Wrap the ASCII table in a ``` code block so columns stay aligned (default true)")
354
+ });
355
+ // ---- Block Kit cards + threaded task lifecycle (Bundle 2) ----
356
+ const SendCardArgsSchema = z.object({
357
+ channel: z.string().describe("Channel ID or name to post the card to"),
358
+ header: z.string().describe("Card header text (plain text)"),
359
+ sections: z.array(z.object({
360
+ text: z.string().optional().describe("mrkdwn body text for this section"),
361
+ fields: z.array(z.object({
362
+ label: z.string().optional(),
363
+ value: z.string()
364
+ })).optional().describe("Up to 10 two-column key/value fields")
365
+ })).optional().describe("Section blocks rendered in order, separated by dividers"),
366
+ context: z.string().optional().describe("Small footer context line (mrkdwn)"),
367
+ color: z.string().optional().describe("Hex color for the left bar, e.g. #3D8C62"),
368
+ ...IdentityFields
369
+ });
370
+ const StartTaskArgsSchema = z.object({
371
+ channel: z.string().describe("Channel ID or name to post the task card to"),
372
+ title: z.string().describe("Task title"),
373
+ total_steps: z.number().optional().describe("Total number of steps (enables a progress bar on updates)"),
374
+ ...IdentityFields
375
+ });
376
+ const UpdateTaskArgsSchema = z.object({
377
+ channel: z.string().describe("Channel ID where the task card lives"),
378
+ task_ts: z.string().describe("Timestamp of the parent task card (from slack_start_task)"),
379
+ message: z.string().describe("Progress update — posted as a THREADED reply. Do NOT @-mention here; routine updates must stay quiet."),
380
+ step: z.number().optional().describe("Current step number (with total_steps, updates the parent's progress bar)"),
381
+ total_steps: z.number().optional().describe("Total steps (defaults to the value from start_task if known)"),
382
+ ...IdentityFields
383
+ });
384
+ const CompleteTaskArgsSchema = z.object({
385
+ channel: z.string().describe("Channel ID where the task card lives"),
386
+ task_ts: z.string().describe("Timestamp of the parent task card (from slack_start_task)"),
387
+ summary: z.string().describe("Final summary of the task outcome"),
388
+ status: z.enum(["done", "failed"]).describe("Final status"),
389
+ details: z.string().optional().describe("Optional details — commits, links, duration, etc. (mrkdwn)"),
390
+ notify_user: z.string().optional().describe("Optional Slack user ID to @-mention on completion. This is the ONLY task tool permitted to mention."),
391
+ ...IdentityFields
392
+ });
396
393
  const SendFormattedMessageArgsSchema = z.object({
397
394
  channel: z.string().describe("Channel ID or name"),
398
- blocks: z.array(z.any()).describe("Slack Block Kit blocks for rich formatting"),
399
- text: z.string().optional().describe("Fallback text")
395
+ blocks: z.array(z.object({ type: z.string() }).passthrough()).describe("Slack Block Kit blocks for rich formatting"),
396
+ text: z.string().optional().describe("Fallback text"),
397
+ ...IdentityFields
400
398
  });
401
399
  const BulkReactMessagesArgsSchema = z.object({
402
400
  channel: z.string().describe("Channel ID"),
@@ -437,536 +435,207 @@ const SendDiagramArgsSchema = z.object({
437
435
  title: z.string().optional().describe("Title for the diagram"),
438
436
  initial_comment: z.string().optional().describe("Message posted with the diagram")
439
437
  });
440
- // =====================================================================================
441
- // MAIN SERVER CLASS
442
- // =====================================================================================
443
- class SlackerV3Server {
438
+ export class SlackerV3Server {
444
439
  server;
445
440
  accountState;
446
- credentialManager;
441
+ // Per-account TTL caches for users.list / conversations.list (120s).
442
+ CACHE_TTL_MS = 120_000;
443
+ usersCache = new Map();
444
+ channelsCache = new Map();
445
+ // In-memory registry of active task cards keyed by `${channel}:${task_ts}`.
446
+ // Lets slack_update_task/slack_complete_task recall the title, total_steps, and
447
+ // current status reaction so they can re-render the parent and swap the reaction.
448
+ taskRegistry = new Map();
449
+ // Singleton Puppeteer browser, launched lazily and kept warm.
450
+ browser = null;
451
+ browserIdleTimer = null;
452
+ BROWSER_IDLE_MS = 5 * 60 * 1000; // close after 5 min idle
453
+ // Friendly message returned (never thrown on boot) when no bot token is configured.
454
+ static NO_TOKEN_MESSAGE = "No Slack bot token. Set SLACK_BOT_TOKEN in this MCP server's env block in your " +
455
+ "Claude config (~/.claude.json or .mcp.json).";
447
456
  constructor() {
448
457
  this.server = new Server({
449
458
  name: "mcp-slack",
450
- version: "3.1.1",
459
+ version: "4.0.1",
451
460
  }, {
452
461
  capabilities: {
453
462
  tools: {},
454
463
  },
455
464
  });
456
- // Initialize account state
465
+ // Load the single account from the environment. Never throws — if no token is
466
+ // present the server still boots and tool calls return NO_TOKEN_MESSAGE.
457
467
  this.accountState = {
458
- accounts: new Map(),
459
- activeAccountId: null,
460
- clients: new Map(),
461
- userClients: new Map()
468
+ account: null,
469
+ client: null,
470
+ userClient: null,
471
+ workspaceFetched: false
462
472
  };
463
- // Initialize credential manager
464
- this.credentialManager = new CredentialManager();
465
- // Initialize with default account if environment variables are provided
466
- this.initializeDefaultAccount();
473
+ this.loadAccountFromEnv();
467
474
  // Setup handlers immediately so the server can start
468
475
  this.setupHandlers();
469
476
  }
470
477
  // =====================================================================================
471
- // ACCOUNT MANAGEMENT METHODS
478
+ // ACCOUNT (env-first, single account)
472
479
  // =====================================================================================
473
- async loadPersistedAccounts() {
474
- try {
475
- const startTime = Date.now();
476
- console.error('[SlackServer] Loading persisted accounts...');
477
- const persistedAccounts = await this.credentialManager.loadAllAccounts();
478
- console.error(`[SlackServer] Found ${persistedAccounts.length} persisted accounts`);
479
- for (const account of persistedAccounts) {
480
- // Don't overwrite if already loaded from env
481
- if (!this.accountState.accounts.has(account.id)) {
482
- this.accountState.accounts.set(account.id, account);
483
- this.initializeClient(account);
484
- // Set first loaded account as active if none set
485
- if (!this.accountState.activeAccountId) {
486
- this.accountState.activeAccountId = account.id;
487
- console.error(`[SlackServer] Set ${account.id} as active account`);
488
- }
489
- }
490
- }
491
- const loadTime = Date.now() - startTime;
492
- console.error(`[SlackServer] Account loading completed in ${loadTime}ms`);
493
- console.error(`[SlackServer] Active accounts: ${Array.from(this.accountState.accounts.keys()).join(', ')}`);
494
- }
495
- catch (error) {
496
- console.error('[SlackServer] Failed to load persisted accounts:', error);
497
- }
498
- }
499
- initializeDefaultAccount() {
500
- const defaultBotToken = process.env.DEFAULT_BOT_TOKEN;
501
- const defaultUserToken = process.env.DEFAULT_USER_TOKEN;
502
- const defaultTeamId = process.env.DEFAULT_TEAM_ID;
503
- const defaultAccountName = process.env.DEFAULT_ACCOUNT_NAME;
504
- console.error("[SlackServer] Environment variables:", {
505
- DEFAULT_BOT_TOKEN: defaultBotToken ? "Set" : "Not set",
506
- DEFAULT_USER_TOKEN: defaultUserToken ? "Set" : "Not set",
507
- DEFAULT_TEAM_ID: defaultTeamId,
508
- DEFAULT_ACCOUNT_NAME: defaultAccountName
480
+ // Load exactly one account from env vars. SLACK_* is preferred; DEFAULT_* is a
481
+ // back-compat fallback. Multi-workspace = run a second MCP server entry with its own
482
+ // env block. No disk persistence — workspace/teamId hydrate lazily via auth.test.
483
+ loadAccountFromEnv() {
484
+ const botToken = process.env.SLACK_BOT_TOKEN || process.env.DEFAULT_BOT_TOKEN;
485
+ const userToken = process.env.SLACK_USER_TOKEN || process.env.DEFAULT_USER_TOKEN;
486
+ const teamId = process.env.SLACK_TEAM_ID || process.env.DEFAULT_TEAM_ID;
487
+ const name = process.env.SLACK_WORKSPACE || process.env.DEFAULT_ACCOUNT_NAME || 'Slack Workspace';
488
+ console.error("[SlackServer] Environment:", {
489
+ SLACK_BOT_TOKEN: botToken ? "Set" : "Not set",
490
+ SLACK_USER_TOKEN: userToken ? "Set" : "Not set",
491
+ SLACK_TEAM_ID: teamId || "(lazy)",
509
492
  });
510
- if (defaultBotToken && defaultTeamId) {
511
- const defaultAccount = {
512
- id: 'default',
513
- name: defaultAccountName || 'Default Workspace',
514
- workspace: 'Unknown', // Will be fetched on first use
515
- teamId: defaultTeamId,
516
- botToken: defaultBotToken,
517
- userToken: defaultUserToken,
518
- isDefault: true
519
- };
520
- this.accountState.accounts.set(defaultAccount.id, defaultAccount);
521
- this.accountState.activeAccountId = defaultAccount.id;
522
- this.initializeClient(defaultAccount);
523
- // Save env-based account to keychain for next time
524
- this.credentialManager.saveAccount(defaultAccount).catch(error => {
525
- console.error('Failed to persist env-based account:', error);
526
- });
527
- }
528
- }
529
- initializeClient(account) {
530
- // Initialize bot client
531
- const botClient = new WebClient(account.botToken);
532
- this.accountState.clients.set(account.id, botClient);
533
- // Initialize user client if user token is provided
534
- if (account.userToken) {
535
- const userClient = new WebClient(account.userToken);
536
- this.accountState.userClients.set(account.id, userClient);
537
- }
538
- }
539
- validateTokenFormat(token, type) {
540
- if (type === 'bot') {
541
- return token.startsWith('xoxb-');
542
- }
543
- else {
544
- return token.startsWith('xoxp-');
545
- }
546
- }
547
- generateAccountId(name) {
548
- // Generate a safe account ID from the name
549
- const baseId = name.toLowerCase()
550
- .replace(/[^a-z0-9]/g, '-')
551
- .replace(/-+/g, '-')
552
- .replace(/^-|-$/g, '');
553
- let id = baseId;
554
- let counter = 1;
555
- // Ensure uniqueness
556
- while (this.accountState.accounts.has(id)) {
557
- id = `${baseId}-${counter}`;
558
- counter++;
493
+ if (!botToken) {
494
+ console.error("[SlackServer] No bot token configured — server will boot but tool calls will error until SLACK_BOT_TOKEN is set.");
495
+ return;
559
496
  }
560
- return id;
497
+ this.accountState.account = {
498
+ id: 'default',
499
+ name,
500
+ workspace: name && name !== 'Slack Workspace' ? name : 'Unknown',
501
+ teamId: teamId || '',
502
+ botToken,
503
+ userToken: userToken || undefined,
504
+ };
505
+ this.accountState.client = new WebClient(botToken);
506
+ this.accountState.userClient = userToken ? new WebClient(userToken) : null;
561
507
  }
562
508
  async getActiveClient() {
563
- if (!this.accountState.activeAccountId) {
564
- throw new Error("No active Slack account. Use 'list_accounts' to see available accounts, or 'add_account' to add one.");
509
+ if (!this.accountState.client) {
510
+ throw new Error(SlackerV3Server.NO_TOKEN_MESSAGE);
565
511
  }
566
- const client = this.accountState.clients.get(this.accountState.activeAccountId);
512
+ return this.accountState.client;
513
+ }
514
+ async getActiveUserClient() {
515
+ // Prefer the user client; fall back to the bot client.
516
+ const client = this.accountState.userClient || this.accountState.client;
567
517
  if (!client) {
568
- throw new Error("Active account client not found. This shouldn't happen - please try switching accounts.");
518
+ throw new Error(SlackerV3Server.NO_TOKEN_MESSAGE);
569
519
  }
570
- // Debug: Log token being used
571
- const activeAccount = this.accountState.accounts.get(this.accountState.activeAccountId);
572
- console.error("Using bot token:", activeAccount?.botToken);
573
520
  return client;
574
521
  }
575
- async getActiveUserClient() {
576
- if (!this.accountState.activeAccountId) {
577
- throw new Error("No active Slack account. Use 'switch_account' first.");
522
+ // Lazily hydrate workspace name + teamId via auth.test on first use, cached in memory.
523
+ async ensureWorkspaceInfo() {
524
+ if (this.accountState.workspaceFetched || !this.accountState.account || !this.accountState.client) {
525
+ return;
578
526
  }
579
- // Try to get user client first, fall back to bot client
580
- let client = this.accountState.userClients.get(this.accountState.activeAccountId);
581
- if (!client) {
582
- client = this.accountState.clients.get(this.accountState.activeAccountId);
527
+ try {
528
+ const info = await this.accountState.client.auth.test();
529
+ if (info?.team)
530
+ this.accountState.account.workspace = info.team;
531
+ if (info?.team_id)
532
+ this.accountState.account.teamId = info.team_id;
583
533
  }
584
- if (!client) {
585
- throw new Error("Active account client not found.");
534
+ catch (error) {
535
+ console.error("[SlackServer] auth.test failed (workspace stays 'Unknown'):", error);
536
+ }
537
+ finally {
538
+ this.accountState.workspaceFetched = true;
586
539
  }
587
- return client;
588
540
  }
589
- maskToken(token) {
590
- if (token.length <= 8)
591
- return "***";
592
- return token.substring(0, 8) + "***" + token.substring(token.length - 4);
541
+ // =====================================================================================
542
+ // TTL CACHE HELPERS (users.list / conversations.list)
543
+ // =====================================================================================
544
+ currentAccountKey() {
545
+ return this.accountState.account?.id || '__none__';
546
+ }
547
+ // Fetch ALL active (non-deleted, non-bot) users for the active account, paginated, cached 120s.
548
+ async getAllUsersCached(client) {
549
+ const key = this.currentAccountKey();
550
+ const cached = this.usersCache.get(key);
551
+ if (cached && cached.expires > Date.now()) {
552
+ return cached.value;
553
+ }
554
+ const members = [];
555
+ let cursor = undefined;
556
+ do {
557
+ const result = await client.users.list({ limit: 200, cursor });
558
+ if (result.members)
559
+ members.push(...result.members);
560
+ cursor = result.response_metadata?.next_cursor || undefined;
561
+ } while (cursor);
562
+ const active = members.filter((u) => !u.deleted && !u.is_bot);
563
+ this.usersCache.set(key, { value: active, expires: Date.now() + this.CACHE_TTL_MS });
564
+ return active;
565
+ }
566
+ // Fetch ALL public+private channels for the active account, paginated, cached 120s.
567
+ async getAllChannelsCached(client) {
568
+ const key = this.currentAccountKey();
569
+ const cached = this.channelsCache.get(key);
570
+ if (cached && cached.expires > Date.now()) {
571
+ return cached.value;
572
+ }
573
+ const channels = [];
574
+ let cursor = undefined;
575
+ do {
576
+ const result = await client.conversations.list({
577
+ types: 'public_channel,private_channel',
578
+ limit: 1000,
579
+ cursor
580
+ });
581
+ if (result.channels)
582
+ channels.push(...result.channels);
583
+ cursor = result.response_metadata?.next_cursor || undefined;
584
+ } while (cursor);
585
+ this.channelsCache.set(key, { value: channels, expires: Date.now() + this.CACHE_TTL_MS });
586
+ return channels;
593
587
  }
594
588
  // =====================================================================================
595
- // ACCOUNT MANAGEMENT TOOL IMPLEMENTATIONS
589
+ // ACCOUNT TOOL IMPLEMENTATIONS (read-only — single env-loaded account)
596
590
  // =====================================================================================
597
- async listAccounts(args) {
598
- ListAccountsArgsSchema.parse(args);
599
- const accounts = Array.from(this.accountState.accounts.values()).map(account => ({
591
+ // Build the public (no-secrets) view of the active account, hydrating workspace/teamId
592
+ // lazily via auth.test on first use.
593
+ async describeActiveAccount() {
594
+ const account = this.accountState.account;
595
+ if (!account)
596
+ return null;
597
+ await this.ensureWorkspaceInfo();
598
+ return {
600
599
  id: account.id,
601
600
  name: account.name,
602
601
  workspace: account.workspace,
603
602
  team_id: account.teamId,
604
- is_default: account.isDefault || false,
605
- is_active: account.id === this.accountState.activeAccountId,
606
603
  has_user_token: !!account.userToken,
607
- bot_token: this.maskToken(account.botToken),
608
- user_token: account.userToken ? this.maskToken(account.userToken) : null
609
- }));
610
- return {
611
- content: [
612
- {
613
- type: "text",
614
- text: JSON.stringify({
615
- total_accounts: accounts.length,
616
- active_account_id: this.accountState.activeAccountId,
617
- accounts: accounts
618
- }, null, 2)
619
- }
620
- ]
621
- };
622
- }
623
- async switchAccount(args) {
624
- const validatedArgs = SwitchAccountArgsSchema.parse(args);
625
- const account = this.accountState.accounts.get(validatedArgs.account_id);
626
- if (!account) {
627
- throw new Error(`Account '${validatedArgs.account_id}' not found. Use 'list_accounts' to see available accounts.`);
628
- }
629
- // Initialize client if not exists
630
- if (!this.accountState.clients.has(account.id)) {
631
- this.initializeClient(account);
632
- }
633
- // Switch active account
634
- this.accountState.activeAccountId = account.id;
635
- // Fetch workspace info if not cached
636
- if (account.workspace === 'Unknown') {
637
- try {
638
- const client = this.accountState.clients.get(account.id);
639
- const teamInfo = await client.team.info();
640
- account.workspace = teamInfo.team?.name || 'Unknown';
641
- }
642
- catch (error) {
643
- // If we can't fetch workspace info, that's ok - we'll use 'Unknown'
644
- console.error(`Could not fetch workspace info for ${account.id}:`, error);
645
- }
646
- }
647
- return {
648
- content: [
649
- {
650
- type: "text",
651
- text: JSON.stringify({
652
- success: true,
653
- message: `Switched to ${account.name} (${account.workspace})`,
654
- account: {
655
- id: account.id,
656
- name: account.name,
657
- workspace: account.workspace,
658
- team_id: account.teamId
659
- }
660
- }, null, 2)
661
- }
662
- ]
663
604
  };
664
605
  }
665
- async addAccount(args) {
666
- const validatedArgs = AddAccountArgsSchema.parse(args);
667
- // Validate token formats
668
- if (!this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
669
- throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
670
- }
671
- if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
672
- throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
673
- }
674
- // Generate unique account ID
675
- const accountId = this.generateAccountId(validatedArgs.name);
676
- // Create new account
677
- const newAccount = {
678
- id: accountId,
679
- name: validatedArgs.name,
680
- workspace: 'Unknown', // Will be fetched on first use
681
- teamId: validatedArgs.team_id,
682
- botToken: validatedArgs.bot_token,
683
- userToken: validatedArgs.user_token,
684
- isDefault: false
685
- };
686
- // Test the bot token by trying to get team info
687
- try {
688
- const testClient = new WebClient(validatedArgs.bot_token);
689
- const teamInfo = await testClient.team.info();
690
- newAccount.workspace = teamInfo.team?.name || 'Unknown';
691
- // Verify team ID matches
692
- if (teamInfo.team?.id && teamInfo.team.id !== validatedArgs.team_id) {
693
- throw new Error(`Team ID mismatch. Token belongs to team ${teamInfo.team.id}, but ${validatedArgs.team_id} was provided.`);
694
- }
695
- }
696
- catch (error) {
697
- throw new Error(`Failed to verify bot token: ${error instanceof Error ? error.message : String(error)}`);
698
- }
699
- // Add to accounts
700
- this.accountState.accounts.set(accountId, newAccount);
701
- this.initializeClient(newAccount);
702
- // If this is the first account, make it active
703
- if (!this.accountState.activeAccountId) {
704
- this.accountState.activeAccountId = accountId;
705
- }
706
- // Persist to keychain
707
- try {
708
- await this.credentialManager.saveAccount(newAccount);
709
- return {
710
- content: [
711
- {
712
- type: "text",
713
- text: JSON.stringify({
714
- success: true,
715
- message: `Account '${validatedArgs.name}' added and saved to secure storage`,
716
- account: {
717
- id: accountId,
718
- name: newAccount.name,
719
- workspace: newAccount.workspace,
720
- team_id: newAccount.teamId,
721
- is_active: accountId === this.accountState.activeAccountId
722
- }
723
- }, null, 2)
724
- }
725
- ]
726
- };
727
- }
728
- catch (error) {
729
- // Still works, just not persisted
730
- return {
731
- content: [
732
- {
733
- type: "text",
734
- text: JSON.stringify({
735
- success: true,
736
- message: `Account '${validatedArgs.name}' added (temporary - secure storage unavailable)`,
737
- account: {
738
- id: accountId,
739
- name: newAccount.name,
740
- workspace: newAccount.workspace,
741
- team_id: newAccount.teamId,
742
- is_active: accountId === this.accountState.activeAccountId
743
- }
744
- }, null, 2)
745
- }
746
- ]
747
- };
748
- }
749
- }
750
- async removeAccount(args) {
751
- const validatedArgs = RemoveAccountArgsSchema.parse(args);
752
- const account = this.accountState.accounts.get(validatedArgs.account_id);
753
- if (!account) {
754
- throw new Error(`Account '${validatedArgs.account_id}' not found.`);
755
- }
756
- // Check if this is the active account
757
- const wasActive = this.accountState.activeAccountId === validatedArgs.account_id;
758
- // Remove from all maps
759
- this.accountState.accounts.delete(validatedArgs.account_id);
760
- this.accountState.clients.delete(validatedArgs.account_id);
761
- this.accountState.userClients.delete(validatedArgs.account_id);
762
- // If this was the active account, switch to another one or clear active
763
- if (wasActive) {
764
- const remainingAccounts = Array.from(this.accountState.accounts.keys());
765
- this.accountState.activeAccountId = remainingAccounts.length > 0 ? remainingAccounts[0] : null;
766
- }
767
- // Remove from keychain
768
- try {
769
- await this.credentialManager.deleteAccount(validatedArgs.account_id);
770
- return {
771
- content: [
772
- {
773
- type: "text",
774
- text: JSON.stringify({
775
- success: true,
776
- message: `Account '${account.name}' removed from memory and secure storage`,
777
- new_active_account: this.accountState.activeAccountId,
778
- remaining_accounts: this.accountState.accounts.size
779
- }, null, 2)
780
- }
781
- ]
782
- };
783
- }
784
- catch (error) {
785
- return {
786
- content: [
787
- {
788
- type: "text",
789
- text: JSON.stringify({
790
- success: true,
791
- message: `Account '${account.name}' removed from memory (secure storage removal failed)`,
792
- new_active_account: this.accountState.activeAccountId,
793
- remaining_accounts: this.accountState.accounts.size
794
- }, null, 2)
795
- }
796
- ]
797
- };
798
- }
799
- }
606
+ // get_active_account — returns the wired workspace/team/name (no secrets) so the user
607
+ // can confirm which workspace this server is talking to.
800
608
  async getActiveAccount(args) {
801
609
  GetActiveAccountArgsSchema.parse(args);
802
- if (!this.accountState.activeAccountId) {
803
- return {
804
- content: [
805
- {
806
- type: "text",
807
- text: JSON.stringify({
808
- active_account: null,
809
- message: "No active account. Use 'list_accounts' to see available accounts, or 'add_account' to add one."
810
- }, null, 2)
811
- }
812
- ]
813
- };
814
- }
815
- const account = this.accountState.accounts.get(this.accountState.activeAccountId);
816
- if (!account) {
610
+ const active = await this.describeActiveAccount();
611
+ if (!active) {
817
612
  return {
818
- content: [
819
- {
820
- type: "text",
821
- text: JSON.stringify({
613
+ content: [{ type: "text", text: JSON.stringify({
822
614
  active_account: null,
823
- error: "Active account not found in registry"
824
- }, null, 2)
825
- }
826
- ]
615
+ message: SlackerV3Server.NO_TOKEN_MESSAGE,
616
+ }, null, 2) }]
827
617
  };
828
618
  }
829
619
  return {
830
- content: [
831
- {
832
- type: "text",
833
- text: JSON.stringify({
834
- active_account: {
835
- id: account.id,
836
- name: account.name,
837
- workspace: account.workspace,
838
- team_id: account.teamId,
839
- is_default: account.isDefault || false,
840
- has_user_token: !!account.userToken
841
- }
842
- }, null, 2)
843
- }
844
- ]
620
+ content: [{ type: "text", text: JSON.stringify({ active_account: active }, null, 2) }]
845
621
  };
846
622
  }
847
- async setDefaultAccount(args) {
848
- const validatedArgs = SetDefaultAccountArgsSchema.parse(args);
849
- const account = this.accountState.accounts.get(validatedArgs.account_id);
850
- if (!account) {
851
- throw new Error(`Account '${validatedArgs.account_id}' not found.`);
852
- }
853
- // Clear default flag from all accounts
854
- for (const acc of this.accountState.accounts.values()) {
855
- acc.isDefault = false;
856
- }
857
- // Set new default
858
- account.isDefault = true;
623
+ // list_accounts — kept for back-compat; this server is single-account, so it simply
624
+ // returns the one active account (or none).
625
+ async listAccounts(args) {
626
+ ListAccountsArgsSchema.parse(args);
627
+ const active = await this.describeActiveAccount();
628
+ const accounts = active ? [{ ...active, is_active: true }] : [];
859
629
  return {
860
- content: [
861
- {
862
- type: "text",
863
- text: JSON.stringify({
864
- success: true,
865
- message: `Account '${account.name}' set as default`,
866
- default_account: {
867
- id: account.id,
868
- name: account.name,
869
- workspace: account.workspace
870
- }
871
- }, null, 2)
872
- }
873
- ]
630
+ content: [{ type: "text", text: JSON.stringify({
631
+ total_accounts: accounts.length,
632
+ active_account_id: this.accountState.account?.id ?? null,
633
+ accounts,
634
+ }, null, 2) }]
874
635
  };
875
636
  }
876
- async updateAccount(args) {
877
- const validatedArgs = UpdateAccountArgsSchema.parse(args);
878
- const account = this.accountState.accounts.get(validatedArgs.account_id);
879
- if (!account) {
880
- throw new Error(`Account '${validatedArgs.account_id}' not found.`);
881
- }
882
- // Validate new tokens if provided
883
- if (validatedArgs.bot_token && !this.validateTokenFormat(validatedArgs.bot_token, 'bot')) {
884
- throw new Error("Invalid bot token format. Bot tokens must start with 'xoxb-'");
885
- }
886
- if (validatedArgs.user_token && !this.validateTokenFormat(validatedArgs.user_token, 'user')) {
887
- throw new Error("Invalid user token format. User tokens must start with 'xoxp-'");
888
- }
889
- // Update tokens in memory
890
- let tokensUpdated = false;
891
- if (validatedArgs.bot_token && validatedArgs.bot_token !== account.botToken) {
892
- account.botToken = validatedArgs.bot_token;
893
- tokensUpdated = true;
894
- }
895
- if (validatedArgs.user_token !== undefined && validatedArgs.user_token !== account.userToken) {
896
- account.userToken = validatedArgs.user_token;
897
- tokensUpdated = true;
898
- }
899
- if (!tokensUpdated) {
900
- return {
901
- content: [
902
- {
903
- type: "text",
904
- text: JSON.stringify({
905
- success: false,
906
- message: "No token changes provided"
907
- }, null, 2)
908
- }
909
- ]
910
- };
911
- }
912
- // Re-initialize clients with new tokens
913
- this.initializeClient(account);
914
- // Update workspace info if bot token changed
915
- if (validatedArgs.bot_token) {
916
- try {
917
- const client = this.accountState.clients.get(account.id);
918
- const teamInfo = await client.team.info();
919
- account.workspace = teamInfo.team?.name || account.workspace;
920
- }
921
- catch (error) {
922
- console.error('Failed to update workspace info:', error);
923
- }
924
- }
925
- // Persist updated account
926
- try {
927
- await this.credentialManager.updateAccount(account);
928
- return {
929
- content: [
930
- {
931
- type: "text",
932
- text: JSON.stringify({
933
- success: true,
934
- message: `Updated tokens for '${account.name}' and saved to secure storage`,
935
- account: {
936
- id: account.id,
937
- name: account.name,
938
- workspace: account.workspace,
939
- team_id: account.teamId,
940
- has_user_token: !!account.userToken
941
- }
942
- }, null, 2)
943
- }
944
- ]
945
- };
946
- }
947
- catch (error) {
948
- return {
949
- content: [
950
- {
951
- type: "text",
952
- text: JSON.stringify({
953
- success: true,
954
- message: `Updated tokens for '${account.name}' (temporary - secure storage unavailable)`,
955
- account: {
956
- id: account.id,
957
- name: account.name,
958
- workspace: account.workspace,
959
- team_id: account.teamId,
960
- has_user_token: !!account.userToken
961
- }
962
- }, null, 2)
963
- }
964
- ]
965
- };
966
- }
967
- }
968
637
  // =====================================================================================
969
- // EXISTING SLACK TOOL IMPLEMENTATIONS (Modified for Multi-Account)
638
+ // EXISTING SLACK TOOL IMPLEMENTATIONS
970
639
  // =====================================================================================
971
640
  async slackListChannels(args) {
972
641
  const validatedArgs = ListChannelsArgsSchema.parse(args);
@@ -988,20 +657,33 @@ class SlackerV3Server {
988
657
  // Get next cursor for pagination
989
658
  cursor = result.response_metadata?.next_cursor;
990
659
  } while (cursor);
660
+ // VERBOSE: full channel objects including topic/purpose.
661
+ if (validatedArgs.verbose) {
662
+ const channels = allChannels.map(channel => ({
663
+ id: channel.id,
664
+ name: channel.name,
665
+ is_private: channel.is_private,
666
+ is_member: channel.is_member,
667
+ topic: channel.topic?.value,
668
+ purpose: channel.purpose?.value,
669
+ num_members: channel.num_members
670
+ }));
671
+ return {
672
+ content: [{ type: "text", text: JSON.stringify(channels, null, 2) }]
673
+ };
674
+ }
675
+ // LEAN: just id + name + privacy + member count.
991
676
  const channels = allChannels.map(channel => ({
992
677
  id: channel.id,
993
678
  name: channel.name,
994
- is_private: channel.is_private,
995
- is_member: channel.is_member,
996
- topic: channel.topic?.value,
997
- purpose: channel.purpose?.value,
679
+ is_private: !!channel.is_private,
998
680
  num_members: channel.num_members
999
681
  }));
1000
682
  return {
1001
683
  content: [
1002
684
  {
1003
685
  type: "text",
1004
- text: JSON.stringify(channels, null, 2)
686
+ text: leanResult(channels)
1005
687
  }
1006
688
  ]
1007
689
  };
@@ -1016,7 +698,7 @@ class SlackerV3Server {
1016
698
  statusCode: error.statusCode
1017
699
  });
1018
700
  // Get current account info for debugging
1019
- const activeAccount = this.accountState.accounts.get(this.accountState.activeAccountId);
701
+ const activeAccount = this.accountState.account;
1020
702
  console.error("Active account:", {
1021
703
  id: activeAccount?.id,
1022
704
  name: activeAccount?.name,
@@ -1042,9 +724,11 @@ class SlackerV3Server {
1042
724
  return converted;
1043
725
  }
1044
726
  async processExplicitMentions(text, client) {
1045
- // ONLY process @mentions - nothing else
1046
- const result = await client.users.list({});
1047
- const activeUsers = result.members?.filter(u => !u.deleted && !u.is_bot) || [];
727
+ // Fast path: no @mentions present, skip the (cached) users.list entirely.
728
+ if (!/@\w+/.test(text))
729
+ return text;
730
+ // ONLY process @mentions - nothing else (cached, paginated)
731
+ const activeUsers = await this.getAllUsersCached(client);
1048
732
  return text.replace(/@(\w+)/g, (match, username) => {
1049
733
  // Try exact match first
1050
734
  let user = activeUsers.find(u => u.name?.toLowerCase() === username.toLowerCase() ||
@@ -1072,34 +756,55 @@ class SlackerV3Server {
1072
756
  }
1073
757
  // Handle #channel-name format
1074
758
  const cleanName = channelOrUser.replace(/^#/, '');
1075
- // Try to find a channel first
1076
- const channelsResult = await client.conversations.list({
1077
- types: 'public_channel,private_channel',
1078
- limit: 1000
1079
- });
1080
- const channel = channelsResult.channels?.find(ch => ch.name?.toLowerCase() === cleanName.toLowerCase());
759
+ // Try to find a channel first (cached, fully paginated so we don't miss page 2+)
760
+ const channels = await this.getAllChannelsCached(client);
761
+ const channel = channels.find(ch => ch.name?.toLowerCase() === cleanName.toLowerCase());
1081
762
  if (channel?.id)
1082
763
  return channel.id;
1083
- // Try to find a user for DM
1084
- const usersResult = await client.users.list({});
1085
- const activeUsers = usersResult.members?.filter(u => !u.deleted && !u.is_bot) || [];
1086
- // Use fuzzy matching here for recipient resolution
764
+ // No exact channel match. Try to find a user for DM — but ONLY with high
765
+ // confidence. A loose fuzzy match here can silently DM the WRONG human on a
766
+ // channel-name typo, so we require a strong match and otherwise throw.
767
+ const activeUsers = await this.getAllUsersCached(client);
768
+ // Exact (case-insensitive) match on a user handle/name takes priority.
769
+ const exactUser = activeUsers.find(u => u.name?.toLowerCase() === cleanName.toLowerCase() ||
770
+ u.real_name?.toLowerCase() === cleanName.toLowerCase() ||
771
+ u.profile?.display_name?.toLowerCase() === cleanName.toLowerCase());
772
+ if (exactUser?.id) {
773
+ const dmResult = await client.conversations.open({ users: exactUser.id });
774
+ if (dmResult.channel?.id)
775
+ return dmResult.channel.id;
776
+ }
777
+ // Fuzzy match with a STRICT confidence floor. Fuse score is 0 (perfect) → 1 (worst);
778
+ // require score <= 0.2 (>=80% similarity) before we DM a human.
1087
779
  const fuse = new Fuse(activeUsers, {
1088
780
  keys: ['name', 'real_name', 'profile.display_name'],
1089
- threshold: 0.3, // More permissive for recipient finding
781
+ threshold: 0.2,
1090
782
  includeScore: true
1091
783
  });
1092
784
  const fuzzyResults = fuse.search(cleanName);
1093
- if (fuzzyResults.length > 0) {
785
+ const STRICT = 0.2;
786
+ if (fuzzyResults.length > 0 && fuzzyResults[0].score <= STRICT) {
1094
787
  const user = fuzzyResults[0].item;
1095
788
  if (user.id) {
1096
789
  // Open a DM channel with the user
1097
790
  const dmResult = await client.conversations.open({ users: user.id });
1098
- return dmResult.channel?.id || channelOrUser;
791
+ if (dmResult.channel?.id)
792
+ return dmResult.channel.id;
1099
793
  }
1100
794
  }
1101
- // Fallback to original input
1102
- return channelOrUser;
795
+ // No high-confidence match. Do NOT silently send to the wrong place.
796
+ const channelCandidates = channels
797
+ .map(ch => ch.name)
798
+ .filter((n) => !!n && n.toLowerCase().includes(cleanName.toLowerCase().slice(0, 3)))
799
+ .slice(0, 5);
800
+ const userCandidates = fuzzyResults.slice(0, 5).map(r => r.item.name).filter(Boolean);
801
+ const candidates = [...channelCandidates, ...userCandidates];
802
+ throw new Error(`Could not confidently resolve recipient "${channelOrUser}". ` +
803
+ `No matching channel and no high-confidence user match. ` +
804
+ (candidates.length
805
+ ? `Did you mean one of: ${candidates.join(', ')}? `
806
+ : '') +
807
+ `Pass an exact channel ID (C...), user ID (U...), or exact #channel-name.`);
1103
808
  }
1104
809
  async slackSendMessage(args) {
1105
810
  const validatedArgs = SendMessageArgsSchema.parse(args);
@@ -1110,12 +815,13 @@ class SlackerV3Server {
1110
815
  let formattedText = this.convertMarkdownToSlackMrkdwn(validatedArgs.text);
1111
816
  // Step 3: ONLY process explicit @mentions (not context patterns)
1112
817
  formattedText = await this.processExplicitMentions(formattedText, client);
1113
- // Step 4: Send the message
818
+ // Step 4: Send the message (with optional session identity override)
1114
819
  const result = await client.chat.postMessage({
1115
820
  channel: channelId,
1116
821
  text: formattedText,
1117
822
  thread_ts: validatedArgs.thread_ts,
1118
- mrkdwn: true
823
+ mrkdwn: true,
824
+ ...this.identityOverrides(args)
1119
825
  });
1120
826
  return {
1121
827
  content: [
@@ -1126,34 +832,580 @@ class SlackerV3Server {
1126
832
  ]
1127
833
  };
1128
834
  }
835
+ // Lightweight text-table alternative to the PNG slack_send_diagram path. Renders
836
+ // an aligned ASCII table inside a code block so it stays cheap (text, not an image)
837
+ // and readable. Use this for status/comparison grids that don't need to be pretty.
838
+ async slackSendTable(args) {
839
+ const validatedArgs = SendTableArgsSchema.parse(args);
840
+ const client = await this.getActiveClient();
841
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
842
+ const asCodeBlock = validatedArgs.as_code_block !== false;
843
+ const table = renderTable(validatedArgs.rows);
844
+ let text = "";
845
+ if (validatedArgs.title)
846
+ text += `*${validatedArgs.title}*\n`;
847
+ text += asCodeBlock ? "```\n" + table + "\n```" : table;
848
+ const result = await client.chat.postMessage({
849
+ channel: channelId,
850
+ text,
851
+ mrkdwn: true
852
+ });
853
+ return {
854
+ content: [
855
+ {
856
+ type: "text",
857
+ text: `Table posted. Channel: ${result.channel}, Timestamp: ${result.ts}`
858
+ }
859
+ ]
860
+ };
861
+ }
862
+ // =====================================================================================
863
+ // BLOCK KIT CARDS + THREADED TASK LIFECYCLE (Bundle 2 / 3 / 4)
864
+ // =====================================================================================
865
+ taskKey(channel, ts) {
866
+ return `${channel}:${ts}`;
867
+ }
868
+ // Build chat.postMessage identity overrides (Bundle 4). Per-call username/icon args
869
+ // win, otherwise fall back to SLACK_SESSION_USERNAME / SLACK_SESSION_ICON env vars.
870
+ // Requires the chat:write.customize bot scope; Slack ignores/errors gracefully if
871
+ // absent. icon_emoji (e.g. ":robot_face:") and icon_url are both supported.
872
+ identityOverrides(args) {
873
+ const a = (args ?? {});
874
+ const username = a.username || process.env.SLACK_SESSION_USERNAME;
875
+ const icon = a.icon_emoji || process.env.SLACK_SESSION_ICON;
876
+ const iconUrl = a.icon_url;
877
+ const out = {};
878
+ if (username)
879
+ out.username = username;
880
+ if (iconUrl)
881
+ out.icon_url = iconUrl;
882
+ else if (icon) {
883
+ // Accept either ":emoji:" or a full URL in the icon var.
884
+ if (/^https?:\/\//.test(icon))
885
+ out.icon_url = icon;
886
+ else
887
+ out.icon_emoji = icon.startsWith(":") ? icon : `:${icon}:`;
888
+ }
889
+ return out;
890
+ }
891
+ // Live reaction-status indicator (Bundle 3). Swap a status reaction on a message:
892
+ // remove the previously-applied one (if any) and add the new one. Reuses the same
893
+ // reactions API as slack_add_reaction. Slack errors (already_reacted / no_reaction)
894
+ // are swallowed so a status flip never fails the whole task call.
895
+ async swapReaction(client, channel, ts, prev, next) {
896
+ if (prev && prev !== next) {
897
+ try {
898
+ await client.reactions.remove({ channel, timestamp: ts, name: prev });
899
+ }
900
+ catch { /* no_reaction / not_reactable — ignore */ }
901
+ }
902
+ try {
903
+ await client.reactions.add({ channel, timestamp: ts, name: next });
904
+ }
905
+ catch { /* already_reacted — ignore */ }
906
+ }
907
+ async slackSendCard(args) {
908
+ const validatedArgs = SendCardArgsSchema.parse(args);
909
+ const client = await this.getActiveClient();
910
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
911
+ const card = buildCard({
912
+ header: validatedArgs.header,
913
+ sections: validatedArgs.sections,
914
+ context: validatedArgs.context,
915
+ color: validatedArgs.color
916
+ });
917
+ const result = await client.chat.postMessage({
918
+ channel: channelId,
919
+ text: validatedArgs.header, // fallback / notification text
920
+ blocks: card.blocks.length ? card.blocks : undefined,
921
+ attachments: card.attachments,
922
+ ...this.identityOverrides(args)
923
+ });
924
+ return {
925
+ content: [
926
+ { type: "text", text: `Card posted. Channel: ${result.channel}, Timestamp: ${result.ts}` }
927
+ ]
928
+ };
929
+ }
930
+ async slackStartTask(args) {
931
+ const validatedArgs = StartTaskArgsSchema.parse(args);
932
+ const client = await this.getActiveClient();
933
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
934
+ const sections = [{ text: ":hourglass_flowing_sand: *In progress*" }];
935
+ if (validatedArgs.total_steps) {
936
+ sections.push({ text: renderProgressBar(0) + ` (0/${validatedArgs.total_steps})` });
937
+ }
938
+ const card = buildCard({
939
+ header: `⏳ ${validatedArgs.title}`,
940
+ sections,
941
+ context: `Started ${new Date().toISOString()}`
942
+ });
943
+ const result = await client.chat.postMessage({
944
+ channel: channelId,
945
+ text: `⏳ ${validatedArgs.title}`,
946
+ blocks: card.blocks,
947
+ ...this.identityOverrides(args)
948
+ });
949
+ const ts = result.ts;
950
+ const resolvedChannel = result.channel || channelId;
951
+ // Add the hourglass status reaction to the parent (Bundle 3).
952
+ await this.swapReaction(client, resolvedChannel, ts, undefined, "hourglass_flowing_sand");
953
+ this.taskRegistry.set(this.taskKey(resolvedChannel, ts), {
954
+ channel: resolvedChannel,
955
+ title: validatedArgs.title,
956
+ totalSteps: validatedArgs.total_steps,
957
+ reaction: "hourglass_flowing_sand"
958
+ });
959
+ return {
960
+ content: [
961
+ { type: "text", text: JSON.stringify({ task_ts: ts, channel: resolvedChannel }) }
962
+ ]
963
+ };
964
+ }
965
+ async slackUpdateTask(args) {
966
+ const validatedArgs = UpdateTaskArgsSchema.parse(args);
967
+ const client = await this.getActiveClient();
968
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
969
+ const entry = this.taskRegistry.get(this.taskKey(channelId, validatedArgs.task_ts));
970
+ const totalSteps = validatedArgs.total_steps ?? entry?.totalSteps;
971
+ // Threaded reply with the progress message. NEVER @-mentions (routine update).
972
+ await client.chat.postMessage({
973
+ channel: channelId,
974
+ thread_ts: validatedArgs.task_ts,
975
+ text: validatedArgs.message,
976
+ ...this.identityOverrides(args)
977
+ });
978
+ // If we have step/total, re-render the parent card with a progress bar.
979
+ if (validatedArgs.step != null && totalSteps) {
980
+ const pct = Math.round((validatedArgs.step / totalSteps) * 100);
981
+ const title = entry?.title ?? "Task";
982
+ const card = buildCard({
983
+ header: `⏳ ${title}`,
984
+ sections: [
985
+ { text: ":hourglass_flowing_sand: *In progress*" },
986
+ { text: renderProgressBar(pct) + ` (${validatedArgs.step}/${totalSteps})` },
987
+ { text: `Latest: ${validatedArgs.message}` }
988
+ ],
989
+ context: `Updated ${new Date().toISOString()}`
990
+ });
991
+ try {
992
+ await client.chat.update({
993
+ channel: channelId,
994
+ ts: validatedArgs.task_ts,
995
+ text: `⏳ ${title}`,
996
+ blocks: card.blocks
997
+ });
998
+ }
999
+ catch { /* update may fail if posted under a different identity — non-fatal */ }
1000
+ }
1001
+ return {
1002
+ content: [{ type: "text", text: `Task update posted (threaded). task_ts: ${validatedArgs.task_ts}` }]
1003
+ };
1004
+ }
1005
+ async slackCompleteTask(args) {
1006
+ const validatedArgs = CompleteTaskArgsSchema.parse(args);
1007
+ const client = await this.getActiveClient();
1008
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
1009
+ const entry = this.taskRegistry.get(this.taskKey(channelId, validatedArgs.task_ts));
1010
+ const title = entry?.title ?? "Task";
1011
+ const ok = validatedArgs.status === "done";
1012
+ const icon = ok ? "✅" : "❌";
1013
+ // Build the final threaded reply. This is the ONLY task tool that may @-mention.
1014
+ let replyText = `${icon} ${validatedArgs.summary}`;
1015
+ if (validatedArgs.notify_user) {
1016
+ replyText = `<@${validatedArgs.notify_user}> ${replyText}`;
1017
+ }
1018
+ await client.chat.postMessage({
1019
+ channel: channelId,
1020
+ thread_ts: validatedArgs.task_ts,
1021
+ text: replyText,
1022
+ ...this.identityOverrides(args)
1023
+ });
1024
+ // Edit the parent into a completion summary card.
1025
+ const sections = [
1026
+ { text: ok ? ":white_check_mark: *Complete*" : ":x: *Failed*" },
1027
+ { text: validatedArgs.summary }
1028
+ ];
1029
+ if (validatedArgs.details) {
1030
+ sections.push({ fields: [{ label: "Details", value: validatedArgs.details }] });
1031
+ }
1032
+ const card = buildCard({
1033
+ header: `${icon} ${title}`,
1034
+ sections,
1035
+ context: `Completed ${new Date().toISOString()}`,
1036
+ color: ok ? "#3D8C62" : "#E8821A"
1037
+ });
1038
+ try {
1039
+ await client.chat.update({
1040
+ channel: channelId,
1041
+ ts: validatedArgs.task_ts,
1042
+ text: `${icon} ${title}`,
1043
+ blocks: card.blocks.length ? card.blocks : undefined,
1044
+ attachments: card.attachments
1045
+ });
1046
+ }
1047
+ catch { /* non-fatal */ }
1048
+ // Swap the hourglass reaction → ✅ / ❌ (Bundle 3).
1049
+ await this.swapReaction(client, channelId, validatedArgs.task_ts, entry?.reaction ?? "hourglass_flowing_sand", ok ? "white_check_mark" : "x");
1050
+ this.taskRegistry.delete(this.taskKey(channelId, validatedArgs.task_ts));
1051
+ return {
1052
+ content: [{ type: "text", text: `Task ${validatedArgs.status}. Parent card updated. task_ts: ${validatedArgs.task_ts}` }]
1053
+ };
1054
+ }
1055
+ // =====================================================================================
1056
+ // LEGATE PULL/POLLING TOOLS (multi-session shared-bot coordination)
1057
+ // -------------------------------------------------------------------------------------
1058
+ // Several Claude Code sessions ("Legates") share ONE Slack bot identity and each runs
1059
+ // a ~3-min poll loop on a shared channel (e.g. #echelon). To stay coordinated without a
1060
+ // server, each Legate persists its own little state file keyed by NATO call-sign:
1061
+ // ~/.mcp-slack/legate-state/<callSign>.json (dir 0700, file 0600)
1062
+ // { cursors: { [channelId]: lastSeenTs }, checkins: { [channelId]: { status, ts } } }
1063
+ // Keying by call-sign means 5 sessions sharing one $HOME never clobber each other.
1064
+ // =====================================================================================
1065
+ // Full NATO phonetic alphabet — the universe of known call-signs.
1066
+ static NATO_CALL_SIGNS = [
1067
+ "Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel",
1068
+ "India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa",
1069
+ "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey",
1070
+ "Xray", "Yankee", "Zulu"
1071
+ ];
1072
+ legateStateDir() {
1073
+ return path.join(os.homedir(), ".mcp-slack", "legate-state");
1074
+ }
1075
+ // Sanitize a call-sign down to a safe filename stem ([A-Za-z0-9_-]).
1076
+ sanitizeCallSign(callSign) {
1077
+ const clean = String(callSign).replace(/[^A-Za-z0-9_-]/g, "");
1078
+ if (!clean)
1079
+ throw new Error(`Invalid call_sign "${callSign}" — must contain [A-Za-z0-9_-] characters.`);
1080
+ return clean;
1081
+ }
1082
+ // Read this Legate's state. A missing file is normal (first run) → empty state.
1083
+ async loadLegateState(callSign) {
1084
+ const file = path.join(this.legateStateDir(), `${this.sanitizeCallSign(callSign)}.json`);
1085
+ try {
1086
+ const raw = await fs.readFile(file, "utf8");
1087
+ const parsed = JSON.parse(raw);
1088
+ return {
1089
+ cursors: (parsed && typeof parsed.cursors === "object" && parsed.cursors) || {},
1090
+ checkins: (parsed && typeof parsed.checkins === "object" && parsed.checkins) || {}
1091
+ };
1092
+ }
1093
+ catch {
1094
+ return { cursors: {}, checkins: {} };
1095
+ }
1096
+ }
1097
+ async saveLegateState(callSign, state) {
1098
+ const dir = this.legateStateDir();
1099
+ await fs.mkdir(dir, { recursive: true });
1100
+ try {
1101
+ await fs.chmod(dir, 0o700);
1102
+ }
1103
+ catch { /* best-effort */ }
1104
+ const file = path.join(dir, `${this.sanitizeCallSign(callSign)}.json`);
1105
+ await fs.writeFile(file, JSON.stringify(state), { mode: 0o600 });
1106
+ try {
1107
+ await fs.chmod(file, 0o600);
1108
+ }
1109
+ catch { /* best-effort */ }
1110
+ }
1111
+ // Compare two Slack ts strings (e.g. "1700000000.000100") numerically.
1112
+ tsGreater(a, b) {
1113
+ return parseFloat(a) > parseFloat(b);
1114
+ }
1115
+ // Build a case-insensitive word-boundary matcher for a single token. Slack ts are
1116
+ // dotted decimals so we hand-roll the boundary to treat letters/digits as word chars.
1117
+ mentionsToken(text, token) {
1118
+ const esc = token.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1119
+ // boundary: start/non-word before, and ":"/","/"."/whitespace/non-word/end after.
1120
+ const re = new RegExp(`(^|[^A-Za-z0-9])(?:legate\\s+|@)?${esc}(?=$|[^A-Za-z0-9])`, "i");
1121
+ return re.test(text);
1122
+ }
1123
+ // Classify a message's addressing relative to `self`. First match wins.
1124
+ classifyAddressing(text, self) {
1125
+ const t = text || "";
1126
+ const selfNorm = self.toLowerCase();
1127
+ // to_me: self call-sign as a word (optionally "Legate "/"@" prefixed, ":"/"," suffix OK).
1128
+ if (this.mentionsToken(t, self))
1129
+ return "to_me";
1130
+ // to_all: broadcast phrases / Slack here|channel.
1131
+ const lower = t.toLowerCase();
1132
+ if (/all\s+legates/.test(lower) ||
1133
+ /all\s+agents/.test(lower) ||
1134
+ /\beveryone\b/.test(lower) ||
1135
+ /<!here>/.test(t) ||
1136
+ /<!channel>/.test(t)) {
1137
+ return "to_all";
1138
+ }
1139
+ // whoever_first: open call for any available Legate.
1140
+ if (/\bwhoever\b/.test(lower) ||
1141
+ /\banyone\b/.test(lower) ||
1142
+ /first\s+come/.test(lower)) {
1143
+ return "whoever_first";
1144
+ }
1145
+ // to_other:<Name>: another known call-sign addressed (not self).
1146
+ for (const cs of SlackerV3Server.NATO_CALL_SIGNS) {
1147
+ if (cs.toLowerCase() === selfNorm)
1148
+ continue;
1149
+ if (this.mentionsToken(t, cs))
1150
+ return `to_other:${cs}`;
1151
+ }
1152
+ return "chatter";
1153
+ }
1154
+ // Heuristic: does this message look self-authored by `self`? Used to EXCLUDE a Legate's
1155
+ // own posts from its actionable set (it must not re-process what it just said).
1156
+ looksSelfAuthored(text, self) {
1157
+ const t = (text || "").trim();
1158
+ if (!t)
1159
+ return false;
1160
+ const esc = self.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1161
+ // Sign-off near the end: "— Legate <self>" (em or double-dash), tolerant of trailing punctuation.
1162
+ if (new RegExp(`(—|--)\\s*legate\\s+${esc}\\b`, "i").test(t))
1163
+ return true;
1164
+ // Leads with the call-sign as a speaker label: "<self> " / "<self>:" / "<self> ·".
1165
+ if (new RegExp(`^${esc}(:|\\s+·|\\s)`, "i").test(t))
1166
+ return true;
1167
+ // Check-in pattern this server emits: ":repeat: <self>:".
1168
+ if (new RegExp(`:repeat:\\s*${esc}:`, "i").test(t))
1169
+ return true;
1170
+ return false;
1171
+ }
1172
+ async slackPoll(args) {
1173
+ const validatedArgs = PollArgsSchema.parse(args);
1174
+ const client = await this.getActiveClient();
1175
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
1176
+ const callSign = validatedArgs.call_sign;
1177
+ const limit = validatedArgs.limit ?? 15;
1178
+ const includeChatter = validatedArgs.include_chatter ?? false;
1179
+ const state = await this.loadLegateState(callSign);
1180
+ const storedCursor = state.cursors[channelId];
1181
+ // First poll anchors to "now": with no stored cursor and no explicit `since`,
1182
+ // don't surface stale backlog. Anchor the cursor to now and start watching forward.
1183
+ if (!storedCursor && !validatedArgs.since) {
1184
+ const anchoredTs = (Date.now() / 1000).toFixed(6);
1185
+ state.cursors[channelId] = anchoredTs;
1186
+ await this.saveLegateState(callSign, state);
1187
+ return {
1188
+ content: [{
1189
+ type: "text",
1190
+ text: leanResult({
1191
+ new_count: 0,
1192
+ actionable_count: 0,
1193
+ skipped_count: 0,
1194
+ first_poll: true,
1195
+ anchored_ts: anchoredTs,
1196
+ latest_ts: anchoredTs,
1197
+ messages: []
1198
+ })
1199
+ }]
1200
+ };
1201
+ }
1202
+ // Cursor precedence: explicit `since` arg overrides the stored cursor.
1203
+ const cursor = validatedArgs.since ?? storedCursor;
1204
+ const histArgs = { channel: channelId, limit };
1205
+ if (cursor)
1206
+ histArgs.oldest = cursor;
1207
+ const result = await client.conversations.history(histArgs);
1208
+ const all = result.messages || [];
1209
+ // Only messages STRICTLY newer than the cursor (oldest= is inclusive of the cursor ts).
1210
+ const fresh = cursor ? all.filter((m) => m.ts && this.tsGreater(m.ts, cursor)) : all;
1211
+ let newestTs = cursor;
1212
+ for (const m of fresh) {
1213
+ if (m.ts && (!newestTs || this.tsGreater(m.ts, newestTs)))
1214
+ newestTs = m.ts;
1215
+ }
1216
+ const actionable = [];
1217
+ let skipped = 0;
1218
+ for (const m of fresh) {
1219
+ const text = m.text || "";
1220
+ // A Legate must never re-process its own posts.
1221
+ if (this.looksSelfAuthored(text, callSign)) {
1222
+ skipped++;
1223
+ continue;
1224
+ }
1225
+ const addressed = this.classifyAddressing(text, callSign);
1226
+ if (!includeChatter && addressed === "chatter") {
1227
+ skipped++;
1228
+ continue;
1229
+ }
1230
+ actionable.push({ ts: m.ts ?? "", user: m.user ?? "", text, addressed });
1231
+ }
1232
+ // Advance the cursor past EVERYTHING seen this poll (including skipped/chatter) so we
1233
+ // never re-scan them. Save even when nothing was actionable.
1234
+ if (newestTs) {
1235
+ state.cursors[channelId] = newestTs;
1236
+ await this.saveLegateState(callSign, state);
1237
+ }
1238
+ return {
1239
+ content: [{
1240
+ type: "text",
1241
+ text: leanResult({
1242
+ new_count: fresh.length,
1243
+ actionable_count: actionable.length,
1244
+ skipped_count: skipped,
1245
+ latest_ts: newestTs ?? null,
1246
+ messages: actionable
1247
+ })
1248
+ }]
1249
+ };
1250
+ }
1251
+ // Normalize free-text task → a stable lane key: lowercase, trimmed, non-alphanumeric
1252
+ // runs collapsed to a single "-", no leading/trailing "-".
1253
+ laneKey(task) {
1254
+ return String(task)
1255
+ .toLowerCase()
1256
+ .trim()
1257
+ .replace(/[^a-z0-9]+/g, "-")
1258
+ .replace(/^-+|-+$/g, "");
1259
+ }
1260
+ // Parse a standardized LANE CLAIM line. Returns the claiming call-sign + lane key, or null.
1261
+ parseLaneClaim(text) {
1262
+ const m = (text || "").match(/LANE CLAIM — Legate\s+([A-Za-z0-9_-]+)\s+taking:.*\[lane:([a-z0-9-]+)\]/);
1263
+ if (!m)
1264
+ return null;
1265
+ return { callSign: m[1], laneKey: m[2] };
1266
+ }
1267
+ async slackClaimLane(args) {
1268
+ const validatedArgs = ClaimLaneArgsSchema.parse(args);
1269
+ const client = await this.getActiveClient();
1270
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
1271
+ const callSign = validatedArgs.call_sign;
1272
+ const task = validatedArgs.task;
1273
+ const ttlMinutes = validatedArgs.ttl_minutes ?? 20;
1274
+ const lookback = validatedArgs.lookback ?? 30;
1275
+ const laneKey = this.laneKey(task);
1276
+ if (validatedArgs.release === true) {
1277
+ await client.chat.postMessage({
1278
+ channel: channelId,
1279
+ text: `:checkered_flag: LANE RELEASE — Legate ${callSign} released: ${task} [lane:${laneKey}]`,
1280
+ mrkdwn: true,
1281
+ ...this.identityOverrides(args)
1282
+ });
1283
+ return { content: [{ type: "text", text: leanResult({ released: true, lane_key: laneKey }) }] };
1284
+ }
1285
+ const ttlSeconds = ttlMinutes * 60;
1286
+ const nowSec = Date.now() / 1000;
1287
+ // Find the most-recent UNEXPIRED claim on this lane by ANOTHER call-sign.
1288
+ const findActiveOther = (messages, beforeTs) => {
1289
+ let hit = null;
1290
+ for (const m of messages) {
1291
+ const parsed = this.parseLaneClaim(m.text || "");
1292
+ if (!parsed || parsed.laneKey !== laneKey)
1293
+ continue;
1294
+ if (parsed.callSign === callSign)
1295
+ continue;
1296
+ const claimTs = m.ts;
1297
+ if (nowSec - parseFloat(claimTs) >= ttlSeconds)
1298
+ continue; // expired
1299
+ if (beforeTs && !this.tsGreater(beforeTs, claimTs))
1300
+ continue; // only earlier-than-mine
1301
+ if (!hit || this.tsGreater(claimTs, hit.claim_ts)) {
1302
+ hit = { claimed_by: parsed.callSign, claim_ts: claimTs };
1303
+ }
1304
+ }
1305
+ return hit;
1306
+ };
1307
+ const pre = await client.conversations.history({ channel: channelId, limit: lookback });
1308
+ const preMsgs = pre.messages || [];
1309
+ const existing = findActiveOther(preMsgs);
1310
+ if (existing) {
1311
+ // Someone else already holds this lane — don't pile on.
1312
+ return {
1313
+ content: [{
1314
+ type: "text",
1315
+ text: leanResult({ granted: false, claimed_by: existing.claimed_by, claim_ts: existing.claim_ts, lane_key: laneKey })
1316
+ }]
1317
+ };
1318
+ }
1319
+ // Post our claim and capture its ts.
1320
+ const posted = await client.chat.postMessage({
1321
+ channel: channelId,
1322
+ text: `:triangular_flag_on_post: LANE CLAIM — Legate ${callSign} taking: ${task} [lane:${laneKey}]`,
1323
+ mrkdwn: true,
1324
+ ...this.identityOverrides(args)
1325
+ });
1326
+ const myClaimTs = posted.ts;
1327
+ // Re-read once and check for any OTHER unexpired claim with ts < ours (we lost the race).
1328
+ const post = await client.conversations.history({ channel: channelId, limit: lookback });
1329
+ const earlier = findActiveOther(post.messages || [], myClaimTs);
1330
+ if (earlier) {
1331
+ return {
1332
+ content: [{
1333
+ type: "text",
1334
+ text: leanResult({ granted: false, yielded: true, claimed_by: earlier.claimed_by, claim_ts: earlier.claim_ts, my_claim_ts: myClaimTs, lane_key: laneKey })
1335
+ }]
1336
+ };
1337
+ }
1338
+ return { content: [{ type: "text", text: leanResult({ granted: true, claim_ts: myClaimTs, lane_key: laneKey }) }] };
1339
+ }
1340
+ async slackCheckin(args) {
1341
+ const validatedArgs = CheckinArgsSchema.parse(args);
1342
+ const client = await this.getActiveClient();
1343
+ const channelId = await this.resolveRecipient(validatedArgs.channel, client);
1344
+ const callSign = validatedArgs.call_sign;
1345
+ const status = validatedArgs.status;
1346
+ const force = validatedArgs.force ?? false;
1347
+ const heartbeatMinutes = validatedArgs.heartbeat_minutes ?? 0;
1348
+ const state = await this.loadLegateState(callSign);
1349
+ const prev = state.checkins[channelId];
1350
+ if (!force && prev && prev.status === status) {
1351
+ const heartbeatDue = heartbeatMinutes > 0 && (Date.now() / 1000 - parseFloat(prev.ts)) >= heartbeatMinutes * 60;
1352
+ if (!heartbeatDue) {
1353
+ return { content: [{ type: "text", text: leanResult({ posted: false, suppressed: true, reason: "unchanged" }) }] };
1354
+ }
1355
+ }
1356
+ const posted = await client.chat.postMessage({
1357
+ channel: channelId,
1358
+ text: `:repeat: ${callSign}: ${status}`,
1359
+ mrkdwn: true,
1360
+ ...this.identityOverrides(args)
1361
+ });
1362
+ const ts = posted.ts;
1363
+ state.checkins[channelId] = { status, ts };
1364
+ await this.saveLegateState(callSign, state);
1365
+ return { content: [{ type: "text", text: leanResult({ posted: true, ts }) }] };
1366
+ }
1129
1367
  async slackGetChannelHistory(args) {
1130
1368
  const validatedArgs = GetChannelHistoryArgsSchema.parse(args);
1131
1369
  const client = await this.getActiveClient();
1370
+ const limit = validatedArgs.limit || 100;
1132
1371
  const result = await client.conversations.history({
1133
1372
  channel: validatedArgs.channel,
1134
- limit: validatedArgs.limit || 100
1373
+ limit
1135
1374
  });
1136
- const messages = result.messages?.map(msg => ({
1137
- user: msg.user,
1138
- text: msg.text,
1139
- ts: msg.ts,
1140
- thread_ts: msg.thread_ts,
1141
- reply_count: msg.reply_count,
1142
- reactions: msg.reactions?.map(r => ({
1143
- name: r.name,
1144
- count: r.count,
1145
- users: r.users
1146
- }))
1147
- })) || [];
1375
+ const allMessages = result.messages || [];
1376
+ // VERBOSE: hand back the raw API payload verbatim — the firehose is one call away.
1377
+ if (validatedArgs.verbose) {
1378
+ return {
1379
+ content: [{ type: "text", text: JSON.stringify(allMessages, null, 2) }]
1380
+ };
1381
+ }
1382
+ // LEAN: keep message TEXT verbatim (never clipped), strip only the metadata
1383
+ // exhaust (reactions blobs, edited markers, block JSON, etc.). The only count
1384
+ // reduction is the item cap, which is surfaced in a footer so nothing is silently lost.
1385
+ const lean = allMessages.map(msg => ({
1386
+ user: msg.user,
1387
+ text: msg.text, // verbatim, character-for-character
1388
+ ts: msg.ts,
1389
+ ...(msg.reply_count ? { reply_count: msg.reply_count } : {})
1390
+ }));
1148
1391
  return {
1149
1392
  content: [
1150
1393
  {
1151
1394
  type: "text",
1152
- text: JSON.stringify(messages, null, 2)
1395
+ text: leanResult(lean) + this.moreFooter(lean.length, allMessages.length, limit)
1153
1396
  }
1154
1397
  ]
1155
1398
  };
1156
1399
  }
1400
+ // Trailing footer surfaced whenever a lean result capped the item count, so the
1401
+ // caller knows more data is available and how to get it. Returns "" when nothing
1402
+ // was capped.
1403
+ moreFooter(shown, total, limit) {
1404
+ if (total > shown || shown >= limit) {
1405
+ return `\n(showing ${shown}${total > shown ? ` of ${total}` : ""} — pass verbose:true or a higher limit/cursor for the rest)`;
1406
+ }
1407
+ return "";
1408
+ }
1157
1409
  async slackAddReaction(args) {
1158
1410
  const validatedArgs = AddReactionArgsSchema.parse(args);
1159
1411
  const client = await this.getActiveClient();
@@ -1174,25 +1426,38 @@ class SlackerV3Server {
1174
1426
  async slackListUsers(args) {
1175
1427
  const validatedArgs = ListUsersArgsSchema.parse(args);
1176
1428
  const client = await this.getActiveClient();
1177
- const result = await client.users.list({
1178
- limit: validatedArgs.limit || 100
1179
- });
1180
- const users = result.members?.filter(user => !user.deleted && !user.is_bot).map(user => ({
1429
+ // Fully paginated + cached so we don't under-report past page 1.
1430
+ const allUsers = await this.getAllUsersCached(client);
1431
+ const limit = validatedArgs.limit || 100;
1432
+ const slice = allUsers.slice(0, limit);
1433
+ // VERBOSE: full raw user objects for the capped slice.
1434
+ if (validatedArgs.verbose) {
1435
+ const full = slice.map(user => ({
1436
+ id: user.id,
1437
+ name: user.name,
1438
+ real_name: user.real_name,
1439
+ display_name: user.profile?.display_name,
1440
+ email: user.profile?.email,
1441
+ is_admin: user.is_admin,
1442
+ is_owner: user.is_owner,
1443
+ status_text: user.profile?.status_text,
1444
+ status_emoji: user.profile?.status_emoji
1445
+ }));
1446
+ return {
1447
+ content: [{ type: "text", text: JSON.stringify(full, null, 2) + this.moreFooter(slice.length, allUsers.length, limit) }]
1448
+ };
1449
+ }
1450
+ // LEAN: just the essential identity fields.
1451
+ const users = slice.map(user => ({
1181
1452
  id: user.id,
1182
1453
  name: user.name,
1183
- real_name: user.real_name,
1184
- display_name: user.profile?.display_name,
1185
- email: user.profile?.email,
1186
- is_admin: user.is_admin,
1187
- is_owner: user.is_owner,
1188
- status_text: user.profile?.status_text,
1189
- status_emoji: user.profile?.status_emoji
1190
- })) || [];
1454
+ real_name: user.real_name
1455
+ }));
1191
1456
  return {
1192
1457
  content: [
1193
1458
  {
1194
1459
  type: "text",
1195
- text: JSON.stringify(users, null, 2)
1460
+ text: leanResult(users) + this.moreFooter(slice.length, allUsers.length, limit)
1196
1461
  }
1197
1462
  ]
1198
1463
  };
@@ -1200,15 +1465,16 @@ class SlackerV3Server {
1200
1465
  async slackGetUserByName(args) {
1201
1466
  const validatedArgs = GetUserByNameArgsSchema.parse(args);
1202
1467
  const client = await this.getActiveClient();
1203
- const result = await client.users.list({});
1468
+ // Cached + fully paginated so we don't miss users past page 1.
1469
+ const activeMembers = await this.getAllUsersCached(client);
1204
1470
  const searchTerm = validatedArgs.name.toLowerCase();
1205
- // First try exact match
1206
- let user = result.members?.find(u => !u.deleted && (u.name?.toLowerCase().includes(searchTerm) ||
1471
+ // First try (substring) match
1472
+ let user = activeMembers.find(u => u.name?.toLowerCase().includes(searchTerm) ||
1207
1473
  u.real_name?.toLowerCase().includes(searchTerm) ||
1208
- u.profile?.display_name?.toLowerCase().includes(searchTerm)));
1209
- // If no exact match, use fuzzy matching
1474
+ u.profile?.display_name?.toLowerCase().includes(searchTerm));
1475
+ // If no match, use fuzzy matching
1210
1476
  if (!user) {
1211
- const activeUsers = result.members?.filter(u => !u.deleted && !u.is_bot) || [];
1477
+ const activeUsers = activeMembers;
1212
1478
  // Prepare data for fuzzy search
1213
1479
  const searchableUsers = activeUsers.map(u => ({
1214
1480
  ...u,
@@ -1325,27 +1591,39 @@ class SlackerV3Server {
1325
1591
  count: validatedArgs.count || 20,
1326
1592
  page: validatedArgs.page || 1
1327
1593
  });
1328
- const messages = result.messages?.matches?.map(msg => ({
1594
+ // VERBOSE: raw search payload.
1595
+ if (validatedArgs.verbose) {
1596
+ return {
1597
+ content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
1598
+ };
1599
+ }
1600
+ // LEAN: verbatim text + essential locator fields. Text is never clipped.
1601
+ const matches = result.messages?.matches || [];
1602
+ const messages = matches.map(msg => ({
1329
1603
  text: msg.text,
1330
1604
  user: msg.user,
1331
1605
  channel: msg.channel?.name,
1332
1606
  channel_id: msg.channel?.id,
1333
- timestamp: msg.ts,
1607
+ ts: msg.ts,
1334
1608
  permalink: msg.permalink
1335
- })) || [];
1609
+ }));
1610
+ const total = result.messages?.total || matches.length;
1336
1611
  return {
1337
1612
  content: [
1338
1613
  {
1339
1614
  type: "text",
1340
- text: JSON.stringify({
1341
- total: result.messages?.total || 0,
1342
- pagination: result.messages?.pagination,
1343
- messages: messages
1344
- }, null, 2)
1615
+ text: leanResult(messages) + this.searchFooter(messages.length, total)
1345
1616
  }
1346
1617
  ]
1347
1618
  };
1348
1619
  }
1620
+ // Footer for search tools where `total` is Slack's reported match total.
1621
+ searchFooter(shown, total) {
1622
+ if (total > shown) {
1623
+ return `\n(showing ${shown} of ${total} — pass verbose:true or a higher count/page for more)`;
1624
+ }
1625
+ return "";
1626
+ }
1349
1627
  async slackSearchByUser(args) {
1350
1628
  const validatedArgs = SearchByUserArgsSchema.parse(args);
1351
1629
  const client = await this.getActiveUserClient();
@@ -1357,21 +1635,25 @@ class SlackerV3Server {
1357
1635
  query: query,
1358
1636
  count: validatedArgs.count || 20
1359
1637
  });
1360
- const messages = result.messages?.matches?.map(msg => ({
1638
+ if (validatedArgs.verbose) {
1639
+ return {
1640
+ content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
1641
+ };
1642
+ }
1643
+ const matches = result.messages?.matches || [];
1644
+ const messages = matches.map(msg => ({
1361
1645
  text: msg.text,
1362
1646
  channel: msg.channel?.name,
1363
1647
  channel_id: msg.channel?.id,
1364
- timestamp: msg.ts,
1648
+ ts: msg.ts,
1365
1649
  permalink: msg.permalink
1366
- })) || [];
1650
+ }));
1651
+ const total = result.messages?.total || matches.length;
1367
1652
  return {
1368
1653
  content: [
1369
1654
  {
1370
1655
  type: "text",
1371
- text: JSON.stringify({
1372
- total: result.messages?.total || 0,
1373
- messages: messages
1374
- }, null, 2)
1656
+ text: leanResult(messages) + this.searchFooter(messages.length, total)
1375
1657
  }
1376
1658
  ]
1377
1659
  };
@@ -1387,26 +1669,27 @@ class SlackerV3Server {
1387
1669
  query: query,
1388
1670
  count: validatedArgs.count || 20
1389
1671
  });
1390
- const messages = result.messages?.matches?.map(msg => ({
1672
+ if (validatedArgs.verbose) {
1673
+ return {
1674
+ content: [{ type: "text", text: JSON.stringify(result.messages, null, 2) }]
1675
+ };
1676
+ }
1677
+ const matches = result.messages?.matches || [];
1678
+ const messages = matches.map(msg => ({
1391
1679
  text: msg.text,
1392
1680
  user: msg.user,
1393
1681
  channel: msg.channel?.name,
1394
1682
  channel_id: msg.channel?.id,
1395
- timestamp: msg.ts,
1683
+ ts: msg.ts,
1396
1684
  permalink: msg.permalink
1397
- })) || [];
1685
+ }));
1686
+ const total = result.messages?.total || matches.length;
1398
1687
  return {
1399
1688
  content: [
1400
1689
  {
1401
1690
  type: "text",
1402
- text: JSON.stringify({
1403
- total: result.messages?.total || 0,
1404
- date_range: {
1405
- from: validatedArgs.from_date,
1406
- to: validatedArgs.to_date
1407
- },
1408
- messages: messages
1409
- }, null, 2)
1691
+ text: `${validatedArgs.from_date}..${validatedArgs.to_date}\n` +
1692
+ leanResult(messages) + this.searchFooter(messages.length, total)
1410
1693
  }
1411
1694
  ]
1412
1695
  };
@@ -1589,7 +1872,8 @@ class SlackerV3Server {
1589
1872
  const result = await client.chat.postMessage({
1590
1873
  channel: validatedArgs.channel,
1591
1874
  blocks: validatedArgs.blocks,
1592
- text: validatedArgs.text || "Formatted message"
1875
+ text: validatedArgs.text || "Formatted message",
1876
+ ...this.identityOverrides(args)
1593
1877
  });
1594
1878
  return {
1595
1879
  content: [
@@ -1707,23 +1991,43 @@ class SlackerV3Server {
1707
1991
  async slackBulkForwardMessages(args) {
1708
1992
  const validatedArgs = BulkForwardMessagesArgsSchema.parse(args);
1709
1993
  const client = await this.getActiveClient();
1710
- // Get all messages
1711
- const messages = [];
1712
- for (const timestamp of validatedArgs.timestamps) {
1713
- const history = await client.conversations.history({
1714
- channel: validatedArgs.source_channel,
1715
- latest: timestamp,
1716
- limit: 1,
1717
- inclusive: true
1718
- });
1719
- if (history.messages?.[0]) {
1720
- messages.push(history.messages[0]);
1721
- }
1722
- }
1994
+ // Fetch all source messages in parallel (was a serial N+1 loop).
1995
+ const histories = await Promise.all(validatedArgs.timestamps.map(timestamp => client.conversations.history({
1996
+ channel: validatedArgs.source_channel,
1997
+ latest: timestamp,
1998
+ limit: 1,
1999
+ inclusive: true
2000
+ }).then(h => h.messages?.[0]).catch(() => undefined)));
2001
+ const messages = histories.filter((m) => !!m);
1723
2002
  if (messages.length === 0) {
1724
2003
  throw new Error("No messages found to forward");
1725
2004
  }
1726
- // Forward to each target channel
2005
+ // Resolve each distinct user ID exactly once (was resolved per-message-per-target).
2006
+ const userIds = new Set();
2007
+ for (const msg of messages) {
2008
+ if (msg.user)
2009
+ userIds.add(msg.user);
2010
+ }
2011
+ const userNames = new Map();
2012
+ await Promise.all(Array.from(userIds).map(async (uid) => {
2013
+ try {
2014
+ const userInfo = await client.users.info({ user: uid });
2015
+ userNames.set(uid, userInfo.user?.real_name || userInfo.user?.name || "Unknown User");
2016
+ }
2017
+ catch {
2018
+ userNames.set(uid, "Unknown User");
2019
+ }
2020
+ }));
2021
+ // Build the combined message body once from the resolved name map.
2022
+ let body = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
2023
+ if (validatedArgs.comment) {
2024
+ body = `${validatedArgs.comment}\n\n${body}`;
2025
+ }
2026
+ for (const msg of messages) {
2027
+ const userName = (msg.user && userNames.get(msg.user)) || "Unknown User";
2028
+ body += `>>> *${userName}*: ${msg.text}\n\n`;
2029
+ }
2030
+ // Forward to each target channel.
1727
2031
  const results = {
1728
2032
  successful: 0,
1729
2033
  failed: 0,
@@ -1731,27 +2035,9 @@ class SlackerV3Server {
1731
2035
  };
1732
2036
  for (const targetChannel of validatedArgs.target_channels) {
1733
2037
  try {
1734
- // Combine all messages into one
1735
- let combinedText = `Forwarded ${messages.length} messages from <#${validatedArgs.source_channel}>:\n\n`;
1736
- if (validatedArgs.comment) {
1737
- combinedText = `${validatedArgs.comment}\n\n${combinedText}`;
1738
- }
1739
- for (const msg of messages) {
1740
- let userName = "Unknown User";
1741
- if (msg.user) {
1742
- try {
1743
- const userInfo = await client.users.info({ user: msg.user });
1744
- userName = userInfo.user?.real_name || userInfo.user?.name || "Unknown User";
1745
- }
1746
- catch {
1747
- // Ignore user lookup errors
1748
- }
1749
- }
1750
- combinedText += `>>> *${userName}*: ${msg.text}\n\n`;
1751
- }
1752
2038
  await client.chat.postMessage({
1753
2039
  channel: targetChannel,
1754
- text: combinedText
2040
+ text: body
1755
2041
  });
1756
2042
  results.successful++;
1757
2043
  }
@@ -1802,37 +2088,36 @@ class SlackerV3Server {
1802
2088
  ]
1803
2089
  };
1804
2090
  }
1805
- async slackGetWorkspaceStats() {
2091
+ async slackGetWorkspaceStats(args) {
2092
+ const validatedArgs = GetWorkspaceStatsArgsSchema.parse(args ?? {});
1806
2093
  const client = await this.getActiveClient();
1807
2094
  // Get team info
1808
2095
  const teamInfo = await client.team.info();
1809
- // Get user count
1810
- const users = await client.users.list({});
1811
- const activeUsers = users.members?.filter(u => !u.deleted && !u.is_bot) || [];
1812
- // Get channel count
1813
- const channels = await client.conversations.list({
1814
- types: "public_channel,private_channel"
1815
- });
1816
- return {
1817
- content: [
1818
- {
1819
- type: "text",
1820
- text: JSON.stringify({
1821
- team: {
1822
- name: teamInfo.team?.name,
1823
- domain: teamInfo.team?.domain,
1824
- email_domain: teamInfo.team?.email_domain
1825
- },
1826
- stats: {
1827
- total_users: activeUsers.length,
1828
- total_channels: channels.channels?.length || 0,
1829
- admins: activeUsers.filter(u => u.is_admin).length,
1830
- owners: activeUsers.filter(u => u.is_owner).length
1831
- }
1832
- }, null, 2)
1833
- }
1834
- ]
2096
+ // Get user count (fully paginated + cached so we don't under-report)
2097
+ const activeUsers = await this.getAllUsersCached(client);
2098
+ // Get channel count (fully paginated + cached)
2099
+ const channels = await this.getAllChannelsCached(client);
2100
+ const stats = {
2101
+ team: {
2102
+ name: teamInfo.team?.name,
2103
+ domain: teamInfo.team?.domain,
2104
+ email_domain: teamInfo.team?.email_domain
2105
+ },
2106
+ stats: {
2107
+ total_users: activeUsers.length,
2108
+ total_channels: channels.length || 0,
2109
+ admins: activeUsers.filter(u => u.is_admin).length,
2110
+ owners: activeUsers.filter(u => u.is_owner).length
2111
+ }
1835
2112
  };
2113
+ if (validatedArgs.verbose) {
2114
+ return { content: [{ type: "text", text: JSON.stringify(stats, null, 2) }] };
2115
+ }
2116
+ // LEAN: one-line human-readable summary.
2117
+ const text = `${stats.team.name} (${stats.team.domain}) — ` +
2118
+ `${stats.stats.total_users} users, ${stats.stats.total_channels} channels, ` +
2119
+ `${stats.stats.admins} admins, ${stats.stats.owners} owners`;
2120
+ return { content: [{ type: "text", text }] };
1836
2121
  }
1837
2122
  // =====================================================================================
1838
2123
  // FILE UPLOAD AND DIAGRAM TOOLS
@@ -1890,12 +2175,21 @@ class SlackerV3Server {
1890
2175
  // Build the HTML to render
1891
2176
  let htmlContent;
1892
2177
  if (diagramType === "mermaid") {
2178
+ // HTML-escape the diagram source so it cannot break out of the <pre> and
2179
+ // inject arbitrary markup/scripts (prompt-injection hardening).
2180
+ const escaped = validatedArgs.diagram_content
2181
+ .replace(/&/g, "&amp;")
2182
+ .replace(/</g, "&lt;")
2183
+ .replace(/>/g, "&gt;");
2184
+ // Prefer a locally-bundled mermaid copy if one is installed; otherwise fall
2185
+ // back to the single allow-listed CDN URL (see renderHtmlToPng request
2186
+ // interception, which blocks every other network request).
1893
2187
  htmlContent = `<!DOCTYPE html>
1894
2188
  <html><head>
1895
2189
  <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
1896
2190
  <style>body { margin: 0; padding: 20px; background: white; }</style>
1897
2191
  </head><body>
1898
- <pre class="mermaid">${validatedArgs.diagram_content}</pre>
2192
+ <pre class="mermaid">${escaped}</pre>
1899
2193
  <script>mermaid.initialize({ startOnLoad: true, theme: 'default' });</script>
1900
2194
  </body></html>`;
1901
2195
  }
@@ -1914,14 +2208,13 @@ ${validatedArgs.diagram_content}
1914
2208
  </body></html>`;
1915
2209
  }
1916
2210
  }
1917
- // Create temp files
2211
+ // Create temp output path with an unpredictable name to avoid collision /
2212
+ // symlink races (was `slack-diagram-${Date.now()}`).
1918
2213
  const tempDir = tmpdir();
1919
- const tempHtmlPath = path.join(tempDir, `slack-diagram-${Date.now()}.html`);
1920
- const tempPngPath = path.join(tempDir, `slack-diagram-${Date.now()}.png`);
2214
+ const tempPngPath = path.join(tempDir, `slack-diagram-${crypto.randomUUID()}.png`);
1921
2215
  try {
1922
- await fs.writeFile(tempHtmlPath, htmlContent);
1923
- // Try to find an available browser for rendering
1924
- await this.renderHtmlToPng(tempHtmlPath, tempPngPath);
2216
+ // Render directly from the HTML string (no file:// navigation, no temp HTML file).
2217
+ await this.renderHtmlToPng(htmlContent, tempPngPath);
1925
2218
  // Upload the rendered PNG using slackUploadFile
1926
2219
  const uploadResult = await this.slackUploadFile({
1927
2220
  channel: validatedArgs.channel,
@@ -1932,24 +2225,81 @@ ${validatedArgs.diagram_content}
1932
2225
  return uploadResult;
1933
2226
  }
1934
2227
  finally {
1935
- // Cleanup temp files
1936
- await fs.unlink(tempHtmlPath).catch(() => { });
2228
+ // Cleanup temp file
1937
2229
  await fs.unlink(tempPngPath).catch(() => { });
1938
2230
  }
1939
2231
  }
1940
- async renderHtmlToPng(htmlPath, pngPath) {
1941
- // Strategy 1: Try Puppeteer (if installed)
2232
+ // Lazily launch (and keep warm) a singleton Puppeteer browser.
2233
+ async getBrowser() {
2234
+ if (this.browser) {
2235
+ // Bump the idle timer on each use.
2236
+ this.scheduleBrowserIdleClose();
2237
+ return this.browser;
2238
+ }
2239
+ const puppeteerModule = "puppeteer";
2240
+ const puppeteer = await import(/* webpackIgnore: true */ puppeteerModule);
2241
+ // NOTE on sandbox flags: a true browser sandbox is preferred for security.
2242
+ // We intentionally do NOT pass --no-sandbox / --disable-setuid-sandbox here.
2243
+ // Combined with full request interception (below), the renderer cannot reach
2244
+ // the network or local filesystem regardless. If a specific CI/container env
2245
+ // truly requires --no-sandbox to launch Chromium, add it here with a comment.
2246
+ this.browser = await puppeteer.default.launch({ headless: true });
2247
+ this.scheduleBrowserIdleClose();
2248
+ return this.browser;
2249
+ }
2250
+ scheduleBrowserIdleClose() {
2251
+ if (this.browserIdleTimer)
2252
+ clearTimeout(this.browserIdleTimer);
2253
+ this.browserIdleTimer = setTimeout(() => {
2254
+ this.closeBrowser().catch(() => { });
2255
+ }, this.BROWSER_IDLE_MS);
2256
+ // Don't keep the process alive just for the idle timer.
2257
+ if (typeof this.browserIdleTimer.unref === "function")
2258
+ this.browserIdleTimer.unref();
2259
+ }
2260
+ async closeBrowser() {
2261
+ if (this.browserIdleTimer) {
2262
+ clearTimeout(this.browserIdleTimer);
2263
+ this.browserIdleTimer = null;
2264
+ }
2265
+ if (this.browser) {
2266
+ const b = this.browser;
2267
+ this.browser = null;
2268
+ try {
2269
+ await b.close();
2270
+ }
2271
+ catch {
2272
+ // ignore
2273
+ }
2274
+ }
2275
+ }
2276
+ async renderHtmlToPng(htmlContent, pngPath) {
2277
+ // Strategy 1: Puppeteer singleton with a locked-down sandbox.
1942
2278
  try {
1943
- const puppeteerModule = "puppeteer";
1944
- const puppeteer = await import(/* webpackIgnore: true */ puppeteerModule);
1945
- const browser = await puppeteer.default.launch({
1946
- headless: true,
1947
- args: ["--no-sandbox", "--disable-setuid-sandbox"]
1948
- });
2279
+ const browser = await this.getBrowser();
2280
+ const page = await browser.newPage();
1949
2281
  try {
1950
- const page = await browser.newPage();
1951
2282
  await page.setViewport({ width: 1200, height: 800 });
1952
- await page.goto(`file://${htmlPath}`, { waitUntil: "networkidle0", timeout: 30000 });
2283
+ // SECURITY: block ALL network + filesystem fetches during render. The only
2284
+ // exception is the allow-listed Mermaid CDN script (mermaid is not bundled
2285
+ // in node_modules). data: and about:blank are always allowed. Everything
2286
+ // else — file://, arbitrary http(s), etc. — is aborted. This neutralises
2287
+ // local-file exfiltration via prompt-injected diagram_content.
2288
+ await page.setRequestInterception(true);
2289
+ page.on("request", (req) => {
2290
+ const url = req.url();
2291
+ const allowed = url.startsWith("data:") ||
2292
+ url === "about:blank" ||
2293
+ url.startsWith("https://cdn.jsdelivr.net/npm/mermaid@");
2294
+ if (allowed) {
2295
+ req.continue();
2296
+ }
2297
+ else {
2298
+ req.abort();
2299
+ }
2300
+ });
2301
+ // Render from setContent (about:blank origin) — no same-origin file access.
2302
+ await page.setContent(htmlContent, { waitUntil: "networkidle0", timeout: 30000 });
1953
2303
  // Auto-size: get the actual content dimensions
1954
2304
  const dimensions = await page.evaluate(() => {
1955
2305
  const body = document.body;
@@ -1962,21 +2312,35 @@ ${validatedArgs.diagram_content}
1962
2312
  await page.screenshot({ path: pngPath, fullPage: true });
1963
2313
  }
1964
2314
  finally {
1965
- await browser.close();
2315
+ // Only close the page — keep the browser warm for reuse.
2316
+ await page.close().catch(() => { });
1966
2317
  }
2318
+ this.scheduleBrowserIdleClose();
1967
2319
  return;
1968
2320
  }
1969
- catch {
1970
- // Puppeteer not available, try next strategy
2321
+ catch (err) {
2322
+ // If the singleton browser is in a bad state, drop it so the next call relaunches.
2323
+ await this.closeBrowser().catch(() => { });
2324
+ // Fall through to other strategies.
1971
2325
  }
1972
- // Strategy 2: Try Playwright (if installed)
2326
+ // Strategy 2: Try Playwright (if installed). Same sandboxing: route blocking + setContent.
1973
2327
  try {
1974
2328
  const playwrightModule = "playwright";
1975
2329
  const playwright = await import(/* webpackIgnore: true */ playwrightModule);
1976
2330
  const browser = await playwright.chromium.launch({ headless: true });
1977
2331
  try {
1978
2332
  const page = await browser.newPage({ viewport: { width: 1200, height: 800 } });
1979
- await page.goto(`file://${htmlPath}`, { waitUntil: "networkidle", timeout: 30000 });
2333
+ await page.route("**/*", (route) => {
2334
+ const url = route.request().url();
2335
+ const allowed = url.startsWith("data:") ||
2336
+ url === "about:blank" ||
2337
+ url.startsWith("https://cdn.jsdelivr.net/npm/mermaid@");
2338
+ if (allowed)
2339
+ route.continue();
2340
+ else
2341
+ route.abort();
2342
+ });
2343
+ await page.setContent(htmlContent, { waitUntil: "networkidle", timeout: 30000 });
1980
2344
  await page.screenshot({ path: pngPath, fullPage: true });
1981
2345
  }
1982
2346
  finally {
@@ -1987,12 +2351,16 @@ ${validatedArgs.diagram_content}
1987
2351
  catch {
1988
2352
  // Playwright not available, try next strategy
1989
2353
  }
1990
- // Strategy 3: Try wkhtmltoimage (CLI tool)
2354
+ // Strategy 3: Try wkhtmltoimage (CLI tool). Needs a file path, so write a
2355
+ // temp HTML file with an unpredictable name and clean it up afterward.
2356
+ const tempHtmlPath = path.join(tmpdir(), `slack-diagram-${crypto.randomUUID()}.html`);
1991
2357
  try {
2358
+ await fs.writeFile(tempHtmlPath, htmlContent);
2359
+ await fs.chmod(tempHtmlPath, 0o600).catch(() => { });
1992
2360
  await execFileAsync("wkhtmltoimage", [
1993
2361
  "--width", "1200",
1994
2362
  "--quality", "90",
1995
- htmlPath,
2363
+ tempHtmlPath,
1996
2364
  pngPath
1997
2365
  ]);
1998
2366
  return;
@@ -2000,6 +2368,9 @@ ${validatedArgs.diagram_content}
2000
2368
  catch {
2001
2369
  // wkhtmltoimage not available
2002
2370
  }
2371
+ finally {
2372
+ await fs.unlink(tempHtmlPath).catch(() => { });
2373
+ }
2003
2374
  throw new Error("No rendering engine available. Install one of: puppeteer (npm i puppeteer), playwright (npm i playwright), or wkhtmltoimage (brew install wkhtmltopdf). " +
2004
2375
  "Puppeteer is recommended: run 'npm install puppeteer' in the mcp-slack directory.");
2005
2376
  }
@@ -2009,117 +2380,27 @@ ${validatedArgs.diagram_content}
2009
2380
  setupHandlers() {
2010
2381
  this.server.setRequestHandler(ListToolsRequestSchema, async () => {
2011
2382
  const tools = [
2012
- // Account Management Tools
2013
- {
2014
- name: "list_accounts",
2015
- description: "List all configured Slack accounts with their status",
2016
- inputSchema: {
2017
- type: "object",
2018
- properties: {}
2019
- }
2020
- },
2021
- {
2022
- name: "switch_account",
2023
- description: "Switch to a different Slack workspace",
2024
- inputSchema: {
2025
- type: "object",
2026
- properties: {
2027
- account_id: {
2028
- type: "string",
2029
- description: "Account ID to switch to"
2030
- }
2031
- },
2032
- required: ["account_id"]
2033
- }
2034
- },
2035
- {
2036
- name: "add_account",
2037
- description: "Add a new Slack workspace configuration",
2038
- inputSchema: {
2039
- type: "object",
2040
- properties: {
2041
- name: {
2042
- type: "string",
2043
- description: "Human-friendly name for this account"
2044
- },
2045
- bot_token: {
2046
- type: "string",
2047
- description: "Bot User OAuth Token (starts with xoxb-)"
2048
- },
2049
- user_token: {
2050
- type: "string",
2051
- description: "User OAuth Token (starts with xoxp-) - optional"
2052
- },
2053
- team_id: {
2054
- type: "string",
2055
- description: "Slack team ID"
2056
- }
2057
- },
2058
- required: ["name", "bot_token", "team_id"]
2059
- }
2060
- },
2061
- {
2062
- name: "remove_account",
2063
- description: "Remove a Slack workspace configuration",
2064
- inputSchema: {
2065
- type: "object",
2066
- properties: {
2067
- account_id: {
2068
- type: "string",
2069
- description: "Account ID to remove"
2070
- }
2071
- },
2072
- required: ["account_id"]
2073
- }
2074
- },
2383
+ // Account Tools (read-only — single account loaded from env)
2075
2384
  {
2076
2385
  name: "get_active_account",
2077
- description: "Get details of the currently active account",
2386
+ description: "Show which Slack workspace this server is wired to (workspace name, team ID, display name). No secrets. Tokens are configured via the SLACK_BOT_TOKEN env var in this server's MCP config entry.",
2078
2387
  inputSchema: {
2079
2388
  type: "object",
2080
2389
  properties: {}
2081
2390
  }
2082
2391
  },
2083
2392
  {
2084
- name: "set_default_account",
2085
- description: "Set an account as the default for new sessions",
2086
- inputSchema: {
2087
- type: "object",
2088
- properties: {
2089
- account_id: {
2090
- type: "string",
2091
- description: "Account ID to set as default"
2092
- }
2093
- },
2094
- required: ["account_id"]
2095
- }
2096
- },
2097
- {
2098
- name: "update_account",
2099
- description: "Update account credentials (e.g. for token rotation)",
2393
+ name: "list_accounts",
2394
+ description: "List the active Slack account (single-account server). For a second workspace, add a second MCP server entry with its own SLACK_BOT_TOKEN env block.",
2100
2395
  inputSchema: {
2101
2396
  type: "object",
2102
- properties: {
2103
- account_id: {
2104
- type: "string",
2105
- description: "Account ID to update"
2106
- },
2107
- bot_token: {
2108
- type: "string",
2109
- description: "New Bot User OAuth Token (starts with xoxb-)"
2110
- },
2111
- user_token: {
2112
- type: "string",
2113
- description: "New User OAuth Token (starts with xoxp-)"
2114
- }
2115
- },
2116
- required: ["account_id"]
2397
+ properties: {}
2117
2398
  }
2118
2399
  },
2119
- // Original Slack Tools (same as v1, but now account-aware)
2400
+ // Original Slack Tools
2120
2401
  {
2121
2402
  name: "slack_list_channels",
2122
- description: "List all accessible Slack channels",
2403
+ description: "List accessible Slack channels. Returns LEAN output by default (id + name + is_private + num_members). Pass verbose:true for topic/purpose/membership detail.",
2123
2404
  inputSchema: {
2124
2405
  type: "object",
2125
2406
  properties: {
@@ -2130,6 +2411,10 @@ ${validatedArgs.diagram_content}
2130
2411
  limit: {
2131
2412
  type: "number",
2132
2413
  description: "Maximum number of channels to return (default: 100)"
2414
+ },
2415
+ verbose: {
2416
+ type: "boolean",
2417
+ description: "Return full channel objects instead of lean output (default false)"
2133
2418
  }
2134
2419
  }
2135
2420
  }
@@ -2151,6 +2436,18 @@ ${validatedArgs.diagram_content}
2151
2436
  thread_ts: {
2152
2437
  type: "string",
2153
2438
  description: "Timestamp of the parent message to reply in thread"
2439
+ },
2440
+ username: {
2441
+ type: "string",
2442
+ description: "Post under this display name (requires chat:write.customize scope; falls back to SLACK_SESSION_USERNAME)"
2443
+ },
2444
+ icon_emoji: {
2445
+ type: "string",
2446
+ description: "Icon emoji like ':robot_face:' (requires chat:write.customize; falls back to SLACK_SESSION_ICON)"
2447
+ },
2448
+ icon_url: {
2449
+ type: "string",
2450
+ description: "Icon image URL (overrides icon_emoji; requires chat:write.customize)"
2154
2451
  }
2155
2452
  },
2156
2453
  required: ["channel", "text"]
@@ -2158,7 +2455,7 @@ ${validatedArgs.diagram_content}
2158
2455
  },
2159
2456
  {
2160
2457
  name: "slack_get_channel_history",
2161
- description: "Get recent messages from a Slack channel",
2458
+ description: "Get recent messages from a Slack channel. Returns LEAN output by default (verbatim message text + user + ts, with metadata exhaust stripped) to keep context cost low. Pass verbose:true for the full raw API payload.",
2162
2459
  inputSchema: {
2163
2460
  type: "object",
2164
2461
  properties: {
@@ -2169,6 +2466,10 @@ ${validatedArgs.diagram_content}
2169
2466
  limit: {
2170
2467
  type: "number",
2171
2468
  description: "Number of messages to return (default: 100)"
2469
+ },
2470
+ verbose: {
2471
+ type: "boolean",
2472
+ description: "Return the full raw API payload instead of lean output (default false)"
2172
2473
  }
2173
2474
  },
2174
2475
  required: ["channel"]
@@ -2198,13 +2499,17 @@ ${validatedArgs.diagram_content}
2198
2499
  },
2199
2500
  {
2200
2501
  name: "slack_list_users",
2201
- description: "List all users in the workspace",
2502
+ description: "List users in the workspace. Returns LEAN output by default (id + name + real_name). Pass verbose:true for full user objects (email, admin flags, status).",
2202
2503
  inputSchema: {
2203
2504
  type: "object",
2204
2505
  properties: {
2205
2506
  limit: {
2206
2507
  type: "number",
2207
2508
  description: "Maximum number of users to return (default: 100)"
2509
+ },
2510
+ verbose: {
2511
+ type: "boolean",
2512
+ description: "Return full user objects instead of lean output (default false)"
2208
2513
  }
2209
2514
  }
2210
2515
  }
@@ -2261,7 +2566,7 @@ ${validatedArgs.diagram_content}
2261
2566
  },
2262
2567
  {
2263
2568
  name: "slack_search_messages",
2264
- description: "Search for messages across the workspace",
2569
+ description: "Search for messages across the workspace. Returns LEAN output by default (verbatim text + user + channel + ts + permalink). Pass verbose:true for the raw search payload.",
2265
2570
  inputSchema: {
2266
2571
  type: "object",
2267
2572
  properties: {
@@ -2276,6 +2581,10 @@ ${validatedArgs.diagram_content}
2276
2581
  page: {
2277
2582
  type: "number",
2278
2583
  description: "Page number of results (default: 1)"
2584
+ },
2585
+ verbose: {
2586
+ type: "boolean",
2587
+ description: "Return the raw search payload instead of lean output (default false)"
2279
2588
  }
2280
2589
  },
2281
2590
  required: ["query"]
@@ -2283,7 +2592,7 @@ ${validatedArgs.diagram_content}
2283
2592
  },
2284
2593
  {
2285
2594
  name: "slack_search_by_user",
2286
- description: "Search for messages from a specific user",
2595
+ description: "Search for messages from a specific user. Returns LEAN output by default (verbatim text + channel + ts + permalink). Pass verbose:true for the raw search payload.",
2287
2596
  inputSchema: {
2288
2597
  type: "object",
2289
2598
  properties: {
@@ -2298,6 +2607,10 @@ ${validatedArgs.diagram_content}
2298
2607
  count: {
2299
2608
  type: "number",
2300
2609
  description: "Number of results to return (default: 20)"
2610
+ },
2611
+ verbose: {
2612
+ type: "boolean",
2613
+ description: "Return the raw search payload instead of lean output (default false)"
2301
2614
  }
2302
2615
  },
2303
2616
  required: ["user_id"]
@@ -2305,7 +2618,7 @@ ${validatedArgs.diagram_content}
2305
2618
  },
2306
2619
  {
2307
2620
  name: "slack_search_by_date_range",
2308
- description: "Search for messages within a date range",
2621
+ description: "Search for messages within a date range. Returns LEAN output by default (verbatim text + user + channel + ts + permalink). Pass verbose:true for the raw search payload.",
2309
2622
  inputSchema: {
2310
2623
  type: "object",
2311
2624
  properties: {
@@ -2324,6 +2637,10 @@ ${validatedArgs.diagram_content}
2324
2637
  count: {
2325
2638
  type: "number",
2326
2639
  description: "Number of results to return (default: 20)"
2640
+ },
2641
+ verbose: {
2642
+ type: "boolean",
2643
+ description: "Return the raw search payload instead of lean output (default false)"
2327
2644
  }
2328
2645
  },
2329
2646
  required: ["from_date", "to_date"]
@@ -2331,10 +2648,15 @@ ${validatedArgs.diagram_content}
2331
2648
  },
2332
2649
  {
2333
2650
  name: "slack_get_workspace_stats",
2334
- description: "Get workspace analytics and statistics",
2651
+ description: "Get workspace analytics and statistics. Returns a LEAN one-line summary by default; pass verbose:true for the structured payload.",
2335
2652
  inputSchema: {
2336
2653
  type: "object",
2337
- properties: {}
2654
+ properties: {
2655
+ verbose: {
2656
+ type: "boolean",
2657
+ description: "Return the structured stats payload instead of the lean summary (default false)"
2658
+ }
2659
+ }
2338
2660
  }
2339
2661
  },
2340
2662
  {
@@ -2514,6 +2836,18 @@ ${validatedArgs.diagram_content}
2514
2836
  text: {
2515
2837
  type: "string",
2516
2838
  description: "Fallback text"
2839
+ },
2840
+ username: {
2841
+ type: "string",
2842
+ description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)"
2843
+ },
2844
+ icon_emoji: {
2845
+ type: "string",
2846
+ description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)"
2847
+ },
2848
+ icon_url: {
2849
+ type: "string",
2850
+ description: "Icon image URL (requires chat:write.customize)"
2517
2851
  }
2518
2852
  },
2519
2853
  required: ["channel", "blocks"]
@@ -2698,7 +3032,170 @@ ${validatedArgs.diagram_content}
2698
3032
  },
2699
3033
  required: ["channel", "diagram_content"]
2700
3034
  }
2701
- }
3035
+ },
3036
+ {
3037
+ name: "slack_send_table",
3038
+ description: "Post a column-aligned ASCII table to a channel inside a code block. Lightweight TEXT alternative to slack_send_diagram's PNG path — use it for status grids, comparison matrices, and metrics that don't need to be a polished image. Accepts an array of objects, a 2D array (first row = header), or a markdown pipe-table string. Long cells are truncated with an ellipsis; numeric columns auto right-align.",
3039
+ inputSchema: {
3040
+ type: "object",
3041
+ properties: {
3042
+ channel: {
3043
+ type: "string",
3044
+ description: "Channel ID or name to post the table to"
3045
+ },
3046
+ title: {
3047
+ type: "string",
3048
+ description: "Optional bold title rendered above the table"
3049
+ },
3050
+ rows: {
3051
+ description: "Table data: array of objects, a 2D array (first row = header), OR a markdown pipe-table string"
3052
+ },
3053
+ as_code_block: {
3054
+ type: "boolean",
3055
+ description: "Wrap the table in a ``` code block so columns stay aligned (default true)"
3056
+ }
3057
+ },
3058
+ required: ["channel", "rows"]
3059
+ }
3060
+ },
3061
+ {
3062
+ name: "slack_send_card",
3063
+ description: "Post a polished Slack Block Kit card: a header, one or more section blocks (each with optional two-column fields), an optional context footer, and an optional colored left bar. Use for structured summaries and status reports that benefit from native Block Kit layout (vs the ASCII table or PNG paths).",
3064
+ inputSchema: {
3065
+ type: "object",
3066
+ properties: {
3067
+ channel: { type: "string", description: "Channel ID or name" },
3068
+ header: { type: "string", description: "Card header (plain text)" },
3069
+ sections: {
3070
+ type: "array",
3071
+ description: "Section blocks rendered in order, separated by dividers",
3072
+ items: {
3073
+ type: "object",
3074
+ properties: {
3075
+ text: { type: "string", description: "mrkdwn body text" },
3076
+ fields: {
3077
+ type: "array",
3078
+ description: "Up to 10 two-column key/value fields",
3079
+ items: {
3080
+ type: "object",
3081
+ properties: {
3082
+ label: { type: "string" },
3083
+ value: { type: "string" }
3084
+ },
3085
+ required: ["value"]
3086
+ }
3087
+ }
3088
+ }
3089
+ }
3090
+ },
3091
+ context: { type: "string", description: "Small footer context line (mrkdwn)" },
3092
+ color: { type: "string", description: "Hex color for the left bar, e.g. #3D8C62" },
3093
+ username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
3094
+ icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
3095
+ icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
3096
+ },
3097
+ required: ["channel", "header"]
3098
+ }
3099
+ },
3100
+ {
3101
+ name: "slack_start_task",
3102
+ description: "Begin a long-running task in ONE thread instead of spamming a channel. Posts a parent Block Kit card ('⏳ <title>') and adds a live ⏳ status reaction. Returns { task_ts, channel } — pass these back to slack_update_task and slack_complete_task. Pass total_steps to enable a progress bar.",
3103
+ inputSchema: {
3104
+ type: "object",
3105
+ properties: {
3106
+ channel: { type: "string", description: "Channel ID or name" },
3107
+ title: { type: "string", description: "Task title" },
3108
+ total_steps: { type: "number", description: "Total number of steps (enables a progress bar)" },
3109
+ username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
3110
+ icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
3111
+ icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
3112
+ },
3113
+ required: ["channel", "title"]
3114
+ }
3115
+ },
3116
+ {
3117
+ name: "slack_update_task",
3118
+ description: "Post a progress update as a THREADED reply under the task's parent card. Do NOT @-mention anyone here — routine updates must stay quiet (only slack_complete_task may notify). If you pass step (and total_steps), the parent card's progress bar is also updated.",
3119
+ inputSchema: {
3120
+ type: "object",
3121
+ properties: {
3122
+ channel: { type: "string", description: "Channel ID where the task card lives" },
3123
+ task_ts: { type: "string", description: "Timestamp of the parent task card (from slack_start_task)" },
3124
+ message: { type: "string", description: "Progress update (threaded reply). No @-mentions." },
3125
+ step: { type: "number", description: "Current step number" },
3126
+ total_steps: { type: "number", description: "Total steps (defaults to start_task value)" },
3127
+ username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
3128
+ icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
3129
+ icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
3130
+ },
3131
+ required: ["channel", "task_ts", "message"]
3132
+ }
3133
+ },
3134
+ {
3135
+ name: "slack_complete_task",
3136
+ description: "Finish a task: posts a final threaded reply AND edits the parent card into a ✅/❌ completion summary, swapping the live ⏳ status reaction to ✅ or ❌. This is the ONLY task tool permitted to @-mention — set notify_user (a Slack user ID) to ping the owner on completion or failure.",
3137
+ inputSchema: {
3138
+ type: "object",
3139
+ properties: {
3140
+ channel: { type: "string", description: "Channel ID where the task card lives" },
3141
+ task_ts: { type: "string", description: "Timestamp of the parent task card (from slack_start_task)" },
3142
+ summary: { type: "string", description: "Final summary of the outcome" },
3143
+ status: { type: "string", enum: ["done", "failed"], description: "Final status" },
3144
+ details: { type: "string", description: "Optional details — commits, links, duration (mrkdwn)" },
3145
+ notify_user: { type: "string", description: "Optional Slack user ID to @-mention on completion" },
3146
+ username: { type: "string", description: "Post under this display name (requires chat:write.customize; falls back to SLACK_SESSION_USERNAME)" },
3147
+ icon_emoji: { type: "string", description: "Icon emoji (requires chat:write.customize; falls back to SLACK_SESSION_ICON)" },
3148
+ icon_url: { type: "string", description: "Icon image URL (requires chat:write.customize)" }
3149
+ },
3150
+ required: ["channel", "task_ts", "summary", "status"]
3151
+ }
3152
+ },
3153
+ {
3154
+ name: "slack_poll",
3155
+ description: "Poll a shared channel for NEW messages addressed to this Legate (multi-session coordination). Tracks a per-call-sign cursor so each poll returns only messages newer than the last. Tags each message's addressing relative to your call_sign (to_me / to_all / whoever_first / to_other:<Name> / chatter), excludes your own posts, and by default drops chatter. ACT ONLY on messages tagged to_me, to_all, or whoever_first — ignore to_other and chatter. The FIRST poll (no stored cursor and no `since` arg) anchors the cursor to 'now' and returns nothing (first_poll:true) so a freshly-booted session never acts on stale backlog; pass `since` explicitly if you actually want history. Advances the cursor every poll.",
3156
+ inputSchema: {
3157
+ type: "object",
3158
+ properties: {
3159
+ channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
3160
+ call_sign: { type: "string", description: "This Legate's NATO call-sign (e.g., Alpha, Bravo)" },
3161
+ limit: { type: "number", description: "Max messages to scan/return (default: 15)" },
3162
+ since: { type: "string", description: "Slack ts to poll from; overrides the stored cursor" },
3163
+ include_chatter: { type: "boolean", description: "Include messages not addressed to anyone (default: false)" }
3164
+ },
3165
+ required: ["channel", "call_sign"]
3166
+ }
3167
+ },
3168
+ {
3169
+ name: "slack_claim_lane",
3170
+ description: "Claim a unit of work ('lane') on a shared channel so sibling Legates don't double-up. Posts a machine-parseable LANE CLAIM, then re-reads to detect a lost race (yields to an earlier claimant). Returns granted:false WITHOUT posting if another Legate already holds an unexpired claim on the same lane. Pass release:true to post a LANE RELEASE for a finished lane.",
3171
+ inputSchema: {
3172
+ type: "object",
3173
+ properties: {
3174
+ channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
3175
+ call_sign: { type: "string", description: "This Legate's NATO call-sign" },
3176
+ task: { type: "string", description: "The work being claimed (free text; normalized to a lane key)" },
3177
+ ttl_minutes: { type: "number", description: "How long a claim stays valid (default: 20)" },
3178
+ lookback: { type: "number", description: "How many recent messages to scan for prior claims (default: 30)" },
3179
+ release: { type: "boolean", description: "If true, post a LANE RELEASE for this task instead of claiming (default: false)" }
3180
+ },
3181
+ required: ["channel", "call_sign", "task"]
3182
+ }
3183
+ },
3184
+ {
3185
+ name: "slack_checkin",
3186
+ description: "Post a one-line status check-in to the shared channel, de-duplicated per call-sign + channel. Suppresses the post when the status is unchanged since the last check-in (unless force:true or a heartbeat_minutes interval has elapsed).",
3187
+ inputSchema: {
3188
+ type: "object",
3189
+ properties: {
3190
+ channel: { type: "string", description: "Channel ID or name (e.g., C1234567890 or #echelon)" },
3191
+ call_sign: { type: "string", description: "This Legate's NATO call-sign" },
3192
+ status: { type: "string", description: "One-line status to post" },
3193
+ force: { type: "boolean", description: "Post even if the status is unchanged (default: false)" },
3194
+ heartbeat_minutes: { type: "number", description: "If >0, re-post an unchanged status once this many minutes have elapsed (default: 0)" }
3195
+ },
3196
+ required: ["channel", "call_sign", "status"]
3197
+ }
3198
+ },
2702
3199
  ];
2703
3200
  return { tools };
2704
3201
  });
@@ -2706,21 +3203,11 @@ ${validatedArgs.diagram_content}
2706
3203
  try {
2707
3204
  const { name, arguments: args } = request.params;
2708
3205
  switch (name) {
2709
- // Account Management Tools
2710
- case "list_accounts":
2711
- return await this.listAccounts(args);
2712
- case "switch_account":
2713
- return await this.switchAccount(args);
2714
- case "add_account":
2715
- return await this.addAccount(args);
2716
- case "remove_account":
2717
- return await this.removeAccount(args);
3206
+ // Account Tools (read-only)
2718
3207
  case "get_active_account":
2719
3208
  return await this.getActiveAccount(args);
2720
- case "set_default_account":
2721
- return await this.setDefaultAccount(args);
2722
- case "update_account":
2723
- return await this.updateAccount(args);
3209
+ case "list_accounts":
3210
+ return await this.listAccounts(args);
2724
3211
  // Original Slack Tools
2725
3212
  case "slack_list_channels":
2726
3213
  return await this.slackListChannels(args);
@@ -2745,7 +3232,7 @@ ${validatedArgs.diagram_content}
2745
3232
  case "slack_search_by_date_range":
2746
3233
  return await this.slackSearchByDateRange(args);
2747
3234
  case "slack_get_workspace_stats":
2748
- return await this.slackGetWorkspaceStats();
3235
+ return await this.slackGetWorkspaceStats(args);
2749
3236
  case "slack_pin_message":
2750
3237
  return await this.slackPinMessage(args);
2751
3238
  case "slack_unpin_message":
@@ -2782,6 +3269,23 @@ ${validatedArgs.diagram_content}
2782
3269
  return await this.slackUploadFile(args);
2783
3270
  case "slack_send_diagram":
2784
3271
  return await this.slackSendDiagram(args);
3272
+ case "slack_send_table":
3273
+ return await this.slackSendTable(args);
3274
+ case "slack_send_card":
3275
+ return await this.slackSendCard(args);
3276
+ case "slack_start_task":
3277
+ return await this.slackStartTask(args);
3278
+ case "slack_update_task":
3279
+ return await this.slackUpdateTask(args);
3280
+ case "slack_complete_task":
3281
+ return await this.slackCompleteTask(args);
3282
+ // Legate pull/polling tools (multi-session coordination)
3283
+ case "slack_poll":
3284
+ return await this.slackPoll(args);
3285
+ case "slack_claim_lane":
3286
+ return await this.slackClaimLane(args);
3287
+ case "slack_checkin":
3288
+ return await this.slackCheckin(args);
2785
3289
  default:
2786
3290
  throw new Error(`Unknown tool: ${name}`);
2787
3291
  }
@@ -2803,11 +3307,37 @@ ${validatedArgs.diagram_content}
2803
3307
  async run() {
2804
3308
  const transport = new StdioServerTransport();
2805
3309
  await this.server.connect(transport);
2806
- console.error("[SlackServer] Slack MCP server v3.1.0 running on stdio");
2807
- // Load persisted accounts after server is connected
2808
- await this.loadPersistedAccounts();
3310
+ console.error("[SlackServer] Slack MCP server v4.0.0 running on stdio");
3311
+ // Ensure the warm Puppeteer browser is shut down cleanly on exit.
3312
+ const shutdown = () => {
3313
+ Promise.resolve()
3314
+ .then(() => this.closeBrowser())
3315
+ .finally(() => process.exit(0));
3316
+ };
3317
+ process.once("SIGINT", shutdown);
3318
+ process.once("SIGTERM", shutdown);
2809
3319
  }
2810
3320
  }
2811
- const server = new SlackerV3Server();
2812
- server.run().catch(console.error);
2813
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUE0QjFDLHdGQUF3RjtBQUN4RiwyQkFBMkI7QUFDM0Isd0ZBQXdGO0FBRXhGLE1BQU0saUJBQWlCO0lBQ0osWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMs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
3321
+ // Only start the stdio server when run directly as a CLI. Guarding this lets the
3322
+ // module be imported by the test suite without spawning the server / connecting a
3323
+ // transport. We resolve symlinks on both sides so this matches whether launched as
3324
+ // `node dist/index.js` OR via a bin symlink (`npx @chinchillaenterprises/mcp-slack`,
3325
+ // global install) — the latter sets argv[1] to `.bin/mcp-slack`, which a plain
3326
+ // equality check against the real module path would miss, silently skipping startup.
3327
+ const isMain = (() => {
3328
+ const entry = process.argv[1];
3329
+ if (!entry)
3330
+ return false;
3331
+ const self = fileURLToPath(import.meta.url);
3332
+ try {
3333
+ return realpathSync(entry) === realpathSync(self);
3334
+ }
3335
+ catch {
3336
+ return entry === self;
3337
+ }
3338
+ })();
3339
+ if (isMain) {
3340
+ const server = new SlackerV3Server();
3341
+ server.run().catch(console.error);
3342
+ }
3343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUV0QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BDLE9BQU8sRUFBb0IsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BELE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUUxQyx3RkFBd0Y7QUFDeEYsdUNBQXVDO0FBQ3ZDLHdGQUF3RjtBQUN4RixtRkFBbUY7QUFDbkYsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRixvRkFBb0Y7QUFDcEYsc0ZBQXNGO0FBQ3RGLHFGQUFxRjtBQUNyRix5RUFBeUU7QUFDekUsd0ZBQXdGO0FB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LENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzVFLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxLQUF1QixFQUFFLEVBQUUsQ0FDNUQsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRCxNQUFNLEdBQUcsR0FBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzFFLE1BQU0sR0FBRyxHQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDMUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUUxRSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVcsRUFBRSxFQUFFLENBQzdCLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRTFFLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFVO0lBQ3JDLElB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