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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +332 -0
  3. package/dist/api/client.d.ts +119 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +305 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/index.d.ts +6 -0
  8. package/dist/api/index.d.ts.map +1 -0
  9. package/dist/api/index.js +22 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/schemas.d.ts +10636 -0
  12. package/dist/api/schemas.d.ts.map +1 -0
  13. package/dist/api/schemas.js +267 -0
  14. package/dist/api/schemas.js.map +1 -0
  15. package/dist/api/types.d.ts +263 -0
  16. package/dist/api/types.d.ts.map +1 -0
  17. package/dist/api/types.js +7 -0
  18. package/dist/api/types.js.map +1 -0
  19. package/dist/config/config.d.ts +37 -0
  20. package/dist/config/config.d.ts.map +1 -0
  21. package/dist/config/config.js +79 -0
  22. package/dist/config/config.js.map +1 -0
  23. package/dist/config/index.d.ts +5 -0
  24. package/dist/config/index.d.ts.map +1 -0
  25. package/dist/config/index.js +21 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/di/container.d.ts +101 -0
  28. package/dist/di/container.d.ts.map +1 -0
  29. package/dist/di/container.js +214 -0
  30. package/dist/di/container.js.map +1 -0
  31. package/dist/di/index.d.ts +6 -0
  32. package/dist/di/index.d.ts.map +1 -0
  33. package/dist/di/index.js +12 -0
  34. package/dist/di/index.js.map +1 -0
  35. package/dist/formatters/index.d.ts +6 -0
  36. package/dist/formatters/index.d.ts.map +1 -0
  37. package/dist/formatters/index.js +22 -0
  38. package/dist/formatters/index.js.map +1 -0
  39. package/dist/formatters/message-formatter.d.ts +64 -0
  40. package/dist/formatters/message-formatter.d.ts.map +1 -0
  41. package/dist/formatters/message-formatter.js +161 -0
  42. package/dist/formatters/message-formatter.js.map +1 -0
  43. package/dist/formatters/response-builder.d.ts +60 -0
  44. package/dist/formatters/response-builder.d.ts.map +1 -0
  45. package/dist/formatters/response-builder.js +108 -0
  46. package/dist/formatters/response-builder.js.map +1 -0
  47. package/dist/guards/index.d.ts +12 -0
  48. package/dist/guards/index.d.ts.map +1 -0
  49. package/dist/guards/index.js +42 -0
  50. package/dist/guards/index.js.map +1 -0
  51. package/dist/guards/input-validator.d.ts +89 -0
  52. package/dist/guards/input-validator.d.ts.map +1 -0
  53. package/dist/guards/input-validator.js +266 -0
  54. package/dist/guards/input-validator.js.map +1 -0
  55. package/dist/guards/rate-limiter.d.ts +115 -0
  56. package/dist/guards/rate-limiter.d.ts.map +1 -0
  57. package/dist/guards/rate-limiter.js +226 -0
  58. package/dist/guards/rate-limiter.js.map +1 -0
  59. package/dist/guards/sanitizer.d.ts +35 -0
  60. package/dist/guards/sanitizer.d.ts.map +1 -0
  61. package/dist/guards/sanitizer.js +111 -0
  62. package/dist/guards/sanitizer.js.map +1 -0
  63. package/dist/guards/write-guard.d.ts +33 -0
  64. package/dist/guards/write-guard.d.ts.map +1 -0
  65. package/dist/guards/write-guard.js +90 -0
  66. package/dist/guards/write-guard.js.map +1 -0
  67. package/dist/http-server.d.ts +9 -0
  68. package/dist/http-server.d.ts.map +1 -0
  69. package/dist/http-server.js +190 -0
  70. package/dist/http-server.js.map +1 -0
  71. package/dist/index.d.ts +14 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +114 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/tools/base.d.ts +85 -0
  76. package/dist/tools/base.d.ts.map +1 -0
  77. package/dist/tools/base.js +184 -0
  78. package/dist/tools/base.js.map +1 -0
  79. package/dist/tools/channel-tools.d.ts +18 -0
  80. package/dist/tools/channel-tools.d.ts.map +1 -0
  81. package/dist/tools/channel-tools.js +151 -0
  82. package/dist/tools/channel-tools.js.map +1 -0
  83. package/dist/tools/handler-utils.d.ts +75 -0
  84. package/dist/tools/handler-utils.d.ts.map +1 -0
  85. package/dist/tools/handler-utils.js +105 -0
  86. package/dist/tools/handler-utils.js.map +1 -0
  87. package/dist/tools/index.d.ts +17 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +40 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/tools/message-tools.d.ts +20 -0
  92. package/dist/tools/message-tools.d.ts.map +1 -0
  93. package/dist/tools/message-tools.js +194 -0
  94. package/dist/tools/message-tools.js.map +1 -0
  95. package/dist/tools/thread-tools.d.ts +23 -0
  96. package/dist/tools/thread-tools.d.ts.map +1 -0
  97. package/dist/tools/thread-tools.js +243 -0
  98. package/dist/tools/thread-tools.js.map +1 -0
  99. package/dist/tools/user-tools.d.ts +14 -0
  100. package/dist/tools/user-tools.d.ts.map +1 -0
  101. package/dist/tools/user-tools.js +120 -0
  102. package/dist/tools/user-tools.js.map +1 -0
  103. package/dist/tools/write-tools.d.ts +15 -0
  104. package/dist/tools/write-tools.d.ts.map +1 -0
  105. package/dist/tools/write-tools.js +181 -0
  106. package/dist/tools/write-tools.js.map +1 -0
  107. package/dist/utils/cache.d.ts +47 -0
  108. package/dist/utils/cache.d.ts.map +1 -0
  109. package/dist/utils/cache.js +116 -0
  110. package/dist/utils/cache.js.map +1 -0
  111. package/dist/utils/error-handler.d.ts +64 -0
  112. package/dist/utils/error-handler.d.ts.map +1 -0
  113. package/dist/utils/error-handler.js +148 -0
  114. package/dist/utils/error-handler.js.map +1 -0
  115. package/dist/utils/index.d.ts +12 -0
  116. package/dist/utils/index.d.ts.map +1 -0
  117. package/dist/utils/index.js +33 -0
  118. package/dist/utils/index.js.map +1 -0
  119. package/dist/utils/logger.d.ts +50 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +118 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/dist/utils/time-parser.d.ts +37 -0
  124. package/dist/utils/time-parser.d.ts.map +1 -0
  125. package/dist/utils/time-parser.js +98 -0
  126. package/dist/utils/time-parser.js.map +1 -0
  127. package/dist/utils/token-counter.d.ts +42 -0
  128. package/dist/utils/token-counter.d.ts.map +1 -0
  129. package/dist/utils/token-counter.js +81 -0
  130. package/dist/utils/token-counter.js.map +1 -0
  131. package/package.json +68 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tool Registry Index
