@global-packages/mcp-kit 1.0.0

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 (142) hide show
  1. package/README.md +97 -0
  2. package/dist/commands/add.d.ts +2 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +89 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/backup.d.ts +6 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +35 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/completion.d.ts +2 -0
  11. package/dist/commands/completion.d.ts.map +1 -0
  12. package/dist/commands/completion.js +84 -0
  13. package/dist/commands/completion.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +2 -0
  15. package/dist/commands/doctor.d.ts.map +1 -0
  16. package/dist/commands/doctor.js +148 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/env-check.d.ts +6 -0
  19. package/dist/commands/env-check.d.ts.map +1 -0
  20. package/dist/commands/env-check.js +53 -0
  21. package/dist/commands/env-check.js.map +1 -0
  22. package/dist/commands/export.d.ts +5 -0
  23. package/dist/commands/export.d.ts.map +1 -0
  24. package/dist/commands/export.js +55 -0
  25. package/dist/commands/export.js.map +1 -0
  26. package/dist/commands/import.d.ts +2 -0
  27. package/dist/commands/import.d.ts.map +1 -0
  28. package/dist/commands/import.js +90 -0
  29. package/dist/commands/import.js.map +1 -0
  30. package/dist/commands/info.d.ts +6 -0
  31. package/dist/commands/info.d.ts.map +1 -0
  32. package/dist/commands/info.js +92 -0
  33. package/dist/commands/info.js.map +1 -0
  34. package/dist/commands/init.d.ts +5 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +118 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/install.d.ts +2 -0
  39. package/dist/commands/install.d.ts.map +1 -0
  40. package/dist/commands/install.js +69 -0
  41. package/dist/commands/install.js.map +1 -0
  42. package/dist/commands/list.d.ts +6 -0
  43. package/dist/commands/list.d.ts.map +1 -0
  44. package/dist/commands/list.js +55 -0
  45. package/dist/commands/list.js.map +1 -0
  46. package/dist/commands/open.d.ts +2 -0
  47. package/dist/commands/open.d.ts.map +1 -0
  48. package/dist/commands/open.js +32 -0
  49. package/dist/commands/open.js.map +1 -0
  50. package/dist/commands/remove.d.ts +2 -0
  51. package/dist/commands/remove.d.ts.map +1 -0
  52. package/dist/commands/remove.js +57 -0
  53. package/dist/commands/remove.js.map +1 -0
  54. package/dist/commands/reset.d.ts +2 -0
  55. package/dist/commands/reset.d.ts.map +1 -0
  56. package/dist/commands/reset.js +61 -0
  57. package/dist/commands/reset.js.map +1 -0
  58. package/dist/commands/search.d.ts +6 -0
  59. package/dist/commands/search.d.ts.map +1 -0
  60. package/dist/commands/search.js +33 -0
  61. package/dist/commands/search.js.map +1 -0
  62. package/dist/commands/status.d.ts +6 -0
  63. package/dist/commands/status.d.ts.map +1 -0
  64. package/dist/commands/status.js +92 -0
  65. package/dist/commands/status.js.map +1 -0
  66. package/dist/commands/toggle.d.ts +3 -0
  67. package/dist/commands/toggle.d.ts.map +1 -0
  68. package/dist/commands/toggle.js +59 -0
  69. package/dist/commands/toggle.js.map +1 -0
  70. package/dist/commands/update.d.ts +2 -0
  71. package/dist/commands/update.d.ts.map +1 -0
  72. package/dist/commands/update.js +80 -0
  73. package/dist/commands/update.js.map +1 -0
  74. package/dist/commands/validate.d.ts +6 -0
  75. package/dist/commands/validate.d.ts.map +1 -0
  76. package/dist/commands/validate.js +77 -0
  77. package/dist/commands/validate.js.map +1 -0
  78. package/dist/constants.d.ts +7 -0
  79. package/dist/constants.d.ts.map +1 -0
  80. package/dist/constants.js +356 -0
  81. package/dist/constants.js.map +1 -0
  82. package/dist/core/credentials.d.ts +7 -0
  83. package/dist/core/credentials.d.ts.map +1 -0
  84. package/dist/core/credentials.js +144 -0
  85. package/dist/core/credentials.js.map +1 -0
  86. package/dist/core/detector.d.ts +8 -0
  87. package/dist/core/detector.d.ts.map +1 -0
  88. package/dist/core/detector.js +82 -0
  89. package/dist/core/detector.js.map +1 -0
  90. package/dist/core/registry.d.ts +7 -0
  91. package/dist/core/registry.d.ts.map +1 -0
  92. package/dist/core/registry.js +40 -0
  93. package/dist/core/registry.js.map +1 -0
  94. package/dist/core/validator.d.ts +6 -0
  95. package/dist/core/validator.d.ts.map +1 -0
  96. package/dist/core/validator.js +50 -0
  97. package/dist/core/validator.js.map +1 -0
  98. package/dist/core/writer.d.ts +7 -0
  99. package/dist/core/writer.d.ts.map +1 -0
  100. package/dist/core/writer.js +50 -0
  101. package/dist/core/writer.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +141 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/postinstall.d.ts +9 -0
  107. package/dist/postinstall.d.ts.map +1 -0
  108. package/dist/postinstall.js +100 -0
  109. package/dist/postinstall.js.map +1 -0
  110. package/dist/prompts/dev-prompts.d.ts +3 -0
  111. package/dist/prompts/dev-prompts.d.ts.map +1 -0
  112. package/dist/prompts/dev-prompts.js +40 -0
  113. package/dist/prompts/dev-prompts.js.map +1 -0
  114. package/dist/prompts/non-dev-prompts.d.ts +3 -0
  115. package/dist/prompts/non-dev-prompts.d.ts.map +1 -0
  116. package/dist/prompts/non-dev-prompts.js +43 -0
  117. package/dist/prompts/non-dev-prompts.js.map +1 -0
  118. package/dist/prompts/shared-prompts.d.ts +5 -0
  119. package/dist/prompts/shared-prompts.d.ts.map +1 -0
  120. package/dist/prompts/shared-prompts.js +59 -0
  121. package/dist/prompts/shared-prompts.js.map +1 -0
  122. package/dist/types.d.ts +79 -0
  123. package/dist/types.d.ts.map +1 -0
  124. package/dist/types.js +3 -0
  125. package/dist/types.js.map +1 -0
  126. package/dist/utils/fs.d.ts +5 -0
  127. package/dist/utils/fs.d.ts.map +1 -0
  128. package/dist/utils/fs.js +30 -0
  129. package/dist/utils/fs.js.map +1 -0
  130. package/dist/utils/logger.d.ts +13 -0
  131. package/dist/utils/logger.d.ts.map +1 -0
  132. package/dist/utils/logger.js +35 -0
  133. package/dist/utils/logger.js.map +1 -0
  134. package/dist/utils/network.d.ts +2 -0
  135. package/dist/utils/network.d.ts.map +1 -0
  136. package/dist/utils/network.js +17 -0
  137. package/dist/utils/network.js.map +1 -0
  138. package/dist/utils/spinner.d.ts +7 -0
  139. package/dist/utils/spinner.d.ts.map +1 -0
  140. package/dist/utils/spinner.js +24 -0
  141. package/dist/utils/spinner.js.map +1 -0
  142. package/package.json +74 -0
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # @global-packages/mcp-kit
2
+
3
+ > Zero-friction MCP setup for VS Code — works on Windows, macOS and Linux
4
+
5
+ ## Install
6
+
7
+ npm install -g @global-packages/mcp-kit
8
+
9
+ ## Quick Start
10
+
11
+ mcp-kit install
12
+ mcp-kit init --dev # for developers
13
+ mcp-kit init --non-dev # for non-developers
14
+
15
+ ## What It Does
16
+
17
+ - Auto-detects your .vscode folder across project and OS paths
18
+ - Configures Azure, Confluence, MSSQL, Playwright, ADO and more
19
+ - Stores credentials in your system keychain, .env, or inline
20
+ - Works for developers and non-technical employees alike
21
+
22
+ ## All Commands
23
+
24
+ | Command | Description |
25
+ |---------|-------------|
26
+ | mcp-kit install | Pre-download all MCP packages |
27
+ | mcp-kit init --dev | Configure developer MCPs |
28
+ | mcp-kit init --non-dev | Configure non-developer MCPs |
29
+ | mcp-kit status | Show configured MCPs |
30
+ | mcp-kit add <id> | Add a single MCP |
31
+ | mcp-kit remove <id> | Remove an MCP |
32
+ | mcp-kit update | Update to latest versions |
33
+ | mcp-kit doctor | Diagnose all issues |
34
+ | mcp-kit list | List configured MCPs |
35
+ | mcp-kit list --available | List all available MCPs |
36
+ | mcp-kit reset | Wipe all configuration |
37
+ | mcp-kit export | Export config for teammates |
38
+ | mcp-kit import <file> | Import shared config |
39
+
40
+ ## Supported MCPs
41
+
42
+ | ID | Name | For | Category |
43
+ |----|------|-----|----------|
44
+ | azure | Azure MCP | all | cloud |
45
+ | confluence | Confluence MCP | all | documentation |
46
+ | mssql | MSSQL MCP | dev | database |
47
+ | playwright | Playwright MCP | dev | testing |
48
+ | runbook | Runbook MCP | all | incident |
49
+ | filesystem | Filesystem MCP | dev | filesystem |
50
+ | git | Git MCP | dev | versioncontrol |
51
+ | azuredevops | Azure DevOps MCP | all | devops |
52
+ | postgres | PostgreSQL MCP | dev | database |
53
+ | slack | Slack MCP | all | productivity |
54
+
55
+ ## .vscode Detection Logic
56
+
57
+ mcp-kit resolves the target path in this order:
58
+
59
+ 1. Walks up parent directories from current working directory looking for `.vscode`.
60
+ 2. Falls back to global VS Code User path for your OS.
61
+ 3. Creates `.vscode` in the current working directory if none exists.
62
+
63
+ OS global config paths:
64
+
65
+ - Windows: `%APPDATA%\\Code\\User`
66
+ - macOS: `~/Library/Application Support/Code/User`
67
+ - Linux: `~/.config/Code/User`
68
+
69
+ ## Credential Storage
70
+
71
+ mcp-kit supports 3 secure storage strategies:
72
+
73
+ 1. `keychain` (recommended): Uses system keychain / credential manager.
74
+ 2. `dotenv`: Writes values into `.env` and references `${env:KEY}` in `mcp.json`.
75
+ 3. `inline`: Writes raw values directly into `mcp.json` (not recommended for shared repos).
76
+
77
+ For shared repositories, keychain is strongly recommended.
78
+
79
+ ## Adding to Registry
80
+
81
+ The MCP extension point is `src/constants.ts`.
82
+
83
+ To add a new MCP:
84
+
85
+ 1. Add one `McpDefinition` object to `MCP_REGISTRY`.
86
+ 2. Add the MCP id to `DEV_MCP_IDS` or `NON_DEV_MCP_IDS`.
87
+
88
+ All commands and prompts read dynamically from these constants.
89
+
90
+ ## Publishing
91
+
92
+ npm login
93
+ npm version patch
94
+ npm run build
95
+ npm publish --access public
96
+
97
+ ## License: MIT
@@ -0,0 +1,2 @@
1
+ export declare function runAdd(mcpId: string): Promise<void>;
2
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAUA,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFzD"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runAdd = runAdd;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const inquirer_1 = __importDefault(require("inquirer"));
9
+ const constants_1 = require("../constants");
10
+ const detector_1 = require("../core/detector");
11
+ const credentials_1 = require("../core/credentials");
12
+ const registry_1 = require("../core/registry");
13
+ const writer_1 = require("../core/writer");
14
+ const shared_prompts_1 = require("../prompts/shared-prompts");
15
+ const logger_1 = require("../utils/logger");
16
+ async function runAdd(mcpId) {
17
+ try {
18
+ const mcp = (0, registry_1.getMcpById)(mcpId);
19
+ if (!mcp) {
20
+ logger_1.log.error(`Unknown MCP: ${mcpId}`);
21
+ logger_1.log.info("Run `mcp-kit list --available` to see valid MCP IDs.");
22
+ process.exit(1);
23
+ }
24
+ const detected = await (0, detector_1.detectVsCodePath)();
25
+ const config = await (0, writer_1.readMcpJson)(detected.mcpJsonPath);
26
+ if (config.servers[mcpId]) {
27
+ logger_1.log.warn(`MCP ${mcpId} is already configured. Reconfiguring...`);
28
+ }
29
+ const storage = await (0, shared_prompts_1.askCredentialStorage)();
30
+ const answers = {};
31
+ for (const envVar of mcp.envVars) {
32
+ const response = await inquirer_1.default.prompt([
33
+ {
34
+ type: envVar.secret ? "password" : "input",
35
+ name: "value",
36
+ message: `${envVar.label}${envVar.required ? " *" : " (optional)"}`,
37
+ mask: envVar.secret ? "*" : undefined,
38
+ validate: (input) => !envVar.required || input.length > 0 || "This field is required"
39
+ }
40
+ ]);
41
+ answers[envVar.key] = response.value;
42
+ if (envVar.secret && response.value) {
43
+ await (0, credentials_1.storeCredential)(envVar.key, response.value, storage);
44
+ }
45
+ }
46
+ const args = mcp.id === "filesystem" && answers.FILESYSTEM_ALLOWED_PATH
47
+ ? [...mcp.args, answers.FILESYSTEM_ALLOWED_PATH]
48
+ : [...mcp.args];
49
+ const env = {};
50
+ for (const envVar of mcp.envVars) {
51
+ const value = answers[envVar.key];
52
+ if (!value && !envVar.required) {
53
+ continue;
54
+ }
55
+ env[envVar.key] = (0, credentials_1.buildEnvRefValue)(envVar.key, storage, value);
56
+ }
57
+ await (0, writer_1.addServerToMcpJson)(detected.mcpJsonPath, mcp.id, {
58
+ command: mcp.command,
59
+ args,
60
+ env
61
+ });
62
+ const meta = (await fs_extra_1.default.pathExists(constants_1.MCP_KIT_META_PATH))
63
+ ? await fs_extra_1.default.readJSON(constants_1.MCP_KIT_META_PATH)
64
+ : {
65
+ installedAt: new Date().toISOString(),
66
+ mcpKitVersion: require("../../package.json").version,
67
+ installedMcps: []
68
+ };
69
+ meta.lastUpdated = new Date().toISOString();
70
+ meta.credentialStorage = storage;
71
+ meta.vscodePath = detected.vscodeFolderPath;
72
+ meta.installedMcps = Array.from(new Set([...(meta.installedMcps || []), mcp.id]));
73
+ await fs_extra_1.default.mkdirp(require("node:path").dirname(constants_1.MCP_KIT_META_PATH));
74
+ await fs_extra_1.default.writeJSON(constants_1.MCP_KIT_META_PATH, meta, { spaces: 2 });
75
+ logger_1.log.success(`Added ${mcp.name} to ${detected.mcpJsonPath}`);
76
+ logger_1.log.info("Reload VS Code to activate");
77
+ process.exit(0);
78
+ }
79
+ catch (err) {
80
+ const message = err instanceof Error ? err.message : "Unknown error";
81
+ logger_1.log.error(`Add failed: ${message}`);
82
+ logger_1.log.muted("Suggestion: run `mcp-kit doctor` after fixing input values.");
83
+ if (process.env.DEBUG && err instanceof Error) {
84
+ console.error(err.stack);
85
+ }
86
+ process.exit(1);
87
+ }
88
+ }
89
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface BackupOptions {
2
+ output?: string;
3
+ }
4
+ export declare function runBackup(options?: BackupOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1E"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runBackup = runBackup;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const detector_1 = require("../core/detector");
10
+ const logger_1 = require("../utils/logger");
11
+ async function runBackup(options = {}) {
12
+ try {
13
+ const detected = await (0, detector_1.detectVsCodePath)();
14
+ if (!(await fs_extra_1.default.pathExists(detected.mcpJsonPath))) {
15
+ logger_1.log.warn("No mcp.json file found to backup.");
16
+ process.exit(0);
17
+ }
18
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
19
+ const backupPath = options.output
20
+ ? node_path_1.default.resolve(options.output)
21
+ : node_path_1.default.join(node_path_1.default.dirname(detected.mcpJsonPath), `mcp-backup-${stamp}.json`);
22
+ await fs_extra_1.default.mkdirp(node_path_1.default.dirname(backupPath));
23
+ await fs_extra_1.default.copyFile(detected.mcpJsonPath, backupPath);
24
+ logger_1.log.success(`Backup created at ${backupPath}`);
25
+ process.exit(0);
26
+ }
27
+ catch (err) {
28
+ logger_1.log.error(`backup failed: ${err instanceof Error ? err.message : "Unknown error"}`);
29
+ if (process.env.DEBUG && err instanceof Error) {
30
+ console.error(err.stack);
31
+ }
32
+ process.exit(1);
33
+ }
34
+ }
35
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":";;;;;AASA,8BAwBC;AAjCD,wDAA0B;AAC1B,0DAA6B;AAC7B,+CAAoD;AACpD,4CAAsC;AAM/B,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,2BAAgB,GAAE,CAAC;QAC1C,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACjD,YAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;YAC/B,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,mBAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC;QAC9E,MAAM,kBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1C,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACpD,YAAG,CAAC,OAAO,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAG,CAAC,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACpF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runCompletion(shell?: string): Promise<void>;
2
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAyDA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BjE"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCompletion = runCompletion;
4
+ const logger_1 = require("../utils/logger");
5
+ const ZSH_COMPLETION = `
6
+ # mcp-kit zsh completion
7
+ # Add to ~/.zshrc: eval "$(mcp-kit completion zsh)"
8
+
9
+ mcp_kit_completions() {
10
+ local -a subcmds
11
+ subcmds=(
12
+ 'init:Initialise MCP configuration'
13
+ 'add:Add a single MCP server'
14
+ 'remove:Remove a configured MCP server'
15
+ 'update:Update MCP server versions'
16
+ 'status:Show status of configured MCPs'
17
+ 'doctor:Run diagnostics on MCPs'
18
+ 'list:List available MCPs'
19
+ 'reset:Remove all configured MCPs'
20
+ 'export:Export mcp.json to a file'
21
+ 'import:Import an mcp.json file'
22
+ 'install:Pre-install MCP packages'
23
+ 'env:Environment variable commands'
24
+ 'validate:Validate mcp.json schema'
25
+ 'enable:Enable a disabled MCP'
26
+ 'disable:Disable an MCP without removing it'
27
+ 'info:Show details for an MCP'
28
+ 'open:Open mcp.json in VS Code'
29
+ 'backup:Back up mcp.json'
30
+ 'search:Search available MCPs'
31
+ 'completion:Print shell completion script'
32
+ )
33
+ _describe 'command' subcmds
34
+ }
35
+
36
+ compdef mcp_kit_completions mcp-kit
37
+ `.trimStart();
38
+ const BASH_COMPLETION = `
39
+ # mcp-kit bash completion
40
+ # Add to ~/.bashrc: eval "$(mcp-kit completion bash)"
41
+
42
+ mcp_kit_completions() {
43
+ local MCP_IDS="azure confluence mssql playwright runbook filesystem git azuredevops postgres slack sonarqube context7 figma everything"
44
+ local SUBCMDS="init add remove update status doctor list reset export import install env validate enable disable info open backup search completion"
45
+ local cur prev
46
+ cur="\${COMP_WORDS[COMP_CWORD]}"
47
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
48
+ case "\${prev}" in
49
+ add|remove|enable|disable|info)
50
+ COMPREPLY=( $(compgen -W "\${MCP_IDS}" -- "\${cur}") )
51
+ return ;;
52
+ esac
53
+ COMPREPLY=( $(compgen -W "\${SUBCMDS}" -- "\${cur}") )
54
+ }
55
+
56
+ complete -F mcp_kit_completions mcp-kit
57
+ `.trimStart();
58
+ async function runCompletion(shell) {
59
+ try {
60
+ const s = shell?.toLowerCase() ?? "zsh";
61
+ if (s === "zsh") {
62
+ process.stdout.write(ZSH_COMPLETION);
63
+ return;
64
+ }
65
+ if (s === "bash") {
66
+ process.stdout.write(BASH_COMPLETION);
67
+ return;
68
+ }
69
+ logger_1.log.error(`Unsupported shell: '${shell}'. Use 'zsh' or 'bash'.`);
70
+ logger_1.log.blank();
71
+ logger_1.log.info("Usage:");
72
+ logger_1.log.muted(" mcp-kit completion zsh # zsh");
73
+ logger_1.log.muted(" mcp-kit completion bash # bash");
74
+ logger_1.log.blank();
75
+ logger_1.log.muted("Then add to your shell profile:");
76
+ logger_1.log.muted(' echo \'eval "$(mcp-kit completion zsh)"\' >> ~/.zshrc && source ~/.zshrc');
77
+ process.exit(1);
78
+ }
79
+ catch (err) {
80
+ logger_1.log.error(`completion failed: ${err instanceof Error ? err.message : "Unknown error"}`);
81
+ process.exit(1);
82
+ }
83
+ }
84
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":";;AAyDA,sCA2BC;AApFD,4CAAsC;AAEtC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCtB,CAAC,SAAS,EAAE,CAAC;AAEd,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;CAmBvB,CAAC,SAAS,EAAE,CAAC;AAEP,KAAK,UAAU,aAAa,CAAC,KAAc;IAChD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,KAAK,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;QAExC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,YAAG,CAAC,KAAK,CAAC,uBAAuB,KAAK,yBAAyB,CAAC,CAAC;QACjE,YAAG,CAAC,KAAK,EAAE,CAAC;QACZ,YAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnB,YAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC9C,YAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC/C,YAAG,CAAC,KAAK,EAAE,CAAC;QACZ,YAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC7C,YAAG,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAG,CAAC,KAAK,CAAC,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runDoctor(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAUA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAoJ/C"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runDoctor = runDoctor;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const constants_1 = require("../constants");
9
+ const credentials_1 = require("../core/credentials");
10
+ const detector_1 = require("../core/detector");
11
+ const registry_1 = require("../core/registry");
12
+ const writer_1 = require("../core/writer");
13
+ const validator_1 = require("../core/validator");
14
+ const logger_1 = require("../utils/logger");
15
+ async function runDoctor() {
16
+ try {
17
+ logger_1.log.header("🩺 Running diagnostics...");
18
+ const detected = await (0, detector_1.detectVsCodePath)();
19
+ if (!(await fs_extra_1.default.pathExists(detected.vscodeFolderPath))) {
20
+ logger_1.log.warn("No .vscode folder found");
21
+ }
22
+ let config;
23
+ try {
24
+ config = await (0, writer_1.readMcpJson)(detected.mcpJsonPath);
25
+ }
26
+ catch {
27
+ logger_1.log.error("mcp.json is missing or malformed");
28
+ process.exit(1);
29
+ return;
30
+ }
31
+ if (Object.keys(config.servers).length === 0) {
32
+ logger_1.log.error("mcp.json is missing or malformed");
33
+ process.exit(1);
34
+ }
35
+ const meta = (await fs_extra_1.default.pathExists(constants_1.MCP_KIT_META_PATH)) ? await fs_extra_1.default.readJSON(constants_1.MCP_KIT_META_PATH) : {};
36
+ const storage = (meta.credentialStorage || "keychain");
37
+ const results = await Promise.all(Object.keys(config.servers).map(async (id) => {
38
+ const mcp = (0, registry_1.getMcpById)(id);
39
+ const issues = [];
40
+ const suggestions = [];
41
+ let credentialsPresent = true;
42
+ let packageInstallable = true;
43
+ let networkReachable;
44
+ if (!mcp) {
45
+ issues.push("MCP not found in registry");
46
+ suggestions.push("Run `mcp-kit list --available` and re-add this MCP");
47
+ return {
48
+ mcpId: id,
49
+ mcpName: id,
50
+ configured: true,
51
+ credentialsPresent: false,
52
+ packageInstallable: false,
53
+ issues,
54
+ suggestions,
55
+ status: "error"
56
+ };
57
+ }
58
+ for (const envVar of mcp.envVars.filter((envItem) => envItem.secret)) {
59
+ const value = await (0, credentials_1.getCredential)(envVar.key, storage);
60
+ if (!value) {
61
+ credentialsPresent = false;
62
+ issues.push(`Missing credential: ${envVar.label}`);
63
+ suggestions.push(`Run \`mcp-kit add ${id}\` to reconfigure`);
64
+ }
65
+ }
66
+ if (mcp.requiresNetwork && mcp.healthCheckUrl) {
67
+ networkReachable = await (0, validator_1.checkNetworkReachability)(mcp.healthCheckUrl);
68
+ if (!networkReachable) {
69
+ issues.push(`Cannot reach ${mcp.healthCheckUrl}`);
70
+ suggestions.push("Check your VPN / firewall settings");
71
+ }
72
+ }
73
+ packageInstallable = await (0, validator_1.checkNpmPackageExists)(mcp.npmPackage);
74
+ if (!packageInstallable) {
75
+ issues.push(`Package ${mcp.npmPackage} not found on npm registry`);
76
+ suggestions.push("Check npm registry or use offline cache");
77
+ }
78
+ try {
79
+ await fs_extra_1.default.access(detected.mcpJsonPath, fs_extra_1.default.constants.W_OK);
80
+ }
81
+ catch {
82
+ issues.push("mcp.json is not writable");
83
+ suggestions.push(`Check file permissions: chmod 644 ${detected.mcpJsonPath}`);
84
+ }
85
+ const configured = config.servers[id];
86
+ if (configured.command !== mcp.command || !configured.args.some((arg) => arg.includes(mcp.npmPackage))) {
87
+ issues.push("Args may be stale — run `mcp-kit update`");
88
+ suggestions.push("Run `mcp-kit update` to refresh command arguments");
89
+ }
90
+ const status = issues.length === 0
91
+ ? "healthy"
92
+ : issues.some((issue) => issue.startsWith("Missing credential") || issue.includes("not writable") || issue.includes("not found"))
93
+ ? "error"
94
+ : "warning";
95
+ return {
96
+ mcpId: id,
97
+ mcpName: mcp.name,
98
+ configured: true,
99
+ credentialsPresent,
100
+ networkReachable,
101
+ packageInstallable,
102
+ issues,
103
+ suggestions,
104
+ status
105
+ };
106
+ }));
107
+ let healthy = 0;
108
+ let warnings = 0;
109
+ let errors = 0;
110
+ for (const result of results) {
111
+ if (result.status === "healthy") {
112
+ healthy += 1;
113
+ console.log(`✅ ${result.mcpName} — Healthy`);
114
+ }
115
+ else if (result.status === "warning") {
116
+ warnings += 1;
117
+ console.log(`⚠️ ${result.mcpName} — Warning: ${result.issues[0]}`);
118
+ }
119
+ else {
120
+ errors += 1;
121
+ console.log(`❌ ${result.mcpName} — Error: ${result.issues[0]}`);
122
+ }
123
+ if (result.suggestions[0]) {
124
+ console.log(`Fix: ${result.suggestions[0]}`);
125
+ }
126
+ }
127
+ console.log("\nSummary:");
128
+ console.log(`Healthy: ${healthy}`);
129
+ console.log(`Warnings: ${warnings}`);
130
+ console.log(`Errors: ${errors}`);
131
+ if (errors > 0) {
132
+ logger_1.log.info("Run `mcp-kit add <id>` to fix individual MCPs");
133
+ logger_1.log.info("Run `mcp-kit reset` to start fresh");
134
+ process.exit(1);
135
+ }
136
+ process.exit(0);
137
+ }
138
+ catch (err) {
139
+ const message = err instanceof Error ? err.message : "Unknown error";
140
+ logger_1.log.error(`Doctor failed: ${message}`);
141
+ logger_1.log.muted("Suggestion: validate your network and local file permissions.");
142
+ if (process.env.DEBUG && err instanceof Error) {
143
+ console.error(err.stack);
144
+ }
145
+ process.exit(1);
146
+ }
147
+ }
148
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface EnvCheckOptions {
2
+ json?: boolean;
3
+ }
4
+ export declare function runEnvCheck(options?: EnvCheckOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=env-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-check.d.ts","sourceRoot":"","sources":["../../src/commands/env-check.ts"],"names":[],"mappings":"AAOA,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C9E"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runEnvCheck = runEnvCheck;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const constants_1 = require("../constants");
10
+ const detector_1 = require("../core/detector");
11
+ const writer_1 = require("../core/writer");
12
+ const logger_1 = require("../utils/logger");
13
+ async function runEnvCheck(options = {}) {
14
+ try {
15
+ const detected = await (0, detector_1.detectVsCodePath)();
16
+ const config = await (0, writer_1.readMcpJson)(detected.mcpJsonPath);
17
+ const envPath = node_path_1.default.join(process.cwd(), ".env");
18
+ const envContent = (await fs_extra_1.default.pathExists(envPath)) ? await fs_extra_1.default.readFile(envPath, "utf8") : "";
19
+ const rows = [];
20
+ for (const [id, server] of Object.entries(config.servers)) {
21
+ const mcp = constants_1.MCP_REGISTRY.find((item) => item.id === id);
22
+ if (!mcp) {
23
+ continue;
24
+ }
25
+ for (const envVar of mcp.envVars) {
26
+ const configured = server.env?.[envVar.key] || "";
27
+ const isRef = configured.startsWith("${env:");
28
+ const hasEnv = envContent.includes(`${envVar.key}=`);
29
+ const status = configured.length === 0
30
+ ? (envVar.required ? "Missing" : "Optional")
31
+ : isRef
32
+ ? (hasEnv ? "OK (.env)" : "Ref missing")
33
+ : "Inline";
34
+ rows.push([id, envVar.key, envVar.required ? "Yes" : "No", status]);
35
+ }
36
+ }
37
+ if (options.json) {
38
+ console.log(JSON.stringify(rows, null, 2));
39
+ return;
40
+ }
41
+ (0, logger_1.printTable)(["MCP", "Env Key", "Required", "Status"], rows);
42
+ process.exit(0);
43
+ }
44
+ catch (err) {
45
+ logger_1.log.error(`env-check failed: ${err instanceof Error ? err.message : "Unknown error"}`);
46
+ logger_1.log.muted("Suggestion: run `mcp-kit init --dev` to repair env mappings.");
47
+ if (process.env.DEBUG && err instanceof Error) {
48
+ console.error(err.stack);
49
+ }
50
+ process.exit(1);
51
+ }
52
+ }
53
+ //# sourceMappingURL=env-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../src/commands/env-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function runExport(options: {
2
+ output: string;
3
+ redact: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD3F"}