imcp 0.1.4 → 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 (228) 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 -114
  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.map +1 -0
  75. package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
  76. package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
  77. package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
  78. package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
  79. package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
  80. package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
  81. package/dist/core/loaders/InstallOperationManager.js.map +1 -0
  82. package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
  83. package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
  84. package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
  85. package/dist/core/metadatas/constants.js.map +1 -0
  86. package/dist/core/metadatas/recordingConstants.js.map +1 -0
  87. package/dist/core/metadatas/types.js.map +1 -0
  88. package/dist/core/onboard/FeedOnboardService.js.map +1 -0
  89. package/dist/core/onboard/OnboardProcessor.js.map +1 -0
  90. package/dist/core/onboard/OnboardStatus.js.map +1 -0
  91. package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
  92. package/dist/core/types.d.ts +166 -0
  93. package/dist/core/types.js +16 -0
  94. package/dist/core/types.js.map +1 -0
  95. package/dist/core/validators/FeedValidator.js.map +1 -0
  96. package/dist/core/validators/IServerValidator.js.map +1 -0
  97. package/dist/core/validators/SSEServerValidator.js.map +1 -0
  98. package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
  99. package/dist/core/validators/StdioServerValidator.js.map +1 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/services/InstallRequestValidator.d.ts +21 -0
  102. package/dist/services/InstallRequestValidator.js +99 -0
  103. package/dist/services/InstallRequestValidator.js.map +1 -0
  104. package/dist/services/InstallationService.js.map +1 -0
  105. package/dist/services/MCPManager.js.map +1 -0
  106. package/dist/services/RequirementService.js.map +1 -0
  107. package/dist/services/ServerService.js.map +1 -0
  108. package/dist/services/TelemetryService.js.map +1 -0
  109. package/dist/utils/UpdateCheckTracker.js.map +1 -0
  110. package/dist/utils/adoUtils.js.map +1 -0
  111. package/dist/utils/clientUtils.js.map +1 -0
  112. package/dist/utils/feedUtils.js.map +1 -0
  113. package/dist/utils/githubAuth.js.map +1 -0
  114. package/dist/utils/githubUtils.js.map +1 -0
  115. package/dist/utils/logger.js.map +1 -0
  116. package/dist/utils/macroExpressionUtils.js.map +1 -0
  117. package/dist/utils/osUtils.js.map +1 -0
  118. package/dist/utils/versionUtils.js.map +1 -0
  119. package/dist/web/contract/serverContract.js.map +1 -0
  120. package/dist/web/public/index.html +1 -1
  121. package/dist/web/public/js/modal/installHandler.js +227 -0
  122. package/dist/web/public/js/modal/loadingUI.js +74 -0
  123. package/dist/web/public/js/modal/messageQueue.js +101 -45
  124. package/dist/web/public/js/modal/modalUI.js +214 -0
  125. package/{src/web/public/js/modal/versionUtils.js → dist/web/public/js/modal/version.js} +1 -1
  126. package/dist/web/public/onboard.html +4 -4
  127. package/dist/web/server.js.map +1 -0
  128. package/package.json +5 -1
  129. package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
  130. package/.github/acl/access.yml +0 -20
  131. package/.github/compliance/inventory.yml +0 -5
  132. package/.github/policies/jit.yml +0 -19
  133. package/.roo/rules-code/rules.md +0 -88
  134. package/dist/core/onboard/InstallOperationManager.d.ts +0 -23
  135. package/dist/core/onboard/InstallOperationManager.js +0 -144
  136. package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
  137. package/docs/Telemetry.md +0 -136
  138. package/memory-bank/activeContext.md +0 -26
  139. package/memory-bank/decisionLog.md +0 -91
  140. package/memory-bank/productContext.md +0 -41
  141. package/memory-bank/progress.md +0 -35
  142. package/memory-bank/systemPatterns.md +0 -10
  143. package/src/cli/commands/install.ts +0 -139
  144. package/src/cli/commands/list.ts +0 -113
  145. package/src/cli/commands/pull.ts +0 -16
  146. package/src/cli/commands/serve.ts +0 -39
  147. package/src/cli/commands/uninstall.ts +0 -64
  148. package/src/cli/index.ts +0 -82
  149. package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
  150. package/src/core/installers/clients/ClientInstaller.ts +0 -222
  151. package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
  152. package/src/core/installers/clients/ClineInstaller.ts +0 -35
  153. package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
  154. package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
  155. package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
  156. package/src/core/installers/index.ts +0 -11
  157. package/src/core/installers/requirements/BaseInstaller.ts +0 -85
  158. package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
  159. package/src/core/installers/requirements/NpmInstaller.ts +0 -271
  160. package/src/core/installers/requirements/NugetInstaller.ts +0 -203
  161. package/src/core/installers/requirements/PipInstaller.ts +0 -207
  162. package/src/core/loaders/InstallOperationManager.ts +0 -367
  163. package/src/core/loaders/ServerSchemaLoader.ts +0 -117
  164. package/src/core/loaders/ServerSchemaProvider.ts +0 -99
  165. package/src/core/loaders/SystemSettingsManager.ts +0 -278
  166. package/src/core/metadatas/constants.ts +0 -122
  167. package/src/core/metadatas/recordingConstants.ts +0 -65
  168. package/src/core/metadatas/types.ts +0 -202
  169. package/src/core/onboard/FeedOnboardService.ts +0 -501
  170. package/src/core/onboard/OnboardProcessor.ts +0 -356
  171. package/src/core/onboard/OnboardStatus.ts +0 -60
  172. package/src/core/onboard/OnboardStatusManager.ts +0 -416
  173. package/src/core/validators/FeedValidator.ts +0 -135
  174. package/src/core/validators/IServerValidator.ts +0 -21
  175. package/src/core/validators/SSEServerValidator.ts +0 -43
  176. package/src/core/validators/ServerValidatorFactory.ts +0 -51
  177. package/src/core/validators/StdioServerValidator.ts +0 -313
  178. package/src/index.ts +0 -44
  179. package/src/services/InstallationService.ts +0 -102
  180. package/src/services/MCPManager.ts +0 -249
  181. package/src/services/RequirementService.ts +0 -627
  182. package/src/services/ServerService.ts +0 -161
  183. package/src/services/TelemetryService.ts +0 -59
  184. package/src/utils/UpdateCheckTracker.ts +0 -86
  185. package/src/utils/adoUtils.ts +0 -293
  186. package/src/utils/clientUtils.ts +0 -72
  187. package/src/utils/feedUtils.ts +0 -31
  188. package/src/utils/githubAuth.ts +0 -212
  189. package/src/utils/githubUtils.ts +0 -164
  190. package/src/utils/logger.ts +0 -195
  191. package/src/utils/macroExpressionUtils.ts +0 -104
  192. package/src/utils/osUtils.ts +0 -700
  193. package/src/utils/versionUtils.ts +0 -114
  194. package/src/web/contract/serverContract.ts +0 -74
  195. package/src/web/public/css/detailsWidget.css +0 -235
  196. package/src/web/public/css/modal.css +0 -757
  197. package/src/web/public/css/notifications.css +0 -101
  198. package/src/web/public/css/onboard.css +0 -107
  199. package/src/web/public/css/serverCategoryList.css +0 -120
  200. package/src/web/public/css/serverDetails.css +0 -139
  201. package/src/web/public/index.html +0 -359
  202. package/src/web/public/js/api.js +0 -132
  203. package/src/web/public/js/detailsWidget.js +0 -264
  204. package/src/web/public/js/flights/flights.js +0 -127
  205. package/src/web/public/js/modal/index.js +0 -52
  206. package/src/web/public/js/modal/installModal.js +0 -162
  207. package/src/web/public/js/modal/installation.js +0 -266
  208. package/src/web/public/js/modal/loadingModal.js +0 -182
  209. package/src/web/public/js/modal/modalSetup.js +0 -595
  210. package/src/web/public/js/modal/modalUtils.js +0 -37
  211. package/src/web/public/js/modal.js +0 -42
  212. package/src/web/public/js/notifications.js +0 -137
  213. package/src/web/public/js/onboard/formProcessor.js +0 -1037
  214. package/src/web/public/js/onboard/index.js +0 -374
  215. package/src/web/public/js/onboard/publishHandler.js +0 -172
  216. package/src/web/public/js/onboard/state.js +0 -76
  217. package/src/web/public/js/onboard/templates.js +0 -342
  218. package/src/web/public/js/onboard/uiHandlers.js +0 -1076
  219. package/src/web/public/js/onboard/validationHandlers.js +0 -493
  220. package/src/web/public/js/serverCategoryDetails.js +0 -364
  221. package/src/web/public/js/serverCategoryList.js +0 -241
  222. package/src/web/public/js/settings.js +0 -314
  223. package/src/web/public/modal.html +0 -84
  224. package/src/web/public/onboard.html +0 -296
  225. package/src/web/public/settings.html +0 -135
  226. package/src/web/public/styles.css +0 -277
  227. package/src/web/server.ts +0 -478
  228. package/tsconfig.json +0 -18
@@ -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
- }