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.
- package/index.js +67 -4
- 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