@apify/mcpc 0.2.0-beta.1 → 0.2.0-beta.2

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/CHANGELOG.md CHANGED
@@ -7,8 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - New `mcpc grep <pattern>` command to search tools, resources, prompts, and server instructions across all active sessions, with support for regex (`-E`), type filters (`--tools`, `--resources`, `--prompts`, `--instructions`), single-session search (`mcpc @session grep`), and capability-aware querying (skips unsupported list operations)
13
+ - Recovery hints for crashed and expired sessions in `mcpc` session list output
14
+
10
15
  ### Fixed
11
16
 
17
+ - Fixed `mcpc help <command>` showing truncated usage line (e.g. `Usage: resources-read <uri>`) — now correctly shows `Usage: mcpc <@session> resources-read <uri>`
12
18
  - Fixed auth loss when reconnecting an unauthorized session via `mcpc connect` — the `unauthorized` status was not cleared, causing all subsequent operations to fail with "Authentication required by server" even after successful reconnection
13
19
  - HTTP proxy support (`HTTP_PROXY`/`HTTPS_PROXY` env vars) now works for MCP server connections, OAuth token refresh, and x402 payment signing — previously the MCP SDK transport and OAuth calls bypassed the global proxy dispatcher
14
20
 
package/README.md CHANGED
@@ -129,13 +129,15 @@ Commands:
129
129
  login <server> Interactively login to a server using OAuth and save profile
130
130
  logout <server> Delete an authentication profile for a server
131
131
  clean [resources...] Clean up mcpc data (sessions, profiles, logs, all)
132
+ grep <pattern> Search tools and instructions across all active sessions
132
133
  x402 [subcommand] [args...] Configure an x402 payment wallet (EXPERIMENTAL)
133
134
  help [command] [subcommand] Show help for a specific command
134
135
 
135
136
  MCP session commands (after connecting):
136
- <@session> Show MCP server info and capabilities
137
- <@session> tools-list List MCP tools
138
- <@session> tools-get <name>
137
+ <@session> Show MCP server info, capabilities, and tools
138
+ <@session> grep <pattern> Search tools, resources, or prompts
139
+ <@session> tools-list List all server tools
140
+ <@session> tools-get <name> Get tool details and schema
139
141
  <@session> tools-call <name> [arg:=val ... | <json> | <stdin]
140
142
  <@session> prompts-list
141
143
  <@session> prompts-get <name> [arg:=val ... | <json> | <stdin]
@@ -265,6 +267,49 @@ mcpc @apify shell
265
267
  Shell commands: `help`, `exit`/`quit`/Ctrl+D, Ctrl+C to cancel.
266
268
  Arrow keys navigate history (saved to `~/.mcpc/history`).
267
269
 
