@chaaskit/server 0.1.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 (189) hide show
  1. package/dist/api/admin.js +438 -0
  2. package/dist/api/admin.js.map +1 -0
  3. package/dist/api/agents.js +21 -0
  4. package/dist/api/agents.js.map +1 -0
  5. package/dist/api/api-keys.js +122 -0
  6. package/dist/api/api-keys.js.map +1 -0
  7. package/dist/api/auth.js +399 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/chat.js +900 -0
  10. package/dist/api/chat.js.map +1 -0
  11. package/dist/api/config.js +91 -0
  12. package/dist/api/config.js.map +1 -0
  13. package/dist/api/documents.js +237 -0
  14. package/dist/api/documents.js.map +1 -0
  15. package/dist/api/export.js +107 -0
  16. package/dist/api/export.js.map +1 -0
  17. package/dist/api/health.js +25 -0
  18. package/dist/api/health.js.map +1 -0
  19. package/dist/api/mcp-server.js +84 -0
  20. package/dist/api/mcp-server.js.map +1 -0
  21. package/dist/api/mcp.js +400 -0
  22. package/dist/api/mcp.js.map +1 -0
  23. package/dist/api/mentions.js +94 -0
  24. package/dist/api/mentions.js.map +1 -0
  25. package/dist/api/oauth.js +366 -0
  26. package/dist/api/oauth.js.map +1 -0
  27. package/dist/api/payments.js +473 -0
  28. package/dist/api/payments.js.map +1 -0
  29. package/dist/api/projects.js +301 -0
  30. package/dist/api/projects.js.map +1 -0
  31. package/dist/api/scheduled-prompts.js +617 -0
  32. package/dist/api/scheduled-prompts.js.map +1 -0
  33. package/dist/api/search.js +85 -0
  34. package/dist/api/search.js.map +1 -0
  35. package/dist/api/share.js +188 -0
  36. package/dist/api/share.js.map +1 -0
  37. package/dist/api/slack.js +468 -0
  38. package/dist/api/slack.js.map +1 -0
  39. package/dist/api/teams.js +693 -0
  40. package/dist/api/teams.js.map +1 -0
  41. package/dist/api/templates.js +134 -0
  42. package/dist/api/templates.js.map +1 -0
  43. package/dist/api/threads.js +323 -0
  44. package/dist/api/threads.js.map +1 -0
  45. package/dist/api/upload.js +57 -0
  46. package/dist/api/upload.js.map +1 -0
  47. package/dist/api/user.js +111 -0
  48. package/dist/api/user.js.map +1 -0
  49. package/dist/api/v1/openai.js +245 -0
  50. package/dist/api/v1/openai.js.map +1 -0
  51. package/dist/app.js +168 -0
  52. package/dist/app.js.map +1 -0
  53. package/dist/bin/cli.js +57 -0
  54. package/dist/bin/cli.js.map +1 -0
  55. package/dist/commands/db-sync.js +108 -0
  56. package/dist/commands/db-sync.js.map +1 -0
  57. package/dist/config/loader.js +374 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/documents/extractors.js +136 -0
  60. package/dist/documents/extractors.js.map +1 -0
  61. package/dist/extensions/glob.js +53 -0
  62. package/dist/extensions/glob.js.map +1 -0
  63. package/dist/extensions/loader.js +72 -0
  64. package/dist/extensions/loader.js.map +1 -0
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/loaders/index.js +75 -0
  68. package/dist/loaders/index.js.map +1 -0
  69. package/dist/mcp/client.js +551 -0
  70. package/dist/mcp/client.js.map +1 -0
  71. package/dist/mcp/server.js +335 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/middleware/apiKeyAuth.js +136 -0
  74. package/dist/middleware/apiKeyAuth.js.map +1 -0
  75. package/dist/middleware/auth.js +192 -0
  76. package/dist/middleware/auth.js.map +1 -0
  77. package/dist/middleware/errorHandler.js +41 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/mcpServerAuth.js +164 -0
  80. package/dist/middleware/mcpServerAuth.js.map +1 -0
  81. package/dist/middleware/requestLogger.js +9 -0
  82. package/dist/middleware/requestLogger.js.map +1 -0
  83. package/dist/middleware/team.js +132 -0
  84. package/dist/middleware/team.js.map +1 -0
  85. package/dist/oauth/server.js +410 -0
  86. package/dist/oauth/server.js.map +1 -0
  87. package/dist/queue/cli.js +93 -0
  88. package/dist/queue/cli.js.map +1 -0
  89. package/dist/queue/handlers/index.js +91 -0
  90. package/dist/queue/handlers/index.js.map +1 -0
  91. package/dist/queue/handlers/scheduled-prompt.js +270 -0
  92. package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
  93. package/dist/queue/index.js +91 -0
  94. package/dist/queue/index.js.map +1 -0
  95. package/dist/queue/providers/memory.js +296 -0
  96. package/dist/queue/providers/memory.js.map +1 -0
  97. package/dist/queue/providers/sqs.js +275 -0
  98. package/dist/queue/providers/sqs.js.map +1 -0
  99. package/dist/queue/scheduler.js +355 -0
  100. package/dist/queue/scheduler.js.map +1 -0
  101. package/dist/queue/types.js +5 -0
  102. package/dist/queue/types.js.map +1 -0
  103. package/dist/queue/worker.js +230 -0
  104. package/dist/queue/worker.js.map +1 -0
  105. package/dist/registry/index.js +40 -0
  106. package/dist/registry/index.js.map +1 -0
  107. package/dist/server.js +207 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/services/agent.js +530 -0
  110. package/dist/services/agent.js.map +1 -0
  111. package/dist/services/agents.js +194 -0
  112. package/dist/services/agents.js.map +1 -0
  113. package/dist/services/documents.js +507 -0
  114. package/dist/services/documents.js.map +1 -0
  115. package/dist/services/email/index.js +91 -0
  116. package/dist/services/email/index.js.map +1 -0
  117. package/dist/services/email/providers/ses.js +97 -0
  118. package/dist/services/email/providers/ses.js.map +1 -0
  119. package/dist/services/email/templates.js +194 -0
  120. package/dist/services/email/templates.js.map +1 -0
  121. package/dist/services/email/types.js +5 -0
  122. package/dist/services/email/types.js.map +1 -0
  123. package/dist/services/encryption.js +69 -0
  124. package/dist/services/encryption.js.map +1 -0
  125. package/dist/services/oauth-discovery.js +226 -0
  126. package/dist/services/oauth-discovery.js.map +1 -0
  127. package/dist/services/pendingConfirmation.js +105 -0
  128. package/dist/services/pendingConfirmation.js.map +1 -0
  129. package/dist/services/scheduledPrompts.js +70 -0
  130. package/dist/services/scheduledPrompts.js.map +1 -0
  131. package/dist/services/slack/client.js +174 -0
  132. package/dist/services/slack/client.js.map +1 -0
  133. package/dist/services/slack/events.js +189 -0
  134. package/dist/services/slack/events.js.map +1 -0
  135. package/dist/services/slack/index.js +6 -0
  136. package/dist/services/slack/index.js.map +1 -0
  137. package/dist/services/slack/notifications.js +124 -0
  138. package/dist/services/slack/notifications.js.map +1 -0
  139. package/dist/services/slack/signature.js +74 -0
  140. package/dist/services/slack/signature.js.map +1 -0
  141. package/dist/services/slack/thread-context.js +191 -0
  142. package/dist/services/slack/thread-context.js.map +1 -0
  143. package/dist/services/toolConfirmation.js +55 -0
  144. package/dist/services/toolConfirmation.js.map +1 -0
  145. package/dist/services/usage.js +241 -0
  146. package/dist/services/usage.js.map +1 -0
  147. package/dist/ssr/build.js +90 -0
  148. package/dist/ssr/build.js.map +1 -0
  149. package/dist/ssr/components/SSRMessageList.js +120 -0
  150. package/dist/ssr/components/SSRMessageList.js.map +1 -0
  151. package/dist/ssr/entry.client.js +8 -0
  152. package/dist/ssr/entry.client.js.map +1 -0
  153. package/dist/ssr/entry.server.js +71 -0
  154. package/dist/ssr/entry.server.js.map +1 -0
  155. package/dist/ssr/handler.js +51 -0
  156. package/dist/ssr/handler.js.map +1 -0
  157. package/dist/ssr/root.js +184 -0
  158. package/dist/ssr/root.js.map +1 -0
  159. package/dist/ssr/routes/login.js +140 -0
  160. package/dist/ssr/routes/login.js.map +1 -0
  161. package/dist/ssr/routes/pricing.js +195 -0
  162. package/dist/ssr/routes/pricing.js.map +1 -0
  163. package/dist/ssr/routes/privacy.js +39 -0
  164. package/dist/ssr/routes/privacy.js.map +1 -0
  165. package/dist/ssr/routes/register.js +148 -0
  166. package/dist/ssr/routes/register.js.map +1 -0
  167. package/dist/ssr/routes/shared.$shareId.js +153 -0
  168. package/dist/ssr/routes/shared.$shareId.js.map +1 -0
  169. package/dist/ssr/routes/terms.js +39 -0
  170. package/dist/ssr/routes/terms.js.map +1 -0
  171. package/dist/storage/index.js +43 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/providers/database.js +38 -0
  174. package/dist/storage/providers/database.js.map +1 -0
  175. package/dist/storage/providers/filesystem.js +51 -0
  176. package/dist/storage/providers/filesystem.js.map +1 -0
  177. package/dist/storage/types.js +2 -0
  178. package/dist/storage/types.js.map +1 -0
  179. package/dist/tools/documents.js +336 -0
  180. package/dist/tools/documents.js.map +1 -0
  181. package/dist/tools/get-plan-usage.js +82 -0
  182. package/dist/tools/get-plan-usage.js.map +1 -0
  183. package/dist/tools/index.js +106 -0
  184. package/dist/tools/index.js.map +1 -0
  185. package/dist/tools/types.js +2 -0
  186. package/dist/tools/types.js.map +1 -0
  187. package/dist/tools/web-scrape.js +145 -0
  188. package/dist/tools/web-scrape.js.map +1 -0
  189. package/package.json +93 -0
