mcp-chat-connect 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +67 -4
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -249,6 +249,7 @@ let sessionState = {
249
249
  userName: null,
250
250
  userId: null,
251
251
  sessionToken: null,
252
+ sessionLabel: null,
252
253
  connected: false,
253
254
  };
254
255
 
@@ -260,6 +261,44 @@ if (savedConfig.token) {
260
261
  sessionState.userId = savedConfig.userId;
261
262
  }
262
263
 
264
+ // Auto-connect from env vars (headless/bot mode)
265
+ const envToken = process.env.MCP_CHAT_TOKEN;
266
+ const envChannel = process.env.MCP_CHAT_CHANNEL;
267
+ if (envToken && envChannel) {
268
+ let userId = null;
269
+ let userName = process.env.MCP_CHAT_USER_NAME || 'Bot';
270
+ try {
271
+ const payload = JSON.parse(Buffer.from(envToken.split('.')[1], 'base64').toString());
272
+ userId = payload.id;
273
+ userName = process.env.MCP_CHAT_USER_NAME || payload.name || 'Bot';
274
+ } catch {}
275
+
276
+ const sessionToken = `mcp-${crypto.randomBytes(16).toString('hex')}`;
277
+ sessionState = {
278
+ token: envToken,
279
+ channelId: parseInt(envChannel, 10),
280
+ channelName: process.env.MCP_CHAT_CHANNEL_NAME || `channel-${envChannel}`,
281
+ userName,
282
+ userId,
283
+ sessionToken,
284
+ sessionLabel: null,
285
+ connected: true,
286
+ };
287
+
288
+ // Register session for sequential label, then connect WebSocket
289
+ apiCall('register_session', {
290
+ channel_id: sessionState.channelId,
291
+ session_token: sessionToken,
292
+ }, envToken).then(result => {
293
+ sessionState.sessionLabel = result.label || 'Session';
294
+ process.stderr.write(`[mcp-chat] Auto-connected to #${sessionState.channelName} as ${userName} (${sessionState.sessionLabel})\n`);
295
+ }).catch(() => {
296
+ process.stderr.write(`[mcp-chat] Auto-connected to #${sessionState.channelName} as ${userName}\n`);
297
+ }).finally(() => {
298
+ connectWebSocket();
299
+ });
300
+ }
301
+
263
302
  function sendResponse(id, result) {
264
303
  const msg = JSON.stringify({ jsonrpc: '2.0', id, result });
265
304
  process.stdout.write(`${msg}\n`);
@@ -391,16 +430,28 @@ async function handleToolCall(name, args) {
391
430
  userName: result.userName,
392
431
  userId,
393
432
  sessionToken,
433
+ sessionLabel: null,
394
434
  connected: true,
395
435
  };
396
436
  saveConfig({ token: result.token, userName: result.userName, userId });
397
437
 
438
+ // Register session to get sequential label
439
+ let sessionLabel = 'Session';
440
+ try {
441
+ const regResult = await apiCall('register_session', {
442
+ channel_id: result.channelId,
443
+ session_token: sessionToken,
444
+ }, result.token);
445
+ sessionLabel = regResult.label || 'Session';
446
+ sessionState.sessionLabel = sessionLabel;
447
+ } catch {}
448
+
398
449
  // Start WebSocket listener for real-time push
399
450
  connectWebSocket();
400
451
 
401
452
  // Check for package updates
402
453
  const updateNotice = await checkForUpdate();
403
- let responseText = `Connected to #${result.channelName} as ${result.userName}. Live messages will now be pushed into this session. You can also use mcp_chat_send to send messages and mcp_chat_read to fetch history.`;
454
+ let responseText = `Connected to #${result.channelName} as ${result.userName} (${sessionLabel}). Live messages will now be pushed into this session. You can also use mcp_chat_send to send messages and mcp_chat_read to fetch history.`;
404
455
  if (updateNotice) {
405
456
  responseText += `\n\n${updateNotice}`;
406
457
  }
@@ -435,11 +486,23 @@ async function handleToolCall(name, args) {
435
486
  channelId,
436
487
  channelName: channel.name,
437
488
  sessionToken,
489
+ sessionLabel: null,
438
490
  connected: true,
439
491
  };
440
492
 
493
+ // Register session to get sequential label
494
+ let sessionLabel = 'Session';
495
+ try {
496
+ const regResult = await apiCall('register_session', {
497
+ channel_id: channelId,
498
+ session_token: sessionToken,
499
+ }, sessionState.token);
500
+ sessionLabel = regResult.label || 'Session';
501
+ sessionState.sessionLabel = sessionLabel;
502
+ } catch {}
503
+
441
504
  connectWebSocket();
442
- return { content: [{ type: 'text', text: `Joined #${channel.name} (ID: ${channelId}) as ${sessionState.userName}. Live messages are now being pushed.` }] };
505
+ return { content: [{ type: 'text', text: `Joined #${channel.name} (ID: ${channelId}) as ${sessionState.userName} (${sessionLabel}). Live messages are now being pushed.` }] };
443
506
  } catch (err) {
444
507
  return { content: [{ type: 'text', text: `Failed to join channel: ${err.message}` }], isError: true };
445
508
  }
@@ -511,10 +574,10 @@ async function handleToolCall(name, args) {
511
574
 
512
575
  case 'mcp_chat_status': {
513
576
  if (!sessionState.connected) {
514
- return { content: [{ type: 'text', text: sessionState.token ? 'Authenticated but not connected to a channel. Run mcp_chat_connect to pick a channel.' : 'Not connected. Run mcp_chat_connect to authenticate and select a channel.' }] };
577
+ return { content: [{ type: 'text', text: sessionState.token ? 'Authenticated but not connected to a channel. Run mcp_chat_connect or mcp_chat_join to pick a channel.' : 'Not connected. Run mcp_chat_connect to authenticate and select a channel.' }] };
515
578
  }
516
579
  const wsStatus = wsConnection?.readyState === 1 ? 'live (receiving messages)' : 'reconnecting...';
517
- return { content: [{ type: 'text', text: `Connected to #${sessionState.channelName} as ${sessionState.userName}\nWebSocket: ${wsStatus}` }] };
580
+ return { content: [{ type: 'text', text: `Connected to #${sessionState.channelName} as ${sessionState.userName} (${sessionState.sessionLabel || 'Session'})\nWebSocket: ${wsStatus}` }] };
518
581
  }
519
582
 
520
583
  case 'mcp_chat_create_channel': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-chat-connect",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "MCP server with channels support for connecting Claude Code sessions to MCP Chat -- real-time team messaging for AI-assisted development",
5
5
  "main": "index.js",
6
6
  "bin": {