imcp 0.1.3 → 0.1.5

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 (239) hide show
  1. package/README.md +21 -4
  2. package/dist/cli/commands/install.js.map +1 -0
  3. package/dist/cli/commands/list.js.map +1 -0
  4. package/dist/cli/commands/pull.js.map +1 -0
  5. package/dist/cli/commands/serve.js.map +1 -0
  6. package/dist/cli/commands/start.d.ts +2 -0
  7. package/dist/cli/commands/start.js +32 -0
  8. package/dist/cli/commands/start.js.map +1 -0
  9. package/dist/cli/commands/sync.d.ts +2 -0
  10. package/dist/cli/commands/sync.js +17 -0
  11. package/dist/cli/commands/sync.js.map +1 -0
  12. package/dist/cli/commands/uninstall.js.map +1 -0
  13. package/dist/cli/index.js +0 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/ConfigurationLoader.d.ts +32 -0
  16. package/{src/core/loaders/ConfigurationLoader.ts → dist/core/ConfigurationLoader.js} +236 -298
  17. package/dist/core/ConfigurationLoader.js.map +1 -0
  18. package/dist/core/ConfigurationProvider.d.ts +35 -0
  19. package/{src/core/loaders/ConfigurationProvider.ts → dist/core/ConfigurationProvider.js} +375 -462
  20. package/dist/core/ConfigurationProvider.js.map +1 -0
  21. package/dist/core/InstallationService.d.ts +50 -0
  22. package/dist/core/InstallationService.js +350 -0
  23. package/dist/core/InstallationService.js.map +1 -0
  24. package/dist/core/MCPManager.d.ts +28 -0
  25. package/dist/core/MCPManager.js +188 -0
  26. package/dist/core/MCPManager.js.map +1 -0
  27. package/dist/core/RequirementService.d.ts +40 -0
  28. package/dist/core/RequirementService.js +110 -0
  29. package/dist/core/RequirementService.js.map +1 -0
  30. package/dist/core/ServerSchemaLoader.d.ts +11 -0
  31. package/dist/core/ServerSchemaLoader.js +43 -0
  32. package/dist/core/ServerSchemaLoader.js.map +1 -0
  33. package/dist/core/ServerSchemaProvider.d.ts +17 -0
  34. package/dist/core/ServerSchemaProvider.js +120 -0
  35. package/dist/core/ServerSchemaProvider.js.map +1 -0
  36. package/dist/core/constants.d.ts +47 -0
  37. package/dist/core/constants.js +94 -0
  38. package/dist/core/constants.js.map +1 -0
  39. package/dist/core/installers/BaseInstaller.d.ts +74 -0
  40. package/dist/core/installers/BaseInstaller.js +253 -0
  41. package/dist/core/installers/BaseInstaller.js.map +1 -0
  42. package/dist/core/installers/ClientInstaller.d.ts +23 -0
  43. package/dist/core/installers/ClientInstaller.js +564 -0
  44. package/dist/core/installers/ClientInstaller.js.map +1 -0
  45. package/dist/core/installers/CommandInstaller.d.ts +37 -0
  46. package/{src/core/installers/requirements/CommandInstaller.ts → dist/core/installers/CommandInstaller.js} +173 -231
  47. package/dist/core/installers/CommandInstaller.js.map +1 -0
  48. package/dist/core/installers/GeneralInstaller.d.ts +33 -0
  49. package/dist/core/installers/GeneralInstaller.js +85 -0
  50. package/dist/core/installers/GeneralInstaller.js.map +1 -0
  51. package/dist/core/installers/InstallerFactory.d.ts +54 -0
  52. package/{src/core/installers/requirements/InstallerFactory.ts → dist/core/installers/InstallerFactory.js} +97 -112
  53. package/dist/core/installers/InstallerFactory.js.map +1 -0
  54. package/dist/core/installers/NpmInstaller.d.ts +26 -0
  55. package/dist/core/installers/NpmInstaller.js +127 -0
  56. package/dist/core/installers/NpmInstaller.js.map +1 -0
  57. package/dist/core/installers/PipInstaller.d.ts +28 -0
  58. package/dist/core/installers/PipInstaller.js +127 -0
  59. package/dist/core/installers/PipInstaller.js.map +1 -0
  60. package/{src/core/installers/requirements/RequirementInstaller.ts → dist/core/installers/RequirementInstaller.d.ts} +33 -42
  61. package/dist/core/installers/RequirementInstaller.js +3 -0
  62. package/dist/core/installers/RequirementInstaller.js.map +1 -0
  63. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
  64. package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
  65. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
  66. package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
  67. package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
  68. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
  69. package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
  70. package/dist/core/installers/index.js.map +1 -0
  71. package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
  72. package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
  73. package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
  74. package/dist/core/installers/requirements/InstallerFactory.js +2 -0
  75. package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
  76. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  77. package/dist/core/installers/requirements/NugetInstaller.d.ts +37 -0
  78. package/dist/core/installers/requirements/NugetInstaller.js +189 -0
  79. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  80. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  81. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  82. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  83. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  84. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  85. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  86. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  87. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  88. package/dist/core/metadatas/constants.js.map +1 -0
  89. package/dist/core/metadatas/recordingConstants.d.ts +2 -0
  90. package/dist/core/metadatas/recordingConstants.js +2 -0
  91. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  92. package/dist/core/metadatas/types.d.ts +1 -1
  93. package/dist/core/metadatas/types.js.map +1 -0
  94. package/dist/core/onboard/FeedOnboardService.js +1 -22
  95. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  96. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  97. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  98. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  99. package/dist/core/types.d.ts +166 -0
  100. package/dist/core/types.js +16 -0
  101. package/dist/core/types.js.map +1 -0
  102. package/dist/core/validators/FeedValidator.js.map +1 -0
  103. package/dist/core/validators/IServerValidator.js.map +1 -0
  104. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  105. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  106. package/dist/core/validators/StdioServerValidator.js +5 -5
  107. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/services/InstallRequestValidator.d.ts +21 -0
  110. package/dist/services/InstallRequestValidator.js +99 -0
  111. package/dist/services/InstallRequestValidator.js.map +1 -0
  112. package/dist/services/InstallationService.js.map +1 -0
  113. package/dist/services/MCPManager.js.map +1 -0
  114. package/dist/services/RequirementService.js.map +1 -0
  115. package/dist/services/ServerService.js.map +1 -0
  116. package/dist/services/TelemetryService.js.map +1 -0
  117. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  118. package/dist/utils/adoUtils.js.map +1 -0
  119. package/dist/utils/clientUtils.js.map +1 -0
  120. package/dist/utils/feedUtils.js.map +1 -0
  121. package/dist/utils/githubAuth.js.map +1 -0
  122. package/dist/utils/githubUtils.js.map +1 -0
  123. package/dist/utils/logger.js.map +1 -0
  124. package/dist/utils/macroExpressionUtils.js.map +1 -0
  125. package/dist/utils/osUtils.d.ts +11 -0
  126. package/dist/utils/osUtils.js +100 -0
  127. package/dist/utils/osUtils.js.map +1 -0
  128. package/dist/utils/versionUtils.js.map +1 -0
  129. package/dist/web/contract/serverContract.js.map +1 -0
  130. package/dist/web/public/index.html +1 -1
  131. package/dist/web/public/js/modal/installHandler.js +227 -0
  132. package/dist/web/public/js/modal/loadingUI.js +74 -0
  133. package/dist/web/public/js/modal/messageQueue.js +101 -45
  134. package/dist/web/public/js/modal/modalUI.js +214 -0
  135. package/{src/web/public/js/modal/versionUtils.js → dist/web/public/js/modal/version.js} +1 -1
  136. package/dist/web/public/js/onboard/templates.js +1 -0
  137. package/dist/web/public/js/serverCategoryList.js +3 -3
  138. package/dist/web/public/onboard.html +4 -4
  139. package/dist/web/server.js.map +1 -0
  140. package/package.json +5 -1
  141. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  142. package/.github/acl/access.yml +0 -20
  143. package/.github/compliance/inventory.yml +0 -5
  144. package/.github/policies/jit.yml +0 -19
  145. package/.roo/rules-code/rules.md +0 -88
  146. package/dist/core/onboard/InstallOperationManager.d.ts +0 -23
  147. package/dist/core/onboard/InstallOperationManager.js +0 -144
  148. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  149. package/docs/Telemetry.md +0 -136
  150. package/memory-bank/activeContext.md +0 -26
  151. package/memory-bank/decisionLog.md +0 -91
  152. package/memory-bank/productContext.md +0 -41
  153. package/memory-bank/progress.md +0 -35
  154. package/memory-bank/systemPatterns.md +0 -10
  155. package/src/cli/commands/install.ts +0 -139
  156. package/src/cli/commands/list.ts +0 -113
  157. package/src/cli/commands/pull.ts +0 -16
  158. package/src/cli/commands/serve.ts +0 -39
  159. package/src/cli/commands/uninstall.ts +0 -64
  160. package/src/cli/index.ts +0 -82
  161. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  162. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  163. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  164. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  165. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  166. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  167. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  168. package/src/core/installers/index.ts +0 -11
  169. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  170. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  171. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  172. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  173. package/src/core/loaders/InstallOperationManager.ts +0 -367
  174. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  175. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  176. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  177. package/src/core/metadatas/constants.ts +0 -122
  178. package/src/core/metadatas/recordingConstants.ts +0 -62
  179. package/src/core/metadatas/types.ts +0 -202
  180. package/src/core/onboard/FeedOnboardService.ts +0 -524
  181. package/src/core/onboard/OnboardProcessor.ts +0 -356
  182. package/src/core/onboard/OnboardStatus.ts +0 -60
  183. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  184. package/src/core/validators/FeedValidator.ts +0 -135
  185. package/src/core/validators/IServerValidator.ts +0 -21
  186. package/src/core/validators/SSEServerValidator.ts +0 -43
  187. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  188. package/src/core/validators/StdioServerValidator.ts +0 -312
  189. package/src/index.ts +0 -44
  190. package/src/services/InstallationService.ts +0 -102
  191. package/src/services/MCPManager.ts +0 -249
  192. package/src/services/RequirementService.ts +0 -627
  193. package/src/services/ServerService.ts +0 -161
  194. package/src/services/TelemetryService.ts +0 -59
  195. package/src/utils/UpdateCheckTracker.ts +0 -86
  196. package/src/utils/adoUtils.ts +0 -293
  197. package/src/utils/clientUtils.ts +0 -72
  198. package/src/utils/feedUtils.ts +0 -31
  199. package/src/utils/githubAuth.ts +0 -212
  200. package/src/utils/githubUtils.ts +0 -164
  201. package/src/utils/logger.ts +0 -195
  202. package/src/utils/macroExpressionUtils.ts +0 -104
  203. package/src/utils/osUtils.ts +0 -597
  204. package/src/utils/versionUtils.ts +0 -114
  205. package/src/web/contract/serverContract.ts +0 -74
  206. package/src/web/public/css/detailsWidget.css +0 -235
  207. package/src/web/public/css/modal.css +0 -757
  208. package/src/web/public/css/notifications.css +0 -101
  209. package/src/web/public/css/onboard.css +0 -107
  210. package/src/web/public/css/serverCategoryList.css +0 -120
  211. package/src/web/public/css/serverDetails.css +0 -139
  212. package/src/web/public/index.html +0 -359
  213. package/src/web/public/js/api.js +0 -132
  214. package/src/web/public/js/detailsWidget.js +0 -264
  215. package/src/web/public/js/flights/flights.js +0 -127
  216. package/src/web/public/js/modal/index.js +0 -52
  217. package/src/web/public/js/modal/installModal.js +0 -162
  218. package/src/web/public/js/modal/installation.js +0 -266
  219. package/src/web/public/js/modal/loadingModal.js +0 -182
  220. package/src/web/public/js/modal/modalSetup.js +0 -595
  221. package/src/web/public/js/modal/modalUtils.js +0 -37
  222. package/src/web/public/js/modal.js +0 -42
  223. package/src/web/public/js/notifications.js +0 -137
  224. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  225. package/src/web/public/js/onboard/index.js +0 -374
  226. package/src/web/public/js/onboard/publishHandler.js +0 -172
  227. package/src/web/public/js/onboard/state.js +0 -76
  228. package/src/web/public/js/onboard/templates.js +0 -341
  229. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  230. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  231. package/src/web/public/js/serverCategoryDetails.js +0 -364
  232. package/src/web/public/js/serverCategoryList.js +0 -241
  233. package/src/web/public/js/settings.js +0 -314
  234. package/src/web/public/modal.html +0 -84
  235. package/src/web/public/onboard.html +0 -296
  236. package/src/web/public/settings.html +0 -135
  237. package/src/web/public/styles.css +0 -277
  238. package/src/web/server.ts +0 -478
  239. package/tsconfig.json +0 -18
