@mcp-z/cli 1.0.3 → 1.0.4

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.
Files changed (39) hide show
  1. package/bin/cli.js +1 -1
  2. package/dist/cjs/cli.js.map +1 -1
  3. package/dist/cjs/commands/call-tool.js.map +1 -1
  4. package/dist/cjs/commands/get-prompt.js.map +1 -1
  5. package/dist/cjs/commands/inspect.js.map +1 -1
  6. package/dist/cjs/commands/manifest/env-prompting.js.map +1 -1
  7. package/dist/cjs/commands/manifest/generate.js.map +1 -1
  8. package/dist/cjs/commands/manifest/index.js.map +1 -1
  9. package/dist/cjs/commands/manifest/metadata-reader.js.map +1 -1
  10. package/dist/cjs/commands/manifest/validate.js.map +1 -1
  11. package/dist/cjs/commands/read-resource.js.map +1 -1
  12. package/dist/cjs/commands/search.js.map +1 -1
  13. package/dist/cjs/commands/up.js.map +1 -1
  14. package/dist/cjs/index.d.cts +6 -6
  15. package/dist/cjs/index.d.ts +6 -6
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/lib/find-config.js.map +1 -1
  18. package/dist/cjs/lib/json-schema.js.map +1 -1
  19. package/dist/cjs/lib/resolve-server-config.js.map +1 -1
  20. package/dist/cjs/types.js.map +1 -1
  21. package/dist/esm/cli.js.map +1 -1
  22. package/dist/esm/commands/call-tool.js.map +1 -1
  23. package/dist/esm/commands/get-prompt.js.map +1 -1
  24. package/dist/esm/commands/inspect.js.map +1 -1
  25. package/dist/esm/commands/manifest/env-prompting.js.map +1 -1
  26. package/dist/esm/commands/manifest/generate.js.map +1 -1
  27. package/dist/esm/commands/manifest/index.js.map +1 -1
  28. package/dist/esm/commands/manifest/metadata-reader.js.map +1 -1
  29. package/dist/esm/commands/manifest/validate.js.map +1 -1
  30. package/dist/esm/commands/read-resource.js.map +1 -1
  31. package/dist/esm/commands/search.js.map +1 -1
  32. package/dist/esm/commands/up.js.map +1 -1
  33. package/dist/esm/index.d.ts +6 -6
  34. package/dist/esm/index.js.map +1 -1
  35. package/dist/esm/lib/find-config.js.map +1 -1
  36. package/dist/esm/lib/json-schema.js.map +1 -1
  37. package/dist/esm/lib/resolve-server-config.js.map +1 -1
  38. package/dist/esm/types.js.map +1 -1
  39. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // biome-ignore lint/security/noGlobalEval: dual esm and cjs
