@spences10/pi-mcp 0.0.36 → 0.0.38
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/config/backups.d.ts +4 -0
- package/dist/config/backups.js +87 -0
- package/dist/config/backups.js.map +1 -0
- package/dist/config/paths.d.ts +8 -0
- package/dist/config/paths.js +31 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/policy.d.ts +4 -0
- package/dist/config/policy.js +80 -0
- package/dist/config/policy.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/read-write.d.ts +4 -0
- package/dist/config/read-write.js +22 -0
- package/dist/config/read-write.js.map +1 -0
- package/dist/config/server-parser.d.ts +3 -0
- package/dist/config/server-parser.js +93 -0
- package/dist/config/server-parser.js.map +1 -0
- package/dist/config/types.d.ts +72 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config.d.ts +4 -33
- package/dist/config.js +7 -362
- package/dist/config.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpBackupInfo } from './types.js';
|
|
2
|
+
export declare function create_mcp_config_backup(cwd: string): McpBackupInfo;
|
|
3
|
+
export declare function list_mcp_config_backups(): McpBackupInfo[];
|
|
4
|
+
export declare function restore_mcp_config_backup(cwd: string, path: string): McpBackupInfo;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { global_mcp_config_path, mcp_backups_dir, project_mcp_config_path, timestamp_for_filename, } from './paths.js';
|
|
4
|
+
import { read_config_file, write_config_file } from './read-write.js';
|
|
5
|
+
function parse_created_at_from_backup_filename(filename) {
|
|
6
|
+
return filename
|
|
7
|
+
.replace(/^mcp-config-/, '')
|
|
8
|
+
.replace(/\.json$/, '')
|
|
9
|
+
.replace(/^(\d{4}-\d{2}-\d{2}T\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/, '$1:$2:$3.$4Z');
|
|
10
|
+
}
|
|
11
|
+
function create_backup_file(cwd) {
|
|
12
|
+
const global_path = global_mcp_config_path();
|
|
13
|
+
const project_path = project_mcp_config_path(cwd);
|
|
14
|
+
return {
|
|
15
|
+
version: 1,
|
|
16
|
+
created_at: new Date().toISOString(),
|
|
17
|
+
cwd,
|
|
18
|
+
global: {
|
|
19
|
+
exists: existsSync(global_path),
|
|
20
|
+
config: read_config_file(global_path),
|
|
21
|
+
},
|
|
22
|
+
project: {
|
|
23
|
+
exists: existsSync(project_path),
|
|
24
|
+
config: read_config_file(project_path),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function to_backup_info(path, backup) {
|
|
29
|
+
return {
|
|
30
|
+
filename: path.split('/').pop() ?? path,
|
|
31
|
+
path,
|
|
32
|
+
created_at: backup.created_at,
|
|
33
|
+
global_server_count: Object.keys(backup.global.config.mcpServers)
|
|
34
|
+
.length,
|
|
35
|
+
project_server_count: Object.keys(backup.project.config.mcpServers).length,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function create_mcp_config_backup(cwd) {
|
|
39
|
+
const backup = create_backup_file(cwd);
|
|
40
|
+
const backups_dir = mcp_backups_dir();
|
|
41
|
+
mkdirSync(backups_dir, { recursive: true });
|
|
42
|
+
const path = join(backups_dir, `mcp-config-${timestamp_for_filename(new Date(backup.created_at))}.json`);
|
|
43
|
+
write_config_file(path, backup);
|
|
44
|
+
return to_backup_info(path, backup);
|
|
45
|
+
}
|
|
46
|
+
export function list_mcp_config_backups() {
|
|
47
|
+
const backups_dir = mcp_backups_dir();
|
|
48
|
+
if (!existsSync(backups_dir))
|
|
49
|
+
return [];
|
|
50
|
+
return readdirSync(backups_dir)
|
|
51
|
+
.filter((file) => file.startsWith('mcp-config-') && file.endsWith('.json'))
|
|
52
|
+
.map((filename) => {
|
|
53
|
+
const path = join(backups_dir, filename);
|
|
54
|
+
try {
|
|
55
|
+
const backup = JSON.parse(readFileSync(path, 'utf-8'));
|
|
56
|
+
return to_backup_info(path, backup);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return {
|
|
60
|
+
filename,
|
|
61
|
+
path,
|
|
62
|
+
created_at: parse_created_at_from_backup_filename(filename),
|
|
63
|
+
global_server_count: 0,
|
|
64
|
+
project_server_count: 0,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
69
|
+
}
|
|
70
|
+
export function restore_mcp_config_backup(cwd, path) {
|
|
71
|
+
const backup = JSON.parse(readFileSync(path, 'utf-8'));
|
|
72
|
+
if (backup.version !== 1) {
|
|
73
|
+
throw new Error('Unsupported MCP backup version');
|
|
74
|
+
}
|
|
75
|
+
const global_path = global_mcp_config_path();
|
|
76
|
+
const project_path = project_mcp_config_path(cwd);
|
|
77
|
+
if (backup.global.exists)
|
|
78
|
+
write_config_file(global_path, backup.global.config);
|
|
79
|
+
else
|
|
80
|
+
rmSync(global_path, { force: true });
|
|
81
|
+
if (backup.project.exists)
|
|
82
|
+
write_config_file(project_path, backup.project.config);
|
|
83
|
+
else
|
|
84
|
+
rmSync(project_path, { force: true });
|
|
85
|
+
return to_backup_info(path, backup);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backups.js","sourceRoot":"","sources":["../../src/config/backups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function project_mcp_config_path(cwd: string): string;
|
|
2
|
+
export declare function project_mcp_policy_path(cwd: string): string;
|
|
3
|
+
export declare function global_mcp_config_path(): string;
|
|
4
|
+
export declare function global_mcp_policy_path(): string;
|
|
5
|
+
export declare function mcp_backups_dir(): string;
|
|
6
|
+
export declare function mcp_profiles_dir(): string;
|
|
7
|
+
export declare function timestamp_for_filename(date?: Date): string;
|
|
8
|
+
export declare function safe_profile_name(name: string): string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getAgentDir } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function project_mcp_config_path(cwd) {
|
|
4
|
+
return join(cwd, 'mcp.json');
|
|
5
|
+
}
|
|
6
|
+
export function project_mcp_policy_path(cwd) {
|
|
7
|
+
return join(cwd, '.pi', 'mcp-policy.json');
|
|
8
|
+
}
|
|
9
|
+
export function global_mcp_config_path() {
|
|
10
|
+
return join(getAgentDir(), 'mcp.json');
|
|
11
|
+
}
|
|
12
|
+
export function global_mcp_policy_path() {
|
|
13
|
+
return join(getAgentDir(), 'mcp-policy.json');
|
|
14
|
+
}
|
|
15
|
+
export function mcp_backups_dir() {
|
|
16
|
+
return join(getAgentDir(), 'mcp-backups');
|
|
17
|
+
}
|
|
18
|
+
export function mcp_profiles_dir() {
|
|
19
|
+
return join(getAgentDir(), 'mcp-profiles');
|
|
20
|
+
}
|
|
21
|
+
export function timestamp_for_filename(date = new Date()) {
|
|
22
|
+
return date.toISOString().replace(/[:.]/g, '-');
|
|
23
|
+
}
|
|
24
|
+
export function safe_profile_name(name) {
|
|
25
|
+
const normalized = name.trim();
|
|
26
|
+
if (!/^[\w-]+$/.test(normalized)) {
|
|
27
|
+
throw new Error('Profile name must use only letters, numbers, underscores, and hyphens');
|
|
28
|
+
}
|
|
29
|
+
return normalized;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAClD,OAAO,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAClD,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC/B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE;IACvD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACd,uEAAuE,CACvE,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RawMcpPolicyEntry } from './types.js';
|
|
2
|
+
export declare function get_github_repos(cwd: string): string[];
|
|
3
|
+
export declare function load_mcp_policy(cwd: string): Record<string, RawMcpPolicyEntry>;
|
|
4
|
+
export declare function policy_matches(policy: RawMcpPolicyEntry | undefined, cwd: string, github_repos: string[]): boolean;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { read_settings } from '@spences10/pi-settings';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { global_mcp_policy_path, project_mcp_policy_path, } from './paths.js';
|
|
5
|
+
function read_policy_file(path) {
|
|
6
|
+
if (path === global_mcp_policy_path()) {
|
|
7
|
+
const parsed = (read_settings().mcp?.policy ??
|
|
8
|
+
{});
|
|
9
|
+
return { servers: parsed.servers ?? {} };
|
|
10
|
+
}
|
|
11
|
+
if (!existsSync(path))
|
|
12
|
+
return { servers: {} };
|
|
13
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
14
|
+
return { servers: parsed.servers ?? {} };
|
|
15
|
+
}
|
|
16
|
+
function as_string_array(value, label) {
|
|
17
|
+
if (value === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
const values = typeof value === 'string' ? [value] : value;
|
|
20
|
+
if (!Array.isArray(values) ||
|
|
21
|
+
values.some((entry) => typeof entry !== 'string' || !entry.trim())) {
|
|
22
|
+
throw new Error(`Invalid MCP policy: ${label} must be a string or string array`);
|
|
23
|
+
}
|
|
24
|
+
return values.map((entry) => entry.trim());
|
|
25
|
+
}
|
|
26
|
+
function parse_github_repo(remote) {
|
|
27
|
+
const trimmed = remote.trim().replace(/\.git$/, '');
|
|
28
|
+
const match = /^git@github\.com:([^/]+)\/(.+)$/.exec(trimmed) ??
|
|
29
|
+
/^https:\/\/github\.com\/([^/]+)\/(.+)$/.exec(trimmed) ??
|
|
30
|
+
/^ssh:\/\/git@github\.com\/([^/]+)\/(.+)$/.exec(trimmed);
|
|
31
|
+
if (!match)
|
|
32
|
+
return undefined;
|
|
33
|
+
return `${match[1]}/${match[2]}`.toLowerCase();
|
|
34
|
+
}
|
|
35
|
+
export function get_github_repos(cwd) {
|
|
36
|
+
try {
|
|
37
|
+
const output = execFileSync('git', ['remote', '-v'], {
|
|
38
|
+
cwd,
|
|
39
|
+
encoding: 'utf-8',
|
|
40
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
41
|
+
});
|
|
42
|
+
return [
|
|
43
|
+
...new Set(output
|
|
44
|
+
.split('\n')
|
|
45
|
+
.map((line) => line.trim().split(/\s+/)[1])
|
|
46
|
+
.filter((remote) => Boolean(remote))
|
|
47
|
+
.map(parse_github_repo)
|
|
48
|
+
.filter((repo) => Boolean(repo))),
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function load_mcp_policy(cwd) {
|
|
56
|
+
return {
|
|
57
|
+
...read_policy_file(global_mcp_policy_path()).servers,
|
|
58
|
+
...read_policy_file(project_mcp_policy_path(cwd)).servers,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function policy_matches(policy, cwd, github_repos) {
|
|
62
|
+
if (!policy?.activateWhen)
|
|
63
|
+
return true;
|
|
64
|
+
const activate = policy.activateWhen;
|
|
65
|
+
const github_org = as_string_array(activate.githubOrg, 'githubOrg')?.map((org) => org.toLowerCase());
|
|
66
|
+
const github_repo = as_string_array(activate.githubRepo, 'githubRepo')?.map((repo) => repo.toLowerCase());
|
|
67
|
+
const cwd_prefix = as_string_array(activate.cwdPrefix, 'cwdPrefix');
|
|
68
|
+
const checks = [];
|
|
69
|
+
if (github_org) {
|
|
70
|
+
checks.push(github_repos.some((repo) => github_org.includes(repo.split('/')[0])));
|
|
71
|
+
}
|
|
72
|
+
if (github_repo) {
|
|
73
|
+
checks.push(github_repos.some((repo) => github_repo.includes(repo)));
|
|
74
|
+
}
|
|
75
|
+
if (cwd_prefix) {
|
|
76
|
+
checks.push(cwd_prefix.some((prefix) => cwd.startsWith(prefix)));
|
|
77
|
+
}
|
|
78
|
+
return checks.length === 0 || checks.some(Boolean);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/config/policy.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, readFileSync, readdirSync, } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { global_mcp_config_path, mcp_profiles_dir, project_mcp_config_path, safe_profile_name, } from './paths.js';
|
|
4
|
+
import { read_config, write_config_file } from './read-write.js';
|
|
5
|
+
function merged_mcp_servers(cwd) {
|
|
6
|
+
return {
|
|
7
|
+
...read_config(global_mcp_config_path()),
|
|
8
|
+
...read_config(project_mcp_config_path(cwd)),
|
|
9
|
+
};
|
|
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,4 @@
|
|
|
1
|
+
import type { RawMcpConfigFile, 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'];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
export function read_config_file(path) {
|
|
4
|
+
if (!existsSync(path))
|
|
5
|
+
return { mcpServers: {} };
|
|
6
|
+
const raw = readFileSync(path, 'utf-8');
|
|
7
|
+
const config = JSON.parse(raw);
|
|
8
|
+
return {
|
|
9
|
+
...config,
|
|
10
|
+
mcpServers: config.mcpServers || {},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function write_config_file(path, config) {
|
|
14
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
15
|
+
const tmp_path = join(dirname(path), `.${Date.now()}.tmp`);
|
|
16
|
+
writeFileSync(tmp_path, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
|
|
17
|
+
renameSync(tmp_path, path);
|
|
18
|
+
}
|
|
19
|
+
export function read_config(path) {
|
|
20
|
+
return read_config_file(path).mcpServers;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=read-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-write.js","sourceRoot":"","sources":["../../src/config/read-write.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAM1C,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiC,CAAC;IAC/D,OAAO;QACN,GAAG,MAAM;QACT,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;KACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,IAAY,EACZ,MAA2B;IAE3B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3D,aAAa,CACZ,QAAQ,EACR,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACtC,OAAO,CACP,CAAC;IACF,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW,CAC1B,IAAY;IAEZ,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;AAC1C,CAAC"}
|
|
@@ -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;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { create_child_process_env } from '../env.js';
|
|
2
|
+
function expand_env_vars(value, env) {
|
|
3
|
+
return value.replace(/\$\{([^}]+)\}/g, (_, key) => env[key] ?? '');
|
|
4
|
+
}
|
|
5
|
+
function expand_header_env_vars(headers) {
|
|
6
|
+
if (!headers)
|
|
7
|
+
return undefined;
|
|
8
|
+
const safe_env = create_child_process_env();
|
|
9
|
+
return Object.fromEntries(Object.entries(headers).map(([key, value]) => [
|
|
10
|
+
key,
|
|
11
|
+
expand_env_vars(value, safe_env),
|
|
12
|
+
]));
|
|
13
|
+
}
|
|
14
|
+
function is_string_record(value, label, name) {
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
return true;
|
|
17
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
18
|
+
throw new Error(`Invalid MCP server "${name}": ${label} must be an object of string values`);
|
|
19
|
+
}
|
|
20
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
21
|
+
if (typeof entry !== 'string') {
|
|
22
|
+
throw new Error(`Invalid MCP server "${name}": ${label}.${key} must be a string`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
export function parse_server(name, entry, metadata_trusted = true) {
|
|
28
|
+
const type = typeof entry.type === 'string'
|
|
29
|
+
? entry.type.trim().toLowerCase()
|
|
30
|
+
: '';
|
|
31
|
+
const disabled = typeof entry.disabled === 'boolean'
|
|
32
|
+
? entry.disabled
|
|
33
|
+
: typeof entry.enabled === 'boolean'
|
|
34
|
+
? !entry.enabled
|
|
35
|
+
: undefined;
|
|
36
|
+
if (type && !['stdio', 'http', 'streamable-http'].includes(type)) {
|
|
37
|
+
throw new Error(`Invalid MCP server "${name}": unsupported transport type "${type}"`);
|
|
38
|
+
}
|
|
39
|
+
if (type === 'http' ||
|
|
40
|
+
type === 'streamable-http' ||
|
|
41
|
+
entry.url !== undefined) {
|
|
42
|
+
if (typeof entry.url !== 'string' || !entry.url.trim()) {
|
|
43
|
+
throw new Error(`Invalid MCP server "${name}": http transport requires a url`);
|
|
44
|
+
}
|
|
45
|
+
is_string_record(entry.headers, 'headers', name);
|
|
46
|
+
const headers = expand_header_env_vars(entry.headers);
|
|
47
|
+
const config = {
|
|
48
|
+
name,
|
|
49
|
+
transport: 'http',
|
|
50
|
+
url: entry.url.trim(),
|
|
51
|
+
...(headers ? { headers } : {}),
|
|
52
|
+
...(disabled !== undefined ? { disabled } : {}),
|
|
53
|
+
...(metadata_trusted
|
|
54
|
+
? {}
|
|
55
|
+
: { metadata_trusted: false }),
|
|
56
|
+
};
|
|
57
|
+
return config;
|
|
58
|
+
}
|
|
59
|
+
if (typeof entry.command !== 'string' || !entry.command.trim()) {
|
|
60
|
+
throw new Error(`Invalid MCP server "${name}": stdio transport requires a command`);
|
|
61
|
+
}
|
|
62
|
+
if (entry.args !== undefined &&
|
|
63
|
+
(!Array.isArray(entry.args) ||
|
|
64
|
+
entry.args.some((value) => typeof value !== 'string'))) {
|
|
65
|
+
throw new Error(`Invalid MCP server "${name}": args must be an array of strings`);
|
|
66
|
+
}
|
|
67
|
+
is_string_record(entry.env, 'env', name);
|
|
68
|
+
const args = entry.args;
|
|
69
|
+
const env = entry.env;
|
|
70
|
+
const config = {
|
|
71
|
+
name,
|
|
72
|
+
transport: 'stdio',
|
|
73
|
+
command: entry.command.trim(),
|
|
74
|
+
...(args ? { args } : {}),
|
|
75
|
+
...(env ? { env } : {}),
|
|
76
|
+
...(disabled !== undefined ? { disabled } : {}),
|
|
77
|
+
...(metadata_trusted ? {} : { metadata_trusted: false }),
|
|
78
|
+
};
|
|
79
|
+
return config;
|
|
80
|
+
}
|
|
81
|
+
export function summarize_server_entry(server) {
|
|
82
|
+
if (typeof server.url === 'string' && server.url.trim()) {
|
|
83
|
+
return `http ${server.url.trim()}`;
|
|
84
|
+
}
|
|
85
|
+
if (typeof server.command === 'string' && server.command.trim()) {
|
|
86
|
+
const args = Array.isArray(server.args)
|
|
87
|
+
? server.args.filter((arg) => typeof arg === 'string')
|
|
88
|
+
: [];
|
|
89
|
+
return ['stdio', server.command.trim(), ...args].join(' ');
|
|
90
|
+
}
|
|
91
|
+
return 'invalid server entry';
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=server-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-parser.js","sourceRoot":"","sources":["../../src/config/server-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAQrD,SAAS,eAAe,CACvB,KAAa,EACb,GAAsB;IAEtB,OAAO,KAAK,CAAC,OAAO,CACnB,gBAAgB,EAChB,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAClC,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC9B,OAA2C;IAE3C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC7C,GAAG;QACH,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC;KAChC,CAAC,CACF,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACxB,KAAc,EACd,KAAa,EACb,IAAY;IAEZ,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACd,uBAAuB,IAAI,MAAM,KAAK,qCAAqC,CAC3E,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACd,uBAAuB,IAAI,MAAM,KAAK,IAAI,GAAG,mBAAmB,CAChE,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,IAAY,EACZ,KAAwB,EACxB,gBAAgB,GAAG,IAAI;IAEvB,MAAM,IAAI,GACT,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC7B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GACb,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS;QAClC,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS;YACnC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;YAChB,CAAC,CAAC,SAAS,CAAC;IAEf,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACd,uBAAuB,IAAI,kCAAkC,IAAI,GAAG,CACpE,CAAC;IACH,CAAC;IAED,IACC,IAAI,KAAK,MAAM;QACf,IAAI,KAAK,iBAAiB;QAC1B,KAAK,CAAC,GAAG,KAAK,SAAS,EACtB,CAAC;QACF,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CACd,uBAAuB,IAAI,kCAAkC,CAC7D,CAAC;QACH,CAAC;QACD,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,sBAAsB,CACrC,KAAK,CAAC,OAA6C,CACnD,CAAC;QACF,MAAM,MAAM,GAAwB;YACnC,IAAI;YACJ,SAAS,EAAE,MAAM;YACjB,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;YACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,gBAAgB;gBACnB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAc,EAAE,CAAC;SACxC,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACd,uBAAuB,IAAI,uCAAuC,CAClE,CAAC;IACH,CAAC;IACD,IACC,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,EACtD,CAAC;QACF,MAAM,IAAI,KAAK,CACd,uBAAuB,IAAI,qCAAqC,CAChE,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAA4B,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAyC,CAAC;IAE5D,MAAM,MAAM,GAAyB;QACpC,IAAI;QACJ,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAc,EAAE,CAAC;KACjE,CAAC;IACF,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,MAAyB;IAEzB,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACzD,OAAO,QAAQ,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC;YACtD,CAAC,CAAC,EAAE,CAAC;QACN,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,sBAAsB,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { McpHttpServerConfig, McpServerConfig, McpStdioServerConfig } from '../client.js';
|
|
2
|
+
export type { McpHttpServerConfig, McpServerConfig, McpStdioServerConfig, };
|
|
3
|
+
export interface RawMcpConfigFile {
|
|
4
|
+
mcpServers: Record<string, RawMcpServerEntry>;
|
|
5
|
+
}
|
|
6
|
+
export interface RawMcpPolicyFile {
|
|
7
|
+
servers?: Record<string, RawMcpPolicyEntry>;
|
|
8
|
+
}
|
|
9
|
+
export interface RawMcpPolicyEntry {
|
|
10
|
+
activateWhen?: {
|
|
11
|
+
githubOrg?: unknown;
|
|
12
|
+
githubRepo?: unknown;
|
|
13
|
+
cwdPrefix?: unknown;
|
|
14
|
+
};
|
|
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
|
+
}
|
|
63
|
+
export type RawMcpServerEntry = {
|
|
64
|
+
type?: unknown;
|
|
65
|
+
command?: unknown;
|
|
66
|
+
args?: unknown;
|
|
67
|
+
env?: unknown;
|
|
68
|
+
url?: unknown;
|
|
69
|
+
headers?: unknown;
|
|
70
|
+
disabled?: unknown;
|
|
71
|
+
enabled?: unknown;
|
|
72
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,36 +1,7 @@
|
|
|
1
|
-
import type { McpServerConfig } from './
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
path: string;
|
|
6
|
-
created_at: string;
|
|
7
|
-
global_server_count: number;
|
|
8
|
-
project_server_count: number;
|
|
9
|
-
}
|
|
10
|
-
export interface McpProfileInfo {
|
|
11
|
-
name: string;
|
|
12
|
-
path: string;
|
|
13
|
-
server_count: number;
|
|
14
|
-
created_at?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface LoadMcpConfigOptions {
|
|
17
|
-
include_project?: boolean;
|
|
18
|
-
project_metadata_trusted?: boolean;
|
|
19
|
-
}
|
|
20
|
-
export interface McpProjectConfigInfo {
|
|
21
|
-
path: string;
|
|
22
|
-
hash: string;
|
|
23
|
-
servers: Array<{
|
|
24
|
-
name: string;
|
|
25
|
-
summary: string;
|
|
26
|
-
}>;
|
|
27
|
-
}
|
|
1
|
+
import type { LoadMcpConfigOptions, McpProjectConfigInfo, McpServerConfig } from './config/types.js';
|
|
2
|
+
export { create_mcp_config_backup, list_mcp_config_backups, restore_mcp_config_backup, } from './config/backups.js';
|
|
3
|
+
export { list_mcp_profiles, load_mcp_profile, save_mcp_profile, } from './config/profiles.js';
|
|
4
|
+
export type { LoadMcpConfigOptions, McpBackupInfo, McpConfigScope, McpProfileInfo, McpProjectConfigInfo, } from './config/types.js';
|
|
28
5
|
export declare function get_project_mcp_config_info(cwd: string): McpProjectConfigInfo | undefined;
|
|
29
6
|
export declare function load_mcp_config(cwd: string, options?: LoadMcpConfigOptions): McpServerConfig[];
|
|
30
7
|
export declare function set_mcp_server_enabled(cwd: string, name: string, enabled: boolean): boolean;
|
|
31
|
-
export declare function create_mcp_config_backup(cwd: string): McpBackupInfo;
|
|
32
|
-
export declare function list_mcp_config_backups(): McpBackupInfo[];
|
|
33
|
-
export declare function restore_mcp_config_backup(cwd: string, path: string): McpBackupInfo;
|
|
34
|
-
export declare function save_mcp_profile(cwd: string, name: string): McpProfileInfo;
|
|
35
|
-
export declare function list_mcp_profiles(): McpProfileInfo[];
|
|
36
|
-
export declare function load_mcp_profile(cwd: string, name: string, scope?: McpConfigScope): McpProfileInfo;
|
package/dist/config.js
CHANGED
|
@@ -1,204 +1,11 @@
|
|
|
1
|
-
import { getAgentDir } from '@earendil-works/pi-coding-agent';
|
|
2
|
-
import { read_settings } from '@spences10/pi-settings';
|
|
3
|
-
import { execFileSync } from 'node:child_process';
|
|
4
1
|
import { createHash } from 'node:crypto';
|
|
5
|
-
import { existsSync,
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
14
|
-
if (typeof entry !== 'string') {
|
|
15
|
-
throw new Error(`Invalid MCP server "${name}": ${label}.${key} must be a string`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
function parse_server(name, entry, metadata_trusted = true) {
|
|
21
|
-
const type = typeof entry.type === 'string'
|
|
22
|
-
? entry.type.trim().toLowerCase()
|
|
23
|
-
: '';
|
|
24
|
-
const disabled = typeof entry.disabled === 'boolean'
|
|
25
|
-
? entry.disabled
|
|
26
|
-
: typeof entry.enabled === 'boolean'
|
|
27
|
-
? !entry.enabled
|
|
28
|
-
: undefined;
|
|
29
|
-
if (type && !['stdio', 'http', 'streamable-http'].includes(type)) {
|
|
30
|
-
throw new Error(`Invalid MCP server "${name}": unsupported transport type "${type}"`);
|
|
31
|
-
}
|
|
32
|
-
if (type === 'http' ||
|
|
33
|
-
type === 'streamable-http' ||
|
|
34
|
-
entry.url !== undefined) {
|
|
35
|
-
if (typeof entry.url !== 'string' || !entry.url.trim()) {
|
|
36
|
-
throw new Error(`Invalid MCP server "${name}": http transport requires a url`);
|
|
37
|
-
}
|
|
38
|
-
is_string_record(entry.headers, 'headers', name);
|
|
39
|
-
const headers = entry.headers;
|
|
40
|
-
const config = {
|
|
41
|
-
name,
|
|
42
|
-
transport: 'http',
|
|
43
|
-
url: entry.url.trim(),
|
|
44
|
-
...(headers ? { headers } : {}),
|
|
45
|
-
...(disabled !== undefined ? { disabled } : {}),
|
|
46
|
-
...(metadata_trusted
|
|
47
|
-
? {}
|
|
48
|
-
: { metadata_trusted: false }),
|
|
49
|
-
};
|
|
50
|
-
return config;
|
|
51
|
-
}
|
|
52
|
-
if (typeof entry.command !== 'string' || !entry.command.trim()) {
|
|
53
|
-
throw new Error(`Invalid MCP server "${name}": stdio transport requires a command`);
|
|
54
|
-
}
|
|
55
|
-
if (entry.args !== undefined &&
|
|
56
|
-
(!Array.isArray(entry.args) ||
|
|
57
|
-
entry.args.some((value) => typeof value !== 'string'))) {
|
|
58
|
-
throw new Error(`Invalid MCP server "${name}": args must be an array of strings`);
|
|
59
|
-
}
|
|
60
|
-
is_string_record(entry.env, 'env', name);
|
|
61
|
-
const args = entry.args;
|
|
62
|
-
const env = entry.env;
|
|
63
|
-
const config = {
|
|
64
|
-
name,
|
|
65
|
-
transport: 'stdio',
|
|
66
|
-
command: entry.command.trim(),
|
|
67
|
-
...(args ? { args } : {}),
|
|
68
|
-
...(env ? { env } : {}),
|
|
69
|
-
...(disabled !== undefined ? { disabled } : {}),
|
|
70
|
-
...(metadata_trusted ? {} : { metadata_trusted: false }),
|
|
71
|
-
};
|
|
72
|
-
return config;
|
|
73
|
-
}
|
|
74
|
-
function read_config_file(path) {
|
|
75
|
-
if (!existsSync(path))
|
|
76
|
-
return { mcpServers: {} };
|
|
77
|
-
const raw = readFileSync(path, 'utf-8');
|
|
78
|
-
const config = JSON.parse(raw);
|
|
79
|
-
return {
|
|
80
|
-
...config,
|
|
81
|
-
mcpServers: config.mcpServers || {},
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
function write_config_file(path, config) {
|
|
85
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
86
|
-
const tmp_path = join(dirname(path), `.${Date.now()}.tmp`);
|
|
87
|
-
writeFileSync(tmp_path, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
|
|
88
|
-
renameSync(tmp_path, path);
|
|
89
|
-
}
|
|
90
|
-
function read_config(path) {
|
|
91
|
-
return read_config_file(path).mcpServers;
|
|
92
|
-
}
|
|
93
|
-
function read_policy_file(path) {
|
|
94
|
-
if (path === global_mcp_policy_path()) {
|
|
95
|
-
const parsed = (read_settings().mcp?.policy ??
|
|
96
|
-
{});
|
|
97
|
-
return { servers: parsed.servers ?? {} };
|
|
98
|
-
}
|
|
99
|
-
if (!existsSync(path))
|
|
100
|
-
return { servers: {} };
|
|
101
|
-
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
102
|
-
return { servers: parsed.servers ?? {} };
|
|
103
|
-
}
|
|
104
|
-
function as_string_array(value, label) {
|
|
105
|
-
if (value === undefined)
|
|
106
|
-
return undefined;
|
|
107
|
-
const values = typeof value === 'string' ? [value] : value;
|
|
108
|
-
if (!Array.isArray(values) ||
|
|
109
|
-
values.some((entry) => typeof entry !== 'string' || !entry.trim())) {
|
|
110
|
-
throw new Error(`Invalid MCP policy: ${label} must be a string or string array`);
|
|
111
|
-
}
|
|
112
|
-
return values.map((entry) => entry.trim());
|
|
113
|
-
}
|
|
114
|
-
function parse_github_repo(remote) {
|
|
115
|
-
const trimmed = remote.trim().replace(/\.git$/, '');
|
|
116
|
-
const match = /^git@github\.com:([^/]+)\/(.+)$/.exec(trimmed) ??
|
|
117
|
-
/^https:\/\/github\.com\/([^/]+)\/(.+)$/.exec(trimmed) ??
|
|
118
|
-
/^ssh:\/\/git@github\.com\/([^/]+)\/(.+)$/.exec(trimmed);
|
|
119
|
-
if (!match)
|
|
120
|
-
return undefined;
|
|
121
|
-
return `${match[1]}/${match[2]}`.toLowerCase();
|
|
122
|
-
}
|
|
123
|
-
function get_github_repos(cwd) {
|
|
124
|
-
try {
|
|
125
|
-
const output = execFileSync('git', ['remote', '-v'], {
|
|
126
|
-
cwd,
|
|
127
|
-
encoding: 'utf-8',
|
|
128
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
129
|
-
});
|
|
130
|
-
return [
|
|
131
|
-
...new Set(output
|
|
132
|
-
.split('\n')
|
|
133
|
-
.map((line) => line.trim().split(/\s+/)[1])
|
|
134
|
-
.filter((remote) => Boolean(remote))
|
|
135
|
-
.map(parse_github_repo)
|
|
136
|
-
.filter((repo) => Boolean(repo))),
|
|
137
|
-
];
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
return [];
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
function load_mcp_policy(cwd) {
|
|
144
|
-
return {
|
|
145
|
-
...read_policy_file(global_mcp_policy_path()).servers,
|
|
146
|
-
...read_policy_file(project_mcp_policy_path(cwd)).servers,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
function policy_matches(policy, cwd, github_repos) {
|
|
150
|
-
if (!policy?.activateWhen)
|
|
151
|
-
return true;
|
|
152
|
-
const activate = policy.activateWhen;
|
|
153
|
-
const github_org = as_string_array(activate.githubOrg, 'githubOrg')?.map((org) => org.toLowerCase());
|
|
154
|
-
const github_repo = as_string_array(activate.githubRepo, 'githubRepo')?.map((repo) => repo.toLowerCase());
|
|
155
|
-
const cwd_prefix = as_string_array(activate.cwdPrefix, 'cwdPrefix');
|
|
156
|
-
const checks = [];
|
|
157
|
-
if (github_org) {
|
|
158
|
-
checks.push(github_repos.some((repo) => github_org.includes(repo.split('/')[0])));
|
|
159
|
-
}
|
|
160
|
-
if (github_repo) {
|
|
161
|
-
checks.push(github_repos.some((repo) => github_repo.includes(repo)));
|
|
162
|
-
}
|
|
163
|
-
if (cwd_prefix) {
|
|
164
|
-
checks.push(cwd_prefix.some((prefix) => cwd.startsWith(prefix)));
|
|
165
|
-
}
|
|
166
|
-
return checks.length === 0 || checks.some(Boolean);
|
|
167
|
-
}
|
|
168
|
-
function project_mcp_config_path(cwd) {
|
|
169
|
-
return join(cwd, 'mcp.json');
|
|
170
|
-
}
|
|
171
|
-
function project_mcp_policy_path(cwd) {
|
|
172
|
-
return join(cwd, '.pi', 'mcp-policy.json');
|
|
173
|
-
}
|
|
174
|
-
function global_mcp_config_path() {
|
|
175
|
-
return join(getAgentDir(), 'mcp.json');
|
|
176
|
-
}
|
|
177
|
-
function global_mcp_policy_path() {
|
|
178
|
-
return join(getAgentDir(), 'mcp-policy.json');
|
|
179
|
-
}
|
|
180
|
-
function mcp_backups_dir() {
|
|
181
|
-
return join(getAgentDir(), 'mcp-backups');
|
|
182
|
-
}
|
|
183
|
-
function mcp_profiles_dir() {
|
|
184
|
-
return join(getAgentDir(), 'mcp-profiles');
|
|
185
|
-
}
|
|
186
|
-
function timestamp_for_filename(date = new Date()) {
|
|
187
|
-
return date.toISOString().replace(/[:.]/g, '-');
|
|
188
|
-
}
|
|
189
|
-
function safe_profile_name(name) {
|
|
190
|
-
const normalized = name.trim();
|
|
191
|
-
if (!/^[\w-]+$/.test(normalized)) {
|
|
192
|
-
throw new Error('Profile name must use only letters, numbers, underscores, and hyphens');
|
|
193
|
-
}
|
|
194
|
-
return normalized;
|
|
195
|
-
}
|
|
196
|
-
function parse_created_at_from_backup_filename(filename) {
|
|
197
|
-
return filename
|
|
198
|
-
.replace(/^mcp-config-/, '')
|
|
199
|
-
.replace(/\.json$/, '')
|
|
200
|
-
.replace(/^(\d{4}-\d{2}-\d{2}T\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/, '$1:$2:$3.$4Z');
|
|
201
|
-
}
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { global_mcp_config_path, project_mcp_config_path, } from './config/paths.js';
|
|
4
|
+
import { get_github_repos, load_mcp_policy, policy_matches, } from './config/policy.js';
|
|
5
|
+
import { read_config, read_config_file, write_config_file, } from './config/read-write.js';
|
|
6
|
+
import { parse_server, summarize_server_entry, } from './config/server-parser.js';
|
|
7
|
+
export { create_mcp_config_backup, list_mcp_config_backups, restore_mcp_config_backup, } from './config/backups.js';
|
|
8
|
+
export { list_mcp_profiles, load_mcp_profile, save_mcp_profile, } from './config/profiles.js';
|
|
202
9
|
export function get_project_mcp_config_info(cwd) {
|
|
203
10
|
const path = project_mcp_config_path(cwd);
|
|
204
11
|
if (!existsSync(path))
|
|
@@ -218,18 +25,6 @@ export function get_project_mcp_config_info(cwd) {
|
|
|
218
25
|
}
|
|
219
26
|
return { path, hash, servers };
|
|
220
27
|
}
|
|
221
|
-
function summarize_server_entry(server) {
|
|
222
|
-
if (typeof server.url === 'string' && server.url.trim()) {
|
|
223
|
-
return `http ${server.url.trim()}`;
|
|
224
|
-
}
|
|
225
|
-
if (typeof server.command === 'string' && server.command.trim()) {
|
|
226
|
-
const args = Array.isArray(server.args)
|
|
227
|
-
? server.args.filter((arg) => typeof arg === 'string')
|
|
228
|
-
: [];
|
|
229
|
-
return ['stdio', server.command.trim(), ...args].join(' ');
|
|
230
|
-
}
|
|
231
|
-
return 'invalid server entry';
|
|
232
|
-
}
|
|
233
28
|
export function load_mcp_config(cwd, options = {}) {
|
|
234
29
|
const global_servers = read_config(global_mcp_config_path());
|
|
235
30
|
const project_servers = options.include_project === false
|
|
@@ -278,154 +73,4 @@ export function set_mcp_server_enabled(cwd, name, enabled) {
|
|
|
278
73
|
write_config_file(path, config);
|
|
279
74
|
return true;
|
|
280
75
|
}
|
|
281
|
-
function create_backup_file(cwd) {
|
|
282
|
-
const global_path = global_mcp_config_path();
|
|
283
|
-
const project_path = project_mcp_config_path(cwd);
|
|
284
|
-
return {
|
|
285
|
-
version: 1,
|
|
286
|
-
created_at: new Date().toISOString(),
|
|
287
|
-
cwd,
|
|
288
|
-
global: {
|
|
289
|
-
exists: existsSync(global_path),
|
|
290
|
-
config: read_config_file(global_path),
|
|
291
|
-
},
|
|
292
|
-
project: {
|
|
293
|
-
exists: existsSync(project_path),
|
|
294
|
-
config: read_config_file(project_path),
|
|
295
|
-
},
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
function to_backup_info(path, backup) {
|
|
299
|
-
return {
|
|
300
|
-
filename: path.split('/').pop() ?? path,
|
|
301
|
-
path,
|
|
302
|
-
created_at: backup.created_at,
|
|
303
|
-
global_server_count: Object.keys(backup.global.config.mcpServers)
|
|
304
|
-
.length,
|
|
305
|
-
project_server_count: Object.keys(backup.project.config.mcpServers).length,
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
export function create_mcp_config_backup(cwd) {
|
|
309
|
-
const backup = create_backup_file(cwd);
|
|
310
|
-
const backups_dir = mcp_backups_dir();
|
|
311
|
-
mkdirSync(backups_dir, { recursive: true });
|
|
312
|
-
const path = join(backups_dir, `mcp-config-${timestamp_for_filename(new Date(backup.created_at))}.json`);
|
|
313
|
-
write_config_file(path, backup);
|
|
314
|
-
return to_backup_info(path, backup);
|
|
315
|
-
}
|
|
316
|
-
export function list_mcp_config_backups() {
|
|
317
|
-
const backups_dir = mcp_backups_dir();
|
|
318
|
-
if (!existsSync(backups_dir))
|
|
319
|
-
return [];
|
|
320
|
-
return readdirSync(backups_dir)
|
|
321
|
-
.filter((file) => file.startsWith('mcp-config-') && file.endsWith('.json'))
|
|
322
|
-
.map((filename) => {
|
|
323
|
-
const path = join(backups_dir, filename);
|
|
324
|
-
try {
|
|
325
|
-
const backup = JSON.parse(readFileSync(path, 'utf-8'));
|
|
326
|
-
return to_backup_info(path, backup);
|
|
327
|
-
}
|
|
328
|
-
catch {
|
|
329
|
-
return {
|
|
330
|
-
filename,
|
|
331
|
-
path,
|
|
332
|
-
created_at: parse_created_at_from_backup_filename(filename),
|
|
333
|
-
global_server_count: 0,
|
|
334
|
-
project_server_count: 0,
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
})
|
|
338
|
-
.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
339
|
-
}
|
|
340
|
-
export function restore_mcp_config_backup(cwd, path) {
|
|
341
|
-
const backup = JSON.parse(readFileSync(path, 'utf-8'));
|
|
342
|
-
if (backup.version !== 1) {
|
|
343
|
-
throw new Error('Unsupported MCP backup version');
|
|
344
|
-
}
|
|
345
|
-
const global_path = global_mcp_config_path();
|
|
346
|
-
const project_path = project_mcp_config_path(cwd);
|
|
347
|
-
if (backup.global.exists)
|
|
348
|
-
write_config_file(global_path, backup.global.config);
|
|
349
|
-
else
|
|
350
|
-
rmSync(global_path, { force: true });
|
|
351
|
-
if (backup.project.exists)
|
|
352
|
-
write_config_file(project_path, backup.project.config);
|
|
353
|
-
else
|
|
354
|
-
rmSync(project_path, { force: true });
|
|
355
|
-
return to_backup_info(path, backup);
|
|
356
|
-
}
|
|
357
|
-
function merged_mcp_servers(cwd) {
|
|
358
|
-
return {
|
|
359
|
-
...read_config(global_mcp_config_path()),
|
|
360
|
-
...read_config(project_mcp_config_path(cwd)),
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
export function save_mcp_profile(cwd, name) {
|
|
364
|
-
const safe_name = safe_profile_name(name);
|
|
365
|
-
const servers = merged_mcp_servers(cwd);
|
|
366
|
-
const server_count = Object.keys(servers).length;
|
|
367
|
-
if (server_count === 0)
|
|
368
|
-
throw new Error('No MCP servers configured to save');
|
|
369
|
-
const profiles_dir = mcp_profiles_dir();
|
|
370
|
-
mkdirSync(profiles_dir, { recursive: true });
|
|
371
|
-
const profile = {
|
|
372
|
-
version: 1,
|
|
373
|
-
created_at: new Date().toISOString(),
|
|
374
|
-
mcpServers: servers,
|
|
375
|
-
};
|
|
376
|
-
const path = join(profiles_dir, `${safe_name}.json`);
|
|
377
|
-
write_config_file(path, profile);
|
|
378
|
-
return {
|
|
379
|
-
name: safe_name,
|
|
380
|
-
path,
|
|
381
|
-
server_count,
|
|
382
|
-
created_at: profile.created_at,
|
|
383
|
-
};
|
|
384
|
-
}
|
|
385
|
-
export function list_mcp_profiles() {
|
|
386
|
-
const profiles_dir = mcp_profiles_dir();
|
|
387
|
-
if (!existsSync(profiles_dir))
|
|
388
|
-
return [];
|
|
389
|
-
return readdirSync(profiles_dir)
|
|
390
|
-
.filter((file) => file.endsWith('.json'))
|
|
391
|
-
.map((filename) => {
|
|
392
|
-
const path = join(profiles_dir, filename);
|
|
393
|
-
try {
|
|
394
|
-
const profile = JSON.parse(readFileSync(path, 'utf-8'));
|
|
395
|
-
const servers = profile.mcpServers ?? {};
|
|
396
|
-
return {
|
|
397
|
-
name: filename.replace(/\.json$/, ''),
|
|
398
|
-
path,
|
|
399
|
-
server_count: Object.keys(servers).length,
|
|
400
|
-
created_at: profile.created_at,
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
catch {
|
|
404
|
-
return {
|
|
405
|
-
name: filename.replace(/\.json$/, ''),
|
|
406
|
-
path,
|
|
407
|
-
server_count: 0,
|
|
408
|
-
};
|
|
409
|
-
}
|
|
410
|
-
})
|
|
411
|
-
.sort((a, b) => a.name.localeCompare(b.name));
|
|
412
|
-
}
|
|
413
|
-
export function load_mcp_profile(cwd, name, scope = 'global') {
|
|
414
|
-
const safe_name = safe_profile_name(name);
|
|
415
|
-
const path = join(mcp_profiles_dir(), `${safe_name}.json`);
|
|
416
|
-
if (!existsSync(path))
|
|
417
|
-
throw new Error(`MCP profile not found: ${safe_name}`);
|
|
418
|
-
const profile = JSON.parse(readFileSync(path, 'utf-8'));
|
|
419
|
-
const servers = profile.mcpServers ?? {};
|
|
420
|
-
const target_path = scope === 'project'
|
|
421
|
-
? project_mcp_config_path(cwd)
|
|
422
|
-
: global_mcp_config_path();
|
|
423
|
-
write_config_file(target_path, { mcpServers: servers });
|
|
424
|
-
return {
|
|
425
|
-
name: safe_name,
|
|
426
|
-
path,
|
|
427
|
-
server_count: Object.keys(servers).length,
|
|
428
|
-
created_at: profile.created_at,
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
76
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spences10/pi-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.38",
|
|
4
4
|
"description": "MCP server integration for Pi that exposes configured MCP tools safely and manages large responses",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -34,16 +34,16 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@spences10/pi-child-env": "0.1.8",
|
|
37
|
+
"@spences10/pi-context": "0.0.24",
|
|
37
38
|
"@spences10/pi-settings": "0.0.0",
|
|
38
|
-
"@spences10/pi-project-trust": "0.0.12",
|
|
39
39
|
"@spences10/pi-tui-modal": "0.0.20",
|
|
40
|
-
"@spences10/pi-
|
|
40
|
+
"@spences10/pi-project-trust": "0.0.12"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
43
|
+
"@earendil-works/pi-coding-agent": "0.78.0",
|
|
44
44
|
"@types/node": "^25.8.0",
|
|
45
45
|
"typescript": "^6.0.3",
|
|
46
|
-
"vitest": "4.1.
|
|
46
|
+
"vitest": "4.1.7"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@earendil-works/pi-coding-agent": "*"
|