@lmcc-dev/mult-fetch-mcp-server 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/README.md +8 -8
  2. package/README.zh.md +16 -8
  3. package/dist/i18n-test-report.json +8 -0
  4. package/dist/i18n-unused-keys-report.json +8 -0
  5. package/dist/src/client.js +70 -37
  6. package/dist/src/index.js +0 -0
  7. package/dist/src/lib/BrowserFetcher.js +12 -12
  8. package/dist/src/lib/NodeFetcher.js +22 -22
  9. package/dist/src/lib/fetch.js +40 -0
  10. package/dist/src/lib/fetchers/FetcherFactory.js +43 -0
  11. package/dist/src/lib/fetchers/browser/BrowserFetcher.js +381 -0
  12. package/dist/src/lib/fetchers/browser/BrowserInstance.js +180 -0
  13. package/dist/src/lib/fetchers/browser/PageOperations.js +168 -0
  14. package/dist/src/lib/fetchers/common/types.js +41 -0
  15. package/dist/src/lib/fetchers/common/utils.js +141 -0
  16. package/dist/src/lib/fetchers/index.js +62 -0
  17. package/dist/src/lib/fetchers/node/HttpClient.js +239 -0
  18. package/dist/src/lib/fetchers/node/NodeFetcher.js +180 -0
  19. package/dist/src/lib/i18n/index.js +105 -17
  20. package/dist/src/lib/i18n/keys/base.js +41 -0
  21. package/dist/src/lib/i18n/keys/browser.js +91 -0
  22. package/dist/src/lib/i18n/keys/client.js +68 -0
  23. package/dist/src/lib/i18n/keys/errors.js +49 -0
  24. package/dist/src/lib/i18n/keys/factory.js +46 -0
  25. package/dist/src/lib/i18n/keys/fetcher.js +87 -0
  26. package/dist/src/lib/i18n/keys/index.js +16 -0
  27. package/dist/src/lib/i18n/keys/node.js +69 -0
  28. package/dist/src/lib/i18n/keys/prompts.js +79 -0
  29. package/dist/src/lib/i18n/keys/resources.js +53 -0
  30. package/dist/src/lib/i18n/keys/server.js +67 -0
  31. package/dist/src/lib/i18n/keys/tools.js +39 -0
  32. package/dist/src/lib/i18n/keys.js +488 -119
  33. package/dist/src/lib/i18n/locales/en/browser.js +67 -57
  34. package/dist/src/lib/i18n/locales/en/client.js +57 -33
  35. package/dist/src/lib/i18n/locales/en/errors.js +36 -12
  36. package/dist/src/lib/i18n/locales/en/factory.js +38 -0
  37. package/dist/src/lib/i18n/locales/en/fetcher.js +8 -2
  38. package/dist/src/lib/i18n/locales/en/index.js +10 -8
  39. package/dist/src/lib/i18n/locales/en/node.js +57 -35
  40. package/dist/src/lib/i18n/locales/en/prompts.js +42 -65
  41. package/dist/src/lib/i18n/locales/en/resources.js +52 -55
  42. package/dist/src/lib/i18n/locales/en/server.js +49 -24
  43. package/dist/src/lib/i18n/locales/en/tools.js +27 -19
  44. package/dist/src/lib/i18n/locales/zh/browser.js +71 -62
  45. package/dist/src/lib/i18n/locales/zh/client.js +57 -32
  46. package/dist/src/lib/i18n/locales/zh/errors.js +36 -12
  47. package/dist/src/lib/i18n/locales/zh/factory.js +38 -0
  48. package/dist/src/lib/i18n/locales/zh/fetcher.js +36 -30
  49. package/dist/src/lib/i18n/locales/zh/index.js +10 -8
  50. package/dist/src/lib/i18n/locales/zh/node.js +61 -36
  51. package/dist/src/lib/i18n/locales/zh/prompts.js +35 -57
  52. package/dist/src/lib/i18n/locales/zh/resources.js +52 -55
  53. package/dist/src/lib/i18n/locales/zh/server.js +51 -25
  54. package/dist/src/lib/i18n/locales/zh/tools.js +27 -19
  55. package/dist/src/lib/i18n/logger.js +90 -19
  56. package/dist/src/lib/logger.js +135 -14
  57. package/dist/src/lib/server/browser.js +42 -10
  58. package/dist/src/lib/server/fetcher.js +87 -37
  59. package/dist/src/lib/server/index.js +2 -2
  60. package/dist/src/lib/server/prompts.js +1 -1
  61. package/dist/src/lib/server/resources.js +1 -1
  62. package/dist/src/lib/server/tools.js +46 -10
  63. package/dist/src/lib/utils/ErrorHandler.js +125 -0
  64. package/dist/src/mcp-server.js +0 -0
  65. package/dist/src/test-i18n.js +139 -0
  66. package/dist/tests/BrowserFetcher.test.js +0 -0
  67. package/dist/tests/NodeFetcher.test.js +0 -0
  68. package/dist/tests/client.test.js +42 -81
  69. package/dist/tests/fetch.test.js +70 -0
  70. package/dist/tests/fetchers/Fetcher.test.js +108 -0
  71. package/dist/tests/fetchers/browser/BrowserFetcher.test.js +195 -0
  72. package/dist/tests/fetchers/browser/BrowserInstance.test.js +163 -0
  73. package/dist/tests/fetchers/node/NodeFetcher.test.js +211 -0
  74. package/dist/tests/i18n-missing-keys.js +364 -0
  75. package/dist/tests/i18n-remove-unused-keys.js +236 -0
  76. package/dist/tests/i18n-test-report.json +2004 -0
  77. package/dist/tests/i18n-unused-keys.js +425 -0
  78. package/dist/tests/i18n.test.js +6 -7
  79. package/dist/tests/logger.test.js +14 -13
  80. package/dist/tests/mcp-server.test.js +7 -7
  81. package/dist/tests/server/browser.test.js +25 -21
  82. package/dist/tests/server/fetcher.test.js +58 -101
  83. package/dist/tests/server/index.test.js +30 -30
  84. package/dist/tests/server/prompts.test.js +36 -33
  85. package/dist/tests/server/resources.test.js +120 -84
  86. package/dist/tests/server/tools.test.js +7 -6
  87. package/dist/tests/setup.js +36 -0
  88. package/dist/tests/src/lib/i18n/index.js +108 -0
  89. package/dist/tests/src/lib/i18n/keys/base.js +47 -0
  90. package/dist/tests/src/lib/i18n/keys/browser.js +93 -0
  91. package/dist/tests/src/lib/i18n/keys/client.js +70 -0
  92. package/dist/tests/src/lib/i18n/keys/errors.js +34 -0
  93. package/dist/tests/src/lib/i18n/keys/fetcher.js +84 -0
  94. package/dist/tests/src/lib/i18n/keys/index.js +31 -0
  95. package/dist/tests/src/lib/i18n/keys/node.js +56 -0
  96. package/dist/tests/src/lib/i18n/keys/prompts.js +82 -0
  97. package/dist/tests/src/lib/i18n/keys/resources.js +50 -0
  98. package/dist/tests/src/lib/i18n/keys/server.js +64 -0
  99. package/dist/tests/src/lib/i18n/keys/tools.js +34 -0
  100. package/dist/tests/src/lib/i18n/locales/en/browser.js +88 -0
  101. package/dist/tests/src/lib/i18n/locales/en/client.js +66 -0
  102. package/dist/tests/src/lib/i18n/locales/en/errors.js +28 -0
  103. package/dist/tests/src/lib/i18n/locales/en/fetcher.js +71 -0
  104. package/dist/tests/src/lib/i18n/locales/en/index.js +29 -0
  105. package/dist/tests/src/lib/i18n/locales/en/node.js +51 -0
  106. package/dist/tests/src/lib/i18n/locales/en/prompts.js +52 -0
  107. package/dist/tests/src/lib/i18n/locales/en/resources.js +50 -0
  108. package/dist/tests/src/lib/i18n/locales/en/server.js +56 -0
  109. package/dist/tests/src/lib/i18n/locales/en/tools.js +28 -0
  110. package/dist/tests/src/lib/i18n/locales/zh/browser.js +87 -0
  111. package/dist/tests/src/lib/i18n/locales/zh/client.js +66 -0
  112. package/dist/tests/src/lib/i18n/locales/zh/errors.js +28 -0
  113. package/dist/tests/src/lib/i18n/locales/zh/fetcher.js +71 -0
  114. package/dist/tests/src/lib/i18n/locales/zh/index.js +29 -0
  115. package/dist/tests/src/lib/i18n/locales/zh/node.js +51 -0
  116. package/dist/tests/src/lib/i18n/locales/zh/prompts.js +53 -0
  117. package/dist/tests/src/lib/i18n/locales/zh/resources.js +50 -0
  118. package/dist/tests/src/lib/i18n/locales/zh/server.js +57 -0
  119. package/dist/tests/src/lib/i18n/locales/zh/tools.js +28 -0
  120. package/dist/tests/src/lib/i18n/logger.js +114 -0
  121. package/dist/tests/src/lib/logger.js +181 -0
  122. package/dist/tests/test-direct-client.js +0 -0
  123. package/dist/tests/test-i18n.js +530 -0
  124. package/dist/tests/test-mcp-methods.js +1 -1
  125. package/dist/tests/test-mcp.js +0 -0
  126. package/dist/tests/test-mini4k.js +0 -0
  127. package/dist/tests/tests/test-i18n.js +588 -0
  128. package/dist/tests/types.test.js +1 -1
  129. package/dist/tests/utils/ErrorHandler.test.js +144 -0
  130. package/dist/vitest.config.js +29 -0
  131. package/package.json +31 -27
  132. package/dist/src/cli-language.js +0 -78
  133. package/dist/src/client.d.ts +0 -6
  134. package/dist/src/client.js.map +0 -1
  135. package/dist/src/index.d.ts +0 -15
  136. package/dist/src/index.js.map +0 -1
  137. package/dist/src/lib/BrowserFetcher.d.ts +0 -175
  138. package/dist/src/lib/BrowserFetcher.js.map +0 -1
  139. package/dist/src/lib/NodeFetcher.d.ts +0 -92
  140. package/dist/src/lib/NodeFetcher.js.map +0 -1
  141. package/dist/src/lib/example.js +0 -93
  142. package/dist/src/lib/i18n/index.js.map +0 -1
  143. package/dist/src/lib/i18n/locales/en/browser.d.ts +0 -61
  144. package/dist/src/lib/i18n/locales/en/browser.js.map +0 -1
  145. package/dist/src/lib/i18n/locales/en/client.d.ts +0 -39
  146. package/dist/src/lib/i18n/locales/en/client.js.map +0 -1
  147. package/dist/src/lib/i18n/locales/en/errors.d.ts +0 -17
  148. package/dist/src/lib/i18n/locales/en/errors.js.map +0 -1
  149. package/dist/src/lib/i18n/locales/en/fetcher.d.ts +0 -66
  150. package/dist/src/lib/i18n/locales/en/fetcher.js.map +0 -1
  151. package/dist/src/lib/i18n/locales/en/index.d.ts +0 -344
  152. package/dist/src/lib/i18n/locales/en/index.js.map +0 -1
  153. package/dist/src/lib/i18n/locales/en/node.d.ts +0 -41
  154. package/dist/src/lib/i18n/locales/en/node.js.map +0 -1
  155. package/dist/src/lib/i18n/locales/en/prompts.d.ts +0 -65
  156. package/dist/src/lib/i18n/locales/en/prompts.js.map +0 -1
  157. package/dist/src/lib/i18n/locales/en/resources.d.ts +0 -41
  158. package/dist/src/lib/i18n/locales/en/resources.js.map +0 -1
  159. package/dist/src/lib/i18n/locales/en/server.d.ts +0 -30
  160. package/dist/src/lib/i18n/locales/en/server.js.map +0 -1
  161. package/dist/src/lib/i18n/locales/en/tools.d.ts +0 -24
  162. package/dist/src/lib/i18n/locales/en/tools.js.map +0 -1
  163. package/dist/src/lib/i18n/locales/zh/browser.d.ts +0 -61
  164. package/dist/src/lib/i18n/locales/zh/browser.js.map +0 -1
  165. package/dist/src/lib/i18n/locales/zh/client.d.ts +0 -38
  166. package/dist/src/lib/i18n/locales/zh/client.js.map +0 -1
  167. package/dist/src/lib/i18n/locales/zh/errors.d.ts +0 -17
  168. package/dist/src/lib/i18n/locales/zh/errors.js.map +0 -1
  169. package/dist/src/lib/i18n/locales/zh/fetcher.d.ts +0 -66
  170. package/dist/src/lib/i18n/locales/zh/fetcher.js.map +0 -1
  171. package/dist/src/lib/i18n/locales/zh/index.d.ts +0 -343
  172. package/dist/src/lib/i18n/locales/zh/index.js.map +0 -1
  173. package/dist/src/lib/i18n/locales/zh/node.d.ts +0 -41
  174. package/dist/src/lib/i18n/locales/zh/node.js.map +0 -1
  175. package/dist/src/lib/i18n/locales/zh/prompts.d.ts +0 -65
  176. package/dist/src/lib/i18n/locales/zh/prompts.js.map +0 -1
  177. package/dist/src/lib/i18n/locales/zh/resources.d.ts +0 -41
  178. package/dist/src/lib/i18n/locales/zh/resources.js.map +0 -1
  179. package/dist/src/lib/i18n/locales/zh/server.d.ts +0 -30
  180. package/dist/src/lib/i18n/locales/zh/server.js.map +0 -1
  181. package/dist/src/lib/i18n/locales/zh/tools.d.ts +0 -24
  182. package/dist/src/lib/i18n/locales/zh/tools.js.map +0 -1
  183. package/dist/src/lib/i18n/logger.d.ts +0 -38
  184. package/dist/src/lib/i18n/logger.js.map +0 -1
  185. package/dist/src/lib/logger.d.ts +0 -32
  186. package/dist/src/lib/logger.js.map +0 -1
  187. package/dist/src/lib/server/browser.d.ts +0 -34
  188. package/dist/src/lib/server/browser.js.map +0 -1
  189. package/dist/src/lib/server/fetcher.d.ts +0 -20
  190. package/dist/src/lib/server/fetcher.js.map +0 -1
  191. package/dist/src/lib/server/index.d.ts +0 -10
  192. package/dist/src/lib/server/index.js.map +0 -1
  193. package/dist/src/lib/server/logger.js +0 -23
  194. package/dist/src/lib/server/prompts.d.ts +0 -11
  195. package/dist/src/lib/server/prompts.js.map +0 -1
  196. package/dist/src/lib/server/resources.d.ts +0 -11
  197. package/dist/src/lib/server/resources.js.map +0 -1
  198. package/dist/src/lib/server/tools.d.ts +0 -12
  199. package/dist/src/lib/server/tools.js.map +0 -1
  200. package/dist/src/lib/server/types.d.ts +0 -71
  201. package/dist/src/lib/server/types.js.map +0 -1
  202. package/dist/src/lib/types.d.ts +0 -119
  203. package/dist/src/lib/types.js.map +0 -1
  204. package/dist/src/mcp-server.d.ts +0 -6
  205. package/dist/src/mcp-server.js.map +0 -1
  206. package/dist/tests/jest.setup.d.ts +0 -6
  207. package/dist/tests/jest.setup.js +0 -30
  208. package/dist/tests/jest.setup.js.map +0 -1
  209. package/dist/tests/test-direct-client.d.ts +0 -6
  210. package/dist/tests/test-direct-client.js.map +0 -1
  211. package/dist/tests/test-mcp-methods.d.ts +0 -6
  212. package/dist/tests/test-mcp-methods.js.map +0 -1
  213. package/dist/tests/test-mcp.d.ts +0 -6
  214. package/dist/tests/test-mcp.js.map +0 -1
  215. package/dist/tests/test-mini4k.d.ts +0 -6
  216. package/dist/tests/test-mini4k.js.map +0 -1
