@spences10/pi-mcp 0.0.29 → 0.0.30

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 CHANGED
@@ -5,8 +5,10 @@
5
5
  [![npm version](https://img.shields.io/npm/v/@spences10/pi-mcp?color=CB3837&logo=npm&logoColor=white)](https://www.npmjs.com/package/@spences10/pi-mcp)
6
6
  [![license](https://img.shields.io/npm/l/@spences10/pi-mcp)](https://www.npmjs.com/package/@spences10/pi-mcp)
7
7
 
8
- Pi extension for connecting MCP servers and exposing their tools
9
- inside Pi.
8
+ Bring your MCP servers into Pi as first-class agent tools. `pi-mcp`
9
+ discovers configured servers, exposes their tools safely, and keeps
10
+ large MCP responses manageable through Pi’s context sidecar
11
+ integration.
10
12
 
11
13
  ## Installation
12
14
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spences10/pi-mcp",
3
- "version": "0.0.29",
4
- "description": "Pi extension for connecting MCP servers and exposing their tools",
3
+ "version": "0.0.30",
4
+ "description": "MCP server integration for Pi that exposes configured MCP tools safely and manages large responses",
5
5
  "keywords": [
6
6
  "mcp",
7
7
  "model-context-protocol",
@@ -33,10 +33,10 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@spences10/pi-context": "0.0.19",
37
- "@spences10/pi-child-env": "0.1.6",
38
- "@spences10/pi-project-trust": "0.0.8",
39
- "@spences10/pi-tui-modal": "0.0.17"
36
+ "@spences10/pi-child-env": "0.1.7",
37
+ "@spences10/pi-context": "0.0.20",
38
+ "@spences10/pi-tui-modal": "0.0.18",
39
+ "@spences10/pi-project-trust": "0.0.9"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@earendil-works/pi-coding-agent": "^0.74.1",
@@ -1,11 +0,0 @@
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;
@@ -1,140 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-router.js","sourceRoot":"","sources":["../src/command-router.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
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[];
@@ -1,41 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,15 +0,0 @@
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>;
@@ -1,153 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/config/persistence.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
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;
@@ -1,79 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
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
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
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;
@@ -1,80 +0,0 @@
1
- function is_string_record(value, label, name) {
2
- if (value === undefined)
3
- return true;
4
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
5
- throw new Error(`Invalid MCP server "${name}": ${label} must be an object of string values`);
6
- }
7
- for (const [key, entry] of Object.entries(value)) {
8
- if (typeof entry !== 'string') {
9
- throw new Error(`Invalid MCP server "${name}": ${label}.${key} must be a string`);
10
- }
11
- }
12
- return true;
13
- }
14
- export function parse_server(name, entry, metadata_trusted = true) {
15
- const type = typeof entry.type === 'string'
16
- ? entry.type.trim().toLowerCase()
17
- : '';
18
- const disabled = typeof entry.disabled === 'boolean'
19
- ? entry.disabled
20
- : typeof entry.enabled === 'boolean'
21
- ? !entry.enabled
22
- : undefined;
23
- if (type && !['stdio', 'http', 'streamable-http'].includes(type)) {
24
- throw new Error(`Invalid MCP server "${name}": unsupported transport type "${type}"`);
25
- }
26
- if (type === 'http' ||
27
- type === 'streamable-http' ||
28
- entry.url !== undefined) {
29
- if (typeof entry.url !== 'string' || !entry.url.trim()) {
30
- throw new Error(`Invalid MCP server "${name}": http transport requires a url`);
31
- }
32
- is_string_record(entry.headers, 'headers', name);
33
- const headers = entry.headers;
34
- const config = {
35
- name,
36
- transport: 'http',
37
- url: entry.url.trim(),
38
- ...(headers ? { headers } : {}),
39
- ...(disabled !== undefined ? { disabled } : {}),
40
- ...(metadata_trusted
41
- ? {}
42
- : { metadata_trusted: false }),
43
- };
44
- return config;
45
- }
46
- if (typeof entry.command !== 'string' || !entry.command.trim()) {
47
- throw new Error(`Invalid MCP server "${name}": stdio transport requires a command`);
48
- }
49
- if (entry.args !== undefined &&
50
- (!Array.isArray(entry.args) ||
51
- entry.args.some((value) => typeof value !== 'string'))) {
52
- throw new Error(`Invalid MCP server "${name}": args must be an array of strings`);
53
- }
54
- is_string_record(entry.env, 'env', name);
55
- const args = entry.args;
56
- const env = entry.env;
57
- const config = {
58
- name,
59
- transport: 'stdio',
60
- command: entry.command.trim(),
61
- ...(args ? { args } : {}),
62
- ...(env ? { env } : {}),
63
- ...(disabled !== undefined ? { disabled } : {}),
64
- ...(metadata_trusted ? {} : { metadata_trusted: false }),
65
- };
66
- return config;
67
- }
68
- export function summarize_server_entry(server) {
69
- if (typeof server.url === 'string' && server.url.trim()) {
70
- return `http ${server.url.trim()}`;
71
- }
72
- if (typeof server.command === 'string' && server.command.trim()) {
73
- const args = Array.isArray(server.args)
74
- ? server.args.filter((arg) => typeof arg === 'string')
75
- : [];
76
- return ['stdio', server.command.trim(), ...args].join(' ');
77
- }
78
- return 'invalid server entry';
79
- }
80
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import { type BeforeAgentStartEvent, type ExtensionAPI, type ExtensionContext, type ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
2
- import { type ServerState } from './server-state.js';
3
- export declare function should_wait_for_mcp_connections(event: Pick<BeforeAgentStartEvent, 'systemPromptOptions'>): boolean;
4
- export interface McpLifecycle {
5
- servers: Map<string, ServerState>;
6
- ensure_servers(cwd: string, ctx?: ExtensionContext): Promise<void>;
7
- connect_server(state: ServerState, ctx?: ExtensionContext): Promise<void>;
8
- connect_all_servers(options?: {
9
- include_failed?: boolean;
10
- ctx?: ExtensionContext;
11
- }): Promise<void>;
12
- set_server_enabled(name: string, enabled: boolean, ctx: ExtensionCommandContext): ServerState | undefined;
13
- handle_before_agent_start(event: BeforeAgentStartEvent, ctx: ExtensionContext): Promise<BeforeAgentStartEvent>;
14
- shutdown(ctx: ExtensionContext): Promise<void>;
15
- }
16
- export declare function create_mcp_lifecycle(pi: ExtensionAPI): McpLifecycle;
package/dist/lifecycle.js DELETED
@@ -1,190 +0,0 @@
1
- import { defineTool, } from '@earendil-works/pi-coding-agent';
2
- import { McpClient } from './client.js';
3
- import { load_mcp_config, set_mcp_server_enabled } from './config.js';
4
- import { create_mcp_tool_registration_metadata } from './metadata.js';
5
- import { get_project_mcp_config_load_decision } from './project-config-loader.js';
6
- import { format_mcp_tool_result } from './result.js';
7
- import { count_pending_enabled_servers, create_server_states, remove_server_tools_from_active, report_mcp_failure, set_connect_feedback, summarize_mcp_tool_params, update_mcp_status, } from './server-state.js';
8
- export function should_wait_for_mcp_connections(event) {
9
- const selected_tools = event.systemPromptOptions?.selectedTools;
10
- return (!selected_tools ||
11
- selected_tools.some((tool) => tool.startsWith('mcp__')));
12
- }
13
- export function create_mcp_lifecycle(pi) {
14
- let initialized_cwd = null;
15
- let initialize_promise;
16
- let servers = new Map();
17
- const registered_tool_names = new Set();
18
- const lifecycle = {
19
- get servers() {
20
- return servers;
21
- },
22
- async ensure_servers(cwd, ctx) {
23
- if (initialized_cwd !== null)
24
- return;
25
- if (initialize_promise) {
26
- await initialize_promise;
27
- return;
28
- }
29
- initialize_promise = (async () => {
30
- const project_decision = await get_project_mcp_config_load_decision(cwd, ctx);
31
- servers = create_server_states(load_mcp_config(cwd, {
32
- include_project: project_decision.include_project,
33
- project_metadata_trusted: project_decision.metadata_trusted,
34
- }));
35
- initialized_cwd = cwd;
36
- })();
37
- try {
38
- await initialize_promise;
39
- }
40
- finally {
41
- initialize_promise = undefined;
42
- }
43
- },
44
- async connect_server(state, ctx) {
45
- if (state.status === 'connected')
46
- return;
47
- if (state.connect_promise) {
48
- await state.connect_promise;
49
- return;
50
- }
51
- state.connect_promise = (async () => {
52
- state.status = 'connecting';
53
- state.error = undefined;
54
- if (ctx)
55
- update_mcp_status(ctx, servers);
56
- const client = new McpClient(state.config);
57
- try {
58
- await client.connect();
59
- state.client = client;
60
- const mcp_tools = await client.listTools();
61
- const tool_names = [];
62
- for (const mcp_tool of mcp_tools) {
63
- const tool_name = `mcp__${state.config.name}__${mcp_tool.name}`;
64
- tool_names.push(tool_name);
65
- if (registered_tool_names.has(tool_name))
66
- continue;
67
- registered_tool_names.add(tool_name);
68
- const metadata = create_mcp_tool_registration_metadata(state.config, mcp_tool);
69
- pi.registerTool(defineTool({
70
- name: tool_name,
71
- label: metadata.label,
72
- description: metadata.description,
73
- parameters: metadata.parameters,
74
- execute: async (_id, params) => {
75
- const result = (await state.client.callTool(mcp_tool.name, params));
76
- const formatted = format_mcp_tool_result(result, {
77
- tool_name,
78
- input_summary: summarize_mcp_tool_params(params),
79
- });
80
- return {
81
- content: [
82
- { type: 'text', text: formatted.text },
83
- ],
84
- details: formatted.details,
85
- };
86
- },
87
- }));
88
- }
89
- state.tool_names = tool_names;
90
- state.status = 'connected';
91
- if (!state.enabled) {
92
- remove_server_tools_from_active(pi, state.tool_names);
93
- }
94
- else if (!process.env.MY_PI_RUNTIME_MODE ||
95
- process.env.MY_PI_RUNTIME_MODE === 'interactive') {
96
- const active = pi.getActiveTools();
97
- pi.setActiveTools([
98
- ...new Set([...active, ...state.tool_names]),
99
- ]);
100
- }
101
- }
102
- catch (error) {
103
- state.status = 'failed';
104
- state.error =
105
- error instanceof Error ? error.message : String(error);
106
- state.client = undefined;
107
- await client.disconnect().catch(() => { });
108
- report_mcp_failure(state, ctx);
109
- throw error;
110
- }
111
- finally {
112
- state.connect_promise = undefined;
113
- if (ctx)
114
- update_mcp_status(ctx, servers);
115
- }
116
- })();
117
- await state.connect_promise;
118
- },
119
- async connect_all_servers(options = {}) {
120
- await Promise.allSettled(Array.from(servers.values())
121
- .filter((state) => state.enabled)
122
- .filter((state) => options.include_failed || state.status !== 'failed')
123
- .map((state) => lifecycle.connect_server(state, options.ctx)));
124
- if (options.ctx)
125
- update_mcp_status(options.ctx, servers);
126
- },
127
- set_server_enabled(name, enabled, ctx) {
128
- const server = servers.get(name);
129
- if (!server)
130
- return undefined;
131
- server.enabled = enabled;
132
- server.config.disabled = !enabled;
133
- set_mcp_server_enabled(ctx.cwd, name, enabled);
134
- if (!enabled) {
135
- remove_server_tools_from_active(pi, server.tool_names);
136
- update_mcp_status(ctx, servers);
137
- return server;
138
- }
139
- if (server.status === 'connected') {
140
- const active = pi.getActiveTools();
141
- pi.setActiveTools([
142
- ...new Set([...active, ...server.tool_names]),
143
- ]);
144
- update_mcp_status(ctx, servers);
145
- return server;
146
- }
147
- if (server.status === 'failed') {
148
- server.status = 'disconnected';
149
- server.error = undefined;
150
- }
151
- update_mcp_status(ctx, servers);
152
- void lifecycle.connect_server(server, ctx);
153
- return server;
154
- },
155
- async handle_before_agent_start(event, ctx) {
156
- await lifecycle.ensure_servers(ctx.cwd, ctx);
157
- if (!should_wait_for_mcp_connections(event)) {
158
- void lifecycle.connect_all_servers({ ctx });
159
- return event;
160
- }
161
- const pending_server_count = count_pending_enabled_servers(servers);
162
- if (pending_server_count === 0) {
163
- update_mcp_status(ctx, servers);
164
- return event;
165
- }
166
- const restore_feedback = set_connect_feedback(ctx, pending_server_count);
167
- try {
168
- await lifecycle.connect_all_servers({ ctx });
169
- return event;
170
- }
171
- finally {
172
- restore_feedback();
173
- update_mcp_status(ctx, servers);
174
- }
175
- },
176
- async shutdown(ctx) {
177
- await Promise.allSettled(Array.from(servers.values()).map(async (server) => {
178
- await server.connect_promise?.catch(() => { });
179
- await server.client?.disconnect();
180
- server.client = undefined;
181
- if (server.status !== 'failed') {
182
- server.status = 'disconnected';
183
- }
184
- }));
185
- ctx.ui.setStatus('mcp', undefined);
186
- },
187
- };
188
- return lifecycle;
189
- }
190
- //# sourceMappingURL=lifecycle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}