@spences10/pi-mcp 0.0.25 → 0.0.27

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.
@@ -0,0 +1,190 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
2
+ import { type McpConfigScope } from './config.js';
3
+ export declare function load_profile(ctx: ExtensionCommandContext, name: string, scope: McpConfigScope): Promise<boolean>;
4
+ export declare function show_mcp_profile_actions(ctx: ExtensionCommandContext, name: string): Promise<boolean>;
5
+ export declare function handle_mcp_profile(ctx: ExtensionCommandContext, args: string[]): Promise<boolean>;
@@ -0,0 +1,144 @@
1
+ import { show_input_modal, show_picker_modal, } from '@spences10/pi-tui-modal';
2
+ import { confirm_mcp_action, reload_after_config_change, } from './backup-restore.js';
3
+ import { list_mcp_profiles, load_mcp_profile, save_mcp_profile, } from './config.js';
4
+ import { show_mcp_text_modal } from './ui.js';
5
+ export async function load_profile(ctx, name, scope) {
6
+ const confirmed = await confirm_mcp_action(ctx, {
7
+ title: 'Load MCP profile?',
8
+ message: `This replaces ${scope} MCP config with profile ${name}.`,
9
+ confirm_label: 'Load profile',
10
+ });
11
+ if (!confirmed)
12
+ return false;
13
+ try {
14
+ const profile = load_mcp_profile(ctx.cwd, name, scope);
15
+ await reload_after_config_change(ctx, `Loaded MCP profile ${profile.name} (${profile.server_count} servers).`);
16
+ return true;
17
+ }
18
+ catch (error) {
19
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
20
+ return false;
21
+ }
22
+ }
23
+ export async function show_mcp_profile_actions(ctx, name) {
24
+ const profile = list_mcp_profiles().find((item) => item.name === name);
25
+ if (!profile) {
26
+ ctx.ui.notify(`MCP profile not found: ${name}`, 'warning');
27
+ return false;
28
+ }
29
+ const action = await show_picker_modal(ctx, {
30
+ title: `MCP profile: ${profile.name}`,
31
+ subtitle: `${profile.server_count} server(s)${profile.created_at ? ` • ${profile.created_at}` : ''}`,
32
+ items: [
33
+ {
34
+ value: 'load-global',
35
+ label: 'Load as global config',
36
+ description: 'Replace ~/.pi/agent/mcp.json',
37
+ },
38
+ {
39
+ value: 'load-project',
40
+ label: 'Load as project config',
41
+ description: 'Replace ./mcp.json for this project',
42
+ },
43
+ {
44
+ value: 'inspect',
45
+ label: 'Inspect profile',
46
+ description: 'Show path, creation date, and server count',
47
+ },
48
+ ],
49
+ footer: 'enter selects • esc back',
50
+ });
51
+ if (action === 'load-global')
52
+ return await load_profile(ctx, profile.name, 'global');
53
+ if (action === 'load-project')
54
+ return await load_profile(ctx, profile.name, 'project');
55
+ if (action === 'inspect') {
56
+ await show_mcp_text_modal(ctx, `MCP profile: ${profile.name}`, [
57
+ `Name: ${profile.name}`,
58
+ `Servers: ${profile.server_count}`,
59
+ `Created: ${profile.created_at ?? 'unknown'}`,
60
+ `Path: ${profile.path}`,
61
+ ].join('\n'));
62
+ }
63
+ return false;
64
+ }
65
+ export async function handle_mcp_profile(ctx, args) {
66
+ const action = args[0] ?? 'load';
67
+ if (action === 'list') {
68
+ const profiles = list_mcp_profiles();
69
+ if (profiles.length === 0) {
70
+ ctx.ui.notify('No MCP profiles saved');
71
+ return false;
72
+ }
73
+ if (!ctx.hasUI) {
74
+ ctx.ui.notify(profiles
75
+ .map((profile) => `${profile.name} — ${profile.server_count} servers`)
76
+ .join('\n'));
77
+ return false;
78
+ }
79
+ const requested = args[1];
80
+ const selected = requested ??
81
+ (await show_picker_modal(ctx, {
82
+ title: 'MCP profiles',
83
+ subtitle: `${profiles.length} saved profile(s)`,
84
+ items: profiles.map((profile) => ({
85
+ value: profile.name,
86
+ label: profile.name,
87
+ description: `${profile.server_count} servers${profile.created_at ? ` • ${profile.created_at}` : ''}`,
88
+ })),
89
+ empty_message: 'No MCP profiles saved',
90
+ footer: 'enter opens actions • esc back',
91
+ }));
92
+ return selected
93
+ ? await show_mcp_profile_actions(ctx, selected)
94
+ : false;
95
+ }
96
+ if (action === 'save') {
97
+ const name = args[1] ??
98
+ (ctx.hasUI
99
+ ? await show_input_modal(ctx, {
100
+ title: 'Save MCP profile',
101
+ label: 'Profile name',
102
+ subtitle: 'letters, numbers, underscores, hyphens',
103
+ })
104
+ : await ctx.ui.input('Save MCP profile', 'letters, numbers, underscores, hyphens'));
105
+ if (!name)
106
+ return false;
107
+ try {
108
+ const profile = save_mcp_profile(ctx.cwd, name);
109
+ ctx.ui.notify(`Saved MCP profile ${profile.name} (${profile.server_count} servers)`, 'info');
110
+ }
111
+ catch (error) {
112
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), 'warning');
113
+ }
114
+ return false;
115
+ }
116
+ if (action !== 'load') {
117
+ ctx.ui.notify('Unknown profile action. Use profile list, profile save, or profile load.', 'warning');
118
+ return false;
119
+ }
120
+ const profiles = list_mcp_profiles();
121
+ if (profiles.length === 0) {
122
+ ctx.ui.notify('No MCP profiles saved', 'warning');
123
+ return false;
124
+ }
125
+ let name = args[1];
126
+ if (!name) {
127
+ const selected = await show_picker_modal(ctx, {
128
+ title: 'Load MCP profile',
129
+ subtitle: 'Applies saved servers to global MCP config by default',
130
+ items: profiles.map((profile) => ({
131
+ value: profile.name,
132
+ label: profile.name,
133
+ description: `${profile.server_count} servers${profile.created_at ? ` • ${profile.created_at}` : ''}`,
134
+ })),
135
+ empty_message: 'No MCP profiles saved',
136
+ });
137
+ if (!selected)
138
+ return false;
139
+ name = selected;
140
+ }
141
+ const scope = (args[2] === 'project' ? 'project' : 'global');
142
+ return await load_profile(ctx, name, scope);
143
+ }
144
+ //# sourceMappingURL=profile-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-actions.js","sourceRoot":"","sources":["../src/profile-actions.ts"],"names":[],"mappings":"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"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';
2
+ import { type ServerState } from './server-state.js';
3
+ export declare function format_mcp_server_list(servers: Map<string, ServerState>): string;
4
+ export declare function show_mcp_home_modal(ctx: ExtensionCommandContext, servers: Map<string, ServerState>): Promise<string | undefined>;
5
+ export declare function show_mcp_text_modal(ctx: ExtensionCommandContext, title: string, text: string): Promise<void>;
6
+ export declare function show_mcp_server_modal(ctx: ExtensionCommandContext, servers: Map<string, ServerState>, set_server_enabled: (name: string, enabled: boolean, ctx: ExtensionCommandContext) => ServerState | undefined): Promise<boolean>;
package/dist/ui.js ADDED
@@ -0,0 +1,121 @@
1
+ import { show_picker_modal, show_settings_modal, show_text_modal, } from '@spences10/pi-tui-modal';
2
+ import { DISABLED, ENABLED, format_server_status, format_server_target, } from './server-state.js';
3
+ export function format_mcp_server_list(servers) {
4
+ if (servers.size === 0)
5
+ return 'No MCP servers configured';
6
+ const lines = [];
7
+ for (const [sname, state] of servers.entries()) {
8
+ const trust_note = state.config.metadata_trusted === false
9
+ ? ' — untrusted metadata suppressed'
10
+ : '';
11
+ lines.push(`${sname} (${format_server_status(state)}) — ${state.tool_names.length} tools${trust_note}${state.error ? ` — ${state.error}` : ''}`);
12
+ }
13
+ return lines.join('\n');
14
+ }
15
+ export async function show_mcp_home_modal(ctx, servers) {
16
+ return await show_picker_modal(ctx, {
17
+ title: 'MCP',
18
+ subtitle: `${servers.size} configured server(s)`,
19
+ items: [
20
+ {
21
+ value: 'manage',
22
+ label: 'Manage servers',
23
+ description: 'Enable, disable, inspect status and tools',
24
+ },
25
+ {
26
+ value: 'list',
27
+ label: 'List servers',
28
+ description: 'Read-only status summary',
29
+ },
30
+ {
31
+ value: 'backup',
32
+ label: 'Create backup',
33
+ description: 'Snapshot global and project MCP config',
34
+ },
35
+ {
36
+ value: 'restore',
37
+ label: 'Restore backup',
38
+ description: 'Pick a saved MCP config backup',
39
+ },
40
+ {
41
+ value: 'profile load',
42
+ label: 'Load profile',
43
+ description: 'Apply a saved MCP server profile',
44
+ },
45
+ {
46
+ value: 'profile save',
47
+ label: 'Save profile',
48
+ description: 'Save current config as a named profile',
49
+ },
50
+ {
51
+ value: 'profile list',
52
+ label: 'List profiles',
53
+ description: 'Show saved MCP profiles',
54
+ },
55
+ ],
56
+ footer: 'enter opens • esc close/back',
57
+ });
58
+ }
59
+ export async function show_mcp_text_modal(ctx, title, text) {
60
+ await show_text_modal(ctx, {
61
+ title,
62
+ text,
63
+ max_visible_lines: 20,
64
+ overlay_options: { width: '90%', minWidth: 72 },
65
+ });
66
+ }
67
+ export async function show_mcp_server_modal(ctx, servers, set_server_enabled) {
68
+ if (!ctx.hasUI)
69
+ return false;
70
+ if (servers.size === 0) {
71
+ ctx.ui.notify('No MCP servers configured');
72
+ return true;
73
+ }
74
+ const items = Array.from(servers.values()).map((state) => ({
75
+ id: state.config.name,
76
+ label: state.config.name,
77
+ currentValue: state.enabled ? ENABLED : DISABLED,
78
+ values: [ENABLED, DISABLED],
79
+ description: format_server_target(state.config),
80
+ }));
81
+ await show_settings_modal(ctx, {
82
+ title: 'MCP servers',
83
+ subtitle: () => {
84
+ const states = Array.from(servers.values());
85
+ const enabled = states.filter((state) => state.enabled).length;
86
+ const connected = states.filter((state) => state.enabled && state.status === 'connected').length;
87
+ const failed = states.filter((state) => state.enabled && state.status === 'failed').length;
88
+ return `${enabled}/${states.length} enabled • ${connected} connected${failed ? ` • ${failed} failed` : ''}`;
89
+ },
90
+ items,
91
+ enable_search: true,
92
+ detail: (item) => {
93
+ const server = servers.get(item.id);
94
+ if (!server)
95
+ return undefined;
96
+ return `${format_server_status(server)} • ${server.tool_names.length} tools • ${server.config.transport}`;
97
+ },
98
+ metadata: (item) => {
99
+ if (!item)
100
+ return undefined;
101
+ const server = servers.get(item.id);
102
+ if (!server)
103
+ return undefined;
104
+ return [
105
+ `Target: ${format_server_target(server.config)}`,
106
+ `Status: ${format_server_status(server)}`,
107
+ `Tools: ${server.tool_names.length}`,
108
+ server.config.metadata_trusted === false
109
+ ? 'Metadata: untrusted metadata suppressed'
110
+ : 'Metadata: trusted',
111
+ ...(server.error ? [`Error: ${server.error}`] : []),
112
+ ];
113
+ },
114
+ footer: 'enter/space toggles • search filters • changes save to mcp.json • esc close',
115
+ on_change: (id, new_value) => {
116
+ set_server_enabled(id, new_value === ENABLED, ctx);
117
+ },
118
+ });
119
+ return true;
120
+ }
121
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.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.25",
3
+ "version": "0.0.27",
4
4
  "description": "Pi extension for connecting MCP servers and exposing their tools",
5
5
  "keywords": [
6
6
  "mcp",
@@ -34,9 +34,9 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@spences10/pi-child-env": "0.1.4",
37
- "@spences10/pi-context": "0.0.15",
38
- "@spences10/pi-tui-modal": "0.0.13",
39
- "@spences10/pi-project-trust": "0.0.6"
37
+ "@spences10/pi-tui-modal": "0.0.15",
38
+ "@spences10/pi-project-trust": "0.0.6",
39
+ "@spences10/pi-context": "0.0.17"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^25.8.0",
@@ -61,6 +61,8 @@
61
61
  "check": "pnpm --filter \"$npm_package_name^...\" run build:self && pnpm run check:self",
62
62
  "check:self": "tsc --noEmit -p tsconfig.json",
63
63
  "test": "pnpm --filter \"$npm_package_name^...\" run build:self && pnpm run test:self",
64
- "test:self": "vitest run"
64
+ "test:self": "vitest run",
65
+ "coverage:self": "vitest run --coverage",
66
+ "coverage": "pnpm --filter \"$npm_package_name^...\" run build:self && pnpm run coverage:self"
65
67
  }
66
68
  }