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.
- package/dist/cli/commands/install.js +1 -106
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.js +1 -90
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pull.js +1 -16
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -33
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/uninstall.js +1 -46
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.js +1 -65
- package/dist/cli/index.js.map +1 -0
- package/dist/core/installers/clients/BaseClientInstaller.js +1 -282
- package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstaller.js +1 -163
- package/dist/core/installers/clients/ClientInstaller.js.map +1 -0
- package/dist/core/installers/clients/ClientInstallerFactory.js +1 -36
- package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -0
- package/dist/core/installers/clients/ClineInstaller.js +1 -30
- package/dist/core/installers/clients/ClineInstaller.js.map +1 -0
- package/dist/core/installers/clients/ExtensionInstaller.js +1 -151
- package/dist/core/installers/clients/ExtensionInstaller.js.map +1 -0
- package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -68
- package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -0
- package/dist/core/installers/clients/MSRooCodeInstaller.js +1 -28
- package/dist/core/installers/clients/MSRooCodeInstaller.js.map +1 -0
- package/dist/core/installers/index.js +1 -8
- package/dist/core/installers/index.js.map +1 -0
- package/dist/core/installers/requirements/BaseInstaller.js +1 -56
- package/dist/core/installers/requirements/BaseInstaller.js.map +1 -0
- package/dist/core/installers/requirements/CommandInstaller.js +1 -213
- package/dist/core/installers/requirements/CommandInstaller.js.map +1 -0
- package/dist/core/installers/requirements/GeneralInstaller.js +1 -126
- package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -0
- package/dist/core/installers/requirements/InstallerFactory.js +1 -99
- package/dist/core/installers/requirements/InstallerFactory.js.map +1 -0
- package/dist/core/installers/requirements/NpmInstaller.js +1 -235
- package/dist/core/installers/requirements/NpmInstaller.js.map +1 -0
- package/dist/core/installers/requirements/NugetInstaller.js +1 -188
- package/dist/core/installers/requirements/NugetInstaller.js.map +1 -0
- package/dist/core/installers/requirements/PipInstaller.js +1 -192
- package/dist/core/installers/requirements/PipInstaller.js.map +1 -0
- package/dist/core/installers/requirements/RequirementInstaller.js +1 -2
- package/dist/core/installers/requirements/RequirementInstaller.js.map +1 -0
- package/dist/core/loaders/ConfigurationLoader.js +1 -256
- package/dist/core/loaders/ConfigurationLoader.js.map +1 -0
- package/dist/core/loaders/ConfigurationProvider.js +1 -383
- package/dist/core/loaders/ConfigurationProvider.js.map +1 -0
- package/dist/core/loaders/InstallOperationManager.js +1 -310
- package/dist/core/loaders/InstallOperationManager.js.map +1 -0
- package/dist/core/loaders/ServerSchemaLoader.js +1 -108
- package/dist/core/loaders/ServerSchemaLoader.js.map +1 -0
- package/dist/core/loaders/ServerSchemaProvider.js +1 -89
- package/dist/core/loaders/ServerSchemaProvider.js.map +1 -0
- package/dist/core/loaders/SystemSettingsManager.js +1 -256
- package/dist/core/loaders/SystemSettingsManager.js.map +1 -0
- package/dist/core/metadatas/constants.js +1 -100
- package/dist/core/metadatas/constants.js.map +1 -0
- package/dist/core/metadatas/recordingConstants.js +1 -46
- package/dist/core/metadatas/recordingConstants.js.map +1 -0
- package/dist/core/metadatas/types.js +1 -15
- package/dist/core/metadatas/types.js.map +1 -0
- package/dist/core/onboard/FeedOnboardService.js +1 -422
- package/dist/core/onboard/FeedOnboardService.js.map +1 -0
- package/dist/core/onboard/OnboardProcessor.js +1 -333
- package/dist/core/onboard/OnboardProcessor.js.map +1 -0
- package/dist/core/onboard/OnboardStatus.js +1 -9
- package/dist/core/onboard/OnboardStatus.js.map +1 -0
- package/dist/core/onboard/OnboardStatusManager.js +1 -360
- package/dist/core/onboard/OnboardStatusManager.js.map +1 -0
- package/dist/core/validators/FeedValidator.js +1 -133
- package/dist/core/validators/FeedValidator.js.map +1 -0
- package/dist/core/validators/IServerValidator.js +1 -1
- package/dist/core/validators/IServerValidator.js.map +1 -0
- package/dist/core/validators/SSEServerValidator.js +1 -38
- package/dist/core/validators/SSEServerValidator.js.map +1 -0
- package/dist/core/validators/ServerValidatorFactory.js +1 -44
- package/dist/core/validators/ServerValidatorFactory.js.map +1 -0
- package/dist/core/validators/StdioServerValidator.js +1 -281
- package/dist/core/validators/StdioServerValidator.js.map +1 -0
- package/dist/index.js +1 -18
- package/dist/index.js.map +1 -0
- package/dist/services/InstallationService.js +1 -81
- package/dist/services/InstallationService.js.map +1 -0
- package/dist/services/MCPManager.js +1 -197
- package/dist/services/MCPManager.js.map +1 -0
- package/dist/services/RequirementService.js +1 -548
- package/dist/services/RequirementService.js.map +1 -0
- package/dist/services/ServerService.js +1 -127
- package/dist/services/ServerService.js.map +1 -0
- package/dist/services/TelemetryService.js +1 -53
- package/dist/services/TelemetryService.js.map +1 -0
- package/dist/utils/UpdateCheckTracker.js +1 -79
- package/dist/utils/UpdateCheckTracker.js.map +1 -0
- package/dist/utils/adoUtils.js +1 -254
- package/dist/utils/adoUtils.js.map +1 -0
- package/dist/utils/clientUtils.js +1 -65
- package/dist/utils/clientUtils.js.map +1 -0
- package/dist/utils/feedUtils.js +1 -28
- package/dist/utils/feedUtils.js.map +1 -0
- package/dist/utils/githubAuth.js +1 -177
- package/dist/utils/githubAuth.js.map +1 -0
- package/dist/utils/githubUtils.js +1 -125
- package/dist/utils/githubUtils.js.map +1 -0
- package/dist/utils/logger.js +1 -176
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/macroExpressionUtils.js +1 -93
- package/dist/utils/macroExpressionUtils.js.map +1 -0
- package/dist/utils/osUtils.js +1 -664
- package/dist/utils/osUtils.js.map +1 -0
- package/dist/utils/versionUtils.js +1 -101
- package/dist/utils/versionUtils.js.map +1 -0
- package/dist/web/contract/serverContract.js +1 -1
- package/dist/web/contract/serverContract.js.map +1 -0
- package/dist/web/public/js/api.js +2 -132
- package/dist/web/public/js/api.js.map +1 -0
- package/dist/web/public/js/detailsWidget.js +2 -264
- package/dist/web/public/js/detailsWidget.js.map +1 -0
- package/dist/web/public/js/flights/flights.js +2 -127
- package/dist/web/public/js/flights/flights.js.map +1 -0
- package/dist/web/public/js/modal/index.js +2 -52
- package/dist/web/public/js/modal/index.js.map +1 -0
- package/dist/web/public/js/modal/installModal.js +2 -162
- package/dist/web/public/js/modal/installModal.js.map +1 -0
- package/dist/web/public/js/modal/installation.js +2 -266
- package/dist/web/public/js/modal/installation.js.map +1 -0
- package/dist/web/public/js/modal/loadingModal.js +2 -182
- package/dist/web/public/js/modal/loadingModal.js.map +1 -0
- package/dist/web/public/js/modal/modalSetup.js +2 -595
- package/dist/web/public/js/modal/modalSetup.js.map +1 -0
- package/dist/web/public/js/modal/modalUtils.js +2 -37
- package/dist/web/public/js/modal/modalUtils.js.map +1 -0
- package/dist/web/public/js/modal/versionUtils.js +2 -20
- package/dist/web/public/js/modal/versionUtils.js.map +1 -0
- package/dist/web/public/js/modal.js +2 -42
- package/dist/web/public/js/modal.js.map +1 -0
- package/dist/web/public/js/notifications.js +2 -137
- package/dist/web/public/js/notifications.js.map +1 -0
- package/dist/web/public/js/onboard/formProcessor.js +2 -1037
- package/dist/web/public/js/onboard/formProcessor.js.map +1 -0
- package/dist/web/public/js/onboard/index.js +2 -374
- package/dist/web/public/js/onboard/index.js.map +1 -0
- package/dist/web/public/js/onboard/publishHandler.js +2 -172
- package/dist/web/public/js/onboard/publishHandler.js.map +1 -0
- package/dist/web/public/js/onboard/state.js +2 -76
- package/dist/web/public/js/onboard/state.js.map +1 -0
- package/dist/web/public/js/onboard/templates.js +2 -342
- package/dist/web/public/js/onboard/templates.js.map +1 -0
- package/dist/web/public/js/onboard/uiHandlers.js +2 -1076
- package/dist/web/public/js/onboard/uiHandlers.js.map +1 -0
- package/dist/web/public/js/onboard/validationHandlers.js +2 -493
- package/dist/web/public/js/onboard/validationHandlers.js.map +1 -0
- package/dist/web/public/js/serverCategoryDetails.js +2 -364
- package/dist/web/public/js/serverCategoryDetails.js.map +1 -0
- package/dist/web/public/js/serverCategoryList.js +2 -241
- package/dist/web/public/js/serverCategoryList.js.map +1 -0
- package/dist/web/public/js/settings.js +2 -314
- package/dist/web/public/js/settings.js.map +1 -0
- package/dist/web/server.js +1 -404
- package/dist/web/server.js.map +1 -0
- package/package.json +8 -2
- package/.github/ISSUE_TEMPLATE/JitAccess.yml +0 -28
- package/.github/acl/access.yml +0 -20
- package/.github/compliance/inventory.yml +0 -5
- package/.github/policies/jit.yml +0 -19
- package/.github/workflows/build.yml +0 -28
- package/.roo/rules-code/rules.md +0 -88
- package/dist/cli/commands/start.d.ts +0 -2
- package/dist/cli/commands/start.js +0 -32
- package/dist/cli/commands/sync.d.ts +0 -2
- package/dist/cli/commands/sync.js +0 -17
- package/dist/core/ConfigurationLoader.d.ts +0 -32
- package/dist/core/ConfigurationLoader.js +0 -236
- package/dist/core/ConfigurationProvider.d.ts +0 -35
- package/dist/core/ConfigurationProvider.js +0 -375
- package/dist/core/InstallationService.d.ts +0 -50
- package/dist/core/InstallationService.js +0 -350
- package/dist/core/MCPManager.d.ts +0 -28
- package/dist/core/MCPManager.js +0 -188
- package/dist/core/RequirementService.d.ts +0 -40
- package/dist/core/RequirementService.js +0 -110
- package/dist/core/ServerSchemaLoader.d.ts +0 -11
- package/dist/core/ServerSchemaLoader.js +0 -43
- package/dist/core/ServerSchemaProvider.d.ts +0 -17
- package/dist/core/ServerSchemaProvider.js +0 -120
- package/dist/core/constants.d.ts +0 -47
- package/dist/core/constants.js +0 -94
- package/dist/core/installers/BaseInstaller.d.ts +0 -74
- package/dist/core/installers/BaseInstaller.js +0 -253
- package/dist/core/installers/ClientInstaller.d.ts +0 -23
- package/dist/core/installers/ClientInstaller.js +0 -564
- package/dist/core/installers/CommandInstaller.d.ts +0 -37
- package/dist/core/installers/CommandInstaller.js +0 -173
- package/dist/core/installers/GeneralInstaller.d.ts +0 -33
- package/dist/core/installers/GeneralInstaller.js +0 -85
- package/dist/core/installers/InstallerFactory.d.ts +0 -54
- package/dist/core/installers/InstallerFactory.js +0 -97
- package/dist/core/installers/NpmInstaller.d.ts +0 -26
- package/dist/core/installers/NpmInstaller.js +0 -127
- package/dist/core/installers/PipInstaller.d.ts +0 -28
- package/dist/core/installers/PipInstaller.js +0 -127
- package/dist/core/installers/RequirementInstaller.d.ts +0 -33
- package/dist/core/installers/RequirementInstaller.js +0 -3
- package/dist/core/types.d.ts +0 -166
- package/dist/core/types.js +0 -16
- package/dist/services/InstallRequestValidator.d.ts +0 -21
- package/dist/services/InstallRequestValidator.js +0 -99
- package/dist/web/public/js/modal/installHandler.js +0 -227
- package/dist/web/public/js/modal/loadingUI.js +0 -74
- package/dist/web/public/js/modal/messageQueue.js +0 -112
- package/dist/web/public/js/modal/modalUI.js +0 -214
- package/dist/web/public/js/modal/version.js +0 -20
- package/dist/web/public/js/onboard/ONBOARDING_PAGE_DESIGN.md +0 -370
- package/docs/ONBOARDING_PAGE_DESIGN.md +0 -260
- package/docs/Telemetry.md +0 -136
- package/memory-bank/activeContext.md +0 -26
- package/memory-bank/decisionLog.md +0 -91
- package/memory-bank/productContext.md +0 -41
- package/memory-bank/progress.md +0 -35
- package/memory-bank/systemPatterns.md +0 -10
- package/src/cli/commands/install.ts +0 -139
- package/src/cli/commands/list.ts +0 -113
- package/src/cli/commands/pull.ts +0 -16
- package/src/cli/commands/serve.ts +0 -39
- package/src/cli/commands/uninstall.ts +0 -64
- package/src/cli/index.ts +0 -82
- package/src/core/installers/clients/BaseClientInstaller.ts +0 -341
- package/src/core/installers/clients/ClientInstaller.ts +0 -222
- package/src/core/installers/clients/ClientInstallerFactory.ts +0 -43
- package/src/core/installers/clients/ClineInstaller.ts +0 -35
- package/src/core/installers/clients/ExtensionInstaller.ts +0 -165
- package/src/core/installers/clients/GithubCopilotInstaller.ts +0 -79
- package/src/core/installers/clients/MSRooCodeInstaller.ts +0 -32
- package/src/core/installers/index.ts +0 -11
- package/src/core/installers/requirements/BaseInstaller.ts +0 -85
- package/src/core/installers/requirements/CommandInstaller.ts +0 -231
- package/src/core/installers/requirements/GeneralInstaller.ts +0 -133
- package/src/core/installers/requirements/InstallerFactory.ts +0 -114
- package/src/core/installers/requirements/NpmInstaller.ts +0 -271
- package/src/core/installers/requirements/NugetInstaller.ts +0 -203
- package/src/core/installers/requirements/PipInstaller.ts +0 -207
- package/src/core/installers/requirements/RequirementInstaller.ts +0 -42
- package/src/core/loaders/ConfigurationLoader.ts +0 -298
- package/src/core/loaders/ConfigurationProvider.ts +0 -462
- package/src/core/loaders/InstallOperationManager.ts +0 -367
- package/src/core/loaders/ServerSchemaLoader.ts +0 -117
- package/src/core/loaders/ServerSchemaProvider.ts +0 -99
- package/src/core/loaders/SystemSettingsManager.ts +0 -278
- package/src/core/metadatas/constants.ts +0 -122
- package/src/core/metadatas/recordingConstants.ts +0 -65
- package/src/core/metadatas/types.ts +0 -202
- package/src/core/onboard/FeedOnboardService.ts +0 -501
- package/src/core/onboard/OnboardProcessor.ts +0 -356
- package/src/core/onboard/OnboardStatus.ts +0 -60
- package/src/core/onboard/OnboardStatusManager.ts +0 -416
- package/src/core/validators/FeedValidator.ts +0 -135
- package/src/core/validators/IServerValidator.ts +0 -21
- package/src/core/validators/SSEServerValidator.ts +0 -43
- package/src/core/validators/ServerValidatorFactory.ts +0 -51
- package/src/core/validators/StdioServerValidator.ts +0 -313
- package/src/index.ts +0 -44
- package/src/services/InstallationService.ts +0 -102
- package/src/services/MCPManager.ts +0 -249
- package/src/services/RequirementService.ts +0 -627
- package/src/services/ServerService.ts +0 -161
- package/src/services/TelemetryService.ts +0 -59
- package/src/utils/UpdateCheckTracker.ts +0 -86
- package/src/utils/adoUtils.ts +0 -293
- package/src/utils/clientUtils.ts +0 -72
- package/src/utils/feedUtils.ts +0 -31
- package/src/utils/githubAuth.ts +0 -212
- package/src/utils/githubUtils.ts +0 -164
- package/src/utils/logger.ts +0 -195
- package/src/utils/macroExpressionUtils.ts +0 -104
- package/src/utils/osUtils.ts +0 -700
- package/src/utils/versionUtils.ts +0 -114
- package/src/web/contract/serverContract.ts +0 -74
- package/src/web/public/css/detailsWidget.css +0 -235
- package/src/web/public/css/modal.css +0 -757
- package/src/web/public/css/notifications.css +0 -101
- package/src/web/public/css/onboard.css +0 -107
- package/src/web/public/css/serverCategoryList.css +0 -120
- package/src/web/public/css/serverDetails.css +0 -139
- package/src/web/public/index.html +0 -359
- package/src/web/public/js/api.js +0 -132
- package/src/web/public/js/detailsWidget.js +0 -264
- package/src/web/public/js/flights/flights.js +0 -127
- package/src/web/public/js/modal/index.js +0 -52
- package/src/web/public/js/modal/installModal.js +0 -162
- package/src/web/public/js/modal/installation.js +0 -266
- package/src/web/public/js/modal/loadingModal.js +0 -182
- package/src/web/public/js/modal/modalSetup.js +0 -595
- package/src/web/public/js/modal/modalUtils.js +0 -37
- package/src/web/public/js/modal/versionUtils.js +0 -20
- package/src/web/public/js/modal.js +0 -42
- package/src/web/public/js/notifications.js +0 -137
- package/src/web/public/js/onboard/formProcessor.js +0 -1037
- package/src/web/public/js/onboard/index.js +0 -374
- package/src/web/public/js/onboard/publishHandler.js +0 -172
- package/src/web/public/js/onboard/state.js +0 -76
- package/src/web/public/js/onboard/templates.js +0 -342
- package/src/web/public/js/onboard/uiHandlers.js +0 -1076
- package/src/web/public/js/onboard/validationHandlers.js +0 -493
- package/src/web/public/js/serverCategoryDetails.js +0 -364
- package/src/web/public/js/serverCategoryList.js +0 -241
- package/src/web/public/js/settings.js +0 -314
- package/src/web/public/modal.html +0 -84
- package/src/web/public/onboard.html +0 -296
- package/src/web/public/settings.html +0 -135
- package/src/web/public/styles.css +0 -277
- package/src/web/server.ts +0 -478
- package/tsconfig.json +0 -18
- package/wiki/Installation.md +0 -3
- 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
|
-
}
|