imcp 0.1.6 → 0.1.8-dev

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 (314) hide show
  1. package/dist/cli/commands/install.js +1 -106
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js +1 -90
  4. package/dist/cli/commands/list.js.map +1 -0
  5. package/dist/cli/commands/pull.js +1 -16
  6. package/dist/cli/commands/pull.js.map +1 -0
  7. package/dist/cli/commands/serve.js +1 -33
  8. package/dist/cli/commands/serve.js.map +1 -0
  9. package/dist/cli/commands/uninstall.js +1 -46
  10. package/dist/cli/commands/uninstall.js.map +1 -0
  11. package/dist/cli/index.js +1 -65
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
  14. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  15. package/dist/core/installers/clients/ClientInstaller.js +1 -163
  16. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  17. package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
  18. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  19. package/dist/core/installers/clients/ClineInstaller.js +1 -30
  20. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  21. package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
  22. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  23. package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
  24. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  25. package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
  26. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  27. package/dist/core/installers/index.js +1 -8
  28. package/dist/core/installers/index.js.map +1 -0
  29. package/dist/core/installers/requirements/BaseInstaller.js +1 -56
  30. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  31. package/dist/core/installers/requirements/CommandInstaller.js +1 -213
  32. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  33. package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
  34. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  35. package/dist/core/installers/requirements/InstallerFactory.js +1 -99
  36. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  37. package/dist/core/installers/requirements/NpmInstaller.js +1 -235
  38. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  39. package/dist/core/installers/requirements/NugetInstaller.js +1 -188
  40. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  41. package/dist/core/installers/requirements/PipInstaller.js +1 -192
  42. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  43. package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
  44. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  45. package/dist/core/loaders/ConfigurationLoader.js +1 -256
  46. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  47. package/dist/core/loaders/ConfigurationProvider.js +1 -383
  48. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  49. package/dist/core/loaders/InstallOperationManager.js +1 -310
  50. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  51. package/dist/core/loaders/ServerSchemaLoader.js +1 -108
  52. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  53. package/dist/core/loaders/ServerSchemaProvider.js +1 -89
  54. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  55. package/dist/core/loaders/SystemSettingsManager.js +1 -256
  56. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  57. package/dist/core/metadatas/constants.js +1 -100
  58. package/dist/core/metadatas/constants.js.map +1 -0
  59. package/dist/core/metadatas/recordingConstants.js +1 -46
  60. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  61. package/dist/core/metadatas/types.js +1 -15
  62. package/dist/core/metadatas/types.js.map +1 -0
  63. package/dist/core/onboard/FeedOnboardService.js +1 -422
  64. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  65. package/dist/core/onboard/OnboardProcessor.js +1 -333
  66. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  67. package/dist/core/onboard/OnboardStatus.js +1 -9
  68. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  69. package/dist/core/onboard/OnboardStatusManager.js +1 -360
  70. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  71. package/dist/core/validators/FeedValidator.js +1 -133
  72. package/dist/core/validators/FeedValidator.js.map +1 -0
  73. package/dist/core/validators/IServerValidator.js +1 -1
  74. package/dist/core/validators/IServerValidator.js.map +1 -0
  75. package/dist/core/validators/SSEServerValidator.js +1 -38
  76. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  77. package/dist/core/validators/ServerValidatorFactory.js +1 -44
  78. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  79. package/dist/core/validators/StdioServerValidator.js +1 -281
  80. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  81. package/dist/index.js +1 -18
  82. package/dist/index.js.map +1 -0
  83. package/dist/services/InstallationService.js +1 -81
  84. package/dist/services/InstallationService.js.map +1 -0
  85. package/dist/services/MCPManager.js +1 -197
  86. package/dist/services/MCPManager.js.map +1 -0
  87. package/dist/services/RequirementService.js +1 -548
  88. package/dist/services/RequirementService.js.map +1 -0
  89. package/dist/services/ServerService.js +1 -127
  90. package/dist/services/ServerService.js.map +1 -0
  91. package/dist/services/TelemetryService.js +1 -53
  92. package/dist/services/TelemetryService.js.map +1 -0
  93. package/dist/utils/UpdateCheckTracker.js +1 -79
  94. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  95. package/dist/utils/adoUtils.js +1 -254
  96. package/dist/utils/adoUtils.js.map +1 -0
  97. package/dist/utils/clientUtils.js +1 -65
  98. package/dist/utils/clientUtils.js.map +1 -0
  99. package/dist/utils/feedUtils.js +1 -28
  100. package/dist/utils/feedUtils.js.map +1 -0
  101. package/dist/utils/githubAuth.js +1 -177
  102. package/dist/utils/githubAuth.js.map +1 -0
  103. package/dist/utils/githubUtils.js +1 -125
  104. package/dist/utils/githubUtils.js.map +1 -0
  105. package/dist/utils/logger.js +1 -176
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/macroExpressionUtils.js +1 -93
  108. package/dist/utils/macroExpressionUtils.js.map +1 -0
  109. package/dist/utils/osUtils.js +1 -664
  110. package/dist/utils/osUtils.js.map +1 -0
  111. package/dist/utils/versionUtils.js +1 -101
  112. package/dist/utils/versionUtils.js.map +1 -0
  113. package/dist/web/contract/serverContract.js +1 -1
  114. package/dist/web/contract/serverContract.js.map +1 -0
  115. package/dist/web/public/js/api.js +2 -132
  116. package/dist/web/public/js/api.js.map +1 -0
  117. package/dist/web/public/js/detailsWidget.js +2 -264
  118. package/dist/web/public/js/detailsWidget.js.map +1 -0
  119. package/dist/web/public/js/flights/flights.js +2 -127
  120. package/dist/web/public/js/flights/flights.js.map +1 -0
  121. package/dist/web/public/js/modal/index.js +2 -52
  122. package/dist/web/public/js/modal/index.js.map +1 -0
  123. package/dist/web/public/js/modal/installModal.js +2 -162
  124. package/dist/web/public/js/modal/installModal.js.map +1 -0
  125. package/dist/web/public/js/modal/installation.js +2 -266
  126. package/dist/web/public/js/modal/installation.js.map +1 -0
  127. package/dist/web/public/js/modal/loadingModal.js +2 -182
  128. package/dist/web/public/js/modal/loadingModal.js.map +1 -0
  129. package/dist/web/public/js/modal/modalSetup.js +2 -595
  130. package/dist/web/public/js/modal/modalSetup.js.map +1 -0
  131. package/dist/web/public/js/modal/modalUtils.js +2 -37
  132. package/dist/web/public/js/modal/modalUtils.js.map +1 -0
  133. package/dist/web/public/js/modal/versionUtils.js +2 -20
  134. package/dist/web/public/js/modal/versionUtils.js.map +1 -0
  135. package/dist/web/public/js/modal.js +2 -42
  136. package/dist/web/public/js/modal.js.map +1 -0
  137. package/dist/web/public/js/notifications.js +2 -137
  138. package/dist/web/public/js/notifications.js.map +1 -0
  139. package/dist/web/public/js/onboard/formProcessor.js +2 -1037
  140. package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
  141. package/dist/web/public/js/onboard/index.js +2 -374
  142. package/dist/web/public/js/onboard/index.js.map +1 -0
  143. package/dist/web/public/js/onboard/publishHandler.js +2 -172
  144. package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
  145. package/dist/web/public/js/onboard/state.js +2 -76
  146. package/dist/web/public/js/onboard/state.js.map +1 -0
  147. package/dist/web/public/js/onboard/templates.js +2 -342
  148. package/dist/web/public/js/onboard/templates.js.map +1 -0
  149. package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
  150. package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
  151. package/dist/web/public/js/onboard/validationHandlers.js +2 -493
  152. package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
  153. package/dist/web/public/js/serverCategoryDetails.js +2 -364
  154. package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
  155. package/dist/web/public/js/serverCategoryList.js +2 -241
  156. package/dist/web/public/js/serverCategoryList.js.map +1 -0
  157. package/dist/web/public/js/settings.js +2 -314
  158. package/dist/web/public/js/settings.js.map +1 -0
  159. package/dist/web/server.js +1 -404
  160. package/dist/web/server.js.map +1 -0
  161. package/package.json +8 -2
  162. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  163. package/.github/acl/access.yml +0 -20
  164. package/.github/compliance/inventory.yml +0 -5
  165. package/.github/policies/jit.yml +0 -19
  166. package/.github/workflows/build.yml +0 -28
  167. package/.roo/rules-code/rules.md +0 -88
  168. package/dist/cli/commands/start.d.ts +0 -2
  169. package/dist/cli/commands/start.js +0 -32
  170. package/dist/cli/commands/sync.d.ts +0 -2
  171. package/dist/cli/commands/sync.js +0 -17
  172. package/dist/core/ConfigurationLoader.d.ts +0 -32
  173. package/dist/core/ConfigurationLoader.js +0 -236
  174. package/dist/core/ConfigurationProvider.d.ts +0 -35
  175. package/dist/core/ConfigurationProvider.js +0 -375
  176. package/dist/core/InstallationService.d.ts +0 -50
  177. package/dist/core/InstallationService.js +0 -350
  178. package/dist/core/MCPManager.d.ts +0 -28
  179. package/dist/core/MCPManager.js +0 -188
  180. package/dist/core/RequirementService.d.ts +0 -40
  181. package/dist/core/RequirementService.js +0 -110
  182. package/dist/core/ServerSchemaLoader.d.ts +0 -11
  183. package/dist/core/ServerSchemaLoader.js +0 -43
  184. package/dist/core/ServerSchemaProvider.d.ts +0 -17
  185. package/dist/core/ServerSchemaProvider.js +0 -120
  186. package/dist/core/constants.d.ts +0 -47
  187. package/dist/core/constants.js +0 -94
  188. package/dist/core/installers/BaseInstaller.d.ts +0 -74
  189. package/dist/core/installers/BaseInstaller.js +0 -253
  190. package/dist/core/installers/ClientInstaller.d.ts +0 -23
  191. package/dist/core/installers/ClientInstaller.js +0 -564
  192. package/dist/core/installers/CommandInstaller.d.ts +0 -37
  193. package/dist/core/installers/CommandInstaller.js +0 -173
  194. package/dist/core/installers/GeneralInstaller.d.ts +0 -33
  195. package/dist/core/installers/GeneralInstaller.js +0 -85
  196. package/dist/core/installers/InstallerFactory.d.ts +0 -54
  197. package/dist/core/installers/InstallerFactory.js +0 -97
  198. package/dist/core/installers/NpmInstaller.d.ts +0 -26
  199. package/dist/core/installers/NpmInstaller.js +0 -127
  200. package/dist/core/installers/PipInstaller.d.ts +0 -28
  201. package/dist/core/installers/PipInstaller.js +0 -127
  202. package/dist/core/installers/RequirementInstaller.d.ts +0 -33
  203. package/dist/core/installers/RequirementInstaller.js +0 -3
  204. package/dist/core/types.d.ts +0 -166
  205. package/dist/core/types.js +0 -16
  206. package/dist/services/InstallRequestValidator.d.ts +0 -21
  207. package/dist/services/InstallRequestValidator.js +0 -99
  208. package/dist/web/public/js/modal/installHandler.js +0 -227
  209. package/dist/web/public/js/modal/loadingUI.js +0 -74
  210. package/dist/web/public/js/modal/messageQueue.js +0 -112
  211. package/dist/web/public/js/modal/modalUI.js +0 -214
  212. package/dist/web/public/js/modal/version.js +0 -20
  213. package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
  214. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  215. package/docs/Telemetry.md +0 -136
  216. package/memory-bank/activeContext.md +0 -26
  217. package/memory-bank/decisionLog.md +0 -91
  218. package/memory-bank/productContext.md +0 -41
  219. package/memory-bank/progress.md +0 -35
  220. package/memory-bank/systemPatterns.md +0 -10
  221. package/src/cli/commands/install.ts +0 -139
  222. package/src/cli/commands/list.ts +0 -113
  223. package/src/cli/commands/pull.ts +0 -16
  224. package/src/cli/commands/serve.ts +0 -39
  225. package/src/cli/commands/uninstall.ts +0 -64
  226. package/src/cli/index.ts +0 -82
  227. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  228. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  229. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  230. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  231. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  232. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  233. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  234. package/src/core/installers/index.ts +0 -11
  235. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  236. package/src/core/installers/requirements/CommandInstaller.ts +0 -231
  237. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  238. package/src/core/installers/requirements/InstallerFactory.ts +0 -114
  239. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  240. package/src/core/installers/requirements/NugetInstaller.ts +0 -203
  241. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  242. package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
  243. package/src/core/loaders/ConfigurationLoader.ts +0 -298
  244. package/src/core/loaders/ConfigurationProvider.ts +0 -462
  245. package/src/core/loaders/InstallOperationManager.ts +0 -367
  246. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  247. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  248. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  249. package/src/core/metadatas/constants.ts +0 -122
  250. package/src/core/metadatas/recordingConstants.ts +0 -65
  251. package/src/core/metadatas/types.ts +0 -202
  252. package/src/core/onboard/FeedOnboardService.ts +0 -501
  253. package/src/core/onboard/OnboardProcessor.ts +0 -356
  254. package/src/core/onboard/OnboardStatus.ts +0 -60
  255. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  256. package/src/core/validators/FeedValidator.ts +0 -135
  257. package/src/core/validators/IServerValidator.ts +0 -21
  258. package/src/core/validators/SSEServerValidator.ts +0 -43
  259. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  260. package/src/core/validators/StdioServerValidator.ts +0 -313
  261. package/src/index.ts +0 -44
  262. package/src/services/InstallationService.ts +0 -102
  263. package/src/services/MCPManager.ts +0 -249
  264. package/src/services/RequirementService.ts +0 -627
  265. package/src/services/ServerService.ts +0 -161
  266. package/src/services/TelemetryService.ts +0 -59
  267. package/src/utils/UpdateCheckTracker.ts +0 -86
  268. package/src/utils/adoUtils.ts +0 -293
  269. package/src/utils/clientUtils.ts +0 -72
  270. package/src/utils/feedUtils.ts +0 -31
  271. package/src/utils/githubAuth.ts +0 -212
  272. package/src/utils/githubUtils.ts +0 -164
  273. package/src/utils/logger.ts +0 -195
  274. package/src/utils/macroExpressionUtils.ts +0 -104
  275. package/src/utils/osUtils.ts +0 -700
  276. package/src/utils/versionUtils.ts +0 -114
  277. package/src/web/contract/serverContract.ts +0 -74
  278. package/src/web/public/css/detailsWidget.css +0 -235
  279. package/src/web/public/css/modal.css +0 -757
  280. package/src/web/public/css/notifications.css +0 -101
  281. package/src/web/public/css/onboard.css +0 -107
  282. package/src/web/public/css/serverCategoryList.css +0 -120
  283. package/src/web/public/css/serverDetails.css +0 -139
  284. package/src/web/public/index.html +0 -359
  285. package/src/web/public/js/api.js +0 -132
  286. package/src/web/public/js/detailsWidget.js +0 -264
  287. package/src/web/public/js/flights/flights.js +0 -127
  288. package/src/web/public/js/modal/index.js +0 -52
  289. package/src/web/public/js/modal/installModal.js +0 -162
  290. package/src/web/public/js/modal/installation.js +0 -266
  291. package/src/web/public/js/modal/loadingModal.js +0 -182
  292. package/src/web/public/js/modal/modalSetup.js +0 -595
  293. package/src/web/public/js/modal/modalUtils.js +0 -37
  294. package/src/web/public/js/modal/versionUtils.js +0 -20
  295. package/src/web/public/js/modal.js +0 -42
  296. package/src/web/public/js/notifications.js +0 -137
  297. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  298. package/src/web/public/js/onboard/index.js +0 -374
  299. package/src/web/public/js/onboard/publishHandler.js +0 -172
  300. package/src/web/public/js/onboard/state.js +0 -76
  301. package/src/web/public/js/onboard/templates.js +0 -342
  302. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  303. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  304. package/src/web/public/js/serverCategoryDetails.js +0 -364
  305. package/src/web/public/js/serverCategoryList.js +0 -241
  306. package/src/web/public/js/settings.js +0 -314
  307. package/src/web/public/modal.html +0 -84
  308. package/src/web/public/onboard.html +0 -296
  309. package/src/web/public/settings.html +0 -135
  310. package/src/web/public/styles.css +0 -277
  311. package/src/web/server.ts +0 -478
  312. package/tsconfig.json +0 -18
  313. package/wiki/Installation.md +0 -3
  314. package/wiki/Publish.md +0 -3
