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,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Message Formatter
|
|
4
|
+
* Transforms Rocket.Chat API responses into MCP-friendly formats
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.formatMessage = formatMessage;
|
|
8
|
+
exports.formatMessages = formatMessages;
|
|
9
|
+
exports.formatChannel = formatChannel;
|
|
10
|
+
exports.formatChannels = formatChannels;
|
|
11
|
+
exports.formatThread = formatThread;
|
|
12
|
+
exports.formatThreads = formatThreads;
|
|
13
|
+
exports.formatUser = formatUser;
|
|
14
|
+
exports.formatUsers = formatUsers;
|
|
15
|
+
exports.formatThreadWithReplies = formatThreadWithReplies;
|
|
16
|
+
exports.createSearchSummary = createSearchSummary;
|
|
17
|
+
/**
|
|
18
|
+
* Format a single message for MCP response
|
|
19
|
+
* Supports both regular messages and search results with OpenSearch fields
|
|
20
|
+
*/
|
|
21
|
+
function formatMessage(msg) {
|
|
22
|
+
const searchMsg = msg;
|
|
23
|
+
const result = {
|
|
24
|
+
id: msg._id,
|
|
25
|
+
roomId: msg.rid,
|
|
26
|
+
text: msg.msg,
|
|
27
|
+
author: {
|
|
28
|
+
id: msg.u._id,
|
|
29
|
+
username: msg.u.username,
|
|
30
|
+
displayName: msg.u.name
|
|
31
|
+
},
|
|
32
|
+
timestamp: msg.ts,
|
|
33
|
+
threadId: msg.tmid,
|
|
34
|
+
replyCount: msg.tcount,
|
|
35
|
+
lastReplyAt: msg.tlm,
|
|
36
|
+
reactions: msg.reactions
|
|
37
|
+
? Object.fromEntries(Object.entries(msg.reactions).map(([emoji, data]) => [emoji, data.usernames.length]))
|
|
38
|
+
: undefined,
|
|
39
|
+
hasAttachments: (msg.attachments?.length || 0) > 0,
|
|
40
|
+
isPinned: msg.pinned || false
|
|
41
|
+
};
|
|
42
|
+
// Add OpenSearch fields if present
|
|
43
|
+
if (searchMsg._highlight) {
|
|
44
|
+
result.highlight = searchMsg._highlight;
|
|
45
|
+
}
|
|
46
|
+
if (searchMsg._score !== undefined) {
|
|
47
|
+
result.score = searchMsg._score;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Format multiple messages
|
|
53
|
+
*/
|
|
54
|
+
function formatMessages(messages) {
|
|
55
|
+
return messages.map(formatMessage);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Format a channel for MCP response
|
|
59
|
+
*/
|
|
60
|
+
function formatChannel(room) {
|
|
61
|
+
const typeMap = {
|
|
62
|
+
'c': 'public',
|
|
63
|
+
'p': 'private',
|
|
64
|
+
'd': 'direct',
|
|
65
|
+
'l': 'livechat'
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
id: room._id,
|
|
69
|
+
name: room.name || room._id,
|
|
70
|
+
displayName: room.fname,
|
|
71
|
+
type: typeMap[room.t] || 'public',
|
|
72
|
+
memberCount: room.usersCount,
|
|
73
|
+
messageCount: room.msgs,
|
|
74
|
+
topic: room.topic,
|
|
75
|
+
description: room.description,
|
|
76
|
+
isReadOnly: room.ro || false,
|
|
77
|
+
lastActivity: room._updatedAt
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format multiple channels
|
|
82
|
+
*/
|
|
83
|
+
function formatChannels(rooms) {
|
|
84
|
+
return rooms.map(formatChannel);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format a thread for MCP response
|
|
88
|
+
*/
|
|
89
|
+
function formatThread(msg, roomName) {
|
|
90
|
+
// Truncate title to first 100 characters
|
|
91
|
+
const title = msg.msg.length > 100
|
|
92
|
+
? msg.msg.substring(0, 100) + '...'
|
|
93
|
+
: msg.msg;
|
|
94
|
+
return {
|
|
95
|
+
id: msg._id,
|
|
96
|
+
roomId: msg.rid,
|
|
97
|
+
roomName,
|
|
98
|
+
title,
|
|
99
|
+
author: {
|
|
100
|
+
id: msg.u._id,
|
|
101
|
+
username: msg.u.username,
|
|
102
|
+
displayName: msg.u.name
|
|
103
|
+
},
|
|
104
|
+
createdAt: msg.ts,
|
|
105
|
+
replyCount: msg.tcount || 0,
|
|
106
|
+
lastReplyAt: msg.tlm || msg.ts,
|
|
107
|
+
participants: msg.replies || []
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Format multiple threads
|
|
112
|
+
*/
|
|
113
|
+
function formatThreads(messages, roomName) {
|
|
114
|
+
return messages.map(msg => formatThread(msg, roomName));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format a user for MCP response
|
|
118
|
+
*/
|
|
119
|
+
function formatUser(user) {
|
|
120
|
+
return {
|
|
121
|
+
id: user._id,
|
|
122
|
+
username: user.username,
|
|
123
|
+
displayName: user.name,
|
|
124
|
+
email: user.emails?.[0]?.address,
|
|
125
|
+
status: user.status || 'offline',
|
|
126
|
+
roles: user.roles || []
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Format multiple users
|
|
131
|
+
*/
|
|
132
|
+
function formatUsers(users) {
|
|
133
|
+
return users.map(formatUser);
|
|
134
|
+
}
|
|
135
|
+
function formatThreadWithReplies(parentMsg, replies, roomName) {
|
|
136
|
+
return {
|
|
137
|
+
thread: formatThread(parentMsg, roomName),
|
|
138
|
+
parentMessage: formatMessage(parentMsg),
|
|
139
|
+
replies: formatMessages(replies),
|
|
140
|
+
totalReplies: parentMsg.tcount || replies.length
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function createSearchSummary(query, messages, totalResults) {
|
|
144
|
+
const timestamps = messages.map(m => new Date(m.ts).getTime());
|
|
145
|
+
const threadIds = new Set(messages.filter(m => m.tmid).map(m => m.tmid));
|
|
146
|
+
const channelIds = new Set(messages.map(m => m.rid));
|
|
147
|
+
return {
|
|
148
|
+
query,
|
|
149
|
+
totalResults,
|
|
150
|
+
channels: channelIds.size,
|
|
151
|
+
threads: threadIds.size,
|
|
152
|
+
messages: messages.length,
|
|
153
|
+
timeRange: messages.length > 0
|
|
154
|
+
? {
|
|
155
|
+
oldest: new Date(Math.min(...timestamps)).toISOString(),
|
|
156
|
+
newest: new Date(Math.max(...timestamps)).toISOString()
|
|
157
|
+
}
|
|
158
|
+
: undefined
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=message-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-formatter.js","sourceRoot":"","sources":["../../src/formatters/message-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Builder
|
|
3
|
+
* Creates standardized MCP tool responses with consistent structure
|
|
4
|
+
*/
|
|
5
|
+
export interface McpToolResponse {
|
|
6
|
+
success: boolean;
|
|
7
|
+
data?: unknown;
|
|
8
|
+
error?: {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
details?: string;
|
|
12
|
+
suggestion?: string;
|
|
13
|
+
};
|
|
14
|
+
metadata?: {
|
|
15
|
+
count?: number;
|
|
16
|
+
total?: number;
|
|
17
|
+
offset?: number;
|
|
18
|
+
truncated?: boolean;
|
|
19
|
+
executionTime?: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build a successful response
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildSuccessResponse<T>(data: T, metadata?: McpToolResponse['metadata']): McpToolResponse;
|
|
26
|
+
/**
|
|
27
|
+
* Build a paginated success response
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildPaginatedResponse<T>(items: T[], total: number, offset: number, truncated?: boolean): McpToolResponse;
|
|
30
|
+
/**
|
|
31
|
+
* Build an error response following What-Why-How pattern
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildErrorResponse(code: string, what: string, why?: string, how?: string): McpToolResponse;
|
|
34
|
+
/**
|
|
35
|
+
* Common error responses
|
|
36
|
+
*/
|
|
37
|
+
export declare const CommonErrors: {
|
|
38
|
+
NOT_FOUND: (resource: string, identifier: string) => McpToolResponse;
|
|
39
|
+
UNAUTHORIZED: () => McpToolResponse;
|
|
40
|
+
FORBIDDEN: (action: string, resource: string) => McpToolResponse;
|
|
41
|
+
WRITE_DISABLED: () => McpToolResponse;
|
|
42
|
+
ROOM_NOT_WRITABLE: (roomId: string, whitelist: string[]) => McpToolResponse;
|
|
43
|
+
RATE_LIMITED: (retryAfter?: number) => McpToolResponse;
|
|
44
|
+
VALIDATION_ERROR: (field: string, requirement: string) => McpToolResponse;
|
|
45
|
+
API_ERROR: (statusCode: number, message: string) => McpToolResponse;
|
|
46
|
+
CONNECTION_ERROR: () => McpToolResponse;
|
|
47
|
+
TIMEOUT: () => McpToolResponse;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Serialize response to JSON string with token limiting
|
|
51
|
+
*/
|
|
52
|
+
export declare function serializeResponse(response: McpToolResponse): string;
|
|
53
|
+
/**
|
|
54
|
+
* Format response for MCP text content
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatAsTextContent(response: McpToolResponse): {
|
|
57
|
+
type: 'text';
|
|
58
|
+
text: string;
|
|
59
|
+
}[];
|
|
60
|
+
//# sourceMappingURL=response-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-builder.d.ts","sourceRoot":"","sources":["../../src/formatters/response-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACL;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAClC,IAAI,EAAE,CAAC,EACP,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,GACvC,eAAe,CAMjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACpC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,OAAe,GAC3B,eAAe,CAWjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACb,eAAe,CAUjB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;0BACC,MAAM,cAAc,MAAM;;wBAc5B,MAAM,YAAY,MAAM;;gCAchB,MAAM,aAAa,MAAM,EAAE;gCAS3B,MAAM;8BASR,MAAM,eAAe,MAAM;4BAO7B,MAAM,WAAW,MAAM;;;CAoBlD,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA+BnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAK/F"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Response Builder
|
|
4
|
+
* Creates standardized MCP tool responses with consistent structure
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.CommonErrors = void 0;
|
|
8
|
+
exports.buildSuccessResponse = buildSuccessResponse;
|
|
9
|
+
exports.buildPaginatedResponse = buildPaginatedResponse;
|
|
10
|
+
exports.buildErrorResponse = buildErrorResponse;
|
|
11
|
+
exports.serializeResponse = serializeResponse;
|
|
12
|
+
exports.formatAsTextContent = formatAsTextContent;
|
|
13
|
+
const token_counter_js_1 = require("../utils/token-counter.js");
|
|
14
|
+
/**
|
|
15
|
+
* Build a successful response
|
|
16
|
+
*/
|
|
17
|
+
function buildSuccessResponse(data, metadata) {
|
|
18
|
+
return {
|
|
19
|
+
success: true,
|
|
20
|
+
data,
|
|
21
|
+
metadata
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build a paginated success response
|
|
26
|
+
*/
|
|
27
|
+
function buildPaginatedResponse(items, total, offset, truncated = false) {
|
|
28
|
+
return {
|
|
29
|
+
success: true,
|
|
30
|
+
data: items,
|
|
31
|
+
metadata: {
|
|
32
|
+
count: items.length,
|
|
33
|
+
total,
|
|
34
|
+
offset,
|
|
35
|
+
truncated
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build an error response following What-Why-How pattern
|
|
41
|
+
*/
|
|
42
|
+
function buildErrorResponse(code, what, why, how) {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
error: {
|
|
46
|
+
code,
|
|
47
|
+
message: what,
|
|
48
|
+
details: why,
|
|
49
|
+
suggestion: how
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Common error responses
|
|
55
|
+
*/
|
|
56
|
+
exports.CommonErrors = {
|
|
57
|
+
NOT_FOUND: (resource, identifier) => buildErrorResponse('NOT_FOUND', `${resource} not found`, `No ${resource} with identifier "${identifier}" exists`, `Check the ${resource} ID or name and try again`),
|
|
58
|
+
UNAUTHORIZED: () => buildErrorResponse('UNAUTHORIZED', 'Authentication failed', 'Invalid or expired authentication token', 'Check ROCKETCHAT_AUTH_TOKEN and ROCKETCHAT_USER_ID environment variables'),
|
|
59
|
+
FORBIDDEN: (action, resource) => buildErrorResponse('FORBIDDEN', `Cannot ${action} ${resource}`, 'You do not have permission to perform this action', 'Request access from a channel administrator'),
|
|
60
|
+
WRITE_DISABLED: () => buildErrorResponse('WRITE_DISABLED', 'Write operations are disabled', 'The MCP server is configured in read-only mode', 'Set ROCKETCHAT_WRITE_ENABLED=true to enable write operations'),
|
|
61
|
+
ROOM_NOT_WRITABLE: (roomId, whitelist) => buildErrorResponse('ROOM_NOT_WRITABLE', 'Cannot write to this room', `Room "${roomId}" is not in the allowed write list`, whitelist.length > 0
|
|
62
|
+
? `Allowed rooms: ${whitelist.join(', ')}`
|
|
63
|
+
: 'Configure ROCKETCHAT_WRITE_ROOMS to allow write access'),
|
|
64
|
+
RATE_LIMITED: (retryAfter) => buildErrorResponse('RATE_LIMITED', 'Too many requests', 'The Rocket.Chat API rate limit has been exceeded', retryAfter
|
|
65
|
+
? `Wait ${retryAfter} seconds before retrying`
|
|
66
|
+
: 'Reduce request frequency and try again'),
|
|
67
|
+
VALIDATION_ERROR: (field, requirement) => buildErrorResponse('VALIDATION_ERROR', `Invalid parameter: ${field}`, requirement, `Provide a valid value for "${field}"`),
|
|
68
|
+
API_ERROR: (statusCode, message) => buildErrorResponse('API_ERROR', `Rocket.Chat API error (${statusCode})`, message, 'Check the Rocket.Chat server status and logs'),
|
|
69
|
+
CONNECTION_ERROR: () => buildErrorResponse('CONNECTION_ERROR', 'Cannot connect to Rocket.Chat server', 'The server may be down or the URL is incorrect', 'Verify ROCKETCHAT_URL and ensure the server is running'),
|
|
70
|
+
TIMEOUT: () => buildErrorResponse('TIMEOUT', 'Request timed out', 'The Rocket.Chat server took too long to respond', 'Try again with smaller limits or a more specific query')
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Serialize response to JSON string with token limiting
|
|
74
|
+
*/
|
|
75
|
+
function serializeResponse(response) {
|
|
76
|
+
const json = JSON.stringify(response, null, 2);
|
|
77
|
+
// Check if response exceeds token limit
|
|
78
|
+
if (token_counter_js_1.TokenCounter.wouldExceedLimit(json)) {
|
|
79
|
+
// If response is an array, truncate items
|
|
80
|
+
if (Array.isArray(response.data)) {
|
|
81
|
+
const { items, truncated } = token_counter_js_1.TokenCounter.truncateToFit(response.data, item => JSON.stringify(item));
|
|
82
|
+
const truncatedResponse = {
|
|
83
|
+
...response,
|
|
84
|
+
data: items,
|
|
85
|
+
metadata: {
|
|
86
|
+
...response.metadata,
|
|
87
|
+
truncated: truncated,
|
|
88
|
+
count: items.length
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return JSON.stringify(truncatedResponse, null, 2);
|
|
92
|
+
}
|
|
93
|
+
// For non-array data, truncate the JSON string
|
|
94
|
+
const { text } = token_counter_js_1.TokenCounter.truncateText(json);
|
|
95
|
+
return text;
|
|
96
|
+
}
|
|
97
|
+
return json;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format response for MCP text content
|
|
101
|
+
*/
|
|
102
|
+
function formatAsTextContent(response) {
|
|
103
|
+
return [{
|
|
104
|
+
type: 'text',
|
|
105
|
+
text: serializeResponse(response)
|
|
106
|
+
}];
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=response-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-builder.js","sourceRoot":"","sources":["../../src/formatters/response-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guards module - Security and access control
|
|
3
|
+
*/
|
|
4
|
+
export { WriteGuard, getWriteGuard, resetWriteGuard } from './write-guard.js';
|
|
5
|
+
export type { WriteCheckResult } from './write-guard.js';
|
|
6
|
+
export { MessageSanitizer, getSanitizer, resetSanitizer } from './sanitizer.js';
|
|
7
|
+
export type { SanitizeResult } from './sanitizer.js';
|
|
8
|
+
export { InputValidator, validateRoomId, validateMessageId, validateUserId, validateUsername, validateQuery, validateMessageText, validateEmoji, validateLimit, validateOffset, escapeHtml, MAX_LENGTHS } from './input-validator.js';
|
|
9
|
+
export type { ValidationResult } from './input-validator.js';
|
|
10
|
+
export { RateLimiter, RateLimiterManager, getRateLimiterManager, resetRateLimiterManager, checkRateLimit, checkApiRateLimit, checkWriteRateLimit, checkSearchRateLimit, DEFAULT_LIMITS } from './rate-limiter.js';
|
|
11
|
+
export type { RateLimitConfig, RateLimitResult } from './rate-limiter.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChF,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EACH,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Guards module - Security and access control
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_LIMITS = exports.checkSearchRateLimit = exports.checkWriteRateLimit = exports.checkApiRateLimit = exports.checkRateLimit = exports.resetRateLimiterManager = exports.getRateLimiterManager = exports.RateLimiterManager = exports.RateLimiter = exports.MAX_LENGTHS = exports.escapeHtml = exports.validateOffset = exports.validateLimit = exports.validateEmoji = exports.validateMessageText = exports.validateQuery = exports.validateUsername = exports.validateUserId = exports.validateMessageId = exports.validateRoomId = exports.InputValidator = exports.resetSanitizer = exports.getSanitizer = exports.MessageSanitizer = exports.resetWriteGuard = exports.getWriteGuard = exports.WriteGuard = void 0;
|
|
7
|
+
// Write guard
|
|
8
|
+
var write_guard_js_1 = require("./write-guard.js");
|
|
9
|
+
Object.defineProperty(exports, "WriteGuard", { enumerable: true, get: function () { return write_guard_js_1.WriteGuard; } });
|
|
10
|
+
Object.defineProperty(exports, "getWriteGuard", { enumerable: true, get: function () { return write_guard_js_1.getWriteGuard; } });
|
|
11
|
+
Object.defineProperty(exports, "resetWriteGuard", { enumerable: true, get: function () { return write_guard_js_1.resetWriteGuard; } });
|
|
12
|
+
// Message sanitizer
|
|
13
|
+
var sanitizer_js_1 = require("./sanitizer.js");
|
|
14
|
+
Object.defineProperty(exports, "MessageSanitizer", { enumerable: true, get: function () { return sanitizer_js_1.MessageSanitizer; } });
|
|
15
|
+
Object.defineProperty(exports, "getSanitizer", { enumerable: true, get: function () { return sanitizer_js_1.getSanitizer; } });
|
|
16
|
+
Object.defineProperty(exports, "resetSanitizer", { enumerable: true, get: function () { return sanitizer_js_1.resetSanitizer; } });
|
|
17
|
+
// Input validator
|
|
18
|
+
var input_validator_js_1 = require("./input-validator.js");
|
|
19
|
+
Object.defineProperty(exports, "InputValidator", { enumerable: true, get: function () { return input_validator_js_1.InputValidator; } });
|
|
20
|
+
Object.defineProperty(exports, "validateRoomId", { enumerable: true, get: function () { return input_validator_js_1.validateRoomId; } });
|
|
21
|
+
Object.defineProperty(exports, "validateMessageId", { enumerable: true, get: function () { return input_validator_js_1.validateMessageId; } });
|
|
22
|
+
Object.defineProperty(exports, "validateUserId", { enumerable: true, get: function () { return input_validator_js_1.validateUserId; } });
|
|
23
|
+
Object.defineProperty(exports, "validateUsername", { enumerable: true, get: function () { return input_validator_js_1.validateUsername; } });
|
|
24
|
+
Object.defineProperty(exports, "validateQuery", { enumerable: true, get: function () { return input_validator_js_1.validateQuery; } });
|
|
25
|
+
Object.defineProperty(exports, "validateMessageText", { enumerable: true, get: function () { return input_validator_js_1.validateMessageText; } });
|
|
26
|
+
Object.defineProperty(exports, "validateEmoji", { enumerable: true, get: function () { return input_validator_js_1.validateEmoji; } });
|
|
27
|
+
Object.defineProperty(exports, "validateLimit", { enumerable: true, get: function () { return input_validator_js_1.validateLimit; } });
|
|
28
|
+
Object.defineProperty(exports, "validateOffset", { enumerable: true, get: function () { return input_validator_js_1.validateOffset; } });
|
|
29
|
+
Object.defineProperty(exports, "escapeHtml", { enumerable: true, get: function () { return input_validator_js_1.escapeHtml; } });
|
|
30
|
+
Object.defineProperty(exports, "MAX_LENGTHS", { enumerable: true, get: function () { return input_validator_js_1.MAX_LENGTHS; } });
|
|
31
|
+
// Rate limiter
|
|
32
|
+
var rate_limiter_js_1 = require("./rate-limiter.js");
|
|
33
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return rate_limiter_js_1.RateLimiter; } });
|
|
34
|
+
Object.defineProperty(exports, "RateLimiterManager", { enumerable: true, get: function () { return rate_limiter_js_1.RateLimiterManager; } });
|
|
35
|
+
Object.defineProperty(exports, "getRateLimiterManager", { enumerable: true, get: function () { return rate_limiter_js_1.getRateLimiterManager; } });
|
|
36
|
+
Object.defineProperty(exports, "resetRateLimiterManager", { enumerable: true, get: function () { return rate_limiter_js_1.resetRateLimiterManager; } });
|
|
37
|
+
Object.defineProperty(exports, "checkRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkRateLimit; } });
|
|
38
|
+
Object.defineProperty(exports, "checkApiRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkApiRateLimit; } });
|
|
39
|
+
Object.defineProperty(exports, "checkWriteRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkWriteRateLimit; } });
|
|
40
|
+
Object.defineProperty(exports, "checkSearchRateLimit", { enumerable: true, get: function () { return rate_limiter_js_1.checkSearchRateLimit; } });
|
|
41
|
+
Object.defineProperty(exports, "DEFAULT_LIMITS", { enumerable: true, get: function () { return rate_limiter_js_1.DEFAULT_LIMITS; } });
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guards/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,cAAc;AACd,mDAA8E;AAArE,4GAAA,UAAU,OAAA;AAAE,+GAAA,aAAa,OAAA;AAAE,iHAAA,eAAe,OAAA;AAGnD,oBAAoB;AACpB,+CAAgF;AAAvE,gHAAA,gBAAgB,OAAA;AAAE,4GAAA,YAAY,OAAA;AAAE,8GAAA,cAAc,OAAA;AAGvD,kBAAkB;AAClB,2DAa8B;AAZ1B,oHAAA,cAAc,OAAA;AACd,oHAAA,cAAc,OAAA;AACd,uHAAA,iBAAiB,OAAA;AACjB,oHAAA,cAAc,OAAA;AACd,sHAAA,gBAAgB,OAAA;AAChB,mHAAA,aAAa,OAAA;AACb,yHAAA,mBAAmB,OAAA;AACnB,mHAAA,aAAa,OAAA;AACb,mHAAA,aAAa,OAAA;AACb,oHAAA,cAAc,OAAA;AACd,gHAAA,UAAU,OAAA;AACV,iHAAA,WAAW,OAAA;AAIf,eAAe;AACf,qDAU2B;AATvB,8GAAA,WAAW,OAAA;AACX,qHAAA,kBAAkB,OAAA;AAClB,wHAAA,qBAAqB,OAAA;AACrB,0HAAA,uBAAuB,OAAA;AACvB,iHAAA,cAAc,OAAA;AACd,oHAAA,iBAAiB,OAAA;AACjB,sHAAA,mBAAmB,OAAA;AACnB,uHAAA,oBAAoB,OAAA;AACpB,iHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Validator - Validates and sanitizes input parameters
|
|
3
|
+
* Provides defense against injection attacks and malformed input
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Validation result
|
|
7
|
+
*/
|
|
8
|
+
export interface ValidationResult {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
sanitized?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Maximum lengths for various input types
|
|
15
|
+
*/
|
|
16
|
+
export declare const MAX_LENGTHS: {
|
|
17
|
+
readonly roomId: 64;
|
|
18
|
+
readonly messageId: 64;
|
|
19
|
+
readonly threadId: 64;
|
|
20
|
+
readonly userId: 64;
|
|
21
|
+
readonly username: 128;
|
|
22
|
+
readonly query: 500;
|
|
23
|
+
readonly messageText: 10000;
|
|
24
|
+
readonly emoji: 64;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Input validator class
|
|
28
|
+
*/
|
|
29
|
+
export declare class InputValidator {
|
|
30
|
+
/**
|
|
31
|
+
* Validate a room ID
|
|
32
|
+
*/
|
|
33
|
+
static validateRoomId(roomId: unknown): ValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Validate a message ID
|
|
36
|
+
*/
|
|
37
|
+
static validateMessageId(messageId: unknown): ValidationResult;
|
|
38
|
+
/**
|
|
39
|
+
* Validate a user ID
|
|
40
|
+
*/
|
|
41
|
+
static validateUserId(userId: unknown): ValidationResult;
|
|
42
|
+
/**
|
|
43
|
+
* Validate a username
|
|
44
|
+
*/
|
|
45
|
+
static validateUsername(username: unknown): ValidationResult;
|
|
46
|
+
/**
|
|
47
|
+
* Validate a search query
|
|
48
|
+
*/
|
|
49
|
+
static validateQuery(query: unknown): ValidationResult;
|
|
50
|
+
/**
|
|
51
|
+
* Validate message text
|
|
52
|
+
*/
|
|
53
|
+
static validateMessageText(text: unknown): ValidationResult;
|
|
54
|
+
/**
|
|
55
|
+
* Validate an emoji
|
|
56
|
+
*/
|
|
57
|
+
static validateEmoji(emoji: unknown): ValidationResult;
|
|
58
|
+
/**
|
|
59
|
+
* Validate pagination limit
|
|
60
|
+
*/
|
|
61
|
+
static validateLimit(limit: unknown, min?: number, max?: number, defaultValue?: number): number;
|
|
62
|
+
/**
|
|
63
|
+
* Validate pagination offset
|
|
64
|
+
*/
|
|
65
|
+
static validateOffset(offset: unknown, defaultValue?: number): number;
|
|
66
|
+
/**
|
|
67
|
+
* Check if string contains dangerous patterns
|
|
68
|
+
*/
|
|
69
|
+
private static containsDangerousPattern;
|
|
70
|
+
/**
|
|
71
|
+
* Escape HTML entities for safe display
|
|
72
|
+
*/
|
|
73
|
+
static escapeHtml(text: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Validate and sanitize a generic string input
|
|
76
|
+
*/
|
|
77
|
+
static validateString(value: unknown, fieldName: string, maxLength: number, required?: boolean): ValidationResult;
|
|
78
|
+
}
|
|
79
|
+
export declare const validateRoomId: typeof InputValidator.validateRoomId;
|
|
80
|
+
export declare const validateMessageId: typeof InputValidator.validateMessageId;
|
|
81
|
+
export declare const validateUserId: typeof InputValidator.validateUserId;
|
|
82
|
+
export declare const validateUsername: typeof InputValidator.validateUsername;
|
|
83
|
+
export declare const validateQuery: typeof InputValidator.validateQuery;
|
|
84
|
+
export declare const validateMessageText: typeof InputValidator.validateMessageText;
|
|
85
|
+
export declare const validateEmoji: typeof InputValidator.validateEmoji;
|
|
86
|
+
export declare const validateLimit: typeof InputValidator.validateLimit;
|
|
87
|
+
export declare const validateOffset: typeof InputValidator.validateOffset;
|
|
88
|
+
export declare const escapeHtml: typeof InputValidator.escapeHtml;
|
|
89
|
+
//# sourceMappingURL=input-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validator.d.ts","sourceRoot":"","sources":["../../src/guards/input-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAoCX;;GAEG;AACH,qBAAa,cAAc;IACvB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;IAsBxD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB;IAoB9D;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;IAoBxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB;IAuB5D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAkBtD;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB;IAgB3D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB;IAsBtD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAI,EAAE,GAAG,SAAM,EAAE,YAAY,SAAK,GAAG,MAAM;IAanF;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,SAAI,GAAG,MAAM;IAahE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAIvC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWvC;;OAEG;IACH,MAAM,CAAC,cAAc,CACjB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,UAAO,GAChB,gBAAgB;CAwBtB;AAGD,eAAO,MAAM,cAAc,sCAAqD,CAAC;AACjF,eAAO,MAAM,iBAAiB,yCAAwD,CAAC;AACvF,eAAO,MAAM,cAAc,sCAAqD,CAAC;AACjF,eAAO,MAAM,gBAAgB,wCAAuD,CAAC;AACrF,eAAO,MAAM,aAAa,qCAAoD,CAAC;AAC/E,eAAO,MAAM,mBAAmB,2CAA0D,CAAC;AAC3F,eAAO,MAAM,aAAa,qCAAoD,CAAC;AAC/E,eAAO,MAAM,aAAa,qCAAoD,CAAC;AAC/E,eAAO,MAAM,cAAc,sCAAqD,CAAC;AACjF,eAAO,MAAM,UAAU,kCAAiD,CAAC"}
|