@@ -1,312 +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
- // Validate command exists and is executable
266
- const isExecutable = await this.isCommandExecutable(baseCommand);
267
- if (!isExecutable) {
268
- throw new Error(`Command not found or not executable: ${baseCommand}`);
269
- }
270
-
271
- // Validate required environment variables if specified
272
- const envVars = server.installation.env;
273
- if (envVars) {
274
- for (const [name, varConfig] of Object.entries(envVars)) {
275
- if (varConfig.Required && !varConfig.Default && !process.env[name]) {
276
- throw new Error(`Required environment variable not set: ${name}`);
277
- }
278
- }
279
- }
280
-
281
- // Validate dependencies if specified
282
- if (server.dependencies?.requirements) {
283
- Logger.debug(`Validating ${server.dependencies.requirements.length} requirements`);
284
-
285
- for (const req of server.dependencies.requirements) {
286
- const reqConfig: RequirementConfig = config.requirements?.find(r => r.name === req.name) || {
287
- name: req.name,
288
- version: req.version,
289
- type: 'npm' // Default to npm if not specified
290
- };
291
-
292
- const isValid = await this.validateRequirement(reqConfig, InstallOperationManager.getInstance(config.name, server.name));
293
- if (!isValid) {
294
- throw new Error(`Dependency validation failed for: ${req.name}`);
295
- }
296
- }
297
- }
298
- // Test server startup
299
- const serverStarted = await this.testServerStartup(baseCommand, args, config.requirements?.find(r => r.type === 'npm'));
300
- if (!serverStarted) {
301
- throw new Error(`Failed to start server with command: ${fullCommand} ${args.join(' ')}`);
302
- }
303
-
304
- Logger.debug(`Stdio server validation successful: ${server.name}`);
305
- return true;
306
- } catch (error) {
307
- const errorMsg = `Server validation failed: ${error instanceof Error ? error.message : String(error)}`;
308
- Logger.error(errorMsg);
309
- throw new Error(errorMsg);
310
- }
311
- }
312
- }
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
- }