@@ -0,0 +1,551 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
4
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
5
+ import { spawn } from 'child_process';
6
+ import { db } from '@chaaskit/db';
7
+ import { decryptCredential, isTokenExpired, } from '../services/encryption.js';
8
+ // Cache expiration for user clients (5 minutes)
9
+ const USER_CLIENT_TTL_MS = 5 * 60 * 1000;
10
+ class MCPClientManager {
11
+ // Global clients for stdio/admin servers
12
+ globalClients = new Map();
13
+ // Per-user clients for user-credential servers
14
+ // Key format: `${userId}:${serverId}`
15
+ userClients = new Map();
16
+ // Cleanup interval handle
17
+ cleanupInterval = null;
18
+ constructor() {
19
+ // Start cleanup interval
20
+ this.cleanupInterval = setInterval(() => this.cleanupStaleClients(), 60000);
21
+ }
22
+ // Clean up stale user clients
23
+ cleanupStaleClients() {
24
+ const now = Date.now();
25
+ for (const [key, managedClient] of this.userClients) {
26
+ if (now - managedClient.lastUsed > USER_CLIENT_TTL_MS) {
27
+ console.log(`[MCP] Cleaning up stale user client: ${key}`);
28
+ this.disconnectUserClient(key);
29
+ }
30
+ }
31
+ }
32
+ async disconnectUserClient(key) {
33
+ const managedClient = this.userClients.get(key);
34
+ if (managedClient) {
35
+ try {
36
+ await managedClient.client.close();
37
+ }
38
+ catch (error) {
39
+ console.error(`[MCP] Error closing user client ${key}:`, error);
40
+ }
41
+ this.userClients.delete(key);
42
+ }
43
+ }
44
+ async connect(serverConfig) {
45
+ if (this.globalClients.has(serverConfig.id)) {
46
+ return; // Already connected
47
+ }
48
+ const managedClient = await this.createClient(serverConfig);
49
+ this.globalClients.set(serverConfig.id, managedClient);
50
+ }
51
+ async disconnect(serverId) {
52
+ const managedClient = this.globalClients.get(serverId);
53
+ if (managedClient) {
54
+ try {
55
+ await managedClient.client.close();
56
+ }
57
+ catch (error) {
58
+ console.error(`[MCP] Error closing client for ${serverId}:`, error);
59
+ }
60
+ // Kill child process if stdio transport
61
+ if (managedClient.childProcess) {
62
+ managedClient.childProcess.kill();
63
+ }
64
+ this.globalClients.delete(serverId);
65
+ }
66
+ }
67
+ // Disconnect a user's client for a specific server (e.g., after credential change)
68
+ async disconnectUser(userId, serverId) {
69
+ const key = `${userId}:${serverId}`;
70
+ await this.disconnectUserClient(key);
71
+ }
72
+ isConnected(serverId) {
73
+ return this.globalClients.has(serverId);
74
+ }
75
+ async listTools(serverId) {
76
+ const managedClient = this.globalClients.get(serverId);
77
+ if (!managedClient) {
78
+ throw new Error(`Server ${serverId} not connected`);
79
+ }
80
+ return managedClient.tools;
81
+ }
82
+ async listAllTools() {
83
+ const allTools = [];
84
+ for (const [serverId, managedClient] of this.globalClients) {
85
+ for (const tool of managedClient.tools) {
86
+ allTools.push({ ...tool, serverId });
87
+ }
88
+ }
89
+ return allTools;
90
+ }
91
+ // Get or list all tools available to a user (including user-credential servers)
92
+ async listAllToolsForUser(userId, serverConfigs) {
93
+ const allTools = [];
94
+ console.log(`[MCP] listAllToolsForUser: userId=${userId || 'anonymous'}, ${serverConfigs.length} server configs`);
95
+ for (const config of serverConfigs) {
96
+ if (!config.enabled) {
97
+ console.log(`[MCP] - ${config.name} (${config.id}): SKIPPED (disabled)`);
98
+ continue;
99
+ }
100
+ const authMode = config.authMode || 'none';
101
+ // For none/admin auth modes, use global client
102
+ if (authMode === 'none' || authMode === 'admin') {
103
+ const managedClient = this.globalClients.get(config.id);
104
+ if (managedClient) {
105
+ console.log(`[MCP] - ${config.name} (${config.id}): ${managedClient.tools.length} tools from global client`);
106
+ for (const tool of managedClient.tools) {
107
+ allTools.push({ ...tool, serverId: config.id });
108
+ }
109
+ }
110
+ else {
111
+ console.log(`[MCP] - ${config.name} (${config.id}): NO global client connected`);
112
+ }
113
+ continue;
114
+ }
115
+ // For user-apikey/user-oauth, check if user has credential and try to get client
116
+ if (userId && (authMode === 'user-apikey' || authMode === 'user-oauth')) {
117
+ try {
118
+ const managedClient = await this.getClientForUser(config.id, userId, config);
119
+ if (managedClient) {
120
+ console.log(`[MCP] - ${config.name} (${config.id}): ${managedClient.tools.length} tools from user client`);
121
+ for (const tool of managedClient.tools) {
122
+ allTools.push({ ...tool, serverId: config.id });
123
+ }
124
+ }
125
+ else {
126
+ console.log(`[MCP] - ${config.name} (${config.id}): NO user credentials`);
127
+ }
128
+ }
129
+ catch (error) {
130
+ console.log(`[MCP] - ${config.name} (${config.id}): ERROR - ${error instanceof Error ? error.message : error}`);
131
+ }
132
+ }
133
+ else if (!userId) {
134
+ console.log(`[MCP] - ${config.name} (${config.id}): SKIPPED (requires user auth, no userId)`);
135
+ }
136
+ }
137
+ console.log(`[MCP] Total tools available: ${allTools.length}`);
138
+ if (allTools.length > 0) {
139
+ console.log(`[MCP] Tool names: ${allTools.map(t => `${t.serverId}:${t.name}`).join(', ')}`);
140
+ }
141
+ return allTools;
142
+ }
143
+ async callTool(serverId, toolName, args) {
144
+ const managedClient = this.globalClients.get(serverId);
145
+ if (!managedClient) {
146
+ throw new Error(`Server ${serverId} not connected`);
147
+ }
148
+ return this.executeToolCall(managedClient, serverId, toolName, args);
149
+ }
150
+ // Call a tool with user context (handles user-credential servers)
151
+ async callToolForUser(userId, serverId, toolName, args, config) {
152
+ const authMode = config.authMode || 'none';
153
+ // For none/admin auth modes, use global client
154
+ if (authMode === 'none' || authMode === 'admin') {
155
+ return this.callTool(serverId, toolName, args);
156
+ }
157
+ // For user-credential modes, get user-specific client
158
+ if (!userId) {
159
+ return {
160
+ content: [{ type: 'text', text: 'Authentication required for this tool' }],
161
+ isError: true,
162
+ };
163
+ }
164
+ try {
165
+ const managedClient = await this.getClientForUser(serverId, userId, config);
166
+ if (!managedClient) {
167
+ return {
168
+ content: [{ type: 'text', text: 'Please configure your credentials for this server in Settings' }],
169
+ isError: true,
170
+ };
171
+ }
172
+ return this.executeToolCall(managedClient, serverId, toolName, args);
173
+ }
174
+ catch (error) {
175
+ console.error(`[MCP] User tool call error:`, error);
176
+ return {
177
+ content: [{ type: 'text', text: error instanceof Error ? error.message : 'Tool execution failed' }],
178
+ isError: true,
179
+ };
180
+ }
181
+ }
182
+ async executeToolCall(managedClient, serverId, toolName, args) {
183
+ console.log(`[MCP] Executing tool: ${toolName} on server ${serverId}`);
184
+ console.log(`[MCP] Arguments: ${JSON.stringify(args)}`);
185
+ try {
186
+ const startTime = Date.now();
187
+ const result = await managedClient.client.callTool({
188
+ name: toolName,
189
+ arguments: args,
190
+ });
191
+ const duration = Date.now() - startTime;
192
+ // Convert MCP SDK result to our MCPToolResponse format
193
+ const content = result.content.map((item) => {
194
+ if (item.type === 'text') {
195
+ return { type: 'text', text: item.text };
196
+ }
197
+ else if (item.type === 'image') {
198
+ return { type: 'image', data: item.data, mimeType: item.mimeType };
199
+ }
200
+ return { type: 'text', text: JSON.stringify(item) };
201
+ });
202
+ console.log(`[MCP] Tool ${toolName} completed in ${duration}ms, isError=${result.isError === true}`);
203
+ console.log(`[MCP] Full tool response:`, JSON.stringify(result, null, 2));
204
+ console.log(`[MCP] Tool response content:`);
205
+ for (const item of content) {
206
+ if (item.type === 'text') {
207
+ console.log(`[MCP] ${item.text}`);
208
+ }
209
+ else if (item.type === 'image') {
210
+ console.log(`[MCP] [Image: ${item.mimeType}]`);
211
+ }
212
+ }
213
+ return {
214
+ content,
215
+ isError: result.isError === true,
216
+ structuredContent: result.structuredContent,
217
+ };
218
+ }
219
+ catch (error) {
220
+ console.error(`[MCP] Tool call error for ${toolName}:`, error);
221
+ return {
222
+ content: [{ type: 'text', text: error instanceof Error ? error.message : 'Tool execution failed' }],
223
+ isError: true,
224
+ };
225
+ }
226
+ }
227
+ // Get or create a user-specific client
228
+ async getClientForUser(serverId, userId, config) {
229
+ const key = `${userId}:${serverId}`;
230
+ // Check existing client
231
+ const existing = this.userClients.get(key);
232
+ if (existing) {
233
+ existing.lastUsed = Date.now();
234
+ return existing;
235
+ }
236
+ // Get user's credential
237
+ const credential = await db.mCPCredential.findUnique({
238
+ where: {
239
+ userId_serverId: { userId, serverId },
240
+ },
241
+ });
242
+ if (!credential) {
243
+ return null;
244
+ }
245
+ // Create client with user's credentials
246
+ const managedClient = await this.createUserClient(config, credential);
247
+ if (managedClient) {
248
+ this.userClients.set(key, managedClient);
249
+ }
250
+ return managedClient;
251
+ }
252
+ async createClient(config) {
253
+ if (config.transport === 'stdio') {
254
+ return this.createStdioClient(config);
255
+ }
256
+ else if (config.transport === 'sse') {
257
+ return this.createSSEClient(config);
258
+ }
259
+ else if (config.transport === 'streamable-http') {
260
+ return this.createStreamableHTTPClient(config);
261
+ }
262
+ throw new Error(`Unsupported transport: ${config.transport}`);
263
+ }
264
+ async createUserClient(config, credential) {
265
+ if (config.transport !== 'streamable-http') {
266
+ throw new Error('User credentials only supported for streamable-http transport');
267
+ }
268
+ if (!config.url) {
269
+ throw new Error(`No URL specified for server ${config.id}`);
270
+ }
271
+ let authHeader;
272
+ if (credential.credentialType === 'api_key') {
273
+ const data = decryptCredential(credential.encryptedData);
274
+ authHeader = `Bearer ${data.apiKey}`;
275
+ }
276
+ else if (credential.credentialType === 'oauth') {
277
+ const data = decryptCredential(credential.encryptedData);
278
+ // Check if token is expired
279
+ if (isTokenExpired(data.expiresAt)) {
280
+ // TODO: Implement token refresh
281
+ throw new Error('OAuth token expired - please re-authenticate');
282
+ }
283
+ authHeader = `${data.tokenType || 'Bearer'} ${data.accessToken}`;
284
+ }
285
+ console.log(`[MCP] Connecting user client to: ${config.url}`);
286
+ const transport = new StreamableHTTPClientTransport(new URL(config.url), {
287
+ requestInit: authHeader
288
+ ? { headers: { Authorization: authHeader } }
289
+ : undefined,
290
+ });
291
+ const client = new Client({
292
+ name: 'chaaskit',
293
+ version: '1.0.0',
294
+ });
295
+ await client.connect(transport);
296
+ console.log(`[MCP] User connected to ${config.name}`);
297
+ // Fetch available tools
298
+ console.log(`[MCP] Fetching tools from ${config.name} for user...`);
299
+ const toolsResult = await client.listTools();
300
+ // Log raw tool data from MCP
301
+ console.log(`[MCP] ${config.name} raw tools from MCP:`);
302
+ for (const tool of toolsResult.tools) {
303
+ console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
304
+ }
305
+ const tools = toolsResult.tools.map((tool) => ({
306
+ name: tool.name,
307
+ description: tool.description,
308
+ inputSchema: tool.inputSchema,
309
+ _meta: tool._meta,
310
+ annotations: tool.annotations,
311
+ }));
312
+ console.log(`[MCP] ${config.name} provides ${tools.length} tools for user`);
313
+ return {
314
+ client,
315
+ tools,
316
+ transport,
317
+ lastUsed: Date.now(),
318
+ };
319
+ }
320
+ async createStdioClient(config) {
321
+ if (!config.command) {
322
+ throw new Error(`No command specified for stdio server ${config.id}`);
323
+ }
324
+ console.log(`[MCP] Connecting to stdio server: ${config.command} ${config.args?.join(' ') || ''}`);
325
+ // Spawn the child process
326
+ const childProcess = spawn(config.command, config.args || [], {
327
+ stdio: ['pipe', 'pipe', 'pipe'],
328
+ env: { ...process.env },
329
+ });
330
+ // Handle stderr for debugging
331
+ childProcess.stderr?.on('data', (data) => {
332
+ console.error(`[MCP:${config.id}] stderr:`, data.toString());
333
+ });
334
+ // Create transport with the child process streams
335
+ const transport = new StdioClientTransport({
336
+ command: config.command,
337
+ args: config.args || [],
338
+ });
339
+ // Create and connect the client
340
+ const client = new Client({
341
+ name: 'chaaskit',
342
+ version: '1.0.0',
343
+ });
344
+ await client.connect(transport);
345
+ console.log(`[MCP] Connected to ${config.name}`);
346
+ // Fetch available tools
347
+ const toolsResult = await client.listTools();
348
+ // Log raw tool data from MCP
349
+ console.log(`[MCP] ${config.name} raw tools from MCP:`);
350
+ for (const tool of toolsResult.tools) {
351
+ console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
352
+ }
353
+ const tools = toolsResult.tools.map((tool) => ({
354
+ name: tool.name,
355
+ description: tool.description,
356
+ inputSchema: tool.inputSchema,
357
+ _meta: tool._meta,
358
+ annotations: tool.annotations,
359
+ }));
360
+ console.log(`[MCP] ${config.name} provides ${tools.length} tools`);
361
+ return {
362
+ client,
363
+ tools,
364
+ transport,
365
+ childProcess,
366
+ lastUsed: Date.now(),
367
+ };
368
+ }
369
+ async createSSEClient(config) {
370
+ if (!config.url) {
371
+ throw new Error(`No URL specified for SSE server ${config.id}`);
372
+ }
373
+ console.log(`[MCP] Connecting to SSE server: ${config.url}`);
374
+ // Create SSE transport
375
+ const transport = new SSEClientTransport(new URL(config.url));
376
+ // Create and connect the client
377
+ const client = new Client({
378
+ name: 'chaaskit',
379
+ version: '1.0.0',
380
+ });
381
+ await client.connect(transport);
382
+ console.log(`[MCP] Connected to ${config.name}`);
383
+ // Fetch available tools
384
+ const toolsResult = await client.listTools();
385
+ // Log raw tool data from MCP
386
+ console.log(`[MCP] ${config.name} raw tools from MCP:`);
387
+ for (const tool of toolsResult.tools) {
388
+ console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
389
+ }
390
+ const tools = toolsResult.tools.map((tool) => ({
391
+ name: tool.name,
392
+ description: tool.description,
393
+ inputSchema: tool.inputSchema,
394
+ _meta: tool._meta,
395
+ annotations: tool.annotations,
396
+ }));
397
+ console.log(`[MCP] ${config.name} provides ${tools.length} tools`);
398
+ return {
399
+ client,
400
+ tools,
401
+ transport,
402
+ lastUsed: Date.now(),
403
+ };
404
+ }
405
+ async createStreamableHTTPClient(config) {
406
+ if (!config.url) {
407
+ throw new Error(`No URL specified for streamable-http server ${config.id}`);
408
+ }
409
+ console.log(`[MCP] Connecting to streamable-http server: ${config.url}`);
410
+ // Get auth header for admin mode
411
+ let authHeader;
412
+ if (config.authMode === 'admin' && config.adminApiKeyEnvVar) {
413
+ const apiKey = process.env[config.adminApiKeyEnvVar];
414
+ if (!apiKey) {
415
+ throw new Error(`Admin API key not found in env var: ${config.adminApiKeyEnvVar}`);
416
+ }
417
+ authHeader = `Bearer ${apiKey}`;
418
+ }
419
+ // Create Streamable HTTP transport
420
+ const transport = new StreamableHTTPClientTransport(new URL(config.url), {
421
+ requestInit: authHeader
422
+ ? { headers: { Authorization: authHeader } }
423
+ : undefined,
424
+ });
425
+ // Create and connect the client
426
+ const client = new Client({
427
+ name: 'chaaskit',
428
+ version: '1.0.0',
429
+ });
430
+ await client.connect(transport);
431
+ console.log(`[MCP] Connected to ${config.name}`);
432
+ // Fetch available tools
433
+ const toolsResult = await client.listTools();
434
+ // Log raw tool data from MCP
435
+ console.log(`[MCP] ${config.name} raw tools from MCP:`);
436
+ for (const tool of toolsResult.tools) {
437
+ console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
438
+ }
439
+ const tools = toolsResult.tools.map((tool) => ({
440
+ name: tool.name,
441
+ description: tool.description,
442
+ inputSchema: tool.inputSchema,
443
+ _meta: tool._meta,
444
+ annotations: tool.annotations,
445
+ }));
446
+ console.log(`[MCP] ${config.name} provides ${tools.length} tools`);
447
+ return {
448
+ client,
449
+ tools,
450
+ transport,
451
+ lastUsed: Date.now(),
452
+ };
453
+ }
454
+ // List resources from a server
455
+ async listResources(serverId) {
456
+ const managedClient = this.globalClients.get(serverId);
457
+ if (!managedClient) {
458
+ throw new Error(`Server ${serverId} not connected`);
459
+ }
460
+ try {
461
+ const result = await managedClient.client.listResources();
462
+ console.log(`[MCP] Listed ${result.resources.length} resources from ${serverId}`);
463
+ return result.resources.map(r => ({
464
+ uri: r.uri,
465
+ name: r.name,
466
+ description: r.description,
467
+ mimeType: r.mimeType,
468
+ }));
469
+ }
470
+ catch (error) {
471
+ console.error(`[MCP] Failed to list resources from ${serverId}:`, error);
472
+ return [];
473
+ }
474
+ }
475
+ // Read a resource from a server
476
+ async readResource(serverId, uri) {
477
+ const managedClient = this.globalClients.get(serverId);
478
+ if (!managedClient) {
479
+ throw new Error(`Server ${serverId} not connected`);
480
+ }
481
+ try {
482
+ console.log(`[MCP] Reading resource ${uri} from ${serverId}`);
483
+ const result = await managedClient.client.readResource({ uri });
484
+ if (result.contents.length === 0) {
485
+ console.log(`[MCP] Resource ${uri} returned no contents`);
486
+ return null;
487
+ }
488
+ const content = result.contents[0];
489
+ console.log(`[MCP] Resource ${uri} read successfully, mimeType=${content.mimeType}`);
490
+ return {
491
+ text: content.text,
492
+ blob: content.blob,
493
+ mimeType: content.mimeType,
494
+ };
495
+ }
496
+ catch (error) {
497
+ console.error(`[MCP] Failed to read resource ${uri} from ${serverId}:`, error);
498
+ return null;
499
+ }
500
+ }
501
+ // Read a resource for a specific user (handles user-credential servers)
502
+ async readResourceForUser(userId, serverId, uri, config) {
503
+ const authMode = config.authMode || 'none';
504
+ // For none/admin auth modes, use global client
505
+ if (authMode === 'none' || authMode === 'admin') {
506
+ return this.readResource(serverId, uri);
507
+ }
508
+ // For user-credential modes, get user-specific client
509
+ try {
510
+ const managedClient = await this.getClientForUser(serverId, userId, config);
511
+ if (!managedClient) {
512
+ console.error(`[MCP] No user client available for ${serverId}`);
513
+ return null;
514
+ }
515
+ console.log(`[MCP] Reading resource ${uri} from ${serverId} for user ${userId}`);
516
+ const result = await managedClient.client.readResource({ uri });
517
+ if (result.contents.length === 0) {
518
+ console.log(`[MCP] Resource ${uri} returned no contents`);
519
+ return null;
520
+ }
521
+ const content = result.contents[0];
522
+ console.log(`[MCP] Resource ${uri} read successfully, mimeType=${content.mimeType}`);
523
+ return {
524
+ text: content.text,
525
+ blob: content.blob,
526
+ mimeType: content.mimeType,
527
+ };
528
+ }
529
+ catch (error) {
530
+ console.error(`[MCP] Failed to read resource ${uri} for user:`, error);
531
+ return null;
532
+ }
533
+ }
534
+ // Clean up all connections on shutdown
535
+ async disconnectAll() {
536
+ // Disconnect global clients
537
+ const globalIds = Array.from(this.globalClients.keys());
538
+ await Promise.all(globalIds.map(id => this.disconnect(id)));
539
+ // Disconnect user clients
540
+ const userKeys = Array.from(this.userClients.keys());
541
+ await Promise.all(userKeys.map(key => this.disconnectUserClient(key)));
542
+ // Stop cleanup interval
543
+ if (this.cleanupInterval) {
544
+ clearInterval(this.cleanupInterval);
545
+ this.cleanupInterval = null;
546
+ }
547
+ }
548
+ }
549
+ // Singleton instance
550
+ export const mcpManager = new MCPClientManager();
551
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}