270
+ ### Grep (search across sessions)
271
+
272
+ `mcpc grep` searches tools, resources, and prompts across all active sessions or within a single session:
273
+
274
+ ```bash
275
+ # Search tools in all active sessions (default: tools only)
276
+ mcpc grep "search"
277
+
278
+ # Search within a single session
279
+ mcpc @apify grep "actor"
280
+
281
+ # Search resources or prompts instead of tools
282
+ mcpc grep "config" --resources
283
+ mcpc grep "greeting" --prompts
284
+
285
+ # Combine type flags
286
+ mcpc grep "data" --tools --resources --prompts
287
+
288
+ # Regex search
289
+ mcpc grep "search|find" -E
290
+
291
+ # Case-sensitive search (default is case-insensitive)
292
+ mcpc grep "Search" --case-sensitive
293
+
294
+ # Limit results
295
+ mcpc grep "e" -m 5
296
+
297
+ # JSON output for scripting
298
+ mcpc grep "actor" --json
299
+ ```
300
+
301
+ By default, `grep` searches only tools. Use `--resources` or `--prompts` to search those types
302
+ (combine with `--tools` to include tools too). Sessions that are crashed or unavailable are shown
303
+ with their status rather than silently skipped.
304
+
305
+ The `grep` command is useful for **dynamic tool discovery**,
306
+ also called [Advanced tool use](https://www.anthropic.com/engineering/advanced-tool-use) by Anthropic
307
+ or [Dynamic context discovery](https://cursor.com/blog/dynamic-context-discovery) by Cursor.
308
+ Rather than loading all tools into context, the AI agent can use `grep` to discover the right tool
309
+ for the job,and only load the matching tools into the context to reduce token usage and improve accuracy.
310
+
311
+ <!-- TODO: explain this more, show diagram -->
312
+
268
313
  ### JSON mode
269
314
 
270
315
  By default, `mcpc` prints output in Markdown-ish text format with colors, making it easy to read by both humans and AIs.
@@ -0,0 +1,13 @@
1
+ import type { CommandOptions } from '../../lib/types.js';
2
+ export interface GrepOptions extends CommandOptions {
3
+ tools?: boolean | undefined;
4
+ resources?: boolean | undefined;
5
+ prompts?: boolean | undefined;
6
+ instructions?: boolean | undefined;
7
+ regex?: boolean | undefined;
8
+ caseSensitive?: boolean | undefined;
9
+ maxResults?: number | undefined;
10
+ }
11
+ export declare function grepSession(session: string, pattern: string, options: GrepOptions): Promise<number>;
12
+ export declare function grepAllSessions(pattern: string, options: GrepOptions): Promise<number>;
13
+ //# sourceMappingURL=grep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/grep.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA0B,cAAc,EAAe,MAAM,oBAAoB,CAAC;AAgB9F,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAoVD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAyBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAmL5F"}
@@ -0,0 +1,373 @@
1
+ import chalk from 'chalk';
2
+ import { ClientError } from '../../lib/errors.js';
3
+ import { isProcessAlive } from '../../lib/utils.js';
4
+ import { consolidateSessions } from '../../lib/sessions.js';
5
+ import { withSessionClient } from '../../lib/session-client.js';
6
+ import { withMcpClient } from '../helpers.js';
7
+ import { formatJson, formatToolParamsInline, formatToolAnnotations, grayBacktick, inBackticks, } from '../output.js';
8
+ import { getBridgeStatus, formatBridgeStatus } from './sessions.js';
9
+ function buildMatcher(pattern, options) {
10
+ if (options.regex) {
11
+ let re;
12
+ try {
13
+ re = new RegExp(pattern, options.caseSensitive ? '' : 'i');
14
+ }
15
+ catch (err) {
16
+ throw new ClientError(`Invalid regex pattern: ${pattern}\n${err instanceof Error ? err.message : String(err)}`);
17
+ }
18
+ return (text) => re.test(text);
19
+ }
20
+ if (options.caseSensitive) {
21
+ return (text) => text.includes(pattern);
22
+ }
23
+ const lowerPattern = pattern.toLowerCase();
24
+ return (text) => text.toLowerCase().includes(lowerPattern);
25
+ }
26
+ function getSearchTypes(options) {
27
+ const anyFilter = options.tools || options.resources || options.prompts || options.instructions;
28
+ return {
29
+ searchTools: anyFilter ? !!options.tools : true,
30
+ searchResources: !!options.resources,
31
+ searchPrompts: !!options.prompts,
32
+ searchInstructions: anyFilter ? !!options.instructions : true,
33
+ };
34
+ }
35
+ function buildToolSearchText(tool, sessionName) {
36
+ return `${sessionName}/${tool.name} ${JSON.stringify(tool, null, 2)}`;
37
+ }
38
+ function buildResourceSearchText(resource, sessionName) {
39
+ return `${sessionName}/${resource.uri} ${JSON.stringify(resource, null, 2)}`;
40
+ }
41
+ function buildPromptSearchText(prompt, sessionName) {
42
+ return `${sessionName}/${prompt.name} ${JSON.stringify(prompt, null, 2)}`;
43
+ }
44
+ function buildInstructionsSearchText(instructions, sessionName) {
45
+ return `${sessionName} ${instructions}`;
46
+ }
47
+ async function searchClient(client, matcher, options, sessionName = '') {
48
+ const { searchTools, searchResources, searchPrompts, searchInstructions } = getSearchTypes(options);
49
+ const serverDetails = await client.getServerDetails();
50
+ const capabilities = serverDetails.capabilities;
51
+ const canListTools = searchTools && !!capabilities?.tools;
52
+ const canListResources = searchResources && !!capabilities?.resources;
53
+ const canListPrompts = searchPrompts && !!capabilities?.prompts;
54
+ const [toolsResult, resourcesResult, promptsResult] = await Promise.all([
55
+ canListTools ? client.listAllTools() : null,
56
+ canListResources ? fetchAllResources(client) : null,
57
+ canListPrompts ? fetchAllPrompts(client) : null,
58
+ ]);
59
+ const matchedTools = (toolsResult?.tools ?? []).filter((t) => matcher(buildToolSearchText(t, sessionName)));
60
+ const matchedResources = (resourcesResult ?? []).filter((r) => matcher(buildResourceSearchText(r, sessionName)));
61
+ const matchedPrompts = (promptsResult ?? []).filter((p) => matcher(buildPromptSearchText(p, sessionName)));
62
+ const instructionsText = searchInstructions ? serverDetails.instructions : undefined;
63
+ const matchedInstructions = !!instructionsText && matcher(buildInstructionsSearchText(instructionsText, sessionName));
64
+ return {
65
+ tools: matchedTools,
66
+ resources: matchedResources,
67
+ prompts: matchedPrompts,
68
+ instructions: matchedInstructions,
69
+ };
70
+ }
71
+ async function fetchAllResources(client) {
72
+ const all = [];
73
+ let cursor;
74
+ do {
75
+ const result = await client.listResources(cursor);
76
+ all.push(...result.resources);
77
+ cursor = result.nextCursor;
78
+ } while (cursor);
79
+ return all;
80
+ }
81
+ async function fetchAllPrompts(client) {
82
+ const all = [];
83
+ let cursor;
84
+ do {
85
+ const result = await client.listPrompts(cursor);
86
+ all.push(...result.prompts);
87
+ cursor = result.nextCursor;
88
+ } while (cursor);
89
+ return all;
90
+ }
91
+ function countMatches(result) {
92
+ return (result.tools.length +
93
+ result.resources.length +
94
+ result.prompts.length +
95
+ (result.instructions ? 1 : 0));
96
+ }
97
+ function countMatchesByType(result) {
98
+ return {
99
+ tools: result.tools.length,
100
+ resources: result.resources.length,
101
+ prompts: result.prompts.length,
102
+ };
103
+ }
104
+ function sumMatchesByType(results) {
105
+ return results.reduce((acc, r) => ({
106
+ tools: acc.tools + r.tools.length,
107
+ resources: acc.resources + r.resources.length,
108
+ prompts: acc.prompts + r.prompts.length,
109
+ }), { tools: 0, resources: 0, prompts: 0 });
110
+ }
111
+ function truncateResult(result, limit) {
112
+ const total = countMatches(result);
113
+ if (total <= limit)
114
+ return { result, truncated: 0 };
115
+ let remaining = limit;
116
+ const instructions = result.instructions && remaining > 0 ? true : false;
117
+ if (instructions)
118
+ remaining--;
119
+ const tools = result.tools.slice(0, remaining);
120
+ remaining -= tools.length;
121
+ const resources = result.resources.slice(0, remaining);
122
+ remaining -= resources.length;
123
+ const prompts = result.prompts.slice(0, remaining);
124
+ return {
125
+ result: { tools, resources, prompts, instructions },
126
+ truncated: total - limit,
127
+ };
128
+ }
129
+ function formatToolLine(tool) {
130
+ const bullet = chalk.dim('*');
131
+ const params = formatToolParamsInline(tool.inputSchema);
132
+ const parts = [];
133
+ const annotationsStr = formatToolAnnotations(tool.annotations);
134
+ if (annotationsStr)
135
+ parts.push(annotationsStr);
136
+ const toolAny = tool;
137
+ const execution = toolAny.execution;
138
+ const taskSupport = execution?.taskSupport;
139
+ if (taskSupport)
140
+ parts.push(`task:${taskSupport}`);
141
+ const suffix = parts.length > 0 ? ` ${chalk.gray(`[${parts.join(', ')}]`)}` : '';
142
+ return `${bullet} ${grayBacktick()}${chalk.cyan(tool.name)}${params}${grayBacktick()}${suffix}`;
143
+ }
144
+ function formatResourceLine(resource) {
145
+ const bullet = chalk.dim('*');
146
+ return `${bullet} ${inBackticks(resource.uri)}`;
147
+ }
148
+ function formatPromptLine(prompt) {
149
+ const bullet = chalk.dim('*');
150
+ return `${bullet} ${inBackticks(prompt.name)}`;
151
+ }
152
+ function formatResultSection(label, items, formatLine, indent) {
153
+ if (items.length === 0)
154
+ return [];
155
+ const lines = [];
156
+ lines.push(`${indent}${chalk.bold(`${label} (${items.length}):`)}`);
157
+ for (const item of items) {
158
+ lines.push(`${indent} ${formatLine(item)}`);
159
+ }
160
+ return lines;
161
+ }
162
+ function formatGrepResultHuman(result, indent = '') {
163
+ const lines = [];
164
+ if (result.instructions) {
165
+ lines.push(`${indent}${chalk.bold('Instructions')}`);
166
+ }
167
+ lines.push(...formatResultSection('Tools', result.tools, formatToolLine, indent));
168
+ lines.push(...formatResultSection('Resources', result.resources, formatResourceLine, indent));
169
+ lines.push(...formatResultSection('Prompts', result.prompts, formatPromptLine, indent));
170
+ return lines;
171
+ }
172
+ export async function grepSession(session, pattern, options) {
173
+ const matcher = buildMatcher(pattern, options);
174
+ const sessionRef = session.startsWith('@') ? session : `@${session}`;
175
+ return await withMcpClient(session, options, async (client) => {
176
+ const fullResult = await searchClient(client, matcher, options, sessionRef);
177
+ const total = countMatches(fullResult);
178
+ const { result, truncated } = options.maxResults != null
179
+ ? truncateResult(fullResult, options.maxResults)
180
+ : { result: fullResult, truncated: 0 };
181
+ if (options.outputMode === 'json') {
182
+ const matchCounts = countMatchesByType(fullResult);
183
+ const jsonOutput = {
184
+ sessions: [
185
+ {
186
+ name: sessionRef,
187
+ status: 'live',
188
+ instructions: result.instructions,
189
+ tools: result.tools,
190
+ resources: result.resources,
191
+ prompts: result.prompts,
192
+ },
193
+ ],
194
+ totalMatches: {
195
+ ...matchCounts,
196
+ ...(truncated > 0 ? { truncated } : {}),
197
+ },
198
+ };
199
+ console.log(formatJson(jsonOutput));
200
+ }
201
+ else {
202
+ if (total === 0) {
203
+ console.log('No matches found.');
204
+ }
205
+ else {
206
+ const lines = formatGrepResultHuman(result);
207
+ lines.push('');
208
+ const suffix = truncated > 0 ? ` (showing ${countMatches(result)})` : '';
209
+ lines.push(chalk.dim(`${total} ${total === 1 ? 'match' : 'matches'}${suffix}.`));
210
+ console.log(lines.join('\n'));
211
+ }
212
+ }
213
+ return total > 0 ? 0 : 1;
214
+ });
215
+ }
216
+ function formatSkippedSession(skipped) {
217
+ const { dot, text } = formatBridgeStatus(skipped.status);
218
+ return `${chalk.cyan(skipped.name)} ${dot} ${text}`;
219
+ }
220
+ function isSessionQueryable(session) {
221
+ return !!session.pid && isProcessAlive(session.pid);
222
+ }
223
+ export async function grepAllSessions(pattern, options) {
224
+ const matcher = buildMatcher(pattern, options);
225
+ const { sessions } = await consolidateSessions(false);
226
+ const allSessionEntries = Object.values(sessions);
227
+ if (allSessionEntries.length === 0) {
228
+ if (options.outputMode === 'json') {
229
+ console.log(formatJson({ sessions: [], totalMatches: { tools: 0, resources: 0, prompts: 0 } }));
230
+ }
231
+ else {
232
+ console.log(chalk.bold('No active sessions.'));
233
+ console.log(chalk.dim(' \u21B3 run: mcpc connect mcp.example.com @test'));
234
+ }
235
+ return 1;
236
+ }
237
+ const toSessionRef = (name) => (name.startsWith('@') ? name : `@${name}`);
238
+ const queryableSessions = [];
239
+ const skippedSessions = [];
240
+ for (const session of allSessionEntries) {
241
+ if (isSessionQueryable(session)) {
242
+ queryableSessions.push(session);
243
+ }
244
+ else {
245
+ const status = getBridgeStatus(session);
246
+ skippedSessions.push({
247
+ name: toSessionRef(session.name),
248
+ status,
249
+ });
250
+ }
251
+ }
252
+ const settled = await Promise.allSettled(queryableSessions.map(async (session) => {
253
+ const sessionName = toSessionRef(session.name);
254
+ const result = await withSessionClient(sessionName, async (client) => {
255
+ return searchClient(client, matcher, options, sessionName);
256
+ });
257
+ return {
258
+ name: sessionName,
259
+ ...result,
260
+ };
261
+ }));
262
+ const results = [];
263
+ const resultsWithMatches = [];
264
+ const errors = [];
265
+ for (const [i, outcome] of settled.entries()) {
266
+ if (outcome.status === 'fulfilled') {
267
+ results.push(outcome.value);
268
+ if (countMatches(outcome.value) > 0) {
269
+ resultsWithMatches.push(outcome.value);
270
+ }
271
+ }
272
+ else {
273
+ const reason = outcome.reason;
274
+ errors.push({
275
+ name: toSessionRef(queryableSessions[i].name),
276
+ error: reason instanceof Error ? reason.message : String(reason),
277
+ });
278
+ }
279
+ }
280
+ const totalMatches = sumMatchesByType(results);
281
+ const totalMatchCount = results.reduce((sum, r) => sum + countMatches(r), 0);
282
+ let displayResultsWithMatches = resultsWithMatches;
283
+ let totalTruncated = 0;
284
+ if (options.maxResults != null) {
285
+ let remaining = options.maxResults;
286
+ displayResultsWithMatches = [];
287
+ for (const r of resultsWithMatches) {
288
+ if (remaining <= 0) {
289
+ totalTruncated += countMatches(r);
290
+ continue;
291
+ }
292
+ const { result: truncR, truncated } = truncateResult(r, remaining);
293
+ remaining -= countMatches(truncR);
294
+ totalTruncated += truncated;
295
+ displayResultsWithMatches.push({ ...r, ...truncR });
296
+ }
297
+ }
298
+ if (options.outputMode === 'json') {
299
+ const truncatedResultsByName = new Map(displayResultsWithMatches.map((r) => [r.name, r]));
300
+ const sessionEntries = [
301
+ ...results.map((r) => {
302
+ if (options.maxResults == null) {
303
+ return {
304
+ name: r.name,
305
+ status: 'live',
306
+ instructions: r.instructions,
307
+ tools: r.tools,
308
+ resources: r.resources,
309
+ prompts: r.prompts,
310
+ };
311
+ }
312
+ const display = truncatedResultsByName.get(r.name);
313
+ return {
314
+ name: r.name,
315
+ status: 'live',
316
+ instructions: display?.instructions ?? false,
317
+ tools: display?.tools ?? [],
318
+ resources: display?.resources ?? [],
319
+ prompts: display?.prompts ?? [],
320
+ };
321
+ }),
322
+ ...errors.map((e) => ({
323
+ name: e.name,
324
+ status: 'error',
325
+ error: e.error,
326
+ })),
327
+ ...skippedSessions.map((s) => ({
328
+ name: s.name,
329
+ status: s.status,
330
+ })),
331
+ ];
332
+ const jsonOutput = {
333
+ sessions: sessionEntries,
334
+ totalMatches: {
335
+ ...totalMatches,
336
+ ...(totalTruncated > 0 ? { truncated: totalTruncated } : {}),
337
+ },
338
+ };
339
+ console.log(formatJson(jsonOutput));
340
+ }
341
+ else {
342
+ const lines = [];
343
+ for (const skipped of skippedSessions) {
344
+ lines.push(formatSkippedSession(skipped));
345
+ }
346
+ for (const r of displayResultsWithMatches) {
347
+ lines.push(chalk.cyan(r.name));
348
+ lines.push(...formatGrepResultHuman(r, ' '));
349
+ lines.push('');
350
+ }
351
+ for (const err of errors) {
352
+ lines.push(chalk.yellow(`Warning: ${err.name} \u2014 ${err.error}`));
353
+ }
354
+ if (totalMatchCount === 0 && skippedSessions.length === 0) {
355
+ console.log('No matches found.');
356
+ }
357
+ else {
358
+ if (totalMatchCount > 0) {
359
+ const sessionCount = resultsWithMatches.length;
360
+ const showing = totalMatchCount - totalTruncated;
361
+ const suffix = totalTruncated > 0 ? ` (showing ${showing})` : '';
362
+ lines.push(chalk.dim(`${totalMatchCount} ${totalMatchCount === 1 ? 'match' : 'matches'} across ${sessionCount} ${sessionCount === 1 ? 'session' : 'sessions'}${suffix}.`));
363
+ }
364
+ else if (lines.length > 0) {
365
+ lines.push('');
366
+ lines.push('No matches found.');
367
+ }
368
+ console.log(lines.join('\n'));
369
+ }
370
+ }
371
+ return totalMatchCount > 0 ? 0 : 1;
372
+ }
373
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/cli/commands/grep.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,17 @@ export declare function connectSession(target: string, name: string, options: {
12
12
  x402?: boolean;
13
13
  insecure?: boolean;
14
14
  }): Promise<void>;
15
+ export type DisplayStatus = 'live' | 'disconnected' | 'crashed' | 'unauthorized' | 'expired';
16
+ export declare function getBridgeStatus(session: {
17
+ status?: string;
18
+ pid?: number;
19
+ lastSeenAt?: string;
20
+ }): DisplayStatus;
21
+ export declare function formatBridgeStatus(status: DisplayStatus): {
22
+ dot: string;
23
+ text: string;
24
+ };
25
+ export declare function formatTimeAgo(isoDate: string | undefined): string;
15
26
  export declare function listSessionsAndAuthProfiles(options: {
16
27
  outputMode: OutputMode;
17
28
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sessions.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,UAAU,EAMX,MAAM,oBAAoB,CAAC;AA+D5B,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAiOf;AA8ED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,UAAU,EAAE,UAAU,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFhB;AAKD,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAKD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAyCf;AAKD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD,OAAO,CAAC,IAAI,CAAC,CA8Gf;AAKD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjG;AAKD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sessions.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,UAAU,EAMX,MAAM,oBAAoB,CAAC;AA+D5B,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,IAAI,CAAC,CAiOf;AAID,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAK7F,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,aAAa,CAkBhB;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAavF;AAKD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAkBjE;AAMD,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,UAAU,EAAE,UAAU,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFhB;AAKD,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAKD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAyCf;AAKD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD,OAAO,CAAC,IAAI,CAAC,CA8Gf;AAKD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjG;AAKD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D"}
@@ -195,7 +195,7 @@ export async function connectSession(target, name, options) {
195
195
  logger.debug(`showServerDetails failed for new session ${name}: ${detailsError.message}`);
196
196
  }
197
197
  }
198
- function getBridgeStatus(session) {
198
+ export function getBridgeStatus(session) {
199
199
  if (session.status === 'unauthorized') {
200
200
  return 'unauthorized';
201
201
  }
@@ -213,7 +213,7 @@ function getBridgeStatus(session) {
213
213
  }
214
214
  return 'live';
215
215
  }
216
- function formatBridgeStatus(status) {
216
+ export function formatBridgeStatus(status) {
217
217
  switch (status) {
218
218
  case 'live':
219
219
  return { dot: chalk.green('●'), text: chalk.green('live') };
@@ -227,7 +227,7 @@ function formatBridgeStatus(status) {
227
227
  return { dot: chalk.red('○'), text: chalk.red('expired') };
228
228
  }
229
229
  }
230
- function formatTimeAgo(isoDate) {
230
+ export function formatTimeAgo(isoDate) {
231
231
  if (!isoDate)
232
232
  return '';
233
233
  const date = new Date(isoDate);
@@ -291,6 +291,12 @@ export async function listSessionsAndAuthProfiles(options) {
291
291
  const target = getServerHost(session.server.url || session.server.command || '');
292
292
  console.log(chalk.dim(` ↳ run: mcpc login ${target} && mcpc ${session.name} restart`));
293
293
  }
294
+ else if (status === 'crashed') {
295
+ console.log(chalk.dim(` ↳ run: mcpc ${session.name}`));
296
+ }
297
+ else if (status === 'expired') {
298
+ console.log(chalk.dim(` ↳ run: mcpc ${session.name} restart`));
299
+ }
294
300
  }
295
301
  }
296
302
  console.log('');
@@ -299,7 +305,7 @@ export async function listSessionsAndAuthProfiles(options) {
299
305
  console.log(chalk.dim(' ↳ run: mcpc login mcp.example.com'));
300
306
  }
301
307
  else {
302
- console.log(chalk.bold('Available OAuth profiles:'));
308
+ console.log(chalk.bold('Saved OAuth profiles:'));
303
309
  for (const profile of profiles) {
304
310
  const hostStr = getServerHost(profile.serverUrl);
305
311
  const nameStr = chalk.magenta(profile.name);