@@ -1,313 +0,0 @@
1
- import { McpConfig, RequirementConfig, FeedConfiguration } from "../metadatas/types.js";
2
- import { IServerValidator } from "./IServerValidator.js";
3
- import { Logger } from "../../utils/logger.js";
4
- import { createInstallerFactory } from "../installers/index.js";
5
- import { exec, spawn } from 'child_process';
6
- import util from 'util';
7
- import { MACRO_EXPRESSIONS, resolveNpmModulePath } from "../../utils/macroExpressionUtils.js";
8
- import { getSystemPythonPackageDirectory } from "../../utils/osUtils.js";
9
- import { SETTINGS_DIR } from "../metadatas/constants.js";
10
- import path from "path";
11
- import { InstallOperationManager } from "../loaders/InstallOperationManager.js";
12
-
13
- const execPromise = util.promisify(exec);
14
-
15
- /**
16
- * Validates MCP server configurations for stdio mode
17
- */
18
- export class StdioServerValidator implements IServerValidator {
19
- private installerFactory = createInstallerFactory();
20
-
21
- /**
22
- * Tests if a command exists and is executable
23
- * @param command The command to test
24
- * @returns true if command exists and is executable
25
- */
26
- private async isCommandExecutable(command: string): Promise<boolean> {
27
- try {
28
- Logger.debug(`Testing if command is executable: ${command}`);
29
- const testCmd = process.platform === 'win32' ?
30
- `where ${command}` :
31
- `command -v ${command}`;
32
-
33
- await execPromise(testCmd);
34
- return true;
35
- } catch (error) {
36
- Logger.debug(`Command not found: ${command}`);
37
- return false;
38
- }
39
- }
40
-
41
- /**
42
- * Generates a dedicated folder path for a requirement.
43
- * @param requirement The requirement configuration.
44
- * @returns The path to the requirement's dedicated folder.
45
- * @private
46
- */
47
- private _getRequirementFolderPath(requirement: RequirementConfig): string {
48
- return path.join(
49
- SETTINGS_DIR,
50
- 'onboard',
51
- 'npm_requirements',
52
- requirement.name,
53
- requirement.version.includes('latest') ? 'latest' : requirement.version);
54
- }
55
-
56
- /**
57
- * Validates and installs a requirement if needed
58
- * @param requirement The requirement config to validate and install
59
- * @returns true if requirement is successfully installed/validated
60
- */
61
- private async validateRequirement(requirement: RequirementConfig, recorder: InstallOperationManager): Promise<boolean> {
62
- try {
63
- Logger.debug(`Validating/installing requirement: ${requirement.name}`);
64
- const installer = this.installerFactory.getInstaller(requirement);
65
-
66
- if (!installer) {
67
- const msg = `No installer found for requirement type: ${requirement.type}`;
68
- Logger.error(msg);
69
- throw new Error(msg);
70
- }
71
-
72
- const targetDir = this._getRequirementFolderPath(requirement);
73
- const status = await installer.install(requirement, recorder, { settings: { folderName: targetDir } });
74
- if (!status.installed) {
75
- const msg = `Failed to install requirement ${requirement.name}: ${status.error || 'Unknown error'}`;
76
- Logger.error(msg);
77
- throw new Error(msg);
78
- }
79
-
80
- Logger.debug(`Requirement ${requirement.name} is valid and installed`);
81
- return true;
82
- } catch (error) {
83
- const errorMsg = `Error validating/installing requirement ${requirement.name}: ${error instanceof Error ? error.message : String(error)}`;
84
- Logger.error(errorMsg);
85
- throw error instanceof Error ? error : new Error(errorMsg);
86
- }
87
- }
88
-
89
- /**
90
- * Tests if a server can be started successfully with proper path resolution
91
- * @param command The command to start the server
92
- * @param args The command line arguments
93
- * @returns Promise<boolean> true if server starts successfully, false otherwise
94
- *
95
- * Handles special cases:
96
- * - For node commands: resolves ${NPMPATH} in arguments using resolveNpmModulePath
97
- * - For python/python3 commands: resolves ${PYTHON_PACKAGE} in arguments using system Python packages
98
- */
99
- private async testServerStartup(command: string, args: string[], requirement?: RequirementConfig): Promise<boolean> {
100
- try {
101
- // Log initial command and args
102
- Logger.debug(`Testing server startup with command: ${command}`);
103
- Logger.debug(`Original arguments: ${args.join(' ')}`);
104
-
105
- // Handle path resolution based on command type
106
- let finalArgs = [...args];
107
-
108
- if (command === 'node') {
109
- // Resolve npm module paths in arguments
110
- Logger.debug('Resolving npm module paths in arguments');
111
- const npmPath = requirement ? this._getRequirementFolderPath(requirement) : undefined;
112
- finalArgs = args.map(arg => arg
113
- .replace(MACRO_EXPRESSIONS.NPMPATH, resolveNpmModulePath(npmPath))
114
- .replace(/\\/g, '/')
115
- );
116
- Logger.debug(`Resolved npm arguments: ${finalArgs.join(' ')}`);
117
- } else if (command === 'python' || command === 'python3') {
118
- // Resolve Python package paths in arguments
119
- Logger.debug('Resolving Python package paths in arguments');
120
- const pythonDir = await getSystemPythonPackageDirectory();
121
- if (pythonDir) {
122
- finalArgs = args.map(arg => arg.includes('${PYTHON_PACKAGE}') ? arg.replace('${PYTHON_PACKAGE}', pythonDir) : arg);
123
- Logger.debug(`Resolved Python arguments: ${finalArgs.join(' ')}`);
124
- } else {
125
- const msg = 'Could not resolve system Python package directory';
126
- Logger.error(msg);
127
- throw new Error(msg);
128
- }
129
- }
130
-
131
- return await new Promise<boolean>((resolve, reject) => {
132
- Logger.debug(`Starting process for server test with command: ${command} ${finalArgs.join(' ')}`);
133
-
134
- const timeoutDuration = 20000; // 20 seconds for server startup test
135
-
136
- const serverProcess = spawn(command, finalArgs, {
137
- stdio: ['ignore', 'pipe', 'pipe'], // stdin, stdout, stderr
138
- shell: true
139
- });
140
-
141
- let stdoutData = '';
142
- let stderrData = '';
143
- let settled = false;
144
-
145
- const cleanupAndResolve = (value: boolean) => {
146
- if (settled) return;
147
- settled = true;
148
- clearTimeout(timeoutId);
149
- serverProcess.stdout.removeAllListeners();
150
- serverProcess.stderr.removeAllListeners();
151
- serverProcess.removeAllListeners('exit');
152
- serverProcess.removeAllListeners('error');
153
- if (serverProcess.exitCode === null && !serverProcess.killed) {
154
- serverProcess.kill();
155
- }
156
- resolve(value);
157
- };
158
-
159
- const cleanupAndReject = (err: Error) => {
160
- if (settled) return;
161
- settled = true;
162
- clearTimeout(timeoutId);
163
- serverProcess.stdout.removeAllListeners();
164
- serverProcess.stderr.removeAllListeners();
165
- serverProcess.removeAllListeners('exit');
166
- serverProcess.removeAllListeners('error');
167
- if (serverProcess.exitCode === null && !serverProcess.killed) {
168
- serverProcess.kill();
169
- }
170
- reject(err);
171
- };
172
-
173
- const timeoutId = setTimeout(() => {
174
- if (settled) return;
175
-
176
- if (serverProcess.exitCode === null) { // Process is still running
177
- Logger.debug(`Server startup test: Process still running after ${timeoutDuration / 1000} seconds. Considering it successful.`);
178
- Logger.debug(`Collected stdout:\n${stdoutData}`);
179
- Logger.debug(`Collected stderr:\n${stderrData}`);
180
- cleanupAndResolve(true);
181
- } else {
182
- // Process exited before timeout, 'exit' handler should have caught it.
183
- // This is a fallback or race condition handling.
184
- const msg = `Server startup test: Process exited with code ${serverProcess.exitCode} before timeout completed.`;
185
- Logger.error(msg);
186
- Logger.debug(`Collected stdout:\n${stdoutData}`);
187
- Logger.error(`Collected stderr:\n${stderrData}`); // Log stderr as error here
188
- cleanupAndReject(new Error(msg + ` Stderr: ${stderrData}`));
189
- }
190
- }, timeoutDuration);
191
-
192
- serverProcess.stdout.on('data', (data: Buffer) => {
193
- const messageChunk = data.toString();
194
- stdoutData += messageChunk;
195
- Logger.debug(`Server stdout: ${messageChunk.trim()}`);
196
- });
197
-
198
- serverProcess.stderr.on('data', (data: Buffer) => {
199
- const messageChunk = data.toString();
200
- stderrData += messageChunk;
201
- // Log stderr, but it doesn't automatically mean failure.
202
- // The exit code or an 'error' event will determine failure.
203
- Logger.debug(`Server stderr: ${messageChunk.trim()}`);
204
- });
205
-
206
- serverProcess.on('exit', (code: number | null, signal: string | null) => {
207
- if (settled) return;
208
-
209
- Logger.debug(`Server process exited with code ${code}, signal: ${signal}.`);
210
- Logger.debug(`Final stdout:\n${stdoutData}`);
211
- Logger.debug(`Final stderr:\n${stderrData}`);
212
-
213
- if (code === 0) {
214
- cleanupAndResolve(true);
215
- } else {
216
- const msg = `Server process exited with non-zero code ${code} or signal ${signal}. Stderr: ${stderrData.trim()}`;
217
- Logger.error(msg);
218
- cleanupAndReject(new Error(msg));
219
- }
220
- });
221
-
222
- serverProcess.on('error', (error: Error) => {
223
- if (settled) return;
224
- const msg = `Server process failed to start or encountered an error: ${error.message}.`;
225
- Logger.error(msg);
226
- Logger.debug(`Stdout at error:\n${stdoutData}`);
227
- Logger.error(`Stderr at error:\n${stderrData}`);
228
- cleanupAndReject(new Error(`${msg} Stderr: ${stderrData.trim()}`));
229
- });
230
- });
231
- } catch (error) {
232
- const msg = `Failed to test server startup (outer catch): ${error instanceof Error ? error.message : String(error)}`;
233
- Logger.error(msg);
234
- // Ensure the error thrown is an instance of Error
235
- throw error instanceof Error ? error : new Error(msg);
236
- }
237
- }
238
-
239
- /**
240
- * Validates stdio-specific MCP server configuration
241
- * Checks command, arguments, dependencies and required environment variables
242
- * @param server The MCP server configuration to validate
243
- * @param config The feed configuration containing shared requirements
244
- * @returns true if valid, throws error if invalid
245
- */
246
- public async validateServer(server: McpConfig, config: FeedConfiguration): Promise<boolean> {
247
- try {
248
- Logger.debug(`Validating stdio server configuration: ${server.name}`);
249
-
250
- // Check required installation command
251
- if (!server.installation?.command) {
252
- throw new Error('Server command is required in installation configuration');
253
- }
254
-
255
- // Validate server mode
256
- if (server.mode !== 'stdio') {
257
- throw new Error(`Invalid server mode for stdio validator: ${server.mode}`);
258
- }
259
-
260
- // Parse command and arguments
261
- const fullCommand = server.installation.command;
262
- const [baseCommand, ...defaultArgs] = fullCommand.split(' ');
263
- const args = [...defaultArgs, ...(server.installation.args || [])];
264
-
265
-
266
- // Validate required environment variables if specified
267
- const envVars = server.installation.env;
268
- if (envVars) {
269
- for (const [name, varConfig] of Object.entries(envVars)) {
270
- if (varConfig.Required && !varConfig.Default && !process.env[name]) {
271
- throw new Error(`Required environment variable not set: ${name}`);
272
- }
273
- }
274
- }
275
-
276
- // Validate dependencies if specified
277
- if (server.dependencies?.requirements) {
278
- Logger.debug(`Validating ${server.dependencies.requirements.length} requirements`);
279
-
280
- for (const req of server.dependencies.requirements) {
281
- const reqConfig: RequirementConfig = config.requirements?.find(r => r.name === req.name) || {
282
- name: req.name,
283
- version: req.version,
284
- type: 'npm' // Default to npm if not specified
285
- };
286
-
287
- const isValid = await this.validateRequirement(reqConfig, InstallOperationManager.getInstance(config.name, server.name));
288
- if (!isValid) {
289
- throw new Error(`Dependency validation failed for: ${req.name}`);
290
- }
291
- }
292
- }
293
- // Validate command exists and is executable
294
- const isExecutable = await this.isCommandExecutable(baseCommand);
295
- if (!isExecutable) {
296
- throw new Error(`Command not found or not executable: ${baseCommand}`);
297
- }
298
-
299
- // Test server startup
300
- const serverStarted = await this.testServerStartup(baseCommand, args, config.requirements?.find(r => r.type === 'npm'));
301
- if (!serverStarted) {
302
- throw new Error(`Failed to start server with command: ${fullCommand} ${args.join(' ')}`);
303
- }
304
-
305
- Logger.debug(`Stdio server validation successful: ${server.name}`);
306
- return true;
307
- } catch (error) {
308
- const errorMsg = `Server validation failed: ${error instanceof Error ? error.message : String(error)}`;
309
- Logger.error(errorMsg);
310
- throw new Error(errorMsg);
311
- }
312
- }
313
- }
package/src/index.ts DELETED
@@ -1,44 +0,0 @@
1
- // Public types
2
- export {
3
- MCPServerCategory,
4
- ServerCategoryListOptions,
5
- ServerInstallOptions,
6
- ServerUninstallOptions,
7
- ServerOperationResult,
8
- MCPConfiguration,
9
- MCPEvent,
10
- MCPEventData,
11
- RequirementConfig,
12
- RequirementStatus,
13
- RegistryConfig
14
- } from './core/metadatas/types.js';
15
-
16
- // Core functionality
17
- export { MCPManager, mcpManager } from './services/MCPManager.js';
18
-
19
- // Services
20
- export { ServerService, serverService } from './services/ServerService.js';
21
- export { RequirementService, requirementService } from './services/RequirementService.js';
22
-
23
- // Installer interfaces and implementations
24
- export {
25
- RequirementInstaller,
26
- BaseInstaller,
27
- NpmInstaller,
28
- PipInstaller,
29
- GeneralInstaller,
30
- InstallerFactory,
31
- createInstallerFactory
32
- } from './core/installers/index.js';
33
-
34
- // Web server
35
- export { startWebServer } from './web/server.js';
36
-
37
- // Version information
38
- export const VERSION = '0.0.1';
39
-
40
- // Default configuration
41
- export const DEFAULT_CONFIG = {
42
- configPath: './config/servers.json',
43
- webPort: 3000
44
- } as const;
@@ -1,102 +0,0 @@
1
- import {
2
- ServerInstallOptions,
3
- ServerOperationResult
4
- } from '../core/metadatas/types.js';
5
- import { ClientInstaller } from '../core/installers/clients/ClientInstaller.js';
6
- import { ConfigurationProvider } from '../core/loaders/ConfigurationProvider.js';
7
- import { Logger } from '../utils/logger.js';
8
- import { requirementService } from './RequirementService.js';
9
- import { InstallOperationManager } from '../core/loaders/InstallOperationManager.js';
10
- import * as RecordingConstants from '../core/metadatas/recordingConstants.js';
11
-
12
- /**
13
- * Handles the actual installation process for an MCP server.
14
- */
15
- export class InstallationService {
16
-
17
- constructor() {
18
- // Constructor is now empty after removing installerFactory initialization
19
- }
20
-
21
- /**
22
- * Installs a server based on the provided options.
23
- * @param categoryName The category name of the server.
24
- * @param serverName The name of the server to install.
25
- * @param options The installation options.
26
- * @returns A result object indicating success or failure.
27
- */
28
- async install(categoryName: string, serverName: string, options: ServerInstallOptions): Promise<ServerOperationResult> {
29
- // Reset any previous operation status for this server before starting a new one.
30
- const recoder = await InstallOperationManager.getInstance(categoryName, serverName).resetOperation();
31
- const configProvider = ConfigurationProvider.getInstance();
32
-
33
- const clients = options.targetClients || [];
34
-
35
- // Process updates for requirements if specified in options
36
- if (options.requirements && options.requirements.length > 0) {
37
- recoder.recordingAsync(
38
- () => requirementService.processRequirementUpdates(categoryName, serverName, options),
39
- {
40
- stepName: RecordingConstants.STEP_PROCESS_REQUIREMENT_UPDATES_SERVICE,
41
- onError: (error) => {
42
- const errorMsg = `Error in background requirement updates: ${error instanceof Error ? error.message : String(error)}`;
43
- Logger.error(errorMsg);
44
- return errorMsg;
45
- },
46
- onComplete: () => {
47
- if (clients.length === 0) recoder.markOverallStatus('completed', 'Requirement updates completed.');
48
- }
49
- }
50
- );
51
- }
52
-
53
- if (!clients || clients.length === 0) {
54
- const message = 'No clients specified for installation.';
55
- return { success: true, message };
56
- }
57
-
58
- // Check if the server is already installed and ready
59
- const readyMessage = 'Server and clients are already installed and ready';
60
- const isReady = await recoder.recording(
61
- () => configProvider.isServerReady(categoryName, serverName, clients),
62
- {
63
- stepName: RecordingConstants.STEP_CHECK_SERVER_READINESS,
64
- inProgressMessage: 'Checking if server is already ready.',
65
- endMessage: (ready: boolean) => ready ? 'Server and clients are already installed and ready' : 'Server is not ready. Proceeding with installation.',
66
- }
67
- )
68
- if (isReady) {
69
- return {
70
- success: true, message: readyMessage,
71
- status: [{
72
- status: 'completed',
73
- type: 'install',
74
- target: 'server',
75
- message: readyMessage,
76
- }]
77
- };
78
- }
79
-
80
- // Create new ClientInstaller instance for handling installation
81
- const clientInstaller = new ClientInstaller(categoryName, serverName, clients);
82
-
83
- // Check and install requirements using RequirementService
84
- const requirementsResult = await requirementService.checkAndInstallRequirements(categoryName, serverName, options);
85
-
86
- // trigger a backend requirement check
87
- await requirementService.checkServerRequirementForUpdateAsync(categoryName, serverName)
88
- .then(() => {
89
- Logger.info(`Requirement check for ${categoryName}:${serverName} completed successfully.`);
90
- })
91
- .catch((error) => {
92
- Logger.error(`Requirement check for ${categoryName}:${serverName} failed: ${error instanceof Error ? error.message : String(error)}`);
93
- });
94
-
95
- if (requirementsResult && !requirementsResult.success) {
96
- await recoder.recordStep('RequirementInstallationCheck', 'failed', requirementsResult.error?.message || requirementsResult.message || 'Requirement installation failed.');
97
- return requirementsResult;
98
- }
99
-
100
- return await clientInstaller.install(options);
101
- }
102
- }