@1mcp/agent 0.16.0 → 0.17.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.
- package/README.md +37 -2
- package/build/commands/app/backups.d.ts +17 -0
- package/build/commands/app/backups.d.ts.map +1 -0
- package/build/commands/app/backups.js +162 -0
- package/build/commands/app/backups.js.map +1 -0
- package/build/commands/app/consolidate.d.ts +21 -0
- package/build/commands/app/consolidate.d.ts.map +1 -0
- package/build/commands/app/consolidate.js +383 -0
- package/build/commands/app/consolidate.js.map +1 -0
- package/build/commands/app/discover.d.ts +16 -0
- package/build/commands/app/discover.d.ts.map +1 -0
- package/build/commands/app/discover.js +79 -0
- package/build/commands/app/discover.js.map +1 -0
- package/build/commands/app/index.d.ts +12 -0
- package/build/commands/app/index.d.ts.map +1 -0
- package/build/commands/app/index.js +274 -0
- package/build/commands/app/index.js.map +1 -0
- package/build/commands/app/list.d.ts +16 -0
- package/build/commands/app/list.d.ts.map +1 -0
- package/build/commands/app/list.js +95 -0
- package/build/commands/app/list.js.map +1 -0
- package/build/commands/app/restore.d.ts +21 -0
- package/build/commands/app/restore.d.ts.map +1 -0
- package/build/commands/app/restore.js +265 -0
- package/build/commands/app/restore.js.map +1 -0
- package/build/commands/app/status.d.ts +16 -0
- package/build/commands/app/status.d.ts.map +1 -0
- package/build/commands/app/status.js +224 -0
- package/build/commands/app/status.js.map +1 -0
- package/build/commands/mcp/add.d.ts +19 -0
- package/build/commands/mcp/add.d.ts.map +1 -0
- package/build/commands/mcp/add.js +135 -0
- package/build/commands/mcp/add.js.map +1 -0
- package/build/commands/mcp/enable.d.ts +13 -0
- package/build/commands/mcp/enable.d.ts.map +1 -0
- package/build/commands/mcp/enable.js +100 -0
- package/build/commands/mcp/enable.js.map +1 -0
- package/build/commands/mcp/index.d.ts +12 -0
- package/build/commands/mcp/index.d.ts.map +1 -0
- package/build/commands/mcp/index.js +351 -0
- package/build/commands/mcp/index.js.map +1 -0
- package/build/commands/mcp/list.d.ts +11 -0
- package/build/commands/mcp/list.d.ts.map +1 -0
- package/build/commands/mcp/list.js +144 -0
- package/build/commands/mcp/list.js.map +1 -0
- package/build/commands/mcp/remove.d.ts +10 -0
- package/build/commands/mcp/remove.d.ts.map +1 -0
- package/build/commands/mcp/remove.js +89 -0
- package/build/commands/mcp/remove.js.map +1 -0
- package/build/commands/mcp/status.d.ts +10 -0
- package/build/commands/mcp/status.d.ts.map +1 -0
- package/build/commands/mcp/status.js +243 -0
- package/build/commands/mcp/status.js.map +1 -0
- package/build/commands/mcp/update.d.ts +18 -0
- package/build/commands/mcp/update.d.ts.map +1 -0
- package/build/commands/mcp/update.js +157 -0
- package/build/commands/mcp/update.js.map +1 -0
- package/build/commands/mcp/utils/configUtils.d.ts +64 -0
- package/build/commands/mcp/utils/configUtils.d.ts.map +1 -0
- package/build/commands/mcp/utils/configUtils.js +266 -0
- package/build/commands/mcp/utils/configUtils.js.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts +32 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js +61 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js.map +1 -0
- package/build/commands/mcp/utils/validation.d.ts +33 -0
- package/build/commands/mcp/utils/validation.d.ts.map +1 -0
- package/build/commands/mcp/utils/validation.js +235 -0
- package/build/commands/mcp/utils/validation.js.map +1 -0
- package/build/constants.d.ts +11 -2
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +15 -2
- package/build/constants.js.map +1 -1
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts +96 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts.map +1 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js +256 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js.map +1 -0
- package/build/core/capabilities/capabilityAggregator.d.ts +114 -0
- package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -0
- package/build/core/capabilities/capabilityAggregator.js +234 -0
- package/build/core/capabilities/capabilityAggregator.js.map +1 -0
- package/build/core/client/clientManager.d.ts +28 -0
- package/build/core/client/clientManager.d.ts.map +1 -1
- package/build/core/client/clientManager.js +120 -0
- package/build/core/client/clientManager.js.map +1 -1
- package/build/core/loading/loadingStateTracker.d.ts +128 -0
- package/build/core/loading/loadingStateTracker.d.ts.map +1 -0
- package/build/core/loading/loadingStateTracker.js +209 -0
- package/build/core/loading/loadingStateTracker.js.map +1 -0
- package/build/core/loading/mcpLoadingManager.d.ts +139 -0
- package/build/core/loading/mcpLoadingManager.d.ts.map +1 -0
- package/build/core/loading/mcpLoadingManager.js +296 -0
- package/build/core/loading/mcpLoadingManager.js.map +1 -0
- package/build/core/notifications/notificationManager.d.ts +111 -0
- package/build/core/notifications/notificationManager.d.ts.map +1 -0
- package/build/core/notifications/notificationManager.js +232 -0
- package/build/core/notifications/notificationManager.js.map +1 -0
- package/build/core/server/agentConfig.d.ts +50 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +68 -1
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/core/server/serverManager.d.ts +1 -0
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +3 -0
- package/build/core/server/serverManager.js.map +1 -1
- package/build/index.js +115 -32
- package/build/index.js.map +1 -1
- package/build/server.d.ts +23 -2
- package/build/server.d.ts.map +1 -1
- package/build/server.js +83 -10
- package/build/server.js.map +1 -1
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts +79 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts.map +1 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js +243 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js.map +1 -0
- package/build/transport/http/routes/healthRoutes.d.ts +2 -1
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/healthRoutes.js +170 -1
- package/build/transport/http/routes/healthRoutes.js.map +1 -1
- package/build/transport/http/routes/sseRoutes.d.ts +2 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +13 -1
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +2 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +13 -1
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts +7 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +15 -4
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/transportFactory.d.ts +4 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +1 -1
- package/build/transport/transportFactory.js.map +1 -1
- package/build/utils/appDiscovery.d.ts +75 -0
- package/build/utils/appDiscovery.d.ts.map +1 -0
- package/build/utils/appDiscovery.js +358 -0
- package/build/utils/appDiscovery.js.map +1 -0
- package/build/utils/appPresets.d.ts +88 -0
- package/build/utils/appPresets.d.ts.map +1 -0
- package/build/utils/appPresets.js +430 -0
- package/build/utils/appPresets.js.map +1 -0
- package/build/utils/backupManager.d.ts +61 -0
- package/build/utils/backupManager.d.ts.map +1 -0
- package/build/utils/backupManager.js +314 -0
- package/build/utils/backupManager.js.map +1 -0
- package/build/utils/urlDetection.d.ts +35 -0
- package/build/utils/urlDetection.d.ts.map +1 -0
- package/build/utils/urlDetection.js +115 -0
- package/build/utils/urlDetection.js.map +1 -0
- package/build/utils/validationHelpers.d.ts +62 -0
- package/build/utils/validationHelpers.d.ts.map +1 -0
- package/build/utils/validationHelpers.js +252 -0
- package/build/utils/validationHelpers.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { serverExists, getServer, setServer, parseEnvVars, parseHeaders, parseTags, validateConfigPath, backupConfig, reloadMcpConfig, } from './utils/configUtils.js';
|
|
2
|
+
import { validateServerName, validateServerArgs, validateEnvVars, validateHeaders, validateTags, validateTimeout, } from './utils/validation.js';
|
|
3
|
+
/**
|
|
4
|
+
* Update an existing MCP server configuration
|
|
5
|
+
*/
|
|
6
|
+
export async function updateCommand(argv) {
|
|
7
|
+
try {
|
|
8
|
+
const { name, config: configPath } = argv;
|
|
9
|
+
console.log(`Updating MCP server: ${name}`);
|
|
10
|
+
// Validate inputs
|
|
11
|
+
validateServerName(name);
|
|
12
|
+
// Validate config path
|
|
13
|
+
validateConfigPath(configPath);
|
|
14
|
+
// Check if server exists
|
|
15
|
+
if (!serverExists(name, configPath)) {
|
|
16
|
+
throw new Error(`Server '${name}' does not exist. Use 'mcp add' to create it first.`);
|
|
17
|
+
}
|
|
18
|
+
// Get current server configuration
|
|
19
|
+
const currentConfig = getServer(name, configPath);
|
|
20
|
+
if (!currentConfig) {
|
|
21
|
+
throw new Error(`Failed to retrieve server '${name}' configuration.`);
|
|
22
|
+
}
|
|
23
|
+
// Create updated configuration starting from current config
|
|
24
|
+
const updatedConfig = { ...currentConfig };
|
|
25
|
+
// Track changes for reporting
|
|
26
|
+
const changes = [];
|
|
27
|
+
// Update type if provided
|
|
28
|
+
if (argv.type !== undefined && argv.type !== currentConfig.type) {
|
|
29
|
+
// Validate the new type with provided args
|
|
30
|
+
validateServerArgs(argv.type, argv);
|
|
31
|
+
updatedConfig.type = argv.type;
|
|
32
|
+
changes.push(`type: ${currentConfig.type} → ${argv.type}`);
|
|
33
|
+
// Clear type-specific properties when changing type
|
|
34
|
+
if (currentConfig.type === 'stdio' && (argv.type === 'http' || argv.type === 'sse')) {
|
|
35
|
+
// Switching from stdio to HTTP/SSE
|
|
36
|
+
delete updatedConfig.command;
|
|
37
|
+
delete updatedConfig.args;
|
|
38
|
+
delete updatedConfig.cwd;
|
|
39
|
+
if (!argv.url) {
|
|
40
|
+
throw new Error(`URL is required when changing to ${argv.type} server`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if ((currentConfig.type === 'http' || currentConfig.type === 'sse') && argv.type === 'stdio') {
|
|
44
|
+
// Switching from HTTP/SSE to stdio
|
|
45
|
+
delete updatedConfig.url;
|
|
46
|
+
delete updatedConfig.headers;
|
|
47
|
+
if (!argv.command) {
|
|
48
|
+
throw new Error('Command is required when changing to stdio server');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Update type-specific properties
|
|
53
|
+
const effectiveType = updatedConfig.type;
|
|
54
|
+
if (effectiveType === 'stdio') {
|
|
55
|
+
if (argv.command !== undefined) {
|
|
56
|
+
if (argv.command !== currentConfig.command) {
|
|
57
|
+
changes.push(`command: ${currentConfig.command || '(none)'} → ${argv.command}`);
|
|
58
|
+
}
|
|
59
|
+
updatedConfig.command = argv.command;
|
|
60
|
+
}
|
|
61
|
+
if (argv.args !== undefined) {
|
|
62
|
+
const oldArgs = currentConfig.args || [];
|
|
63
|
+
const newArgs = argv.args;
|
|
64
|
+
if (JSON.stringify(oldArgs) !== JSON.stringify(newArgs)) {
|
|
65
|
+
changes.push(`args: [${oldArgs.join(', ')}] → [${newArgs.join(', ')}]`);
|
|
66
|
+
}
|
|
67
|
+
updatedConfig.args = newArgs.length > 0 ? newArgs : undefined;
|
|
68
|
+
}
|
|
69
|
+
if (argv.cwd !== undefined) {
|
|
70
|
+
if (argv.cwd !== currentConfig.cwd) {
|
|
71
|
+
changes.push(`cwd: ${currentConfig.cwd || '(none)'} → ${argv.cwd}`);
|
|
72
|
+
}
|
|
73
|
+
updatedConfig.cwd = argv.cwd;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (effectiveType === 'http' || effectiveType === 'sse') {
|
|
77
|
+
if (argv.url !== undefined) {
|
|
78
|
+
if (argv.url !== currentConfig.url) {
|
|
79
|
+
changes.push(`url: ${currentConfig.url || '(none)'} → ${argv.url}`);
|
|
80
|
+
}
|
|
81
|
+
updatedConfig.url = argv.url;
|
|
82
|
+
}
|
|
83
|
+
if (argv.headers !== undefined) {
|
|
84
|
+
validateHeaders(argv.headers);
|
|
85
|
+
const newHeaders = argv.headers.length > 0 ? parseHeaders(argv.headers) : undefined;
|
|
86
|
+
const oldHeaders = currentConfig.headers;
|
|
87
|
+
if (JSON.stringify(oldHeaders) !== JSON.stringify(newHeaders)) {
|
|
88
|
+
const oldCount = oldHeaders ? Object.keys(oldHeaders).length : 0;
|
|
89
|
+
const newCount = newHeaders ? Object.keys(newHeaders).length : 0;
|
|
90
|
+
changes.push(`headers: ${oldCount} header(s) → ${newCount} header(s)`);
|
|
91
|
+
}
|
|
92
|
+
updatedConfig.headers = newHeaders;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Update common properties
|
|
96
|
+
if (argv.env !== undefined) {
|
|
97
|
+
validateEnvVars(argv.env);
|
|
98
|
+
const newEnv = argv.env.length > 0 ? parseEnvVars(argv.env) : undefined;
|
|
99
|
+
const oldEnv = currentConfig.env;
|
|
100
|
+
if (JSON.stringify(oldEnv) !== JSON.stringify(newEnv)) {
|
|
101
|
+
const oldCount = oldEnv ? Object.keys(oldEnv).length : 0;
|
|
102
|
+
const newCount = newEnv ? Object.keys(newEnv).length : 0;
|
|
103
|
+
changes.push(`env: ${oldCount} variable(s) → ${newCount} variable(s)`);
|
|
104
|
+
}
|
|
105
|
+
updatedConfig.env = newEnv;
|
|
106
|
+
}
|
|
107
|
+
if (argv.tags !== undefined) {
|
|
108
|
+
validateTags(argv.tags);
|
|
109
|
+
const newTags = argv.tags ? parseTags(argv.tags) : undefined;
|
|
110
|
+
const oldTags = currentConfig.tags;
|
|
111
|
+
if (JSON.stringify(oldTags) !== JSON.stringify(newTags)) {
|
|
112
|
+
const oldTagsStr = oldTags ? oldTags.join(', ') : '(none)';
|
|
113
|
+
const newTagsStr = newTags ? newTags.join(', ') : '(none)';
|
|
114
|
+
changes.push(`tags: ${oldTagsStr} → ${newTagsStr}`);
|
|
115
|
+
}
|
|
116
|
+
updatedConfig.tags = newTags;
|
|
117
|
+
}
|
|
118
|
+
if (argv.timeout !== undefined) {
|
|
119
|
+
validateTimeout(argv.timeout);
|
|
120
|
+
if (argv.timeout !== currentConfig.timeout) {
|
|
121
|
+
changes.push(`timeout: ${currentConfig.timeout || '(none)'}ms → ${argv.timeout}ms`);
|
|
122
|
+
}
|
|
123
|
+
updatedConfig.timeout = argv.timeout;
|
|
124
|
+
}
|
|
125
|
+
// Check if any changes were made
|
|
126
|
+
if (changes.length === 0) {
|
|
127
|
+
console.log(`No changes specified for server '${name}'. Configuration remains unchanged.`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Final validation of the complete updated configuration
|
|
131
|
+
if (updatedConfig.type === 'stdio' && !updatedConfig.command) {
|
|
132
|
+
throw new Error('Command cannot be empty for stdio servers');
|
|
133
|
+
}
|
|
134
|
+
if ((updatedConfig.type === 'http' || updatedConfig.type === 'sse') && !updatedConfig.url) {
|
|
135
|
+
throw new Error(`URL cannot be empty for ${updatedConfig.type} servers`);
|
|
136
|
+
}
|
|
137
|
+
// Create backup
|
|
138
|
+
const backupPath = backupConfig(configPath);
|
|
139
|
+
// Save the updated configuration
|
|
140
|
+
setServer(name, updatedConfig, configPath);
|
|
141
|
+
// Reload MCP configuration
|
|
142
|
+
reloadMcpConfig(configPath);
|
|
143
|
+
// Success message
|
|
144
|
+
console.log(`✅ Successfully updated server '${name}'`);
|
|
145
|
+
console.log(` Changes made:`);
|
|
146
|
+
for (const change of changes) {
|
|
147
|
+
console.log(` • ${change}`);
|
|
148
|
+
}
|
|
149
|
+
console.log(` Backup created: ${backupPath}`);
|
|
150
|
+
console.log(`\n💡 Server configuration updated. If 1mcp is running, the server will be reloaded automatically.`);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error(`❌ Failed to update server: ${error instanceof Error ? error.message : error}`);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/mcp/update.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAgB/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAE5C,kBAAkB;QAClB,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEzB,uBAAuB;QACvB,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE/B,yBAAyB;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,qDAAqD,CAAC,CAAC;QACxF,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,kBAAkB,CAAC,CAAC;QACxE,CAAC;QAED,4DAA4D;QAC5D,MAAM,aAAa,GAAoB,EAAE,GAAG,aAAa,EAAE,CAAC;QAE5D,8BAA8B;QAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,0BAA0B;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;YAChE,2CAA2C;YAC3C,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEpC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,IAAgC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,SAAS,aAAa,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAE3D,oDAAoD;YACpD,IAAI,aAAa,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACpF,mCAAmC;gBACnC,OAAO,aAAa,CAAC,OAAO,CAAC;gBAC7B,OAAO,aAAa,CAAC,IAAI,CAAC;gBAC1B,OAAO,aAAa,CAAC,GAAG,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACpG,mCAAmC;gBACnC,OAAO,aAAa,CAAC,GAAG,CAAC;gBACzB,OAAO,aAAa,CAAC,OAAO,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,aAAa,GAAG,aAAa,CAAC,IAAgC,CAAC;QAErE,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,OAAO,IAAI,QAAQ,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClF,CAAC;gBACD,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvC,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1E,CAAC;gBACD,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,CAAC;YAED,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,aAAa,CAAC,GAAG,IAAI,QAAQ,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,GAAG,EAAE,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,aAAa,CAAC,GAAG,IAAI,QAAQ,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YAC/B,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC/B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpF,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC;gBAEzC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjE,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,gBAAgB,QAAQ,YAAY,CAAC,CAAC;gBACzE,CAAC;gBACD,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC;YACrC,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC;YAEjC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,QAAQ,QAAQ,kBAAkB,QAAQ,cAAc,CAAC,CAAC;YACzE,CAAC;YACD,aAAa,CAAC,GAAG,GAAG,MAAM,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC;YAEnC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,SAAS,UAAU,MAAM,UAAU,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,OAAO,IAAI,QAAQ,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YACtF,CAAC;YACD,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACvC,CAAC;QAED,iCAAiC;QACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,qCAAqC,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,yDAAyD;QACzD,IAAI,aAAa,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;YAC1F,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,CAAC,IAAI,UAAU,CAAC,CAAC;QAC3E,CAAC;QAED,gBAAgB;QAChB,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAE5C,iCAAiC;QACjC,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QAE3C,2BAA2B;QAC3B,eAAe,CAAC,UAAU,CAAC,CAAC;QAE5B,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,mGAAmG,CAAC,CAAC;IACnH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { MCPServerParams } from '../../../core/types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration file utilities for server management commands
|
|
4
|
+
*/
|
|
5
|
+
export interface ServerConfig {
|
|
6
|
+
mcpServers: Record<string, MCPServerParams>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Load the MCP configuration from a file
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadConfig(configPath?: string): ServerConfig;
|
|
12
|
+
/**
|
|
13
|
+
* Save the MCP configuration to a file
|
|
14
|
+
*/
|
|
15
|
+
export declare function saveConfig(config: ServerConfig, configPath?: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a server exists in the configuration
|
|
18
|
+
*/
|
|
19
|
+
export declare function serverExists(serverName: string, configPath?: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Get a specific server configuration
|
|
22
|
+
*/
|
|
23
|
+
export declare function getServer(serverName: string, configPath?: string): MCPServerParams | null;
|
|
24
|
+
/**
|
|
25
|
+
* Add or update a server in the configuration
|
|
26
|
+
*/
|
|
27
|
+
export declare function setServer(serverName: string, serverConfig: MCPServerParams, configPath?: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Remove a server from the configuration
|
|
30
|
+
*/
|
|
31
|
+
export declare function removeServer(serverName: string, configPath?: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get all servers in the configuration
|
|
34
|
+
*/
|
|
35
|
+
export declare function getAllServers(configPath?: string): Record<string, MCPServerParams>;
|
|
36
|
+
/**
|
|
37
|
+
* Parse environment variables from key=value format
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseEnvVars(envArray?: string[]): Record<string, string>;
|
|
40
|
+
/**
|
|
41
|
+
* Parse headers from key=value format
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseHeaders(headersArray?: string[]): Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* Parse tags from comma-separated string
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseTags(tagsString?: string): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Validate configuration file path
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateConfigPath(configPath?: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Create a backup of the configuration file
|
|
54
|
+
*/
|
|
55
|
+
export declare function backupConfig(configPath?: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Validate server configuration against schema
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateServerConfig(serverConfig: MCPServerParams): void;
|
|
60
|
+
/**
|
|
61
|
+
* Reload MCP config manager after configuration changes
|
|
62
|
+
*/
|
|
63
|
+
export declare function reloadMcpConfig(configPath?: string): void;
|
|
64
|
+
//# sourceMappingURL=configUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configUtils.d.ts","sourceRoot":"","sources":["../../../../src/commands/mcp/utils/configUtils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAsB5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAiB1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAO7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAOzF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAItG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAc7E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAOlF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwB5E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CASvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAYxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,CAkDxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CASzD"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { McpConfigManager } from '../../../config/mcpConfigManager.js';
|
|
4
|
+
import { getGlobalConfigPath } from '../../../constants.js';
|
|
5
|
+
import logger from '../../../logger/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Load the MCP configuration from a file
|
|
8
|
+
*/
|
|
9
|
+
export function loadConfig(configPath) {
|
|
10
|
+
const filePath = configPath || getGlobalConfigPath();
|
|
11
|
+
try {
|
|
12
|
+
if (!fs.existsSync(filePath)) {
|
|
13
|
+
throw new Error(`Configuration file not found: ${filePath}`);
|
|
14
|
+
}
|
|
15
|
+
const configData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
16
|
+
// Ensure mcpServers exists
|
|
17
|
+
if (!configData.mcpServers) {
|
|
18
|
+
configData.mcpServers = {};
|
|
19
|
+
}
|
|
20
|
+
return configData;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof SyntaxError) {
|
|
24
|
+
throw new Error(`Invalid JSON in configuration file: ${filePath}`);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Save the MCP configuration to a file
|
|
31
|
+
*/
|
|
32
|
+
export function saveConfig(config, configPath) {
|
|
33
|
+
const filePath = configPath || getGlobalConfigPath();
|
|
34
|
+
try {
|
|
35
|
+
// Ensure directory exists
|
|
36
|
+
const configDir = path.dirname(filePath);
|
|
37
|
+
if (!fs.existsSync(configDir)) {
|
|
38
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
// Write configuration with pretty formatting
|
|
41
|
+
fs.writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
42
|
+
logger.info(`Configuration saved to: ${filePath}`);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw new Error(`Failed to save configuration to ${filePath}: ${error}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a server exists in the configuration
|
|
50
|
+
*/
|
|
51
|
+
export function serverExists(serverName, configPath) {
|
|
52
|
+
try {
|
|
53
|
+
const config = loadConfig(configPath);
|
|
54
|
+
return serverName in config.mcpServers;
|
|
55
|
+
}
|
|
56
|
+
catch (_error) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get a specific server configuration
|
|
62
|
+
*/
|
|
63
|
+
export function getServer(serverName, configPath) {
|
|
64
|
+
try {
|
|
65
|
+
const config = loadConfig(configPath);
|
|
66
|
+
return config.mcpServers[serverName] || null;
|
|
67
|
+
}
|
|
68
|
+
catch (_error) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Add or update a server in the configuration
|
|
74
|
+
*/
|
|
75
|
+
export function setServer(serverName, serverConfig, configPath) {
|
|
76
|
+
const config = loadConfig(configPath);
|
|
77
|
+
config.mcpServers[serverName] = serverConfig;
|
|
78
|
+
saveConfig(config, configPath);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Remove a server from the configuration
|
|
82
|
+
*/
|
|
83
|
+
export function removeServer(serverName, configPath) {
|
|
84
|
+
try {
|
|
85
|
+
const config = loadConfig(configPath);
|
|
86
|
+
if (!(serverName in config.mcpServers)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
delete config.mcpServers[serverName];
|
|
90
|
+
saveConfig(config, configPath);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw new Error(`Failed to remove server ${serverName}: ${error}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get all servers in the configuration
|
|
99
|
+
*/
|
|
100
|
+
export function getAllServers(configPath) {
|
|
101
|
+
try {
|
|
102
|
+
const config = loadConfig(configPath);
|
|
103
|
+
return config.mcpServers;
|
|
104
|
+
}
|
|
105
|
+
catch (_error) {
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse environment variables from key=value format
|
|
111
|
+
*/
|
|
112
|
+
export function parseEnvVars(envArray) {
|
|
113
|
+
if (!envArray || envArray.length === 0) {
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
const env = {};
|
|
117
|
+
for (const envVar of envArray) {
|
|
118
|
+
const equalIndex = envVar.indexOf('=');
|
|
119
|
+
if (equalIndex === -1) {
|
|
120
|
+
throw new Error(`Invalid environment variable format: ${envVar}. Expected key=value`);
|
|
121
|
+
}
|
|
122
|
+
const key = envVar.substring(0, equalIndex).trim();
|
|
123
|
+
const value = envVar.substring(equalIndex + 1);
|
|
124
|
+
if (!key) {
|
|
125
|
+
throw new Error(`Invalid environment variable format: ${envVar}. Key cannot be empty`);
|
|
126
|
+
}
|
|
127
|
+
env[key] = value;
|
|
128
|
+
}
|
|
129
|
+
return env;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Parse headers from key=value format
|
|
133
|
+
*/
|
|
134
|
+
export function parseHeaders(headersArray) {
|
|
135
|
+
if (!headersArray || headersArray.length === 0) {
|
|
136
|
+
return {};
|
|
137
|
+
}
|
|
138
|
+
const headers = {};
|
|
139
|
+
for (const header of headersArray) {
|
|
140
|
+
const colonIndex = header.indexOf('=');
|
|
141
|
+
if (colonIndex === -1) {
|
|
142
|
+
throw new Error(`Invalid header format: ${header}. Expected key=value`);
|
|
143
|
+
}
|
|
144
|
+
const key = header.substring(0, colonIndex).trim();
|
|
145
|
+
const value = header.substring(colonIndex + 1);
|
|
146
|
+
if (!key) {
|
|
147
|
+
throw new Error(`Invalid header format: ${header}. Key cannot be empty`);
|
|
148
|
+
}
|
|
149
|
+
headers[key] = value;
|
|
150
|
+
}
|
|
151
|
+
return headers;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Parse tags from comma-separated string
|
|
155
|
+
*/
|
|
156
|
+
export function parseTags(tagsString) {
|
|
157
|
+
if (!tagsString) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
return tagsString
|
|
161
|
+
.split(',')
|
|
162
|
+
.map((tag) => tag.trim())
|
|
163
|
+
.filter((tag) => tag.length > 0);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Validate configuration file path
|
|
167
|
+
*/
|
|
168
|
+
export function validateConfigPath(configPath) {
|
|
169
|
+
const filePath = configPath || getGlobalConfigPath();
|
|
170
|
+
try {
|
|
171
|
+
// Check if file exists
|
|
172
|
+
if (!fs.existsSync(filePath)) {
|
|
173
|
+
throw new Error(`Configuration file not found: ${filePath}`);
|
|
174
|
+
}
|
|
175
|
+
// Check if file is readable
|
|
176
|
+
fs.accessSync(filePath, fs.constants.R_OK);
|
|
177
|
+
// Check if file is writable
|
|
178
|
+
fs.accessSync(filePath, fs.constants.W_OK);
|
|
179
|
+
return filePath;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`Cannot access configuration file: ${filePath}. ${error}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create a backup of the configuration file
|
|
190
|
+
*/
|
|
191
|
+
export function backupConfig(configPath) {
|
|
192
|
+
const filePath = configPath || getGlobalConfigPath();
|
|
193
|
+
const timestamp = Date.now();
|
|
194
|
+
const backupPath = `${filePath}.backup.${timestamp}`;
|
|
195
|
+
try {
|
|
196
|
+
fs.copyFileSync(filePath, backupPath);
|
|
197
|
+
logger.info(`Configuration backed up to: ${backupPath}`);
|
|
198
|
+
return backupPath;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
throw new Error(`Failed to create backup: ${error}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Validate server configuration against schema
|
|
206
|
+
*/
|
|
207
|
+
export function validateServerConfig(serverConfig) {
|
|
208
|
+
// Basic validation - type is required
|
|
209
|
+
if (!serverConfig.type) {
|
|
210
|
+
throw new Error('Server type is required');
|
|
211
|
+
}
|
|
212
|
+
// Validate based on type
|
|
213
|
+
switch (serverConfig.type) {
|
|
214
|
+
case 'stdio':
|
|
215
|
+
if (!serverConfig.command) {
|
|
216
|
+
throw new Error('Command is required for stdio servers');
|
|
217
|
+
}
|
|
218
|
+
break;
|
|
219
|
+
case 'http':
|
|
220
|
+
case 'sse':
|
|
221
|
+
if (!serverConfig.url) {
|
|
222
|
+
throw new Error(`URL is required for ${serverConfig.type} servers`);
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
new URL(serverConfig.url);
|
|
226
|
+
}
|
|
227
|
+
catch (_error) {
|
|
228
|
+
throw new Error(`Invalid URL format: ${serverConfig.url}`);
|
|
229
|
+
}
|
|
230
|
+
break;
|
|
231
|
+
default:
|
|
232
|
+
throw new Error(`Unsupported server type: ${serverConfig.type}`);
|
|
233
|
+
}
|
|
234
|
+
// Validate timeout if provided
|
|
235
|
+
if (serverConfig.timeout !== undefined) {
|
|
236
|
+
if (typeof serverConfig.timeout !== 'number' || serverConfig.timeout < 0) {
|
|
237
|
+
throw new Error('Timeout must be a positive number');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Validate tags if provided
|
|
241
|
+
if (serverConfig.tags !== undefined) {
|
|
242
|
+
if (!Array.isArray(serverConfig.tags)) {
|
|
243
|
+
throw new Error('Tags must be an array');
|
|
244
|
+
}
|
|
245
|
+
for (const tag of serverConfig.tags) {
|
|
246
|
+
if (typeof tag !== 'string' || tag.trim().length === 0) {
|
|
247
|
+
throw new Error('All tags must be non-empty strings');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Reload MCP config manager after configuration changes
|
|
254
|
+
*/
|
|
255
|
+
export function reloadMcpConfig(configPath) {
|
|
256
|
+
try {
|
|
257
|
+
// Get the config manager instance and reload it
|
|
258
|
+
const configManager = McpConfigManager.getInstance(configPath);
|
|
259
|
+
configManager.reloadConfig();
|
|
260
|
+
logger.info('MCP configuration reloaded');
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
logger.warn(`Failed to reload MCP configuration: ${error}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=configUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configUtils.js","sourceRoot":"","sources":["../../../../src/commands/mcp/utils/configUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for parsing " -- " style arguments in MCP commands
|
|
3
|
+
*
|
|
4
|
+
* Handles the pattern: mcp add server-name --env KEY=value -- npx -y package-name
|
|
5
|
+
* Where everything after " -- " becomes the command and its arguments
|
|
6
|
+
*/
|
|
7
|
+
export interface DoubleHyphenParseResult {
|
|
8
|
+
command?: string;
|
|
9
|
+
args?: string[];
|
|
10
|
+
type?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse command line arguments that use the " -- " pattern
|
|
14
|
+
* @param rawArgs Raw command line arguments from yargs
|
|
15
|
+
* @returns Parsed command, args, and inferred type
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseDoubleHyphenArgs(rawArgs: string[]): DoubleHyphenParseResult;
|
|
18
|
+
/**
|
|
19
|
+
* Check if the command line arguments contain the " -- " pattern
|
|
20
|
+
* @param rawArgs Raw command line arguments
|
|
21
|
+
* @returns True if " -- " is present
|
|
22
|
+
*/
|
|
23
|
+
export declare function hasDoubleHyphen(rawArgs: string[]): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Merge double hyphen parsed arguments with existing yargs arguments
|
|
26
|
+
* Prioritizes explicit flags over " -- " inferred values
|
|
27
|
+
* @param yargsArgs Parsed arguments from yargs
|
|
28
|
+
* @param doubleHyphenResult Parsed " -- " arguments
|
|
29
|
+
* @returns Merged arguments
|
|
30
|
+
*/
|
|
31
|
+
export declare function mergeDoubleHyphenArgs<T extends Record<string, any>>(yargsArgs: T, doubleHyphenResult: DoubleHyphenParseResult): T;
|
|
32
|
+
//# sourceMappingURL=doubleHyphenParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubleHyphenParser.d.ts","sourceRoot":"","sources":["../../../../src/commands/mcp/utils/doubleHyphenParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAyBhF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjE,SAAS,EAAE,CAAC,EACZ,kBAAkB,EAAE,uBAAuB,GAC1C,CAAC,CAiBH"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for parsing " -- " style arguments in MCP commands
|
|
3
|
+
*
|
|
4
|
+
* Handles the pattern: mcp add server-name --env KEY=value -- npx -y package-name
|
|
5
|
+
* Where everything after " -- " becomes the command and its arguments
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Parse command line arguments that use the " -- " pattern
|
|
9
|
+
* @param rawArgs Raw command line arguments from yargs
|
|
10
|
+
* @returns Parsed command, args, and inferred type
|
|
11
|
+
*/
|
|
12
|
+
export function parseDoubleHyphenArgs(rawArgs) {
|
|
13
|
+
const doubleHyphenIndex = rawArgs.findIndex((arg) => arg === '--');
|
|
14
|
+
if (doubleHyphenIndex === -1) {
|
|
15
|
+
// No " -- " found, return empty result
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
// Extract everything after " -- "
|
|
19
|
+
const commandArgs = rawArgs.slice(doubleHyphenIndex + 1);
|
|
20
|
+
if (commandArgs.length === 0) {
|
|
21
|
+
throw new Error('No command specified after " -- "');
|
|
22
|
+
}
|
|
23
|
+
const [command, ...args] = commandArgs;
|
|
24
|
+
// For stdio servers, we infer the type as 'stdio' since they use executable commands
|
|
25
|
+
const type = 'stdio';
|
|
26
|
+
return {
|
|
27
|
+
command,
|
|
28
|
+
args: args.length > 0 ? args : undefined,
|
|
29
|
+
type,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if the command line arguments contain the " -- " pattern
|
|
34
|
+
* @param rawArgs Raw command line arguments
|
|
35
|
+
* @returns True if " -- " is present
|
|
36
|
+
*/
|
|
37
|
+
export function hasDoubleHyphen(rawArgs) {
|
|
38
|
+
return rawArgs.includes('--');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Merge double hyphen parsed arguments with existing yargs arguments
|
|
42
|
+
* Prioritizes explicit flags over " -- " inferred values
|
|
43
|
+
* @param yargsArgs Parsed arguments from yargs
|
|
44
|
+
* @param doubleHyphenResult Parsed " -- " arguments
|
|
45
|
+
* @returns Merged arguments
|
|
46
|
+
*/
|
|
47
|
+
export function mergeDoubleHyphenArgs(yargsArgs, doubleHyphenResult) {
|
|
48
|
+
const merged = { ...yargsArgs };
|
|
49
|
+
// Only set values if they're not already explicitly provided
|
|
50
|
+
if (!merged.type && doubleHyphenResult.type) {
|
|
51
|
+
merged.type = doubleHyphenResult.type;
|
|
52
|
+
}
|
|
53
|
+
if (!merged.command && doubleHyphenResult.command) {
|
|
54
|
+
merged.command = doubleHyphenResult.command;
|
|
55
|
+
}
|
|
56
|
+
if (!merged.args && doubleHyphenResult.args) {
|
|
57
|
+
merged.args = doubleHyphenResult.args;
|
|
58
|
+
}
|
|
59
|
+
return merged;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=doubleHyphenParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubleHyphenParser.js","sourceRoot":"","sources":["../../../../src/commands/mcp/utils/doubleHyphenParser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAiB;IACrD,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAEnE,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7B,uCAAuC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kCAAkC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;IAEzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;IAEvC,qFAAqF;IACrF,MAAM,IAAI,GAAG,OAAO,CAAC;IAErB,OAAO;QACL,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACxC,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAiB;IAC/C,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAY,EACZ,kBAA2C;IAE3C,MAAM,MAAM,GAAG,EAAE,GAAG,SAAS,EAAS,CAAC;IAEvC,6DAA6D;IAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { MCPServerParams } from '../../../core/types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validation utilities for server command inputs
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Validate server name format
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateServerName(name: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Validate command line arguments for different server types
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateServerArgs(type: string, args: any): void;
|
|
13
|
+
/**
|
|
14
|
+
* Validate environment variables
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateEnvVars(envArray?: string[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Validate headers
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateHeaders(headersArray?: string[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Validate tags
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateTags(tagsString?: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Validate timeout value
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateTimeout(timeout?: number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Validate complete server configuration
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateCompleteServerConfig(name: string, config: MCPServerParams): void;
|
|
33
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/commands/mcp/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAsBrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAYhE;AA2DD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAsCzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAqC7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAmCtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAetD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA6BxF"}
|