flex-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/api/auth.d.ts +6 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +111 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/configs.d.ts +6 -0
- package/dist/api/configs.d.ts.map +1 -0
- package/dist/api/configs.js +693 -0
- package/dist/api/configs.js.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +24 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/mcp.d.ts +7 -0
- package/dist/api/mcp.d.ts.map +1 -0
- package/dist/api/mcp.js +46 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/middleware.d.ts +25 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +65 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/prompts.d.ts +6 -0
- package/dist/api/prompts.d.ts.map +1 -0
- package/dist/api/prompts.js +260 -0
- package/dist/api/prompts.js.map +1 -0
- package/dist/api/resources.d.ts +6 -0
- package/dist/api/resources.d.ts.map +1 -0
- package/dist/api/resources.js +159 -0
- package/dist/api/resources.js.map +1 -0
- package/dist/api/tables.d.ts +15 -0
- package/dist/api/tables.d.ts.map +1 -0
- package/dist/api/tables.js +702 -0
- package/dist/api/tables.js.map +1 -0
- package/dist/api/users.d.ts +6 -0
- package/dist/api/users.d.ts.map +1 -0
- package/dist/api/users.js +96 -0
- package/dist/api/users.js.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +126 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +288 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +164 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +646 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +73 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/aggregator.d.ts +78 -0
- package/dist/mcp/aggregator.d.ts.map +1 -0
- package/dist/mcp/aggregator.js +1266 -0
- package/dist/mcp/aggregator.js.map +1 -0
- package/dist/mcp/component-loader.d.ts +17 -0
- package/dist/mcp/component-loader.d.ts.map +1 -0
- package/dist/mcp/component-loader.js +131 -0
- package/dist/mcp/component-loader.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +107 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-client.d.ts +53 -0
- package/dist/mcp/mcp-client.d.ts.map +1 -0
- package/dist/mcp/mcp-client.js +418 -0
- package/dist/mcp/mcp-client.js.map +1 -0
- package/dist/mcp/post-sse-transport.d.ts +52 -0
- package/dist/mcp/post-sse-transport.d.ts.map +1 -0
- package/dist/mcp/post-sse-transport.js +375 -0
- package/dist/mcp/post-sse-transport.js.map +1 -0
- package/dist/mcp/service.d.ts +49 -0
- package/dist/mcp/service.d.ts.map +1 -0
- package/dist/mcp/service.js +358 -0
- package/dist/mcp/service.js.map +1 -0
- package/dist/mcp/tool-sync.d.ts +27 -0
- package/dist/mcp/tool-sync.d.ts.map +1 -0
- package/dist/mcp/tool-sync.js +200 -0
- package/dist/mcp/tool-sync.js.map +1 -0
- package/dist/script/compiler.d.ts +15 -0
- package/dist/script/compiler.d.ts.map +1 -0
- package/dist/script/compiler.js +163 -0
- package/dist/script/compiler.js.map +1 -0
- package/dist/script/context.d.ts +11 -0
- package/dist/script/context.d.ts.map +1 -0
- package/dist/script/context.js +786 -0
- package/dist/script/context.js.map +1 -0
- package/dist/script/executor.d.ts +43 -0
- package/dist/script/executor.d.ts.map +1 -0
- package/dist/script/executor.js +126 -0
- package/dist/script/executor.js.map +1 -0
- package/dist/static.d.ts +21 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +95 -0
- package/dist/static.js.map +1 -0
- package/dist/types/index.d.ts +337 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/id.d.ts +5 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +8 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/logger.d.ts +21 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompt-template.d.ts +15 -0
- package/dist/utils/prompt-template.d.ts.map +1 -0
- package/dist/utils/prompt-template.js +82 -0
- package/dist/utils/prompt-template.js.map +1 -0
- package/dist/utils/telemetry.d.ts +45 -0
- package/dist/utils/telemetry.d.ts.map +1 -0
- package/dist/utils/telemetry.js +245 -0
- package/dist/utils/telemetry.js.map +1 -0
- package/dist/utils/variables.d.ts +24 -0
- package/dist/utils/variables.d.ts.map +1 -0
- package/dist/utils/variables.js +45 -0
- package/dist/utils/variables.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 服务核心逻辑
|
|
3
|
+
*/
|
|
4
|
+
import { loginUser } from '../auth/index.js';
|
|
5
|
+
import { db } from '../db/index.js';
|
|
6
|
+
import { mcpConfigs } from '../db/schema.js';
|
|
7
|
+
import { eq } from 'drizzle-orm';
|
|
8
|
+
import { MCPAggregator } from './aggregator.js';
|
|
9
|
+
export class MCPService {
|
|
10
|
+
aggregators = new Map();
|
|
11
|
+
aggregatorPromises = new Map();
|
|
12
|
+
sseStreams = new Map();
|
|
13
|
+
// 存储每个用户的 MCP 客户端配置(headers 和 config)
|
|
14
|
+
mcpClientConfigs = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* 验证用户凭据并返回用户信息
|
|
17
|
+
*/
|
|
18
|
+
async validateAndGetUser(email, apiKey) {
|
|
19
|
+
try {
|
|
20
|
+
const user = await loginUser(email, apiKey);
|
|
21
|
+
return user;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 获取用户的 MCP 配置
|
|
29
|
+
*/
|
|
30
|
+
async getUserConfig(userId) {
|
|
31
|
+
const result = await db
|
|
32
|
+
.select()
|
|
33
|
+
.from(mcpConfigs)
|
|
34
|
+
.where(eq(mcpConfigs.userId, userId))
|
|
35
|
+
.limit(1);
|
|
36
|
+
if (result.length === 0) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const row = result[0];
|
|
40
|
+
return {
|
|
41
|
+
id: row.id,
|
|
42
|
+
userId: row.userId,
|
|
43
|
+
name: row.name,
|
|
44
|
+
components: JSON.parse(row.components),
|
|
45
|
+
customTools: JSON.parse(row.customTools),
|
|
46
|
+
variables: JSON.parse(row.variables),
|
|
47
|
+
initScript: row.initScript || undefined,
|
|
48
|
+
createdAt: row.createdAt,
|
|
49
|
+
updatedAt: row.updatedAt,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 获取或创建用户的 MCP 聚合器
|
|
54
|
+
* 使用 Promise 缓存防止并发初始化
|
|
55
|
+
* 如果配置已更新,会重新创建聚合器
|
|
56
|
+
*/
|
|
57
|
+
async getAggregator(userId) {
|
|
58
|
+
// 获取最新配置
|
|
59
|
+
const config = await this.getUserConfig(userId);
|
|
60
|
+
if (!config) {
|
|
61
|
+
throw new Error('User config not found');
|
|
62
|
+
}
|
|
63
|
+
// 如果聚合器已存在,检查配置是否已更新
|
|
64
|
+
if (this.aggregators.has(userId)) {
|
|
65
|
+
const existingAggregator = this.aggregators.get(userId);
|
|
66
|
+
// 如果配置的更新时间比聚合器创建时新,需要重新创建
|
|
67
|
+
if (existingAggregator.configUpdatedAt && config.updatedAt > existingAggregator.configUpdatedAt) {
|
|
68
|
+
console.log(`[MCP] Config updated for user ${userId} (old: ${existingAggregator.configUpdatedAt.toISOString()}, new: ${config.updatedAt.toISOString()}), recreating aggregator`);
|
|
69
|
+
// 清理旧的聚合器
|
|
70
|
+
try {
|
|
71
|
+
await existingAggregator.close();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(`[MCP] Error closing old aggregator:`, error.message || error);
|
|
75
|
+
}
|
|
76
|
+
this.aggregators.delete(userId);
|
|
77
|
+
// 继续创建新的聚合器
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// 配置未更新,直接返回现有聚合器
|
|
81
|
+
// 注意:getAllTools() 每次都会从数据库重新加载配置,所以工具列表总是最新的
|
|
82
|
+
return existingAggregator;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 如果正在初始化,等待完成
|
|
86
|
+
if (this.aggregatorPromises.has(userId)) {
|
|
87
|
+
return await this.aggregatorPromises.get(userId);
|
|
88
|
+
}
|
|
89
|
+
// 创建初始化 Promise
|
|
90
|
+
const promise = (async () => {
|
|
91
|
+
try {
|
|
92
|
+
// 获取 MCP 客户端配置(headers 和 config)
|
|
93
|
+
// 注意:如果连接还没有建立,mcpClientConfig 可能为 null
|
|
94
|
+
const mcpClientConfig = this.getMCPClientConfig(userId);
|
|
95
|
+
const aggregator = new MCPAggregator(config, mcpClientConfig, userId);
|
|
96
|
+
await aggregator.initialize();
|
|
97
|
+
this.aggregators.set(userId, aggregator);
|
|
98
|
+
this.aggregatorPromises.delete(userId);
|
|
99
|
+
return aggregator;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// 初始化失败,清理 Promise 缓存
|
|
103
|
+
this.aggregatorPromises.delete(userId);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
this.aggregatorPromises.set(userId, promise);
|
|
108
|
+
return await promise;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 获取用户的 MCP 客户端配置(headers 和 config)
|
|
112
|
+
*/
|
|
113
|
+
getMCPClientConfig(userId) {
|
|
114
|
+
return this.mcpClientConfigs.get(userId) || null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 处理 SSE 连接(服务端推送)
|
|
118
|
+
*/
|
|
119
|
+
async handleSSEConnection(userId, stream, endpointUrl, mcpHeaders, mcpConfig) {
|
|
120
|
+
// 存储 MCP 客户端配置
|
|
121
|
+
if (mcpHeaders || mcpConfig) {
|
|
122
|
+
this.mcpClientConfigs.set(userId, {
|
|
123
|
+
headers: mcpHeaders || {},
|
|
124
|
+
config: mcpConfig || {},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
console.log(`[MCP] SSE connection started for user ${userId}`);
|
|
128
|
+
try {
|
|
129
|
+
// 注册 stream
|
|
130
|
+
if (!this.sseStreams.has(userId)) {
|
|
131
|
+
this.sseStreams.set(userId, new Set());
|
|
132
|
+
}
|
|
133
|
+
this.sseStreams.get(userId).add(stream);
|
|
134
|
+
console.log(`[MCP] Stream registered for user ${userId}. Total streams: ${this.sseStreams.get(userId).size}`);
|
|
135
|
+
// 发送 endpoint 事件,告知客户端 POST 请求地址
|
|
136
|
+
// MCP SSE 传输协议:endpoint 事件的 data 字段应该是直接的 URL 字符串,而不是 JSON 对象
|
|
137
|
+
console.log(`[MCP] Sending endpoint event to user ${userId}: ${endpointUrl}`);
|
|
138
|
+
await stream.writeSSE({
|
|
139
|
+
event: 'endpoint',
|
|
140
|
+
data: endpointUrl, // 直接发送 URL 字符串,而不是 JSON 对象
|
|
141
|
+
});
|
|
142
|
+
// 发送心跳保持连接
|
|
143
|
+
let interval = null;
|
|
144
|
+
let isAborted = false;
|
|
145
|
+
let abortResolve = null;
|
|
146
|
+
// 监听连接关闭(合并为一个监听器,避免重复执行)
|
|
147
|
+
stream.onAbort(() => {
|
|
148
|
+
console.log(`[MCP] SSE connection aborted for user ${userId}`);
|
|
149
|
+
isAborted = true;
|
|
150
|
+
if (interval) {
|
|
151
|
+
clearInterval(interval);
|
|
152
|
+
interval = null;
|
|
153
|
+
}
|
|
154
|
+
this.removeStream(userId, stream);
|
|
155
|
+
// 清理 MCP 客户端配置(如果所有连接都关闭了)
|
|
156
|
+
const streams = this.sseStreams.get(userId);
|
|
157
|
+
if (!streams || streams.size === 0) {
|
|
158
|
+
this.mcpClientConfigs.delete(userId);
|
|
159
|
+
}
|
|
160
|
+
// 如果有等待的 Promise,resolve 它
|
|
161
|
+
if (abortResolve) {
|
|
162
|
+
abortResolve();
|
|
163
|
+
abortResolve = null;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// 启动心跳定时器
|
|
167
|
+
interval = setInterval(async () => {
|
|
168
|
+
// 检查连接是否已关闭
|
|
169
|
+
if (isAborted) {
|
|
170
|
+
if (interval) {
|
|
171
|
+
clearInterval(interval);
|
|
172
|
+
interval = null;
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// 检查 stream 是否还在注册列表中
|
|
177
|
+
const streams = this.sseStreams.get(userId);
|
|
178
|
+
if (!streams || !streams.has(stream)) {
|
|
179
|
+
if (interval) {
|
|
180
|
+
clearInterval(interval);
|
|
181
|
+
interval = null;
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
// 检查 stream 对象是否有效
|
|
187
|
+
if (!stream || typeof stream.writeSSE !== 'function') {
|
|
188
|
+
console.log(`[MCP] Stream invalid for user ${userId}, stopping heartbeat`);
|
|
189
|
+
isAborted = true;
|
|
190
|
+
if (interval) {
|
|
191
|
+
clearInterval(interval);
|
|
192
|
+
interval = null;
|
|
193
|
+
}
|
|
194
|
+
this.removeStream(userId, stream);
|
|
195
|
+
if (abortResolve) {
|
|
196
|
+
abortResolve();
|
|
197
|
+
abortResolve = null;
|
|
198
|
+
}
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// hono 的 writeSSE 仅支持 event/data/id/retry 字段,缺少 data 会导致内部 resolveCallback 读取 undefined.callbacks 报错
|
|
202
|
+
await stream.writeSSE({
|
|
203
|
+
event: 'ping',
|
|
204
|
+
data: 'ping',
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
// 心跳失败通常意味着连接已关闭,这是正常的,不需要记录为错误
|
|
209
|
+
console.log(`[MCP] Heartbeat failed for user ${userId} (connection likely closed):`, error instanceof Error ? error.message : String(error));
|
|
210
|
+
isAborted = true;
|
|
211
|
+
if (interval) {
|
|
212
|
+
clearInterval(interval);
|
|
213
|
+
interval = null;
|
|
214
|
+
}
|
|
215
|
+
this.removeStream(userId, stream);
|
|
216
|
+
if (abortResolve) {
|
|
217
|
+
abortResolve();
|
|
218
|
+
abortResolve = null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}, 30000);
|
|
222
|
+
// 保持连接直到被关闭
|
|
223
|
+
await new Promise((resolve) => {
|
|
224
|
+
// 如果已经中止,立即 resolve
|
|
225
|
+
if (isAborted) {
|
|
226
|
+
resolve();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// 否则保存 resolve 函数,等待 onAbort 调用
|
|
230
|
+
abortResolve = resolve;
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error('Error handling SSE connection:', error);
|
|
235
|
+
this.removeStream(userId, stream);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
removeStream(userId, stream) {
|
|
239
|
+
const streams = this.sseStreams.get(userId);
|
|
240
|
+
if (streams) {
|
|
241
|
+
streams.delete(stream);
|
|
242
|
+
console.log(`[MCP] Stream removed for user ${userId}. Remaining streams: ${streams.size}`);
|
|
243
|
+
if (streams.size === 0) {
|
|
244
|
+
this.sseStreams.delete(userId);
|
|
245
|
+
// 当所有连接都关闭时,清理聚合器缓存,确保下次连接时使用最新配置
|
|
246
|
+
// 这样可以避免使用过期的聚合器配置
|
|
247
|
+
console.log(`[MCP] All streams closed for user ${userId}, clearing aggregator cache`);
|
|
248
|
+
this.clearAggregator(userId).catch((error) => {
|
|
249
|
+
console.error(`[MCP] Error clearing aggregator on stream close:`, error.message || error);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 处理 HTTP 请求(MCP 协议请求)
|
|
256
|
+
* 添加超时机制,默认 60 秒
|
|
257
|
+
*/
|
|
258
|
+
async handleRequest(userId, request, timeout = 60000) {
|
|
259
|
+
console.log(`[MCP] Handling request for user ${userId}:`, JSON.stringify(request));
|
|
260
|
+
let response;
|
|
261
|
+
try {
|
|
262
|
+
const aggregator = await this.getAggregator(userId);
|
|
263
|
+
// 使用 Promise.race 实现超时
|
|
264
|
+
const result = await Promise.race([
|
|
265
|
+
aggregator.handleRequest(request),
|
|
266
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), timeout))
|
|
267
|
+
]);
|
|
268
|
+
// 根据 JSON-RPC 2.0 规范,通知(没有 id 的请求)不应该返回响应
|
|
269
|
+
const isNotification = request.id === undefined || request.id === null;
|
|
270
|
+
if (isNotification) {
|
|
271
|
+
// 通知请求,不返回响应
|
|
272
|
+
console.log(`[MCP] Notification handled, no response needed.`);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// 有 id 的请求,需要返回响应
|
|
276
|
+
response = {
|
|
277
|
+
jsonrpc: '2.0',
|
|
278
|
+
id: request.id,
|
|
279
|
+
...result,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
console.error(`[MCP] Error processing request:`, error);
|
|
284
|
+
// 通知请求的错误也不应该返回响应
|
|
285
|
+
const isNotification = request.id === undefined || request.id === null;
|
|
286
|
+
if (isNotification) {
|
|
287
|
+
console.log(`[MCP] Notification failed, but no response needed.`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
// 提供更友好的错误信息
|
|
291
|
+
let errorMessage = error.message || 'Internal error';
|
|
292
|
+
let errorCode = -32000;
|
|
293
|
+
if (error.message === 'User config not found') {
|
|
294
|
+
errorMessage = 'User MCP configuration not found. Please create a configuration in the web interface.';
|
|
295
|
+
errorCode = -32603; // Internal error
|
|
296
|
+
}
|
|
297
|
+
else if (error.message === 'Request timeout') {
|
|
298
|
+
errorMessage = 'Request timeout. The operation took too long to complete.';
|
|
299
|
+
errorCode = -32000; // Server error
|
|
300
|
+
}
|
|
301
|
+
response = {
|
|
302
|
+
jsonrpc: '2.0',
|
|
303
|
+
id: request.id,
|
|
304
|
+
error: {
|
|
305
|
+
code: errorCode,
|
|
306
|
+
message: errorMessage,
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
// 通过 SSE 发送响应(只有非通知请求才会到达这里)
|
|
311
|
+
const streams = this.sseStreams.get(userId);
|
|
312
|
+
console.log(`[MCP] Sending response to user ${userId}. Active streams: ${streams?.size || 0}`);
|
|
313
|
+
if (streams && streams.size > 0) {
|
|
314
|
+
const message = JSON.stringify(response);
|
|
315
|
+
console.log(`[MCP] Response payload:`, message);
|
|
316
|
+
for (const stream of streams) {
|
|
317
|
+
try {
|
|
318
|
+
await stream.writeSSE({
|
|
319
|
+
event: 'message',
|
|
320
|
+
data: message,
|
|
321
|
+
});
|
|
322
|
+
console.log(`[MCP] Response sent via SSE`);
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
console.error('Failed to send SSE message:', e);
|
|
326
|
+
this.removeStream(userId, stream);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.warn(`[MCP] No active streams found for user ${userId}, response dropped.`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* 清理用户的聚合器(当配置更新时)
|
|
336
|
+
*/
|
|
337
|
+
async clearAggregator(userId) {
|
|
338
|
+
// 清理正在初始化的 Promise
|
|
339
|
+
this.aggregatorPromises.delete(userId);
|
|
340
|
+
// 清理已存在的聚合器
|
|
341
|
+
const aggregator = this.aggregators.get(userId);
|
|
342
|
+
if (aggregator) {
|
|
343
|
+
try {
|
|
344
|
+
await aggregator.close();
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
// 关闭聚合器时的错误不应该阻止清理操作
|
|
348
|
+
console.error(`[MCP] Error closing aggregator for user ${userId}:`, error.message || error);
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
// 无论关闭是否成功,都要从 Map 中删除
|
|
352
|
+
this.aggregators.delete(userId);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
export const mcpService = new MCPService();
|
|
358
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/mcp/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 组件工具同步服务
|
|
3
|
+
* 负责从 MCP 组件查询工具配置并保存到数据库
|
|
4
|
+
*/
|
|
5
|
+
import type { MCPConfig } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* 仅加载组件的工具列表(不保存到数据库)
|
|
8
|
+
* 即使组件被禁用也可以加载工具列表,用于展示和配置
|
|
9
|
+
* @param config MCP 配置
|
|
10
|
+
* @param componentId 组件 ID
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadComponentToolsList(config: MCPConfig, componentId: string): Promise<{
|
|
13
|
+
tools: any[];
|
|
14
|
+
errors: string[];
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* 同步指定组件的工具配置到数据库
|
|
18
|
+
* @param config MCP 配置
|
|
19
|
+
* @param componentId 组件 ID(可选,如果提供则只同步该组件,否则同步所有启用的组件)
|
|
20
|
+
* @param allowDisabled 是否允许同步禁用的组件(默认 false,如果为 true,则即使组件禁用也会同步工具列表到数据库)
|
|
21
|
+
*/
|
|
22
|
+
export declare function syncComponentTools(config: MCPConfig, componentId?: string, allowDisabled?: boolean): Promise<{
|
|
23
|
+
success: number;
|
|
24
|
+
failed: number;
|
|
25
|
+
errors: string[];
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=tool-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-sync.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAgB,MAAM,mBAAmB,CAAC;AAGjE;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkEhI;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA4IhL"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 组件工具同步服务
|
|
3
|
+
* 负责从 MCP 组件查询工具配置并保存到数据库
|
|
4
|
+
*/
|
|
5
|
+
import { db } from '../db/index.js';
|
|
6
|
+
import { mcpComponentTools } from '../db/schema.js';
|
|
7
|
+
import { eq, and } from 'drizzle-orm';
|
|
8
|
+
import { loadComponent } from './component-loader.js';
|
|
9
|
+
import { replaceVariablesInObject, createVariableMap } from '../utils/variables.js';
|
|
10
|
+
import { generateId } from '../utils/id.js';
|
|
11
|
+
/**
|
|
12
|
+
* 仅加载组件的工具列表(不保存到数据库)
|
|
13
|
+
* 即使组件被禁用也可以加载工具列表,用于展示和配置
|
|
14
|
+
* @param config MCP 配置
|
|
15
|
+
* @param componentId 组件 ID
|
|
16
|
+
*/
|
|
17
|
+
export async function loadComponentToolsList(config, componentId) {
|
|
18
|
+
const variableMap = createVariableMap(config.variables);
|
|
19
|
+
const errors = [];
|
|
20
|
+
// 查找组件
|
|
21
|
+
const targetComponent = config.components.find(c => c.id === componentId);
|
|
22
|
+
if (!targetComponent) {
|
|
23
|
+
errors.push(`Component ${componentId} not found`);
|
|
24
|
+
return { tools: [], errors };
|
|
25
|
+
}
|
|
26
|
+
// 即使组件被禁用,也允许加载工具列表
|
|
27
|
+
try {
|
|
28
|
+
// 替换组件配置中的变量
|
|
29
|
+
const processedComponent = {
|
|
30
|
+
...targetComponent,
|
|
31
|
+
env: targetComponent.env ? replaceVariablesInObject(targetComponent.env, variableMap) : undefined,
|
|
32
|
+
config: targetComponent.config ? replaceVariablesInObject(targetComponent.config, variableMap) : undefined,
|
|
33
|
+
};
|
|
34
|
+
console.log(`[ToolSync] Loading tools list from component: ${targetComponent.name} (type: ${targetComponent.type}, disabled: ${targetComponent.disabled})`);
|
|
35
|
+
// 加载组件
|
|
36
|
+
const loaded = await loadComponent(processedComponent);
|
|
37
|
+
// 查询组件的工具列表
|
|
38
|
+
console.log(`[ToolSync] Fetching tools from component: ${targetComponent.name}`);
|
|
39
|
+
const componentTools = await Promise.race([
|
|
40
|
+
loaded.client.listTools(),
|
|
41
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Timeout fetching tools from component ${targetComponent.name}`)), 30000))
|
|
42
|
+
]);
|
|
43
|
+
console.log(`[ToolSync] Component ${targetComponent.name} returned ${componentTools.length} tools`);
|
|
44
|
+
// 应用命名空间前缀(与 syncComponentTools 保持一致)
|
|
45
|
+
// 如果设置了命名空间则使用,否则使用组件名称作为命名空间
|
|
46
|
+
const namespace = targetComponent.namespace && targetComponent.namespace.trim() !== ''
|
|
47
|
+
? targetComponent.namespace.trim()
|
|
48
|
+
: targetComponent.name;
|
|
49
|
+
console.log(`[ToolSync] Component ${targetComponent.name} namespace: "${namespace}"`);
|
|
50
|
+
// 应用命名空间到工具名称
|
|
51
|
+
// 使用下横线连接命名空间和工具名称(Cursor 兼容性)
|
|
52
|
+
const toolsWithNamespace = componentTools.map(tool => ({
|
|
53
|
+
...tool,
|
|
54
|
+
name: `${namespace}_${tool.name}`,
|
|
55
|
+
originalToolName: tool.name, // 保存原始工具名称
|
|
56
|
+
}));
|
|
57
|
+
// 关闭组件连接
|
|
58
|
+
try {
|
|
59
|
+
await loaded.client.close();
|
|
60
|
+
}
|
|
61
|
+
catch (closeError) {
|
|
62
|
+
console.warn(`[ToolSync] Failed to close component ${targetComponent.name}:`, closeError);
|
|
63
|
+
}
|
|
64
|
+
return { tools: toolsWithNamespace, errors: [] };
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
const errorMessage = error.message || String(error);
|
|
68
|
+
console.error(`[ToolSync] Failed to load tools list from component ${targetComponent.name}:`, errorMessage);
|
|
69
|
+
errors.push(`Component ${targetComponent.name}: ${errorMessage}`);
|
|
70
|
+
return { tools: [], errors };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 同步指定组件的工具配置到数据库
|
|
75
|
+
* @param config MCP 配置
|
|
76
|
+
* @param componentId 组件 ID(可选,如果提供则只同步该组件,否则同步所有启用的组件)
|
|
77
|
+
* @param allowDisabled 是否允许同步禁用的组件(默认 false,如果为 true,则即使组件禁用也会同步工具列表到数据库)
|
|
78
|
+
*/
|
|
79
|
+
export async function syncComponentTools(config, componentId, allowDisabled = false) {
|
|
80
|
+
const variableMap = createVariableMap(config.variables);
|
|
81
|
+
let successCount = 0;
|
|
82
|
+
let failedCount = 0;
|
|
83
|
+
const errors = [];
|
|
84
|
+
// 如果指定了 componentId,检查组件是否存在
|
|
85
|
+
if (componentId) {
|
|
86
|
+
const targetComponent = config.components.find(c => c.id === componentId);
|
|
87
|
+
if (!targetComponent) {
|
|
88
|
+
errors.push(`Component ${componentId} not found`);
|
|
89
|
+
return { success: 0, failed: 0, errors };
|
|
90
|
+
}
|
|
91
|
+
// 如果 allowDisabled 为 false 且组件被禁用,返回错误
|
|
92
|
+
if (!allowDisabled && targetComponent.disabled) {
|
|
93
|
+
errors.push(`Component ${componentId} is disabled. Please enable it before syncing tools.`);
|
|
94
|
+
return { success: 0, failed: 0, errors };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 过滤要同步的组件
|
|
98
|
+
const componentsToSync = config.components.filter(comp => {
|
|
99
|
+
// 如果 allowDisabled 为 false,跳过禁用的组件
|
|
100
|
+
if (!allowDisabled && comp.disabled) {
|
|
101
|
+
console.log(`[ToolSync] Skipping disabled component: ${comp.name}`);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
// 如果指定了 componentId,只同步该组件
|
|
105
|
+
if (componentId && comp.id !== componentId) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
});
|
|
110
|
+
console.log(`[ToolSync] Starting sync for ${componentsToSync.length} components`);
|
|
111
|
+
for (const component of componentsToSync) {
|
|
112
|
+
try {
|
|
113
|
+
// 替换组件配置中的变量
|
|
114
|
+
const processedComponent = {
|
|
115
|
+
...component,
|
|
116
|
+
env: component.env ? replaceVariablesInObject(component.env, variableMap) : undefined,
|
|
117
|
+
config: component.config ? replaceVariablesInObject(component.config, variableMap) : undefined,
|
|
118
|
+
};
|
|
119
|
+
console.log(`[ToolSync] Loading component: ${component.name} (type: ${component.type})`);
|
|
120
|
+
// 加载组件
|
|
121
|
+
const loaded = await loadComponent(processedComponent);
|
|
122
|
+
// 查询组件的工具列表
|
|
123
|
+
console.log(`[ToolSync] Fetching tools from component: ${component.name}`);
|
|
124
|
+
const componentTools = await Promise.race([
|
|
125
|
+
loaded.client.listTools(),
|
|
126
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Timeout fetching tools from component ${component.name}`)), 30000))
|
|
127
|
+
]);
|
|
128
|
+
console.log(`[ToolSync] Component ${component.name} returned ${componentTools.length} tools`);
|
|
129
|
+
// 获取组件配置
|
|
130
|
+
const toolPatches = component.config?.toolPatches || {};
|
|
131
|
+
const disabledTools = Array.isArray(component.config?.disabledTools)
|
|
132
|
+
? component.config.disabledTools
|
|
133
|
+
: [];
|
|
134
|
+
// 应用命名空间前缀
|
|
135
|
+
// 如果设置了命名空间则使用,否则使用组件名称作为命名空间(与前端保持一致)
|
|
136
|
+
const namespace = component.namespace && component.namespace.trim() !== ''
|
|
137
|
+
? component.namespace.trim()
|
|
138
|
+
: component.name;
|
|
139
|
+
console.log(`[ToolSync] Component ${component.name} namespace: "${namespace}"`);
|
|
140
|
+
// 删除该组件在数据库中的旧工具(先删除再插入,实现全量同步)
|
|
141
|
+
await db
|
|
142
|
+
.delete(mcpComponentTools)
|
|
143
|
+
.where(and(eq(mcpComponentTools.configId, config.id), eq(mcpComponentTools.componentId, component.id)));
|
|
144
|
+
// 保存工具到数据库(保存所有工具,包括禁用的)
|
|
145
|
+
// 注意:这里保存的是原始数据(从 MCP 服务获取的),不应用 toolPatches
|
|
146
|
+
// toolPatches 是配置数据,应该单独存储,不影响原始数据
|
|
147
|
+
for (const tool of componentTools) {
|
|
148
|
+
// 检查工具是否被禁用(使用原始工具名称)
|
|
149
|
+
const isToolDisabled = disabledTools.includes(tool.name);
|
|
150
|
+
// 应用命名空间前缀:工具名称格式为 "namespace_toolName"
|
|
151
|
+
// 例如:命名空间 "foo_bar",工具 "get_weather" -> "foo_bar_get_weather"
|
|
152
|
+
// 使用下横线连接命名空间和工具名称(Cursor 兼容性)
|
|
153
|
+
// 如果未设置命名空间,则使用组件名称作为命名空间
|
|
154
|
+
const toolName = `${namespace}_${tool.name}`;
|
|
155
|
+
console.log(`[ToolSync] Saving tool: ${tool.name} -> ${toolName} (namespace: ${namespace}, disabled: ${isToolDisabled})`);
|
|
156
|
+
try {
|
|
157
|
+
// 保存原始数据(不应用 toolPatches)
|
|
158
|
+
// toolPatches 是配置数据,用于覆盖原始数据,但不应该影响原始数据的存储
|
|
159
|
+
await db.insert(mcpComponentTools).values({
|
|
160
|
+
id: generateId(),
|
|
161
|
+
userId: config.userId,
|
|
162
|
+
configId: config.id,
|
|
163
|
+
componentId: component.id,
|
|
164
|
+
componentName: component.name,
|
|
165
|
+
toolName: toolName,
|
|
166
|
+
originalToolName: tool.name, // 原始工具名称(不带命名空间)
|
|
167
|
+
description: tool.description || '', // 原始描述
|
|
168
|
+
inputSchema: tool.inputSchema || { type: 'object', properties: {} }, // 原始 schema
|
|
169
|
+
disabled: isToolDisabled, // 根据 disabledTools 列表设置
|
|
170
|
+
toolPatches: null, // toolPatches 不存储在工具记录中,而是存储在组件配置中
|
|
171
|
+
createdAt: new Date(),
|
|
172
|
+
updatedAt: new Date(),
|
|
173
|
+
});
|
|
174
|
+
successCount++;
|
|
175
|
+
}
|
|
176
|
+
catch (dbError) {
|
|
177
|
+
console.error(`[ToolSync] Failed to save tool ${toolName} to database:`, dbError);
|
|
178
|
+
failedCount++;
|
|
179
|
+
errors.push(`Failed to save tool ${toolName}: ${dbError.message || String(dbError)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// 关闭组件连接
|
|
183
|
+
try {
|
|
184
|
+
await loaded.client.close();
|
|
185
|
+
}
|
|
186
|
+
catch (closeError) {
|
|
187
|
+
console.warn(`[ToolSync] Failed to close component ${component.name}:`, closeError);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
const errorMessage = error.message || String(error);
|
|
192
|
+
console.error(`[ToolSync] Failed to sync component ${component.name}:`, errorMessage);
|
|
193
|
+
failedCount++;
|
|
194
|
+
errors.push(`Component ${component.name}: ${errorMessage}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
console.log(`[ToolSync] Sync completed: ${successCount} tools saved, ${failedCount} failed`);
|
|
198
|
+
return { success: successCount, failed: failedCount, errors };
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=tool-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-sync.js","sourceRoot":"","sources":["../../src/mcp/tool-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript 脚本编译器
|
|
3
|
+
* 使用 esbuild 将 TypeScript 编译为 JavaScript
|
|
4
|
+
*/
|
|
5
|
+
import type { Context } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* 编译 TypeScript 脚本为 JavaScript
|
|
8
|
+
*/
|
|
9
|
+
export declare function compileScript(script: string): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* 创建脚本执行函数
|
|
12
|
+
* 将编译后的代码包装成可执行的函数
|
|
13
|
+
*/
|
|
14
|
+
export declare function createScriptFunction(compiledCode: string, context: Context): any;
|
|
15
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/script/compiler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,GAAG,CAgJhF"}
|