mcp-server-rocketchat-threads 1.0.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/LICENSE +21 -0
- package/README.md +332 -0
- package/dist/api/client.d.ts +119 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +305 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +22 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/schemas.d.ts +10636 -0
- package/dist/api/schemas.d.ts.map +1 -0
- package/dist/api/schemas.js +267 -0
- package/dist/api/schemas.js.map +1 -0
- package/dist/api/types.d.ts +263 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +7 -0
- package/dist/api/types.js.map +1 -0
- package/dist/config/config.d.ts +37 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +79 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di/container.d.ts +101 -0
- package/dist/di/container.d.ts.map +1 -0
- package/dist/di/container.js +214 -0
- package/dist/di/container.js.map +1 -0
- package/dist/di/index.d.ts +6 -0
- package/dist/di/index.d.ts.map +1 -0
- package/dist/di/index.js +12 -0
- package/dist/di/index.js.map +1 -0
- package/dist/formatters/index.d.ts +6 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +22 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/message-formatter.d.ts +64 -0
- package/dist/formatters/message-formatter.d.ts.map +1 -0
- package/dist/formatters/message-formatter.js +161 -0
- package/dist/formatters/message-formatter.js.map +1 -0
- package/dist/formatters/response-builder.d.ts +60 -0
- package/dist/formatters/response-builder.d.ts.map +1 -0
- package/dist/formatters/response-builder.js +108 -0
- package/dist/formatters/response-builder.js.map +1 -0
- package/dist/guards/index.d.ts +12 -0
- package/dist/guards/index.d.ts.map +1 -0
- package/dist/guards/index.js +42 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/guards/input-validator.d.ts +89 -0
- package/dist/guards/input-validator.d.ts.map +1 -0
- package/dist/guards/input-validator.js +266 -0
- package/dist/guards/input-validator.js.map +1 -0
- package/dist/guards/rate-limiter.d.ts +115 -0
- package/dist/guards/rate-limiter.d.ts.map +1 -0
- package/dist/guards/rate-limiter.js +226 -0
- package/dist/guards/rate-limiter.js.map +1 -0
- package/dist/guards/sanitizer.d.ts +35 -0
- package/dist/guards/sanitizer.d.ts.map +1 -0
- package/dist/guards/sanitizer.js +111 -0
- package/dist/guards/sanitizer.js.map +1 -0
- package/dist/guards/write-guard.d.ts +33 -0
- package/dist/guards/write-guard.d.ts.map +1 -0
- package/dist/guards/write-guard.js +90 -0
- package/dist/guards/write-guard.js.map +1 -0
- package/dist/http-server.d.ts +9 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +190 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +114 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/base.d.ts +85 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +184 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/channel-tools.d.ts +18 -0
- package/dist/tools/channel-tools.d.ts.map +1 -0
- package/dist/tools/channel-tools.js +151 -0
- package/dist/tools/channel-tools.js.map +1 -0
- package/dist/tools/handler-utils.d.ts +75 -0
- package/dist/tools/handler-utils.d.ts.map +1 -0
- package/dist/tools/handler-utils.js +105 -0
- package/dist/tools/handler-utils.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +40 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/message-tools.d.ts +20 -0
- package/dist/tools/message-tools.d.ts.map +1 -0
- package/dist/tools/message-tools.js +194 -0
- package/dist/tools/message-tools.js.map +1 -0
- package/dist/tools/thread-tools.d.ts +23 -0
- package/dist/tools/thread-tools.d.ts.map +1 -0
- package/dist/tools/thread-tools.js +243 -0
- package/dist/tools/thread-tools.js.map +1 -0
- package/dist/tools/user-tools.d.ts +14 -0
- package/dist/tools/user-tools.d.ts.map +1 -0
- package/dist/tools/user-tools.js +120 -0
- package/dist/tools/user-tools.js.map +1 -0
- package/dist/tools/write-tools.d.ts +15 -0
- package/dist/tools/write-tools.d.ts.map +1 -0
- package/dist/tools/write-tools.js +181 -0
- package/dist/tools/write-tools.js.map +1 -0
- package/dist/utils/cache.d.ts +47 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +116 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/error-handler.d.ts +64 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +148 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +33 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +50 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +118 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/time-parser.d.ts +37 -0
- package/dist/utils/time-parser.d.ts.map +1 -0
- package/dist/utils/time-parser.js +98 -0
- package/dist/utils/time-parser.js.map +1 -0
- package/dist/utils/token-counter.d.ts +42 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +81 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Message Sanitizer - Neutralizes dangerous mentions and patterns
|
|
4
|
+
* Prevents accidental mass notifications (@all, @here, @channel)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MessageSanitizer = void 0;
|
|
8
|
+
exports.getSanitizer = getSanitizer;
|
|
9
|
+
exports.resetSanitizer = resetSanitizer;
|
|
10
|
+
const config_js_1 = require("../config/config.js");
|
|
11
|
+
// Dangerous mention patterns that trigger mass notifications
|
|
12
|
+
const DANGEROUS_MENTIONS = [
|
|
13
|
+
{ pattern: /@all\b/gi, replacement: '@\u200Ball', name: '@all' },
|
|
14
|
+
{ pattern: /@here\b/gi, replacement: '@\u200Bhere', name: '@here' },
|
|
15
|
+
{ pattern: /@channel\b/gi, replacement: '@\u200Bchannel', name: '@channel' },
|
|
16
|
+
{ pattern: /@everyone\b/gi, replacement: '@\u200Beveryone', name: '@everyone' },
|
|
17
|
+
];
|
|
18
|
+
// URL patterns that might be malicious
|
|
19
|
+
const URL_PATTERNS = [
|
|
20
|
+
// JavaScript URLs
|
|
21
|
+
{ pattern: /javascript:/gi, replacement: 'javascript\u200B:', name: 'javascript:' },
|
|
22
|
+
// Data URLs (can contain malicious content)
|
|
23
|
+
{ pattern: /data:text\/html/gi, replacement: 'data\u200B:text/html', name: 'data:' },
|
|
24
|
+
];
|
|
25
|
+
class MessageSanitizer {
|
|
26
|
+
blockMentions;
|
|
27
|
+
blockedMentions;
|
|
28
|
+
constructor() {
|
|
29
|
+
const config = (0, config_js_1.loadConfig)();
|
|
30
|
+
this.blockMentions = config.safety.blockMentions;
|
|
31
|
+
this.blockedMentions = config.safety.blockedMentions;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Sanitize message text
|
|
35
|
+
*/
|
|
36
|
+
sanitize(text) {
|
|
37
|
+
let result = text;
|
|
38
|
+
const neutralized = [];
|
|
39
|
+
if (this.blockMentions) {
|
|
40
|
+
// Neutralize dangerous mentions
|
|
41
|
+
for (const mention of DANGEROUS_MENTIONS) {
|
|
42
|
+
if (this.blockedMentions.length === 0 ||
|
|
43
|
+
this.blockedMentions.includes(mention.name)) {
|
|
44
|
+
if (mention.pattern.test(result)) {
|
|
45
|
+
result = result.replace(mention.pattern, mention.replacement);
|
|
46
|
+
neutralized.push(mention.name);
|
|
47
|
+
}
|
|
48
|
+
// Reset regex lastIndex
|
|
49
|
+
mention.pattern.lastIndex = 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Always neutralize potentially dangerous URLs
|
|
54
|
+
for (const urlPattern of URL_PATTERNS) {
|
|
55
|
+
if (urlPattern.pattern.test(result)) {
|
|
56
|
+
result = result.replace(urlPattern.pattern, urlPattern.replacement);
|
|
57
|
+
neutralized.push(urlPattern.name);
|
|
58
|
+
}
|
|
59
|
+
urlPattern.pattern.lastIndex = 0;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
text: result,
|
|
63
|
+
modified: result !== text,
|
|
64
|
+
neutralized
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if text contains dangerous patterns without modifying
|
|
69
|
+
*/
|
|
70
|
+
check(text) {
|
|
71
|
+
const patterns = [];
|
|
72
|
+
for (const mention of DANGEROUS_MENTIONS) {
|
|
73
|
+
if (mention.pattern.test(text)) {
|
|
74
|
+
patterns.push(mention.name);
|
|
75
|
+
}
|
|
76
|
+
mention.pattern.lastIndex = 0;
|
|
77
|
+
}
|
|
78
|
+
for (const urlPattern of URL_PATTERNS) {
|
|
79
|
+
if (urlPattern.pattern.test(text)) {
|
|
80
|
+
patterns.push(urlPattern.name);
|
|
81
|
+
}
|
|
82
|
+
urlPattern.pattern.lastIndex = 0;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
hasDangerousPatterns: patterns.length > 0,
|
|
86
|
+
patterns
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get current configuration
|
|
91
|
+
*/
|
|
92
|
+
getConfig() {
|
|
93
|
+
return {
|
|
94
|
+
blockMentions: this.blockMentions,
|
|
95
|
+
blockedMentions: [...this.blockedMentions]
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.MessageSanitizer = MessageSanitizer;
|
|
100
|
+
// Singleton instance
|
|
101
|
+
let sanitizerInstance = null;
|
|
102
|
+
function getSanitizer() {
|
|
103
|
+
if (!sanitizerInstance) {
|
|
104
|
+
sanitizerInstance = new MessageSanitizer();
|
|
105
|
+
}
|
|
106
|
+
return sanitizerInstance;
|
|
107
|
+
}
|
|
108
|
+
function resetSanitizer() {
|
|
109
|
+
sanitizerInstance = null;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../src/guards/sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write Guard - Controls write operations to channels
|
|
3
|
+
* Provides whitelist/blacklist based access control
|
|
4
|
+
*/
|
|
5
|
+
export interface WriteCheckResult {
|
|
6
|
+
allowed: boolean;
|
|
7
|
+
reason?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class WriteGuard {
|
|
10
|
+
private enabled;
|
|
11
|
+
private whitelist;
|
|
12
|
+
private blacklist;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Check if write operation is allowed for a room
|
|
16
|
+
*/
|
|
17
|
+
checkWrite(roomId: string, roomName?: string): WriteCheckResult;
|
|
18
|
+
/**
|
|
19
|
+
* Check if write is globally enabled
|
|
20
|
+
*/
|
|
21
|
+
isEnabled(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get current configuration
|
|
24
|
+
*/
|
|
25
|
+
getConfig(): {
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
whitelist: string[];
|
|
28
|
+
blacklist: string[];
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare function getWriteGuard(): WriteGuard;
|
|
32
|
+
export declare function resetWriteGuard(): void;
|
|
33
|
+
//# sourceMappingURL=write-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-guard.d.ts","sourceRoot":"","sources":["../../src/guards/write-guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,SAAS,CAAW;;IAS5B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB;IA2C/D;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;CAO9E;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Write Guard - Controls write operations to channels
|
|
4
|
+
* Provides whitelist/blacklist based access control
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WriteGuard = void 0;
|
|
8
|
+
exports.getWriteGuard = getWriteGuard;
|
|
9
|
+
exports.resetWriteGuard = resetWriteGuard;
|
|
10
|
+
const config_js_1 = require("../config/config.js");
|
|
11
|
+
class WriteGuard {
|
|
12
|
+
enabled;
|
|
13
|
+
whitelist;
|
|
14
|
+
blacklist;
|
|
15
|
+
constructor() {
|
|
16
|
+
const config = (0, config_js_1.loadConfig)();
|
|
17
|
+
this.enabled = config.write.enabled;
|
|
18
|
+
this.whitelist = config.write.whitelist;
|
|
19
|
+
this.blacklist = config.write.blacklist;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if write operation is allowed for a room
|
|
23
|
+
*/
|
|
24
|
+
checkWrite(roomId, roomName) {
|
|
25
|
+
// If write is globally disabled
|
|
26
|
+
if (!this.enabled) {
|
|
27
|
+
return {
|
|
28
|
+
allowed: false,
|
|
29
|
+
reason: 'Write operations are disabled. Set ROCKETCHAT_WRITE_ENABLED=true to enable.'
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const identifiers = [roomId];
|
|
33
|
+
if (roomName) {
|
|
34
|
+
identifiers.push(roomName);
|
|
35
|
+
}
|
|
36
|
+
// Check blacklist first (takes precedence)
|
|
37
|
+
for (const id of identifiers) {
|
|
38
|
+
if (this.blacklist.includes(id)) {
|
|
39
|
+
return {
|
|
40
|
+
allowed: false,
|
|
41
|
+
reason: `Room "${id}" is in the blacklist and cannot be written to.`
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// If whitelist is empty, all non-blacklisted rooms are allowed
|
|
46
|
+
if (this.whitelist.length === 0) {
|
|
47
|
+
return { allowed: true };
|
|
48
|
+
}
|
|
49
|
+
// Check if room is in whitelist
|
|
50
|
+
for (const id of identifiers) {
|
|
51
|
+
if (this.whitelist.includes(id)) {
|
|
52
|
+
return { allowed: true };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Room not in whitelist
|
|
56
|
+
return {
|
|
57
|
+
allowed: false,
|
|
58
|
+
reason: `Room "${roomId}" is not in the whitelist. Allowed rooms: ${this.whitelist.join(', ')}`
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if write is globally enabled
|
|
63
|
+
*/
|
|
64
|
+
isEnabled() {
|
|
65
|
+
return this.enabled;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get current configuration
|
|
69
|
+
*/
|
|
70
|
+
getConfig() {
|
|
71
|
+
return {
|
|
72
|
+
enabled: this.enabled,
|
|
73
|
+
whitelist: [...this.whitelist],
|
|
74
|
+
blacklist: [...this.blacklist]
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.WriteGuard = WriteGuard;
|
|
79
|
+
// Singleton instance
|
|
80
|
+
let writeGuardInstance = null;
|
|
81
|
+
function getWriteGuard() {
|
|
82
|
+
if (!writeGuardInstance) {
|
|
83
|
+
writeGuardInstance = new WriteGuard();
|
|
84
|
+
}
|
|
85
|
+
return writeGuardInstance;
|
|
86
|
+
}
|
|
87
|
+
function resetWriteGuard() {
|
|
88
|
+
writeGuardInstance = null;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=write-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-guard.js","sourceRoot":"","sources":["../../src/guards/write-guard.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAyFH,sCAKC;AAED,0CAEC;AAhGD,mDAAiD;AAOjD,MAAa,UAAU;IACX,OAAO,CAAU;IACjB,SAAS,CAAW;IACpB,SAAS,CAAW;IAE5B;QACI,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,QAAiB;QACxC,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,6EAA6E;aACxF,CAAC;QACN,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9B,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,SAAS,EAAE,iDAAiD;iBACvE,CAAC;YACN,CAAC;QACL,CAAC;QAED,+DAA+D;QAC/D,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,gCAAgC;QAChC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,OAAO;YACH,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,SAAS,MAAM,6CAA6C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAClG,CAAC;IACN,CAAC;IAED;;OAEG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,SAAS;QACL,OAAO;YACH,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;SACjC,CAAC;IACN,CAAC;CACJ;AA3ED,gCA2EC;AAED,qBAAqB;AACrB,IAAI,kBAAkB,GAAsB,IAAI,CAAC;AAEjD,SAAgB,aAAa;IACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED,SAAgB,eAAe;IAC3B,kBAAkB,GAAG,IAAI,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Rocket.Chat MCP Server - HTTP/SSE Mode
|
|
5
|
+
*
|
|
6
|
+
* This runs the MCP server over HTTP for remote access.
|
|
7
|
+
* Use this when Claude Desktop is on a different machine.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
11
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
12
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
13
|
+
const node_http_1 = require("node:http");
|
|
14
|
+
const node_crypto_1 = require("node:crypto");
|
|
15
|
+
const config_js_1 = require("./config/config.js");
|
|
16
|
+
const index_js_2 = require("./tools/index.js");
|
|
17
|
+
const client_js_1 = require("./api/client.js");
|
|
18
|
+
// Server metadata
|
|
19
|
+
const SERVER_NAME = 'mcp-rocketchat';
|
|
20
|
+
const SERVER_VERSION = '0.1.0';
|
|
21
|
+
// Store transports by session ID for multi-session support
|
|
22
|
+
const transports = new Map();
|
|
23
|
+
/**
|
|
24
|
+
* Create and configure the MCP server
|
|
25
|
+
*/
|
|
26
|
+
function createMcpServer() {
|
|
27
|
+
const server = new index_js_1.Server({
|
|
28
|
+
name: SERVER_NAME,
|
|
29
|
+
version: SERVER_VERSION
|
|
30
|
+
}, {
|
|
31
|
+
capabilities: {
|
|
32
|
+
tools: {}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// Handle list tools request
|
|
36
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
37
|
+
const tools = index_js_2.toolRegistry.getSchemas();
|
|
38
|
+
return { tools };
|
|
39
|
+
});
|
|
40
|
+
// Handle tool execution
|
|
41
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
42
|
+
const { name, arguments: args } = request.params;
|
|
43
|
+
const tool = index_js_2.toolRegistry.get(name);
|
|
44
|
+
if (!tool) {
|
|
45
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const result = await tool.handler(args || {});
|
|
49
|
+
return {
|
|
50
|
+
content: result.content,
|
|
51
|
+
isError: result.isError
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
56
|
+
return {
|
|
57
|
+
content: [{
|
|
58
|
+
type: 'text',
|
|
59
|
+
text: JSON.stringify({
|
|
60
|
+
success: false,
|
|
61
|
+
error: {
|
|
62
|
+
code: 'EXECUTION_ERROR',
|
|
63
|
+
message: `Tool execution failed: ${message}`
|
|
64
|
+
}
|
|
65
|
+
}, null, 2)
|
|
66
|
+
}],
|
|
67
|
+
isError: true
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return server;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Handle HTTP requests for MCP
|
|
75
|
+
*/
|
|
76
|
+
async function handleRequest(req, res) {
|
|
77
|
+
const url = new URL(req.url || '/', `http://${req.headers.host}`);
|
|
78
|
+
// CORS headers
|
|
79
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
80
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
81
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id');
|
|
82
|
+
res.setHeader('Access-Control-Expose-Headers', 'mcp-session-id');
|
|
83
|
+
// Handle preflight
|
|
84
|
+
if (req.method === 'OPTIONS') {
|
|
85
|
+
res.writeHead(204);
|
|
86
|
+
res.end();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Health check endpoint
|
|
90
|
+
if (url.pathname === '/health') {
|
|
91
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
92
|
+
res.end(JSON.stringify({ status: 'ok', server: SERVER_NAME, version: SERVER_VERSION }));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// MCP endpoint
|
|
96
|
+
if (url.pathname === '/mcp') {
|
|
97
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
98
|
+
// For new sessions (POST without session ID or initialization)
|
|
99
|
+
if (req.method === 'POST' && !sessionId) {
|
|
100
|
+
// Create new transport and server
|
|
101
|
+
const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
102
|
+
sessionIdGenerator: () => (0, node_crypto_1.randomUUID)(),
|
|
103
|
+
});
|
|
104
|
+
const server = createMcpServer();
|
|
105
|
+
// Store transport
|
|
106
|
+
transport.onclose = () => {
|
|
107
|
+
if (transport.sessionId) {
|
|
108
|
+
transports.delete(transport.sessionId);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
await server.connect(transport);
|
|
112
|
+
if (transport.sessionId) {
|
|
113
|
+
transports.set(transport.sessionId, transport);
|
|
114
|
+
}
|
|
115
|
+
await transport.handleRequest(req, res);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// For existing sessions
|
|
119
|
+
if (sessionId) {
|
|
120
|
+
const transport = transports.get(sessionId);
|
|
121
|
+
if (transport) {
|
|
122
|
+
await transport.handleRequest(req, res);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
127
|
+
res.end(JSON.stringify({ error: 'Session not found' }));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// GET request for SSE stream without session
|
|
132
|
+
if (req.method === 'GET') {
|
|
133
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
134
|
+
res.end(JSON.stringify({ error: 'Session ID required for GET requests' }));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
138
|
+
res.end(JSON.stringify({ error: 'Invalid request' }));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Not found
|
|
142
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
143
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Main entry point
|
|
147
|
+
*/
|
|
148
|
+
async function main() {
|
|
149
|
+
// Load and validate configuration
|
|
150
|
+
const config = (0, config_js_1.loadConfig)();
|
|
151
|
+
// Validate required configuration
|
|
152
|
+
if (!config.rocketchat.url) {
|
|
153
|
+
console.error('Error: ROCKETCHAT_URL environment variable is required');
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
if (!config.rocketchat.authToken) {
|
|
157
|
+
console.error('Error: ROCKETCHAT_AUTH_TOKEN environment variable is required');
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
if (!config.rocketchat.userId) {
|
|
161
|
+
console.error('Error: ROCKETCHAT_USER_ID environment variable is required');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
// Test connection
|
|
165
|
+
const client = (0, client_js_1.getClient)();
|
|
166
|
+
const connected = await client.testConnection();
|
|
167
|
+
if (!connected) {
|
|
168
|
+
console.error('Error: Failed to connect to Rocket.Chat server');
|
|
169
|
+
console.error(`URL: ${config.rocketchat.url}`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
// Get port from environment or default
|
|
173
|
+
const port = parseInt(process.env.MCP_HTTP_PORT || '3456', 10);
|
|
174
|
+
// Create HTTP server
|
|
175
|
+
const httpServer = (0, node_http_1.createServer)(handleRequest);
|
|
176
|
+
httpServer.listen(port, '0.0.0.0', () => {
|
|
177
|
+
console.error(`${SERVER_NAME} v${SERVER_VERSION} HTTP server started`);
|
|
178
|
+
console.error(`Listening on http://0.0.0.0:${port}`);
|
|
179
|
+
console.error(`MCP endpoint: http://0.0.0.0:${port}/mcp`);
|
|
180
|
+
console.error(`Health check: http://0.0.0.0:${port}/health`);
|
|
181
|
+
console.error(`Connected to: ${config.rocketchat.url}`);
|
|
182
|
+
console.error(`Write operations: ${config.write.enabled ? 'enabled' : 'disabled'}`);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// Run the server
|
|
186
|
+
main().catch((error) => {
|
|
187
|
+
console.error('Fatal error:', error);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";;AACA;;;;;GAKG;;AAEH,wEAAmE;AACnE,0FAAmG;AACnG,iEAK4C;AAC5C,yCAA0E;AAC1E,6CAAyC;AAEzC,kDAAgD;AAChD,+CAAgD;AAChD,+CAA4C;AAE5C,kBAAkB;AAClB,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,2DAA2D;AAC3D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyC,CAAC;AAEpE;;GAEG;AACH,SAAS,eAAe;IACpB,MAAM,MAAM,GAAG,IAAI,iBAAM,CACrB;QACI,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KAC1B,EACD;QACI,YAAY,EAAE;YACV,KAAK,EAAE,EAAE;SACZ;KACJ,CACJ,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,iBAAiB,CAAC,iCAAsB,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,KAAK,GAAG,uBAAY,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,CAAC,iBAAiB,CAAC,gCAAqB,EAAE,KAAK,EAAE,OAAO,EAG3D,EAAE;QACD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,MAAM,IAAI,GAAG,uBAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,IAAI,mBAAQ,CACd,oBAAS,CAAC,cAAc,EACxB,iBAAiB,IAAI,EAAE,CAC1B,CAAC;QACN,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO;gBACH,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;aAC1B,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO;gBACH,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACjB,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE;gCACH,IAAI,EAAE,iBAAiB;gCACvB,OAAO,EAAE,0BAA0B,OAAO,EAAE;6BAC/C;yBACJ,EAAE,IAAI,EAAE,CAAC,CAAC;qBACd,CAAC;gBACF,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,GAAoB,EAAE,GAAmB;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAElE,eAAe;IACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;IAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,8BAA8B,CAAC,CAAC;IAC9E,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,gBAAgB,CAAC,CAAC;IAEjE,mBAAmB;IACnB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACX,CAAC;IAED,wBAAwB;IACxB,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACxF,OAAO;IACX,CAAC;IAED,eAAe;IACf,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,+DAA+D;QAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,kCAAkC;YAClC,MAAM,SAAS,GAAG,IAAI,iDAA6B,CAAC;gBAChD,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAA,wBAAU,GAAE;aACzC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YAEjC,kBAAkB;YAClB,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;gBACrB,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACtB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEhC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACxC,OAAO;QACX,CAAC;QAED,wBAAwB;QACxB,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxC,OAAO;YACX,CAAC;iBAAM,CAAC;gBACJ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO;YACX,CAAC;QACL,CAAC;QAED,6CAA6C;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACvB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAC;YAC3E,OAAO;QACX,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO;IACX,CAAC;IAED,YAAY;IACZ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACf,kCAAkC;IAClC,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAE5B,kCAAkC;IAClC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,kBAAkB;IAClB,MAAM,MAAM,GAAG,IAAA,qBAAS,GAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,uCAAuC;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAE/D,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAA,wBAAY,EAAC,aAAa,CAAC,CAAC;IAE/C,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,KAAK,cAAc,sBAAsB,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,MAAM,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,SAAS,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACP,CAAC;AAED,iBAAiB;AACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Rocket.Chat MCP Server
|
|
4
|
+
* Model Context Protocol server for Rocket.Chat integration
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Channel/room listing and search
|
|
8
|
+
* - Message history with time filtering
|
|
9
|
+
* - Thread-centric knowledge retrieval
|
|
10
|
+
* - User lookup
|
|
11
|
+
* - Safe message sending (optional)
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Rocket.Chat MCP Server
|
|
5
|
+
* Model Context Protocol server for Rocket.Chat integration
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Channel/room listing and search
|
|
9
|
+
* - Message history with time filtering
|
|
10
|
+
* - Thread-centric knowledge retrieval
|
|
11
|
+
* - User lookup
|
|
12
|
+
* - Safe message sending (optional)
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
16
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
17
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
18
|
+
const config_js_1 = require("./config/config.js");
|
|
19
|
+
const index_js_2 = require("./tools/index.js");
|
|
20
|
+
const client_js_1 = require("./api/client.js");
|
|
21
|
+
// Server metadata
|
|
22
|
+
const SERVER_NAME = 'mcp-rocketchat';
|
|
23
|
+
const SERVER_VERSION = '0.1.0';
|
|
24
|
+
/**
|
|
25
|
+
* Create and configure the MCP server
|
|
26
|
+
*/
|
|
27
|
+
function createServer() {
|
|
28
|
+
const server = new index_js_1.Server({
|
|
29
|
+
name: SERVER_NAME,
|
|
30
|
+
version: SERVER_VERSION
|
|
31
|
+
}, {
|
|
32
|
+
capabilities: {
|
|
33
|
+
tools: {}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
// Handle list tools request
|
|
37
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
38
|
+
const tools = index_js_2.toolRegistry.getSchemas();
|
|
39
|
+
return { tools };
|
|
40
|
+
});
|
|
41
|
+
// Handle tool execution
|
|
42
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
43
|
+
const { name, arguments: args } = request.params;
|
|
44
|
+
const tool = index_js_2.toolRegistry.get(name);
|
|
45
|
+
if (!tool) {
|
|
46
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const result = await tool.handler(args || {});
|
|
50
|
+
return {
|
|
51
|
+
content: result.content,
|
|
52
|
+
isError: result.isError
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
57
|
+
return {
|
|
58
|
+
content: [{
|
|
59
|
+
type: 'text',
|
|
60
|
+
text: JSON.stringify({
|
|
61
|
+
success: false,
|
|
62
|
+
error: {
|
|
63
|
+
code: 'EXECUTION_ERROR',
|
|
64
|
+
message: `Tool execution failed: ${message}`
|
|
65
|
+
}
|
|
66
|
+
}, null, 2)
|
|
67
|
+
}],
|
|
68
|
+
isError: true
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return server;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Main entry point
|
|
76
|
+
*/
|
|
77
|
+
async function main() {
|
|
78
|
+
// Load and validate configuration
|
|
79
|
+
const config = (0, config_js_1.loadConfig)();
|
|
80
|
+
// Validate required configuration
|
|
81
|
+
if (!config.rocketchat.url) {
|
|
82
|
+
console.error('Error: ROCKETCHAT_URL environment variable is required');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
if (!config.rocketchat.authToken) {
|
|
86
|
+
console.error('Error: ROCKETCHAT_AUTH_TOKEN environment variable is required');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
if (!config.rocketchat.userId) {
|
|
90
|
+
console.error('Error: ROCKETCHAT_USER_ID environment variable is required');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
// Test connection
|
|
94
|
+
const client = (0, client_js_1.getClient)();
|
|
95
|
+
const connected = await client.testConnection();
|
|
96
|
+
if (!connected) {
|
|
97
|
+
console.error('Error: Failed to connect to Rocket.Chat server');
|
|
98
|
+
console.error(`URL: ${config.rocketchat.url}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
// Create and start server
|
|
102
|
+
const server = createServer();
|
|
103
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
104
|
+
console.error(`Starting ${SERVER_NAME} v${SERVER_VERSION}`);
|
|
105
|
+
console.error(`Connected to: ${config.rocketchat.url}`);
|
|
106
|
+
console.error(`Write operations: ${config.write.enabled ? 'enabled' : 'disabled'}`);
|
|
107
|
+
await server.connect(transport);
|
|
108
|
+
}
|
|
109
|
+
// Run the server
|
|
110
|
+
main().catch((error) => {
|
|
111
|
+
console.error('Fatal error:', error);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|