@@ -3,60 +3,57 @@
3
3
  * Co-Author: AI Assistant (Claude)
4
4
  * Description: This code was collaboratively developed by Martin and AI Assistant.
5
5
  */
6
- import { RESOURCES_KEYS } from '../../keys.js';
7
- // 资源相关消息 (Resources related messages)
8
- export const resources = {
9
- // 资源列表相关 (Resource list related)
10
- [RESOURCES_KEYS.list.request]: "收到资源列表请求: {params}",
11
- [RESOURCES_KEYS.list.success]: "资源列表获取成功",
12
- [RESOURCES_KEYS.list.error]: "获取资源列表时出错: {error}",
13
- // 资源获取相关 (Resource get related)
14
- [RESOURCES_KEYS.get.request]: "收到资源读取请求: {uri}",
15
- [RESOURCES_KEYS.get.success]: "资源获取成功: {uri}",
16
- [RESOURCES_KEYS.get.error]: "读取资源时出错: {uri}, {error}",
17
- [RESOURCES_KEYS.get.notFound]: "未找到资源: {uri}",
18
- // 资源创建相关 (Resource create related)
19
- [RESOURCES_KEYS.create.request]: "收到资源创建请求: {uri}",
20
- [RESOURCES_KEYS.create.success]: "资源创建成功: {uri}",
21
- [RESOURCES_KEYS.create.error]: "创建资源时出错: {uri}, {error}",
22
- [RESOURCES_KEYS.create.duplicate]: "资源已存在: {uri}",
23
- // 资源更新相关 (Resource update related)
24
- [RESOURCES_KEYS.update.request]: "收到资源更新请求: {uri}",
25
- [RESOURCES_KEYS.update.success]: "资源更新成功: {uri}",
26
- [RESOURCES_KEYS.update.error]: "更新资源时出错: {uri}, {error}",
27
- [RESOURCES_KEYS.update.notFound]: "未找到要更新的资源: {uri}",
28
- // 资源删除相关 (Resource delete related)
29
- [RESOURCES_KEYS.delete.request]: "收到资源删除请求: {uri}",
30
- [RESOURCES_KEYS.delete.success]: "资源删除成功: {uri}",
31
- [RESOURCES_KEYS.delete.error]: "删除资源时出错: {uri}, {error}",
32
- [RESOURCES_KEYS.delete.notFound]: "未找到要删除的资源: {uri}",
33
- // 额外的键(不在 RESOURCES_KEYS 中定义的)
34
- fileReadError: "读取文件时出错: {filePath}, {error}",
35
- invalidUri: "无效的资源URI",
36
- notFound: "资源未找到",
6
+ import { RESOURCES_KEYS } from '../../keys/resources.js';
7
+ // 资源相关消息 (Resource related messages)
8
+ export default {
9
+ // 列表操作 (List operations)
10
+ [RESOURCES_KEYS.list.request]: "收到资源列表请求",
11
+ [RESOURCES_KEYS.list.success]: "成功获取资源列表",
12
+ [RESOURCES_KEYS.list.error]: "获取资源列表出错:{{error}}",
13
+ [RESOURCES_KEYS.list.notFound]: "未找到任何资源",
14
+ [RESOURCES_KEYS.list.duplicate]: "列表中发现重复资源",
15
+ // 获取操作 (Get operations)
16
+ [RESOURCES_KEYS.get.request]: "收到获取资源请求",
17
+ [RESOURCES_KEYS.get.success]: "成功获取资源",
18
+ [RESOURCES_KEYS.get.error]: "获取资源出错:{{error}}",
19
+ [RESOURCES_KEYS.get.notFound]: "未找到请求的资源",
20
+ [RESOURCES_KEYS.get.duplicate]: "发现重复资源",
21
+ // 读取操作 (Read operations)
22
+ [RESOURCES_KEYS.read.request]: "收到读取资源请求",
23
+ [RESOURCES_KEYS.read.success]: "成功读取资源",
24
+ [RESOURCES_KEYS.read.error]: "读取资源出错:{{error}}",
25
+ [RESOURCES_KEYS.read.notFound]: "未找到要读取的资源",
26
+ [RESOURCES_KEYS.readError]: "读取资源出错:{{error}}",
27
+ // 创建操作 (Create operations)
28
+ [RESOURCES_KEYS.create.request]: "收到创建资源请求",
29
+ [RESOURCES_KEYS.create.success]: "成功创建资源",
30
+ [RESOURCES_KEYS.create.error]: "创建资源出错:{{error}}",
31
+ [RESOURCES_KEYS.create.notFound]: "未找到父资源",
32
+ [RESOURCES_KEYS.create.duplicate]: "资源已存在",
33
+ // 更新操作 (Update operations)
34
+ [RESOURCES_KEYS.update.request]: "收到更新资源请求",
35
+ [RESOURCES_KEYS.update.success]: "成功更新资源",
36
+ [RESOURCES_KEYS.update.error]: "更新资源出错:{{error}}",
37
+ [RESOURCES_KEYS.update.notFound]: "未找到要更新的资源",
38
+ [RESOURCES_KEYS.update.duplicate]: "更新会导致资源重复",
39
+ // 删除操作 (Delete operations)
40
+ [RESOURCES_KEYS.delete.request]: "收到删除资源请求",
41
+ [RESOURCES_KEYS.delete.success]: "成功删除资源",
42
+ [RESOURCES_KEYS.delete.error]: "删除资源出错:{{error}}",
43
+ [RESOURCES_KEYS.delete.notFound]: "未找到要删除的资源",
44
+ [RESOURCES_KEYS.delete.duplicate]: "多个资源匹配删除条件",
45
+ // 其他资源相关消息 (Other resource related messages)
46
+ [RESOURCES_KEYS.fileReadError]: "读取文件出错:{{error}}",
47
+ [RESOURCES_KEYS.invalidUri]: "无效的 URI:{{uri}}",
48
+ [RESOURCES_KEYS.notFound]: "未找到资源:{{path}}",
37
49
  // 资源描述 (Resource descriptions)
38
- readme: {
39
- description: "项目自述文件,包含项目概述、安装和使用说明"
40
- },
41
- package: {
42
- description: "项目包配置文件,包含依赖和脚本定义"
43
- },
44
- index: {
45
- description: "项目入口文件,包含服务器启动逻辑"
46
- },
47
- client: {
48
- description: "MCP客户端实现,用于与服务器通信"
49
- },
50
- // 资源模板描述 (Resource template descriptions)
51
- sourceFile: {
52
- name: "源代码文件",
53
- description: "访问项目源代码文件"
54
- },
55
- docFile: {
56
- name: "文档文件",
57
- description: "访问项目文档文件"
58
- },
59
- filename: {
60
- description: "文件名,包括扩展名"
61
- }
50
+ [RESOURCES_KEYS.readme.description]: "项目 README 文件",
51
+ [RESOURCES_KEYS.package.description]: "包配置文件",
52
+ [RESOURCES_KEYS.index.description]: "主入口文件",
53
+ [RESOURCES_KEYS.client.description]: "客户端实现文件",
54
+ [RESOURCES_KEYS.sourceFile.name]: "源代码文件",
55
+ [RESOURCES_KEYS.sourceFile.description]: "项目源代码文件",
56
+ [RESOURCES_KEYS.docFile.name]: "文档文件",
57
+ [RESOURCES_KEYS.docFile.description]: "项目文档文件",
58
+ [RESOURCES_KEYS.filename.description]: "文件名"
62
59
  };
@@ -3,30 +3,56 @@
3
3
  * Co-Author: AI Assistant (Claude)
4
4
  * Description: This code was collaboratively developed by Martin and AI Assistant.
5
5
  */
6
+ import { SERVER_KEYS } from '../../keys/server.js';
6
7
  // 服务器相关消息 (Server related messages)
7
- export const server = {
8
- starting: "MCP 服务器启动中...",
9
- connecting: "正在连接到 MCP 传输: {{transport}}",
10
- started: "MCP 服务器已启动",
11
- stopping: "MCP 服务器停止中...",
12
- stopped: "MCP 服务器已停止",
13
- error: "MCP 服务器错误: {{error}}",
14
- receivedRequest: "收到工具请求: {{tool}}",
15
- processingRequest: "正在处理工具请求: {{tool}}",
16
- requestCompleted: "工具请求完成: {{tool}}",
17
- requestFailed: "工具请求失败: {{tool}}, 错误: {{error}}",
18
- receivedInterruptSignal: "收到中断信号,正在关闭服务器...",
19
- receivedTerminateSignal: "收到终止信号,正在关闭服务器...",
20
- uncaughtException: "未捕获的异常: {{error}}",
21
- debug: "{{message}}",
22
- // 新增的翻译键 (New translation keys)
23
- initializingBrowser: "初始化浏览器实例...",
24
- closingBrowser: "关闭浏览器实例...",
25
- receivedToolRequest: "收到{{name}}请求: {{url}}",
26
- processingToolRequestError: "处理{{name}}请求时出错: {{error}}",
27
- usingBrowserMode: "使用浏览器模式获取 {{type}}: {{url}}",
28
- usingAutoDetectMode: "使用自动检测模式获取 {{type}}: {{url}}",
29
- switchingToBrowserMode: "标准模式失败,切换到浏览器模式: {{url}}",
30
- fetchError: "获取 {{type}} 时出错: {{error}}",
31
- connectionError: "连接到传输时出错: {{error}}"
8
+ export default {
9
+ // 服务器状态相关 (Server status related)
10
+ [SERVER_KEYS.starting]: "MCP 服务器启动中...",
11
+ [SERVER_KEYS.started]: "MCP 服务器已启动",
12
+ [SERVER_KEYS.stopping]: "MCP 服务器停止中...",
13
+ [SERVER_KEYS.stopped]: "MCP 服务器已停止",
14
+ [SERVER_KEYS.error]: "MCP 服务器错误: {{error}}",
15
+ [SERVER_KEYS.startupError]: "MCP 服务器启动错误: {{error}}",
16
+ // 连接相关 (Connection related)
17
+ [SERVER_KEYS.connecting]: "正在连接到 MCP 传输: {{transport}}",
18
+ [SERVER_KEYS.connected]: "已连接到 MCP 传输",
19
+ [SERVER_KEYS.connectionFailed]: "连接到 MCP 传输失败: {{error}}",
20
+ [SERVER_KEYS.disconnected]: "已断开与 MCP 传输的连接: {{transport}}",
21
+ [SERVER_KEYS.connectionError]: "连接到 MCP 传输时出错: {{error}}",
22
+ // 错误相关 (Error related)
23
+ [SERVER_KEYS.serverError]: "MCP 服务器错误: {{error}}",
24
+ [SERVER_KEYS.transportError]: "MCP 传输错误: {{error}}",
25
+ // 请求处理相关 (Request handling related)
26
+ [SERVER_KEYS.receivedRequest]: "收到请求: {{id}}",
27
+ [SERVER_KEYS.processingRequest]: "处理请求: {{id}}",
28
+ [SERVER_KEYS.requestCompleted]: "请求完成: {{id}}",
29
+ [SERVER_KEYS.requestError]: "处理{{name}}请求时出错: {{error}}",
30
+ [SERVER_KEYS.requestReceived]: "收到请求: {{id}}",
31
+ [SERVER_KEYS.requestProcessed]: "处理了 {{method}} 请求: {{path}} ({{time}}ms)",
32
+ [SERVER_KEYS.requestFailed]: "工具请求失败: {{tool}}, 错误: {{error}}",
33
+ // 浏览器相关 (Browser related)
34
+ [SERVER_KEYS.initializingBrowser]: "初始化浏览器实例...",
35
+ [SERVER_KEYS.browserInitialized]: "浏览器实例已初始化",
36
+ [SERVER_KEYS.browserInitFailed]: "浏览器初始化失败: {{error}}",
37
+ [SERVER_KEYS.closingBrowser]: "关闭浏览器实例...",
38
+ [SERVER_KEYS.browserClosed]: "浏览器实例已关闭",
39
+ // 工具相关 (Tool related)
40
+ [SERVER_KEYS.tool.requestReceived]: "收到 {{name}} 工具请求",
41
+ [SERVER_KEYS.tool.requestProcessed]: "处理了 {{name}} 工具请求 ({{time}}ms)",
42
+ [SERVER_KEYS.tool.requestError]: "处理 {{name}} 请求时出错: {{error}}",
43
+ // 入口相关 (Entry related)
44
+ [SERVER_KEYS.entry.loaded]: "MCP 服务器入口点已加载",
45
+ // 系统相关 (System related)
46
+ [SERVER_KEYS.receivedInterruptSignal]: "收到中断信号,正在关闭服务器...",
47
+ [SERVER_KEYS.receivedTerminateSignal]: "收到终止信号,正在关闭服务器...",
48
+ [SERVER_KEYS.uncaughtException]: "未捕获的异常: {{error}}",
49
+ [SERVER_KEYS.debug]: "{{message}}",
50
+ [SERVER_KEYS.listeningOn]: "服务器监听端口 {{port}}",
51
+ // 其他键 (Other keys)
52
+ [SERVER_KEYS.receivedToolRequest]: "收到工具请求: {{name}}",
53
+ [SERVER_KEYS.processingToolRequestError]: "处理工具请求时出错: {{name}}, {{error}}",
54
+ [SERVER_KEYS.usingBrowserMode]: "对 {{url}} 使用浏览器模式",
55
+ [SERVER_KEYS.usingAutoDetectMode]: "对 {{url}} 使用自动检测模式",
56
+ [SERVER_KEYS.switchingToBrowserMode]: "标准模式失败,切换到浏览器模式: {{url}}",
57
+ [SERVER_KEYS.fetchError]: "获取 {{type}} 时出错: {{error}}"
32
58
  };
@@ -3,23 +3,31 @@
3
3
  * Co-Author: AI Assistant (Claude)
4
4
  * Description: This code was collaboratively developed by Martin and AI Assistant.
5
5
  */
6
- // 工具相关消息 (Tool related messages)
7
- export const tools = {
8
- fetchHtml: {
9
- description: "获取网站并以 HTML 格式返回内容",
10
- error: "获取 HTML 失败: {{error}}"
11
- },
12
- fetchJson: {
13
- description: "从 URL 获取 JSON 文件",
14
- error: "获取 JSON 失败: {{error}}",
15
- invalidJson: "URL 返回的 JSON 无效: {{url}}"
16
- },
17
- fetchTxt: {
18
- description: "获取网站,以纯文本格式返回内容(无 HTML)",
19
- error: "获取文本失败: {{error}}"
20
- },
21
- fetchMarkdown: {
22
- description: "获取网站并以 Markdown 格式返回内容",
23
- error: "获取 Markdown 失败: {{error}}"
24
- }
6
+ import { TOOLS_KEYS } from '../../keys/tools.js';
7
+ export default {
8
+ // 工具描述 (Tool descriptions)
9
+ [TOOLS_KEYS.fetchHtmlDescription]: '获取网站并以HTML格式返回内容',
10
+ [TOOLS_KEYS.fetchJsonDescription]: '从URL获取JSON文件',
11
+ [TOOLS_KEYS.fetchTxtDescription]: '获取网站,以纯文本形式返回内容(无HTML)',
12
+ [TOOLS_KEYS.fetchMarkdownDescription]: '获取网站并以Markdown格式返回内容',
13
+ // 参数描述 (Parameter descriptions)
14
+ [TOOLS_KEYS.urlDescription]: '要获取的网站URL',
15
+ // 错误消息 (Error messages)
16
+ [TOOLS_KEYS.fetchHtmlError]: '获取HTML失败: {{error}}',
17
+ [TOOLS_KEYS.fetchJsonError]: '获取JSON失败: {{error}}',
18
+ [TOOLS_KEYS.fetchTxtError]: '获取文本失败: {{error}}',
19
+ [TOOLS_KEYS.fetchMarkdownError]: '获取Markdown失败: {{error}}',
20
+ [TOOLS_KEYS.jsonParseWarning]: '警告: JSON解析错误: {{error}}',
21
+ // 成功消息 (Success messages)
22
+ [TOOLS_KEYS.fetchHtmlSuccess]: '成功从 {{url}} 获取HTML',
23
+ [TOOLS_KEYS.fetchJsonSuccess]: '成功从 {{url}} 获取JSON',
24
+ [TOOLS_KEYS.fetchTxtSuccess]: '成功从 {{url}} 获取文本',
25
+ [TOOLS_KEYS.fetchMarkdownSuccess]: '成功从 {{url}} 获取Markdown',
26
+ // 工具调用相关 (Tool call related)
27
+ [TOOLS_KEYS.callReceived]: '收到工具调用: {{name}},参数: {{args}}',
28
+ [TOOLS_KEYS.unknownTool]: '未知工具: {{name}}',
29
+ [TOOLS_KEYS.callError]: '调用工具 {{name}} 时出错: {{error}}',
30
+ [TOOLS_KEYS.missingUrl]: '缺少URL参数',
31
+ [TOOLS_KEYS.fetchRequest]: '正在从URL获取{{type}}: {{url}}',
32
+ [TOOLS_KEYS.fetchError]: '从URL {{url}} 获取内容时出错: {{error}}'
25
33
  };
@@ -4,6 +4,65 @@
4
4
  * Description: This code was collaboratively developed by Martin and AI Assistant.
5
5
  */
6
6
  import { t } from './index.js';
7
+ /**
8
+ * 日志级别枚举 (Log level enum)
9
+ */
10
+ export var LogLevel;
11
+ (function (LogLevel) {
12
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
13
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
14
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
15
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
16
+ LogLevel[LogLevel["NONE"] = 4] = "NONE";
17
+ })(LogLevel || (LogLevel = {}));
18
+ /**
19
+ * 获取当前日志级别 (Get current log level)
20
+ * @returns 日志级别 (Log level)
21
+ */
22
+ function getCurrentLogLevel() {
23
+ const debugEnv = process.env.DEBUG;
24
+ if (debugEnv === 'none')
25
+ return LogLevel.NONE;
26
+ if (debugEnv === 'error')
27
+ return LogLevel.ERROR;
28
+ if (debugEnv === 'warn')
29
+ return LogLevel.WARN;
30
+ if (debugEnv === 'info')
31
+ return LogLevel.INFO;
32
+ if (debugEnv === 'debug' || debugEnv === 'true')
33
+ return LogLevel.DEBUG;
34
+ // 默认为 INFO 级别 (Default to INFO level)
35
+ return LogLevel.INFO;
36
+ }
37
+ /**
38
+ * 尝试翻译键名 (Try to translate a key)
39
+ * @param key 翻译键 (Translation key)
40
+ * @param params 翻译参数 (Translation parameters)
41
+ * @returns 翻译后的文本 (Translated text)
42
+ */
43
+ function translateKey(key, params) {
44
+ try {
45
+ // 尝试翻译键名 (Try to translate the key)
46
+ const translated = t(key, params);
47
+ // 确保结果是字符串 (Ensure the result is a string)
48
+ let translatedStr = typeof translated === 'string' ? translated : JSON.stringify(translated);
49
+ // 检查翻译后的字符串是否仍然包含占位符,如果包含,手动进行插值替换
50
+ // (Check if the translated string still contains placeholders, if so, manually perform interpolation)
51
+ if (params && typeof translatedStr === 'string') {
52
+ for (const key in params) {
53
+ const placeholder = `{{${key}}}`;
54
+ if (translatedStr.includes(placeholder)) {
55
+ translatedStr = translatedStr.replace(new RegExp(placeholder, 'g'), String(params[key]));
56
+ }
57
+ }
58
+ }
59
+ return translatedStr;
60
+ }
61
+ catch (error) {
62
+ // 如果翻译失败,返回原始键名 (If translation fails, return the original key)
63
+ return key;
64
+ }
65
+ }
7
66
  /**
8
67
  * 创建一个带前缀的日志记录器 (Create a logger with prefix)
9
68
  * @param prefix 日志前缀 (Log prefix)
@@ -12,25 +71,34 @@ import { t } from './index.js';
12
71
  export function createLogger(prefix) {
13
72
  return {
14
73
  /**
15
- * 输出信息日志 (Output info log)
74
+ * 输出调试日志 (Output debug log)
16
75
  * @param key 翻译键 (Translation key)
17
76
  * @param params 翻译参数 (Translation parameters)
18
- * @param forceDebug 是否强制输出信息日志 (Whether to force output info logs)
77
+ * @param forceLog 是否强制输出日志 (Whether to force output logs)
19
78
  */
20
- info: (key, params, forceDebug) => {
21
- // 只有在环境变量DEBUG为true或forceDebug为true时才输出信息日志
22
- if (process.env.DEBUG === 'true' || forceDebug === true) {
23
- console.error(`[${prefix}] ${t(key, params)}`);
79
+ debug: (key, params, forceLog) => {
80
+ // 只有在明确设置 forceLog 为 true 时才输出日志 (Only output logs when forceLog is explicitly set to true)
81
+ if (forceLog) {
82
+ const translatedMessage = translateKey(key, params);
83
+ // 在 MCP 环境中,所有日志都应该使用 error 级别输出
84
+ // (In MCP environment, all logs should be output at error level)
85
+ console.error(`[${prefix}] ${translatedMessage}`);
24
86
  }
25
87
  },
26
88
  /**
27
- * 输出错误日志 (Output error log)
89
+ * 输出信息日志 (Output info log)
28
90
  * @param key 翻译键 (Translation key)
29
91
  * @param params 翻译参数 (Translation parameters)
92
+ * @param forceLog 是否强制输出日志 (Whether to force output logs)
30
93
  */
31
- error: (key, params) => {
32
- // 错误日志总是输出,不受debug控制
33
- console.error(`[${prefix}] ${t(key, params)}`);
94
+ info: (key, params, forceLog) => {
95
+ // 只有在明确设置 forceLog 为 true 时才输出日志 (Only output logs when forceLog is explicitly set to true)
96
+ if (forceLog) {
97
+ const translatedMessage = translateKey(key, params);
98
+ // 在 MCP 环境中,所有日志都应该使用 error 级别输出
99
+ // (In MCP environment, all logs should be output at error level)
100
+ console.error(`[${prefix}] ${translatedMessage}`);
101
+ }
34
102
  },
35
103
  /**
36
104
  * 输出警告日志 (Output warning log)
@@ -38,20 +106,23 @@ export function createLogger(prefix) {
38
106
  * @param params 翻译参数 (Translation parameters)
39
107
  */
40
108
  warn: (key, params) => {
41
- // 警告日志总是输出,不受debug控制
42
- console.error(`[${prefix}] ${t(key, params)}`);
109
+ // 警告日志总是输出 (Warning logs are always output)
110
+ const translatedMessage = translateKey(key, params);
111
+ // 在 MCP 环境中,所有日志都应该使用 error 级别输出
112
+ // (In MCP environment, all logs should be output at error level)
113
+ console.error(`[${prefix}] ${translatedMessage}`);
43
114
  },
44
115
  /**
45
- * 输出调试日志 (Output debug log)
116
+ * 输出错误日志 (Output error log)
46
117
  * @param key 翻译键 (Translation key)
47
118
  * @param params 翻译参数 (Translation parameters)
48
- * @param forceDebug 是否强制输出调试日志 (Whether to force output debug logs)
49
119
  */
50
- debug: (key, params, forceDebug) => {
51
- // 只有在forceDebug=true时才输出调试日志
52
- if (forceDebug === true) {
53
- console.error(`[${prefix}] ${t(key, params)}`);
54
- }
120
+ error: (key, params) => {
121
+ // 错误日志总是输出 (Error logs are always output)
122
+ const translatedMessage = translateKey(key, params);
123
+ // 在 MCP 环境中,所有日志都应该使用 error 级别输出
124
+ // (In MCP environment, all logs should be output at error level)
125
+ console.error(`[${prefix}] ${translatedMessage}`);
55
126
  }
56
127
  };
57
128
  }
@@ -8,6 +8,30 @@ import { t } from './i18n/index.js';
8
8
  import fs from 'fs';
9
9
  import path from 'path';
10
10
  import os from 'os';
11
+ // 导入所有翻译文件 (Import all translation files)
12
+ import serverZh from './i18n/locales/zh/server.js';
13
+ import clientZh from './i18n/locales/zh/client.js';
14
+ import toolsZh from './i18n/locales/zh/tools.js';
15
+ import browserZh from './i18n/locales/zh/browser.js';
16
+ import nodeZh from './i18n/locales/zh/node.js';
17
+ import fetcherZh from './i18n/locales/zh/fetcher.js';
18
+ import factoryZh from './i18n/locales/zh/factory.js';
19
+ import errorsZh from './i18n/locales/zh/errors.js';
20
+ import resourcesZh from './i18n/locales/zh/resources.js';
21
+ import promptsZh from './i18n/locales/zh/prompts.js';
22
+ // 创建翻译映射 (Create translation mapping)
23
+ const translationMap = {
24
+ server: serverZh,
25
+ client: clientZh,
26
+ tools: toolsZh,
27
+ browser: browserZh,
28
+ node: nodeZh,
29
+ fetcher: fetcherZh,
30
+ factory: factoryZh,
31
+ errors: errorsZh,
32
+ resources: resourcesZh,
33
+ prompts: promptsZh
34
+ };
11
35
  // 组件名称常量 (Component name constants)
12
36
  export const COMPONENTS = {
13
37
  SERVER: 'MCP-SERVER',
@@ -16,7 +40,8 @@ export const COMPONENTS = {
16
40
  CLIENT: 'CLIENT',
17
41
  RESOURCES: 'MCP-RESOURCES',
18
42
  PROMPTS: 'MCP-PROMPTS',
19
- TOOLS: 'MCP-TOOLS'
43
+ TOOLS: 'MCP-TOOLS',
44
+ FETCHER_FACTORY: 'FETCHER-FACTORY'
20
45
  };
21
46
  // 日志文件路径 (Log file path)
22
47
  const LOG_DIR = path.join(os.homedir(), '.mult-fetch-mcp-server');
@@ -32,6 +57,8 @@ catch (error) {
32
57
  }
33
58
  // 组件日志记录器缓存 (Component logger cache)
34
59
  const loggerCache = {};
60
+ // 翻译缓存,避免重复翻译相同的键名 (Translation cache to avoid repeated translation of the same key)
61
+ const translationCache = {};
35
62
  /**
36
63
  * 获取指定组件的日志记录器 (Get logger for specified component)
37
64
  * @param component 组件名称 (Component name)
@@ -93,6 +120,101 @@ export function clearLogFile() {
93
120
  export function getLogFilePath() {
94
121
  return LOG_FILE;
95
122
  }
123
+ /**
124
+ * 尝试翻译键名 (Try to translate a key)
125
+ * @param key 翻译键 (Translation key)
126
+ * @param options 翻译选项 (Translation options)
127
+ * @param component 组件名称 (Component name)
128
+ * @returns 翻译后的文本 (Translated text)
129
+ */
130
+ function translateKey(key, options, component = COMPONENTS.SERVER) {
131
+ // 如果没有选项,尝试使用缓存 (If no options, try to use cache)
132
+ if (!options || Object.keys(options).length === 0) {
133
+ // 生成缓存键 (Generate cache key)
134
+ const cacheKey = `${key}`;
135
+ // 如果缓存中存在该键,直接返回缓存的翻译 (If the key exists in cache, return the cached translation)
136
+ if (translationCache[cacheKey]) {
137
+ return translationCache[cacheKey];
138
+ }
139
+ try {
140
+ // 尝试翻译键名 (Try to translate the key)
141
+ const translated = t(key, options);
142
+ // 确保结果是字符串 (Ensure the result is a string)
143
+ const translatedStr = typeof translated === 'string' ? translated : JSON.stringify(translated);
144
+ // 如果翻译结果与键名相同,可能是嵌套键未被正确处理 (If translation result is the same as key, nested key may not be handled correctly)
145
+ if (translatedStr === key) {
146
+ // 尝试手动处理嵌套键 (Try to manually handle nested keys)
147
+ const parts = key.split('.');
148
+ if (parts.length > 1) {
149
+ const namespace = parts[0];
150
+ const subKey = parts.slice(1).join('.');
151
+ // 根据命名空间获取对应的翻译对象 (Get translation object based on namespace)
152
+ const translation = translationMap[namespace];
153
+ // 如果找到了翻译对象,尝试获取子键的翻译 (If translation object is found, try to get translation of subkey)
154
+ if (translation && translation[subKey]) {
155
+ // 将翻译结果存入缓存 (Store the translation result in cache)
156
+ translationCache[cacheKey] = translation[subKey];
157
+ return translation[subKey];
158
+ }
159
+ }
160
+ }
161
+ // 将翻译结果存入缓存 (Store the translation result in cache)
162
+ translationCache[cacheKey] = translatedStr;
163
+ return translatedStr;
164
+ }
165
+ catch (error) {
166
+ // 如果翻译失败,返回原始键名 (If translation fails, return the original key)
167
+ return key;
168
+ }
169
+ }
170
+ else {
171
+ // 如果有选项,不使用缓存 (If there are options, don't use cache)
172
+ try {
173
+ // 尝试翻译键名 (Try to translate the key)
174
+ const translated = t(key, options);
175
+ // 确保结果是字符串 (Ensure the result is a string)
176
+ let translatedStr = typeof translated === 'string' ? translated : JSON.stringify(translated);
177
+ // 检查翻译后的字符串是否仍然包含占位符,如果包含,手动进行插值替换
178
+ // (Check if the translated string still contains placeholders, if so, manually perform interpolation)
179
+ if (options && typeof translatedStr === 'string') {
180
+ for (const key in options) {
181
+ const placeholder = `{{${key}}}`;
182
+ if (translatedStr.includes(placeholder)) {
183
+ translatedStr = translatedStr.replace(new RegExp(placeholder, 'g'), String(options[key]));
184
+ }
185
+ }
186
+ }
187
+ // 如果翻译结果与键名相同,可能是嵌套键未被正确处理 (If translation result is the same as key, nested key may not be handled correctly)
188
+ if (translatedStr === key) {
189
+ // 尝试手动处理嵌套键 (Try to manually handle nested keys)
190
+ const parts = key.split('.');
191
+ if (parts.length > 1) {
192
+ const namespace = parts[0];
193
+ const subKey = parts.slice(1).join('.');
194
+ // 根据命名空间获取对应的翻译对象 (Get translation object based on namespace)
195
+ const translation = translationMap[namespace];
196
+ // 如果找到了翻译对象,尝试获取子键的翻译 (If translation object is found, try to get translation of subkey)
197
+ if (translation && translation[subKey]) {
198
+ // 如果有选项,进行插值 (If there are options, do interpolation)
199
+ let result = translation[subKey];
200
+ for (const key in options) {
201
+ const placeholder = `{{${key}}}`;
202
+ if (result.includes(placeholder)) {
203
+ result = result.replace(new RegExp(placeholder, 'g'), String(options[key]));
204
+ }
205
+ }
206
+ return result;
207
+ }
208
+ }
209
+ }
210
+ return translatedStr;
211
+ }
212
+ catch (error) {
213
+ // 如果翻译失败,返回原始键名 (If translation fails, return the original key)
214
+ return key;
215
+ }
216
+ }
217
+ }
96
218
  /**
97
219
  * 统一日志函数 (Unified log function)
98
220
  * 输出调试信息到标准错误流和日志文件 (Output debug information to standard error stream and log file)
@@ -108,19 +230,18 @@ export function log(key, debug = false, options, component = COMPONENTS.SERVER)
108
230
  }
109
231
  // 获取组件的日志记录器 (Get logger for component)
110
232
  const logger = getLogger(component);
111
- // 输出到控制台 (Output to console)
112
- logger.debug(key, options, debug);
113
- // 翻译消息 (Translate message)
114
- let translatedMessage;
115
- try {
116
- const translated = t(key, options);
117
- // 确保 translatedMessage 是字符串 (Ensure translatedMessage is a string)
118
- translatedMessage = typeof translated === 'string' ? translated : JSON.stringify(translated);
119
- }
120
- catch (error) {
121
- // 如果翻译失败,使用原始消息 (If translation fails, use original message)
122
- translatedMessage = typeof key === 'string' ? key : JSON.stringify(key);
123
- }
233
+ // 翻译键名 (Translate the key)
234
+ const translatedMessage = translateKey(key, options, component);
235
+ // 在 MCP 环境中,所有日志都应该使用 error 级别输出 (In MCP environment, all logs should be output at error level)
236
+ console.error(`[${component}] ${translatedMessage}`);
124
237
  // 写入日志文件 (Write to log file)
125
238
  writeToLogFile(component, translatedMessage);
126
239
  }
240
+ /**
241
+ * 清除翻译缓存 (Clear translation cache)
242
+ */
243
+ export function clearTranslationCache() {
244
+ Object.keys(translationCache).forEach(key => {
245
+ delete translationCache[key];
246
+ });
247
+ }