@lmcc-dev/mult-fetch-mcp-server 1.0.2 → 1.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 (115) hide show
  1. package/README.md +14 -2
  2. package/README.zh.md +3 -2
  3. package/dist/src/client.d.ts +6 -0
  4. package/dist/src/client.js +26 -28
  5. package/dist/src/client.js.map +1 -0
  6. package/dist/src/index.d.ts +15 -0
  7. package/dist/src/index.js.map +1 -0
  8. package/dist/src/lib/BrowserFetcher.d.ts +175 -0
  9. package/dist/src/lib/BrowserFetcher.js +99 -65
  10. package/dist/src/lib/BrowserFetcher.js.map +1 -0
  11. package/dist/src/lib/NodeFetcher.d.ts +92 -0
  12. package/dist/src/lib/NodeFetcher.js +150 -86
  13. package/dist/src/lib/NodeFetcher.js.map +1 -0
  14. package/dist/src/lib/i18n/index.js.map +1 -0
  15. package/dist/src/lib/i18n/keys.js +135 -0
  16. package/dist/src/lib/i18n/locales/en/browser.d.ts +61 -0
  17. package/dist/src/lib/i18n/locales/en/browser.js +68 -45
  18. package/dist/src/lib/i18n/locales/en/browser.js.map +1 -0
  19. package/dist/src/lib/i18n/locales/en/client.d.ts +39 -0
  20. package/dist/src/lib/i18n/locales/en/client.js.map +1 -0
  21. package/dist/src/lib/i18n/locales/en/errors.d.ts +17 -0
  22. package/dist/src/lib/i18n/locales/en/errors.js.map +1 -0
  23. package/dist/src/lib/i18n/locales/en/fetcher.d.ts +66 -0
  24. package/dist/src/lib/i18n/locales/en/fetcher.js +60 -59
  25. package/dist/src/lib/i18n/locales/en/fetcher.js.map +1 -0
  26. package/dist/src/lib/i18n/locales/en/index.d.ts +344 -0
  27. package/dist/src/lib/i18n/locales/en/index.js +1 -1
  28. package/dist/src/lib/i18n/locales/en/index.js.map +1 -0
  29. package/dist/src/lib/i18n/locales/en/node.d.ts +41 -0
  30. package/dist/src/lib/i18n/locales/en/node.js.map +1 -0
  31. package/dist/src/lib/i18n/locales/en/prompts.d.ts +65 -0
  32. package/dist/src/lib/i18n/locales/en/prompts.js.map +1 -0
  33. package/dist/src/lib/i18n/locales/en/resources.d.ts +41 -0
  34. package/dist/src/lib/i18n/locales/en/resources.js +30 -15
  35. package/dist/src/lib/i18n/locales/en/resources.js.map +1 -0
  36. package/dist/src/lib/i18n/locales/en/server.d.ts +30 -0
  37. package/dist/src/lib/i18n/locales/en/server.js.map +1 -0
  38. package/dist/src/lib/i18n/locales/en/tools.d.ts +24 -0
  39. package/dist/src/lib/i18n/locales/en/tools.js.map +1 -0
  40. package/dist/src/lib/i18n/locales/zh/browser.d.ts +61 -0
  41. package/dist/src/lib/i18n/locales/zh/browser.js +68 -45
  42. package/dist/src/lib/i18n/locales/zh/browser.js.map +1 -0
  43. package/dist/src/lib/i18n/locales/zh/client.d.ts +38 -0
  44. package/dist/src/lib/i18n/locales/zh/client.js.map +1 -0
  45. package/dist/src/lib/i18n/locales/zh/errors.d.ts +17 -0
  46. package/dist/src/lib/i18n/locales/zh/errors.js.map +1 -0
  47. package/dist/src/lib/i18n/locales/zh/fetcher.d.ts +66 -0
  48. package/dist/src/lib/i18n/locales/zh/fetcher.js +60 -59
  49. package/dist/src/lib/i18n/locales/zh/fetcher.js.map +1 -0
  50. package/dist/src/lib/i18n/locales/zh/index.d.ts +343 -0
  51. package/dist/src/lib/i18n/locales/zh/index.js +1 -1
  52. package/dist/src/lib/i18n/locales/zh/index.js.map +1 -0
  53. package/dist/src/lib/i18n/locales/zh/node.d.ts +41 -0
  54. package/dist/src/lib/i18n/locales/zh/node.js.map +1 -0
  55. package/dist/src/lib/i18n/locales/zh/prompts.d.ts +65 -0
  56. package/dist/src/lib/i18n/locales/zh/prompts.js.map +1 -0
  57. package/dist/src/lib/i18n/locales/zh/resources.d.ts +41 -0
  58. package/dist/src/lib/i18n/locales/zh/resources.js +28 -13
  59. package/dist/src/lib/i18n/locales/zh/resources.js.map +1 -0
  60. package/dist/src/lib/i18n/locales/zh/server.d.ts +30 -0
  61. package/dist/src/lib/i18n/locales/zh/server.js.map +1 -0
  62. package/dist/src/lib/i18n/locales/zh/tools.d.ts +24 -0
  63. package/dist/src/lib/i18n/locales/zh/tools.js.map +1 -0
  64. package/dist/src/lib/i18n/logger.d.ts +38 -0
  65. package/dist/src/lib/i18n/logger.js.map +1 -0
  66. package/dist/src/lib/logger.d.ts +32 -0
  67. package/dist/src/lib/logger.js.map +1 -0
  68. package/dist/src/lib/server/browser.d.ts +34 -0
  69. package/dist/src/lib/server/browser.js +10 -16
  70. package/dist/src/lib/server/browser.js.map +1 -0
  71. package/dist/src/lib/server/fetcher.d.ts +20 -0
  72. package/dist/src/lib/server/fetcher.js.map +1 -0
  73. package/dist/src/lib/server/index.d.ts +10 -0
  74. package/dist/src/lib/server/index.js.map +1 -0
  75. package/dist/src/lib/server/prompts.d.ts +11 -0
  76. package/dist/src/lib/server/prompts.js +6 -6
  77. package/dist/src/lib/server/prompts.js.map +1 -0
  78. package/dist/src/lib/server/resources.d.ts +11 -0
  79. package/dist/src/lib/server/resources.js.map +1 -0
  80. package/dist/src/lib/server/tools.d.ts +12 -0
  81. package/dist/src/lib/server/tools.js +369 -309
  82. package/dist/src/lib/server/tools.js.map +1 -0
  83. package/dist/src/lib/server/types.d.ts +71 -0
  84. package/dist/src/lib/server/types.js.map +1 -0
  85. package/dist/src/lib/types.d.ts +119 -0
  86. package/dist/src/lib/types.js.map +1 -0
  87. package/dist/src/lib/utils/errorDetection.js +41 -0
  88. package/dist/src/lib/utils/errors.js +279 -0
  89. package/dist/src/mcp-server.d.ts +6 -0
  90. package/dist/src/mcp-server.js.map +1 -0
  91. package/dist/tests/BrowserFetcher.test.js +951 -0
  92. package/dist/tests/NodeFetcher.test.js +263 -0
  93. package/dist/tests/client.test.js +250 -0
  94. package/dist/tests/i18n.test.js +179 -0
  95. package/dist/tests/jest.setup.d.ts +6 -0
  96. package/dist/tests/jest.setup.js +30 -0
  97. package/dist/tests/jest.setup.js.map +1 -0
  98. package/dist/tests/logger.test.js +99 -0
  99. package/dist/tests/mcp-server.test.js +113 -0
  100. package/dist/tests/server/browser.test.js +197 -0
  101. package/dist/tests/server/fetcher.test.js +216 -0
  102. package/dist/tests/server/index.test.js +122 -0
  103. package/dist/tests/server/prompts.test.js +243 -0
  104. package/dist/tests/server/resources.test.js +359 -0
  105. package/dist/tests/server/tools.test.js +222 -0
  106. package/dist/tests/test-direct-client.d.ts +6 -0
  107. package/dist/tests/test-direct-client.js.map +1 -0
  108. package/dist/tests/test-mcp-methods.d.ts +6 -0
  109. package/dist/tests/test-mcp-methods.js.map +1 -0
  110. package/dist/tests/test-mcp.d.ts +6 -0
  111. package/dist/tests/test-mcp.js.map +1 -0
  112. package/dist/tests/test-mini4k.d.ts +6 -0
  113. package/dist/tests/test-mini4k.js.map +1 -0
  114. package/dist/tests/types.test.js +57 -0
  115. package/package.json +12 -3
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ import { ListResourcesRequestSchema, ReadResourceRequestSchema } from "@modelcontextprotocol/sdk/types.js";
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ // 模拟logger模块
10
+ jest.mock('../../src/lib/logger.js', () => ({
11
+ log: jest.fn(),
12
+ getLogFilePath: jest.fn().mockReturnValue('/mock/path/to/debug.log'),
13
+ clearLogFile: jest.fn(),
14
+ COMPONENTS: {
15
+ RESOURCES: 'resources'
16
+ }
17
+ }));
18
+ // 模拟fs模块
19
+ jest.mock('fs', () => ({
20
+ readFileSync: jest.fn()
21
+ }));
22
+ // 模拟path模块
23
+ jest.mock('path', () => ({
24
+ dirname: jest.fn(),
25
+ resolve: jest.fn(),
26
+ join: jest.fn(),
27
+ extname: jest.fn()
28
+ }));
29
+ // 模拟url模块
30
+ jest.mock('url', () => ({
31
+ fileURLToPath: jest.fn()
32
+ }));
33
+ // 获取MIME类型函数
34
+ function getMimeType(filePath) {
35
+ const ext = path.extname(filePath).toLowerCase();
36
+ switch (ext) {
37
+ case '.md':
38
+ return 'text/markdown';
39
+ case '.json':
40
+ return 'application/json';
41
+ case '.ts':
42
+ return 'text/typescript';
43
+ case '.js':
44
+ return 'text/javascript';
45
+ case '.html':
46
+ return 'text/html';
47
+ case '.css':
48
+ return 'text/css';
49
+ case '.txt':
50
+ case '.log':
51
+ return 'text/plain';
52
+ default:
53
+ return 'application/octet-stream';
54
+ }
55
+ }
56
+ // 模拟registerResources函数
57
+ const registerResources = (server) => {
58
+ // 注册资源列表处理程序
59
+ server.setRequestHandler(ListResourcesRequestSchema, async (request) => {
60
+ const debug = request.params?.debug === true;
61
+ require('../../src/lib/logger.js').log('resources.list.request', debug, { params: request.params }, 'resources');
62
+ // 返回实际可用的资源列表
63
+ return {
64
+ resources: [
65
+ {
66
+ name: 'mult-fetch-mcp:log:debug-log',
67
+ uri: 'file:///logs/debug',
68
+ description: 'Debug log file containing all debug messages from the server'
69
+ },
70
+ {
71
+ name: 'mult-fetch-mcp:log:clear-debug-log',
72
+ uri: 'file:///logs/clear',
73
+ description: 'Clear the debug log file'
74
+ }
75
+ ],
76
+ resourceTemplates: [
77
+ {
78
+ uriTemplate: 'file:///src/{path}',
79
+ description: 'Source code files in the project',
80
+ name: 'mult-fetch-mcp:src:file'
81
+ },
82
+ {
83
+ uriTemplate: 'file:///docs/{path}',
84
+ description: 'Documentation files in the project',
85
+ name: 'mult-fetch-mcp:docs:file'
86
+ }
87
+ ]
88
+ };
89
+ });
90
+ // 注册资源读取处理程序
91
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
92
+ const uri = request.params.uri;
93
+ const debug = request.params?.debug === true;
94
+ require('../../src/lib/logger.js').log('resources.read.request', debug, { uri }, 'resources');
95
+ try {
96
+ // 解析URI并读取相应文件
97
+ let filePath = null;
98
+ let content = '';
99
+ // 处理日志文件URI
100
+ if (uri === 'file:///logs/debug') {
101
+ filePath = require('../../src/lib/logger.js').getLogFilePath();
102
+ content = fs.readFileSync(filePath, 'utf-8');
103
+ }
104
+ // 处理清理日志文件URI
105
+ else if (uri === 'file:///logs/clear') {
106
+ require('../../src/lib/logger.js').clearLogFile();
107
+ content = '日志文件已清理 (Log file has been cleared)';
108
+ }
109
+ // 处理文档资源
110
+ else if (uri.startsWith('file:///docs/')) {
111
+ const resourceName = uri.substring('file:///docs/'.length);
112
+ filePath = path.join('/mock/path/to', resourceName + '.md');
113
+ content = fs.readFileSync(filePath, 'utf-8');
114
+ }
115
+ // 处理源代码资源
116
+ else if (uri.startsWith('file:///src/')) {
117
+ const resourceName = uri.substring('file:///src/'.length);
118
+ filePath = path.join('/mock/path/to', resourceName + '.ts');
119
+ content = fs.readFileSync(filePath, 'utf-8');
120
+ }
121
+ // 处理无效URI
122
+ else {
123
+ throw new Error('Invalid URI');
124
+ }
125
+ // 获取MIME类型
126
+ const mimeType = getMimeType(filePath || '');
127
+ return {
128
+ contents: [
129
+ {
130
+ uri,
131
+ mimeType,
132
+ text: content
133
+ }
134
+ ]
135
+ };
136
+ }
137
+ catch (error) {
138
+ require('../../src/lib/logger.js').log('resources.fileReadError', true, {
139
+ filePath: 'unknown',
140
+ error: error instanceof Error ? error.message : String(error)
141
+ }, 'resources');
142
+ throw new Error(`resources.notFound: ${uri}`);
143
+ }
144
+ });
145
+ };
146
+ // 模拟resources模块
147
+ jest.mock('../../src/lib/server/resources.js', () => ({
148
+ registerResources
149
+ }));
150
+ describe('resources模块测试', () => {
151
+ let server;
152
+ let listResourcesHandler;
153
+ let readResourceHandler;
154
+ beforeEach(() => {
155
+ // 重置所有模拟
156
+ jest.clearAllMocks();
157
+ // 创建模拟Server实例
158
+ server = {
159
+ setRequestHandler: jest.fn((schema, handler) => {
160
+ if (schema === ListResourcesRequestSchema) {
161
+ listResourcesHandler = handler;
162
+ }
163
+ else if (schema === ReadResourceRequestSchema) {
164
+ readResourceHandler = handler;
165
+ }
166
+ })
167
+ };
168
+ // 注册资源处理程序
169
+ registerResources(server);
170
+ });
171
+ describe('registerResources', () => {
172
+ it('应该注册ListResourcesRequestSchema和ReadResourceRequestSchema处理程序', () => {
173
+ expect(server.setRequestHandler).toHaveBeenCalledTimes(2);
174
+ expect(server.setRequestHandler).toHaveBeenCalledWith(ListResourcesRequestSchema, expect.any(Function));
175
+ expect(server.setRequestHandler).toHaveBeenCalledWith(ReadResourceRequestSchema, expect.any(Function));
176
+ });
177
+ });
178
+ describe('ListResourcesRequestSchema处理程序', () => {
179
+ it('应该返回可用的资源列表', async () => {
180
+ const request = { params: {} };
181
+ const response = await listResourcesHandler(request);
182
+ expect(response).toHaveProperty('resources');
183
+ expect(Array.isArray(response.resources)).toBe(true);
184
+ expect(response.resources.length).toBe(2);
185
+ // 验证返回的资源
186
+ const resourceNames = response.resources.map((r) => r.name);
187
+ expect(resourceNames).toContain('mult-fetch-mcp:log:debug-log');
188
+ expect(resourceNames).toContain('mult-fetch-mcp:log:clear-debug-log');
189
+ // 验证资源模板
190
+ expect(response).toHaveProperty('resourceTemplates');
191
+ expect(Array.isArray(response.resourceTemplates)).toBe(true);
192
+ expect(response.resourceTemplates.length).toBe(2);
193
+ const templateNames = response.resourceTemplates.map((t) => t.name);
194
+ expect(templateNames).toContain('mult-fetch-mcp:src:file');
195
+ expect(templateNames).toContain('mult-fetch-mcp:docs:file');
196
+ });
197
+ it('应该处理debug参数', async () => {
198
+ const request = { params: { debug: true } };
199
+ await listResourcesHandler(request);
200
+ // 验证日志调用
201
+ expect(require('../../src/lib/logger.js').log).toHaveBeenCalledWith('resources.list.request', true, { params: { debug: true } }, 'resources');
202
+ });
203
+ });
204
+ describe('ReadResourceRequestSchema处理程序', () => {
205
+ it('应该处理debug日志资源', async () => {
206
+ // 模拟文件内容
207
+ fs.readFileSync.mockReturnValue('Debug log content');
208
+ path.extname.mockReturnValue('.log');
209
+ const request = {
210
+ params: {
211
+ uri: 'file:///logs/debug'
212
+ }
213
+ };
214
+ const response = await readResourceHandler(request);
215
+ expect(response).toHaveProperty('contents');
216
+ expect(Array.isArray(response.contents)).toBe(true);
217
+ expect(response.contents.length).toBe(1);
218
+ // 验证内容
219
+ const content = response.contents[0];
220
+ expect(content.uri).toBe('file:///logs/debug');
221
+ expect(content.mimeType).toBe('text/plain');
222
+ expect(content.text).toBe('Debug log content');
223
+ // 验证getLogFilePath被调用
224
+ expect(require('../../src/lib/logger.js').getLogFilePath).toHaveBeenCalled();
225
+ expect(fs.readFileSync).toHaveBeenCalledWith('/mock/path/to/debug.log', 'utf-8');
226
+ });
227
+ it('应该处理清理日志资源', async () => {
228
+ const request = {
229
+ params: {
230
+ uri: 'file:///logs/clear'
231
+ }
232
+ };
233
+ const response = await readResourceHandler(request);
234
+ expect(response).toHaveProperty('contents');
235
+ expect(Array.isArray(response.contents)).toBe(true);
236
+ expect(response.contents.length).toBe(1);
237
+ // 验证内容
238
+ const content = response.contents[0];
239
+ expect(content.uri).toBe('file:///logs/clear');
240
+ expect(content.text).toContain('日志文件已清理');
241
+ // 验证clearLogFile被调用
242
+ expect(require('../../src/lib/logger.js').clearLogFile).toHaveBeenCalled();
243
+ });
244
+ it('应该处理文档资源', async () => {
245
+ // 模拟路径和文件内容
246
+ path.join.mockReturnValue('/mock/path/to/README.md');
247
+ fs.readFileSync.mockReturnValue('# README content');
248
+ path.extname.mockReturnValue('.md');
249
+ const request = {
250
+ params: {
251
+ uri: 'file:///docs/readme'
252
+ }
253
+ };
254
+ const response = await readResourceHandler(request);
255
+ expect(response).toHaveProperty('contents');
256
+ expect(Array.isArray(response.contents)).toBe(true);
257
+ expect(response.contents.length).toBe(1);
258
+ // 验证内容
259
+ const content = response.contents[0];
260
+ expect(content.uri).toBe('file:///docs/readme');
261
+ expect(content.mimeType).toBe('text/markdown');
262
+ expect(content.text).toBe('# README content');
263
+ // 验证path.join被调用
264
+ expect(path.join).toHaveBeenCalled();
265
+ expect(fs.readFileSync).toHaveBeenCalledWith('/mock/path/to/README.md', 'utf-8');
266
+ });
267
+ it('应该处理源代码资源', async () => {
268
+ // 模拟路径和文件内容
269
+ path.join.mockReturnValue('/mock/path/to/index.ts');
270
+ fs.readFileSync.mockReturnValue('// Source code');
271
+ path.extname.mockReturnValue('.ts');
272
+ const request = {
273
+ params: {
274
+ uri: 'file:///src/index'
275
+ }
276
+ };
277
+ const response = await readResourceHandler(request);
278
+ expect(response).toHaveProperty('contents');
279
+ expect(Array.isArray(response.contents)).toBe(true);
280
+ expect(response.contents.length).toBe(1);
281
+ // 验证内容
282
+ const content = response.contents[0];
283
+ expect(content.uri).toBe('file:///src/index');
284
+ expect(content.mimeType).toBe('text/typescript');
285
+ expect(content.text).toBe('// Source code');
286
+ // 验证path.join被调用
287
+ expect(path.join).toHaveBeenCalled();
288
+ expect(fs.readFileSync).toHaveBeenCalledWith('/mock/path/to/index.ts', 'utf-8');
289
+ });
290
+ it('应该处理无效的URI', async () => {
291
+ const request = {
292
+ params: {
293
+ uri: 'invalid-uri'
294
+ }
295
+ };
296
+ await expect(readResourceHandler(request)).rejects.toThrow('resources.notFound');
297
+ });
298
+ it('应该处理文件读取错误', async () => {
299
+ // 模拟路径
300
+ path.join.mockReturnValue('/mock/path/to/file.txt');
301
+ // 模拟文件读取错误
302
+ fs.readFileSync.mockImplementation(() => {
303
+ throw new Error('File not found');
304
+ });
305
+ const request = {
306
+ params: {
307
+ uri: 'file:///docs/file'
308
+ }
309
+ };
310
+ await expect(readResourceHandler(request)).rejects.toThrow('resources.notFound');
311
+ // 验证错误日志
312
+ expect(require('../../src/lib/logger.js').log).toHaveBeenCalledWith('resources.fileReadError', expect.any(Boolean), expect.objectContaining({
313
+ error: expect.any(String)
314
+ }), 'resources');
315
+ });
316
+ it('应该处理debug参数', async () => {
317
+ // 模拟文件内容
318
+ fs.readFileSync.mockReturnValue('Debug log content');
319
+ path.extname.mockReturnValue('.log');
320
+ const request = {
321
+ params: {
322
+ uri: 'file:///logs/debug',
323
+ debug: true
324
+ }
325
+ };
326
+ await readResourceHandler(request);
327
+ // 验证日志调用
328
+ expect(require('../../src/lib/logger.js').log).toHaveBeenCalledWith('resources.read.request', true, { uri: 'file:///logs/debug' }, 'resources');
329
+ });
330
+ });
331
+ describe('getMimeType函数', () => {
332
+ it('应该返回正确的MIME类型', async () => {
333
+ // 测试不同的文件扩展名
334
+ const testExtensions = [
335
+ { ext: '.md', mime: 'text/markdown' },
336
+ { ext: '.json', mime: 'application/json' },
337
+ { ext: '.ts', mime: 'text/typescript' },
338
+ { ext: '.js', mime: 'text/javascript' },
339
+ { ext: '.html', mime: 'text/html' },
340
+ { ext: '.css', mime: 'text/css' },
341
+ { ext: '.txt', mime: 'text/plain' },
342
+ { ext: '.log', mime: 'text/plain' },
343
+ { ext: '.unknown', mime: 'application/octet-stream' }
344
+ ];
345
+ for (const test of testExtensions) {
346
+ // 模拟文件路径和内容
347
+ path.extname.mockReturnValue(test.ext);
348
+ fs.readFileSync.mockReturnValue('File content');
349
+ const request = {
350
+ params: {
351
+ uri: `file:///docs/file${test.ext}`
352
+ }
353
+ };
354
+ const response = await readResourceHandler(request);
355
+ expect(response.contents[0].mimeType).toBe(test.mime);
356
+ }
357
+ });
358
+ });
359
+ });
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
7
+ import { registerTools } from '../../src/lib/server/tools.js';
8
+ import { fetchWithAutoDetect } from '../../src/lib/server/fetcher.js';
9
+ // 模拟 fetchWithAutoDetect 函数
10
+ jest.mock('../../src/lib/server/fetcher.js', () => ({
11
+ fetchWithAutoDetect: jest.fn()
12
+ }));
13
+ // 模拟 logger
14
+ jest.mock('../../src/lib/logger.js', () => ({
15
+ log: jest.fn(),
16
+ COMPONENTS: {
17
+ TOOLS: 'tools'
18
+ }
19
+ }));
20
+ describe('工具注册和调用测试 (Tools Registration and Calling Tests)', () => {
21
+ let mockServer;
22
+ let mockSetRequestHandler;
23
+ beforeEach(() => {
24
+ // 重置所有模拟
25
+ jest.clearAllMocks();
26
+ // 创建模拟的 Server 实例
27
+ mockSetRequestHandler = jest.fn();
28
+ mockServer = {
29
+ setRequestHandler: mockSetRequestHandler
30
+ };
31
+ // 设置 fetchWithAutoDetect 的默认返回值
32
+ fetchWithAutoDetect.mockResolvedValue({
33
+ content: [{ type: 'text', text: 'mock content' }],
34
+ isError: false
35
+ });
36
+ });
37
+ test('应该正确注册工具列表处理程序 (Should register list tools handler correctly)', () => {
38
+ // 调用被测试的函数
39
+ registerTools(mockServer);
40
+ // 验证 setRequestHandler 被调用了两次(一次用于列表,一次用于调用)
41
+ expect(mockSetRequestHandler).toHaveBeenCalledTimes(2);
42
+ // 验证第一次调用是用于注册工具列表处理程序
43
+ expect(mockSetRequestHandler.mock.calls[0][0]).toBe(ListToolsRequestSchema);
44
+ // 获取注册的处理程序
45
+ const listToolsHandler = mockSetRequestHandler.mock.calls[0][1];
46
+ // 调用处理程序并验证返回的工具列表
47
+ return listToolsHandler().then((result) => {
48
+ expect(result).toHaveProperty('tools');
49
+ expect(result.tools).toBeInstanceOf(Array);
50
+ expect(result.tools.length).toBe(4); // 应该有4个工具
51
+ // 验证工具名称
52
+ const toolNames = result.tools.map((tool) => tool.name);
53
+ expect(toolNames).toContain('fetch_html');
54
+ expect(toolNames).toContain('fetch_json');
55
+ expect(toolNames).toContain('fetch_txt');
56
+ expect(toolNames).toContain('fetch_markdown');
57
+ // 验证每个工具都有必要的属性
58
+ result.tools.forEach((tool) => {
59
+ expect(tool).toHaveProperty('name');
60
+ expect(tool).toHaveProperty('description');
61
+ expect(tool).toHaveProperty('inputSchema');
62
+ expect(tool.inputSchema).toHaveProperty('type', 'object');
63
+ expect(tool.inputSchema).toHaveProperty('properties');
64
+ expect(tool.inputSchema.properties).toHaveProperty('url');
65
+ expect(tool.inputSchema).toHaveProperty('required', ['url']);
66
+ });
67
+ });
68
+ });
69
+ test('应该正确注册工具调用处理程序 (Should register call tool handler correctly)', () => {
70
+ // 调用被测试的函数
71
+ registerTools(mockServer);
72
+ // 验证第二次调用是用于注册工具调用处理程序
73
+ expect(mockSetRequestHandler.mock.calls[1][0]).toBe(CallToolRequestSchema);
74
+ });
75
+ test('应该正确处理 fetch_html 工具调用 (Should handle fetch_html tool call correctly)', async () => {
76
+ // 调用被测试的函数
77
+ registerTools(mockServer);
78
+ // 获取注册的处理程序
79
+ const callToolHandler = mockSetRequestHandler.mock.calls[1][1];
80
+ // 创建请求对象
81
+ const request = {
82
+ params: {
83
+ name: 'fetch_html',
84
+ arguments: {
85
+ url: 'https://example.com'
86
+ }
87
+ }
88
+ };
89
+ // 调用处理程序
90
+ const result = await callToolHandler(request);
91
+ // 验证 fetchWithAutoDetect 被调用,且参数正确
92
+ expect(fetchWithAutoDetect).toHaveBeenCalledWith({ url: 'https://example.com', method: 'fetch_html' }, 'html');
93
+ // 验证返回结果
94
+ expect(result).toHaveProperty('content');
95
+ expect(result).toHaveProperty('isError', false);
96
+ expect(result.content[0]).toHaveProperty('type', 'text');
97
+ expect(result.content[0]).toHaveProperty('text', 'mock content');
98
+ });
99
+ test('应该正确处理 fetch_json 工具调用 (Should handle fetch_json tool call correctly)', async () => {
100
+ // 调用被测试的函数
101
+ registerTools(mockServer);
102
+ // 获取注册的处理程序
103
+ const callToolHandler = mockSetRequestHandler.mock.calls[1][1];
104
+ // 创建请求对象
105
+ const request = {
106
+ params: {
107
+ name: 'fetch_json',
108
+ arguments: {
109
+ url: 'https://example.com/data.json'
110
+ }
111
+ }
112
+ };
113
+ // 调用处理程序
114
+ const result = await callToolHandler(request);
115
+ // 验证 fetchWithAutoDetect 被调用,且参数正确
116
+ expect(fetchWithAutoDetect).toHaveBeenCalledWith({ url: 'https://example.com/data.json', method: 'fetch_json' }, 'json');
117
+ // 验证返回结果
118
+ expect(result).toHaveProperty('content');
119
+ expect(result).toHaveProperty('isError', false);
120
+ expect(result.content[0]).toHaveProperty('type', 'text');
121
+ expect(result.content[0]).toHaveProperty('text', 'mock content');
122
+ });
123
+ test('应该正确处理 fetch_txt 工具调用 (Should handle fetch_txt tool call correctly)', async () => {
124
+ // 调用被测试的函数
125
+ registerTools(mockServer);
126
+ // 获取注册的处理程序
127
+ const callToolHandler = mockSetRequestHandler.mock.calls[1][1];
128
+ // 创建请求对象
129
+ const request = {
130
+ params: {
131
+ name: 'fetch_txt',
132
+ arguments: {
133
+ url: 'https://example.com/text.txt'
134
+ }
135
+ }
136
+ };
137
+ // 调用处理程序
138
+ const result = await callToolHandler(request);
139
+ // 验证 fetchWithAutoDetect 被调用,且参数正确
140
+ expect(fetchWithAutoDetect).toHaveBeenCalledWith({ url: 'https://example.com/text.txt', method: 'fetch_txt' }, 'txt');
141
+ // 验证返回结果
142
+ expect(result).toHaveProperty('content');
143
+ expect(result).toHaveProperty('isError', false);
144
+ expect(result.content[0]).toHaveProperty('type', 'text');
145
+ expect(result.content[0]).toHaveProperty('text', 'mock content');
146
+ });
147
+ test('应该正确处理 fetch_markdown 工具调用 (Should handle fetch_markdown tool call correctly)', async () => {
148
+ // 调用被测试的函数
149
+ registerTools(mockServer);
150
+ // 获取注册的处理程序
151
+ const callToolHandler = mockSetRequestHandler.mock.calls[1][1];
152
+ // 创建请求对象
153
+ const request = {
154
+ params: {
155
+ name: 'fetch_markdown',
156
+ arguments: {
157
+ url: 'https://example.com/readme.md'
158
+ }
159
+ }
160
+ };
161
+ // 调用处理程序
162
+ const result = await callToolHandler(request);
163
+ // 验证 fetchWithAutoDetect 被调用,且参数正确
164
+ expect(fetchWithAutoDetect).toHaveBeenCalledWith({ url: 'https://example.com/readme.md', method: 'fetch_markdown' }, 'markdown');
165
+ // 验证返回结果
166
+ expect(result).toHaveProperty('content');
167
+ expect(result).toHaveProperty('isError', false);
168
+ expect(result.content[0]).toHaveProperty('type', 'text');
169
+ expect(result.content[0]).toHaveProperty('text', 'mock content');
170
+ });
171
+ test('应该正确处理未知工具调用 (Should handle unknown tool call correctly)', async () => {
172
+ // 调用被测试的函数
173
+ registerTools(mockServer);
174
+ // 获取注册的处理程序
175
+ const callToolHandler = mockSetRequestHandler.mock.calls[1][1];
176
+ // 创建请求对象
177
+ const request = {
178
+ params: {
179
+ name: 'unknown_tool',
180
+ arguments: {
181
+ url: 'https://example.com'
182
+ }
183
+ }
184
+ };
185
+ // 设置模拟返回值
186
+ fetchWithAutoDetect.mockResolvedValue({
187
+ isError: true,
188
+ content: [{ text: 'Unknown tool: unknown_tool' }]
189
+ });
190
+ // 调用处理程序
191
+ const result = await callToolHandler(request);
192
+ // 验证返回结果
193
+ expect(result).toHaveProperty('content');
194
+ expect(result).toHaveProperty('isError', true);
195
+ expect(result.content[0]).toHaveProperty('text');
196
+ expect(result.content[0].text).toContain('Unknown tool');
197
+ });
198
+ test('应该正确处理工具调用错误 (Should handle tool call error correctly)', async () => {
199
+ // 调用被测试的函数
200
+ registerTools(mockServer);
201
+ // 获取注册的处理程序
202
+ const callToolHandler = mockSetRequestHandler.mock.calls[1][1];
203
+ // 创建请求对象
204
+ const request = {
205
+ params: {
206
+ name: 'fetch_html',
207
+ arguments: {
208
+ url: 'https://example.com'
209
+ }
210
+ }
211
+ };
212
+ // 设置模拟抛出错误
213
+ fetchWithAutoDetect.mockRejectedValue(new Error('Fetch failed'));
214
+ // 调用处理程序
215
+ const result = await callToolHandler(request);
216
+ // 验证返回结果
217
+ expect(result).toHaveProperty('content');
218
+ expect(result).toHaveProperty('isError', true);
219
+ expect(result.content[0]).toHaveProperty('text');
220
+ expect(result.content[0].text).toContain('Fetch failed');
221
+ });
222
+ });
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-direct-client.js","sourceRoot":"","sources":["../../tests/test-direct-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mcp-methods.js","sourceRoot":"","sources":["../../tests/test-mcp-methods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mcp.js","sourceRoot":"","sources":["../../tests/test-mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Author: Martin <lmccc.dev@gmail.com>
3
+ * Co-Author: AI Assistant (Claude)
4
+ * Description: This code was collaboratively developed by Martin and AI Assistant.
5
+ */
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-mini4k.js","sourceRoot":"","sources":["../../tests/test-mini4k.ts"],"names":[],"mappings":"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"}