bn-slack-mcp-server 0.0.1
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/README.md +243 -0
- package/dist/debug-middleware.d.ts +12 -0
- package/dist/debug-middleware.d.ts.map +1 -0
- package/dist/debug-middleware.js +36 -0
- package/dist/debug-middleware.js.map +1 -0
- package/dist/helpers.d.ts +86 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +235 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +286 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +840 -0
- package/dist/schemas.js.map +1 -0
- package/dist/slack-api-client.d.ts +51 -0
- package/dist/slack-api-client.d.ts.map +1 -0
- package/dist/slack-api-client.js +227 -0
- package/dist/slack-api-client.js.map +1 -0
- package/dist/tool-loader.d.ts +35 -0
- package/dist/tool-loader.d.ts.map +1 -0
- package/dist/tool-loader.js +121 -0
- package/dist/tool-loader.js.map +1 -0
- package/dist/tool-registry.d.ts +44 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +56 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tools/cache.d.ts +69 -0
- package/dist/tools/cache.d.ts.map +1 -0
- package/dist/tools/cache.js +94 -0
- package/dist/tools/cache.js.map +1 -0
- package/dist/tools/channels.d.ts +76 -0
- package/dist/tools/channels.d.ts.map +1 -0
- package/dist/tools/channels.js +251 -0
- package/dist/tools/channels.js.map +1 -0
- package/dist/tools/conversations.d.ts +77 -0
- package/dist/tools/conversations.d.ts.map +1 -0
- package/dist/tools/conversations.js +302 -0
- package/dist/tools/conversations.js.map +1 -0
- package/dist/tools/files.d.ts +15 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +30 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/messages.d.ts +20 -0
- package/dist/tools/messages.d.ts.map +1 -0
- package/dist/tools/messages.js +40 -0
- package/dist/tools/messages.js.map +1 -0
- package/dist/tools/system.d.ts +48 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +124 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/tools/users.d.ts +69 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +179 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/tools/workspace.d.ts +50 -0
- package/dist/tools/workspace.d.ts.map +1 -0
- package/dist/tools/workspace.js +56 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
- package/tools.json +483 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack API Client
|
|
3
|
+
*
|
|
4
|
+
* Stateless HTTP client for Slack Web API with Bearer token authentication.
|
|
5
|
+
* Extracts token from Express request headers for per-request auth.
|
|
6
|
+
*/
|
|
7
|
+
import type { Request } from "express";
|
|
8
|
+
import type { SlackApiResponse, SlackUser, SlackChannel } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Extract Bearer token from request Authorization header
|
|
11
|
+
*/
|
|
12
|
+
export declare function getTokenFromRequest(req: Request): string;
|
|
13
|
+
/**
|
|
14
|
+
* Slack API client class with caching support
|
|
15
|
+
*/
|
|
16
|
+
export declare class SlackClient {
|
|
17
|
+
private token;
|
|
18
|
+
private headers;
|
|
19
|
+
usersCacheFile: string;
|
|
20
|
+
channelsCacheFile: string;
|
|
21
|
+
constructor(token: string);
|
|
22
|
+
/**
|
|
23
|
+
* Make GET request to Slack API
|
|
24
|
+
*/
|
|
25
|
+
makeRequest<T = SlackApiResponse>(endpoint: string, params?: Record<string, string | number | boolean>): Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Make POST request to Slack API
|
|
28
|
+
*/
|
|
29
|
+
postRequest<T = SlackApiResponse>(endpoint: string, body?: Record<string, unknown>): Promise<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Get users with caching support
|
|
32
|
+
*/
|
|
33
|
+
getCachedUsers(cacheDurationHours?: number): Promise<SlackUser[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Get channels with caching support and graceful permission handling
|
|
36
|
+
*/
|
|
37
|
+
getCachedChannels(cacheDurationHours?: number): Promise<SlackChannel[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve channel name/mention to channel ID
|
|
40
|
+
*/
|
|
41
|
+
resolveChannelId(channelInput: string): Promise<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve user name/mention to user ID
|
|
44
|
+
*/
|
|
45
|
+
resolveUserId(userInput: string): Promise<string>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get Slack client from Express request
|
|
49
|
+
*/
|
|
50
|
+
export declare function getSlackClient(req: Request): SlackClient;
|
|
51
|
+
//# sourceMappingURL=slack-api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-api-client.d.ts","sourceRoot":"","sources":["../src/slack-api-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM5E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQxD;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;gBAErB,KAAK,EAAE,MAAM;IAiBzB;;OAEG;IACG,WAAW,CAAC,CAAC,GAAG,gBAAgB,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAM,GACrD,OAAO,CAAC,CAAC,CAAC;IA8Bb;;OAEG;IACG,WAAW,CAAC,CAAC,GAAG,gBAAgB,EACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC;IAwBb;;OAEG;IACG,cAAc,CAAC,kBAAkB,SAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAqBnE;;OAEG;IACG,iBAAiB,CAAC,kBAAkB,SAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsCxE;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE7D;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA2BxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAGxD"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack API Client
|
|
3
|
+
*
|
|
4
|
+
* Stateless HTTP client for Slack Web API with Bearer token authentication.
|
|
5
|
+
* Extracts token from Express request headers for per-request auth.
|
|
6
|
+
*/
|
|
7
|
+
import { loadCache, saveCache, isCacheFresh, getCacheDir } from "./helpers.js";
|
|
8
|
+
import { resolve } from "path";
|
|
9
|
+
const SLACK_API_BASE = "https://slack.com/api";
|
|
10
|
+
/**
|
|
11
|
+
* Extract Bearer token from request Authorization header
|
|
12
|
+
*/
|
|
13
|
+
export function getTokenFromRequest(req) {
|
|
14
|
+
const authHeader = req.headers.authorization;
|
|
15
|
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
16
|
+
throw new Error("Authentication required. Please provide Authorization: Bearer <token> header");
|
|
17
|
+
}
|
|
18
|
+
return authHeader.slice(7);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Slack API client class with caching support
|
|
22
|
+
*/
|
|
23
|
+
export class SlackClient {
|
|
24
|
+
token;
|
|
25
|
+
headers;
|
|
26
|
+
usersCacheFile;
|
|
27
|
+
channelsCacheFile;
|
|
28
|
+
constructor(token) {
|
|
29
|
+
this.token = token;
|
|
30
|
+
this.headers = {
|
|
31
|
+
Authorization: `Bearer ${token}`,
|
|
32
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
33
|
+
};
|
|
34
|
+
// Cache configuration from environment variables with defaults
|
|
35
|
+
const cacheDir = getCacheDir();
|
|
36
|
+
this.usersCacheFile =
|
|
37
|
+
process.env.SLACK_MCP_USERS_CACHE ||
|
|
38
|
+
resolve(cacheDir, "users_cache.json");
|
|
39
|
+
this.channelsCacheFile =
|
|
40
|
+
process.env.SLACK_MCP_CHANNELS_CACHE ||
|
|
41
|
+
resolve(cacheDir, "channels_cache_v2.json");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Make GET request to Slack API
|
|
45
|
+
*/
|
|
46
|
+
async makeRequest(endpoint, params = {}) {
|
|
47
|
+
const url = new URL(`${SLACK_API_BASE}/${endpoint}`);
|
|
48
|
+
// Add query parameters
|
|
49
|
+
for (const [key, value] of Object.entries(params)) {
|
|
50
|
+
if (value !== undefined && value !== null) {
|
|
51
|
+
url.searchParams.append(key, String(value));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const response = await fetch(url.toString(), {
|
|
55
|
+
method: "GET",
|
|
56
|
+
headers: this.headers,
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
throw new Error(`Slack API error: ${response.status} - ${response.statusText}`);
|
|
60
|
+
}
|
|
61
|
+
const data = (await response.json());
|
|
62
|
+
if (!data.ok) {
|
|
63
|
+
throw new Error(`Slack API error: ${data.error || "Unknown error"}`);
|
|
64
|
+
}
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Make POST request to Slack API
|
|
69
|
+
*/
|
|
70
|
+
async postRequest(endpoint, body = {}) {
|
|
71
|
+
const url = `${SLACK_API_BASE}/${endpoint}`;
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: this.headers,
|
|
75
|
+
body: JSON.stringify(body),
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`Slack API error: ${response.status} - ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
const data = (await response.json());
|
|
81
|
+
if (!data.ok) {
|
|
82
|
+
throw new Error(`Slack API error: ${data.error || "Unknown error"}`);
|
|
83
|
+
}
|
|
84
|
+
return data;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get users with caching support
|
|
88
|
+
*/
|
|
89
|
+
async getCachedUsers(cacheDurationHours = 24) {
|
|
90
|
+
// Check if cache is fresh
|
|
91
|
+
if (isCacheFresh(this.usersCacheFile, cacheDurationHours)) {
|
|
92
|
+
const cached = loadCache(this.usersCacheFile);
|
|
93
|
+
if (cached) {
|
|
94
|
+
return cached;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Fetch fresh data from API
|
|
98
|
+
const data = await this.makeRequest("users.list", {
|
|
99
|
+
limit: 999,
|
|
100
|
+
});
|
|
101
|
+
const users = data.members || [];
|
|
102
|
+
// Save to cache
|
|
103
|
+
saveCache(this.usersCacheFile, users);
|
|
104
|
+
return users;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get channels with caching support and graceful permission handling
|
|
108
|
+
*/
|
|
109
|
+
async getCachedChannels(cacheDurationHours = 6) {
|
|
110
|
+
// Check if cache is fresh
|
|
111
|
+
if (isCacheFresh(this.channelsCacheFile, cacheDurationHours)) {
|
|
112
|
+
const cached = loadCache(this.channelsCacheFile);
|
|
113
|
+
if (cached) {
|
|
114
|
+
return cached;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Fetch fresh data from API for all channel types
|
|
118
|
+
const allChannels = [];
|
|
119
|
+
const channelTypes = ["public_channel", "private_channel", "im", "mpim"];
|
|
120
|
+
for (const channelType of channelTypes) {
|
|
121
|
+
try {
|
|
122
|
+
const data = await this.makeRequest("conversations.list", {
|
|
123
|
+
types: channelType,
|
|
124
|
+
limit: 999,
|
|
125
|
+
});
|
|
126
|
+
const channels = data.channels || [];
|
|
127
|
+
allChannels.push(...channels);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Skip channel types we don't have permission for
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Save to cache
|
|
135
|
+
if (allChannels.length > 0) {
|
|
136
|
+
saveCache(this.channelsCacheFile, allChannels);
|
|
137
|
+
}
|
|
138
|
+
return allChannels;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Resolve channel name/mention to channel ID
|
|
142
|
+
*/
|
|
143
|
+
async resolveChannelId(channelInput) {
|
|
144
|
+
// Return as-is if already a valid channel ID format
|
|
145
|
+
if (channelInput.startsWith("C") && channelInput.length === 11) {
|
|
146
|
+
return channelInput;
|
|
147
|
+
}
|
|
148
|
+
// Also accept D (DM) and G (group) IDs
|
|
149
|
+
if ((channelInput.startsWith("D") || channelInput.startsWith("G")) &&
|
|
150
|
+
channelInput.length === 11) {
|
|
151
|
+
return channelInput;
|
|
152
|
+
}
|
|
153
|
+
// Load cached channels
|
|
154
|
+
const channels = await this.getCachedChannels();
|
|
155
|
+
// Handle #channel format
|
|
156
|
+
if (channelInput.startsWith("#")) {
|
|
157
|
+
const channelName = channelInput.slice(1);
|
|
158
|
+
for (const channel of channels) {
|
|
159
|
+
if (channel.name === channelName) {
|
|
160
|
+
return channel.id;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Handle @user_dm format for direct messages
|
|
165
|
+
if (channelInput.startsWith("@")) {
|
|
166
|
+
const userName = channelInput
|
|
167
|
+
.slice(1)
|
|
168
|
+
.replace("_dm", "")
|
|
169
|
+
.replace("_group", "");
|
|
170
|
+
// For DMs, find the user and open a conversation
|
|
171
|
+
const users = await this.getCachedUsers();
|
|
172
|
+
for (const user of users) {
|
|
173
|
+
if (user.name === userName ||
|
|
174
|
+
user.profile?.display_name === userName ||
|
|
175
|
+
user.real_name === userName) {
|
|
176
|
+
try {
|
|
177
|
+
const dmData = await this.postRequest("conversations.open", { users: user.id });
|
|
178
|
+
return dmData.channel.id;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Try direct name match for channels
|
|
187
|
+
for (const channel of channels) {
|
|
188
|
+
if (channel.name === channelInput) {
|
|
189
|
+
return channel.id;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Return as-is if no resolution found
|
|
193
|
+
return channelInput;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Resolve user name/mention to user ID
|
|
197
|
+
*/
|
|
198
|
+
async resolveUserId(userInput) {
|
|
199
|
+
// Return as-is if already a valid user ID format
|
|
200
|
+
if (userInput.startsWith("U") && userInput.length === 11) {
|
|
201
|
+
return userInput;
|
|
202
|
+
}
|
|
203
|
+
// Load cached users
|
|
204
|
+
const users = await this.getCachedUsers();
|
|
205
|
+
// Handle @username format
|
|
206
|
+
const userName = userInput.startsWith("@") ? userInput.slice(1) : userInput;
|
|
207
|
+
// Search for user by various name fields
|
|
208
|
+
for (const user of users) {
|
|
209
|
+
if (user.name === userName ||
|
|
210
|
+
user.profile?.display_name === userName ||
|
|
211
|
+
user.real_name === userName ||
|
|
212
|
+
user.profile?.real_name === userName) {
|
|
213
|
+
return user.id;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Return as-is if no resolution found
|
|
217
|
+
return userInput;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get Slack client from Express request
|
|
222
|
+
*/
|
|
223
|
+
export function getSlackClient(req) {
|
|
224
|
+
const token = getTokenFromRequest(req);
|
|
225
|
+
return new SlackClient(token);
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=slack-api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-api-client.js","sourceRoot":"","sources":["../src/slack-api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool configuration loader
|
|
3
|
+
* Loads tool definitions from tools.json and validates them
|
|
4
|
+
*
|
|
5
|
+
* Supports loading from (in priority order):
|
|
6
|
+
* 1. Custom path via TOOLS_CONFIG_PATH environment variable
|
|
7
|
+
* 2. tools.json in current working directory (for development)
|
|
8
|
+
* 3. tools.json in package installation directory (for npx/installed usage)
|
|
9
|
+
*/
|
|
10
|
+
export interface ToolDefinition {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: string;
|
|
15
|
+
properties: Record<string, unknown>;
|
|
16
|
+
required?: string[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface ToolsConfig {
|
|
20
|
+
[toolName: string]: ToolDefinition;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load tool definitions from tools.json
|
|
24
|
+
* Uses caching in production, always reloads in development
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadToolDefinitions(forceReload?: boolean): ToolDefinition[];
|
|
27
|
+
/**
|
|
28
|
+
* Get a specific tool definition by name
|
|
29
|
+
*/
|
|
30
|
+
export declare function getToolDefinition(toolName: string): ToolDefinition | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Clear the tool cache (useful for testing or forced reloads)
|
|
33
|
+
*/
|
|
34
|
+
export declare function clearToolCache(): void;
|
|
35
|
+
//# sourceMappingURL=tool-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-loader.d.ts","sourceRoot":"","sources":["../src/tool-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC;CACpC;AAmDD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,UAAQ,GAAG,cAAc,EAAE,CAwDzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAG9E;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAIrC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool configuration loader
|
|
3
|
+
* Loads tool definitions from tools.json and validates them
|
|
4
|
+
*
|
|
5
|
+
* Supports loading from (in priority order):
|
|
6
|
+
* 1. Custom path via TOOLS_CONFIG_PATH environment variable
|
|
7
|
+
* 2. tools.json in current working directory (for development)
|
|
8
|
+
* 3. tools.json in package installation directory (for npx/installed usage)
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, existsSync } from "fs";
|
|
11
|
+
import { resolve, isAbsolute, dirname } from "path";
|
|
12
|
+
import { homedir } from "os";
|
|
13
|
+
import { fileURLToPath } from "url";
|
|
14
|
+
let cachedTools = null;
|
|
15
|
+
let lastLoadTime = 0;
|
|
16
|
+
let lastLoadPath = "";
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the tools configuration file path
|
|
19
|
+
* Supports:
|
|
20
|
+
* - Environment variable: TOOLS_CONFIG_PATH
|
|
21
|
+
* - Absolute paths: /Users/username/Desktop/tools.json
|
|
22
|
+
* - Relative paths: ./tools.json, ../config/tools.json
|
|
23
|
+
* - Home directory: ~/Desktop/tools.json
|
|
24
|
+
* - Default: tools.json in current working directory
|
|
25
|
+
* - Fallback: tools.json in package installation directory
|
|
26
|
+
*/
|
|
27
|
+
function resolveToolsPath() {
|
|
28
|
+
// Check environment variable first
|
|
29
|
+
const envPath = process.env.TOOLS_CONFIG_PATH;
|
|
30
|
+
if (envPath) {
|
|
31
|
+
// Expand ~ to home directory
|
|
32
|
+
const expandedPath = envPath.startsWith("~/")
|
|
33
|
+
? resolve(homedir(), envPath.slice(2))
|
|
34
|
+
: envPath;
|
|
35
|
+
// If absolute path, use as-is
|
|
36
|
+
if (isAbsolute(expandedPath)) {
|
|
37
|
+
return expandedPath;
|
|
38
|
+
}
|
|
39
|
+
// Otherwise resolve relative to current working directory
|
|
40
|
+
return resolve(process.cwd(), expandedPath);
|
|
41
|
+
}
|
|
42
|
+
// Try current working directory first (for dev mode)
|
|
43
|
+
const cwdPath = resolve(process.cwd(), "tools.json");
|
|
44
|
+
if (existsSync(cwdPath)) {
|
|
45
|
+
return cwdPath;
|
|
46
|
+
}
|
|
47
|
+
// Fallback: tools.json in package installation directory (for npx/installed usage)
|
|
48
|
+
// Get the directory of this module file
|
|
49
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
50
|
+
// Go up from dist/tool-loader.js to package root
|
|
51
|
+
const packageRoot = resolve(moduleDir, "..");
|
|
52
|
+
const packagePath = resolve(packageRoot, "tools.json");
|
|
53
|
+
return packagePath;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Load tool definitions from tools.json
|
|
57
|
+
* Uses caching in production, always reloads in development
|
|
58
|
+
*/
|
|
59
|
+
export function loadToolDefinitions(forceReload = false) {
|
|
60
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
// Get the tools config path
|
|
63
|
+
const toolsPath = resolveToolsPath();
|
|
64
|
+
// In production, cache tools and only reload if forced or path changed
|
|
65
|
+
// In development, reload every time (for nodemon compatibility)
|
|
66
|
+
if (!isDev && !forceReload && cachedTools && (now - lastLoadTime) < 60000 && lastLoadPath === toolsPath) {
|
|
67
|
+
return cachedTools;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
// Check if file exists
|
|
71
|
+
if (!existsSync(toolsPath)) {
|
|
72
|
+
throw new Error(`Tools configuration file not found: ${toolsPath}`);
|
|
73
|
+
}
|
|
74
|
+
const toolsJson = readFileSync(toolsPath, "utf-8");
|
|
75
|
+
const toolsConfig = JSON.parse(toolsJson);
|
|
76
|
+
// Convert config object to array of tool definitions
|
|
77
|
+
const tools = Object.values(toolsConfig);
|
|
78
|
+
// Validate tool definitions
|
|
79
|
+
for (const tool of tools) {
|
|
80
|
+
if (!tool.name || !tool.description || !tool.inputSchema) {
|
|
81
|
+
throw new Error(`Invalid tool definition: ${JSON.stringify(tool)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
cachedTools = tools;
|
|
85
|
+
lastLoadTime = now;
|
|
86
|
+
lastLoadPath = toolsPath;
|
|
87
|
+
console.log(`[Tool Loader] Loaded ${tools.length} tool definitions from: ${toolsPath}`);
|
|
88
|
+
if (isDev) {
|
|
89
|
+
console.log(`[Tool Loader] Development mode: tools will be reloaded on server restart`);
|
|
90
|
+
}
|
|
91
|
+
if (process.env.TOOLS_CONFIG_PATH) {
|
|
92
|
+
console.log(`[Tool Loader] Using custom config path from TOOLS_CONFIG_PATH`);
|
|
93
|
+
}
|
|
94
|
+
return tools;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error("[Tool Loader] Error loading tools.json:", error);
|
|
98
|
+
// In case of error, return cached tools if available
|
|
99
|
+
if (cachedTools) {
|
|
100
|
+
console.warn("[Tool Loader] Using cached tool definitions due to load error");
|
|
101
|
+
return cachedTools;
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Failed to load tool definitions: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get a specific tool definition by name
|
|
108
|
+
*/
|
|
109
|
+
export function getToolDefinition(toolName) {
|
|
110
|
+
const tools = loadToolDefinitions();
|
|
111
|
+
return tools.find(tool => tool.name === toolName);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Clear the tool cache (useful for testing or forced reloads)
|
|
115
|
+
*/
|
|
116
|
+
export function clearToolCache() {
|
|
117
|
+
cachedTools = null;
|
|
118
|
+
lastLoadTime = 0;
|
|
119
|
+
console.log("[Tool Loader] Tool cache cleared");
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=tool-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-loader.js","sourceRoot":"","sources":["../src/tool-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Request } from "express";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { ToolResponse } from "./types.js";
|
|
4
|
+
type ToolHandler = (req: Request, args: any) => Promise<any>;
|
|
5
|
+
type ToolSchema = z.ZodSchema<any>;
|
|
6
|
+
/**
|
|
7
|
+
* Registry for managing and executing MCP tools with automatic debug wrapping
|
|
8
|
+
*/
|
|
9
|
+
export declare class ToolRegistry {
|
|
10
|
+
private tools;
|
|
11
|
+
/**
|
|
12
|
+
* Register a new tool in the registry
|
|
13
|
+
*
|
|
14
|
+
* @param name - Unique name of the tool
|
|
15
|
+
* @param schema - Zod schema for validating tool input
|
|
16
|
+
* @param handler - Async function that executes the tool logic
|
|
17
|
+
*/
|
|
18
|
+
register(name: string, schema: ToolSchema, handler: ToolHandler): void;
|
|
19
|
+
/**
|
|
20
|
+
* Execute a tool by name with automatic validation and debug wrapping
|
|
21
|
+
*
|
|
22
|
+
* @param toolName - Name of the tool to execute
|
|
23
|
+
* @param rawInput - Raw input arguments (will be validated against schema)
|
|
24
|
+
* @param req - Express request object for accessing headers/context
|
|
25
|
+
* @returns ToolResponse with data and optional debug metadata
|
|
26
|
+
* @throws Error if tool is not found or validation fails
|
|
27
|
+
*/
|
|
28
|
+
execute(toolName: string, rawInput: unknown, req: Request): Promise<ToolResponse<any>>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a tool exists in the registry
|
|
31
|
+
*
|
|
32
|
+
* @param toolName - Name of the tool to check
|
|
33
|
+
* @returns True if the tool is registered
|
|
34
|
+
*/
|
|
35
|
+
has(toolName: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Get all registered tool names
|
|
38
|
+
*
|
|
39
|
+
* @returns Array of registered tool names
|
|
40
|
+
*/
|
|
41
|
+
getToolNames(): string[];
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE7D,KAAK,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAWnC;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAElD;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAItE;;;;;;;;OAQG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,OAAO,GAEX,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAc7B;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;OAIG;IACH,YAAY,IAAI,MAAM,EAAE;CAGzB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { wrapWithDebug } from "./debug-middleware.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry for managing and executing MCP tools with automatic debug wrapping
|
|
4
|
+
*/
|
|
5
|
+
export class ToolRegistry {
|
|
6
|
+
tools = new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Register a new tool in the registry
|
|
9
|
+
*
|
|
10
|
+
* @param name - Unique name of the tool
|
|
11
|
+
* @param schema - Zod schema for validating tool input
|
|
12
|
+
* @param handler - Async function that executes the tool logic
|
|
13
|
+
*/
|
|
14
|
+
register(name, schema, handler) {
|
|
15
|
+
this.tools.set(name, { name, schema, handler });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute a tool by name with automatic validation and debug wrapping
|
|
19
|
+
*
|
|
20
|
+
* @param toolName - Name of the tool to execute
|
|
21
|
+
* @param rawInput - Raw input arguments (will be validated against schema)
|
|
22
|
+
* @param req - Express request object for accessing headers/context
|
|
23
|
+
* @returns ToolResponse with data and optional debug metadata
|
|
24
|
+
* @throws Error if tool is not found or validation fails
|
|
25
|
+
*/
|
|
26
|
+
async execute(toolName, rawInput, req
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
) {
|
|
29
|
+
const tool = this.tools.get(toolName);
|
|
30
|
+
if (!tool) {
|
|
31
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
32
|
+
}
|
|
33
|
+
// Validate input against schema
|
|
34
|
+
const args = tool.schema.parse(rawInput);
|
|
35
|
+
// Execute with debug wrapping
|
|
36
|
+
return wrapWithDebug(toolName, args, () => tool.handler(req, args));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a tool exists in the registry
|
|
40
|
+
*
|
|
41
|
+
* @param toolName - Name of the tool to check
|
|
42
|
+
* @returns True if the tool is registered
|
|
43
|
+
*/
|
|
44
|
+
has(toolName) {
|
|
45
|
+
return this.tools.has(toolName);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all registered tool names
|
|
49
|
+
*
|
|
50
|
+
* @returns Array of registered tool names
|
|
51
|
+
*/
|
|
52
|
+
getToolNames() {
|
|
53
|
+
return Array.from(this.tools.keys());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAiBtD;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD;;;;;;OAMG;IACH,QAAQ,CAAC,IAAY,EAAE,MAAkB,EAAE,OAAoB;QAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,QAAiB,EACjB,GAAY;IACZ,8DAA8D;;QAE9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,gCAAgC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEzC,8BAA8B;QAC9B,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache tool handlers for Slack MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import type { Request } from "express";
|
|
5
|
+
import type { z } from "zod";
|
|
6
|
+
import type { InitializeCacheSchema, CacheInfoSchema, ClearCacheSchema } from "../schemas.js";
|
|
7
|
+
/**
|
|
8
|
+
* Initialize both user and channel caches by fetching fresh data
|
|
9
|
+
*/
|
|
10
|
+
export declare function initializeCache(req: Request, _args: z.infer<typeof InitializeCacheSchema>): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
message: string;
|
|
13
|
+
users_cache: {
|
|
14
|
+
path: string;
|
|
15
|
+
size_kb: number;
|
|
16
|
+
count: number;
|
|
17
|
+
};
|
|
18
|
+
channels_cache: {
|
|
19
|
+
path: string;
|
|
20
|
+
size_kb: number;
|
|
21
|
+
count: number;
|
|
22
|
+
};
|
|
23
|
+
total_cache_size_kb: number;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Get information about cache file locations, sizes, and last updated times
|
|
27
|
+
*/
|
|
28
|
+
export declare function cacheInfo(req: Request, _args: z.infer<typeof CacheInfoSchema>): Promise<{
|
|
29
|
+
success: boolean;
|
|
30
|
+
cache_directory: string;
|
|
31
|
+
users_cache: {
|
|
32
|
+
exists: boolean;
|
|
33
|
+
absolute_path: string;
|
|
34
|
+
size_bytes: number;
|
|
35
|
+
size_kb: number;
|
|
36
|
+
last_modified: string | null;
|
|
37
|
+
age_hours: number | null;
|
|
38
|
+
is_fresh: boolean;
|
|
39
|
+
configured_path: string;
|
|
40
|
+
};
|
|
41
|
+
channels_cache: {
|
|
42
|
+
exists: boolean;
|
|
43
|
+
absolute_path: string;
|
|
44
|
+
size_bytes: number;
|
|
45
|
+
size_kb: number;
|
|
46
|
+
last_modified: string | null;
|
|
47
|
+
age_hours: number | null;
|
|
48
|
+
is_fresh: boolean;
|
|
49
|
+
configured_path: string;
|
|
50
|
+
};
|
|
51
|
+
environment_variables: {
|
|
52
|
+
SLACK_MCP_USERS_CACHE: string;
|
|
53
|
+
SLACK_MCP_CHANNELS_CACHE: string;
|
|
54
|
+
};
|
|
55
|
+
recommendations: {
|
|
56
|
+
users_cache_fresh: boolean;
|
|
57
|
+
channels_cache_fresh: boolean;
|
|
58
|
+
total_cache_size_kb: number;
|
|
59
|
+
};
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Clear cache files to force refresh from Slack API
|
|
63
|
+
*/
|
|
64
|
+
export declare function clearCache(req: Request, args: z.infer<typeof ClearCacheSchema>): Promise<{
|
|
65
|
+
success: boolean;
|
|
66
|
+
cleared: string[];
|
|
67
|
+
message: string;
|
|
68
|
+
}>;
|
|
69
|
+
//# sourceMappingURL=cache.d.ts.map
|