3
+ * Exports all tools and the registry
4
+ */
5
+ import './channel-tools.js';
6
+ import './message-tools.js';
7
+ import './thread-tools.js';
8
+ import './user-tools.js';
9
+ import './write-tools.js';
10
+ export { toolRegistry, createToolResult, createErrorResult } from './base.js';
11
+ export type { ToolDefinition, ToolResult } from './base.js';
12
+ export { listChannelsTool, searchChannelsTool, getChannelInfoTool } from './channel-tools.js';
13
+ export { getMessagesTool, searchMessagesTool, getMessageTool } from './message-tools.js';
14
+ export { listThreadsTool, getThreadTool, searchThreadsTool } from './thread-tools.js';
15
+ export { lookupUserTool, listUsersTool, getMeTool } from './user-tools.js';
16
+ export { sendMessageTool, reactTool, getWriteStatusTool } from './write-tools.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,iBAAiB,CAAC;AACzB,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9E,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Tool Registry Index
4
+ * Exports all tools and the registry
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getWriteStatusTool = exports.reactTool = exports.sendMessageTool = exports.getMeTool = exports.listUsersTool = exports.lookupUserTool = exports.searchThreadsTool = exports.getThreadTool = exports.listThreadsTool = exports.getMessageTool = exports.searchMessagesTool = exports.getMessagesTool = exports.getChannelInfoTool = exports.searchChannelsTool = exports.listChannelsTool = exports.createErrorResult = exports.createToolResult = exports.toolRegistry = void 0;
8
+ // Import all tool modules to register them
9
+ require("./channel-tools.js");
10
+ require("./message-tools.js");
11
+ require("./thread-tools.js");
12
+ require("./user-tools.js");
13
+ require("./write-tools.js");
14
+ // Re-export the registry and utilities
15
+ var base_js_1 = require("./base.js");
16
+ Object.defineProperty(exports, "toolRegistry", { enumerable: true, get: function () { return base_js_1.toolRegistry; } });
17
+ Object.defineProperty(exports, "createToolResult", { enumerable: true, get: function () { return base_js_1.createToolResult; } });
18
+ Object.defineProperty(exports, "createErrorResult", { enumerable: true, get: function () { return base_js_1.createErrorResult; } });
19
+ // Export individual tools for direct access if needed
20
+ var channel_tools_js_1 = require("./channel-tools.js");
21
+ Object.defineProperty(exports, "listChannelsTool", { enumerable: true, get: function () { return channel_tools_js_1.listChannelsTool; } });
22
+ Object.defineProperty(exports, "searchChannelsTool", { enumerable: true, get: function () { return channel_tools_js_1.searchChannelsTool; } });
23
+ Object.defineProperty(exports, "getChannelInfoTool", { enumerable: true, get: function () { return channel_tools_js_1.getChannelInfoTool; } });
24
+ var message_tools_js_1 = require("./message-tools.js");
25
+ Object.defineProperty(exports, "getMessagesTool", { enumerable: true, get: function () { return message_tools_js_1.getMessagesTool; } });
26
+ Object.defineProperty(exports, "searchMessagesTool", { enumerable: true, get: function () { return message_tools_js_1.searchMessagesTool; } });
27
+ Object.defineProperty(exports, "getMessageTool", { enumerable: true, get: function () { return message_tools_js_1.getMessageTool; } });
28
+ var thread_tools_js_1 = require("./thread-tools.js");
29
+ Object.defineProperty(exports, "listThreadsTool", { enumerable: true, get: function () { return thread_tools_js_1.listThreadsTool; } });
30
+ Object.defineProperty(exports, "getThreadTool", { enumerable: true, get: function () { return thread_tools_js_1.getThreadTool; } });
31
+ Object.defineProperty(exports, "searchThreadsTool", { enumerable: true, get: function () { return thread_tools_js_1.searchThreadsTool; } });
32
+ var user_tools_js_1 = require("./user-tools.js");
33
+ Object.defineProperty(exports, "lookupUserTool", { enumerable: true, get: function () { return user_tools_js_1.lookupUserTool; } });
34
+ Object.defineProperty(exports, "listUsersTool", { enumerable: true, get: function () { return user_tools_js_1.listUsersTool; } });
35
+ Object.defineProperty(exports, "getMeTool", { enumerable: true, get: function () { return user_tools_js_1.getMeTool; } });
36
+ var write_tools_js_1 = require("./write-tools.js");
37
+ Object.defineProperty(exports, "sendMessageTool", { enumerable: true, get: function () { return write_tools_js_1.sendMessageTool; } });
38
+ Object.defineProperty(exports, "reactTool", { enumerable: true, get: function () { return write_tools_js_1.reactTool; } });
39
+ Object.defineProperty(exports, "getWriteStatusTool", { enumerable: true, get: function () { return write_tools_js_1.getWriteStatusTool; } });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2CAA2C;AAC3C,8BAA4B;AAC5B,8BAA4B;AAC5B,6BAA2B;AAC3B,2BAAyB;AACzB,4BAA0B;AAE1B,uCAAuC;AACvC,qCAA8E;AAArE,uGAAA,YAAY,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAG1D,sDAAsD;AACtD,uDAA8F;AAArF,oHAAA,gBAAgB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AACjE,uDAAyF;AAAhF,mHAAA,eAAe,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAAE,kHAAA,cAAc,OAAA;AAC5D,qDAAsF;AAA7E,kHAAA,eAAe,OAAA;AAAE,gHAAA,aAAa,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAC1D,iDAA2E;AAAlE,+GAAA,cAAc,OAAA;AAAE,8GAAA,aAAa,OAAA;AAAE,0GAAA,SAAS,OAAA;AACjD,mDAAkF;AAAzE,iHAAA,eAAe,OAAA;AAAE,2GAAA,SAAS,OAAA;AAAE,oHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Message Tools
3
+ * Tools for reading and searching messages
4
+ */
5
+ export declare const getMessagesTool: import("./base.js").ToolDefinition<{
6
+ roomId: string;
7
+ offset?: number | undefined;
8
+ limit?: number | undefined;
9
+ timeRange?: string | undefined;
10
+ }>;
11
+ export declare const searchMessagesTool: import("./base.js").ToolDefinition<{
12
+ query: string;
13
+ offset?: number | undefined;
14
+ roomId?: string | undefined;
15
+ limit?: number | undefined;
16
+ }>;
17
+ export declare const getMessageTool: import("./base.js").ToolDefinition<{
18
+ messageId: string;
19
+ }>;
20
+ //# sourceMappingURL=message-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tools.d.ts","sourceRoot":"","sources":["../../src/tools/message-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmCH,eAAO,MAAM,eAAe;;;;;EAiE3B,CAAC;AAiBF,eAAO,MAAM,kBAAkB;;;;;EAkE9B,CAAC;AAWF,eAAO,MAAM,cAAc;;EA6B1B,CAAC"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * Message Tools
4
+ * Tools for reading and searching messages
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getMessageTool = exports.searchMessagesTool = exports.getMessagesTool = void 0;
8
+ const zod_1 = require("zod");
9
+ const client_js_1 = require("../api/client.js");
10
+ const message_formatter_js_1 = require("../formatters/message-formatter.js");
11
+ const response_builder_js_1 = require("../formatters/response-builder.js");
12
+ const token_counter_js_1 = require("../utils/token-counter.js");
13
+ const time_parser_js_1 = require("../utils/time-parser.js");
14
+ const logger_js_1 = require("../utils/logger.js");
15
+ const base_js_1 = require("./base.js");
16
+ const logger = (0, logger_js_1.getLogger)('MessageTools');
17
+ /**
18
+ * rocketchat_get_messages
19
+ * Get messages from a channel with optional time filtering
20
+ */
21
+ const getMessagesSchema = zod_1.z.object({
22
+ roomId: zod_1.z.string()
23
+ .describe('Channel/room ID to get messages from'),
24
+ limit: zod_1.z.number().min(1).max(100).default(50).optional()
25
+ .describe('Maximum number of messages to return (1-100, default: 50)'),
26
+ offset: zod_1.z.number().min(0).default(0).optional()
27
+ .describe('Number of messages to skip for pagination'),
28
+ timeRange: zod_1.z.string().optional()
29
+ .describe('Time filter: relative (1d, 7d, 1w, 1m), ISO date (2024-01-15), or "oldest" for oldest first')
30
+ });
31
+ exports.getMessagesTool = (0, base_js_1.defineTool)('rocketchat_get_messages', `Get messages from a Rocket.Chat channel.
32
+
33
+ Returns message information including:
34
+ - Message ID, text, and author
35
+ - Timestamp and edit history
36
+ - Thread information (if part of a thread)
37
+ - Reactions and attachments
38
+ - Pinned status
39
+
40
+ Time filtering options:
41
+ - Relative: "1d" (1 day), "7d" (7 days), "1w" (1 week), "1m" (1 month)
42
+ - ISO date: "2024-01-15" (from that date to now)
43
+ - Unix timestamp: "1705276800"
44
+
45
+ Examples:
46
+ - Recent messages: { "roomId": "GENERAL" }
47
+ - Last 24 hours: { "roomId": "GENERAL", "timeRange": "1d" }
48
+ - Last week: { "roomId": "GENERAL", "timeRange": "1w", "limit": 100 }`, getMessagesSchema, async (params) => {
49
+ try {
50
+ const client = (0, client_js_1.getClient)();
51
+ const limit = params.limit || 50;
52
+ const offset = params.offset || 0;
53
+ // Build query with time filter if provided
54
+ let query;
55
+ if (params.timeRange) {
56
+ try {
57
+ const range = (0, time_parser_js_1.parseTimeExpression)(params.timeRange);
58
+ query = {
59
+ ts: {
60
+ $gte: range.start.toISOString(),
61
+ $lte: range.end.toISOString()
62
+ }
63
+ };
64
+ }
65
+ catch (error) {
66
+ // Invalid time expression, log and continue without filter
67
+ logger.debug('Invalid time expression, ignoring filter', { timeRange: params.timeRange, error });
68
+ }
69
+ }
70
+ const response = await client.getMessages({
71
+ roomId: params.roomId,
72
+ count: limit,
73
+ offset,
74
+ query,
75
+ sort: { ts: -1 } // Newest first
76
+ });
77
+ if (!response.success) {
78
+ return (0, base_js_1.createErrorResult)(base_js_1.ErrorCodes.API_ERROR, 'Failed to get messages');
79
+ }
80
+ const formatted = (0, message_formatter_js_1.formatMessages)(response.messages);
81
+ const { items, truncated } = token_counter_js_1.TokenCounter.truncateToFit(formatted);
82
+ const result = (0, response_builder_js_1.buildPaginatedResponse)(items, response.total, offset, truncated);
83
+ return (0, base_js_1.createToolResult)(result);
84
+ }
85
+ catch (error) {
86
+ return (0, base_js_1.createErrorResultFromException)(base_js_1.ErrorCodes.API_ERROR, 'Failed to get messages', error);
87
+ }
88
+ });
89
+ /**
90
+ * rocketchat_search_messages
91
+ * Search messages across channels (global search supported with OpenSearch)
92
+ */
93
+ const searchMessagesSchema = zod_1.z.object({
94
+ query: zod_1.z.string().min(1)
95
+ .describe('Search text to find in messages'),
96
+ roomId: zod_1.z.string().optional()
97
+ .describe('Channel/room ID to search in. If omitted, searches globally across all accessible channels (requires OpenSearch integration)'),
98
+ limit: zod_1.z.number().min(1).max(100).default(50).optional()
99
+ .describe('Maximum number of results (1-100, default: 50)'),
100
+ offset: zod_1.z.number().min(0).default(0).optional()
101
+ .describe('Number of results to skip for pagination')
102
+ });
103
+ exports.searchMessagesTool = (0, base_js_1.defineTool)('rocketchat_search_messages', `Search for messages containing specific text in a channel.
104
+
105
+ This searches message content (parent messages only, not thread replies).
106
+ For searching within threads, use rocketchat_search_threads instead.
107
+
108
+ **OpenSearch Dependency:**
109
+ - WITH roomId: Works on all servers (uses RocketChat native search)
110
+ - WITHOUT roomId (global search): REQUIRES OpenSearch integration
111
+ - If global search fails, add roomId parameter and retry
112
+
113
+ Returns:
114
+ - Search summary (query, total results, time range)
115
+ - Matching messages with full details
116
+ - Thread IDs for messages that are thread parents
117
+ - Highlighted text snippets (when OpenSearch is available)
118
+
119
+ **When to use which tool:**
120
+ - rocketchat_search_messages: Find messages by keyword (fast, single messages)
121
+ - rocketchat_search_threads: Find discussions/decisions (searches replies too)
122
+ - rocketchat_get_messages: Browse recent messages chronologically
123
+
124
+ **Error Handling:**
125
+ - If "roomId required" error: Server lacks OpenSearch, provide roomId
126
+ - If empty results: Try broader search terms or different channel
127
+
128
+ Examples:
129
+ - Channel-specific (always works): { "query": "API integration", "roomId": "GENERAL" }
130
+ - Global search (needs OpenSearch): { "query": "authentication" }
131
+ - Find decisions: { "query": "decision", "roomId": "project-alpha" }`, searchMessagesSchema, async (params) => {
132
+ try {
133
+ const client = (0, client_js_1.getClient)();
134
+ const limit = params.limit || 50;
135
+ const offset = params.offset || 0;
136
+ const response = await client.searchMessages({
137
+ roomId: params.roomId,
138
+ searchText: params.query,
139
+ count: limit,
140
+ offset
141
+ });
142
+ if (!response.success) {
143
+ return (0, base_js_1.createErrorResult)(base_js_1.ErrorCodes.API_ERROR, 'Failed to search messages');
144
+ }
145
+ const formatted = (0, message_formatter_js_1.formatMessages)(response.messages);
146
+ const { items, truncated } = token_counter_js_1.TokenCounter.truncateToFit(formatted);
147
+ const summary = (0, message_formatter_js_1.createSearchSummary)(params.query, response.messages, response.total);
148
+ const result = (0, response_builder_js_1.buildSuccessResponse)({
149
+ summary,
150
+ messages: items
151
+ }, {
152
+ count: items.length,
153
+ total: response.total,
154
+ truncated
155
+ });
156
+ return (0, base_js_1.createToolResult)(result);
157
+ }
158
+ catch (error) {
159
+ return (0, base_js_1.createErrorResultFromException)(base_js_1.ErrorCodes.API_ERROR, 'Failed to search messages', error);
160
+ }
161
+ });
162
+ /**
163
+ * rocketchat_get_message
164
+ * Get a specific message by ID
165
+ */
166
+ const getMessageSchema = zod_1.z.object({
167
+ messageId: zod_1.z.string()
168
+ .describe('Message ID to retrieve')
169
+ });
170
+ exports.getMessageTool = (0, base_js_1.defineTool)('rocketchat_get_message', `Get a specific message by its ID.
171
+
172
+ Use this to retrieve full details of a message when you have its ID.
173
+
174
+ Examples:
175
+ - Get message: { "messageId": "abc123xyz" }`, getMessageSchema, async (params) => {
176
+ try {
177
+ const client = (0, client_js_1.getClient)();
178
+ const response = await client.getMessage(params.messageId);
179
+ if (!response.success) {
180
+ return (0, base_js_1.createErrorResult)(base_js_1.ErrorCodes.NOT_FOUND, 'Message not found', `No message found with ID "${params.messageId}"`);
181
+ }
182
+ const formatted = (0, message_formatter_js_1.formatMessages)([response.message])[0];
183
+ const result = (0, response_builder_js_1.buildSuccessResponse)(formatted);
184
+ return (0, base_js_1.createToolResult)(result);
185
+ }
186
+ catch (error) {
187
+ return (0, base_js_1.createErrorResultFromException)(base_js_1.ErrorCodes.API_ERROR, 'Failed to get message', error);
188
+ }
189
+ });
190
+ // Register tools
191
+ base_js_1.toolRegistry.register(exports.getMessagesTool);
192
+ base_js_1.toolRegistry.register(exports.searchMessagesTool);
193
+ base_js_1.toolRegistry.register(exports.getMessageTool);
194
+ //# sourceMappingURL=message-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-tools.js","sourceRoot":"","sources":["../../src/tools/message-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Thread Tools
3
+ * Tools for listing, searching, and reading threads
4
+ * Threads are the primary unit for organizational knowledge retrieval
5
+ */
6
+ export declare const listThreadsTool: import("./base.js").ToolDefinition<{
7
+ roomId: string;
8
+ offset?: number | undefined;
9
+ limit?: number | undefined;
10
+ timeRange?: string | undefined;
11
+ }>;
12
+ export declare const getThreadTool: import("./base.js").ToolDefinition<{
13
+ threadId: string;
14
+ offset?: number | undefined;
15
+ limit?: number | undefined;
16
+ }>;
17
+ export declare const searchThreadsTool: import("./base.js").ToolDefinition<{
18
+ roomId: string;
19
+ query: string;
20
+ limit?: number | undefined;
21
+ includeReplies?: boolean | undefined;
22
+ }>;
23
+ //# sourceMappingURL=thread-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-tools.d.ts","sourceRoot":"","sources":["../../src/tools/thread-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmCH,eAAO,MAAM,eAAe;;;;;EAsD3B,CAAC;AAeF,eAAO,MAAM,aAAa;;;;EA8DzB,CAAC;AAkBF,eAAO,MAAM,iBAAiB;;;;;EAqG7B,CAAC"}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ /**
3
+ * Thread Tools
4
+ * Tools for listing, searching, and reading threads
5
+ * Threads are the primary unit for organizational knowledge retrieval
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.searchThreadsTool = exports.getThreadTool = exports.listThreadsTool = void 0;
9
+ const zod_1 = require("zod");
10
+ const client_js_1 = require("../api/client.js");
11
+ const message_formatter_js_1 = require("../formatters/message-formatter.js");
12
+ const response_builder_js_1 = require("../formatters/response-builder.js");
13
+ const token_counter_js_1 = require("../utils/token-counter.js");
14
+ const time_parser_js_1 = require("../utils/time-parser.js");
15
+ const logger_js_1 = require("../utils/logger.js");
16
+ const base_js_1 = require("./base.js");
17
+ const logger = (0, logger_js_1.getLogger)('ThreadTools');
18
+ /**
19
+ * rocketchat_list_threads
20
+ * List all threads in a channel
21
+ */
22
+ const listThreadsSchema = zod_1.z.object({
23
+ roomId: zod_1.z.string()
24
+ .describe('Channel/room ID to list threads from'),
25
+ limit: zod_1.z.number().min(1).max(100).default(50).optional()
26
+ .describe('Maximum number of threads to return (1-100, default: 50)'),
27
+ offset: zod_1.z.number().min(0).default(0).optional()
28
+ .describe('Number of threads to skip for pagination'),
29
+ timeRange: zod_1.z.string().optional()
30
+ .describe('Time filter: relative (1d, 7d, 1w, 1m) or ISO date')
31
+ });
32
+ exports.listThreadsTool = (0, base_js_1.defineTool)('rocketchat_list_threads', `List all threads in a Rocket.Chat channel.
33
+
34
+ Returns thread information including:
35
+ - Thread ID (same as parent message ID)
36
+ - Title (first message text, truncated)
37
+ - Author and creation time
38
+ - Reply count and last reply time
39
+ - Participant user IDs
40
+
41
+ Use this to discover discussions in a channel before diving into details.
42
+
43
+ Examples:
44
+ - List all threads: { "roomId": "GENERAL" }
45
+ - Recent threads: { "roomId": "GENERAL", "timeRange": "7d" }
46
+ - Paginate: { "roomId": "GENERAL", "limit": 20, "offset": 20 }`, listThreadsSchema, async (params) => {
47
+ try {
48
+ const client = (0, client_js_1.getClient)();
49
+ const limit = params.limit || 50;
50
+ const offset = params.offset || 0;
51
+ const response = await client.listThreads(params.roomId, limit, offset);
52
+ if (!response.success) {
53
+ return (0, base_js_1.createErrorResult)(base_js_1.ErrorCodes.API_ERROR, 'Failed to list threads');
54
+ }
55
+ // Filter by time range if specified
56
+ let threads = response.threads;
57
+ if (params.timeRange) {
58
+ try {
59
+ const range = (0, time_parser_js_1.parseTimeExpression)(params.timeRange);
60
+ threads = threads.filter(t => {
61
+ const threadTime = new Date(t.ts).getTime();
62
+ return threadTime >= range.start.getTime() && threadTime <= range.end.getTime();
63
+ });
64
+ }
65
+ catch (error) {
66
+ // Invalid time expression, log and ignore
67
+ logger.debug('Invalid time expression, ignoring filter', { timeRange: params.timeRange, error });
68
+ }
69
+ }
70
+ const formatted = (0, message_formatter_js_1.formatThreads)(threads);
71
+ const { items, truncated } = token_counter_js_1.TokenCounter.truncateToFit(formatted);
72
+ const result = (0, response_builder_js_1.buildPaginatedResponse)(items, response.total, offset, truncated);
73
+ return (0, base_js_1.createToolResult)(result);
74
+ }
75
+ catch (error) {
76
+ return (0, base_js_1.createErrorResultFromException)(base_js_1.ErrorCodes.API_ERROR, 'Failed to list threads', error);
77
+ }
78
+ });
79
+ /**
80
+ * rocketchat_get_thread
81
+ * Get a thread with all its replies
82
+ */
83
+ const getThreadSchema = zod_1.z.object({
84
+ threadId: zod_1.z.string()
85
+ .describe('Thread ID (parent message ID, tmid)'),
86
+ limit: zod_1.z.number().min(1).max(100).default(50).optional()
87
+ .describe('Maximum number of replies to return (1-100, default: 50)'),
88
+ offset: zod_1.z.number().min(0).default(0).optional()
89
+ .describe('Number of replies to skip for pagination')
90
+ });
91
+ exports.getThreadTool = (0, base_js_1.defineTool)('rocketchat_get_thread', `Get a thread with all its replies.
92
+
93
+ Returns complete thread information:
94
+ - Thread metadata (ID, title, author, timestamps)
95
+ - Parent message with full details
96
+ - All reply messages in chronological order
97
+ - Participant information
98
+
99
+ This is the primary tool for reading organizational discussions, agreements, and decisions.
100
+
101
+ Examples:
102
+ - Get full thread: { "threadId": "abc123xyz" }
103
+ - Get with pagination: { "threadId": "abc123xyz", "limit": 100 }`, getThreadSchema, async (params) => {
104
+ try {
105
+ const client = (0, client_js_1.getClient)();
106
+ const limit = params.limit || 50;
107
+ const offset = params.offset || 0;
108
+ // Get thread parent message
109
+ const parentResponse = await client.getThreadParent(params.threadId);
110
+ if (!parentResponse.success) {
111
+ return (0, base_js_1.createErrorResult)(base_js_1.ErrorCodes.NOT_FOUND, 'Thread not found', `No thread found with ID "${params.threadId}"`);
112
+ }
113
+ // Get thread replies
114
+ const repliesResponse = await client.getThreadMessages({
115
+ tmid: params.threadId,
116
+ count: limit,
117
+ offset
118
+ });
119
+ const formatted = (0, message_formatter_js_1.formatThreadWithReplies)(parentResponse.message, repliesResponse.messages || []);
120
+ // Truncate if needed
121
+ const { items: truncatedReplies, truncated } = token_counter_js_1.TokenCounter.truncateToFit(formatted.replies);
122
+ const result = (0, response_builder_js_1.buildSuccessResponse)({
123
+ ...formatted,
124
+ replies: truncatedReplies
125
+ }, {
126
+ count: truncatedReplies.length,
127
+ total: formatted.totalReplies,
128
+ offset,
129
+ truncated
130
+ });
131
+ return (0, base_js_1.createToolResult)(result);
132
+ }
133
+ catch (error) {
134
+ return (0, base_js_1.createErrorResultFromException)(base_js_1.ErrorCodes.API_ERROR, 'Failed to get thread', error);
135
+ }
136
+ });
137
+ /**
138
+ * rocketchat_search_threads
139
+ * Search for threads containing specific text (searches both parent and replies)
140
+ * This is a key differentiator from standard Slack MCPs
141
+ */
142
+ const searchThreadsSchema = zod_1.z.object({
143
+ query: zod_1.z.string().min(1)
144
+ .describe('Search text to find in thread content (parent and replies)'),
145
+ roomId: zod_1.z.string()
146
+ .describe('Channel/room ID to search in'),
147
+ limit: zod_1.z.number().min(1).max(50).default(20).optional()
148
+ .describe('Maximum number of threads to return (1-50, default: 20)'),
149
+ includeReplies: zod_1.z.boolean().default(true).optional()
150
+ .describe('Whether to search within thread replies (default: true)')
151
+ });
152
+ exports.searchThreadsTool = (0, base_js_1.defineTool)('rocketchat_search_threads', `Search for threads containing specific text.
153
+
154
+ IMPORTANT: Unlike basic message search, this tool searches BOTH parent messages AND replies within threads. This is essential for finding organizational knowledge that may be discussed in thread replies.
155
+
156
+ Returns:
157
+ - Thread ID and title
158
+ - Where the match was found (parent or reply)
159
+ - Match count within the thread
160
+ - Reply count and participants
161
+
162
+ Use cases:
163
+ - Finding discussions: "Find threads about API authentication"
164
+ - Finding decisions: "Server migration decisions"
165
+ - Finding agreements: "API spec agreements"
166
+
167
+ Examples:
168
+ - Search discussions: { "query": "deployment", "roomId": "GENERAL" }
169
+ - Search with more results: { "query": "migration", "roomId": "dev-team", "limit": 50 }`, searchThreadsSchema, async (params) => {
170
+ try {
171
+ const client = (0, client_js_1.getClient)();
172
+ const limit = params.limit || 20;
173
+ // Search in main messages first
174
+ const searchResponse = await client.searchMessages({
175
+ roomId: params.roomId,
176
+ searchText: params.query,
177
+ count: 100 // Get more to filter threads
178
+ });
179
+ if (!searchResponse.success) {
180
+ return (0, base_js_1.createErrorResult)(base_js_1.ErrorCodes.API_ERROR, 'Failed to search threads');
181
+ }
182
+ // Collect unique thread IDs (messages with tcount > 0 or with tmid)
183
+ const threadMap = new Map();
184
+ for (const msg of searchResponse.messages) {
185
+ if (msg.tcount && msg.tcount > 0) {
186
+ // This is a thread parent
187
+ const existing = threadMap.get(msg._id);
188
+ threadMap.set(msg._id, {
189
+ parentId: msg._id,
190
+ matchedIn: 'parent',
191
+ matchCount: (existing?.matchCount || 0) + 1
192
+ });
193
+ }
194
+ else if (msg.tmid) {
195
+ // This is a thread reply
196
+ const existing = threadMap.get(msg.tmid);
197
+ threadMap.set(msg.tmid, {
198
+ parentId: msg.tmid,
199
+ matchedIn: existing?.matchedIn === 'parent' ? 'parent' : 'reply',
200
+ matchCount: (existing?.matchCount || 0) + 1
201
+ });
202
+ }
203
+ }
204
+ // Fetch thread details for found threads
205
+ const threadResults = [];
206
+ const threadIds = Array.from(threadMap.keys()).slice(0, limit);
207
+ for (const threadId of threadIds) {
208
+ try {
209
+ const parentResponse = await client.getThreadParent(threadId);
210
+ if (parentResponse.success) {
211
+ const info = threadMap.get(threadId);
212
+ threadResults.push({
213
+ ...(0, message_formatter_js_1.formatThreads)([parentResponse.message])[0],
214
+ matchedIn: info.matchedIn,
215
+ matchCount: info.matchCount
216
+ });
217
+ }
218
+ }
219
+ catch (error) {
220
+ // Skip threads we can't access, but log for debugging
221
+ logger.debug('Failed to fetch thread, skipping', { threadId, error });
222
+ }
223
+ }
224
+ const { items, truncated } = token_counter_js_1.TokenCounter.truncateToFit(threadResults);
225
+ const result = (0, response_builder_js_1.buildSuccessResponse)({
226
+ query: params.query,
227
+ threads: items
228
+ }, {
229
+ count: items.length,
230
+ total: threadMap.size,
231
+ truncated
232
+ });
233
+ return (0, base_js_1.createToolResult)(result);
234
+ }
235
+ catch (error) {
236
+ return (0, base_js_1.createErrorResultFromException)(base_js_1.ErrorCodes.API_ERROR, 'Failed to search threads', error);
237
+ }
238
+ });
239
+ // Register tools
240
+ base_js_1.toolRegistry.register(exports.listThreadsTool);
241
+ base_js_1.toolRegistry.register(exports.getThreadTool);
242
+ base_js_1.toolRegistry.register(exports.searchThreadsTool);
243
+ //# sourceMappingURL=thread-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-tools.js","sourceRoot":"","sources":["../../src/tools/thread-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * User Tools
3
+ * Tools for looking up user information
4
+ */
5
+ export declare const lookupUserTool: import("./base.js").ToolDefinition<{
6
+ userId?: string | undefined;
7
+ username?: string | undefined;
8
+ }>;
9
+ export declare const listUsersTool: import("./base.js").ToolDefinition<{
10
+ offset?: number | undefined;
11
+ limit?: number | undefined;
12
+ }>;
13
+ export declare const getMeTool: import("./base.js").ToolDefinition<{}>;
14
+ //# sourceMappingURL=user-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-tools.d.ts","sourceRoot":"","sources":["../../src/tools/user-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH,eAAO,MAAM,cAAc;;;EA8C1B,CAAC;AAaF,eAAO,MAAM,aAAa;;;EAgCzB,CAAC;AAQF,eAAO,MAAM,SAAS,wCAyBrB,CAAC"}