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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/api/auth.d.ts +6 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +111 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/configs.d.ts +6 -0
  8. package/dist/api/configs.d.ts.map +1 -0
  9. package/dist/api/configs.js +693 -0
  10. package/dist/api/configs.js.map +1 -0
  11. package/dist/api/index.d.ts +6 -0
  12. package/dist/api/index.d.ts.map +1 -0
  13. package/dist/api/index.js +24 -0
  14. package/dist/api/index.js.map +1 -0
  15. package/dist/api/mcp.d.ts +7 -0
  16. package/dist/api/mcp.d.ts.map +1 -0
  17. package/dist/api/mcp.js +46 -0
  18. package/dist/api/mcp.js.map +1 -0
  19. package/dist/api/middleware.d.ts +25 -0
  20. package/dist/api/middleware.d.ts.map +1 -0
  21. package/dist/api/middleware.js +65 -0
  22. package/dist/api/middleware.js.map +1 -0
  23. package/dist/api/prompts.d.ts +6 -0
  24. package/dist/api/prompts.d.ts.map +1 -0
  25. package/dist/api/prompts.js +260 -0
  26. package/dist/api/prompts.js.map +1 -0
  27. package/dist/api/resources.d.ts +6 -0
  28. package/dist/api/resources.d.ts.map +1 -0
  29. package/dist/api/resources.js +159 -0
  30. package/dist/api/resources.js.map +1 -0
  31. package/dist/api/tables.d.ts +15 -0
  32. package/dist/api/tables.d.ts.map +1 -0
  33. package/dist/api/tables.js +702 -0
  34. package/dist/api/tables.js.map +1 -0
  35. package/dist/api/users.d.ts +6 -0
  36. package/dist/api/users.d.ts.map +1 -0
  37. package/dist/api/users.js +96 -0
  38. package/dist/api/users.js.map +1 -0
  39. package/dist/auth/index.d.ts +15 -0
  40. package/dist/auth/index.d.ts.map +1 -0
  41. package/dist/auth/index.js +126 -0
  42. package/dist/auth/index.js.map +1 -0
  43. package/dist/cli.d.ts +7 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +288 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/config.d.ts +21 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +54 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/db/index.d.ts +11 -0
  52. package/dist/db/index.d.ts.map +1 -0
  53. package/dist/db/index.js +164 -0
  54. package/dist/db/index.js.map +1 -0
  55. package/dist/db/schema.d.ts +646 -0
  56. package/dist/db/schema.d.ts.map +1 -0
  57. package/dist/db/schema.js +73 -0
  58. package/dist/db/schema.js.map +1 -0
  59. package/dist/index.d.ts +5 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +153 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/mcp/aggregator.d.ts +78 -0
  64. package/dist/mcp/aggregator.d.ts.map +1 -0
  65. package/dist/mcp/aggregator.js +1266 -0
  66. package/dist/mcp/aggregator.js.map +1 -0
  67. package/dist/mcp/component-loader.d.ts +17 -0
  68. package/dist/mcp/component-loader.d.ts.map +1 -0
  69. package/dist/mcp/component-loader.js +131 -0
  70. package/dist/mcp/component-loader.js.map +1 -0
  71. package/dist/mcp/index.d.ts +7 -0
  72. package/dist/mcp/index.d.ts.map +1 -0
  73. package/dist/mcp/index.js +107 -0
  74. package/dist/mcp/index.js.map +1 -0
  75. package/dist/mcp/mcp-client.d.ts +53 -0
  76. package/dist/mcp/mcp-client.d.ts.map +1 -0
  77. package/dist/mcp/mcp-client.js +418 -0
  78. package/dist/mcp/mcp-client.js.map +1 -0
  79. package/dist/mcp/post-sse-transport.d.ts +52 -0
  80. package/dist/mcp/post-sse-transport.d.ts.map +1 -0
  81. package/dist/mcp/post-sse-transport.js +375 -0
  82. package/dist/mcp/post-sse-transport.js.map +1 -0
  83. package/dist/mcp/service.d.ts +49 -0
  84. package/dist/mcp/service.d.ts.map +1 -0
  85. package/dist/mcp/service.js +358 -0
  86. package/dist/mcp/service.js.map +1 -0
  87. package/dist/mcp/tool-sync.d.ts +27 -0
  88. package/dist/mcp/tool-sync.d.ts.map +1 -0
  89. package/dist/mcp/tool-sync.js +200 -0
  90. package/dist/mcp/tool-sync.js.map +1 -0
  91. package/dist/script/compiler.d.ts +15 -0
  92. package/dist/script/compiler.d.ts.map +1 -0
  93. package/dist/script/compiler.js +163 -0
  94. package/dist/script/compiler.js.map +1 -0
  95. package/dist/script/context.d.ts +11 -0
  96. package/dist/script/context.d.ts.map +1 -0
  97. package/dist/script/context.js +786 -0
  98. package/dist/script/context.js.map +1 -0
  99. package/dist/script/executor.d.ts +43 -0
  100. package/dist/script/executor.d.ts.map +1 -0
  101. package/dist/script/executor.js +126 -0
  102. package/dist/script/executor.js.map +1 -0
  103. package/dist/static.d.ts +21 -0
  104. package/dist/static.d.ts.map +1 -0
  105. package/dist/static.js +95 -0
  106. package/dist/static.js.map +1 -0
  107. package/dist/types/index.d.ts +337 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +5 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/utils/id.d.ts +5 -0
  112. package/dist/utils/id.d.ts.map +1 -0
  113. package/dist/utils/id.js +8 -0
  114. package/dist/utils/id.js.map +1 -0
  115. package/dist/utils/logger.d.ts +21 -0
  116. package/dist/utils/logger.d.ts.map +1 -0
  117. package/dist/utils/logger.js +31 -0
  118. package/dist/utils/logger.js.map +1 -0
  119. package/dist/utils/prompt-template.d.ts +15 -0
  120. package/dist/utils/prompt-template.d.ts.map +1 -0
  121. package/dist/utils/prompt-template.js +82 -0
  122. package/dist/utils/prompt-template.js.map +1 -0
  123. package/dist/utils/telemetry.d.ts +45 -0
  124. package/dist/utils/telemetry.d.ts.map +1 -0
  125. package/dist/utils/telemetry.js +245 -0
  126. package/dist/utils/telemetry.js.map +1 -0
  127. package/dist/utils/variables.d.ts +24 -0
  128. package/dist/utils/variables.d.ts.map +1 -0
  129. package/dist/utils/variables.js +45 -0
  130. package/dist/utils/variables.js.map +1 -0
  131. package/package.json +70 -0
