@getmcp/cli 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +3 -1
- package/dist/bin.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +37 -10
- package/dist/commands/add.js.map +1 -1
- package/dist/config-file.d.ts +23 -5
- package/dist/config-file.d.ts.map +1 -1
- package/dist/config-file.js +136 -18
- package/dist/config-file.js.map +1 -1
- package/dist/detect.d.ts +1 -0
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +1 -0
- package/dist/detect.js.map +1 -1
- package/dist/format.d.ts +15 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +30 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/preferences.d.ts +33 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +76 -0
- package/dist/preferences.js.map +1 -0
- package/package.json +8 -3
package/dist/bin.js
CHANGED
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
* getmcp list [--search=query] Search the registry
|
|
10
10
|
* getmcp list [--category=cat] Filter by category
|
|
11
11
|
*/
|
|
12
|
+
import { createRequire } from "node:module";
|
|
12
13
|
import { addCommand } from "./commands/add.js";
|
|
13
14
|
import { removeCommand } from "./commands/remove.js";
|
|
14
15
|
import { listCommand } from "./commands/list.js";
|
|
15
|
-
const
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
const { version: VERSION } = require("../package.json");
|
|
16
18
|
function printHelp() {
|
|
17
19
|
console.log(`
|
|
18
20
|
getmcp v${VERSION} — Install MCP servers into any AI application
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwIpE"}
|
package/dist/commands/add.js
CHANGED
|
@@ -9,12 +9,13 @@
|
|
|
9
9
|
* 5. Generate config for each selected app
|
|
10
10
|
* 6. Merge into existing config files (never overwrite)
|
|
11
11
|
*/
|
|
12
|
-
import { select, checkbox, input } from "@inquirer/prompts";
|
|
12
|
+
import { select, checkbox, input, password } from "@inquirer/prompts";
|
|
13
13
|
import { getAllServers, getServer, searchServers, } from "@getmcp/registry";
|
|
14
14
|
import { getGenerator } from "@getmcp/generators";
|
|
15
15
|
import { isStdioConfig } from "@getmcp/core";
|
|
16
|
-
import {
|
|
16
|
+
import { detectApps } from "../detect.js";
|
|
17
17
|
import { mergeServerIntoConfig, writeConfigFile } from "../config-file.js";
|
|
18
|
+
import { getSavedSelectedApps, saveSelectedApps } from "../preferences.js";
|
|
18
19
|
export async function addCommand(serverIdArg) {
|
|
19
20
|
// Step 1: Select server
|
|
20
21
|
let entry;
|
|
@@ -61,7 +62,8 @@ export async function addCommand(serverIdArg) {
|
|
|
61
62
|
if (entry.requiredEnvVars.length > 0 && isStdioConfig(config)) {
|
|
62
63
|
console.log("This server requires environment variables:\n");
|
|
63
64
|
for (const envVar of entry.requiredEnvVars) {
|
|
64
|
-
const
|
|
65
|
+
const prompt = isSensitiveEnvVar(envVar) ? password : input;
|
|
66
|
+
const value = await prompt({
|
|
65
67
|
message: ` ${envVar}:`,
|
|
66
68
|
validate: (val) => (val.trim() ? true : `${envVar} is required`),
|
|
67
69
|
});
|
|
@@ -69,24 +71,41 @@ export async function addCommand(serverIdArg) {
|
|
|
69
71
|
}
|
|
70
72
|
console.log();
|
|
71
73
|
}
|
|
72
|
-
// Step 3: Detect
|
|
73
|
-
const
|
|
74
|
-
|
|
74
|
+
// Step 3: Detect apps and build selection list
|
|
75
|
+
const allApps = detectApps();
|
|
76
|
+
const detected = allApps.filter((app) => app.exists);
|
|
77
|
+
const notDetectedProjectScoped = allApps.filter((app) => !app.exists && app.scope === "project");
|
|
78
|
+
if (detected.length === 0 && notDetectedProjectScoped.length === 0) {
|
|
75
79
|
console.log("No AI applications detected on this system.");
|
|
76
80
|
console.log("You can manually copy the config from below:\n");
|
|
77
81
|
printManualConfig(entry, config);
|
|
78
82
|
return;
|
|
79
83
|
}
|
|
80
84
|
// Step 4: Select target apps
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
85
|
+
// On first run (no saved preferences), detected apps are pre-checked and
|
|
86
|
+
// project-scoped non-detected apps are unchecked.
|
|
87
|
+
// On subsequent runs, the previously selected apps are pre-checked instead.
|
|
88
|
+
const savedApps = getSavedSelectedApps();
|
|
89
|
+
const hasSavedPreferences = savedApps !== null;
|
|
90
|
+
const choices = [
|
|
91
|
+
...detected.map((app) => ({
|
|
92
|
+
name: app.name,
|
|
93
|
+
value: app,
|
|
94
|
+
checked: hasSavedPreferences ? savedApps.includes(app.id) : true,
|
|
95
|
+
})),
|
|
96
|
+
...notDetectedProjectScoped.map((app) => ({
|
|
84
97
|
name: app.name,
|
|
85
98
|
value: app,
|
|
86
|
-
checked:
|
|
99
|
+
checked: hasSavedPreferences ? savedApps.includes(app.id) : false,
|
|
87
100
|
})),
|
|
101
|
+
].sort((a, b) => Number(b.checked) - Number(a.checked));
|
|
102
|
+
const selectedApps = await checkbox({
|
|
103
|
+
message: "Select apps to configure:",
|
|
104
|
+
choices,
|
|
88
105
|
validate: (selected) => selected.length > 0 ? true : "Select at least one app",
|
|
89
106
|
});
|
|
107
|
+
// Save selected apps for next run
|
|
108
|
+
saveSelectedApps(selectedApps.map((app) => app.id));
|
|
90
109
|
// Step 5+6: Generate and merge for each selected app
|
|
91
110
|
for (const app of selectedApps) {
|
|
92
111
|
try {
|
|
@@ -124,4 +143,12 @@ function printManualConfig(entry, config) {
|
|
|
124
143
|
};
|
|
125
144
|
console.log(JSON.stringify(canonical, null, 2));
|
|
126
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Heuristic to detect if an environment variable name likely holds a secret.
|
|
148
|
+
* Returns true for names containing common secret-related keywords.
|
|
149
|
+
*/
|
|
150
|
+
const SENSITIVE_PATTERNS = /TOKEN|KEY|SECRET|PASSWORD|CREDENTIAL|AUTH|PAT|PRIVATE/i;
|
|
151
|
+
function isSensitiveEnvVar(name) {
|
|
152
|
+
return SENSITIVE_PATTERNS.test(name);
|
|
153
|
+
}
|
|
127
154
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
package/dist/config-file.d.ts
CHANGED
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Config file reading, merging, and writing.
|
|
3
3
|
*
|
|
4
|
+
* Supports JSON, JSONC, YAML, and TOML formats.
|
|
5
|
+
* Format is auto-detected from the file extension.
|
|
6
|
+
*
|
|
4
7
|
* Key principle: NEVER overwrite existing config files.
|
|
5
8
|
* Always read the existing config, merge the new server in, and write back.
|
|
6
9
|
*/
|
|
7
10
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
+
* Strip JSONC comments (single-line `//` and multi-line `/* ... */`)
|
|
12
|
+
* while respecting JSON string boundaries.
|
|
13
|
+
*
|
|
14
|
+
* Unlike a naive regex replace, this properly handles `//` sequences
|
|
15
|
+
* inside JSON string values (e.g., URLs like "https://example.com").
|
|
16
|
+
*/
|
|
17
|
+
export declare function stripJsoncComments(raw: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Read and parse a config file.
|
|
20
|
+
* Returns an empty object if the file doesn't exist or is empty.
|
|
21
|
+
* Format is auto-detected from the file extension.
|
|
11
22
|
*/
|
|
12
23
|
export declare function readConfigFile(filePath: string): Record<string, unknown>;
|
|
13
24
|
/**
|
|
14
|
-
* Write a config object to a
|
|
25
|
+
* Write a config object to a file.
|
|
15
26
|
* Creates parent directories if they don't exist.
|
|
27
|
+
* Format is auto-detected from the file extension.
|
|
16
28
|
*/
|
|
17
29
|
export declare function writeConfigFile(filePath: string, config: Record<string, unknown>): void;
|
|
18
30
|
/**
|
|
@@ -23,6 +35,9 @@ export declare function writeConfigFile(filePath: string, config: Record<string,
|
|
|
23
35
|
*
|
|
24
36
|
* This function deep-merges the server into the existing file's root key,
|
|
25
37
|
* preserving all other existing servers and config.
|
|
38
|
+
*
|
|
39
|
+
* Format is auto-detected from the file extension at read/write boundaries.
|
|
40
|
+
* The merge logic itself is format-agnostic (operates on plain objects).
|
|
26
41
|
*/
|
|
27
42
|
export declare function mergeServerIntoConfig(filePath: string, generatedConfig: Record<string, unknown>): Record<string, unknown>;
|
|
28
43
|
/**
|
|
@@ -32,11 +47,14 @@ export declare function mergeServerIntoConfig(filePath: string, generatedConfig:
|
|
|
32
47
|
* the server name and removes it.
|
|
33
48
|
*
|
|
34
49
|
* Returns the updated config, or null if the server wasn't found.
|
|
50
|
+
* Format is auto-detected from the file extension.
|
|
35
51
|
*/
|
|
36
52
|
export declare function removeServerFromConfig(filePath: string, serverName: string): Record<string, unknown> | null;
|
|
37
53
|
/**
|
|
38
54
|
* List all server names found in a config file.
|
|
39
|
-
* Scans known root keys: mcpServers, servers, extensions, mcp,
|
|
55
|
+
* Scans known root keys: mcpServers, servers, extensions, mcp,
|
|
56
|
+
* context_servers, mcp_servers.
|
|
57
|
+
* Format is auto-detected from the file extension.
|
|
40
58
|
*/
|
|
41
59
|
export declare function listServersInConfig(filePath: string): string[];
|
|
42
60
|
//# sourceMappingURL=config-file.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA8DtD;AAgDD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUxE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CASN;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAmBhC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CAoBV"}
|
package/dist/config-file.js
CHANGED
|
@@ -1,15 +1,125 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Config file reading, merging, and writing.
|
|
3
3
|
*
|
|
4
|
+
* Supports JSON, JSONC, YAML, and TOML formats.
|
|
5
|
+
* Format is auto-detected from the file extension.
|
|
6
|
+
*
|
|
4
7
|
* Key principle: NEVER overwrite existing config files.
|
|
5
8
|
* Always read the existing config, merge the new server in, and write back.
|
|
6
9
|
*/
|
|
7
10
|
import * as fs from "node:fs";
|
|
8
11
|
import * as path from "node:path";
|
|
12
|
+
import YAML from "yaml";
|
|
13
|
+
import * as TOML from "smol-toml";
|
|
14
|
+
import { detectConfigFormat } from "./format.js";
|
|
15
|
+
/**
|
|
16
|
+
* Strip JSONC comments (single-line `//` and multi-line `/* ... */`)
|
|
17
|
+
* while respecting JSON string boundaries.
|
|
18
|
+
*
|
|
19
|
+
* Unlike a naive regex replace, this properly handles `//` sequences
|
|
20
|
+
* inside JSON string values (e.g., URLs like "https://example.com").
|
|
21
|
+
*/
|
|
22
|
+
export function stripJsoncComments(raw) {
|
|
23
|
+
let result = "";
|
|
24
|
+
let i = 0;
|
|
25
|
+
const len = raw.length;
|
|
26
|
+
while (i < len) {
|
|
27
|
+
const ch = raw[i];
|
|
28
|
+
// Handle JSON strings — skip through them without stripping
|
|
29
|
+
if (ch === '"') {
|
|
30
|
+
result += ch;
|
|
31
|
+
i++;
|
|
32
|
+
// Walk through the string until the closing unescaped quote
|
|
33
|
+
while (i < len) {
|
|
34
|
+
const sch = raw[i];
|
|
35
|
+
result += sch;
|
|
36
|
+
if (sch === "\\") {
|
|
37
|
+
// Escaped character — copy next char and skip
|
|
38
|
+
i++;
|
|
39
|
+
if (i < len) {
|
|
40
|
+
result += raw[i];
|
|
41
|
+
i++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (sch === '"') {
|
|
45
|
+
i++;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
i++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Handle single-line comment: //
|
|
55
|
+
if (ch === "/" && i + 1 < len && raw[i + 1] === "/") {
|
|
56
|
+
// Skip until end of line
|
|
57
|
+
i += 2;
|
|
58
|
+
while (i < len && raw[i] !== "\n") {
|
|
59
|
+
i++;
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Handle multi-line comment: /* ... */
|
|
64
|
+
if (ch === "/" && i + 1 < len && raw[i + 1] === "*") {
|
|
65
|
+
i += 2;
|
|
66
|
+
while (i < len) {
|
|
67
|
+
if (raw[i] === "*" && i + 1 < len && raw[i + 1] === "/") {
|
|
68
|
+
i += 2;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Regular character
|
|
76
|
+
result += ch;
|
|
77
|
+
i++;
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
9
81
|
/**
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
82
|
+
* Parse raw file content according to the detected format.
|
|
83
|
+
*/
|
|
84
|
+
function parseContent(raw, format, filePath) {
|
|
85
|
+
try {
|
|
86
|
+
switch (format) {
|
|
87
|
+
case "json":
|
|
88
|
+
return JSON.parse(raw);
|
|
89
|
+
case "jsonc":
|
|
90
|
+
return JSON.parse(stripJsoncComments(raw));
|
|
91
|
+
case "yaml":
|
|
92
|
+
return YAML.parse(raw) ?? {};
|
|
93
|
+
case "toml":
|
|
94
|
+
return TOML.parse(raw);
|
|
95
|
+
default:
|
|
96
|
+
return JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new Error(`Failed to parse config file: ${filePath}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Serialize a config object to a string in the given format.
|
|
105
|
+
*/
|
|
106
|
+
function serializeContent(config, format) {
|
|
107
|
+
switch (format) {
|
|
108
|
+
case "json":
|
|
109
|
+
case "jsonc":
|
|
110
|
+
return JSON.stringify(config, null, 2) + "\n";
|
|
111
|
+
case "yaml":
|
|
112
|
+
return YAML.stringify(config, { indent: 2 });
|
|
113
|
+
case "toml":
|
|
114
|
+
return TOML.stringify(config) + "\n";
|
|
115
|
+
default:
|
|
116
|
+
return JSON.stringify(config, null, 2) + "\n";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Read and parse a config file.
|
|
121
|
+
* Returns an empty object if the file doesn't exist or is empty.
|
|
122
|
+
* Format is auto-detected from the file extension.
|
|
13
123
|
*/
|
|
14
124
|
export function readConfigFile(filePath) {
|
|
15
125
|
if (!fs.existsSync(filePath)) {
|
|
@@ -18,27 +128,22 @@ export function readConfigFile(filePath) {
|
|
|
18
128
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
19
129
|
if (!raw.trim())
|
|
20
130
|
return {};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.replace(/\/\/.*$/gm, "")
|
|
24
|
-
.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
25
|
-
try {
|
|
26
|
-
return JSON.parse(stripped);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
throw new Error(`Failed to parse config file: ${filePath}`);
|
|
30
|
-
}
|
|
131
|
+
const format = detectConfigFormat(filePath);
|
|
132
|
+
return parseContent(raw, format, filePath);
|
|
31
133
|
}
|
|
32
134
|
/**
|
|
33
|
-
* Write a config object to a
|
|
135
|
+
* Write a config object to a file.
|
|
34
136
|
* Creates parent directories if they don't exist.
|
|
137
|
+
* Format is auto-detected from the file extension.
|
|
35
138
|
*/
|
|
36
139
|
export function writeConfigFile(filePath, config) {
|
|
37
140
|
const dir = path.dirname(filePath);
|
|
38
141
|
if (!fs.existsSync(dir)) {
|
|
39
142
|
fs.mkdirSync(dir, { recursive: true });
|
|
40
143
|
}
|
|
41
|
-
|
|
144
|
+
const format = detectConfigFormat(filePath);
|
|
145
|
+
const content = serializeContent(config, format);
|
|
146
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
42
147
|
}
|
|
43
148
|
/**
|
|
44
149
|
* Merge a generated server config into an existing config file.
|
|
@@ -48,6 +153,9 @@ export function writeConfigFile(filePath, config) {
|
|
|
48
153
|
*
|
|
49
154
|
* This function deep-merges the server into the existing file's root key,
|
|
50
155
|
* preserving all other existing servers and config.
|
|
156
|
+
*
|
|
157
|
+
* Format is auto-detected from the file extension at read/write boundaries.
|
|
158
|
+
* The merge logic itself is format-agnostic (operates on plain objects).
|
|
51
159
|
*/
|
|
52
160
|
export function mergeServerIntoConfig(filePath, generatedConfig) {
|
|
53
161
|
const existing = readConfigFile(filePath);
|
|
@@ -75,11 +183,12 @@ export function mergeServerIntoConfig(filePath, generatedConfig) {
|
|
|
75
183
|
* the server name and removes it.
|
|
76
184
|
*
|
|
77
185
|
* Returns the updated config, or null if the server wasn't found.
|
|
186
|
+
* Format is auto-detected from the file extension.
|
|
78
187
|
*/
|
|
79
188
|
export function removeServerFromConfig(filePath, serverName) {
|
|
80
189
|
const existing = readConfigFile(filePath);
|
|
81
190
|
let found = false;
|
|
82
|
-
for (const [
|
|
191
|
+
for (const [, value] of Object.entries(existing)) {
|
|
83
192
|
if (typeof value === "object" &&
|
|
84
193
|
value !== null &&
|
|
85
194
|
!Array.isArray(value)) {
|
|
@@ -94,11 +203,20 @@ export function removeServerFromConfig(filePath, serverName) {
|
|
|
94
203
|
}
|
|
95
204
|
/**
|
|
96
205
|
* List all server names found in a config file.
|
|
97
|
-
* Scans known root keys: mcpServers, servers, extensions, mcp,
|
|
206
|
+
* Scans known root keys: mcpServers, servers, extensions, mcp,
|
|
207
|
+
* context_servers, mcp_servers.
|
|
208
|
+
* Format is auto-detected from the file extension.
|
|
98
209
|
*/
|
|
99
210
|
export function listServersInConfig(filePath) {
|
|
100
211
|
const existing = readConfigFile(filePath);
|
|
101
|
-
const rootKeys = [
|
|
212
|
+
const rootKeys = [
|
|
213
|
+
"mcpServers",
|
|
214
|
+
"servers",
|
|
215
|
+
"extensions",
|
|
216
|
+
"mcp",
|
|
217
|
+
"context_servers",
|
|
218
|
+
"mcp_servers",
|
|
219
|
+
];
|
|
102
220
|
const servers = [];
|
|
103
221
|
for (const rootKey of rootKeys) {
|
|
104
222
|
const section = existing[rootKey];
|
package/dist/config-file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"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"}
|
package/dist/detect.d.ts
CHANGED
package/dist/detect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKlE;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKlE;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAsB1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,EAAE,CAEnD"}
|
package/dist/detect.js
CHANGED
package/dist/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,IAAI,QAAQ,GAAG,UAAU,CAAC;IAE1B,qBAAqB;IACrB,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,sCAAsC;IACtC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjH,+BAA+B;IAC/B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7D,yCAAyC;IACzC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,kBAAkB,EAClB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CACxE,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAwC,CAAC;IAClE,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,IAAI,QAAQ,GAAG,UAAU,CAAC;IAE1B,qBAAqB;IACrB,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,sCAAsC;IACtC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjH,+BAA+B;IAC/B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7D,yCAAyC;IACzC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,kBAAkB,EAClB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CACxE,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAwC,CAAC;IAClE,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAE7D,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE;YACpB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI;YACxB,UAAU;YACV,MAAM,EAAE,UAAU,IAAI,YAAY;YAClC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config file format detection based on file extension.
|
|
3
|
+
*
|
|
4
|
+
* Used by readConfigFile/writeConfigFile to dispatch to the correct
|
|
5
|
+
* parser/serializer for JSON, JSONC, YAML, and TOML formats.
|
|
6
|
+
*/
|
|
7
|
+
export type ConfigFormat = "json" | "jsonc" | "yaml" | "toml";
|
|
8
|
+
/**
|
|
9
|
+
* Detect the config file format from its file extension.
|
|
10
|
+
*
|
|
11
|
+
* @param filePath - Path to the config file
|
|
12
|
+
* @returns The detected format, defaults to "json" for unknown extensions
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectConfigFormat(filePath: string): ConfigFormat;
|
|
15
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAgBjE"}
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config file format detection based on file extension.
|
|
3
|
+
*
|
|
4
|
+
* Used by readConfigFile/writeConfigFile to dispatch to the correct
|
|
5
|
+
* parser/serializer for JSON, JSONC, YAML, and TOML formats.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
/**
|
|
9
|
+
* Detect the config file format from its file extension.
|
|
10
|
+
*
|
|
11
|
+
* @param filePath - Path to the config file
|
|
12
|
+
* @returns The detected format, defaults to "json" for unknown extensions
|
|
13
|
+
*/
|
|
14
|
+
export function detectConfigFormat(filePath) {
|
|
15
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
16
|
+
switch (ext) {
|
|
17
|
+
case ".json":
|
|
18
|
+
return "json";
|
|
19
|
+
case ".jsonc":
|
|
20
|
+
return "jsonc";
|
|
21
|
+
case ".yaml":
|
|
22
|
+
case ".yml":
|
|
23
|
+
return "yaml";
|
|
24
|
+
case ".toml":
|
|
25
|
+
return "toml";
|
|
26
|
+
default:
|
|
27
|
+
return "json";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,4 +9,5 @@ export { removeCommand } from "./commands/remove.js";
|
|
|
9
9
|
export { listCommand } from "./commands/list.js";
|
|
10
10
|
export { detectApps, detectInstalledApps, resolvePath, getConfigPath } from "./detect.js";
|
|
11
11
|
export { readConfigFile, writeConfigFile, mergeServerIntoConfig, removeServerFromConfig, listServersInConfig, } from "./config-file.js";
|
|
12
|
+
export { getPreferencesPath, readPreferences, saveSelectedApps, getSavedSelectedApps, } from "./preferences.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,4 +9,5 @@ export { removeCommand } from "./commands/remove.js";
|
|
|
9
9
|
export { listCommand } from "./commands/list.js";
|
|
10
10
|
export { detectApps, detectInstalledApps, resolvePath, getConfigPath } from "./detect.js";
|
|
11
11
|
export { readConfigFile, writeConfigFile, mergeServerIntoConfig, removeServerFromConfig, listServersInConfig, } from "./config-file.js";
|
|
12
|
+
export { getPreferencesPath, readPreferences, saveSelectedApps, getSavedSelectedApps, } from "./preferences.js";
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI preferences persistence.
|
|
3
|
+
*
|
|
4
|
+
* Remembers user choices (e.g. selected apps) across CLI invocations.
|
|
5
|
+
* Stored in a platform-specific config directory:
|
|
6
|
+
* - Windows: %AppData%/getmcp/preferences.json
|
|
7
|
+
* - macOS/Linux: ~/.config/getmcp/preferences.json
|
|
8
|
+
*/
|
|
9
|
+
import type { AppIdType } from "@getmcp/core";
|
|
10
|
+
interface Preferences {
|
|
11
|
+
selectedApps?: AppIdType[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the platform-specific path for the preferences file.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getPreferencesPath(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Read the preferences file.
|
|
19
|
+
* Returns an empty object if the file doesn't exist or is corrupt.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readPreferences(filePath?: string): Preferences;
|
|
22
|
+
/**
|
|
23
|
+
* Save the list of selected app IDs to the preferences file.
|
|
24
|
+
* Creates parent directories if they don't exist.
|
|
25
|
+
*/
|
|
26
|
+
export declare function saveSelectedApps(appIds: AppIdType[], filePath?: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Get the previously saved list of selected app IDs.
|
|
29
|
+
* Returns null if no preferences exist yet (first run).
|
|
30
|
+
*/
|
|
31
|
+
export declare function getSavedSelectedApps(filePath?: string): AppIdType[] | null;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../src/preferences.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAW3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,WAAW,CAgCb;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EAAE,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAgBN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,EAAE,GAAG,IAAI,CAGpB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI preferences persistence.
|
|
3
|
+
*
|
|
4
|
+
* Remembers user choices (e.g. selected apps) across CLI invocations.
|
|
5
|
+
* Stored in a platform-specific config directory:
|
|
6
|
+
* - Windows: %AppData%/getmcp/preferences.json
|
|
7
|
+
* - macOS/Linux: ~/.config/getmcp/preferences.json
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import * as os from "node:os";
|
|
12
|
+
/**
|
|
13
|
+
* Get the platform-specific path for the preferences file.
|
|
14
|
+
*/
|
|
15
|
+
export function getPreferencesPath() {
|
|
16
|
+
if (process.platform === "win32") {
|
|
17
|
+
const appData = process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming");
|
|
18
|
+
return path.join(appData, "getmcp", "preferences.json");
|
|
19
|
+
}
|
|
20
|
+
// macOS and Linux: use XDG_CONFIG_HOME or ~/.config
|
|
21
|
+
const configDir = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config");
|
|
22
|
+
return path.join(configDir, "getmcp", "preferences.json");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read the preferences file.
|
|
26
|
+
* Returns an empty object if the file doesn't exist or is corrupt.
|
|
27
|
+
*/
|
|
28
|
+
export function readPreferences(filePath) {
|
|
29
|
+
const prefsPath = filePath ?? getPreferencesPath();
|
|
30
|
+
if (!fs.existsSync(prefsPath)) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const raw = fs.readFileSync(prefsPath, "utf-8");
|
|
35
|
+
if (!raw.trim())
|
|
36
|
+
return {};
|
|
37
|
+
const parsed = JSON.parse(raw);
|
|
38
|
+
// Basic validation: must be an object
|
|
39
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
// Validate selectedApps if present
|
|
43
|
+
if (parsed.selectedApps !== undefined &&
|
|
44
|
+
(!Array.isArray(parsed.selectedApps) ||
|
|
45
|
+
!parsed.selectedApps.every((v) => typeof v === "string"))) {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
return parsed;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Save the list of selected app IDs to the preferences file.
|
|
56
|
+
* Creates parent directories if they don't exist.
|
|
57
|
+
*/
|
|
58
|
+
export function saveSelectedApps(appIds, filePath) {
|
|
59
|
+
const prefsPath = filePath ?? getPreferencesPath();
|
|
60
|
+
const existing = readPreferences(prefsPath);
|
|
61
|
+
existing.selectedApps = appIds;
|
|
62
|
+
const dir = path.dirname(prefsPath);
|
|
63
|
+
if (!fs.existsSync(dir)) {
|
|
64
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
fs.writeFileSync(prefsPath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the previously saved list of selected app IDs.
|
|
70
|
+
* Returns null if no preferences exist yet (first run).
|
|
71
|
+
*/
|
|
72
|
+
export function getSavedSelectedApps(filePath) {
|
|
73
|
+
const prefs = readPreferences(filePath);
|
|
74
|
+
return prefs.selectedApps ?? null;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../src/preferences.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getmcp/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "CLI tool to install MCP servers into any AI application with one command",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"license": "MIT",
|
|
44
44
|
"repository": {
|
|
45
45
|
"type": "git",
|
|
46
|
-
"url": "https://github.com/RodrigoTomeES/getmcp.git",
|
|
46
|
+
"url": "git+https://github.com/RodrigoTomeES/getmcp.git",
|
|
47
47
|
"directory": "packages/cli"
|
|
48
48
|
},
|
|
49
49
|
"homepage": "https://github.com/RodrigoTomeES/getmcp/tree/main/packages/cli#readme",
|
|
@@ -53,11 +53,16 @@
|
|
|
53
53
|
"engines": {
|
|
54
54
|
"node": ">=22.0.0"
|
|
55
55
|
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
56
59
|
"dependencies": {
|
|
57
60
|
"@getmcp/core": "^0.1.0",
|
|
58
61
|
"@getmcp/generators": "^0.1.0",
|
|
59
62
|
"@getmcp/registry": "^0.1.0",
|
|
60
|
-
"@inquirer/prompts": "^7.0.0"
|
|
63
|
+
"@inquirer/prompts": "^7.0.0",
|
|
64
|
+
"smol-toml": "^1.6.0",
|
|
65
|
+
"yaml": "^2.8.2"
|
|
61
66
|
},
|
|
62
67
|
"devDependencies": {
|
|
63
68
|
"@types/node": "^24.0.0"
|