@global-packages/mcp-kit 1.0.0 → 1.0.3
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/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +117 -71
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +27 -27
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +50 -35
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +128 -104
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/env-check.d.ts.map +1 -1
- package/dist/commands/env-check.js +63 -40
- package/dist/commands/env-check.js.map +1 -1
- package/dist/commands/export.d.ts +6 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +52 -41
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +109 -74
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +60 -56
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts +5 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +189 -87
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +56 -48
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +5 -2
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +103 -45
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +31 -23
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +60 -43
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +52 -48
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +52 -20
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +94 -76
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/toggle.d.ts.map +1 -1
- package/dist/commands/toggle.js +22 -24
- package/dist/commands/toggle.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +86 -62
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +43 -37
- package/dist/commands/validate.js.map +1 -1
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +377 -78
- package/dist/constants.js.map +1 -1
- package/dist/core/credentials.d.ts +15 -2
- package/dist/core/credentials.d.ts.map +1 -1
- package/dist/core/credentials.js +205 -116
- package/dist/core/credentials.js.map +1 -1
- package/dist/core/detector.d.ts +28 -2
- package/dist/core/detector.d.ts.map +1 -1
- package/dist/core/detector.js +101 -60
- package/dist/core/detector.js.map +1 -1
- package/dist/core/registry.d.ts +25 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +45 -33
- package/dist/core/registry.js.map +1 -1
- package/dist/core/validator.d.ts +18 -2
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +53 -30
- package/dist/core/validator.js.map +1 -1
- package/dist/core/writer.d.ts +19 -1
- package/dist/core/writer.d.ts.map +1 -1
- package/dist/core/writer.js +41 -35
- package/dist/core/writer.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +233 -123
- package/dist/index.js.map +1 -1
- package/dist/postinstall.js +25 -30
- package/dist/postinstall.js.map +1 -1
- package/dist/prompts/dev-prompts.d.ts +10 -2
- package/dist/prompts/dev-prompts.d.ts.map +1 -1
- package/dist/prompts/dev-prompts.js +87 -31
- package/dist/prompts/dev-prompts.js.map +1 -1
- package/dist/prompts/non-dev-prompts.d.ts +16 -2
- package/dist/prompts/non-dev-prompts.d.ts.map +1 -1
- package/dist/prompts/non-dev-prompts.js +90 -35
- package/dist/prompts/non-dev-prompts.js.map +1 -1
- package/dist/prompts/shared-prompts.d.ts +10 -1
- package/dist/prompts/shared-prompts.d.ts.map +1 -1
- package/dist/prompts/shared-prompts.js +66 -43
- package/dist/prompts/shared-prompts.js.map +1 -1
- package/dist/types.d.ts +22 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/fs.d.ts +36 -4
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +92 -28
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +18 -24
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/network.d.ts +12 -1
- package/dist/utils/network.d.ts.map +1 -1
- package/dist/utils/network.js +37 -9
- package/dist/utils/network.js.map +1 -1
- package/dist/utils/spinner.js +10 -19
- package/dist/utils/spinner.js.map +1 -1
- package/package.json +58 -16
- package/src/postinstall.ts +121 -0
package/dist/commands/doctor.js
CHANGED
|
@@ -1,147 +1,171 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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() {
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
3
|
+
import { readMcpJson } from '../core/writer.js';
|
|
4
|
+
import { getMcpById } from '../core/registry.js';
|
|
5
|
+
import { getCredential, getEnvFilePath } from '../core/credentials.js';
|
|
6
|
+
import { checkNetworkReachability, checkNpmPackageExists } from '../core/validator.js';
|
|
7
|
+
import { log } from '../utils/logger.js';
|
|
8
|
+
import { safeReadJSON } from '../utils/fs.js';
|
|
9
|
+
import { MCP_KIT_META_PATH } from '../constants.js';
|
|
10
|
+
export async function runDoctor(options = {}) {
|
|
16
11
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
if (!options.json)
|
|
13
|
+
log.header('mcp-kit - Diagnostics');
|
|
14
|
+
const vscodePaths = await detectVsCodePath();
|
|
15
|
+
if (vscodePaths.source === 'created') {
|
|
16
|
+
log.warn('No .vscode folder found - created a new one at: ' + vscodePaths.vscodeFolderPath);
|
|
21
17
|
}
|
|
22
18
|
let config;
|
|
23
19
|
try {
|
|
24
|
-
config = await
|
|
20
|
+
config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
25
21
|
}
|
|
26
|
-
catch {
|
|
27
|
-
|
|
22
|
+
catch (err) {
|
|
23
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
24
|
+
log.error('mcp.json is missing or malformed: ' + message);
|
|
25
|
+
log.step('Run "mcp-kit init dev" or "mcp-kit init non-dev" to create it.');
|
|
28
26
|
process.exit(1);
|
|
29
|
-
return;
|
|
30
27
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
const serverIds = Object.keys(config.servers);
|
|
29
|
+
if (serverIds.length === 0) {
|
|
30
|
+
log.warn('mcp.json exists but has no configured servers.');
|
|
31
|
+
log.info('Run "mcp-kit init" to configure MCPs.');
|
|
32
|
+
return;
|
|
34
33
|
}
|
|
35
|
-
const meta =
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
34
|
+
const meta = await safeReadJSON(MCP_KIT_META_PATH);
|
|
35
|
+
const credStorage = meta?.credentialStorage ?? 'keychain';
|
|
36
|
+
const envFilePath = getEnvFilePath(vscodePaths.vscodeFolderPath);
|
|
37
|
+
log.step(`Checking ${serverIds.length} configured MCP(s) in parallel...\n`);
|
|
38
|
+
// Run all checks in parallel
|
|
39
|
+
const doctorResults = await Promise.all(serverIds.map(async (id) => {
|
|
40
|
+
const def = getMcpById(id);
|
|
41
|
+
const entry = config.servers[id];
|
|
39
42
|
const issues = [];
|
|
40
43
|
const suggestions = [];
|
|
44
|
+
// Check 1 - Credentials
|
|
41
45
|
let credentialsPresent = true;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
46
|
+
if (def) {
|
|
47
|
+
for (const envVar of def.envVars) {
|
|
48
|
+
if (!envVar.secret)
|
|
49
|
+
continue;
|
|
50
|
+
// Check if it's embedded in args (inline)
|
|
51
|
+
const inArgs = def.args.some(a => a.includes(`\${${envVar.key}}`));
|
|
52
|
+
if (inArgs)
|
|
53
|
+
continue;
|
|
54
|
+
let found = false;
|
|
55
|
+
if (credStorage === 'keychain' || credStorage === 'dotenv') {
|
|
56
|
+
const val = await getCredential(envVar.key, credStorage, envFilePath);
|
|
57
|
+
found = !!val;
|
|
58
|
+
}
|
|
59
|
+
else if (credStorage === 'inline') {
|
|
60
|
+
const envVal = entry?.env?.[envVar.key];
|
|
61
|
+
found = !!envVal && envVal !== '' && !envVal.startsWith('$(env:');
|
|
62
|
+
}
|
|
63
|
+
if (!found && envVar.required) {
|
|
64
|
+
credentialsPresent = false;
|
|
65
|
+
issues.push(`Missing credential: ${envVar.label} (${envVar.key})`);
|
|
66
|
+
suggestions.push(`Run "mcp-kit add ${id}" to reconfigure credentials`);
|
|
67
|
+
}
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
// Check 2 - Network reachability
|
|
71
|
+
let networkReachable;
|
|
72
|
+
if (def?.requiresNetwork && def.healthCheckUrl) {
|
|
73
|
+
networkReachable = await checkNetworkReachability(def.healthCheckUrl);
|
|
68
74
|
if (!networkReachable) {
|
|
69
|
-
issues.push(`Cannot reach ${
|
|
70
|
-
suggestions.push(
|
|
75
|
+
issues.push(`Cannot reach ${def.healthCheckUrl}`);
|
|
76
|
+
suggestions.push('Check your VPN / firewall settings and network connection');
|
|
71
77
|
}
|
|
72
78
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
// Check 3 - npm package installable
|
|
80
|
+
let packageInstallable = true;
|
|
81
|
+
if (def?.npmPackage) {
|
|
82
|
+
packageInstallable = await checkNpmPackageExists(def.npmPackage);
|
|
83
|
+
if (!packageInstallable) {
|
|
84
|
+
issues.push(`Package ${def.npmPackage} not found on npm registry`);
|
|
85
|
+
suggestions.push('Check npm registry availability or use offline cache via "mcp-kit install"');
|
|
86
|
+
}
|
|
77
87
|
}
|
|
88
|
+
// Check 4 - mcp.json writable
|
|
78
89
|
try {
|
|
79
|
-
await
|
|
90
|
+
await fs.access(vscodePaths.mcpJsonPath, fs.constants.W_OK);
|
|
80
91
|
}
|
|
81
92
|
catch {
|
|
82
|
-
issues.push(
|
|
83
|
-
suggestions.push(`
|
|
93
|
+
issues.push(`mcp.json is not writable: ${vscodePaths.mcpJsonPath}`);
|
|
94
|
+
suggestions.push(`Fix file permissions: chmod 644 ${vscodePaths.mcpJsonPath}`);
|
|
84
95
|
}
|
|
85
|
-
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
|
|
96
|
+
// Check 5 - Args validity
|
|
97
|
+
if (def && entry) {
|
|
98
|
+
const firstPackageArg = entry.args.find(a => a.startsWith('@') || (a.includes('/') && !a.startsWith('-')));
|
|
99
|
+
if (firstPackageArg && !firstPackageArg.includes('@latest')) {
|
|
100
|
+
issues.push('Command args may be stale or mismatched');
|
|
101
|
+
suggestions.push('Run "mcp-kit update" to refresh to @latest');
|
|
102
|
+
}
|
|
89
103
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
104
|
+
// Determine overall status
|
|
105
|
+
const hasErrors = issues.some(i => i.includes('Missing credential') ||
|
|
106
|
+
i.includes('not found on npm') ||
|
|
107
|
+
i.includes('not writable'));
|
|
108
|
+
const status = issues.length === 0 ? 'healthy' : hasErrors ? 'error' : 'warning';
|
|
95
109
|
return {
|
|
96
110
|
mcpId: id,
|
|
97
|
-
mcpName:
|
|
98
|
-
configured:
|
|
111
|
+
mcpName: def?.name ?? id,
|
|
112
|
+
configured: !!entry,
|
|
99
113
|
credentialsPresent,
|
|
100
114
|
networkReachable,
|
|
101
115
|
packageInstallable,
|
|
102
116
|
issues,
|
|
103
117
|
suggestions,
|
|
104
|
-
status
|
|
118
|
+
status,
|
|
105
119
|
};
|
|
106
120
|
}));
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
let
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
121
|
+
// Print results
|
|
122
|
+
log.blank();
|
|
123
|
+
let healthyCount = 0;
|
|
124
|
+
let warningCount = 0;
|
|
125
|
+
let errorCount = 0;
|
|
126
|
+
if (options.json) {
|
|
127
|
+
console.log(JSON.stringify(doctorResults, null, 2));
|
|
128
|
+
const hasErrors = doctorResults.some(r => r.status === 'error');
|
|
129
|
+
if (hasErrors)
|
|
130
|
+
process.exit(1);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const result of doctorResults) {
|
|
134
|
+
if (result.status === 'healthy') {
|
|
135
|
+
log.success(`${result.mcpName} - Healthy`);
|
|
136
|
+
healthyCount++;
|
|
114
137
|
}
|
|
115
|
-
else if (result.status ===
|
|
116
|
-
|
|
117
|
-
|
|
138
|
+
else if (result.status === 'warning') {
|
|
139
|
+
log.warn(`${result.mcpName} - Warning`);
|
|
140
|
+
result.issues.forEach(issue => log.muted(` • ${issue}`));
|
|
141
|
+
result.suggestions.forEach(sug => log.muted(` → ${sug}`));
|
|
142
|
+
warningCount++;
|
|
118
143
|
}
|
|
119
144
|
else {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
console.log(`Fix: ${result.suggestions[0]}`);
|
|
145
|
+
log.error(`${result.mcpName} - Error`);
|
|
146
|
+
result.issues.forEach(issue => log.muted(` • ${issue}`));
|
|
147
|
+
result.suggestions.forEach(sug => log.muted(` → ${sug}`));
|
|
148
|
+
errorCount++;
|
|
125
149
|
}
|
|
126
150
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
151
|
+
// Summary
|
|
152
|
+
log.blank();
|
|
153
|
+
log.info(`Summary - Healthy: ${healthyCount} Warnings: ${warningCount} Errors: ${errorCount}`);
|
|
154
|
+
if (errorCount > 0 || warningCount > 0) {
|
|
155
|
+
log.blank();
|
|
156
|
+
log.step('Run "mcp-kit add <id>" to fix individual MCPs');
|
|
157
|
+
log.step('Run "mcp-kit reset" to start fresh');
|
|
158
|
+
}
|
|
159
|
+
// Exit 1 if any errors
|
|
160
|
+
if (errorCount > 0) {
|
|
134
161
|
process.exit(1);
|
|
135
162
|
}
|
|
136
|
-
process.exit(0);
|
|
137
163
|
}
|
|
138
164
|
catch (err) {
|
|
139
|
-
const message = err instanceof Error ? err.message :
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
console.error(err.stack);
|
|
144
|
-
}
|
|
165
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
166
|
+
log.error(`Doctor check failed: ${message}`);
|
|
167
|
+
if (process.env['DEBUG'])
|
|
168
|
+
console.error(err);
|
|
145
169
|
process.exit(1);
|
|
146
170
|
}
|
|
147
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-check.d.ts","sourceRoot":"","sources":["../../src/commands/env-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-check.d.ts","sourceRoot":"","sources":["../../src/commands/env-check.ts"],"names":[],"mappings":"AAWA,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAUD,wBAAsB,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E9E"}
|
|
@@ -1,52 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 = {}) {
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
3
|
+
import { readMcpJson } from '../core/writer.js';
|
|
4
|
+
import { getMcpById } from '../core/registry.js';
|
|
5
|
+
import { isEnvVarSet, printEnvProfileInstructions } from '../core/credentials.js';
|
|
6
|
+
import { log, printTable } from '../utils/logger.js';
|
|
7
|
+
export async function runEnvCheck(options = {}) {
|
|
14
8
|
try {
|
|
15
|
-
const
|
|
16
|
-
const config = await
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
9
|
+
const vscodePaths = await detectVsCodePath();
|
|
10
|
+
const config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
11
|
+
const serverIds = Object.keys(config.servers);
|
|
12
|
+
if (serverIds.length === 0) {
|
|
13
|
+
log.warn('No MCP servers configured. Run "mcp-kit init dev" first.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const results = [];
|
|
17
|
+
for (const id of serverIds) {
|
|
18
|
+
const def = getMcpById(id);
|
|
19
|
+
if (!def || def.envVars.length === 0)
|
|
23
20
|
continue;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
? (hasEnv ? "OK (.env)" : "Ref missing")
|
|
33
|
-
: "Inline";
|
|
34
|
-
rows.push([id, envVar.key, envVar.required ? "Yes" : "No", status]);
|
|
21
|
+
for (const envVar of def.envVars) {
|
|
22
|
+
results.push({
|
|
23
|
+
mcp: id,
|
|
24
|
+
key: envVar.key,
|
|
25
|
+
required: envVar.required,
|
|
26
|
+
set: isEnvVarSet(envVar.key),
|
|
27
|
+
secret: envVar.secret,
|
|
28
|
+
});
|
|
35
29
|
}
|
|
36
30
|
}
|
|
37
31
|
if (options.json) {
|
|
38
|
-
console.log(JSON.stringify(
|
|
32
|
+
console.log(JSON.stringify(results, null, 2));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (results.length === 0) {
|
|
36
|
+
log.success('All configured MCPs require no environment variables.');
|
|
39
37
|
return;
|
|
40
38
|
}
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
log.header('Environment Variable Check');
|
|
40
|
+
const missing = results.filter(r => !r.set && r.required);
|
|
41
|
+
const optional = results.filter(r => !r.set && !r.required);
|
|
42
|
+
const present = results.filter(r => r.set);
|
|
43
|
+
const rows = results.map(r => [
|
|
44
|
+
r.mcp,
|
|
45
|
+
r.key,
|
|
46
|
+
r.required ? chalk.red('required') : chalk.gray('optional'),
|
|
47
|
+
r.set
|
|
48
|
+
? chalk.green('✅ set')
|
|
49
|
+
: r.required
|
|
50
|
+
? chalk.red('❌ missing')
|
|
51
|
+
: chalk.yellow('⚠ not set'),
|
|
52
|
+
]);
|
|
53
|
+
printTable(['MCP', 'Variable', 'Required', 'Status'], rows);
|
|
54
|
+
log.blank();
|
|
55
|
+
log.muted(`${present.length} set ${optional.length} optional not set`);
|
|
56
|
+
if (missing.length > 0) {
|
|
57
|
+
log.blank();
|
|
58
|
+
log.warn(`${missing.length} required variable(s) are not set:\n`);
|
|
59
|
+
for (const r of missing) {
|
|
60
|
+
printEnvProfileInstructions(r.key);
|
|
61
|
+
}
|
|
62
|
+
log.blank();
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
log.blank();
|
|
66
|
+
log.success('All required environment variables are set.');
|
|
43
67
|
}
|
|
44
68
|
catch (err) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (process.env
|
|
48
|
-
console.error(err
|
|
49
|
-
}
|
|
69
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
70
|
+
log.error(`env check failed: ${message}`);
|
|
71
|
+
if (process.env['DEBUG'])
|
|
72
|
+
console.error(err);
|
|
50
73
|
process.exit(1);
|
|
51
74
|
}
|
|
52
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../src/commands/env-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../src/commands/env-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
output
|
|
3
|
-
redact
|
|
4
|
-
}
|
|
1
|
+
interface ExportOptions {
|
|
2
|
+
output?: string;
|
|
3
|
+
redact?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function runExport(options: ExportOptions): Promise<void>;
|
|
6
|
+
export {};
|
|
5
7
|
//# sourceMappingURL=export.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAgBA,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrE"}
|
package/dist/commands/export.js
CHANGED
|
@@ -1,54 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const logger_1 = require("../utils/logger");
|
|
12
|
-
async function runExport(options) {
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
3
|
+
import { readMcpJson } from '../core/writer.js';
|
|
4
|
+
import { log } from '../utils/logger.js';
|
|
5
|
+
import { safeReadJSON, safeWriteJSON } from '../utils/fs.js';
|
|
6
|
+
import { MCP_KIT_META_PATH } from '../constants.js';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
const _require = createRequire(import.meta.url);
|
|
9
|
+
const pkg = _require('../../package.json');
|
|
10
|
+
export async function runExport(options) {
|
|
13
11
|
try {
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
12
|
+
const outputFile = options.output ?? 'mcp-kit-export.json';
|
|
13
|
+
const shouldRedact = options.redact !== false; // default true
|
|
14
|
+
const vscodePaths = await detectVsCodePath();
|
|
15
|
+
const config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
16
|
+
const meta = await safeReadJSON(MCP_KIT_META_PATH);
|
|
17
|
+
if (Object.keys(config.servers).length === 0) {
|
|
18
|
+
log.warn('No MCP servers configured. Nothing to export.');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Build sanitised server entries
|
|
22
|
+
const servers = {};
|
|
23
|
+
for (const [id, entry] of Object.entries(config.servers)) {
|
|
24
|
+
if (shouldRedact) {
|
|
25
|
+
const redactedEnv = {};
|
|
26
|
+
for (const [k, v] of Object.entries(entry.env ?? {})) {
|
|
27
|
+
// Redact if value looks like a real secret (not a ${env:KEY} ref)
|
|
28
|
+
redactedEnv[k] = v.startsWith('${env:') ? v : 'REDACTED';
|
|
26
29
|
}
|
|
30
|
+
servers[id] = {
|
|
31
|
+
...entry,
|
|
32
|
+
env: Object.keys(redactedEnv).length ? redactedEnv : undefined,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
servers[id] = { ...entry };
|
|
27
37
|
}
|
|
28
38
|
}
|
|
29
|
-
const
|
|
39
|
+
const exportData = {
|
|
30
40
|
exportedAt: new Date().toISOString(),
|
|
31
|
-
mcpKitVersion:
|
|
32
|
-
profileMode: meta
|
|
41
|
+
mcpKitVersion: pkg.version,
|
|
42
|
+
profileMode: meta?.profileMode ?? 'dev',
|
|
33
43
|
servers,
|
|
34
|
-
mcpIds: Object.keys(
|
|
35
|
-
instructions:
|
|
44
|
+
mcpIds: Object.keys(servers),
|
|
45
|
+
instructions: 'Run "mcp-kit import <this-file>" to apply this configuration',
|
|
36
46
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
const outputPath = path.resolve(outputFile);
|
|
48
|
+
await safeWriteJSON(outputPath, exportData);
|
|
49
|
+
log.blank();
|
|
50
|
+
log.success(`Exported to: ${outputPath}`);
|
|
51
|
+
log.info('Share this file with teammates who need the same MCP setup.');
|
|
52
|
+
log.info(`They can apply it with: mcp-kit import ${path.basename(outputPath)}`);
|
|
53
|
+
if (!shouldRedact) {
|
|
54
|
+
log.blank();
|
|
55
|
+
log.warn('⚠ This export contains real credential values - do NOT commit to source control!');
|
|
42
56
|
}
|
|
43
|
-
process.exit(0);
|
|
44
57
|
}
|
|
45
58
|
catch (err) {
|
|
46
|
-
const message = err instanceof Error ? err.message :
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
console.error(err.stack);
|
|
51
|
-
}
|
|
59
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
60
|
+
log.error(`Export failed: ${message}`);
|
|
61
|
+
if (process.env['DEBUG'])
|
|
62
|
+
console.error(err);
|
|
52
63
|
process.exit(1);
|
|
53
64
|
}
|
|
54
65
|
}
|