@@ -0,0 +1,418 @@
1
+ /**
2
+ * MCP 客户端
3
+ * 用于连接和管理 MCP 服务器
4
+ */
5
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
6
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
7
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
8
+ import { EventSource } from 'eventsource';
9
+ import axios from 'axios';
10
+ import { PostSSETransport } from './post-sse-transport.js';
11
+ // Polyfill EventSource for Node.js environment
12
+ if (typeof global.EventSource === 'undefined') {
13
+ // @ts-expect-error: Node.js global object does not have EventSource, we polyfill it here
14
+ global.EventSource = EventSource;
15
+ }
16
+ export class MCPClient {
17
+ client = null;
18
+ options;
19
+ transport = null;
20
+ constructor(options) {
21
+ this.options = options;
22
+ }
23
+ /**
24
+ * 初始化客户端
25
+ */
26
+ async initialize() {
27
+ switch (this.options.type) {
28
+ case 'stdio':
29
+ await this.initializeStdio();
30
+ break;
31
+ case 'url':
32
+ await this.initializeURL();
33
+ break;
34
+ case 'npm':
35
+ await this.initializeStdio();
36
+ break;
37
+ }
38
+ }
39
+ /**
40
+ * 初始化 stdio 连接
41
+ */
42
+ async initializeStdio() {
43
+ let command = this.options.command;
44
+ let args = this.options.args || [];
45
+ if (!command) {
46
+ throw new Error('Command is required for stdio transport');
47
+ }
48
+ // 解决 npx/uvx 路径问题,使用 shell 包装以确保正确执行
49
+ if (['npx', 'uvx', 'npm', 'node'].includes(command)) {
50
+ if (process.platform !== 'win32') {
51
+ const originalCmd = `${command} ${args.map(a => `'${a}'`).join(' ')}`;
52
+ command = '/bin/sh';
53
+ args = ['-c', originalCmd];
54
+ }
55
+ else {
56
+ // Windows: 使用 cmd.exe /c 执行命令
57
+ // /s 用于修改 /c 后的字符串处理(去掉首尾引号)
58
+ // /d 用于禁用自动运行命令
59
+ const originalCmd = `${command} ${args.map(a => `"${a}"`).join(' ')}`;
60
+ command = 'cmd.exe';
61
+ args = ['/s', '/c', originalCmd];
62
+ }
63
+ }
64
+ // 创建 stdio 传输
65
+ this.transport = new StdioClientTransport({
66
+ command: command,
67
+ args: args,
68
+ env: { ...process.env, ...this.options.env },
69
+ });
70
+ // 创建 MCP 客户端
71
+ this.client = new Client({
72
+ name: 'flex-mcp-client',
73
+ version: '1.0.0',
74
+ }, {
75
+ capabilities: {},
76
+ });
77
+ // 连接到传输
78
+ await this.client.connect(this.transport);
79
+ }
80
+ /**
81
+ * 初始化 URL 连接(HTTP/SSE)
82
+ */
83
+ async initializeURL() {
84
+ if (!this.options.url) {
85
+ throw new Error('URL is required for URL transport');
86
+ }
87
+ const headers = this.options.config?.headers || {};
88
+ // 优先使用 transportType,然后是 type,最后是 undefined
89
+ const transportType = this.options.config?.transportType || this.options.config?.type || undefined;
90
+ // 添加调试日志
91
+ console.log(`[MCP] initializeURL - config:`, JSON.stringify(this.options.config));
92
+ console.log(`[MCP] initializeURL - transportType: ${transportType}`);
93
+ // 确保 URL 是完整的
94
+ let url;
95
+ try {
96
+ url = new URL(this.options.url);
97
+ }
98
+ catch (error) {
99
+ throw new Error(`Invalid URL: ${this.options.url}`);
100
+ }
101
+ const originalPathname = url.pathname;
102
+ // 检测是否是 POST-based SSE 端点(streamable-http)
103
+ // 根据 curl 测试,某些 /stream 端点也需要 POST 方法
104
+ const isPostBasedSSE = (transportType === 'streamable-http' || transportType === 'streamableHttp') ||
105
+ (originalPathname.endsWith('/mcp/mcp') ||
106
+ (originalPathname.endsWith('/mcp') && !originalPathname.includes('/sse') && !originalPathname.includes('/stream'))) ||
107
+ (originalPathname.includes('/mcp-stream') || originalPathname.includes('/mcp/stream'));
108
+ // 如果明确配置了 streamable-http,或者路径包含 /mcp-stream 或 /mcp/stream,使用 POST-based SSE
109
+ if (isPostBasedSSE) {
110
+ console.log(`[MCP] Detected POST-based SSE endpoint (streamable-http): ${originalPathname}`);
111
+ console.log(`[MCP] Using custom PostSSETransport for POST-based SSE`);
112
+ // 使用自定义的 POST-based SSE Transport
113
+ this.transport = new PostSSETransport({
114
+ url: url,
115
+ headers: headers,
116
+ });
117
+ // 创建 MCP 客户端
118
+ this.client = new Client({
119
+ name: 'flex-mcp-client',
120
+ version: '1.0.0',
121
+ }, {
122
+ capabilities: {},
123
+ });
124
+ // 连接
125
+ await this.client.connect(this.transport);
126
+ return;
127
+ }
128
+ // 如果 URL 路径已经明确是 SSE 端点(包含 /sse),使用标准的 GET-based SSE
129
+ const isExplicitSSEPath = originalPathname.includes('/sse');
130
+ // 对于明确的 SSE 路径,直接使用,不进行任何特殊处理
131
+ if (isExplicitSSEPath) {
132
+ console.log(`[MCP] Detected explicit SSE endpoint path: ${originalPathname}, using GET-based SSE`);
133
+ // 直接使用原始 URL,不进行任何转换
134
+ const sseUrl = url;
135
+ // SSEClientTransport 只接受 URL 参数
136
+ // 如果需要传递 headers,需要在 EventSource 全局配置中设置
137
+ this.transport = new SSEClientTransport(sseUrl);
138
+ this.client = new Client({
139
+ name: 'flex-mcp-client',
140
+ version: '1.0.0',
141
+ }, {
142
+ capabilities: {},
143
+ });
144
+ await this.client.connect(this.transport);
145
+ return;
146
+ }
147
+ // 对于非明确的 SSE 路径,进行 streamable-http 检测和处理
148
+ // streamable-http 和 streamableHttp 都表示 SSE 传输
149
+ const isStreamableHttp = transportType === 'streamable-http' || transportType === 'streamableHttp';
150
+ if (transportType && !isStreamableHttp && !isPostBasedSSE) {
151
+ console.warn(`[MCP] Unsupported transport type: ${transportType}, falling back to SSE`);
152
+ }
153
+ let sseUrl = url;
154
+ let triedPaths = [originalPathname];
155
+ // 如果明确配置了 streamable-http,尝试先发送 POST 请求获取 SSE 端点
156
+ // 或者直接使用原始 URL(某些 streamable-http 端点可能同时支持 GET 和 POST)
157
+ if (isStreamableHttp && !isPostBasedSSE) {
158
+ console.log(`[MCP] Detected streamable-http transport, trying to discover SSE endpoint...`);
159
+ // 对于 streamable-http,端点可能不支持 GET,需要先发送 POST 请求来发现 SSE 端点
160
+ // 尝试发送一个 POST 请求,看看是否能获取 SSE 端点信息
161
+ try {
162
+ console.log(`[MCP] Attempting POST request to discover SSE endpoint: ${url.toString()}`);
163
+ const postResponse = await axios.post(url.toString(), {
164
+ jsonrpc: '2.0',
165
+ method: 'initialize',
166
+ id: 1,
167
+ params: {
168
+ protocolVersion: '2024-11-05',
169
+ capabilities: {},
170
+ clientInfo: {
171
+ name: 'flex-mcp-client',
172
+ version: '1.0.0'
173
+ }
174
+ }
175
+ }, {
176
+ headers: {
177
+ 'Content-Type': 'application/json',
178
+ ...headers
179
+ },
180
+ timeout: 5000,
181
+ validateStatus: (status) => status < 500 // 接受 4xx 状态码以便查看响应
182
+ });
183
+ console.log(`[MCP] POST response status: ${postResponse.status}`);
184
+ // 如果 POST 成功,可能端点支持 POST 但不支持 GET
185
+ // 这种情况下,streamable-http 可能需要使用 POST 传输,而不是 SSE
186
+ if (postResponse.status === 200) {
187
+ console.log(`[MCP] POST request succeeded, but SSE requires GET. This may be a POST-only endpoint.`);
188
+ // 继续尝试 SSE 连接,但使用原始 URL
189
+ }
190
+ }
191
+ catch (postError) {
192
+ // POST 请求失败,继续尝试 SSE
193
+ console.log(`[MCP] POST request failed (expected for SSE discovery): ${postError.message}`);
194
+ }
195
+ // 对于 streamable-http,端点可能同时支持 GET 和 POST
196
+ // 先尝试原始 URL,如果失败再尝试其他路径
197
+ sseUrl = url;
198
+ // 如果路径是 /mcp/mcp,尝试转换为可能的 SSE 端点
199
+ if (originalPathname.endsWith('/mcp') && !originalPathname.includes('/sse') && !originalPathname.includes('/stream')) {
200
+ const basePath = originalPathname.replace(/\/mcp$/, '') || '';
201
+ triedPaths = [
202
+ originalPathname, // 原始路径(可能支持 GET)
203
+ `${basePath}/mcp/sse`, // /api/mcp/sse
204
+ `${basePath}/mcp/stream`, // /api/mcp/stream
205
+ `${basePath}/sse`, // /api/sse
206
+ `${basePath}/stream`, // /api/stream
207
+ ];
208
+ }
209
+ }
210
+ else if (!isExplicitSSEPath && originalPathname.endsWith('/mcp') && !originalPathname.includes('/sse') && !originalPathname.includes('/stream')) {
211
+ // 只有在没有明确指定 transportType 且路径看起来不是 SSE 端点时才尝试转换
212
+ // 尝试常见的 SSE 端点路径
213
+ const basePath = originalPathname.replace(/\/mcp$/, '') || '';
214
+ const possiblePaths = [
215
+ originalPathname, // 原始路径(优先尝试)
216
+ `${basePath}/mcp/sse`, // /api/mcp/sse
217
+ `${basePath}/mcp/stream`, // /api/mcp/stream
218
+ `${basePath}/sse`, // /api/sse
219
+ `${basePath}/stream`, // /api/stream
220
+ originalPathname + '/sse', // /api/mcp/mcp/sse
221
+ originalPathname + '/stream' // /api/mcp/mcp/stream
222
+ ];
223
+ // 使用原始路径(第一个)
224
+ sseUrl = url;
225
+ triedPaths = possiblePaths;
226
+ console.log(`[MCP] Will try multiple paths if needed: ${possiblePaths.join(', ')}`);
227
+ }
228
+ console.log(`[MCP] Connecting to URL: ${sseUrl.toString()}, transportType: ${transportType || 'SSE (default)'}`);
229
+ // 使用 SSE Client Transport
230
+ // MCP SDK 的 SSEClientTransport 期望 SSE 端点 URL
231
+ // 对于 streamable-http,使用 SSE 传输
232
+ // SSEClientTransport 只接受 URL 参数
233
+ this.transport = new SSEClientTransport(sseUrl);
234
+ // 创建 MCP 客户端
235
+ this.client = new Client({
236
+ name: 'flex-mcp-client',
237
+ version: '1.0.0',
238
+ }, {
239
+ capabilities: {},
240
+ });
241
+ // 连接,添加错误处理和路径重试逻辑
242
+ let lastError = null;
243
+ // 如果配置了多个可能的路径,尝试依次连接
244
+ for (let i = 0; i < triedPaths.length; i++) {
245
+ const currentPath = triedPaths[i];
246
+ const currentUrl = new URL(currentPath, url.origin);
247
+ // 如果不是第一个路径,创建新的 transport
248
+ if (i > 0) {
249
+ console.log(`[MCP] Retrying with path: ${currentUrl.toString()}`);
250
+ // SSEClientTransport 只接受 URL 参数
251
+ this.transport = new SSEClientTransport(currentUrl);
252
+ sseUrl = currentUrl;
253
+ }
254
+ try {
255
+ await this.client.connect(this.transport);
256
+ // 连接成功,退出循环
257
+ console.log(`[MCP] Successfully connected to: ${currentUrl.toString()}`);
258
+ return;
259
+ }
260
+ catch (error) {
261
+ lastError = error;
262
+ const errorMessage = error.message || String(error);
263
+ // 如果是 404 错误且还有更多路径可尝试,继续尝试下一个
264
+ if ((errorMessage.includes('404') || errorMessage.includes('Not Found')) && i < triedPaths.length - 1) {
265
+ console.log(`[MCP] Path ${currentUrl.toString()} returned 404, trying next path...`);
266
+ continue;
267
+ }
268
+ // 如果是 405 错误,提供详细的错误信息
269
+ if (errorMessage.includes('405') || errorMessage.includes('Method Not Allowed')) {
270
+ // 对于 streamable-http,405 可能意味着端点不支持 GET
271
+ // 但 streamable-http 端点应该同时支持 GET 和 POST
272
+ const isStreamableHttp = transportType === 'streamable-http' || transportType === 'streamableHttp';
273
+ if (isStreamableHttp && i === 0) {
274
+ // 如果是 streamable-http 且是第一次尝试,继续尝试其他路径
275
+ console.log(`[MCP] streamable-http endpoint returned 405, trying alternative paths...`);
276
+ continue;
277
+ }
278
+ const suggestions = [
279
+ `The endpoint "${currentUrl.toString()}" returned 405 (Method Not Allowed).`,
280
+ `SSE connections require GET method, but the server may not support it at this endpoint.`,
281
+ `Original URL: ${this.options.url}`,
282
+ `Transport Type: ${transportType || 'default (SSE)'}`,
283
+ `Tried paths: ${triedPaths.join(', ')}`,
284
+ ``,
285
+ `Possible solutions:`,
286
+ `1. For streamable-http: Verify the endpoint supports both GET and POST methods`,
287
+ `2. Check if the URL path is correct (e.g., /mcp/sse, /mcp/stream, /sse)`,
288
+ `3. Some streamable-http endpoints may require a different path for SSE`,
289
+ `4. Check server logs for more details about the 405 error`,
290
+ `5. Contact the server administrator to confirm the correct SSE endpoint URL`
291
+ ].join('\n');
292
+ throw new Error(suggestions);
293
+ }
294
+ // 如果是 404 错误且没有更多路径可尝试
295
+ if (errorMessage.includes('404') || errorMessage.includes('Not Found')) {
296
+ const suggestions = [
297
+ `The endpoint "${currentUrl.toString()}" returned 404 (Not Found).`,
298
+ `Original URL: ${this.options.url}`,
299
+ `Tried paths: ${triedPaths.join(', ')}`,
300
+ ``,
301
+ `Possible solutions:`,
302
+ `1. Verify the URL path is correct for the SSE endpoint`,
303
+ `2. Check if the server is running and accessible`,
304
+ `3. Verify the endpoint path in server documentation`,
305
+ `4. If using streamable-http, ensure the URL points to the correct SSE endpoint`
306
+ ].join('\n');
307
+ throw new Error(suggestions);
308
+ }
309
+ // 其他错误,直接抛出
310
+ throw error;
311
+ }
312
+ }
313
+ // 如果所有路径都失败了,抛出最后一个错误
314
+ throw lastError;
315
+ }
316
+ /**
317
+ * 列出所有工具
318
+ */
319
+ async listTools() {
320
+ if (!this.client) {
321
+ throw new Error('Client not initialized');
322
+ }
323
+ try {
324
+ const response = await this.client.listTools();
325
+ return response.tools || [];
326
+ }
327
+ catch (error) {
328
+ // 如果服务器不支持 tools/list 方法,返回空数组
329
+ // 某些服务器可能不支持标准的 MCP 方法
330
+ // 检查错误代码或消息
331
+ const errorCode = error.code || error.error?.code;
332
+ const errorMessage = error.message || error.error?.message || '';
333
+ if (errorCode === -32601 || errorMessage.includes('Method not found') || errorMessage.includes('not found')) {
334
+ console.warn(`[MCP] Server does not support tools/list method (code: ${errorCode}), returning empty array`);
335
+ return [];
336
+ }
337
+ throw error;
338
+ }
339
+ }
340
+ /**
341
+ * 调用工具
342
+ */
343
+ async callTool(name, args) {
344
+ if (!this.client) {
345
+ throw new Error('Client not initialized');
346
+ }
347
+ const response = await this.client.callTool({
348
+ name,
349
+ arguments: args,
350
+ });
351
+ return response;
352
+ }
353
+ /**
354
+ * 列出所有提示
355
+ */
356
+ async listPrompts() {
357
+ if (!this.client) {
358
+ throw new Error('Client not initialized');
359
+ }
360
+ try {
361
+ const response = await this.client.listPrompts();
362
+ return response.prompts || [];
363
+ }
364
+ catch (error) {
365
+ // 如果服务器不支持 prompts/list 方法,返回空数组
366
+ const errorCode = error.code || error.error?.code;
367
+ const errorMessage = error.message || error.error?.message || '';
368
+ if (errorCode === -32601 || errorMessage.includes('Method not found') || errorMessage.includes('not found')) {
369
+ console.warn(`[MCP] Server does not support prompts/list method (code: ${errorCode}), returning empty array`);
370
+ return [];
371
+ }
372
+ throw error;
373
+ }
374
+ }
375
+ /**
376
+ * 获取提示
377
+ */
378
+ async getPrompt(name, args) {
379
+ if (!this.client) {
380
+ throw new Error('Client not initialized');
381
+ }
382
+ const response = await this.client.getPrompt({ name, arguments: args || {} });
383
+ return response;
384
+ }
385
+ /**
386
+ * 关闭客户端
387
+ * 添加超时机制,确保资源正确释放
388
+ */
389
+ async close() {
390
+ if (this.client) {
391
+ try {
392
+ // 使用 Promise.race 实现超时(5秒)
393
+ await Promise.race([
394
+ this.client.close(),
395
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Close timeout')), 5000))
396
+ ]);
397
+ }
398
+ catch (error) {
399
+ // 超时或关闭失败,记录警告但继续清理
400
+ if (error.message === 'Close timeout') {
401
+ console.warn(`[MCP] Client close timeout, forcing cleanup`);
402
+ }
403
+ else {
404
+ console.warn(`[MCP] Error closing client:`, error.message);
405
+ }
406
+ }
407
+ finally {
408
+ this.client = null;
409
+ }
410
+ }
411
+ if (this.transport) {
412
+ // SDK client.close() 通常会关闭传输
413
+ // 但为了安全,我们显式清理引用
414
+ this.transport = null;
415
+ }
416
+ }
417
+ }
418
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * POST-based SSE Transport
3
+ * 实现 MCP SDK Transport 接口,支持需要 POST 方法的 SSE 端点(streamable-http)
4
+ */
5
+ import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
6
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
7
+ export interface PostSSETransportOptions {
8
+ url: URL;
9
+ headers?: Record<string, string>;
10
+ }
11
+ /**
12
+ * POST-based SSE Transport
13
+ * 兼容 MCP SDK Transport 接口
14
+ * 通过 POST 请求建立 SSE 连接,使用流式响应处理 SSE 消息
15
+ */
16
+ export declare class PostSSETransport implements Transport {
17
+ private url;
18
+ private headers;
19
+ private stream;
20
+ private abortController;
21
+ private endpoint;
22
+ private buffer;
23
+ private isStarted;
24
+ private startPromise;
25
+ private endpointReceived;
26
+ private initializeResponseReceived;
27
+ onclose?: () => void;
28
+ onerror?: (error: Error) => void;
29
+ onmessage?: (message: JSONRPCMessage) => void;
30
+ constructor(options: PostSSETransportOptions);
31
+ /**
32
+ * 启动传输(实现 Transport 接口)
33
+ */
34
+ start(): Promise<void>;
35
+ /**
36
+ * 处理 SSE 流式响应
37
+ */
38
+ private handleStream;
39
+ /**
40
+ * 处理 SSE 消息
41
+ */
42
+ private processSSEMessage;
43
+ /**
44
+ * 发送消息(实现 Transport 接口)
45
+ */
46
+ send(message: JSONRPCMessage): Promise<void>;
47
+ /**
48
+ * 关闭连接(实现 Transport 接口)
49
+ */
50
+ close(): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=post-sse-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-sse-transport.d.ts","sourceRoot":"","sources":["../../src/mcp/post-sse-transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAI/E,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,SAAS;IAChD,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAwE;IAC5F,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,0BAA0B,CAAS;IAG3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,OAAO,EAAE,uBAAuB;IAS5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiE5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkEpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2EzB;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4HlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB7B"}