4
- if (typeof require === 'undefined') eval("import('../dist/esm/cli.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-z')).catch((err) => { console.log(err); process.exit(-1); });");
4
+ if (typeof require === 'undefined') eval("import('../dist/esm/cli.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-z')).catch((err) => { console.error(err); process.exit(-1); });");
5
5
  else require('../dist/cjs/cli.js')(process.argv.slice(2), 'mcp-z');
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/cli.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { type CallToolOptions, callToolCommand } from './commands/call-tool.ts';\nimport { type GetPromptOptions, getPromptCommand } from './commands/get-prompt.ts';\nimport { inspectCommand } from './commands/inspect.ts';\nimport { createManifestCommand } from './commands/manifest/index.ts';\nimport { type ReadResourceOptions, readResourceCommand } from './commands/read-resource.ts';\nimport { searchCommand } from './commands/search.ts';\nimport { upCommand } from './commands/up.ts';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nexport default function cli(argv: string[], programName: string) {\n const program = new Command();\n program.name(programName).description('mcp-z helper CLI').version(pkg.version);\n\n program\n .command('up')\n .description('Start MCP server cluster (starts all servers by default)')\n .option('--config <path>', 'Config file path (searches up to home directory)')\n .option('--stdio-only', 'Start only stdio servers (Claude Code compatible)')\n .option('--http-only', 'Start only HTTP servers with start blocks (Claude Code Desktop)')\n .action(async (options) => {\n try {\n const clusterResult = await upCommand({ config: options.config, stdioOnly: options.stdioOnly, httpOnly: options.httpOnly });\n\n // If httpOnly mode and no servers were spawned, exit immediately\n if (options.httpOnly && clusterResult.servers.size === 0) process.exit(0);\n\n const shutdown = async (sig: string) => {\n console.log('Shutting down (signal=', sig, ')');\n if (clusterResult && typeof clusterResult.close === 'function') {\n try {\n await clusterResult.close(sig === 'SIGTERM' ? 'SIGTERM' : 'SIGINT', { timeoutMs: 1000 });\n } catch (_) {\n /* ignore */\n }\n }\n process.exit(0);\n };\n\n // Signal handlers trigger async shutdown then exit\n process.on('SIGINT', () => {\n shutdown('SIGINT').catch(() => process.exit(1));\n });\n process.on('SIGTERM', () => {\n shutdown('SIGTERM').catch(() => process.exit(1));\n });\n\n // Keep process alive - wait for signal\n await new Promise(() => {});\n } catch (error) {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\n program\n .command('inspect')\n .description('Inspect MCP servers: explore tools, resources, prompts, and health status')\n .option('--config <path>', 'Config file path (searches up to home directory)')\n .option('--servers <list>', 'Comma-separated server names to inspect')\n .option('--tools', 'Show tools only')\n .option('--resources', 'Show resources only')\n .option('--prompts', 'Show prompts only')\n .option('--health', 'Show health diagnostics only')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Include detailed schemas')\n .option('--attach', 'Connect to running servers (default: spawn servers)')\n .action(async (options) => {\n try {\n await inspectCommand({ config: options.config, servers: options.servers, tools: options.tools, resources: options.resources, prompts: options.prompts, health: options.health, json: options.json, verbose: options.verbose, attach: options.attach });\n } catch (error) {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\n program\n .command('call-tool [server] <tool> <args>')\n .description('Execute an MCP tool with JSON arguments')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--run <cmd>', 'Stdio run command (e.g., \"npx -y @echo/server\")')\n .option('--url <url>', 'HTTP server URL')\n .option('--server <json>', 'Full server config as JSON')\n .option('--json', 'Output as JSON')\n .action(async (server: string | undefined, tool: string, args: string, options: Omit<CallToolOptions, 'server' | 'tool' | 'args'> & { server?: string; run?: string }) => {\n // Handle case where server is actually the tool when using inline config\n // Commander parses: call-tool [server] <tool> <args>\n // With --run: server=undefined, tool=actualTool, args=actualArgs\n // Without --run: server=serverName, tool=actualTool, args=actualArgs\n const opts: CallToolOptions = {\n server,\n tool,\n args,\n ...options,\n run: options.run,\n serverConfig: options.server, // Rename --server to serverConfig to avoid conflict\n };\n await callToolCommand(opts);\n });\n\n program\n .command('read-resource [server] <uri>')\n .description('Read an MCP resource by URI')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--run <cmd>', 'Stdio run command (e.g., \"npx -y @echo/server\")')\n .option('--url <url>', 'HTTP server URL')\n .option('--server <json>', 'Full server config as JSON')\n .option('--json', 'Output as JSON')\n .action(async (server: string | undefined, uri: string, options: Omit<ReadResourceOptions, 'server' | 'uri'> & { server?: string; run?: string }) => {\n const opts: ReadResourceOptions = {\n server,\n uri,\n ...options,\n run: options.run,\n serverConfig: options.server, // Rename --server to serverConfig to avoid conflict\n };\n await readResourceCommand(opts);\n });\n\n program\n .command('get-prompt [server] <name> [args]')\n .description('Get an MCP prompt with optional JSON arguments')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--run <cmd>', 'Stdio run command (e.g., \"npx -y @echo/server\")')\n .option('--url <url>', 'HTTP server URL')\n .option('--server <json>', 'Full server config as JSON')\n .option('--json', 'Output as JSON')\n .action(async (server: string | undefined, name: string, args: string | undefined, options: Omit<GetPromptOptions, 'server' | 'name' | 'args'> & { server?: string; run?: string }) => {\n const opts: GetPromptOptions = {\n server,\n name,\n args: args || '{}',\n ...options,\n run: options.run,\n serverConfig: options.server, // Rename --server to serverConfig to avoid conflict\n };\n await getPromptCommand(opts);\n });\n\n program\n .command('search <query>')\n .description('Search for tools, prompts, and resources across MCP servers')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--servers <list>', 'Comma-separated server names to search')\n .option('--types <list>', 'Comma-separated types: tool,prompt,resource (default: all)')\n .option('--fields <list>', 'Comma-separated fields: name,description,schema,server (default: name,description,schema)')\n .option('--limit <number>', 'Maximum results to return (default: 20)', Number.parseInt)\n .option('--threshold <number>', 'Minimum relevance score 0-1 (default: 0)', Number.parseFloat)\n .option('--json', 'Output as JSON')\n .option('--attach', 'Connect to running servers (default: spawn servers)')\n .action(async (query: string, options) => {\n try {\n await searchCommand(query, options);\n } catch (error) {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\n // Add config command\n program.addCommand(createManifestCommand());\n\n program.parse(['node', 'cli', ...argv]);\n}\n\n// Entry point: run CLI when executed directly (not imported)\nimport { fileURLToPath } from 'url';\n\nif (import.meta.url.startsWith('file:')) {\n const modulePath = fileURLToPath(import.meta.url);\n if (process.argv[1] === modulePath || process.argv[1] === modulePath.replace(/\\.ts$/, '.js')) {\n cli(process.argv.slice(2), 'mcp-z');\n }\n}\n"],"names":["cli","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","argv","programName","program","Command","name","description","version","command","option","action","options","clusterResult","shutdown","error","upCommand","config","stdioOnly","httpOnly","servers","size","process","exit","sig","_","console","log","close","timeoutMs","on","catch","Promise","Error","message","String","inspectCommand","tools","resources","prompts","health","json","verbose","attach","server","tool","args","opts","run","serverConfig","callToolCommand","uri","readResourceCommand","getPromptCommand","Number","parseInt","parseFloat","query","searchCommand","addCommand","createManifestCommand","startsWith","modulePath","replace","slice"],"mappings":";;;;+BAeA;;;eAAwBA;;;yBAfA;0DACJ;qEACG;4DACD;2DACD;0BACiC;2BACE;yBACzB;uBACO;8BACwB;wBAChC;oBACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE1B,IAAMC,MAAMC,KAAKC,KAAK,CAACC,IAAGC,YAAY,CAACC,MAAKC,IAAI,CAACC,IAAAA,uBAAU,EAACC,KAAIC,aAAa,CAAC,uDAAmB,iBAAiB;AAEnG,SAASV,IAAIW,IAAc,EAAEC,WAAmB;IAC7D,IAAMC,UAAU,IAAIC,kBAAO;IAC3BD,QAAQE,IAAI,CAACH,aAAaI,WAAW,CAAC,oBAAoBC,OAAO,CAAChB,IAAIgB,OAAO;IAE7EJ,QACGK,OAAO,CAAC,MACRF,WAAW,CAAC,4DACZG,MAAM,CAAC,mBAAmB,oDAC1BA,MAAM,CAAC,gBAAgB,qDACvBA,MAAM,CAAC,eAAe,mEACtBC,MAAM,CAAC,SAAOC;;gBAELC,eAKAC,UAsBCC;;;;;;;;;;wBA3Be;;4BAAMC,IAAAA,eAAS,EAAC;gCAAEC,QAAQL,QAAQK,MAAM;gCAAEC,WAAWN,QAAQM,SAAS;gCAAEC,UAAUP,QAAQO,QAAQ;4BAAC;;;wBAAnHN,gBAAgB;wBAEtB,iEAAiE;wBACjE,IAAID,QAAQO,QAAQ,IAAIN,cAAcO,OAAO,CAACC,IAAI,KAAK,GAAGC,QAAQC,IAAI,CAAC;wBAEjET,WAAW,SAAOU;;oCAKXC;;;;4CAJXC,QAAQC,GAAG,CAAC,0BAA0BH,KAAK;iDACvCX,CAAAA,iBAAiB,OAAOA,cAAce,KAAK,KAAK,UAAS,GAAzDf;;;;;;;;;;;;4CAEA;;gDAAMA,cAAce,KAAK,CAACJ,QAAQ,YAAY,YAAY,UAAU;oDAAEK,WAAW;gDAAK;;;4CAAtF;;;;;;4CACOJ;;;;;;4CAIXH,QAAQC,IAAI,CAAC;;;;;;4BACf;;wBAEA,mDAAmD;wBACnDD,QAAQQ,EAAE,CAAC,UAAU;4BACnBhB,SAAS,UAAUiB,KAAK,CAAC;uCAAMT,QAAQC,IAAI,CAAC;;wBAC9C;wBACAD,QAAQQ,EAAE,CAAC,WAAW;4BACpBhB,SAAS,WAAWiB,KAAK,CAAC;uCAAMT,QAAQC,IAAI,CAAC;;wBAC/C;wBAEA,uCAAuC;wBACvC;;4BAAM,IAAIS,QAAQ,YAAO;;;wBAAzB;;;;;;wBACOjB;wBACPW,QAAQX,KAAK,CAAC,AAAC,OAA6D,OAAvDA,AAAK,YAALA,OAAiBkB,SAAQlB,MAAMmB,OAAO,GAAGC,OAAOpB;wBACrEO,QAAQC,IAAI,CAAC;;;;;;;;;;;QAEjB;;IAEFnB,QACGK,OAAO,CAAC,WACRF,WAAW,CAAC,6EACZG,MAAM,CAAC,mBAAmB,oDAC1BA,MAAM,CAAC,oBAAoB,2CAC3BA,MAAM,CAAC,WAAW,mBAClBA,MAAM,CAAC,eAAe,uBACtBA,MAAM,CAAC,aAAa,qBACpBA,MAAM,CAAC,YAAY,gCACnBA,MAAM,CAAC,UAAU,kBACjBA,MAAM,CAAC,aAAa,4BACpBA,MAAM,CAAC,YAAY,uDACnBC,MAAM,CAAC,SAAOC;;gBAGJG;;;;;;;;;;wBADP;;4BAAMqB,IAAAA,yBAAc,EAAC;gCAAEnB,QAAQL,QAAQK,MAAM;gCAAEG,SAASR,QAAQQ,OAAO;gCAAEiB,OAAOzB,QAAQyB,KAAK;gCAAEC,WAAW1B,QAAQ0B,SAAS;gCAAEC,SAAS3B,QAAQ2B,OAAO;gCAAEC,QAAQ5B,QAAQ4B,MAAM;gCAAEC,MAAM7B,QAAQ6B,IAAI;gCAAEC,SAAS9B,QAAQ8B,OAAO;gCAAEC,QAAQ/B,QAAQ+B,MAAM;4BAAC;;;wBAApP;;;;;;wBACO5B;wBACPW,QAAQX,KAAK,CAAC,AAAC,OAA6D,OAAvDA,AAAK,YAALA,OAAiBkB,SAAQlB,MAAMmB,OAAO,GAAGC,OAAOpB;wBACrEO,QAAQC,IAAI,CAAC;;;;;;;;;;;QAEjB;;IAEFnB,QACGK,OAAO,CAAC,oCACRF,WAAW,CAAC,2CACZG,MAAM,CAAC,mBAAmB,gDAC1BA,MAAM,CAAC,eAAe,mDACtBA,MAAM,CAAC,eAAe,mBACtBA,MAAM,CAAC,mBAAmB,8BAC1BA,MAAM,CAAC,UAAU,kBACjBC,MAAM,CAAC,SAAOiC,QAA4BC,MAAcC,MAAclC;;gBAK/DmC;;;;wBAJN,yEAAyE;wBACzE,qDAAqD;wBACrD,iEAAiE;wBACjE,qEAAqE;wBAC/DA,OAAwB;4BAC5BH,QAAAA;4BACAC,MAAAA;4BACAC,MAAAA;2BACGlC;4BACHoC,KAAKpC,QAAQoC,GAAG;4BAChBC,cAAcrC,QAAQgC,MAAM;;wBAE9B;;4BAAMM,IAAAA,2BAAe,EAACH;;;wBAAtB;;;;;;QACF;;IAEF3C,QACGK,OAAO,CAAC,gCACRF,WAAW,CAAC,+BACZG,MAAM,CAAC,mBAAmB,gDAC1BA,MAAM,CAAC,eAAe,mDACtBA,MAAM,CAAC,eAAe,mBACtBA,MAAM,CAAC,mBAAmB,8BAC1BA,MAAM,CAAC,UAAU,kBACjBC,MAAM,CAAC,SAAOiC,QAA4BO,KAAavC;;gBAChDmC;;;;wBAAAA,OAA4B;4BAChCH,QAAAA;4BACAO,KAAAA;2BACGvC;4BACHoC,KAAKpC,QAAQoC,GAAG;4BAChBC,cAAcrC,QAAQgC,MAAM;;wBAE9B;;4BAAMQ,IAAAA,mCAAmB,EAACL;;;wBAA1B;;;;;;QACF;;IAEF3C,QACGK,OAAO,CAAC,qCACRF,WAAW,CAAC,kDACZG,MAAM,CAAC,mBAAmB,gDAC1BA,MAAM,CAAC,eAAe,mDACtBA,MAAM,CAAC,eAAe,mBACtBA,MAAM,CAAC,mBAAmB,8BAC1BA,MAAM,CAAC,UAAU,kBACjBC,MAAM,CAAC,SAAOiC,QAA4BtC,MAAcwC,MAA0BlC;;gBAC3EmC;;;;wBAAAA,OAAyB;4BAC7BH,QAAAA;4BACAtC,MAAAA;4BACAwC,MAAMA,QAAQ;2BACXlC;4BACHoC,KAAKpC,QAAQoC,GAAG;4BAChBC,cAAcrC,QAAQgC,MAAM;;wBAE9B;;4BAAMS,IAAAA,6BAAgB,EAACN;;;wBAAvB;;;;;;QACF;;IAEF3C,QACGK,OAAO,CAAC,kBACRF,WAAW,CAAC,+DACZG,MAAM,CAAC,mBAAmB,gDAC1BA,MAAM,CAAC,oBAAoB,0CAC3BA,MAAM,CAAC,kBAAkB,8DACzBA,MAAM,CAAC,mBAAmB,6FAC1BA,MAAM,CAAC,oBAAoB,2CAA2C4C,OAAOC,QAAQ,EACrF7C,MAAM,CAAC,wBAAwB,4CAA4C4C,OAAOE,UAAU,EAC5F9C,MAAM,CAAC,UAAU,kBACjBA,MAAM,CAAC,YAAY,uDACnBC,MAAM,CAAC,SAAO8C,OAAe7C;;gBAGnBG;;;;;;;;;;wBADP;;4BAAM2C,IAAAA,uBAAa,EAACD,OAAO7C;;;wBAA3B;;;;;;wBACOG;wBACPW,QAAQX,KAAK,CAAC,AAAC,OAA6D,OAAvDA,AAAK,YAALA,OAAiBkB,SAAQlB,MAAMmB,OAAO,GAAGC,OAAOpB;wBACrEO,QAAQC,IAAI,CAAC;;;;;;;;;;;QAEjB;;IAEF,qBAAqB;IACrBnB,QAAQuD,UAAU,CAACC,IAAAA,8BAAqB;IAExCxD,QAAQV,KAAK,CAAC;QAAC;QAAQ;KAAe,CAAxB,OAAgB,qBAAGQ;AACnC;AAKA,IAAI,oDAAgB2D,UAAU,CAAC,UAAU;IACvC,IAAMC,aAAa7D,IAAAA,kBAAa,EAAC;IACjC,IAAIqB,QAAQpB,IAAI,CAAC,EAAE,KAAK4D,cAAcxC,QAAQpB,IAAI,CAAC,EAAE,KAAK4D,WAAWC,OAAO,CAAC,SAAS,QAAQ;QAC5FxE,IAAI+B,QAAQpB,IAAI,CAAC8D,KAAK,CAAC,IAAI;IAC7B;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/cli.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { type CallToolOptions, callToolCommand } from './commands/call-tool.ts';\nimport { type GetPromptOptions, getPromptCommand } from './commands/get-prompt.ts';\nimport { inspectCommand } from './commands/inspect.ts';\nimport { createManifestCommand } from './commands/manifest/index.ts';\nimport { type ReadResourceOptions, readResourceCommand } from './commands/read-resource.ts';\nimport { searchCommand } from './commands/search.ts';\nimport { upCommand } from './commands/up.ts';\n\nconst pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));\n\nexport default function cli(argv: string[], programName: string) {\n const program = new Command();\n program.name(programName).description('mcp-z helper CLI').version(pkg.version);\n\n program\n .command('up')\n .description('Start MCP server cluster (starts all servers by default)')\n .option('--config <path>', 'Config file path (searches up to home directory)')\n .option('--stdio-only', 'Start only stdio servers (Claude Code compatible)')\n .option('--http-only', 'Start only HTTP servers with start blocks (Claude Code Desktop)')\n .action(async (options) => {\n try {\n const clusterResult = await upCommand({ config: options.config, stdioOnly: options.stdioOnly, httpOnly: options.httpOnly });\n\n // If httpOnly mode and no servers were spawned, exit immediately\n if (options.httpOnly && clusterResult.servers.size === 0) process.exit(0);\n\n const shutdown = async (sig: string) => {\n console.log('Shutting down (signal=', sig, ')');\n if (clusterResult && typeof clusterResult.close === 'function') {\n try {\n await clusterResult.close(sig === 'SIGTERM' ? 'SIGTERM' : 'SIGINT', { timeoutMs: 1000 });\n } catch (_) {\n /* ignore */\n }\n }\n process.exit(0);\n };\n\n // Signal handlers trigger async shutdown then exit\n process.on('SIGINT', () => {\n shutdown('SIGINT').catch(() => process.exit(1));\n });\n process.on('SIGTERM', () => {\n shutdown('SIGTERM').catch(() => process.exit(1));\n });\n\n // Keep process alive - wait for signal\n await new Promise(() => {});\n } catch (error) {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\n program\n .command('inspect')\n .description('Inspect MCP servers: explore tools, resources, prompts, and health status')\n .option('--config <path>', 'Config file path (searches up to home directory)')\n .option('--servers <list>', 'Comma-separated server names to inspect')\n .option('--tools', 'Show tools only')\n .option('--resources', 'Show resources only')\n .option('--prompts', 'Show prompts only')\n .option('--health', 'Show health diagnostics only')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Include detailed schemas')\n .option('--attach', 'Connect to running servers (default: spawn servers)')\n .action(async (options) => {\n try {\n await inspectCommand({ config: options.config, servers: options.servers, tools: options.tools, resources: options.resources, prompts: options.prompts, health: options.health, json: options.json, verbose: options.verbose, attach: options.attach });\n } catch (error) {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\n program\n .command('call-tool [server] <tool> <args>')\n .description('Execute an MCP tool with JSON arguments')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--run <cmd>', 'Stdio run command (e.g., \"npx -y @echo/server\")')\n .option('--url <url>', 'HTTP server URL')\n .option('--server <json>', 'Full server config as JSON')\n .option('--json', 'Output as JSON')\n .action(async (server: string | undefined, tool: string, args: string, options: Omit<CallToolOptions, 'server' | 'tool' | 'args'> & { server?: string; run?: string }) => {\n // Handle case where server is actually the tool when using inline config\n // Commander parses: call-tool [server] <tool> <args>\n // With --run: server=undefined, tool=actualTool, args=actualArgs\n // Without --run: server=serverName, tool=actualTool, args=actualArgs\n const opts: CallToolOptions = {\n server,\n tool,\n args,\n ...options,\n run: options.run,\n serverConfig: options.server, // Rename --server to serverConfig to avoid conflict\n };\n await callToolCommand(opts);\n });\n\n program\n .command('read-resource [server] <uri>')\n .description('Read an MCP resource by URI')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--run <cmd>', 'Stdio run command (e.g., \"npx -y @echo/server\")')\n .option('--url <url>', 'HTTP server URL')\n .option('--server <json>', 'Full server config as JSON')\n .option('--json', 'Output as JSON')\n .action(async (server: string | undefined, uri: string, options: Omit<ReadResourceOptions, 'server' | 'uri'> & { server?: string; run?: string }) => {\n const opts: ReadResourceOptions = {\n server,\n uri,\n ...options,\n run: options.run,\n serverConfig: options.server, // Rename --server to serverConfig to avoid conflict\n };\n await readResourceCommand(opts);\n });\n\n program\n .command('get-prompt [server] <name> [args]')\n .description('Get an MCP prompt with optional JSON arguments')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--run <cmd>', 'Stdio run command (e.g., \"npx -y @echo/server\")')\n .option('--url <url>', 'HTTP server URL')\n .option('--server <json>', 'Full server config as JSON')\n .option('--json', 'Output as JSON')\n .action(async (server: string | undefined, name: string, args: string | undefined, options: Omit<GetPromptOptions, 'server' | 'name' | 'args'> & { server?: string; run?: string }) => {\n const opts: GetPromptOptions = {\n server,\n name,\n args: args || '{}',\n ...options,\n run: options.run,\n serverConfig: options.server, // Rename --server to serverConfig to avoid conflict\n };\n await getPromptCommand(opts);\n });\n\n program\n .command('search <query>')\n .description('Search for tools, prompts, and resources across MCP servers')\n .option('--config <path>', 'Custom config file path (default: .mcp.json)')\n .option('--servers <list>', 'Comma-separated server names to search')\n .option('--types <list>', 'Comma-separated types: tool,prompt,resource (default: all)')\n .option('--fields <list>', 'Comma-separated fields: name,description,schema,server (default: name,description,schema)')\n .option('--limit <number>', 'Maximum results to return (default: 20)', Number.parseInt)\n .option('--threshold <number>', 'Minimum relevance score 0-1 (default: 0)', Number.parseFloat)\n .option('--json', 'Output as JSON')\n .option('--attach', 'Connect to running servers (default: spawn servers)')\n .action(async (query: string, options) => {\n try {\n await searchCommand(query, options);\n } catch (error) {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\n // Add config command\n program.addCommand(createManifestCommand());\n\n program.parse(['node', 'cli', ...argv]);\n}\n\n// Entry point: run CLI when executed directly (not imported)\nimport { fileURLToPath } from 'url';\n\nif (import.meta.url.startsWith('file:')) {\n const modulePath = fileURLToPath(import.meta.url);\n if (process.argv[1] === modulePath || process.argv[1] === modulePath.replace(/\\.ts$/, '.js')) {\n cli(process.argv.slice(2), 'mcp-z');\n }\n}\n"],"names":["cli","pkg","JSON","parse","fs","readFileSync","path","join","moduleRoot","url","fileURLToPath","argv","programName","program","Command","name","description","version","command","option","action","options","clusterResult","shutdown","error","upCommand","config","stdioOnly","httpOnly","servers","size","process","exit","sig","_","console","log","close","timeoutMs","on","catch","Promise","Error","message","String","inspectCommand","tools","resources","prompts","health","json","verbose","attach","server","tool","args","opts","run","serverConfig","callToolCommand","uri","readResourceCommand","getPromptCommand","Number","parseInt","parseFloat","query","searchCommand","addCommand","createManifestCommand","startsWith","modulePath","replace","slice"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/commands/call-tool.ts"],"sourcesContent":["/**\n * call-tool.ts\n *\n * Execute MCP tools from the command line.\n * Supports stdio (spawned) and http (remote) servers per MCP spec.\n */\n\nimport { createServerRegistry, type ManagedClient, type ServerRegistry, type ToolArguments, ToolResponseError, type ToolResponseWrapper } from '@mcp-z/client';\nimport { type InlineConfigOptions, resolveServerConfig } from '../lib/resolve-server-config.ts';\nimport { isHttpServer } from '../types.ts';\n\nexport interface CallToolOptions extends InlineConfigOptions {\n tool: string; // Tool name (positional)\n args: string; // JSON args (positional)\n json?: boolean; // --json\n}\n\n/**\n * Main call-tool command implementation.\n *\n * @param opts - Call tool options from CLI flags\n *\n * @example\n * // Call a tool with JSON args\n * await callToolCommand({\n * server: 'echo',\n * tool: 'echo',\n * args: '{\"message\": \"hello\"}',\n * });\n */\nexport async function callToolCommand(opts: CallToolOptions): Promise<void> {\n let registry: ServerRegistry | undefined;\n let client: ManagedClient | undefined;\n\n try {\n // 1. Resolve server configuration (from config file or inline options)\n const { serverName, serverConfig, configDir } = resolveServerConfig(opts);\n\n // 2. Create registry and connect\n const start = Date.now();\n\n if (isHttpServer(serverConfig)) {\n // HTTP server - no spawning needed\n if (!opts.json) {\n console.log(`🔗 Connecting to ${serverName}...`);\n }\n } else {\n // Stdio server - will be spawned\n if (!opts.json) {\n console.log(`🚀 Spawning ${serverName} server...`);\n }\n\n if (!serverConfig.command) {\n throw new Error(`Stdio server ${serverName} missing required \"command\" field`);\n }\n }\n\n // Create registry (spawns stdio servers, registers HTTP servers)\n registry = createServerRegistry({ [serverName]: serverConfig }, { cwd: configDir });\n client = await registry.connect(serverName);\n\n if (!isHttpServer(serverConfig) && !opts.json) {\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n console.log(`✓ Server ready in ${elapsed}s\\n`);\n }\n\n // 5. Parse tool arguments\n let toolArgs: ToolArguments;\n try {\n const parsed = JSON.parse(opts.args);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Arguments must be a JSON object');\n }\n toolArgs = parsed;\n } catch (error) {\n throw new Error(`Failed to parse tool arguments as JSON: ${error instanceof Error ? error.message : String(error)}\\n\\nProvided args: ${opts.args}`);\n }\n\n // 6. Execute tool\n if (!opts.json) {\n console.log(`🔧 Calling ${opts.tool}...`);\n }\n\n let response: ToolResponseWrapper;\n try {\n response = await client.callTool(opts.tool, toolArgs);\n } catch (error) {\n handleToolError(error, opts);\n throw error;\n }\n\n const parsedResult = parseToolResult(response);\n\n if (parsedResult !== undefined) {\n // Success case\n if (opts.json) {\n // JSON output mode\n console.log(JSON.stringify(parsedResult, null, 2));\n } else {\n // Human-readable output\n console.log(`✅ ${opts.tool} succeeded\\n`);\n console.log('Result:');\n if (typeof parsedResult === 'string') {\n console.log(parsedResult);\n } else {\n console.log(JSON.stringify(parsedResult, null, 2));\n }\n }\n }\n } catch (error) {\n if (opts.json) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }, null, 2));\n } else {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n } finally {\n // 8. Cleanup - registry.close() handles both client and server close\n if (registry) {\n try {\n await registry.close();\n } catch (_) {\n // Ignore close errors\n }\n }\n }\n}\n\nfunction handleToolError(error: unknown, opts: CallToolOptions): void {\n if (!(error instanceof ToolResponseError)) {\n return;\n }\n\n const errorText = extractToolErrorText(error) || error.message;\n\n if (opts.json) {\n console.log(JSON.stringify({ error: errorText }, null, 2));\n } else {\n console.log(`❌ ${opts.tool} failed\\n`);\n console.log(`Error: ${errorText}`);\n }\n}\n\nfunction extractToolErrorText(error: ToolResponseError): string | undefined {\n const content = Array.isArray(error.response.content) ? error.response.content : [];\n const first = content[0] as { type?: string; text?: unknown } | undefined;\n if (first?.type === 'text' && typeof first.text === 'string') {\n return first.text;\n }\n return undefined;\n}\n\nfunction parseToolResult(response: ToolResponseWrapper): unknown | undefined {\n try {\n return response.json();\n } catch (error) {\n if (error instanceof ToolResponseError) {\n if ('isError' in error.response && error.response.isError) {\n throw error;\n }\n try {\n return response.text();\n } catch {\n return undefined;\n }\n }\n throw error;\n }\n}\n"],"names":["callToolCommand","opts","registry","client","resolveServerConfig","serverName","serverConfig","configDir","start","elapsed","toolArgs","parsed","response","error","parsedResult","_","Date","now","isHttpServer","json","console","log","command","Error","createServerRegistry","cwd","connect","toFixed","JSON","parse","args","message","String","tool","callTool","handleToolError","parseToolResult","undefined","stringify","close","ToolResponseError","errorText","extractToolErrorText","content","Array","isArray","first","type","text","isError"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/commands/call-tool.ts"],"sourcesContent":["/**\n * call-tool.ts\n *\n * Execute MCP tools from the command line.\n * Supports stdio (spawned) and http (remote) servers per MCP spec.\n */\n\nimport { createServerRegistry, type ManagedClient, type ServerRegistry, type ToolArguments, ToolResponseError, type ToolResponseWrapper } from '@mcp-z/client';\nimport { type InlineConfigOptions, resolveServerConfig } from '../lib/resolve-server-config.ts';\nimport { isHttpServer } from '../types.ts';\n\nexport interface CallToolOptions extends InlineConfigOptions {\n tool: string; // Tool name (positional)\n args: string; // JSON args (positional)\n json?: boolean; // --json\n}\n\n/**\n * Main call-tool command implementation.\n *\n * @param opts - Call tool options from CLI flags\n *\n * @example\n * // Call a tool with JSON args\n * await callToolCommand({\n * server: 'echo',\n * tool: 'echo',\n * args: '{\"message\": \"hello\"}',\n * });\n */\nexport async function callToolCommand(opts: CallToolOptions): Promise<void> {\n let registry: ServerRegistry | undefined;\n let client: ManagedClient | undefined;\n\n try {\n // 1. Resolve server configuration (from config file or inline options)\n const { serverName, serverConfig, configDir } = resolveServerConfig(opts);\n\n // 2. Create registry and connect\n const start = Date.now();\n\n if (isHttpServer(serverConfig)) {\n // HTTP server - no spawning needed\n if (!opts.json) {\n console.log(`🔗 Connecting to ${serverName}...`);\n }\n } else {\n // Stdio server - will be spawned\n if (!opts.json) {\n console.log(`🚀 Spawning ${serverName} server...`);\n }\n\n if (!serverConfig.command) {\n throw new Error(`Stdio server ${serverName} missing required \"command\" field`);\n }\n }\n\n // Create registry (spawns stdio servers, registers HTTP servers)\n registry = createServerRegistry({ [serverName]: serverConfig }, { cwd: configDir });\n client = await registry.connect(serverName);\n\n if (!isHttpServer(serverConfig) && !opts.json) {\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n console.log(`✓ Server ready in ${elapsed}s\\n`);\n }\n\n // 5. Parse tool arguments\n let toolArgs: ToolArguments;\n try {\n const parsed = JSON.parse(opts.args);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Arguments must be a JSON object');\n }\n toolArgs = parsed;\n } catch (error) {\n throw new Error(`Failed to parse tool arguments as JSON: ${error instanceof Error ? error.message : String(error)}\\n\\nProvided args: ${opts.args}`);\n }\n\n // 6. Execute tool\n if (!opts.json) {\n console.log(`🔧 Calling ${opts.tool}...`);\n }\n\n let response: ToolResponseWrapper;\n try {\n response = await client.callTool(opts.tool, toolArgs);\n } catch (error) {\n handleToolError(error, opts);\n throw error;\n }\n\n const parsedResult = parseToolResult(response);\n\n if (parsedResult !== undefined) {\n // Success case\n if (opts.json) {\n // JSON output mode\n console.log(JSON.stringify(parsedResult, null, 2));\n } else {\n // Human-readable output\n console.log(`✅ ${opts.tool} succeeded\\n`);\n console.log('Result:');\n if (typeof parsedResult === 'string') {\n console.log(parsedResult);\n } else {\n console.log(JSON.stringify(parsedResult, null, 2));\n }\n }\n }\n } catch (error) {\n if (opts.json) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }, null, 2));\n } else {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n } finally {\n // 8. Cleanup - registry.close() handles both client and server close\n if (registry) {\n try {\n await registry.close();\n } catch (_) {\n // Ignore close errors\n }\n }\n }\n}\n\nfunction handleToolError(error: unknown, opts: CallToolOptions): void {\n if (!(error instanceof ToolResponseError)) {\n return;\n }\n\n const errorText = extractToolErrorText(error) || error.message;\n\n if (opts.json) {\n console.log(JSON.stringify({ error: errorText }, null, 2));\n } else {\n console.log(`❌ ${opts.tool} failed\\n`);\n console.log(`Error: ${errorText}`);\n }\n}\n\nfunction extractToolErrorText(error: ToolResponseError): string | undefined {\n const content = Array.isArray(error.response.content) ? error.response.content : [];\n const first = content[0] as { type?: string; text?: unknown } | undefined;\n if (first?.type === 'text' && typeof first.text === 'string') {\n return first.text;\n }\n return undefined;\n}\n\nfunction parseToolResult(response: ToolResponseWrapper): unknown | undefined {\n try {\n return response.json();\n } catch (error) {\n if (error instanceof ToolResponseError) {\n if ('isError' in error.response && error.response.isError) {\n throw error;\n }\n try {\n return response.text();\n } catch {\n return undefined;\n }\n }\n throw error;\n }\n}\n"],"names":["callToolCommand","opts","registry","client","resolveServerConfig","serverName","serverConfig","configDir","start","elapsed","toolArgs","parsed","response","error","parsedResult","_","Date","now","isHttpServer","json","console","log","command","Error","createServerRegistry","cwd","connect","toFixed","JSON","parse","args","message","String","tool","callTool","handleToolError","parseToolResult","undefined","stringify","close","ToolResponseError","errorText","extractToolErrorText","content","Array","isArray","first","type","text","isError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/commands/get-prompt.ts"],"sourcesContent":["/**\n * get-prompt.ts\n *\n * Get MCP prompts from the command line.\n * Supports stdio (spawned) and http (remote) servers per MCP spec.\n */\n\nimport { createServerRegistry, type ManagedClient, type PromptArguments, type ServerRegistry } from '@mcp-z/client';\nimport { type InlineConfigOptions, resolveServerConfig } from '../lib/resolve-server-config.ts';\nimport { isHttpServer } from '../types.ts';\n\nexport interface GetPromptOptions extends InlineConfigOptions {\n name: string; // Prompt name (positional)\n args: string; // JSON args (positional)\n json?: boolean; // --json\n}\n\n/**\n * Main get-prompt command implementation.\n *\n * @param opts - Get prompt options from CLI flags\n *\n * @example\n * // Get a prompt with JSON args\n * await getPromptCommand({\n * server: 'assistant',\n * name: 'compose-email',\n * args: '{\"tone\": \"formal\"}',\n * });\n */\nexport async function getPromptCommand(opts: GetPromptOptions): Promise<void> {\n let registry: ServerRegistry | undefined;\n let client: ManagedClient | undefined;\n\n try {\n // 1. Resolve server configuration (from config file or inline options)\n const { serverName, serverConfig, configDir } = resolveServerConfig(opts);\n\n // 2. Create registry and connect\n const start = Date.now();\n\n if (isHttpServer(serverConfig)) {\n // HTTP server - no spawning needed\n if (!opts.json) {\n console.log(`🔗 Connecting to ${serverName}...`);\n }\n } else {\n // Stdio server - will be spawned\n if (!opts.json) {\n console.log(`🚀 Spawning ${serverName} server...`);\n }\n\n if (!serverConfig.command) {\n throw new Error(`Stdio server ${serverName} missing required \"command\" field`);\n }\n }\n\n // Create registry (spawns stdio servers, registers HTTP servers)\n registry = createServerRegistry({ [serverName]: serverConfig }, { cwd: configDir });\n client = await registry.connect(serverName);\n\n if (!isHttpServer(serverConfig) && !opts.json) {\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n console.log(`✓ Server ready in ${elapsed}s\\n`);\n }\n\n // 5. Parse prompt arguments\n let promptArgs: PromptArguments | undefined;\n if (opts.args && opts.args !== '{}') {\n try {\n const parsed = JSON.parse(opts.args);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Arguments must be a JSON object');\n }\n promptArgs = parsed;\n } catch (error) {\n throw new Error(`Failed to parse prompt arguments as JSON: ${error instanceof Error ? error.message : String(error)}\\n\\nProvided args: ${opts.args}`);\n }\n }\n\n // 6. Get prompt\n if (!opts.json) {\n console.log(`💬 Getting ${opts.name}...`);\n }\n\n const promptResponse = await client.getPrompt(opts.name, promptArgs);\n const prompt = promptResponse.raw();\n\n // Success case\n if (opts.json) {\n // JSON output mode\n console.log(JSON.stringify(prompt, null, 2));\n } else {\n // Human-readable output\n console.log('✅ Get prompt succeeded\\n');\n\n // Display description if available\n if (prompt.description) {\n console.log(`Description: ${prompt.description}\\n`);\n }\n\n // Display messages\n console.log('Messages:');\n for (const message of prompt.messages) {\n console.log(` [${message.role}]:`);\n if (typeof message.content === 'string') {\n console.log(` ${message.content}`);\n } else if (message.content.type === 'text') {\n console.log(` ${message.content.text}`);\n } else if (message.content.type === 'image') {\n console.log(` [Image: ${message.content.mimeType}]`);\n } else if (message.content.type === 'resource') {\n console.log(` [Resource: ${message.content.resource.uri}]`);\n }\n }\n }\n } catch (error) {\n if (opts.json) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }, null, 2));\n } else {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n } finally {\n // 8. Cleanup - registry.close() handles both client and server close\n if (registry) {\n try {\n await registry.close();\n } catch (_) {\n // Ignore close errors\n }\n }\n }\n}\n"],"names":["getPromptCommand","opts","registry","client","resolveServerConfig","serverName","serverConfig","configDir","start","elapsed","promptArgs","parsed","promptResponse","prompt","message","error","_","Date","now","isHttpServer","json","console","log","command","Error","createServerRegistry","cwd","connect","toFixed","args","JSON","parse","String","name","getPrompt","raw","stringify","description","messages","role","content","type","text","mimeType","resource","uri","close"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/commands/get-prompt.ts"],"sourcesContent":["/**\n * get-prompt.ts\n *\n * Get MCP prompts from the command line.\n * Supports stdio (spawned) and http (remote) servers per MCP spec.\n */\n\nimport { createServerRegistry, type ManagedClient, type PromptArguments, type ServerRegistry } from '@mcp-z/client';\nimport { type InlineConfigOptions, resolveServerConfig } from '../lib/resolve-server-config.ts';\nimport { isHttpServer } from '../types.ts';\n\nexport interface GetPromptOptions extends InlineConfigOptions {\n name: string; // Prompt name (positional)\n args: string; // JSON args (positional)\n json?: boolean; // --json\n}\n\n/**\n * Main get-prompt command implementation.\n *\n * @param opts - Get prompt options from CLI flags\n *\n * @example\n * // Get a prompt with JSON args\n * await getPromptCommand({\n * server: 'assistant',\n * name: 'compose-email',\n * args: '{\"tone\": \"formal\"}',\n * });\n */\nexport async function getPromptCommand(opts: GetPromptOptions): Promise<void> {\n let registry: ServerRegistry | undefined;\n let client: ManagedClient | undefined;\n\n try {\n // 1. Resolve server configuration (from config file or inline options)\n const { serverName, serverConfig, configDir } = resolveServerConfig(opts);\n\n // 2. Create registry and connect\n const start = Date.now();\n\n if (isHttpServer(serverConfig)) {\n // HTTP server - no spawning needed\n if (!opts.json) {\n console.log(`🔗 Connecting to ${serverName}...`);\n }\n } else {\n // Stdio server - will be spawned\n if (!opts.json) {\n console.log(`🚀 Spawning ${serverName} server...`);\n }\n\n if (!serverConfig.command) {\n throw new Error(`Stdio server ${serverName} missing required \"command\" field`);\n }\n }\n\n // Create registry (spawns stdio servers, registers HTTP servers)\n registry = createServerRegistry({ [serverName]: serverConfig }, { cwd: configDir });\n client = await registry.connect(serverName);\n\n if (!isHttpServer(serverConfig) && !opts.json) {\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n console.log(`✓ Server ready in ${elapsed}s\\n`);\n }\n\n // 5. Parse prompt arguments\n let promptArgs: PromptArguments | undefined;\n if (opts.args && opts.args !== '{}') {\n try {\n const parsed = JSON.parse(opts.args);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Arguments must be a JSON object');\n }\n promptArgs = parsed;\n } catch (error) {\n throw new Error(`Failed to parse prompt arguments as JSON: ${error instanceof Error ? error.message : String(error)}\\n\\nProvided args: ${opts.args}`);\n }\n }\n\n // 6. Get prompt\n if (!opts.json) {\n console.log(`💬 Getting ${opts.name}...`);\n }\n\n const promptResponse = await client.getPrompt(opts.name, promptArgs);\n const prompt = promptResponse.raw();\n\n // Success case\n if (opts.json) {\n // JSON output mode\n console.log(JSON.stringify(prompt, null, 2));\n } else {\n // Human-readable output\n console.log('✅ Get prompt succeeded\\n');\n\n // Display description if available\n if (prompt.description) {\n console.log(`Description: ${prompt.description}\\n`);\n }\n\n // Display messages\n console.log('Messages:');\n for (const message of prompt.messages) {\n console.log(` [${message.role}]:`);\n if (typeof message.content === 'string') {\n console.log(` ${message.content}`);\n } else if (message.content.type === 'text') {\n console.log(` ${message.content.text}`);\n } else if (message.content.type === 'image') {\n console.log(` [Image: ${message.content.mimeType}]`);\n } else if (message.content.type === 'resource') {\n console.log(` [Resource: ${message.content.resource.uri}]`);\n }\n }\n }\n } catch (error) {\n if (opts.json) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }, null, 2));\n } else {\n console.error(`\\n❌ ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n } finally {\n // 8. Cleanup - registry.close() handles both client and server close\n if (registry) {\n try {\n await registry.close();\n } catch (_) {\n // Ignore close errors\n }\n }\n }\n}\n"],"names":["getPromptCommand","opts","registry","client","resolveServerConfig","serverName","serverConfig","configDir","start","elapsed","promptArgs","parsed","promptResponse","prompt","message","error","_","Date","now","isHttpServer","json","console","log","command","Error","createServerRegistry","cwd","connect","toFixed","args","JSON","parse","String","name","getPrompt","raw","stringify","description","messages","role","content","type","text","mimeType","resource","uri","close"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/commands/inspect.ts"],"sourcesContent":["/**\n * inspect.ts\n *\n * Inspect MCP servers: explore tools, resources, prompts, and health status.\n * Supports stdio (spawned) and http (remote) servers per MCP spec.\n */\n\nimport { createServerRegistry, type PromptArgument, type ServerRegistry, type ServersConfig } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findConfigPath } from '../lib/find-config.ts';\nimport { isHttpServer, type ServerConfig } from '../types.ts';\n\nconst MAX_DESCRIPTION = 100;\n\nexport interface InspectOptions {\n config?: string; // --config custom.json\n servers?: string; // --servers echo-server-1,echo-server-2 (comma-separated)\n tools?: boolean; // --tools\n resources?: boolean; // --resources\n prompts?: boolean; // --prompts\n health?: boolean; // --health\n json?: boolean; // --json\n verbose?: boolean; // --verbose\n attach?: boolean; // --attach (connect to running servers instead of spawning)\n}\n\ninterface ServerInfo {\n name: string;\n status: 'ready' | 'failed';\n startupTime: number | undefined;\n error: string | undefined;\n tools: ToolInfo[] | undefined;\n resources: ResourceInfo[] | undefined;\n prompts: PromptInfo[] | undefined;\n}\n\ninterface ToolInfo {\n name: string;\n description: string | undefined;\n inputSchema: unknown;\n}\n\ninterface ResourceInfo {\n uri: string;\n name: string;\n description: string | undefined;\n mimeType: string | undefined;\n}\n\ninterface PromptInfo {\n name: string;\n description: string | undefined;\n arguments: PromptArgument[] | undefined;\n}\n\n/**\n * Main inspect command implementation.\n *\n * @param opts - Inspect options from CLI flags\n *\n * @example\n * // Show summary of .mcp.json servers (spawns servers)\n * await inspectCommand({});\n *\n * @example\n * // Show all tools from echo server (spawns server)\n * await inspectCommand({ servers: 'echo', tools: true });\n *\n * @example\n * // Connect to running servers (attach mode)\n * await inspectCommand({ config: 'http-servers.json', attach: true, health: true });\n */\nexport async function inspectCommand(opts: InspectOptions = {}): Promise<void> {\n let registry: ServerRegistry | undefined;\n\n try {\n const configPath = findConfigPath(opts.config);\n const raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n const servers = raw.mcpServers ?? raw.servers ?? raw;\n const configDir = path.dirname(configPath);\n const serverNames = Object.keys(servers || {});\n const serversToInspect = filterServers(serverNames, opts.servers);\n\n // Create registry (spawns stdio servers, registers HTTP servers)\n // In attach mode, don't spawn - just register for connection\n registry = createServerRegistry(servers, {\n cwd: configDir,\n dialects: opts.attach ? [] : ['servers', 'start'], // Empty dialects = no spawning\n });\n\n const serverInfos: ServerInfo[] = [];\n for (const serverName of serversToInspect) {\n const info = await inspectServer(serverName, servers, registry, opts);\n serverInfos.push(info);\n }\n\n // 5. Output results\n if (opts.json) {\n outputJSON(serverInfos);\n } else {\n outputPretty(serverInfos, opts);\n }\n } finally {\n // 6. Cleanup - registry.close() handles all clients and servers\n if (registry) {\n try {\n await registry.close();\n } catch (_) {\n // Ignore close errors\n }\n }\n }\n}\n\n/**\n * Filter servers based on --servers flag.\n */\nfunction filterServers(allServers: string[], serversFlag?: string): string[] {\n if (!serversFlag) {\n return allServers;\n }\n\n const requested = serversFlag.split(',').map((s) => s.trim());\n const missing = requested.filter((s) => !allServers.includes(s));\n\n if (missing.length > 0) {\n throw new Error(`Server(s) not found in config: ${missing.join(', ')}\\n\\nAvailable servers: ${allServers.join(', ')}`);\n }\n\n return requested;\n}\n\n/**\n * Inspect a single server: collect tools, resources, prompts, health.\n */\nasync function inspectServer(serverName: string, servers: ServersConfig, registry: ServerRegistry, opts: InspectOptions): Promise<ServerInfo> {\n const start = Date.now();\n\n try {\n // Connect to server via registry\n const serverConfig = servers?.[serverName];\n if (!serverConfig) {\n throw new Error(`Server ${serverName} not found in config`);\n }\n\n if (!isHttpServer(serverConfig as ServerConfig) && !serverConfig.command) {\n throw new Error(`Stdio server ${serverName} missing required \"command\" field`);\n }\n\n const client = await registry.connect(serverName);\n\n // Collect content based on flags\n const needsTools = opts.tools || shouldShowSummary(opts);\n const needsResources = opts.resources || shouldShowSummary(opts);\n const needsPrompts = opts.prompts || shouldShowSummary(opts);\n\n // Handle each capability independently - servers may not implement all methods\n const [toolsResult, resourcesResult, promptsResult] = await Promise.all([needsTools ? client.listTools().catch(() => null) : Promise.resolve(null), needsResources ? client.listResources().catch(() => null) : Promise.resolve(null), needsPrompts ? client.listPrompts().catch(() => null) : Promise.resolve(null)]);\n\n const startupTime = Date.now() - start;\n\n return {\n name: serverName,\n status: 'ready',\n startupTime,\n error: undefined,\n tools: toolsResult?.tools\n ? toolsResult.tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n }))\n : undefined,\n resources: resourcesResult?.resources\n ? resourcesResult.resources.map((r) => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n }))\n : undefined,\n prompts: promptsResult?.prompts\n ? promptsResult.prompts.map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n }))\n : undefined,\n };\n } catch (error) {\n // Format error message with context\n let errorMessage = error instanceof Error ? error.message : String(error);\n\n // For fetch errors, dig into the cause for more details\n if (error instanceof Error && error.message === 'fetch failed' && 'cause' in error) {\n const cause = error.cause as { code?: string; message?: string } | undefined;\n if (cause?.code === 'ECONNREFUSED') {\n const serverConfig = servers?.[serverName];\n const url = serverConfig && 'url' in serverConfig ? serverConfig.url : undefined;\n errorMessage = url ? `Connection refused (server not running at ${url})` : 'Connection refused (server not running)';\n } else if (cause?.message) {\n errorMessage = `${error.message}: ${cause.message}`;\n }\n }\n\n return {\n name: serverName,\n status: 'failed',\n startupTime: undefined,\n error: errorMessage,\n tools: undefined,\n resources: undefined,\n prompts: undefined,\n };\n }\n}\n\n/**\n * Determine if we should show summary (no specific content flags).\n */\nfunction shouldShowSummary(opts: InspectOptions): boolean {\n return !opts.tools && !opts.resources && !opts.prompts && !opts.health;\n}\n\n/**\n * Truncate description to max length with ellipsis.\n */\nfunction truncateDescription(desc: string, _maxLength = MAX_DESCRIPTION): string {\n return desc;\n // if (!desc || desc.length <= maxLength) {\n // return desc;\n // }\n // return `${desc.slice(0, maxLength - 3)}...`;\n}\n\n/**\n * Render verbose details for a tool (parameters with types and descriptions)\n */\nfunction renderToolVerbose(tool: ToolInfo, indent: string): void {\n // Description is already shown inline, so skip it here\n const schema = tool.inputSchema as { properties?: Record<string, unknown>; required?: string[] } | undefined;\n if (!schema || !schema.properties) {\n return;\n }\n\n const properties = schema.properties;\n const required = schema.required || [];\n\n // Separate required and optional parameters\n const requiredParams: string[] = [];\n const optionalParams: string[] = [];\n\n for (const [name, _prop] of Object.entries(properties)) {\n if (required.includes(name)) {\n requiredParams.push(name);\n } else {\n optionalParams.push(name);\n }\n }\n\n // Show required parameters\n if (requiredParams.length > 0) {\n console.log(`${indent}Required Parameters:`);\n for (const name of requiredParams) {\n renderParameter(name, properties[name], `${indent} `);\n }\n console.log('');\n }\n\n // Show optional parameters\n if (optionalParams.length > 0) {\n console.log(`${indent}Optional Parameters:`);\n for (const name of optionalParams) {\n renderParameter(name, properties[name], `${indent} `);\n }\n console.log('');\n }\n}\n\n/**\n * Render verbose details for a resource\n */\nfunction renderResourceVerbose(resource: ResourceInfo, indent: string): void {\n // Description is already shown inline, so only show URI and MIME type\n if (resource.uri) {\n console.log(`${indent}URI: ${resource.uri}`);\n }\n if (resource.mimeType) {\n console.log(`${indent}MIME Type: ${resource.mimeType}`);\n }\n if (resource.uri || resource.mimeType) {\n console.log('');\n }\n}\n\n/**\n * Render verbose details for a prompt\n */\nfunction renderPromptVerbose(prompt: PromptInfo, indent: string): void {\n // Description is already shown inline, so only show arguments\n if (prompt.arguments && Array.isArray(prompt.arguments) && prompt.arguments.length > 0) {\n console.log(`${indent}Arguments:`);\n for (const arg of prompt.arguments) {\n const argObj = arg as { name?: string; description?: string; required?: boolean };\n const name = argObj.name || 'unknown';\n const description = argObj.description || '';\n const required = argObj.required ? ' (required)' : ' (optional)';\n const desc = description ? ` - ${description}` : '';\n console.log(`${indent} ${name}${required}${desc}`);\n }\n console.log('');\n }\n}\n\n/**\n * Render a single parameter with type and description\n */\nfunction renderParameter(name: string, prop: unknown, indent: string): void {\n const p = prop as { description?: string; enum?: unknown[] };\n const type = getParameterType(prop);\n const constraints = getParameterConstraints(prop);\n const typeInfo = constraints ? `(${type}) ${constraints}` : `(${type})`;\n const desc = p.description ? ` - ${p.description}` : '';\n\n console.log(`${indent}${name} ${typeInfo}${desc}`);\n\n // Show enum options on separate line if present\n if (p.enum && Array.isArray(p.enum)) {\n console.log(`${indent} Options: ${p.enum.join(', ')}`);\n }\n}\n\n/**\n * Get human-readable type from JSON Schema property\n */\nfunction getParameterType(prop: unknown): string {\n const p = prop as { type?: string | string[]; items?: { type?: string }; anyOf?: Array<{ type?: string }>; enum?: unknown[] };\n if (p.type) {\n if (Array.isArray(p.type)) {\n return p.type.join(' | ');\n }\n if (p.type === 'array' && p.items) {\n const itemType = p.items.type || 'any';\n return `array of ${itemType}`;\n }\n return p.type;\n }\n\n if (p.anyOf) {\n return p.anyOf.map((s) => s.type || 'any').join(' | ');\n }\n\n if (p.enum) {\n return 'enum';\n }\n\n return 'any';\n}\n\n/**\n * Get parameter constraints (default, min, max, etc.)\n */\nfunction getParameterConstraints(prop: unknown): string {\n const p = prop as {\n default?: unknown;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n minItems?: number;\n maxItems?: number;\n };\n const constraints: string[] = [];\n\n if (p.default !== undefined) {\n const defaultValue = typeof p.default === 'string' ? `\"${p.default}\"` : String(p.default);\n constraints.push(`default: ${defaultValue}`);\n }\n\n if (p.minimum !== undefined) {\n constraints.push(`min: ${p.minimum}`);\n }\n\n if (p.maximum !== undefined) {\n constraints.push(`max: ${p.maximum}`);\n }\n\n if (p.minLength !== undefined) {\n constraints.push(`minLength: ${p.minLength}`);\n }\n\n if (p.maxLength !== undefined) {\n constraints.push(`maxLength: ${p.maxLength}`);\n }\n\n if (p.minItems !== undefined) {\n constraints.push(`minItems: ${p.minItems}`);\n }\n\n if (p.maxItems !== undefined) {\n constraints.push(`maxItems: ${p.maxItems}`);\n }\n\n return constraints.length > 0 ? `[${constraints.join(', ')}]` : '';\n}\n\n/**\n * Output results as JSON.\n */\nfunction outputJSON(serverInfos: ServerInfo[]): void {\n const output = {\n servers: serverInfos.reduce(\n (acc, info) => {\n acc[info.name] = {\n status: info.status,\n startupTime: info.startupTime ? `${(info.startupTime / 1000).toFixed(1)}s` : undefined,\n error: info.error,\n tools: info.tools,\n resources: info.resources,\n prompts: info.prompts,\n };\n return acc;\n },\n {} as Record<string, unknown>\n ),\n };\n\n console.log(JSON.stringify(output, null, 2));\n}\n\n/**\n * Output results in human-readable format.\n */\nfunction outputPretty(serverInfos: ServerInfo[], opts: InspectOptions): void {\n const showSummary = shouldShowSummary(opts);\n\n for (const info of serverInfos) {\n // Summary mode\n if (showSummary) {\n if (info.status === 'ready') {\n const toolCount = info.tools?.length || 0;\n const resourceCount = info.resources?.length || 0;\n const promptCount = info.prompts?.length || 0;\n const time = info.startupTime ? `(${(info.startupTime / 1000).toFixed(1)}s)` : '';\n console.log(`📦 ${info.name}: ${time}`);\n\n // Show detailed list of tools\n console.log(`tools: ${toolCount}`);\n if (info.tools && info.tools.length > 0) {\n for (let i = 0; i < info.tools.length; i++) {\n const tool = info.tools[i];\n if (!tool) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = tool.description ? ` - ${opts.verbose ? tool.description : truncateDescription(tool.description)}` : '';\n console.log(`${i + 1}. ${tool.name}${desc}`);\n if (opts.verbose) {\n renderToolVerbose(tool, ' ');\n }\n }\n }\n\n // Show detailed list of resources\n console.log(`resources: ${resourceCount}`);\n if (info.resources && info.resources.length > 0) {\n for (let i = 0; i < info.resources.length; i++) {\n const resource = info.resources[i];\n if (!resource) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = resource.description ? ` - ${opts.verbose ? resource.description : truncateDescription(resource.description)}` : '';\n console.log(`${i + 1}. ${resource.name}${desc}`);\n if (opts.verbose) {\n renderResourceVerbose(resource, ' ');\n }\n }\n }\n\n // Show detailed list of prompts\n console.log(`prompts: ${promptCount}`);\n if (info.prompts && info.prompts.length > 0) {\n for (let i = 0; i < info.prompts.length; i++) {\n const prompt = info.prompts[i];\n if (!prompt) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = prompt.description ? ` - ${opts.verbose ? prompt.description : truncateDescription(prompt.description)}` : '';\n console.log(`${i + 1}. ${prompt.name}${desc}`);\n if (opts.verbose) {\n renderPromptVerbose(prompt, ' ');\n }\n }\n }\n } else {\n console.log(`📦 ${info.name}: ✗ failed - ${info.error}`);\n }\n continue;\n }\n\n // Health mode\n if (opts.health) {\n if (info.status === 'ready') {\n const time = info.startupTime ? `(${(info.startupTime / 1000).toFixed(1)}s)` : '';\n console.log(`✓ ${info.name} - ready ${time}`);\n } else {\n console.log(`✗ ${info.name} - failed`);\n console.log(` Error: ${info.error}`);\n }\n continue;\n }\n\n // Tools mode\n if (opts.tools) {\n console.log(`\\n📦 ${info.name} (${info.tools?.length || 0} tools)`);\n if (info.tools && info.tools.length > 0) {\n for (let i = 0; i < info.tools.length; i++) {\n const tool = info.tools[i];\n if (!tool) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = tool.description ? ` - ${opts.verbose ? tool.description : truncateDescription(tool.description)}` : '';\n console.log(` ${i + 1}. ${tool.name}${desc}`);\n if (opts.verbose) {\n renderToolVerbose(tool, ' ');\n }\n }\n }\n }\n\n // Resources mode\n if (opts.resources) {\n console.log(`\\n📦 ${info.name} (${info.resources?.length || 0} resources)`);\n if (info.resources && info.resources.length > 0) {\n for (let i = 0; i < info.resources.length; i++) {\n const resource = info.resources[i];\n if (!resource) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = resource.description ? ` - ${opts.verbose ? resource.description : truncateDescription(resource.description)}` : '';\n console.log(` ${i + 1}. ${resource.name}${desc}`);\n if (opts.verbose) {\n renderResourceVerbose(resource, ' ');\n }\n }\n }\n }\n\n // Prompts mode\n if (opts.prompts) {\n console.log(`\\n📦 ${info.name} (${info.prompts?.length || 0} prompts)`);\n if (info.prompts && info.prompts.length > 0) {\n for (let i = 0; i < info.prompts.length; i++) {\n const prompt = info.prompts[i];\n if (!prompt) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = prompt.description ? ` - ${opts.verbose ? prompt.description : truncateDescription(prompt.description)}` : '';\n console.log(` ${i + 1}. ${prompt.name}${desc}`);\n if (opts.verbose) {\n renderPromptVerbose(prompt, ' ');\n }\n }\n }\n }\n }\n\n console.log('');\n}\n"],"names":["inspectCommand","MAX_DESCRIPTION","opts","registry","raw","configPath","servers","configDir","serverNames","serversToInspect","serverInfos","serverName","info","_","findConfigPath","config","JSON","parse","fs","readFileSync","mcpServers","path","dirname","Object","keys","filterServers","createServerRegistry","cwd","dialects","attach","inspectServer","push","json","outputJSON","outputPretty","close","allServers","serversFlag","requested","split","map","s","trim","missing","filter","includes","length","Error","join","start","serverConfig","client","needsTools","needsResources","needsPrompts","toolsResult","resourcesResult","promptsResult","startupTime","error","errorMessage","cause","url","Date","now","isHttpServer","command","connect","tools","shouldShowSummary","resources","prompts","Promise","all","listTools","catch","resolve","listResources","listPrompts","name","status","undefined","t","description","inputSchema","r","uri","mimeType","p","arguments","message","String","code","health","truncateDescription","desc","_maxLength","renderToolVerbose","tool","indent","schema","properties","required","requiredParams","optionalParams","entries","_prop","console","log","renderParameter","renderResourceVerbose","resource","renderPromptVerbose","prompt","Array","isArray","arg","argObj","prop","type","getParameterType","constraints","getParameterConstraints","typeInfo","enum","items","itemType","anyOf","default","defaultValue","minimum","maximum","minLength","maxLength","minItems","maxItems","output","reduce","acc","toFixed","stringify","showSummary","toolCount","resourceCount","promptCount","time","i","verbose"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/commands/inspect.ts"],"sourcesContent":["/**\n * inspect.ts\n *\n * Inspect MCP servers: explore tools, resources, prompts, and health status.\n * Supports stdio (spawned) and http (remote) servers per MCP spec.\n */\n\nimport { createServerRegistry, type PromptArgument, type ServerRegistry, type ServersConfig } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findConfigPath } from '../lib/find-config.ts';\nimport { isHttpServer, type ServerConfig } from '../types.ts';\n\nconst MAX_DESCRIPTION = 100;\n\nexport interface InspectOptions {\n config?: string; // --config custom.json\n servers?: string; // --servers echo-server-1,echo-server-2 (comma-separated)\n tools?: boolean; // --tools\n resources?: boolean; // --resources\n prompts?: boolean; // --prompts\n health?: boolean; // --health\n json?: boolean; // --json\n verbose?: boolean; // --verbose\n attach?: boolean; // --attach (connect to running servers instead of spawning)\n}\n\ninterface ServerInfo {\n name: string;\n status: 'ready' | 'failed';\n startupTime: number | undefined;\n error: string | undefined;\n tools: ToolInfo[] | undefined;\n resources: ResourceInfo[] | undefined;\n prompts: PromptInfo[] | undefined;\n}\n\ninterface ToolInfo {\n name: string;\n description: string | undefined;\n inputSchema: unknown;\n}\n\ninterface ResourceInfo {\n uri: string;\n name: string;\n description: string | undefined;\n mimeType: string | undefined;\n}\n\ninterface PromptInfo {\n name: string;\n description: string | undefined;\n arguments: PromptArgument[] | undefined;\n}\n\n/**\n * Main inspect command implementation.\n *\n * @param opts - Inspect options from CLI flags\n *\n * @example\n * // Show summary of .mcp.json servers (spawns servers)\n * await inspectCommand({});\n *\n * @example\n * // Show all tools from echo server (spawns server)\n * await inspectCommand({ servers: 'echo', tools: true });\n *\n * @example\n * // Connect to running servers (attach mode)\n * await inspectCommand({ config: 'http-servers.json', attach: true, health: true });\n */\nexport async function inspectCommand(opts: InspectOptions = {}): Promise<void> {\n let registry: ServerRegistry | undefined;\n\n try {\n const configPath = findConfigPath(opts.config);\n const raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n const servers = raw.mcpServers ?? raw.servers ?? raw;\n const configDir = path.dirname(configPath);\n const serverNames = Object.keys(servers || {});\n const serversToInspect = filterServers(serverNames, opts.servers);\n\n // Create registry (spawns stdio servers, registers HTTP servers)\n // In attach mode, don't spawn - just register for connection\n registry = createServerRegistry(servers, {\n cwd: configDir,\n dialects: opts.attach ? [] : ['servers', 'start'], // Empty dialects = no spawning\n });\n\n const serverInfos: ServerInfo[] = [];\n for (const serverName of serversToInspect) {\n const info = await inspectServer(serverName, servers, registry, opts);\n serverInfos.push(info);\n }\n\n // 5. Output results\n if (opts.json) {\n outputJSON(serverInfos);\n } else {\n outputPretty(serverInfos, opts);\n }\n } finally {\n // 6. Cleanup - registry.close() handles all clients and servers\n if (registry) {\n try {\n await registry.close();\n } catch (_) {\n // Ignore close errors\n }\n }\n }\n}\n\n/**\n * Filter servers based on --servers flag.\n */\nfunction filterServers(allServers: string[], serversFlag?: string): string[] {\n if (!serversFlag) {\n return allServers;\n }\n\n const requested = serversFlag.split(',').map((s) => s.trim());\n const missing = requested.filter((s) => !allServers.includes(s));\n\n if (missing.length > 0) {\n throw new Error(`Server(s) not found in config: ${missing.join(', ')}\\n\\nAvailable servers: ${allServers.join(', ')}`);\n }\n\n return requested;\n}\n\n/**\n * Inspect a single server: collect tools, resources, prompts, health.\n */\nasync function inspectServer(serverName: string, servers: ServersConfig, registry: ServerRegistry, opts: InspectOptions): Promise<ServerInfo> {\n const start = Date.now();\n\n try {\n // Connect to server via registry\n const serverConfig = servers?.[serverName];\n if (!serverConfig) {\n throw new Error(`Server ${serverName} not found in config`);\n }\n\n if (!isHttpServer(serverConfig as ServerConfig) && !serverConfig.command) {\n throw new Error(`Stdio server ${serverName} missing required \"command\" field`);\n }\n\n const client = await registry.connect(serverName);\n\n // Collect content based on flags\n const needsTools = opts.tools || shouldShowSummary(opts);\n const needsResources = opts.resources || shouldShowSummary(opts);\n const needsPrompts = opts.prompts || shouldShowSummary(opts);\n\n // Handle each capability independently - servers may not implement all methods\n const [toolsResult, resourcesResult, promptsResult] = await Promise.all([needsTools ? client.listTools().catch(() => null) : Promise.resolve(null), needsResources ? client.listResources().catch(() => null) : Promise.resolve(null), needsPrompts ? client.listPrompts().catch(() => null) : Promise.resolve(null)]);\n\n const startupTime = Date.now() - start;\n\n return {\n name: serverName,\n status: 'ready',\n startupTime,\n error: undefined,\n tools: toolsResult?.tools\n ? toolsResult.tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n }))\n : undefined,\n resources: resourcesResult?.resources\n ? resourcesResult.resources.map((r) => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n }))\n : undefined,\n prompts: promptsResult?.prompts\n ? promptsResult.prompts.map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n }))\n : undefined,\n };\n } catch (error) {\n // Format error message with context\n let errorMessage = error instanceof Error ? error.message : String(error);\n\n // For fetch errors, dig into the cause for more details\n if (error instanceof Error && error.message === 'fetch failed' && 'cause' in error) {\n const cause = error.cause as { code?: string; message?: string } | undefined;\n if (cause?.code === 'ECONNREFUSED') {\n const serverConfig = servers?.[serverName];\n const url = serverConfig && 'url' in serverConfig ? serverConfig.url : undefined;\n errorMessage = url ? `Connection refused (server not running at ${url})` : 'Connection refused (server not running)';\n } else if (cause?.message) {\n errorMessage = `${error.message}: ${cause.message}`;\n }\n }\n\n return {\n name: serverName,\n status: 'failed',\n startupTime: undefined,\n error: errorMessage,\n tools: undefined,\n resources: undefined,\n prompts: undefined,\n };\n }\n}\n\n/**\n * Determine if we should show summary (no specific content flags).\n */\nfunction shouldShowSummary(opts: InspectOptions): boolean {\n return !opts.tools && !opts.resources && !opts.prompts && !opts.health;\n}\n\n/**\n * Truncate description to max length with ellipsis.\n */\nfunction truncateDescription(desc: string, _maxLength = MAX_DESCRIPTION): string {\n return desc;\n // if (!desc || desc.length <= maxLength) {\n // return desc;\n // }\n // return `${desc.slice(0, maxLength - 3)}...`;\n}\n\n/**\n * Render verbose details for a tool (parameters with types and descriptions)\n */\nfunction renderToolVerbose(tool: ToolInfo, indent: string): void {\n // Description is already shown inline, so skip it here\n const schema = tool.inputSchema as { properties?: Record<string, unknown>; required?: string[] } | undefined;\n if (!schema || !schema.properties) {\n return;\n }\n\n const properties = schema.properties;\n const required = schema.required || [];\n\n // Separate required and optional parameters\n const requiredParams: string[] = [];\n const optionalParams: string[] = [];\n\n for (const [name, _prop] of Object.entries(properties)) {\n if (required.includes(name)) {\n requiredParams.push(name);\n } else {\n optionalParams.push(name);\n }\n }\n\n // Show required parameters\n if (requiredParams.length > 0) {\n console.log(`${indent}Required Parameters:`);\n for (const name of requiredParams) {\n renderParameter(name, properties[name], `${indent} `);\n }\n console.log('');\n }\n\n // Show optional parameters\n if (optionalParams.length > 0) {\n console.log(`${indent}Optional Parameters:`);\n for (const name of optionalParams) {\n renderParameter(name, properties[name], `${indent} `);\n }\n console.log('');\n }\n}\n\n/**\n * Render verbose details for a resource\n */\nfunction renderResourceVerbose(resource: ResourceInfo, indent: string): void {\n // Description is already shown inline, so only show URI and MIME type\n if (resource.uri) {\n console.log(`${indent}URI: ${resource.uri}`);\n }\n if (resource.mimeType) {\n console.log(`${indent}MIME Type: ${resource.mimeType}`);\n }\n if (resource.uri || resource.mimeType) {\n console.log('');\n }\n}\n\n/**\n * Render verbose details for a prompt\n */\nfunction renderPromptVerbose(prompt: PromptInfo, indent: string): void {\n // Description is already shown inline, so only show arguments\n if (prompt.arguments && Array.isArray(prompt.arguments) && prompt.arguments.length > 0) {\n console.log(`${indent}Arguments:`);\n for (const arg of prompt.arguments) {\n const argObj = arg as { name?: string; description?: string; required?: boolean };\n const name = argObj.name || 'unknown';\n const description = argObj.description || '';\n const required = argObj.required ? ' (required)' : ' (optional)';\n const desc = description ? ` - ${description}` : '';\n console.log(`${indent} ${name}${required}${desc}`);\n }\n console.log('');\n }\n}\n\n/**\n * Render a single parameter with type and description\n */\nfunction renderParameter(name: string, prop: unknown, indent: string): void {\n const p = prop as { description?: string; enum?: unknown[] };\n const type = getParameterType(prop);\n const constraints = getParameterConstraints(prop);\n const typeInfo = constraints ? `(${type}) ${constraints}` : `(${type})`;\n const desc = p.description ? ` - ${p.description}` : '';\n\n console.log(`${indent}${name} ${typeInfo}${desc}`);\n\n // Show enum options on separate line if present\n if (p.enum && Array.isArray(p.enum)) {\n console.log(`${indent} Options: ${p.enum.join(', ')}`);\n }\n}\n\n/**\n * Get human-readable type from JSON Schema property\n */\nfunction getParameterType(prop: unknown): string {\n const p = prop as { type?: string | string[]; items?: { type?: string }; anyOf?: Array<{ type?: string }>; enum?: unknown[] };\n if (p.type) {\n if (Array.isArray(p.type)) {\n return p.type.join(' | ');\n }\n if (p.type === 'array' && p.items) {\n const itemType = p.items.type || 'any';\n return `array of ${itemType}`;\n }\n return p.type;\n }\n\n if (p.anyOf) {\n return p.anyOf.map((s) => s.type || 'any').join(' | ');\n }\n\n if (p.enum) {\n return 'enum';\n }\n\n return 'any';\n}\n\n/**\n * Get parameter constraints (default, min, max, etc.)\n */\nfunction getParameterConstraints(prop: unknown): string {\n const p = prop as {\n default?: unknown;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n minItems?: number;\n maxItems?: number;\n };\n const constraints: string[] = [];\n\n if (p.default !== undefined) {\n const defaultValue = typeof p.default === 'string' ? `\"${p.default}\"` : String(p.default);\n constraints.push(`default: ${defaultValue}`);\n }\n\n if (p.minimum !== undefined) {\n constraints.push(`min: ${p.minimum}`);\n }\n\n if (p.maximum !== undefined) {\n constraints.push(`max: ${p.maximum}`);\n }\n\n if (p.minLength !== undefined) {\n constraints.push(`minLength: ${p.minLength}`);\n }\n\n if (p.maxLength !== undefined) {\n constraints.push(`maxLength: ${p.maxLength}`);\n }\n\n if (p.minItems !== undefined) {\n constraints.push(`minItems: ${p.minItems}`);\n }\n\n if (p.maxItems !== undefined) {\n constraints.push(`maxItems: ${p.maxItems}`);\n }\n\n return constraints.length > 0 ? `[${constraints.join(', ')}]` : '';\n}\n\n/**\n * Output results as JSON.\n */\nfunction outputJSON(serverInfos: ServerInfo[]): void {\n const output = {\n servers: serverInfos.reduce(\n (acc, info) => {\n acc[info.name] = {\n status: info.status,\n startupTime: info.startupTime ? `${(info.startupTime / 1000).toFixed(1)}s` : undefined,\n error: info.error,\n tools: info.tools,\n resources: info.resources,\n prompts: info.prompts,\n };\n return acc;\n },\n {} as Record<string, unknown>\n ),\n };\n\n console.log(JSON.stringify(output, null, 2));\n}\n\n/**\n * Output results in human-readable format.\n */\nfunction outputPretty(serverInfos: ServerInfo[], opts: InspectOptions): void {\n const showSummary = shouldShowSummary(opts);\n\n for (const info of serverInfos) {\n // Summary mode\n if (showSummary) {\n if (info.status === 'ready') {\n const toolCount = info.tools?.length || 0;\n const resourceCount = info.resources?.length || 0;\n const promptCount = info.prompts?.length || 0;\n const time = info.startupTime ? `(${(info.startupTime / 1000).toFixed(1)}s)` : '';\n console.log(`📦 ${info.name}: ${time}`);\n\n // Show detailed list of tools\n console.log(`tools: ${toolCount}`);\n if (info.tools && info.tools.length > 0) {\n for (let i = 0; i < info.tools.length; i++) {\n const tool = info.tools[i];\n if (!tool) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = tool.description ? ` - ${opts.verbose ? tool.description : truncateDescription(tool.description)}` : '';\n console.log(`${i + 1}. ${tool.name}${desc}`);\n if (opts.verbose) {\n renderToolVerbose(tool, ' ');\n }\n }\n }\n\n // Show detailed list of resources\n console.log(`resources: ${resourceCount}`);\n if (info.resources && info.resources.length > 0) {\n for (let i = 0; i < info.resources.length; i++) {\n const resource = info.resources[i];\n if (!resource) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = resource.description ? ` - ${opts.verbose ? resource.description : truncateDescription(resource.description)}` : '';\n console.log(`${i + 1}. ${resource.name}${desc}`);\n if (opts.verbose) {\n renderResourceVerbose(resource, ' ');\n }\n }\n }\n\n // Show detailed list of prompts\n console.log(`prompts: ${promptCount}`);\n if (info.prompts && info.prompts.length > 0) {\n for (let i = 0; i < info.prompts.length; i++) {\n const prompt = info.prompts[i];\n if (!prompt) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = prompt.description ? ` - ${opts.verbose ? prompt.description : truncateDescription(prompt.description)}` : '';\n console.log(`${i + 1}. ${prompt.name}${desc}`);\n if (opts.verbose) {\n renderPromptVerbose(prompt, ' ');\n }\n }\n }\n } else {\n console.log(`📦 ${info.name}: ✗ failed - ${info.error}`);\n }\n continue;\n }\n\n // Health mode\n if (opts.health) {\n if (info.status === 'ready') {\n const time = info.startupTime ? `(${(info.startupTime / 1000).toFixed(1)}s)` : '';\n console.log(`✓ ${info.name} - ready ${time}`);\n } else {\n console.log(`✗ ${info.name} - failed`);\n console.log(` Error: ${info.error}`);\n }\n continue;\n }\n\n // Tools mode\n if (opts.tools) {\n console.log(`\\n📦 ${info.name} (${info.tools?.length || 0} tools)`);\n if (info.tools && info.tools.length > 0) {\n for (let i = 0; i < info.tools.length; i++) {\n const tool = info.tools[i];\n if (!tool) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = tool.description ? ` - ${opts.verbose ? tool.description : truncateDescription(tool.description)}` : '';\n console.log(` ${i + 1}. ${tool.name}${desc}`);\n if (opts.verbose) {\n renderToolVerbose(tool, ' ');\n }\n }\n }\n }\n\n // Resources mode\n if (opts.resources) {\n console.log(`\\n📦 ${info.name} (${info.resources?.length || 0} resources)`);\n if (info.resources && info.resources.length > 0) {\n for (let i = 0; i < info.resources.length; i++) {\n const resource = info.resources[i];\n if (!resource) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = resource.description ? ` - ${opts.verbose ? resource.description : truncateDescription(resource.description)}` : '';\n console.log(` ${i + 1}. ${resource.name}${desc}`);\n if (opts.verbose) {\n renderResourceVerbose(resource, ' ');\n }\n }\n }\n }\n\n // Prompts mode\n if (opts.prompts) {\n console.log(`\\n📦 ${info.name} (${info.prompts?.length || 0} prompts)`);\n if (info.prompts && info.prompts.length > 0) {\n for (let i = 0; i < info.prompts.length; i++) {\n const prompt = info.prompts[i];\n if (!prompt) continue; // Array indexing can return undefined with noUncheckedIndexedAccess\n const desc = prompt.description ? ` - ${opts.verbose ? prompt.description : truncateDescription(prompt.description)}` : '';\n console.log(` ${i + 1}. ${prompt.name}${desc}`);\n if (opts.verbose) {\n renderPromptVerbose(prompt, ' ');\n }\n }\n }\n }\n }\n\n console.log('');\n}\n"],"names":["inspectCommand","MAX_DESCRIPTION","opts","registry","raw","configPath","servers","configDir","serverNames","serversToInspect","serverInfos","serverName","info","_","findConfigPath","config","JSON","parse","fs","readFileSync","mcpServers","path","dirname","Object","keys","filterServers","createServerRegistry","cwd","dialects","attach","inspectServer","push","json","outputJSON","outputPretty","close","allServers","serversFlag","requested","split","map","s","trim","missing","filter","includes","length","Error","join","start","serverConfig","client","needsTools","needsResources","needsPrompts","toolsResult","resourcesResult","promptsResult","startupTime","error","errorMessage","cause","url","Date","now","isHttpServer","command","connect","tools","shouldShowSummary","resources","prompts","Promise","all","listTools","catch","resolve","listResources","listPrompts","name","status","undefined","t","description","inputSchema","r","uri","mimeType","p","arguments","message","String","code","health","truncateDescription","desc","_maxLength","renderToolVerbose","tool","indent","schema","properties","required","requiredParams","optionalParams","entries","_prop","console","log","renderParameter","renderResourceVerbose","resource","renderPromptVerbose","prompt","Array","isArray","arg","argObj","prop","type","getParameterType","constraints","getParameterConstraints","typeInfo","enum","items","itemType","anyOf","default","defaultValue","minimum","maximum","minLength","maxLength","minItems","maxItems","output","reduce","acc","toFixed","stringify","showSummary","toolCount","resourceCount","promptCount","time","i","verbose"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/commands/manifest/env-prompting.ts"],"sourcesContent":["import confirm from '@inquirer/confirm';\nimport input from '@inquirer/input';\nimport password from '@inquirer/password';\nimport select from '@inquirer/select';\nimport type { EnvVarMetadata } from './metadata-reader.ts';\n\n/**\n * Redact sensitive values for display, showing only first 4 characters\n * Example: \"sk-1234567890abcdef\" -> \"sk-1XXX\"\n */\nfunction redactValue(value: string, isSecret: boolean): string {\n if (!isSecret) {\n return value;\n }\n\n if (value.length <= 6) {\n return 'XXX';\n }\n\n return `${value.substring(0, 4)}XXX`;\n}\n\n/**\n * Substitute template variables in a string\n * Replaces any {VARIABLE_NAME} with the corresponding value from the variables map\n * Variable names are case-insensitive\n */\nexport function substituteTemplateVars(template: string | undefined, variables?: Record<string, string>): string | undefined {\n if (!template || !variables) {\n return template;\n }\n\n // Replace any {VARIABLE_NAME} with corresponding value from variables map\n return template.replace(/\\{([^}]+)\\}/g, (match, varName) => {\n // Case-insensitive lookup\n const key = Object.keys(variables).find((k) => k.toLowerCase() === varName.toLowerCase());\n return key ? variables[key] : match;\n });\n}\n\n/**\n * Get dynamic placeholder for env vars by substituting template variables\n */\nfunction getDynamicPlaceholder(envVar: EnvVarMetadata, variables?: Record<string, string>): string | undefined {\n return substituteTemplateVars(envVar.placeholder, variables);\n}\n\n/**\n * Prompt user for environment variables with support for:\n * - Environment variable detection with partial redaction\n * - Interactive prompts for required fields\n * - Choice-based selection\n * - Password input for secrets\n * - Default values\n * - Non-interactive mode (-y flag)\n * - Dynamic placeholders via template variable substitution\n */\nexport async function promptForEnvVars(serverName: string, envVars: EnvVarMetadata[], options: { yes?: boolean; templateVars?: Record<string, string> } = {}): Promise<Record<string, string>> {\n const env: Record<string, string> = {};\n\n for (const envVar of envVars) {\n const envValue = process.env[envVar.name];\n // Support both 'default' (MCP schema standard) and 'value' (legacy) fields\n const defaultValue = envVar.default ?? envVar.value;\n\n if (defaultValue) {\n // Use default value from metadata if available\n env[envVar.name] = defaultValue;\n } else if (envValue && !options.yes && process.stdin.isTTY) {\n // Environment variable exists - present option with partial redaction\n const redactedValue = redactValue(envValue, envVar.isSecret);\n const useEnvChoice = `${redactedValue} (environment)`;\n\n if (envVar.choices && envVar.choices.length > 0) {\n // Has choices - add environment value as an option\n const choices = [useEnvChoice, ...envVar.choices, 'Enter custom value'];\n\n // Add skip option for optional fields\n if (!envVar.isRequired) {\n choices.push('Skip (optional)');\n }\n\n const message = `[${serverName}] ${envVar.name}`;\n\n const value = await select({\n message,\n choices,\n });\n\n if (value === useEnvChoice) {\n env[envVar.name] = envValue;\n } else if (value === 'Skip (optional)') {\n // Skip this optional env var - don't add to env object\n } else if (value === 'Enter custom value') {\n const promptFn = envVar.isSecret ? password : input;\n const customValue = await promptFn({\n message: `[${serverName}] ${envVar.name} (enter value)`,\n validate: (input: string) => {\n if (envVar.isRequired && (!input || input.trim() === '')) {\n return 'This field is required';\n }\n return true;\n },\n });\n env[envVar.name] = customValue as string;\n } else {\n env[envVar.name] = value as string;\n }\n } else {\n // No choices - simple confirmation or new value\n const actionChoices = [\n { name: `Use ${useEnvChoice}`, value: 'use-env' },\n { name: 'Enter new value', value: 'enter-new' },\n ];\n\n // Add skip option for optional fields\n if (!envVar.isRequired) {\n actionChoices.push({ name: 'Skip (optional)', value: 'skip' });\n }\n\n const message = `[${serverName}] ${envVar.name}`;\n\n const action = await select({\n message,\n choices: actionChoices,\n });\n\n if (action === 'use-env') {\n env[envVar.name] = envValue;\n } else if (action === 'skip') {\n // Skip this optional env var - don't add to env object\n } else {\n const promptFn = envVar.isSecret ? password : input;\n const newValue = await promptFn({\n message: `[${serverName}] ${envVar.name} (enter value)`,\n validate: (input: string) => {\n if (envVar.isRequired && (!input || input.trim() === '')) {\n return 'This field is required';\n }\n return true;\n },\n });\n env[envVar.name] = newValue as string;\n }\n }\n } else if (options.yes) {\n // -y mode: skip required vars without defaults (trust shell environment)\n if (envVar.choices && envVar.choices.length > 0 && envVar.choices[0]) {\n // Has choices - use first choice\n env[envVar.name] = envVar.choices[0];\n } else if (envVar.isRequired) {\n // Required but no default - skip with warning\n console.log(` ⚠️ Skipping ${envVar.name}`);\n }\n // Optional vars without defaults: skip silently\n } else if (envVar.choices && envVar.choices.length > 0 && envVar.choices[0]) {\n if (process.stdin.isTTY) {\n // Interactive mode with choices - prompt user to select\n const choices = [...envVar.choices];\n\n // Add skip option for optional fields\n if (!envVar.isRequired) {\n choices.push('Skip (optional)');\n }\n\n const value = await select({\n message: `[${serverName}] ${envVar.name}`,\n choices,\n });\n\n if (value !== 'Skip (optional)') {\n env[envVar.name] = value as string;\n }\n // If 'Skip (optional)' selected, don't add to env object\n } else {\n // Non-interactive: use first choice\n env[envVar.name] = envVar.choices[0];\n }\n } else if (envVar.isRequired) {\n if (process.stdin.isTTY) {\n // Interactive mode - required field - prompt for value\n const promptFn = envVar.isSecret ? password : input;\n const placeholder = getDynamicPlaceholder(envVar, options.templateVars);\n const value = await promptFn({\n message: `[${serverName}] ${envVar.name} (required)`,\n ...(placeholder ? { default: placeholder } : {}),\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'This field is required';\n }\n return true;\n },\n });\n env[envVar.name] = value as string;\n }\n // Non-interactive without -y: skip (will fail at runtime if truly required)\n } else if (!envVar.isRequired && !options.yes && process.stdin.isTTY) {\n // Interactive mode - optional env var without defaults\n // Ask user if they want to set it\n const shouldSet = await confirm({\n message: `[${serverName}] Set optional ${envVar.name}? (${envVar.description || 'optional'})`,\n default: false,\n });\n\n if (shouldSet) {\n const promptFn = envVar.isSecret ? password : input;\n const placeholder = getDynamicPlaceholder(envVar, options.templateVars);\n const value = await promptFn({\n message: `[${serverName}] ${envVar.name}`,\n ...(placeholder ? { default: placeholder } : {}),\n });\n\n if (value && (value as string).trim() !== '') {\n env[envVar.name] = value as string;\n }\n }\n }\n // Other optional env vars are skipped\n }\n\n return env;\n}\n"],"names":["promptForEnvVars","substituteTemplateVars","redactValue","value","isSecret","length","substring","template","variables","replace","match","varName","key","Object","keys","find","k","toLowerCase","getDynamicPlaceholder","envVar","placeholder","serverName","envVars","options","env","envValue","defaultValue","redactedValue","useEnvChoice","choices","message","promptFn","customValue","actionChoices","action","newValue","shouldSet","process","name","default","yes","stdin","isTTY","isRequired","push","select","password","input","validate","trim","console","log","templateVars","confirm","description"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/commands/manifest/env-prompting.ts"],"sourcesContent":["import confirm from '@inquirer/confirm';\nimport input from '@inquirer/input';\nimport password from '@inquirer/password';\nimport select from '@inquirer/select';\nimport type { EnvVarMetadata } from './metadata-reader.ts';\n\n/**\n * Redact sensitive values for display, showing only first 4 characters\n * Example: \"sk-1234567890abcdef\" -> \"sk-1XXX\"\n */\nfunction redactValue(value: string, isSecret: boolean): string {\n if (!isSecret) {\n return value;\n }\n\n if (value.length <= 6) {\n return 'XXX';\n }\n\n return `${value.substring(0, 4)}XXX`;\n}\n\n/**\n * Substitute template variables in a string\n * Replaces any {VARIABLE_NAME} with the corresponding value from the variables map\n * Variable names are case-insensitive\n */\nexport function substituteTemplateVars(template: string | undefined, variables?: Record<string, string>): string | undefined {\n if (!template || !variables) {\n return template;\n }\n\n // Replace any {VARIABLE_NAME} with corresponding value from variables map\n return template.replace(/\\{([^}]+)\\}/g, (match, varName) => {\n // Case-insensitive lookup\n const key = Object.keys(variables).find((k) => k.toLowerCase() === varName.toLowerCase());\n return key ? variables[key] : match;\n });\n}\n\n/**\n * Get dynamic placeholder for env vars by substituting template variables\n */\nfunction getDynamicPlaceholder(envVar: EnvVarMetadata, variables?: Record<string, string>): string | undefined {\n return substituteTemplateVars(envVar.placeholder, variables);\n}\n\n/**\n * Prompt user for environment variables with support for:\n * - Environment variable detection with partial redaction\n * - Interactive prompts for required fields\n * - Choice-based selection\n * - Password input for secrets\n * - Default values\n * - Non-interactive mode (-y flag)\n * - Dynamic placeholders via template variable substitution\n */\nexport async function promptForEnvVars(serverName: string, envVars: EnvVarMetadata[], options: { yes?: boolean; templateVars?: Record<string, string> } = {}): Promise<Record<string, string>> {\n const env: Record<string, string> = {};\n\n for (const envVar of envVars) {\n const envValue = process.env[envVar.name];\n // Support both 'default' (MCP schema standard) and 'value' (legacy) fields\n const defaultValue = envVar.default ?? envVar.value;\n\n if (defaultValue) {\n // Use default value from metadata if available\n env[envVar.name] = defaultValue;\n } else if (envValue && !options.yes && process.stdin.isTTY) {\n // Environment variable exists - present option with partial redaction\n const redactedValue = redactValue(envValue, envVar.isSecret);\n const useEnvChoice = `${redactedValue} (environment)`;\n\n if (envVar.choices && envVar.choices.length > 0) {\n // Has choices - add environment value as an option\n const choices = [useEnvChoice, ...envVar.choices, 'Enter custom value'];\n\n // Add skip option for optional fields\n if (!envVar.isRequired) {\n choices.push('Skip (optional)');\n }\n\n const message = `[${serverName}] ${envVar.name}`;\n\n const value = await select({\n message,\n choices,\n });\n\n if (value === useEnvChoice) {\n env[envVar.name] = envValue;\n } else if (value === 'Skip (optional)') {\n // Skip this optional env var - don't add to env object\n } else if (value === 'Enter custom value') {\n const promptFn = envVar.isSecret ? password : input;\n const customValue = await promptFn({\n message: `[${serverName}] ${envVar.name} (enter value)`,\n validate: (input: string) => {\n if (envVar.isRequired && (!input || input.trim() === '')) {\n return 'This field is required';\n }\n return true;\n },\n });\n env[envVar.name] = customValue as string;\n } else {\n env[envVar.name] = value as string;\n }\n } else {\n // No choices - simple confirmation or new value\n const actionChoices = [\n { name: `Use ${useEnvChoice}`, value: 'use-env' },\n { name: 'Enter new value', value: 'enter-new' },\n ];\n\n // Add skip option for optional fields\n if (!envVar.isRequired) {\n actionChoices.push({ name: 'Skip (optional)', value: 'skip' });\n }\n\n const message = `[${serverName}] ${envVar.name}`;\n\n const action = await select({\n message,\n choices: actionChoices,\n });\n\n if (action === 'use-env') {\n env[envVar.name] = envValue;\n } else if (action === 'skip') {\n // Skip this optional env var - don't add to env object\n } else {\n const promptFn = envVar.isSecret ? password : input;\n const newValue = await promptFn({\n message: `[${serverName}] ${envVar.name} (enter value)`,\n validate: (input: string) => {\n if (envVar.isRequired && (!input || input.trim() === '')) {\n return 'This field is required';\n }\n return true;\n },\n });\n env[envVar.name] = newValue as string;\n }\n }\n } else if (options.yes) {\n // -y mode: skip required vars without defaults (trust shell environment)\n if (envVar.choices && envVar.choices.length > 0 && envVar.choices[0]) {\n // Has choices - use first choice\n env[envVar.name] = envVar.choices[0];\n } else if (envVar.isRequired) {\n // Required but no default - skip with warning\n console.log(` ⚠️ Skipping ${envVar.name}`);\n }\n // Optional vars without defaults: skip silently\n } else if (envVar.choices && envVar.choices.length > 0 && envVar.choices[0]) {\n if (process.stdin.isTTY) {\n // Interactive mode with choices - prompt user to select\n const choices = [...envVar.choices];\n\n // Add skip option for optional fields\n if (!envVar.isRequired) {\n choices.push('Skip (optional)');\n }\n\n const value = await select({\n message: `[${serverName}] ${envVar.name}`,\n choices,\n });\n\n if (value !== 'Skip (optional)') {\n env[envVar.name] = value as string;\n }\n // If 'Skip (optional)' selected, don't add to env object\n } else {\n // Non-interactive: use first choice\n env[envVar.name] = envVar.choices[0];\n }\n } else if (envVar.isRequired) {\n if (process.stdin.isTTY) {\n // Interactive mode - required field - prompt for value\n const promptFn = envVar.isSecret ? password : input;\n const placeholder = getDynamicPlaceholder(envVar, options.templateVars);\n const value = await promptFn({\n message: `[${serverName}] ${envVar.name} (required)`,\n ...(placeholder ? { default: placeholder } : {}),\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'This field is required';\n }\n return true;\n },\n });\n env[envVar.name] = value as string;\n }\n // Non-interactive without -y: skip (will fail at runtime if truly required)\n } else if (!envVar.isRequired && !options.yes && process.stdin.isTTY) {\n // Interactive mode - optional env var without defaults\n // Ask user if they want to set it\n const shouldSet = await confirm({\n message: `[${serverName}] Set optional ${envVar.name}? (${envVar.description || 'optional'})`,\n default: false,\n });\n\n if (shouldSet) {\n const promptFn = envVar.isSecret ? password : input;\n const placeholder = getDynamicPlaceholder(envVar, options.templateVars);\n const value = await promptFn({\n message: `[${serverName}] ${envVar.name}`,\n ...(placeholder ? { default: placeholder } : {}),\n });\n\n if (value && (value as string).trim() !== '') {\n env[envVar.name] = value as string;\n }\n }\n }\n // Other optional env vars are skipped\n }\n\n return env;\n}\n"],"names":["promptForEnvVars","substituteTemplateVars","redactValue","value","isSecret","length","substring","template","variables","replace","match","varName","key","Object","keys","find","k","toLowerCase","getDynamicPlaceholder","envVar","placeholder","serverName","envVars","options","env","envValue","defaultValue","redactedValue","useEnvChoice","choices","message","promptFn","customValue","actionChoices","action","newValue","shouldSet","process","name","default","yes","stdin","isTTY","isRequired","push","select","password","input","validate","trim","console","log","templateVars","confirm","description"],"mappings":"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"}