@global-packages/mcp-kit 1.0.1 → 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 +62 -27
- package/src/postinstall.ts +121 -0
package/dist/commands/search.js
CHANGED
|
@@ -1,32 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
async function runSearch(query, options = {}) {
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
3
|
+
import { readMcpJson } from '../core/writer.js';
|
|
4
|
+
import { log, printTable } from '../utils/logger.js';
|
|
5
|
+
import { MCP_REGISTRY } from '../constants.js';
|
|
6
|
+
export async function runSearch(query, options = {}) {
|
|
7
7
|
try {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
logger_1.log.error("Please provide a search query.");
|
|
8
|
+
if (!query || query.trim().length === 0) {
|
|
9
|
+
log.error('Please provide a search query: mcp-kit search <query>');
|
|
11
10
|
process.exit(1);
|
|
12
11
|
}
|
|
13
|
-
const
|
|
12
|
+
const q = query.toLowerCase();
|
|
13
|
+
const matches = MCP_REGISTRY.filter(m => m.id.toLowerCase().includes(q) ||
|
|
14
|
+
m.name.toLowerCase().includes(q) ||
|
|
15
|
+
m.description.toLowerCase().includes(q) ||
|
|
16
|
+
m.category.toLowerCase().includes(q) ||
|
|
17
|
+
m.npmPackage.toLowerCase().includes(q) ||
|
|
18
|
+
m.envVars.some(ev => ev.key.toLowerCase().includes(q) ||
|
|
19
|
+
ev.label.toLowerCase().includes(q)));
|
|
20
|
+
// Check which are currently configured
|
|
21
|
+
let configuredIds = [];
|
|
22
|
+
try {
|
|
23
|
+
const vscodePaths = await detectVsCodePath();
|
|
24
|
+
const config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
25
|
+
configuredIds = Object.keys(config.servers);
|
|
26
|
+
}
|
|
27
|
+
catch { /* no config yet */ }
|
|
14
28
|
if (options.json) {
|
|
15
|
-
console.log(JSON.stringify(
|
|
29
|
+
console.log(JSON.stringify(matches.map(m => ({
|
|
30
|
+
id: m.id,
|
|
31
|
+
name: m.name,
|
|
32
|
+
description: m.description,
|
|
33
|
+
category: m.category,
|
|
34
|
+
npmPackage: m.npmPackage,
|
|
35
|
+
devOnly: m.devOnly,
|
|
36
|
+
configured: configuredIds.includes(m.id),
|
|
37
|
+
})), null, 2));
|
|
16
38
|
return;
|
|
17
39
|
}
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
|
|
40
|
+
if (matches.length === 0) {
|
|
41
|
+
log.warn(`No MCPs found matching "${query}".`);
|
|
42
|
+
log.info('Run "mcp-kit list --available" to see all MCPs.');
|
|
43
|
+
return;
|
|
21
44
|
}
|
|
22
|
-
|
|
23
|
-
|
|
45
|
+
log.header(`Search results for "${query}" (${matches.length} match${matches.length === 1 ? '' : 'es'})`);
|
|
46
|
+
const rows = matches.map(m => [
|
|
47
|
+
chalk.cyan(m.id),
|
|
48
|
+
m.name,
|
|
49
|
+
m.category,
|
|
50
|
+
configuredIds.includes(m.id) ? chalk.green('✓') : chalk.gray('-'),
|
|
51
|
+
m.description,
|
|
52
|
+
]);
|
|
53
|
+
printTable(['ID', 'Name', 'Category', 'Configured', 'Description'], rows);
|
|
54
|
+
log.blank();
|
|
55
|
+
log.info('Add one: "mcp-kit add <id>" | Details: "mcp-kit info <id>"');
|
|
24
56
|
}
|
|
25
57
|
catch (err) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
58
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
59
|
+
log.error(`search failed: ${message}`);
|
|
60
|
+
if (process.env['DEBUG'])
|
|
61
|
+
console.error(err);
|
|
30
62
|
process.exit(1);
|
|
31
63
|
}
|
|
32
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAyB,EAAE;IACxE,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACtC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAClB,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnC,CACF,CAAC;QAEF,uCAAuC;QACvC,IAAI,aAAa,GAAa,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,gBAAgB,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC1D,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;QAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;aACzC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,2BAA2B,KAAK,IAAI,CAAC,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,uBAAuB,KAAK,MAAM,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAEzG,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,QAAQ;YACV,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YACjE,CAAC,CAAC,WAAW;SACd,CAAC,CAAC;QAEH,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1E,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAEzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,GAAG,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAaA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwH1E"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,91 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const detector_1 = require("../core/detector");
|
|
10
|
-
const registry_1 = require("../core/registry");
|
|
11
|
-
const writer_1 = require("../core/writer");
|
|
12
|
-
const logger_1 = require("../utils/logger");
|
|
13
|
-
function extractCurrentVersion(args) {
|
|
14
|
-
const match = /@([\w.-]+)$/.exec(args.join(" "));
|
|
15
|
-
return match?.[1] || "latest";
|
|
16
|
-
}
|
|
17
|
-
async function runStatus(options = {}) {
|
|
1
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
2
|
+
import { readMcpJson } from '../core/writer.js';
|
|
3
|
+
import { getMcpById, getLatestVersion } from '../core/registry.js';
|
|
4
|
+
import { log, printTable } from '../utils/logger.js';
|
|
5
|
+
import { safeReadJSON } from '../utils/fs.js';
|
|
6
|
+
import { MCP_KIT_META_PATH } from '../constants.js';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
export async function runStatus(options = {}) {
|
|
18
9
|
try {
|
|
19
|
-
const
|
|
20
|
-
const config = await
|
|
21
|
-
const meta =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
10
|
+
const vscodePaths = await detectVsCodePath();
|
|
11
|
+
const config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
12
|
+
const meta = await safeReadJSON(MCP_KIT_META_PATH);
|
|
13
|
+
const serverIds = Object.keys(config.servers);
|
|
14
|
+
if (serverIds.length === 0) {
|
|
15
|
+
if (options.json) {
|
|
16
|
+
console.log(JSON.stringify({
|
|
17
|
+
configured: [],
|
|
18
|
+
source: vscodePaths.source,
|
|
19
|
+
mcpJsonPath: vscodePaths.mcpJsonPath,
|
|
20
|
+
}));
|
|
21
|
+
return;
|
|
29
22
|
}
|
|
30
|
-
|
|
23
|
+
log.warn('No MCP servers currently configured.');
|
|
24
|
+
log.info('Run "mcp-kit init --dev" or "mcp-kit init --non-dev" to get started.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Fetch latest versions in parallel
|
|
28
|
+
const latestVersions = await Promise.all(serverIds.map(id => {
|
|
29
|
+
const def = getMcpById(id);
|
|
30
|
+
return def ? getLatestVersion(def.npmPackage) : Promise.resolve('n/a');
|
|
31
31
|
}));
|
|
32
|
-
const rows = entries.map(([id, server], index) => {
|
|
33
|
-
const mcp = (0, registry_1.getMcpById)(id);
|
|
34
|
-
const current = extractCurrentVersion(server.args);
|
|
35
|
-
const latest = latestVersions[index];
|
|
36
|
-
const upToDate = current === "latest" || current === latest;
|
|
37
|
-
return [
|
|
38
|
-
mcp?.name || id,
|
|
39
|
-
mcp?.category || "unknown",
|
|
40
|
-
mcp?.npmPackage || "unknown",
|
|
41
|
-
current,
|
|
42
|
-
latest,
|
|
43
|
-
upToDate ? "Yes" : "No",
|
|
44
|
-
meta.credentialStorage || "keychain",
|
|
45
|
-
];
|
|
46
|
-
});
|
|
47
32
|
if (options.json) {
|
|
48
|
-
const output =
|
|
49
|
-
const
|
|
33
|
+
const output = serverIds.map((id, i) => {
|
|
34
|
+
const def = getMcpById(id);
|
|
35
|
+
const entry = config.servers[id];
|
|
36
|
+
const latest = latestVersions[i] ?? 'n/a';
|
|
37
|
+
const versionInArgs = entry?.args
|
|
38
|
+
?.map(a => {
|
|
39
|
+
const match = a.match(/@([^\s@]+)$/);
|
|
40
|
+
return match ? match[1] : null;
|
|
41
|
+
})
|
|
42
|
+
.find(Boolean) ?? 'latest';
|
|
43
|
+
const upToDate = versionInArgs === 'latest' || versionInArgs === latest || latest === 'n/a';
|
|
50
44
|
return {
|
|
51
45
|
id,
|
|
52
|
-
name:
|
|
53
|
-
category:
|
|
54
|
-
package:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
disabled:
|
|
60
|
-
credentialStorage: meta.credentialStorage || "keychain",
|
|
46
|
+
name: def?.name ?? id,
|
|
47
|
+
category: def?.category ?? 'unknown',
|
|
48
|
+
package: def?.npmPackage ?? '',
|
|
49
|
+
version: versionInArgs,
|
|
50
|
+
latest,
|
|
51
|
+
upToDate,
|
|
52
|
+
credentialStorage: meta?.credentialStorage ?? 'unknown',
|
|
53
|
+
disabled: entry?.disabled ?? false,
|
|
61
54
|
};
|
|
62
55
|
});
|
|
63
|
-
console.log(JSON.stringify(
|
|
56
|
+
console.log(JSON.stringify({
|
|
57
|
+
source: vscodePaths.source,
|
|
58
|
+
mcpJsonPath: vscodePaths.mcpJsonPath,
|
|
59
|
+
configured: output,
|
|
60
|
+
}, null, 2));
|
|
64
61
|
return;
|
|
65
62
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
63
|
+
const sourceLabel = vscodePaths.source === 'project' ? 'project .vscode' :
|
|
64
|
+
vscodePaths.source === 'global' ? 'VS Code global config' :
|
|
65
|
+
'created .vscode';
|
|
66
|
+
log.header('MCP Status');
|
|
67
|
+
const rows = serverIds.map((id, i) => {
|
|
68
|
+
const def = getMcpById(id);
|
|
69
|
+
const entry = config.servers[id];
|
|
70
|
+
const latest = latestVersions[i] ?? 'n/a';
|
|
71
|
+
// Try to extract version from args (e.g. "@azure/mcp@1.2.0")
|
|
72
|
+
const versionInArgs = entry?.args
|
|
73
|
+
?.map(a => {
|
|
74
|
+
const match = a.match(/@([^\s@]+)$/);
|
|
75
|
+
return match ? match[1] : null;
|
|
76
|
+
})
|
|
77
|
+
.find(Boolean) ?? 'latest';
|
|
78
|
+
const upToDate = versionInArgs === 'latest' || versionInArgs === latest || latest === 'n/a';
|
|
79
|
+
const disabled = entry?.disabled === true;
|
|
80
|
+
return [
|
|
81
|
+
disabled ? chalk.gray(id) : id,
|
|
82
|
+
def?.name ?? id,
|
|
83
|
+
def?.category ?? 'unknown',
|
|
84
|
+
def?.npmPackage ?? entry?.command ?? '',
|
|
85
|
+
versionInArgs,
|
|
86
|
+
latest,
|
|
87
|
+
disabled
|
|
88
|
+
? chalk.gray('⏸ disabled')
|
|
89
|
+
: upToDate
|
|
90
|
+
? chalk.green('✓')
|
|
91
|
+
: chalk.yellow('↑ update available'),
|
|
92
|
+
meta?.credentialStorage ?? 'unknown',
|
|
93
|
+
];
|
|
94
|
+
});
|
|
95
|
+
printTable(['ID', 'Name', 'Category', 'Package', 'Version', 'Latest', 'Status', 'Cred Storage'], rows);
|
|
96
|
+
log.blank();
|
|
97
|
+
log.muted(`Config path: ${vscodePaths.mcpJsonPath} (${sourceLabel})`);
|
|
98
|
+
log.muted(`Last updated: ${meta?.lastUpdated ?? 'unknown'}`);
|
|
99
|
+
log.blank();
|
|
100
|
+
log.info('Run "mcp-kit doctor" to diagnose any issues.');
|
|
81
101
|
}
|
|
82
102
|
catch (err) {
|
|
83
|
-
const message = err instanceof Error ? err.message :
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.error(err.stack);
|
|
88
|
-
}
|
|
103
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
104
|
+
log.error(`Status check failed: ${message}`);
|
|
105
|
+
if (process.env['DEBUG'])
|
|
106
|
+
console.error(err);
|
|
89
107
|
process.exit(1);
|
|
90
108
|
}
|
|
91
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/commands/toggle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/commands/toggle.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
|
package/dist/commands/toggle.js
CHANGED
|
@@ -1,33 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
async function runEnable(mcpId) {
|
|
1
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
2
|
+
import { readMcpJson, writeMcpJson } from '../core/writer.js';
|
|
3
|
+
import { getMcpById } from '../core/registry.js';
|
|
4
|
+
import { log } from '../utils/logger.js';
|
|
5
|
+
//
|
|
6
|
+
// mcp-kit enable <id> / mcp-kit disable <id>
|
|
7
|
+
//
|
|
8
|
+
export async function runEnable(mcpId) {
|
|
10
9
|
await setDisabled(mcpId, false);
|
|
11
10
|
}
|
|
12
|
-
async function runDisable(mcpId) {
|
|
11
|
+
export async function runDisable(mcpId) {
|
|
13
12
|
await setDisabled(mcpId, true);
|
|
14
13
|
}
|
|
15
14
|
async function setDisabled(mcpId, disabled) {
|
|
16
|
-
const action = disabled ?
|
|
15
|
+
const action = disabled ? 'disable' : 'enable';
|
|
17
16
|
try {
|
|
18
|
-
const vscodePaths = await
|
|
19
|
-
const config = await
|
|
17
|
+
const vscodePaths = await detectVsCodePath();
|
|
18
|
+
const config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
20
19
|
if (!config.servers[mcpId]) {
|
|
21
|
-
|
|
20
|
+
log.error(`"${mcpId}" is not configured. Run "mcp-kit list" to see configured MCPs.`);
|
|
22
21
|
process.exit(1);
|
|
23
22
|
}
|
|
24
23
|
const entry = config.servers[mcpId];
|
|
25
24
|
if (disabled && entry.disabled === true) {
|
|
26
|
-
|
|
25
|
+
log.warn(`${mcpId} is already disabled.`);
|
|
27
26
|
return;
|
|
28
27
|
}
|
|
29
28
|
if (!disabled && !entry.disabled) {
|
|
30
|
-
|
|
29
|
+
log.warn(`${mcpId} is already enabled.`);
|
|
31
30
|
return;
|
|
32
31
|
}
|
|
33
32
|
if (disabled) {
|
|
@@ -37,22 +36,21 @@ async function setDisabled(mcpId, disabled) {
|
|
|
37
36
|
delete entry.disabled;
|
|
38
37
|
}
|
|
39
38
|
config.servers[mcpId] = entry;
|
|
40
|
-
await
|
|
41
|
-
const def =
|
|
42
|
-
const
|
|
39
|
+
await writeMcpJson(vscodePaths.mcpJsonPath, config);
|
|
40
|
+
const def = getMcpById(mcpId);
|
|
41
|
+
const label = def?.name ?? mcpId;
|
|
43
42
|
if (disabled) {
|
|
44
|
-
|
|
43
|
+
log.success(`${label} disabled - VS Code will ignore it until re-enabled.`);
|
|
45
44
|
}
|
|
46
45
|
else {
|
|
47
|
-
|
|
46
|
+
log.success(`${label} enabled - reload VS Code to activate (Cmd/Ctrl+Shift+P → Reload Window).`);
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
catch (err) {
|
|
51
50
|
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
-
|
|
53
|
-
if (process.env
|
|
51
|
+
log.error(`Failed to ${action} ${mcpId}: ${message}`);
|
|
52
|
+
if (process.env['DEBUG'])
|
|
54
53
|
console.error(err);
|
|
55
|
-
}
|
|
56
54
|
process.exit(1);
|
|
57
55
|
}
|
|
58
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.js","sourceRoot":"","sources":["../../src/commands/toggle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toggle.js","sourceRoot":"","sources":["../../src/commands/toggle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,EAAE;AACF,6CAA6C;AAC7C,EAAE;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa;IAC3C,MAAM,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,QAAiB;IACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,iEAAiE,CAAC,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC;QAErC,IAAI,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC9B,MAAM,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,IAAI,KAAK,CAAC;QAEjC,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,sDAAsD,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,2EAA2E,CAAC,CAAC;QACnG,CAAC;IAEH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,GAAG,CAAC,KAAK,CAAC,aAAa,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAgCA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkG/C"}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,79 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { detectVsCodePath } from '../core/detector.js';
|
|
2
|
+
import { readMcpJson, writeMcpJson } from '../core/writer.js';
|
|
3
|
+
import { getMcpById, getLatestVersion } from '../core/registry.js';
|
|
4
|
+
import { askConfirm } from '../prompts/shared-prompts.js';
|
|
5
|
+
import { log, printTable } from '../utils/logger.js';
|
|
6
|
+
import { startSpinner, succeedSpinner, failSpinner } from '../utils/spinner.js';
|
|
7
|
+
import { safeWriteJSON, ensureDir, safeReadJSON } from '../utils/fs.js';
|
|
8
|
+
import { MCP_KIT_META_PATH, MCP_KIT_DIR } from '../constants.js';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
const _require = createRequire(import.meta.url);
|
|
11
|
+
const pkg = _require('../../package.json');
|
|
12
|
+
//
|
|
13
|
+
// mcp-kit update
|
|
14
|
+
//
|
|
15
|
+
/** Extract a pinned version from an arg like "@azure/mcp@1.2.0" */
|
|
16
|
+
function extractVersionFromArg(arg) {
|
|
17
|
+
const match = arg.match(/@(\d+\.\d+\.\d+(?:-[\w.]+)?)$/);
|
|
18
|
+
return match ? match[1] : null;
|
|
14
19
|
}
|
|
15
|
-
async function runUpdate() {
|
|
20
|
+
export async function runUpdate() {
|
|
16
21
|
try {
|
|
17
|
-
const
|
|
18
|
-
const config = await
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (!mcp) {
|
|
24
|
-
rows.push([id, "unknown", "unknown", "⚠ Not in registry"]);
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const current = parseVersionFromArgs(server.args, mcp.npmPackage);
|
|
28
|
-
const latest = await (0, registry_1.getLatestVersion)(mcp.npmPackage);
|
|
29
|
-
const needsUpdate = current !== "latest" && latest !== "unknown" && current !== latest;
|
|
30
|
-
rows.push([mcp.name, current, latest, needsUpdate ? "⬆ Update available" : "✅ Up to date"]);
|
|
31
|
-
if (needsUpdate) {
|
|
32
|
-
outdated.push(id);
|
|
33
|
-
}
|
|
22
|
+
const vscodePaths = await detectVsCodePath();
|
|
23
|
+
const config = await readMcpJson(vscodePaths.mcpJsonPath);
|
|
24
|
+
const serverIds = Object.keys(config.servers);
|
|
25
|
+
if (serverIds.length === 0) {
|
|
26
|
+
log.warn('No MCP servers are configured. Nothing to update.');
|
|
27
|
+
return;
|
|
34
28
|
}
|
|
35
|
-
|
|
29
|
+
log.header('mcp-kit - Check for Updates');
|
|
30
|
+
// Check latest versions in parallel
|
|
31
|
+
const results = await Promise.all(serverIds.map(async (id) => {
|
|
32
|
+
const def = getMcpById(id);
|
|
33
|
+
if (!def)
|
|
34
|
+
return { id, current: 'unknown', latest: 'n/a', needsUpdate: false };
|
|
35
|
+
const latest = await getLatestVersion(def.npmPackage);
|
|
36
|
+
const entry = config.servers[id];
|
|
37
|
+
const pinned = entry?.args?.map(extractVersionFromArg).find(Boolean);
|
|
38
|
+
const current = pinned ?? 'latest';
|
|
39
|
+
const needsUpdate = current !== 'latest' &&
|
|
40
|
+
latest !== 'unknown' &&
|
|
41
|
+
latest !== 'n/a' &&
|
|
42
|
+
current !== latest;
|
|
43
|
+
return { id, def, current, latest, needsUpdate };
|
|
44
|
+
}));
|
|
45
|
+
const rows = results.map(r => [
|
|
46
|
+
r.id,
|
|
47
|
+
r.def?.name ?? r.id,
|
|
48
|
+
r.current,
|
|
49
|
+
r.latest,
|
|
50
|
+
r.needsUpdate ? '↑ Update available' : '✓ Up to date',
|
|
51
|
+
]);
|
|
52
|
+
printTable(['ID', 'Name', 'Current', 'Latest', 'Action'], rows);
|
|
53
|
+
const outdated = results.filter(r => r.needsUpdate);
|
|
36
54
|
if (outdated.length === 0) {
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
log.success('All configured MCPs are up to date!');
|
|
56
|
+
return;
|
|
39
57
|
}
|
|
40
|
-
const
|
|
41
|
-
if (!
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
const doUpdate = await askConfirm(`Update ${outdated.length} outdated MCP(s) to @latest?`);
|
|
59
|
+
if (!doUpdate) {
|
|
60
|
+
log.info('No changes made.');
|
|
61
|
+
return;
|
|
44
62
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const mcp = (0, registry_1.getMcpById)(id);
|
|
48
|
-
if (!mcp) {
|
|
63
|
+
for (const item of outdated) {
|
|
64
|
+
if (!item.def)
|
|
49
65
|
continue;
|
|
50
|
-
}
|
|
51
|
-
const spinner = (0, spinner_1.startSpinner)(`Updating ${mcp.name}`);
|
|
66
|
+
const spinner = startSpinner(`Updating ${item.def.name}...`);
|
|
52
67
|
try {
|
|
53
|
-
config.servers[id]
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
updated += 1;
|
|
68
|
+
const entry = config.servers[item.id];
|
|
69
|
+
if (entry) {
|
|
70
|
+
// Replace pinned version tags in args with @latest
|
|
71
|
+
entry.args = entry.args.map(arg => arg.replace(/@\d+\.\d+\.\d+(?:-[\w.]+)?$/, '@latest'));
|
|
72
|
+
config.servers[item.id] = entry;
|
|
73
|
+
}
|
|
74
|
+
succeedSpinner(spinner, `Updated ${item.def.name} to @latest`);
|
|
61
75
|
}
|
|
62
76
|
catch (err) {
|
|
63
|
-
|
|
77
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
78
|
+
failSpinner(spinner, `Failed to update ${item.def.name}: ${message}`);
|
|
64
79
|
}
|
|
65
80
|
}
|
|
66
|
-
await
|
|
67
|
-
|
|
68
|
-
|
|
81
|
+
await writeMcpJson(vscodePaths.mcpJsonPath, config);
|
|
82
|
+
// Update meta
|
|
83
|
+
await ensureDir(MCP_KIT_DIR);
|
|
84
|
+
const meta = await safeReadJSON(MCP_KIT_META_PATH);
|
|
85
|
+
if (meta) {
|
|
86
|
+
await safeWriteJSON(MCP_KIT_META_PATH, {
|
|
87
|
+
...meta,
|
|
88
|
+
lastUpdated: new Date().toISOString(),
|
|
89
|
+
mcpKitVersion: pkg.version,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
log.blank();
|
|
93
|
+
log.success(`Updated ${outdated.length} MCP(s). Reload VS Code to apply.`);
|
|
94
|
+
log.info('Cmd/Ctrl+Shift+P → "Reload Window"');
|
|
69
95
|
}
|
|
70
96
|
catch (err) {
|
|
71
|
-
const message = err instanceof Error ? err.message :
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
console.error(err.stack);
|
|
76
|
-
}
|
|
97
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
98
|
+
log.error(`Update failed: ${message}`);
|
|
99
|
+
if (process.env['DEBUG'])
|
|
100
|
+
console.error(err);
|
|
77
101
|
process.exit(1);
|
|
78
102
|
}
|
|
79
103
|
}
|