@spences10/pi-mcp 0.0.24 → 0.0.26
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/backup-restore.d.ts +9 -0
- package/dist/backup-restore.js +56 -0
- package/dist/backup-restore.js.map +1 -0
- package/dist/command-router.d.ts +11 -0
- package/dist/command-router.js +140 -0
- package/dist/command-router.js.map +1 -0
- package/dist/config/loading.d.ts +3 -0
- package/dist/config/loading.js +41 -0
- package/dist/config/loading.js.map +1 -0
- package/dist/config/persistence.d.ts +15 -0
- package/dist/config/persistence.js +153 -0
- package/dist/config/persistence.js.map +1 -0
- package/dist/config/profiles.d.ts +4 -0
- package/dist/config/profiles.js +79 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/config/types.d.ts +62 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +3 -0
- package/dist/config/validation.js +80 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/index.js +10 -316
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +16 -0
- package/dist/lifecycle.js +190 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/profile-actions.d.ts +5 -0
- package/dist/profile-actions.js +144 -0
- package/dist/profile-actions.js.map +1 -0
- package/dist/ui.d.ts +6 -0
- package/dist/ui.js +121 -0
- package/dist/ui.js.map +1 -0
- package/package.json +9 -5
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
export declare function reload_after_config_change(ctx: ExtensionCommandContext, message: string): Promise<void>;
|
|
3
|
+
export declare function handle_mcp_backup(ctx: ExtensionCommandContext): Promise<void>;
|
|
4
|
+
export declare function confirm_mcp_action(ctx: ExtensionCommandContext, options: {
|
|
5
|
+
title: string;
|
|
6
|
+
message: string;
|
|
7
|
+
confirm_label?: string;
|
|
8
|
+
}): Promise<boolean>;
|
|
9
|
+
export declare function handle_mcp_restore(ctx: ExtensionCommandContext, requested_file?: string): Promise<boolean>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { show_confirm_modal, show_picker_modal, } from '@spences10/pi-tui-modal';
|
|
2
|
+
import { create_mcp_config_backup, list_mcp_config_backups, restore_mcp_config_backup, } from './config.js';
|
|
3
|
+
export async function reload_after_config_change(ctx, message) {
|
|
4
|
+
ctx.ui.notify(`${message} Reloading MCP extension...`, 'info');
|
|
5
|
+
await ctx.reload();
|
|
6
|
+
}
|
|
7
|
+
export async function handle_mcp_backup(ctx) {
|
|
8
|
+
const backup = create_mcp_config_backup(ctx.cwd);
|
|
9
|
+
ctx.ui.notify(`MCP backup created: ${backup.filename} (${backup.global_server_count} global, ${backup.project_server_count} project servers)`, 'info');
|
|
10
|
+
}
|
|
11
|
+
export async function confirm_mcp_action(ctx, options) {
|
|
12
|
+
if (!ctx.hasUI) {
|
|
13
|
+
return await ctx.ui.confirm(options.title, options.message);
|
|
14
|
+
}
|
|
15
|
+
return await show_confirm_modal(ctx, {
|
|
16
|
+
title: options.title,
|
|
17
|
+
message: options.message,
|
|
18
|
+
confirm_label: options.confirm_label,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function handle_mcp_restore(ctx, requested_file) {
|
|
22
|
+
const backups = list_mcp_config_backups();
|
|
23
|
+
if (backups.length === 0) {
|
|
24
|
+
ctx.ui.notify('No MCP backups found', 'warning');
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
let selected_path = requested_file
|
|
28
|
+
? backups.find((backup) => backup.filename === requested_file ||
|
|
29
|
+
backup.path === requested_file)?.path
|
|
30
|
+
: undefined;
|
|
31
|
+
if (!selected_path) {
|
|
32
|
+
selected_path = await show_picker_modal(ctx, {
|
|
33
|
+
title: 'Restore MCP backup',
|
|
34
|
+
subtitle: 'Restores global and project MCP config exactly as captured',
|
|
35
|
+
items: backups.map((backup) => ({
|
|
36
|
+
value: backup.path,
|
|
37
|
+
label: backup.filename,
|
|
38
|
+
description: `${backup.global_server_count} global • ${backup.project_server_count} project • ${backup.created_at}`,
|
|
39
|
+
})),
|
|
40
|
+
empty_message: 'No MCP backups found',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (!selected_path)
|
|
44
|
+
return false;
|
|
45
|
+
const confirmed = await confirm_mcp_action(ctx, {
|
|
46
|
+
title: 'Restore MCP backup?',
|
|
47
|
+
message: 'This replaces current global/project MCP config with the selected backup.',
|
|
48
|
+
confirm_label: 'Restore backup',
|
|
49
|
+
});
|
|
50
|
+
if (!confirmed)
|
|
51
|
+
return false;
|
|
52
|
+
const restored = restore_mcp_config_backup(ctx.cwd, selected_path);
|
|
53
|
+
await reload_after_config_change(ctx, `Restored ${restored.filename}.`);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=backup-restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-restore.js","sourceRoot":"","sources":["../src/backup-restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { McpLifecycle } from './lifecycle.js';
|
|
3
|
+
export interface McpCommand {
|
|
4
|
+
description: string;
|
|
5
|
+
getArgumentCompletions(prefix: string): Array<{
|
|
6
|
+
value: string;
|
|
7
|
+
label: string;
|
|
8
|
+
}> | null;
|
|
9
|
+
handler(args: string, ctx: ExtensionCommandContext): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function create_mcp_command(lifecycle: McpLifecycle): McpCommand;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { handle_mcp_backup, handle_mcp_restore, } from './backup-restore.js';
|
|
2
|
+
import { handle_mcp_profile } from './profile-actions.js';
|
|
3
|
+
import { update_mcp_status } from './server-state.js';
|
|
4
|
+
import { format_mcp_server_list, show_mcp_home_modal, show_mcp_server_modal, show_mcp_text_modal, } from './ui.js';
|
|
5
|
+
export function create_mcp_command(lifecycle) {
|
|
6
|
+
return {
|
|
7
|
+
description: 'Manage MCP servers (modal, list, enable, disable, backup, restore, profiles)',
|
|
8
|
+
getArgumentCompletions: (prefix) => {
|
|
9
|
+
const parts = prefix.split(' ');
|
|
10
|
+
if (parts.length <= 1) {
|
|
11
|
+
return [
|
|
12
|
+
'manage',
|
|
13
|
+
'list',
|
|
14
|
+
'enable',
|
|
15
|
+
'disable',
|
|
16
|
+
'backup',
|
|
17
|
+
'restore',
|
|
18
|
+
'profile',
|
|
19
|
+
'profiles',
|
|
20
|
+
]
|
|
21
|
+
.filter((s) => s.startsWith(prefix))
|
|
22
|
+
.map((s) => ({ value: s, label: s }));
|
|
23
|
+
}
|
|
24
|
+
if (parts[0] === 'profile') {
|
|
25
|
+
return ['list', 'save', 'load']
|
|
26
|
+
.filter((s) => s.startsWith(parts[1] || ''))
|
|
27
|
+
.map((s) => ({ value: `profile ${s}`, label: s }));
|
|
28
|
+
}
|
|
29
|
+
if (parts[0] === 'enable' || parts[0] === 'disable') {
|
|
30
|
+
const name_prefix = parts[1] || '';
|
|
31
|
+
return Array.from(lifecycle.servers.keys())
|
|
32
|
+
.filter((n) => n.startsWith(name_prefix))
|
|
33
|
+
.map((n) => ({
|
|
34
|
+
value: `${parts[0]} ${n}`,
|
|
35
|
+
label: n,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
},
|
|
40
|
+
handler: async (args, ctx) => {
|
|
41
|
+
await lifecycle.ensure_servers(ctx.cwd, ctx);
|
|
42
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
43
|
+
if (parts.length === 0 && ctx.hasUI) {
|
|
44
|
+
await handle_modal_command(ctx, lifecycle);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const [sub, ...rest] = parts;
|
|
48
|
+
const name = rest.join(' ');
|
|
49
|
+
switch (sub || 'manage') {
|
|
50
|
+
case 'manage':
|
|
51
|
+
case 'toggle': {
|
|
52
|
+
if (await show_mcp_server_modal(ctx, lifecycle.servers, (name, enabled, command_ctx) => lifecycle.set_server_enabled(name, enabled, command_ctx)))
|
|
53
|
+
return;
|
|
54
|
+
ctx.ui.notify('MCP modal requires interactive mode', 'warning');
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case 'backup': {
|
|
58
|
+
await handle_mcp_backup(ctx);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'restore': {
|
|
62
|
+
await handle_mcp_restore(ctx, rest.join(' ') || undefined);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case 'profile':
|
|
66
|
+
case 'profiles': {
|
|
67
|
+
await handle_mcp_profile(ctx, sub === 'profiles' ? ['list', ...rest] : rest);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case 'list': {
|
|
71
|
+
const text = format_mcp_server_list(lifecycle.servers);
|
|
72
|
+
update_mcp_status(ctx, lifecycle.servers);
|
|
73
|
+
if (ctx.hasUI)
|
|
74
|
+
await show_mcp_text_modal(ctx, 'MCP servers', text);
|
|
75
|
+
else
|
|
76
|
+
ctx.ui.notify(text);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'enable': {
|
|
80
|
+
const server = lifecycle.servers.get(name);
|
|
81
|
+
if (!server) {
|
|
82
|
+
ctx.ui.notify(`Unknown server: ${name}`, 'warning');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (server.enabled && server.status !== 'failed') {
|
|
86
|
+
ctx.ui.notify(`${name} already enabled`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
lifecycle.set_server_enabled(name, true, ctx);
|
|
90
|
+
ctx.ui.notify(server.status === 'connected'
|
|
91
|
+
? `Enabled ${name}`
|
|
92
|
+
: `Enabling ${name} and connecting in background`);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'disable': {
|
|
96
|
+
const server = lifecycle.servers.get(name);
|
|
97
|
+
if (!server) {
|
|
98
|
+
ctx.ui.notify(`Unknown server: ${name}`, 'warning');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (!server.enabled) {
|
|
102
|
+
ctx.ui.notify(`${name} already disabled`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
lifecycle.set_server_enabled(name, false, ctx);
|
|
106
|
+
ctx.ui.notify(`Disabled ${name}`);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
default:
|
|
110
|
+
ctx.ui.notify(`Unknown subcommand: ${sub}. Use manage, list, enable, disable, backup, restore, or profile.`, 'warning');
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async function handle_modal_command(ctx, lifecycle) {
|
|
116
|
+
let selected;
|
|
117
|
+
while ((selected = await show_mcp_home_modal(ctx, lifecycle.servers))) {
|
|
118
|
+
if (selected === 'manage') {
|
|
119
|
+
await show_mcp_server_modal(ctx, lifecycle.servers, (name, enabled, command_ctx) => lifecycle.set_server_enabled(name, enabled, command_ctx));
|
|
120
|
+
}
|
|
121
|
+
else if (selected === 'list') {
|
|
122
|
+
update_mcp_status(ctx, lifecycle.servers);
|
|
123
|
+
await show_mcp_text_modal(ctx, 'MCP servers', format_mcp_server_list(lifecycle.servers));
|
|
124
|
+
}
|
|
125
|
+
else if (selected === 'backup') {
|
|
126
|
+
await handle_mcp_backup(ctx);
|
|
127
|
+
}
|
|
128
|
+
else if (selected === 'restore') {
|
|
129
|
+
if (await handle_mcp_restore(ctx))
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
else if (selected.startsWith('profile ')) {
|
|
133
|
+
if (await handle_mcp_profile(ctx, selected.split(/\s+/).slice(1))) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
await lifecycle.ensure_servers(ctx.cwd, ctx);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=command-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-router.js","sourceRoot":"","sources":["../src/command-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LoadMcpConfigOptions, McpProjectConfigInfo, McpServerConfig } from './types.js';
|
|
2
|
+
export declare function get_project_mcp_config_info(cwd: string): McpProjectConfigInfo | undefined;
|
|
3
|
+
export declare function load_mcp_config(cwd: string, options?: LoadMcpConfigOptions): McpServerConfig[];
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { global_mcp_config_path, project_mcp_config_path, read_config, } from './persistence.js';
|
|
4
|
+
import { parse_server, summarize_server_entry, } from './validation.js';
|
|
5
|
+
export function get_project_mcp_config_info(cwd) {
|
|
6
|
+
const path = project_mcp_config_path(cwd);
|
|
7
|
+
if (!existsSync(path))
|
|
8
|
+
return undefined;
|
|
9
|
+
const raw = readFileSync(path, 'utf-8');
|
|
10
|
+
const hash = createHash('sha256').update(raw).digest('hex');
|
|
11
|
+
let servers = [];
|
|
12
|
+
try {
|
|
13
|
+
const config = JSON.parse(raw);
|
|
14
|
+
servers = Object.entries(config.mcpServers || {}).map(([name, server]) => ({
|
|
15
|
+
name,
|
|
16
|
+
summary: summarize_server_entry(server),
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
servers = [];
|
|
21
|
+
}
|
|
22
|
+
return { path, hash, servers };
|
|
23
|
+
}
|
|
24
|
+
export function load_mcp_config(cwd, options = {}) {
|
|
25
|
+
const global_servers = read_config(global_mcp_config_path());
|
|
26
|
+
const project_servers = options.include_project === false
|
|
27
|
+
? {}
|
|
28
|
+
: read_config(project_mcp_config_path(cwd));
|
|
29
|
+
const merged_names = new Set([
|
|
30
|
+
...Object.keys(global_servers),
|
|
31
|
+
...Object.keys(project_servers),
|
|
32
|
+
]);
|
|
33
|
+
return Array.from(merged_names).map((name) => {
|
|
34
|
+
const project_server = project_servers[name];
|
|
35
|
+
if (project_server) {
|
|
36
|
+
return parse_server(name, project_server, options.project_metadata_trusted !== false);
|
|
37
|
+
}
|
|
38
|
+
return parse_server(name, global_servers[name]);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.js","sourceRoot":"","sources":["../../src/config/loading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,GACX,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACN,YAAY,EACZ,sBAAsB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,UAAU,2BAA2B,CAC1C,GAAW;IAEX,MAAM,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,GAAoC,EAAE,CAAC;IAClD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QACnD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CACpD,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACpB,IAAI;YACJ,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC;SACvC,CAAC,CACF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,GAAG,EAAE,CAAC;IACd,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,GAAW,EACX,UAAgC,EAAE;IAElC,MAAM,cAAc,GAAG,WAAW,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC7D,MAAM,eAAe,GACpB,OAAO,CAAC,eAAe,KAAK,KAAK;QAChC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;QAC5B,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QAC9B,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;KAC/B,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5C,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,cAAc,EAAE,CAAC;YACpB,OAAO,YAAY,CAClB,IAAI,EACJ,cAAc,EACd,OAAO,CAAC,wBAAwB,KAAK,KAAK,CAC1C,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { McpBackupInfo, RawMcpConfigFile, RawMcpServerEntry, StoredMcpConfigFile } from './types.js';
|
|
2
|
+
export declare function read_config_file(path: string): StoredMcpConfigFile;
|
|
3
|
+
export declare function write_config_file(path: string, config: StoredMcpConfigFile): void;
|
|
4
|
+
export declare function read_config(path: string): RawMcpConfigFile['mcpServers'];
|
|
5
|
+
export declare function project_mcp_config_path(cwd: string): string;
|
|
6
|
+
export declare function global_mcp_config_path(): string;
|
|
7
|
+
export declare function mcp_backups_dir(): string;
|
|
8
|
+
export declare function mcp_profiles_dir(): string;
|
|
9
|
+
export declare function timestamp_for_filename(date?: Date): string;
|
|
10
|
+
export declare function parse_created_at_from_backup_filename(filename: string): string;
|
|
11
|
+
export declare function set_mcp_server_enabled(cwd: string, name: string, enabled: boolean): boolean;
|
|
12
|
+
export declare function create_mcp_config_backup(cwd: string): McpBackupInfo;
|
|
13
|
+
export declare function list_mcp_config_backups(): McpBackupInfo[];
|
|
14
|
+
export declare function restore_mcp_config_backup(cwd: string, path: string): McpBackupInfo;
|
|
15
|
+
export declare function merged_mcp_servers(cwd: string): Record<string, RawMcpServerEntry>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { getAgentDir } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
export function read_config_file(path) {
|
|
5
|
+
if (!existsSync(path))
|
|
6
|
+
return { mcpServers: {} };
|
|
7
|
+
const raw = readFileSync(path, 'utf-8');
|
|
8
|
+
const config = JSON.parse(raw);
|
|
9
|
+
return {
|
|
10
|
+
...config,
|
|
11
|
+
mcpServers: config.mcpServers || {},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function write_config_file(path, config) {
|
|
15
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
16
|
+
const tmp_path = join(dirname(path), `.${Date.now()}.tmp`);
|
|
17
|
+
writeFileSync(tmp_path, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
|
|
18
|
+
renameSync(tmp_path, path);
|
|
19
|
+
}
|
|
20
|
+
export function read_config(path) {
|
|
21
|
+
return read_config_file(path).mcpServers;
|
|
22
|
+
}
|
|
23
|
+
export function project_mcp_config_path(cwd) {
|
|
24
|
+
return join(cwd, 'mcp.json');
|
|
25
|
+
}
|
|
26
|
+
export function global_mcp_config_path() {
|
|
27
|
+
return join(getAgentDir(), 'mcp.json');
|
|
28
|
+
}
|
|
29
|
+
export function mcp_backups_dir() {
|
|
30
|
+
return join(getAgentDir(), 'mcp-backups');
|
|
31
|
+
}
|
|
32
|
+
export function mcp_profiles_dir() {
|
|
33
|
+
return join(getAgentDir(), 'mcp-profiles');
|
|
34
|
+
}
|
|
35
|
+
export function timestamp_for_filename(date = new Date()) {
|
|
36
|
+
return date.toISOString().replace(/[:.]/g, '-');
|
|
37
|
+
}
|
|
38
|
+
export function parse_created_at_from_backup_filename(filename) {
|
|
39
|
+
return filename
|
|
40
|
+
.replace(/^mcp-config-/, '')
|
|
41
|
+
.replace(/\.json$/, '')
|
|
42
|
+
.replace(/^(\d{4}-\d{2}-\d{2}T\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/, '$1:$2:$3.$4Z');
|
|
43
|
+
}
|
|
44
|
+
function find_server_config_path(cwd, name) {
|
|
45
|
+
const project_path = project_mcp_config_path(cwd);
|
|
46
|
+
if (read_config(project_path)[name])
|
|
47
|
+
return project_path;
|
|
48
|
+
const global_path = global_mcp_config_path();
|
|
49
|
+
if (read_config(global_path)[name])
|
|
50
|
+
return global_path;
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
export function set_mcp_server_enabled(cwd, name, enabled) {
|
|
54
|
+
const path = find_server_config_path(cwd, name);
|
|
55
|
+
if (!path)
|
|
56
|
+
return false;
|
|
57
|
+
const config = read_config_file(path);
|
|
58
|
+
const server = config.mcpServers[name];
|
|
59
|
+
if (!server)
|
|
60
|
+
return false;
|
|
61
|
+
if (typeof server.enabled === 'boolean') {
|
|
62
|
+
server.enabled = enabled;
|
|
63
|
+
delete server.disabled;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
server.disabled = !enabled;
|
|
67
|
+
}
|
|
68
|
+
write_config_file(path, config);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
function create_backup_file(cwd) {
|
|
72
|
+
const global_path = global_mcp_config_path();
|
|
73
|
+
const project_path = project_mcp_config_path(cwd);
|
|
74
|
+
return {
|
|
75
|
+
version: 1,
|
|
76
|
+
created_at: new Date().toISOString(),
|
|
77
|
+
cwd,
|
|
78
|
+
global: {
|
|
79
|
+
exists: existsSync(global_path),
|
|
80
|
+
config: read_config_file(global_path),
|
|
81
|
+
},
|
|
82
|
+
project: {
|
|
83
|
+
exists: existsSync(project_path),
|
|
84
|
+
config: read_config_file(project_path),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function to_backup_info(path, backup) {
|
|
89
|
+
return {
|
|
90
|
+
filename: path.split('/').pop() ?? path,
|
|
91
|
+
path,
|
|
92
|
+
created_at: backup.created_at,
|
|
93
|
+
global_server_count: Object.keys(backup.global.config.mcpServers)
|
|
94
|
+
.length,
|
|
95
|
+
project_server_count: Object.keys(backup.project.config.mcpServers).length,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function create_mcp_config_backup(cwd) {
|
|
99
|
+
const backup = create_backup_file(cwd);
|
|
100
|
+
const backups_dir = mcp_backups_dir();
|
|
101
|
+
mkdirSync(backups_dir, { recursive: true });
|
|
102
|
+
const path = join(backups_dir, `mcp-config-${timestamp_for_filename(new Date(backup.created_at))}.json`);
|
|
103
|
+
write_config_file(path, backup);
|
|
104
|
+
return to_backup_info(path, backup);
|
|
105
|
+
}
|
|
106
|
+
export function list_mcp_config_backups() {
|
|
107
|
+
const backups_dir = mcp_backups_dir();
|
|
108
|
+
if (!existsSync(backups_dir))
|
|
109
|
+
return [];
|
|
110
|
+
return readdirSync(backups_dir)
|
|
111
|
+
.filter((file) => file.startsWith('mcp-config-') && file.endsWith('.json'))
|
|
112
|
+
.map((filename) => {
|
|
113
|
+
const path = join(backups_dir, filename);
|
|
114
|
+
try {
|
|
115
|
+
const backup = JSON.parse(readFileSync(path, 'utf-8'));
|
|
116
|
+
return to_backup_info(path, backup);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return {
|
|
120
|
+
filename,
|
|
121
|
+
path,
|
|
122
|
+
created_at: parse_created_at_from_backup_filename(filename),
|
|
123
|
+
global_server_count: 0,
|
|
124
|
+
project_server_count: 0,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
129
|
+
}
|
|
130
|
+
export function restore_mcp_config_backup(cwd, path) {
|
|
131
|
+
const backup = JSON.parse(readFileSync(path, 'utf-8'));
|
|
132
|
+
if (backup.version !== 1) {
|
|
133
|
+
throw new Error('Unsupported MCP backup version');
|
|
134
|
+
}
|
|
135
|
+
const global_path = global_mcp_config_path();
|
|
136
|
+
const project_path = project_mcp_config_path(cwd);
|
|
137
|
+
if (backup.global.exists)
|
|
138
|
+
write_config_file(global_path, backup.global.config);
|
|
139
|
+
else
|
|
140
|
+
rmSync(global_path, { force: true });
|
|
141
|
+
if (backup.project.exists)
|
|
142
|
+
write_config_file(project_path, backup.project.config);
|
|
143
|
+
else
|
|
144
|
+
rmSync(project_path, { force: true });
|
|
145
|
+
return to_backup_info(path, backup);
|
|
146
|
+
}
|
|
147
|
+
export function merged_mcp_servers(cwd) {
|
|
148
|
+
return {
|
|
149
|
+
...read_config(global_mcp_config_path()),
|
|
150
|
+
...read_config(project_mcp_config_path(cwd)),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/config/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpConfigScope, McpProfileInfo } from './types.js';
|
|
2
|
+
export declare function save_mcp_profile(cwd: string, name: string): McpProfileInfo;
|
|
3
|
+
export declare function list_mcp_profiles(): McpProfileInfo[];
|
|
4
|
+
export declare function load_mcp_profile(cwd: string, name: string, scope?: McpConfigScope): McpProfileInfo;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { global_mcp_config_path, mcp_profiles_dir, merged_mcp_servers, project_mcp_config_path, write_config_file, } from './persistence.js';
|
|
4
|
+
function safe_profile_name(name) {
|
|
5
|
+
const normalized = name.trim();
|
|
6
|
+
if (!/^[\w-]+$/.test(normalized)) {
|
|
7
|
+
throw new Error('Profile name must use only letters, numbers, underscores, and hyphens');
|
|
8
|
+
}
|
|
9
|
+
return normalized;
|
|
10
|
+
}
|
|
11
|
+
export function save_mcp_profile(cwd, name) {
|
|
12
|
+
const safe_name = safe_profile_name(name);
|
|
13
|
+
const servers = merged_mcp_servers(cwd);
|
|
14
|
+
const server_count = Object.keys(servers).length;
|
|
15
|
+
if (server_count === 0)
|
|
16
|
+
throw new Error('No MCP servers configured to save');
|
|
17
|
+
const profiles_dir = mcp_profiles_dir();
|
|
18
|
+
mkdirSync(profiles_dir, { recursive: true });
|
|
19
|
+
const profile = {
|
|
20
|
+
version: 1,
|
|
21
|
+
created_at: new Date().toISOString(),
|
|
22
|
+
mcpServers: servers,
|
|
23
|
+
};
|
|
24
|
+
const path = join(profiles_dir, `${safe_name}.json`);
|
|
25
|
+
write_config_file(path, profile);
|
|
26
|
+
return {
|
|
27
|
+
name: safe_name,
|
|
28
|
+
path,
|
|
29
|
+
server_count,
|
|
30
|
+
created_at: profile.created_at,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function list_mcp_profiles() {
|
|
34
|
+
const profiles_dir = mcp_profiles_dir();
|
|
35
|
+
if (!existsSync(profiles_dir))
|
|
36
|
+
return [];
|
|
37
|
+
return readdirSync(profiles_dir)
|
|
38
|
+
.filter((file) => file.endsWith('.json'))
|
|
39
|
+
.map((filename) => {
|
|
40
|
+
const path = join(profiles_dir, filename);
|
|
41
|
+
try {
|
|
42
|
+
const profile = JSON.parse(readFileSync(path, 'utf-8'));
|
|
43
|
+
const servers = profile.mcpServers ?? {};
|
|
44
|
+
return {
|
|
45
|
+
name: filename.replace(/\.json$/, ''),
|
|
46
|
+
path,
|
|
47
|
+
server_count: Object.keys(servers).length,
|
|
48
|
+
created_at: profile.created_at,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return {
|
|
53
|
+
name: filename.replace(/\.json$/, ''),
|
|
54
|
+
path,
|
|
55
|
+
server_count: 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
60
|
+
}
|
|
61
|
+
export function load_mcp_profile(cwd, name, scope = 'global') {
|
|
62
|
+
const safe_name = safe_profile_name(name);
|
|
63
|
+
const path = join(mcp_profiles_dir(), `${safe_name}.json`);
|
|
64
|
+
if (!existsSync(path))
|
|
65
|
+
throw new Error(`MCP profile not found: ${safe_name}`);
|
|
66
|
+
const profile = JSON.parse(readFileSync(path, 'utf-8'));
|
|
67
|
+
const servers = profile.mcpServers ?? {};
|
|
68
|
+
const target_path = scope === 'project'
|
|
69
|
+
? project_mcp_config_path(cwd)
|
|
70
|
+
: global_mcp_config_path();
|
|
71
|
+
write_config_file(target_path, { mcpServers: servers });
|
|
72
|
+
return {
|
|
73
|
+
name: safe_name,
|
|
74
|
+
path,
|
|
75
|
+
server_count: Object.keys(servers).length,
|
|
76
|
+
created_at: profile.created_at,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { McpHttpServerConfig, McpServerConfig, McpStdioServerConfig } from '../client.js';
|
|
2
|
+
export type { McpHttpServerConfig, McpServerConfig, McpStdioServerConfig, };
|
|
3
|
+
export type RawMcpServerEntry = {
|
|
4
|
+
type?: unknown;
|
|
5
|
+
command?: unknown;
|
|
6
|
+
args?: unknown;
|
|
7
|
+
env?: unknown;
|
|
8
|
+
url?: unknown;
|
|
9
|
+
headers?: unknown;
|
|
10
|
+
disabled?: unknown;
|
|
11
|
+
enabled?: unknown;
|
|
12
|
+
};
|
|
13
|
+
export interface RawMcpConfigFile {
|
|
14
|
+
mcpServers: Record<string, RawMcpServerEntry>;
|
|
15
|
+
}
|
|
16
|
+
export interface StoredMcpConfigFile extends RawMcpConfigFile {
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export type McpConfigScope = 'global' | 'project';
|
|
20
|
+
export interface McpBackupInfo {
|
|
21
|
+
filename: string;
|
|
22
|
+
path: string;
|
|
23
|
+
created_at: string;
|
|
24
|
+
global_server_count: number;
|
|
25
|
+
project_server_count: number;
|
|
26
|
+
}
|
|
27
|
+
export interface McpProfileInfo {
|
|
28
|
+
name: string;
|
|
29
|
+
path: string;
|
|
30
|
+
server_count: number;
|
|
31
|
+
created_at?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface McpBackupFile {
|
|
34
|
+
version: 1;
|
|
35
|
+
created_at: string;
|
|
36
|
+
cwd: string;
|
|
37
|
+
global: {
|
|
38
|
+
exists: boolean;
|
|
39
|
+
config: StoredMcpConfigFile;
|
|
40
|
+
};
|
|
41
|
+
project: {
|
|
42
|
+
exists: boolean;
|
|
43
|
+
config: StoredMcpConfigFile;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export interface McpProfileFile {
|
|
47
|
+
version: 1;
|
|
48
|
+
created_at: string;
|
|
49
|
+
mcpServers: Record<string, RawMcpServerEntry>;
|
|
50
|
+
}
|
|
51
|
+
export interface LoadMcpConfigOptions {
|
|
52
|
+
include_project?: boolean;
|
|
53
|
+
project_metadata_trusted?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface McpProjectConfigInfo {
|
|
56
|
+
path: string;
|
|
57
|
+
hash: string;
|
|
58
|
+
servers: Array<{
|
|
59
|
+
name: string;
|
|
60
|
+
summary: string;
|
|
61
|
+
}>;
|
|
62
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { McpServerConfig, RawMcpServerEntry } from './types.js';
|
|
2
|
+
export declare function parse_server(name: string, entry: RawMcpServerEntry, metadata_trusted?: boolean): McpServerConfig;
|
|
3
|
+
export declare function summarize_server_entry(server: RawMcpServerEntry): string;
|