@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
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/commands/search.ts"],"sourcesContent":["/**\n * search.ts\n *\n * Search MCP server capabilities (tools, prompts, resources) without loading full schemas.\n * Designed for agent discovery workflows.\n */\n\nimport { type CapabilityType, createServerRegistry, type SearchField, type SearchOptions, type SearchResponse, type ServerRegistry } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findConfigPath } from '../lib/find-config.ts';\n\nexport interface SearchCommandOptions {\n config?: string;\n servers?: string;\n types?: string;\n fields?: string;\n limit?: number;\n threshold?: number;\n json?: boolean;\n attach?: boolean;\n}\n\n/**\n * Main search command implementation.\n *\n * @param query - The search query string\n * @param opts - Search options from CLI flags\n *\n * @example\n * // Search for email-related capabilities\n * await searchCommand('send email', {});\n *\n * @example\n * // Search only tools in specific servers\n * await searchCommand('spreadsheet', { types: 'tool', servers: 'sheets,drive' });\n */\nexport async function searchCommand(query: string, opts: SearchCommandOptions = {}): 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\n // Parse options\n const searchOptions: SearchOptions = {\n types: parseTypes(opts.types),\n servers: parseServers(opts.servers),\n searchFields: parseFields(opts.fields),\n limit: opts.limit ?? 20,\n threshold: opts.threshold ?? 0,\n };\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 // Connect to all servers (or filtered subset)\n const serverNames = searchOptions.servers ?? Object.keys(servers || {});\n\n for (const serverName of serverNames) {\n try {\n await registry.connect(serverName);\n } catch (error) {\n // Log connection errors but continue with other servers\n if (!opts.json) {\n console.error(`⚠ Failed to connect to ${serverName}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n // Search across connected clients\n const response = await registry.searchCapabilities(query, searchOptions);\n\n // Output results\n if (opts.json) {\n outputJSON(response);\n } else {\n outputPretty(response);\n }\n } finally {\n // 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 * Parse comma-separated types into CapabilityType array\n */\nfunction parseTypes(typesStr?: string): CapabilityType[] | undefined {\n if (!typesStr) return undefined;\n\n const validTypes: CapabilityType[] = ['tool', 'prompt', 'resource'];\n const parsed = typesStr.split(',').map((t) => t.trim().toLowerCase()) as CapabilityType[];\n\n const invalid = parsed.filter((t) => !validTypes.includes(t));\n if (invalid.length > 0) {\n throw new Error(`Invalid types: ${invalid.join(', ')}. Valid types: ${validTypes.join(', ')}`);\n }\n\n return parsed;\n}\n\n/**\n * Parse comma-separated server names\n */\nfunction parseServers(serversStr?: string): string[] | undefined {\n if (!serversStr) return undefined;\n return serversStr.split(',').map((s) => s.trim());\n}\n\n/**\n * Parse comma-separated search fields\n */\nfunction parseFields(fieldsStr?: string): SearchField[] | undefined {\n if (!fieldsStr) return undefined;\n\n const validFields: SearchField[] = ['name', 'description', 'schema', 'server'];\n const parsed = fieldsStr.split(',').map((f) => f.trim().toLowerCase()) as SearchField[];\n\n const invalid = parsed.filter((f) => !validFields.includes(f));\n if (invalid.length > 0) {\n throw new Error(`Invalid fields: ${invalid.join(', ')}. Valid fields: ${validFields.join(', ')}`);\n }\n\n return parsed;\n}\n\n/**\n * Output results as JSON\n */\nfunction outputJSON(response: SearchResponse): void {\n console.log(JSON.stringify(response, null, 2));\n}\n\n/**\n * Output results in human-readable format\n */\nfunction outputPretty(response: SearchResponse): void {\n if (response.results.length === 0) {\n console.log(`No results found for \"${response.query}\"`);\n return;\n }\n\n console.log(`Found ${response.total} result${response.total !== 1 ? 's' : ''} for \"${response.query}\"${response.total > response.results.length ? ` (showing ${response.results.length})` : ''}:\\n`);\n\n for (const result of response.results) {\n const typeIcon = result.type === 'tool' ? 'šŸ”§' : result.type === 'prompt' ? 'šŸ’¬' : 'šŸ“„';\n const score = (result.score * 100).toFixed(0);\n\n console.log(`${typeIcon} ${result.name} [${result.type}] (${score}%)`);\n console.log(` Server: ${result.server}`);\n\n if (result.description) {\n const desc = result.description.length > 100 ? `${result.description.slice(0, 97)}...` : result.description;\n console.log(` ${desc}`);\n }\n\n if (result.matchedOn.length > 0) {\n console.log(` Matched: ${result.matchedOn.join(', ')}`);\n }\n\n console.log('');\n }\n}\n"],"names":["searchCommand","query","opts","registry","raw","searchOptions","configPath","servers","configDir","serverNames","serverName","error","response","_","findConfigPath","config","JSON","parse","fs","readFileSync","mcpServers","path","dirname","types","parseTypes","parseServers","searchFields","parseFields","fields","limit","threshold","createServerRegistry","cwd","dialects","attach","Object","keys","connect","json","console","Error","message","String","searchCapabilities","outputJSON","outputPretty","close","typesStr","undefined","validTypes","parsed","split","map","t","trim","toLowerCase","invalid","filter","includes","length","join","serversStr","s","fieldsStr","validFields","f","log","stringify","results","total","result","typeIcon","type","score","toFixed","name","server","description","desc","slice","matchedOn"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/commands/search.ts"],"sourcesContent":["/**\n * search.ts\n *\n * Search MCP server capabilities (tools, prompts, resources) without loading full schemas.\n * Designed for agent discovery workflows.\n */\n\nimport { type CapabilityType, createServerRegistry, type SearchField, type SearchOptions, type SearchResponse, type ServerRegistry } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findConfigPath } from '../lib/find-config.ts';\n\nexport interface SearchCommandOptions {\n config?: string;\n servers?: string;\n types?: string;\n fields?: string;\n limit?: number;\n threshold?: number;\n json?: boolean;\n attach?: boolean;\n}\n\n/**\n * Main search command implementation.\n *\n * @param query - The search query string\n * @param opts - Search options from CLI flags\n *\n * @example\n * // Search for email-related capabilities\n * await searchCommand('send email', {});\n *\n * @example\n * // Search only tools in specific servers\n * await searchCommand('spreadsheet', { types: 'tool', servers: 'sheets,drive' });\n */\nexport async function searchCommand(query: string, opts: SearchCommandOptions = {}): 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\n // Parse options\n const searchOptions: SearchOptions = {\n types: parseTypes(opts.types),\n servers: parseServers(opts.servers),\n searchFields: parseFields(opts.fields),\n limit: opts.limit ?? 20,\n threshold: opts.threshold ?? 0,\n };\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 // Connect to all servers (or filtered subset)\n const serverNames = searchOptions.servers ?? Object.keys(servers || {});\n\n for (const serverName of serverNames) {\n try {\n await registry.connect(serverName);\n } catch (error) {\n // Log connection errors but continue with other servers\n if (!opts.json) {\n console.error(`⚠ Failed to connect to ${serverName}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n\n // Search across connected clients\n const response = await registry.searchCapabilities(query, searchOptions);\n\n // Output results\n if (opts.json) {\n outputJSON(response);\n } else {\n outputPretty(response);\n }\n } finally {\n // 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 * Parse comma-separated types into CapabilityType array\n */\nfunction parseTypes(typesStr?: string): CapabilityType[] | undefined {\n if (!typesStr) return undefined;\n\n const validTypes: CapabilityType[] = ['tool', 'prompt', 'resource'];\n const parsed = typesStr.split(',').map((t) => t.trim().toLowerCase()) as CapabilityType[];\n\n const invalid = parsed.filter((t) => !validTypes.includes(t));\n if (invalid.length > 0) {\n throw new Error(`Invalid types: ${invalid.join(', ')}. Valid types: ${validTypes.join(', ')}`);\n }\n\n return parsed;\n}\n\n/**\n * Parse comma-separated server names\n */\nfunction parseServers(serversStr?: string): string[] | undefined {\n if (!serversStr) return undefined;\n return serversStr.split(',').map((s) => s.trim());\n}\n\n/**\n * Parse comma-separated search fields\n */\nfunction parseFields(fieldsStr?: string): SearchField[] | undefined {\n if (!fieldsStr) return undefined;\n\n const validFields: SearchField[] = ['name', 'description', 'schema', 'server'];\n const parsed = fieldsStr.split(',').map((f) => f.trim().toLowerCase()) as SearchField[];\n\n const invalid = parsed.filter((f) => !validFields.includes(f));\n if (invalid.length > 0) {\n throw new Error(`Invalid fields: ${invalid.join(', ')}. Valid fields: ${validFields.join(', ')}`);\n }\n\n return parsed;\n}\n\n/**\n * Output results as JSON\n */\nfunction outputJSON(response: SearchResponse): void {\n console.log(JSON.stringify(response, null, 2));\n}\n\n/**\n * Output results in human-readable format\n */\nfunction outputPretty(response: SearchResponse): void {\n if (response.results.length === 0) {\n console.log(`No results found for \"${response.query}\"`);\n return;\n }\n\n console.log(`Found ${response.total} result${response.total !== 1 ? 's' : ''} for \"${response.query}\"${response.total > response.results.length ? ` (showing ${response.results.length})` : ''}:\\n`);\n\n for (const result of response.results) {\n const typeIcon = result.type === 'tool' ? 'šŸ”§' : result.type === 'prompt' ? 'šŸ’¬' : 'šŸ“„';\n const score = (result.score * 100).toFixed(0);\n\n console.log(`${typeIcon} ${result.name} [${result.type}] (${score}%)`);\n console.log(` Server: ${result.server}`);\n\n if (result.description) {\n const desc = result.description.length > 100 ? `${result.description.slice(0, 97)}...` : result.description;\n console.log(` ${desc}`);\n }\n\n if (result.matchedOn.length > 0) {\n console.log(` Matched: ${result.matchedOn.join(', ')}`);\n }\n\n console.log('');\n }\n}\n"],"names":["searchCommand","query","opts","registry","raw","searchOptions","configPath","servers","configDir","serverNames","serverName","error","response","_","findConfigPath","config","JSON","parse","fs","readFileSync","mcpServers","path","dirname","types","parseTypes","parseServers","searchFields","parseFields","fields","limit","threshold","createServerRegistry","cwd","dialects","attach","Object","keys","connect","json","console","Error","message","String","searchCapabilities","outputJSON","outputPretty","close","typesStr","undefined","validTypes","parsed","split","map","t","trim","toLowerCase","invalid","filter","includes","length","join","serversStr","s","fieldsStr","validFields","f","log","stringify","results","total","result","typeIcon","type","score","toFixed","name","server","description","desc","slice","matchedOn"],"mappings":"AAAA;;;;;CAKC;;;;+BAgCqBA;;;eAAAA;;;sBA9BoH;0DACtH;4DACE;4BACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BxB,SAAeA;wCAAcC,KAAa;YAAEC,MAC7CC,UAKcC,MAAAA,iBAQPF,aACIA,iBAWOG,wBAtBdC,YACAF,KACAG,SACAC,WAGAH,eAgBAI,aAED,2BAAA,mBAAA,gBAAA,WAAA,OAAMC,YAGAC,YASLC,UAaKC;;;;;oBArDoCX,OAAAA,oEAA6B,CAAC;;;;;;;;;oBAIvEI,aAAaQ,IAAAA,4BAAc,EAACZ,KAAKa,MAAM;oBACvCX,MAAMY,KAAKC,KAAK,CAACC,IAAGC,YAAY,CAACb,YAAY;oBAC7CC,WAAUH,QAAAA,kBAAAA,IAAIgB,UAAU,cAAdhB,6BAAAA,kBAAkBA,IAAIG,OAAO,cAA7BH,kBAAAA,OAAiCA;oBAC3CI,YAAYa,MAAKC,OAAO,CAAChB;oBAE/B,gBAAgB;oBACVD,gBAA+B;wBACnCkB,OAAOC,WAAWtB,KAAKqB,KAAK;wBAC5BhB,SAASkB,aAAavB,KAAKK,OAAO;wBAClCmB,cAAcC,YAAYzB,KAAK0B,MAAM;wBACrCC,KAAK,GAAE3B,cAAAA,KAAK2B,KAAK,cAAV3B,yBAAAA,cAAc;wBACrB4B,SAAS,GAAE5B,kBAAAA,KAAK4B,SAAS,cAAd5B,6BAAAA,kBAAkB;oBAC/B;oBAEA,iEAAiE;oBACjE,6DAA6D;oBAC7DC,WAAW4B,IAAAA,4BAAoB,EAACxB,SAAS;wBACvCyB,KAAKxB;wBACLyB,UAAU/B,KAAKgC,MAAM;4BAAS;4BAAW;;oBAC3C;oBAEA,8CAA8C;oBACxCzB,eAAcJ,yBAAAA,cAAcE,OAAO,cAArBF,oCAAAA,yBAAyB8B,OAAOC,IAAI,CAAC7B,WAAW,CAAC;oBAEhE,kCAAA,2BAAA;;;;;;;;;oBAAA,YAAoBE;;;2BAApB,6BAAA,QAAA;;;;oBAAMC,aAAN;;;;;;;;;oBAED;;wBAAMP,SAASkC,OAAO,CAAC3B;;;oBAAvB;;;;;;oBACOC;oBACP,wDAAwD;oBACxD,IAAI,CAACT,KAAKoC,IAAI,EAAE;wBACdC,QAAQ5B,KAAK,CAAC,AAAC,0BAAwCA,OAAfD,YAAW,MAA2D,OAAvDC,AAAK,YAALA,OAAiB6B,SAAQ7B,MAAM8B,OAAO,GAAGC,OAAO/B;oBACzG;;;;;;oBAPC;;;;;;;;;;;;oBAAA;oBAAA;;;;;;;6BAAA,6BAAA;4BAAA;;;4BAAA;kCAAA;;;;;;;oBAYY;;wBAAMR,SAASwC,kBAAkB,CAAC1C,OAAOI;;;oBAApDO,WAAW;oBAEjB,iBAAiB;oBACjB,IAAIV,KAAKoC,IAAI,EAAE;wBACbM,WAAWhC;oBACb,OAAO;wBACLiC,aAAajC;oBACf;;;;;;yBAGIT,UAAAA;;;;;;;;;;;;oBAEA;;wBAAMA,SAAS2C,KAAK;;;oBAApB;;;;;;oBACOjC;;;;;;;;;;;;;;;IAKf;;AAEA;;CAEC,GACD,SAASW,WAAWuB,QAAiB;IACnC,IAAI,CAACA,UAAU,OAAOC;IAEtB,IAAMC,aAA+B;QAAC;QAAQ;QAAU;KAAW;IACnE,IAAMC,SAASH,SAASI,KAAK,CAAC,KAAKC,GAAG,CAAC,SAACC;eAAMA,EAAEC,IAAI,GAAGC,WAAW;;IAElE,IAAMC,UAAUN,OAAOO,MAAM,CAAC,SAACJ;eAAM,CAACJ,WAAWS,QAAQ,CAACL;;IAC1D,IAAIG,QAAQG,MAAM,GAAG,GAAG;QACtB,MAAM,IAAInB,MAAM,AAAC,kBAAqDS,OAApCO,QAAQI,IAAI,CAAC,OAAM,mBAAuC,OAAtBX,WAAWW,IAAI,CAAC;IACxF;IAEA,OAAOV;AACT;AAEA;;CAEC,GACD,SAASzB,aAAaoC,UAAmB;IACvC,IAAI,CAACA,YAAY,OAAOb;IACxB,OAAOa,WAAWV,KAAK,CAAC,KAAKC,GAAG,CAAC,SAACU;eAAMA,EAAER,IAAI;;AAChD;AAEA;;CAEC,GACD,SAAS3B,YAAYoC,SAAkB;IACrC,IAAI,CAACA,WAAW,OAAOf;IAEvB,IAAMgB,cAA6B;QAAC;QAAQ;QAAe;QAAU;KAAS;IAC9E,IAAMd,SAASa,UAAUZ,KAAK,CAAC,KAAKC,GAAG,CAAC,SAACa;eAAMA,EAAEX,IAAI,GAAGC,WAAW;;IAEnE,IAAMC,UAAUN,OAAOO,MAAM,CAAC,SAACQ;eAAM,CAACD,YAAYN,QAAQ,CAACO;;IAC3D,IAAIT,QAAQG,MAAM,GAAG,GAAG;QACtB,MAAM,IAAInB,MAAM,AAAC,mBAAuDwB,OAArCR,QAAQI,IAAI,CAAC,OAAM,oBAAyC,OAAvBI,YAAYJ,IAAI,CAAC;IAC3F;IAEA,OAAOV;AACT;AAEA;;CAEC,GACD,SAASN,WAAWhC,QAAwB;IAC1C2B,QAAQ2B,GAAG,CAAClD,KAAKmD,SAAS,CAACvD,UAAU,MAAM;AAC7C;AAEA;;CAEC,GACD,SAASiC,aAAajC,QAAwB;IAC5C,IAAIA,SAASwD,OAAO,CAACT,MAAM,KAAK,GAAG;QACjCpB,QAAQ2B,GAAG,CAAC,AAAC,yBAAuC,OAAftD,SAASX,KAAK,EAAC;QACpD;IACF;IAEAsC,QAAQ2B,GAAG,CAAC,AAAC,SAAgCtD,OAAxBA,SAASyD,KAAK,EAAC,WAAiDzD,OAAxCA,SAASyD,KAAK,KAAK,IAAI,MAAM,IAAG,UAA0BzD,OAAlBA,SAASX,KAAK,EAAC,KAA2F,OAAxFW,SAASyD,KAAK,GAAGzD,SAASwD,OAAO,CAACT,MAAM,GAAG,AAAC,aAAoC,OAAxB/C,SAASwD,OAAO,CAACT,MAAM,EAAC,OAAK,IAAG;QAE1L,kCAAA,2BAAA;;QAAL,QAAK,YAAgB/C,SAASwD,OAAO,qBAAhC,SAAA,6BAAA,QAAA,yBAAA,iCAAkC;YAAlC,IAAME,SAAN;YACH,IAAMC,WAAWD,OAAOE,IAAI,KAAK,SAAS,OAAOF,OAAOE,IAAI,KAAK,WAAW,OAAO;YACnF,IAAMC,QAAQ,AAACH,CAAAA,OAAOG,KAAK,GAAG,GAAE,EAAGC,OAAO,CAAC;YAE3CnC,QAAQ2B,GAAG,CAAC,AAAC,GAAcI,OAAZC,UAAS,KAAmBD,OAAhBA,OAAOK,IAAI,EAAC,MAAqBF,OAAjBH,OAAOE,IAAI,EAAC,OAAW,OAANC,OAAM;YAClElC,QAAQ2B,GAAG,CAAC,AAAC,cAA2B,OAAdI,OAAOM,MAAM;YAEvC,IAAIN,OAAOO,WAAW,EAAE;gBACtB,IAAMC,OAAOR,OAAOO,WAAW,CAAClB,MAAM,GAAG,MAAM,AAAC,GAAkC,OAAhCW,OAAOO,WAAW,CAACE,KAAK,CAAC,GAAG,KAAI,SAAOT,OAAOO,WAAW;gBAC3GtC,QAAQ2B,GAAG,CAAC,AAAC,MAAU,OAALY;YACpB;YAEA,IAAIR,OAAOU,SAAS,CAACrB,MAAM,GAAG,GAAG;gBAC/BpB,QAAQ2B,GAAG,CAAC,AAAC,eAA0C,OAA5BI,OAAOU,SAAS,CAACpB,IAAI,CAAC;YACnD;YAEArB,QAAQ2B,GAAG,CAAC;QACd;;QAjBK;QAAA;;;iBAAA,6BAAA;gBAAA;;;gBAAA;sBAAA;;;;AAkBP"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/commands/up.ts"],"sourcesContent":["import { createServerRegistry, type Dialect, type ServerRegistry } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findConfigPath } from '../lib/find-config.ts';\nimport { hasStartBlock, type ServerConfig } from '../types.ts';\n\n/**\n * Configuration options for the upCommand function\n * @public\n */\nexport interface UpOptions {\n /** Optional path to custom .mcp.json configuration file */\n config?: string;\n /** Start only stdio servers (Claude Code compatible mode) */\n stdioOnly?: boolean;\n /** Start only HTTP servers with start blocks (for Claude Code Desktop) */\n httpOnly?: boolean;\n}\n\n/**\n * MCP server configuration entry per MCP specification.\n *\n * Supports two transport types:\n * - stdio (default if no type): spawned process with stdin/stdout\n * - http: remote HTTP server\n *\n * Transport can be inferred from URL protocol:\n * - http:// or https:// → http\n *\n * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/transports\n */\n\n/**\n * Start a cluster of MCP servers from a configuration file or object.\n *\n * @param opts - Configuration options\n * @param opts.config - Optional path to custom .mcp.json file\n * @returns ServerRegistry with servers map, config, connect method, and close function\n *\n * @example\n * // Auto-discover .mcp.json in current directory\n * const registry = await upCommand();\n *\n * @example\n * // Load from specific config\n * const registry = await upCommand({ config: '/path/to/.mcp.json' });\n *\n * @example\n * // Use in-memory config\n * const registry = await upCommand({\n * mcpServers: {\n * 'echo-stdio': { command: 'node', args: ['test/lib/servers/echo-stdio.ts'] }\n * }\n * });\n */\nexport async function upCommand(opts: UpOptions = {}): Promise<ServerRegistry> {\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\n // Determine dialects based on flags\n // Default is ['servers', 'start'] (spawns everything)\n let dialects: Dialect[] = ['servers', 'start'];\n if (opts.stdioOnly) {\n dialects = ['servers'];\n } else if (opts.httpOnly) {\n dialects = ['start'];\n // In http-only mode, check if there are any servers with start blocks\n const hasStartBlocks = Object.values(servers || {}).some((entry) => entry && hasStartBlock(entry as ServerConfig));\n if (!hasStartBlocks) {\n console.log(' No HTTP servers found with start configuration');\n console.log(' (stdio servers are spawned automatically by Claude Code)');\n // Return empty registry\n return createServerRegistry({}, { cwd: configDir });\n }\n }\n\n return createServerRegistry(servers, {\n cwd: configDir,\n dialects,\n });\n}\n"],"names":["upCommand","opts","raw","configPath","servers","configDir","dialects","hasStartBlocks","findConfigPath","config","JSON","parse","fs","readFileSync","mcpServers","path","dirname","stdioOnly","httpOnly","Object","values","some","entry","hasStartBlock","console","log","createServerRegistry","cwd"],"mappings":";;;;+BAuDsBA;;;eAAAA;;;sBAvDkD;0DACpD;4DACE;4BACS;uBACkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmD1C,SAAeA;;YAAUC,MAGdC,MAAAA,iBAFVC,YACAD,KACAE,SACAC,WAIFC,UAMIC;;;YAdsBN,OAAAA,oEAAkB,CAAC;YAC3CE,aAAaK,IAAAA,4BAAc,EAACP,KAAKQ,MAAM;YACvCP,MAAMQ,KAAKC,KAAK,CAACC,IAAGC,YAAY,CAACV,YAAY;YAC7CC,WAAUF,QAAAA,kBAAAA,IAAIY,UAAU,cAAdZ,6BAAAA,kBAAkBA,IAAIE,OAAO,cAA7BF,kBAAAA,OAAiCA;YAC3CG,YAAYU,MAAKC,OAAO,CAACb;YAE/B,oCAAoC;YACpC,sDAAsD;YAClDG;gBAAuB;gBAAW;;YACtC,IAAIL,KAAKgB,SAAS,EAAE;gBAClBX;oBAAY;;YACd,OAAO,IAAIL,KAAKiB,QAAQ,EAAE;gBACxBZ;oBAAY;;gBACZ,sEAAsE;gBAChEC,iBAAiBY,OAAOC,MAAM,CAAChB,WAAW,CAAC,GAAGiB,IAAI,CAAC,SAACC;2BAAUA,SAASC,IAAAA,sBAAa,EAACD;;gBAC3F,IAAI,CAACf,gBAAgB;oBACnBiB,QAAQC,GAAG,CAAC;oBACZD,QAAQC,GAAG,CAAC;oBACZ,wBAAwB;oBACxB;;wBAAOC,IAAAA,4BAAoB,EAAC,CAAC,GAAG;4BAAEC,KAAKtB;wBAAU;;gBACnD;YACF;YAEA;;gBAAOqB,IAAAA,4BAAoB,EAACtB,SAAS;oBACnCuB,KAAKtB;oBACLC,UAAAA;gBACF;;;IACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/commands/up.ts"],"sourcesContent":["import { createServerRegistry, type Dialect, type ServerRegistry } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findConfigPath } from '../lib/find-config.ts';\nimport { hasStartBlock, type ServerConfig } from '../types.ts';\n\n/**\n * Configuration options for the upCommand function\n * @public\n */\nexport interface UpOptions {\n /** Optional path to custom .mcp.json configuration file */\n config?: string;\n /** Start only stdio servers (Claude Code compatible mode) */\n stdioOnly?: boolean;\n /** Start only HTTP servers with start blocks (for Claude Code Desktop) */\n httpOnly?: boolean;\n}\n\n/**\n * MCP server configuration entry per MCP specification.\n *\n * Supports two transport types:\n * - stdio (default if no type): spawned process with stdin/stdout\n * - http: remote HTTP server\n *\n * Transport can be inferred from URL protocol:\n * - http:// or https:// → http\n *\n * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/transports\n */\n\n/**\n * Start a cluster of MCP servers from a configuration file or object.\n *\n * @param opts - Configuration options\n * @param opts.config - Optional path to custom .mcp.json file\n * @returns ServerRegistry with servers map, config, connect method, and close function\n *\n * @example\n * // Auto-discover .mcp.json in current directory\n * const registry = await upCommand();\n *\n * @example\n * // Load from specific config\n * const registry = await upCommand({ config: '/path/to/.mcp.json' });\n *\n * @example\n * // Use in-memory config\n * const registry = await upCommand({\n * mcpServers: {\n * 'echo-stdio': { command: 'node', args: ['test/lib/servers/echo-stdio.ts'] }\n * }\n * });\n */\nexport async function upCommand(opts: UpOptions = {}): Promise<ServerRegistry> {\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\n // Determine dialects based on flags\n // Default is ['servers', 'start'] (spawns everything)\n let dialects: Dialect[] = ['servers', 'start'];\n if (opts.stdioOnly) {\n dialects = ['servers'];\n } else if (opts.httpOnly) {\n dialects = ['start'];\n // In http-only mode, check if there are any servers with start blocks\n const hasStartBlocks = Object.values(servers || {}).some((entry) => entry && hasStartBlock(entry as ServerConfig));\n if (!hasStartBlocks) {\n console.log(' No HTTP servers found with start configuration');\n console.log(' (stdio servers are spawned automatically by Claude Code)');\n // Return empty registry\n return createServerRegistry({}, { cwd: configDir });\n }\n }\n\n return createServerRegistry(servers, {\n cwd: configDir,\n dialects,\n });\n}\n"],"names":["upCommand","opts","raw","configPath","servers","configDir","dialects","hasStartBlocks","findConfigPath","config","JSON","parse","fs","readFileSync","mcpServers","path","dirname","stdioOnly","httpOnly","Object","values","some","entry","hasStartBlock","console","log","createServerRegistry","cwd"],"mappings":";;;;+BAuDsBA;;;eAAAA;;;sBAvDkD;0DACpD;4DACE;4BACS;uBACkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmD1C,SAAeA;;YAAUC,MAGdC,MAAAA,iBAFVC,YACAD,KACAE,SACAC,WAIFC,UAMIC;;;YAdsBN,OAAAA,oEAAkB,CAAC;YAC3CE,aAAaK,IAAAA,4BAAc,EAACP,KAAKQ,MAAM;YACvCP,MAAMQ,KAAKC,KAAK,CAACC,IAAGC,YAAY,CAACV,YAAY;YAC7CC,WAAUF,QAAAA,kBAAAA,IAAIY,UAAU,cAAdZ,6BAAAA,kBAAkBA,IAAIE,OAAO,cAA7BF,kBAAAA,OAAiCA;YAC3CG,YAAYU,MAAKC,OAAO,CAACb;YAE/B,oCAAoC;YACpC,sDAAsD;YAClDG;gBAAuB;gBAAW;;YACtC,IAAIL,KAAKgB,SAAS,EAAE;gBAClBX;oBAAY;;YACd,OAAO,IAAIL,KAAKiB,QAAQ,EAAE;gBACxBZ;oBAAY;;gBACZ,sEAAsE;gBAChEC,iBAAiBY,OAAOC,MAAM,CAAChB,WAAW,CAAC,GAAGiB,IAAI,CAAC,SAACC;2BAAUA,SAASC,IAAAA,sBAAa,EAACD;;gBAC3F,IAAI,CAACf,gBAAgB;oBACnBiB,QAAQC,GAAG,CAAC;oBACZD,QAAQC,GAAG,CAAC;oBACZ,wBAAwB;oBACxB;;wBAAOC,IAAAA,4BAAoB,EAAC,CAAC,GAAG;4BAAEC,KAAKtB;wBAAU;;gBACnD;YACF;YAEA;;gBAAOqB,IAAAA,4BAAoB,EAACtB,SAAS;oBACnCuB,KAAKtB;oBACLC,UAAAA;gBACF;;;IACF"}
@@ -1,11 +1,11 @@
1
- export { callToolCommand } from './commands/call-tool.js';
2
- export { getPromptCommand } from './commands/get-prompt.js';
3
- export { inspectCommand } from './commands/inspect.js';
1
+ export { type CallToolOptions, callToolCommand } from './commands/call-tool.js';
2
+ export { type GetPromptOptions, getPromptCommand } from './commands/get-prompt.js';
3
+ export { type InspectOptions, inspectCommand } from './commands/inspect.js';
4
4
  export { type Combination, type ConfigChoice, type ConfigurationMode, createConfigChoices, type Dimension, discoverServerJson, extractServerName, filterConfigChoices, generateConditionalCombinations, generateConfigFile, generateConfigObject, generateMatrixCombinations, shouldPromptEnvVar, TRANSPORT_MAP, } from './commands/manifest/generate.js';
5
- export { type CliArgMetadata, type EnvVarMetadata, MetadataReader, type ServerMetadata } from './commands/manifest/metadata-reader.js';
5
+ export { type CliArgMetadata, type EnvVarMetadata, MetadataReader, type MetadataReaderOptions, type PackageConfig, type ServerMetadata } from './commands/manifest/metadata-reader.js';
6
6
  export { validateCommand } from './commands/manifest/validate.js';
7
- export { readResourceCommand } from './commands/read-resource.js';
8
- export { upCommand } from './commands/up.js';
7
+ export { type ReadResourceOptions, readResourceCommand } from './commands/read-resource.js';
8
+ export { type UpOptions, upCommand } from './commands/up.js';
9
9
  export { getSchema, SCHEMA_URL, validateSchema } from './lib/json-schema.js';
10
10
  export { type InlineConfigOptions, type ResolvedServerConfig, resolveServerConfig } from './lib/resolve-server-config.js';
11
11
  export * from './types.js';
@@ -1,11 +1,11 @@
1
- export { callToolCommand } from './commands/call-tool.js';
2
- export { getPromptCommand } from './commands/get-prompt.js';
3
- export { inspectCommand } from './commands/inspect.js';
1
+ export { type CallToolOptions, callToolCommand } from './commands/call-tool.js';
2
+ export { type GetPromptOptions, getPromptCommand } from './commands/get-prompt.js';
3
+ export { type InspectOptions, inspectCommand } from './commands/inspect.js';
4
4
  export { type Combination, type ConfigChoice, type ConfigurationMode, createConfigChoices, type Dimension, discoverServerJson, extractServerName, filterConfigChoices, generateConditionalCombinations, generateConfigFile, generateConfigObject, generateMatrixCombinations, shouldPromptEnvVar, TRANSPORT_MAP, } from './commands/manifest/generate.js';
5
- export { type CliArgMetadata, type EnvVarMetadata, MetadataReader, type ServerMetadata } from './commands/manifest/metadata-reader.js';
5
+ export { type CliArgMetadata, type EnvVarMetadata, MetadataReader, type MetadataReaderOptions, type PackageConfig, type ServerMetadata } from './commands/manifest/metadata-reader.js';
6
6
  export { validateCommand } from './commands/manifest/validate.js';
7
- export { readResourceCommand } from './commands/read-resource.js';
8
- export { upCommand } from './commands/up.js';
7
+ export { type ReadResourceOptions, readResourceCommand } from './commands/read-resource.js';
8
+ export { type UpOptions, upCommand } from './commands/up.js';
9
9
  export { getSchema, SCHEMA_URL, validateSchema } from './lib/json-schema.js';
10
10
  export { type InlineConfigOptions, type ResolvedServerConfig, resolveServerConfig } from './lib/resolve-server-config.js';
11
11
  export * from './types.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/index.ts"],"sourcesContent":["// Base types and type guards\n\nexport { callToolCommand } from './commands/call-tool.ts';\nexport { getPromptCommand } from './commands/get-prompt.ts';\nexport { inspectCommand } from './commands/inspect.ts';\nexport {\n type Combination,\n type ConfigChoice,\n type ConfigurationMode,\n createConfigChoices,\n type Dimension,\n discoverServerJson,\n extractServerName,\n filterConfigChoices,\n generateConditionalCombinations,\n generateConfigFile,\n generateConfigObject,\n generateMatrixCombinations,\n shouldPromptEnvVar,\n TRANSPORT_MAP,\n} from './commands/manifest/generate.ts';\nexport { type CliArgMetadata, type EnvVarMetadata, MetadataReader, type ServerMetadata } from './commands/manifest/metadata-reader.ts';\n// Manifest commands\nexport { validateCommand } from './commands/manifest/validate.ts';\nexport { readResourceCommand } from './commands/read-resource.ts';\nexport { upCommand } from './commands/up.ts';\n\n// Library utilities\nexport { getSchema, SCHEMA_URL, validateSchema } from './lib/json-schema.ts';\nexport { type InlineConfigOptions, type ResolvedServerConfig, resolveServerConfig } from './lib/resolve-server-config.ts';\nexport * from './types.ts';\n"],"names":["MetadataReader","SCHEMA_URL","TRANSPORT_MAP","callToolCommand","createConfigChoices","discoverServerJson","extractServerName","filterConfigChoices","generateConditionalCombinations","generateConfigFile","generateConfigObject","generateMatrixCombinations","getPromptCommand","getSchema","inspectCommand","readResourceCommand","resolveServerConfig","shouldPromptEnvVar","upCommand","validateCommand","validateSchema"],"mappings":"AAAA,6BAA6B;;;;;;;;;;;;QAqBsBA;eAAAA,gCAAc;;QAO7CC;eAAAA,wBAAU;;QAT5BC;eAAAA,yBAAa;;QAjBNC;eAAAA,2BAAe;;QAOtBC;eAAAA,+BAAmB;;QAEnBC;eAAAA,8BAAkB;;QAClBC;eAAAA,6BAAiB;;QACjBC;eAAAA,+BAAmB;;QACnBC;eAAAA,2CAA+B;;QAC/BC;eAAAA,8BAAkB;;QAClBC;eAAAA,gCAAoB;;QACpBC;eAAAA,sCAA0B;;QAdnBC;eAAAA,6BAAgB;;QAyBhBC;eAAAA,uBAAS;;QAxBTC;eAAAA,yBAAc;;QAoBdC;eAAAA,mCAAmB;;QAKkCC;eAAAA,0CAAmB;;QAX/EC;eAAAA,8BAAkB;;QAOXC;eAAAA,eAAS;;QAFTC;eAAAA,2BAAe;;QAKQC;eAAAA,4BAAc;;;0BA1Bd;2BACC;yBACF;0BAgBxB;gCACuF;0BAE9D;8BACI;oBACV;4BAG4B;qCACmC;qBAC3E"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/index.ts"],"sourcesContent":["// Base types and type guards\n\nexport { type CallToolOptions, callToolCommand } from './commands/call-tool.ts';\nexport { type GetPromptOptions, getPromptCommand } from './commands/get-prompt.ts';\nexport { type InspectOptions, inspectCommand } from './commands/inspect.ts';\nexport {\n type Combination,\n type ConfigChoice,\n type ConfigurationMode,\n createConfigChoices,\n type Dimension,\n discoverServerJson,\n extractServerName,\n filterConfigChoices,\n generateConditionalCombinations,\n generateConfigFile,\n generateConfigObject,\n generateMatrixCombinations,\n shouldPromptEnvVar,\n TRANSPORT_MAP,\n} from './commands/manifest/generate.ts';\nexport { type CliArgMetadata, type EnvVarMetadata, MetadataReader, type MetadataReaderOptions, type PackageConfig, type ServerMetadata } from './commands/manifest/metadata-reader.ts';\n// Manifest commands\nexport { validateCommand } from './commands/manifest/validate.ts';\nexport { type ReadResourceOptions, readResourceCommand } from './commands/read-resource.ts';\nexport { type UpOptions, upCommand } from './commands/up.ts';\n\n// Library utilities\nexport { getSchema, SCHEMA_URL, validateSchema } from './lib/json-schema.ts';\nexport { type InlineConfigOptions, type ResolvedServerConfig, resolveServerConfig } from './lib/resolve-server-config.ts';\nexport * from './types.ts';\n"],"names":["MetadataReader","SCHEMA_URL","TRANSPORT_MAP","callToolCommand","createConfigChoices","discoverServerJson","extractServerName","filterConfigChoices","generateConditionalCombinations","generateConfigFile","generateConfigObject","generateMatrixCombinations","getPromptCommand","getSchema","inspectCommand","readResourceCommand","resolveServerConfig","shouldPromptEnvVar","upCommand","validateCommand","validateSchema"],"mappings":"AAAA,6BAA6B;;;;;;;;;;;;QAqBsBA;eAAAA,gCAAc;;QAO7CC;eAAAA,wBAAU;;QAT5BC;eAAAA,yBAAa;;QAjBgBC;eAAAA,2BAAe;;QAO5CC;eAAAA,+BAAmB;;QAEnBC;eAAAA,8BAAkB;;QAClBC;eAAAA,6BAAiB;;QACjBC;eAAAA,+BAAmB;;QACnBC;eAAAA,2CAA+B;;QAC/BC;eAAAA,8BAAkB;;QAClBC;eAAAA,gCAAoB;;QACpBC;eAAAA,sCAA0B;;QAdIC;eAAAA,6BAAgB;;QAyBvCC;eAAAA,uBAAS;;QAxBYC;eAAAA,yBAAc;;QAoBTC;eAAAA,mCAAmB;;QAKQC;eAAAA,0CAAmB;;QAX/EC;eAAAA,8BAAkB;;QAOKC;eAAAA,eAAS;;QAFzBC;eAAAA,2BAAe;;QAKQC;eAAAA,4BAAc;;;0BA1BQ;2BACE;yBACJ;0BAgB7C;gCACuI;0BAE9G;8BAC8B;oBACpB;4BAGY;qCACmC;qBAC3E"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/lib/find-config.ts"],"sourcesContent":["/**\n * find-config.ts\n *\n * Find .mcp.json config file by searching up the directory tree.\n * Searches from cwd up to home directory (like Claude Code).\n */\n\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as os from 'os';\nimport * as path from 'path';\n\nconst CONFIG_NAME = '.mcp.json';\n\n/**\n * Find .mcp.json by searching up directory tree from cwd to home directory.\n *\n * @param explicitPath - If provided, validates and returns this path (for --config flag)\n * @returns The resolved path to the config file\n * @throws Error if config file not found\n */\nexport function findConfigPath(explicitPath?: string): string {\n // If explicit path provided, validate it exists\n if (explicitPath) {\n const resolvedPath = path.resolve(explicitPath);\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Config file not found: ${resolvedPath}`);\n }\n return resolvedPath;\n }\n\n const cwd = process.cwd();\n const homeDir = os.homedir();\n\n // Use module-root-sync with custom file name to search up\n try {\n const configDir = moduleRoot(cwd, { name: CONFIG_NAME });\n const configPath = path.join(configDir, CONFIG_NAME);\n\n // Ensure we haven't gone above home directory\n if (!configPath.startsWith(homeDir)) {\n throw new Error(`Config file not found in directory tree (searched from ${cwd} to ${homeDir})`);\n }\n\n return configPath;\n } catch (_) {\n throw new Error(`Config file not found: ${CONFIG_NAME}\\n\\nSearched from ${cwd} up to ${homeDir}`);\n }\n}\n"],"names":["findConfigPath","CONFIG_NAME","explicitPath","resolvedPath","path","resolve","fs","existsSync","Error","cwd","process","homeDir","os","homedir","configDir","moduleRoot","name","configPath","join","startsWith","_"],"mappings":"AAAA;;;;;CAKC;;;;+BAgBeA;;;eAAAA;;;0DAdI;qEACG;0DACH;4DACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtB,IAAMC,cAAc;AASb,SAASD,eAAeE,YAAqB;IAClD,gDAAgD;IAChD,IAAIA,cAAc;QAChB,IAAMC,eAAeC,MAAKC,OAAO,CAACH;QAClC,IAAI,CAACI,IAAGC,UAAU,CAACJ,eAAe;YAChC,MAAM,IAAIK,MAAM,AAAC,0BAAsC,OAAbL;QAC5C;QACA,OAAOA;IACT;IAEA,IAAMM,MAAMC,QAAQD,GAAG;IACvB,IAAME,UAAUC,IAAGC,OAAO;IAE1B,0DAA0D;IAC1D,IAAI;QACF,IAAMC,YAAYC,IAAAA,uBAAU,EAACN,KAAK;YAAEO,MAAMf;QAAY;QACtD,IAAMgB,aAAab,MAAKc,IAAI,CAACJ,WAAWb;QAExC,8CAA8C;QAC9C,IAAI,CAACgB,WAAWE,UAAU,CAACR,UAAU;YACnC,MAAM,IAAIH,MAAM,AAAC,0DAAmEG,OAAVF,KAAI,QAAc,OAARE,SAAQ;QAC9F;QAEA,OAAOM;IACT,EAAE,OAAOG,GAAG;QACV,MAAM,IAAIZ,MAAM,AAAC,0BAAyDC,OAAhCR,aAAY,sBAAiCU,OAAbF,KAAI,WAAiB,OAARE;IACzF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/lib/find-config.ts"],"sourcesContent":["/**\n * find-config.ts\n *\n * Find .mcp.json config file by searching up the directory tree.\n * Searches from cwd up to home directory (like Claude Code).\n */\n\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as os from 'os';\nimport * as path from 'path';\n\nconst CONFIG_NAME = '.mcp.json';\n\n/**\n * Find .mcp.json by searching up directory tree from cwd to home directory.\n *\n * @param explicitPath - If provided, validates and returns this path (for --config flag)\n * @returns The resolved path to the config file\n * @throws Error if config file not found\n */\nexport function findConfigPath(explicitPath?: string): string {\n // If explicit path provided, validate it exists\n if (explicitPath) {\n const resolvedPath = path.resolve(explicitPath);\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Config file not found: ${resolvedPath}`);\n }\n return resolvedPath;\n }\n\n const cwd = process.cwd();\n const homeDir = os.homedir();\n\n // Use module-root-sync with custom file name to search up\n try {\n const configDir = moduleRoot(cwd, { name: CONFIG_NAME });\n const configPath = path.join(configDir, CONFIG_NAME);\n\n // Ensure we haven't gone above home directory\n if (!configPath.startsWith(homeDir)) {\n throw new Error(`Config file not found in directory tree (searched from ${cwd} to ${homeDir})`);\n }\n\n return configPath;\n } catch (_) {\n throw new Error(`Config file not found: ${CONFIG_NAME}\\n\\nSearched from ${cwd} up to ${homeDir}`);\n }\n}\n"],"names":["findConfigPath","CONFIG_NAME","explicitPath","resolvedPath","path","resolve","fs","existsSync","Error","cwd","process","homeDir","os","homedir","configDir","moduleRoot","name","configPath","join","startsWith","_"],"mappings":"AAAA;;;;;CAKC;;;;+BAgBeA;;;eAAAA;;;0DAdI;qEACG;0DACH;4DACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtB,IAAMC,cAAc;AASb,SAASD,eAAeE,YAAqB;IAClD,gDAAgD;IAChD,IAAIA,cAAc;QAChB,IAAMC,eAAeC,MAAKC,OAAO,CAACH;QAClC,IAAI,CAACI,IAAGC,UAAU,CAACJ,eAAe;YAChC,MAAM,IAAIK,MAAM,AAAC,0BAAsC,OAAbL;QAC5C;QACA,OAAOA;IACT;IAEA,IAAMM,MAAMC,QAAQD,GAAG;IACvB,IAAME,UAAUC,IAAGC,OAAO;IAE1B,0DAA0D;IAC1D,IAAI;QACF,IAAMC,YAAYC,IAAAA,uBAAU,EAACN,KAAK;YAAEO,MAAMf;QAAY;QACtD,IAAMgB,aAAab,MAAKc,IAAI,CAACJ,WAAWb;QAExC,8CAA8C;QAC9C,IAAI,CAACgB,WAAWE,UAAU,CAACR,UAAU;YACnC,MAAM,IAAIH,MAAM,AAAC,0DAAmEG,OAAVF,KAAI,QAAc,OAARE,SAAQ;QAC9F;QAEA,OAAOM;IACT,EAAE,OAAOG,GAAG;QACV,MAAM,IAAIZ,MAAM,AAAC,0BAAyDC,OAAhCR,aAAY,sBAAiCU,OAAbF,KAAI,WAAiB,OAARE;IACzF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/lib/json-schema.ts"],"sourcesContent":["import { Ajv, type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as path from 'path';\nimport * as url from 'url';\n\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\nconst packageRoot = moduleRoot(__dirname);\n\nexport const SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n\nlet schemaCache: object | null = null;\n\n/**\n * Get MCP server.json schema (fetches once, then caches)\n *\n * Strategy:\n * 1. Return cached schema if available\n * 2. Try fetching latest schema from URL\n * 3. Fall back to bundled schema if network fails\n */\nexport async function getSchema(): Promise<object> {\n // Return cached schema\n if (schemaCache) {\n return schemaCache;\n }\n\n try {\n // Try fetching latest schema\n const response = await fetch(SCHEMA_URL);\n if (response.ok) {\n schemaCache = (await response.json()) as object;\n return schemaCache;\n }\n } catch {\n // Network error - fall through to bundled version\n }\n\n // Fallback to bundled schema\n const schemaPath = path.join(packageRoot, './schemas/server.schema.json');\n if (!fs.existsSync(schemaPath)) {\n throw new Error('Failed to fetch MCP schema from URL and no bundled schema found. ' + 'Check network connection or report this as a bug.');\n }\n\n schemaCache = JSON.parse(fs.readFileSync(schemaPath, 'utf8')) as object;\n return schemaCache;\n}\n\n/**\n * Validate server.json against MCP schema\n *\n * @param serverJson - Parsed server.json content to validate\n * @param serverName - Server name for error messages\n * @throws Error with detailed validation messages if invalid\n */\nexport async function validateSchema(serverJson: unknown, serverName: string): Promise<void> {\n const schema = await getSchema();\n\n const ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strictSchema: false, // Allow non-standard keywords like \"example\", \"choices\"\n });\n\n // Add format validators (uri, email, etc.) to silence warnings\n addFormats(ajv);\n\n const validate = ajv.compile(schema);\n const valid = validate(serverJson);\n\n if (!valid) {\n const errors = validate.errors?.map((e: ErrorObject) => ` - ${e.instancePath || '(root)'} ${e.message}`).join('\\n') || 'Unknown validation error';\n\n throw new Error(`Invalid server.json for '${serverName}':\\n${errors}\\n\\nThe server.json file does not conform to the MCP specification.\\nSee: https://modelcontextprotocol.io/specification/server\\n\\nTo fix: Update the server.json file to match the schema requirements above.`);\n }\n}\n"],"names":["SCHEMA_URL","getSchema","validateSchema","__dirname","path","dirname","__filename","url","fileURLToPath","packageRoot","moduleRoot","schemaCache","response","schemaPath","fetch","ok","json","join","fs","existsSync","Error","JSON","parse","readFileSync","serverJson","serverName","schema","ajv","validate","valid","errors","Ajv","allErrors","verbose","strictSchema","addFormats","compile","map","e","instancePath","message"],"mappings":";;;;;;;;;;;QAUaA;eAAAA;;QAYSC;eAAAA;;QAkCAC;eAAAA;;;mBAxDgB;iEACf;0DACH;qEACG;4DACD;2DACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAErB,IAAMC,YAAYC,MAAKC,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaC,KAAIC,aAAa,CAAC;AAClG,IAAMC,cAAcC,IAAAA,uBAAU,EAACP;AAExB,IAAMH,aAAa;AAE1B,IAAIW,cAA6B;AAU1B,SAAeV;;YAQZW,kBAUFC;;;;oBAjBN,uBAAuB;oBACvB,IAAIF,aAAa;wBACf;;4BAAOA;;oBACT;;;;;;;;;oBAImB;;wBAAMG,MAAMd;;;oBAAvBY,WAAW;yBACbA,SAASG,EAAE,EAAXH;;;;oBACa;;wBAAMA,SAASI,IAAI;;;oBAAlCL,cAAe;oBACf;;wBAAOA;;;;;;;;;;;;;;oBAMX,6BAA6B;oBACvBE,aAAaT,MAAKa,IAAI,CAACR,aAAa;oBAC1C,IAAI,CAACS,IAAGC,UAAU,CAACN,aAAa;wBAC9B,MAAM,IAAIO,MAAM,sEAAsE;oBACxF;oBAEAT,cAAcU,KAAKC,KAAK,CAACJ,IAAGK,YAAY,CAACV,YAAY;oBACrD;;wBAAOF;;;;IACT;;AASO,SAAeT,eAAesB,UAAmB,EAAEC,UAAkB;;YACpEC,QAEAC,KASAC,UACAC,OAGWD,kBAATE;;;;oBAfO;;wBAAM7B;;;oBAAfyB,SAAS;oBAETC,MAAM,IAAII,QAAG,CAAC;wBAClBC,WAAW;wBACXC,SAAS;wBACTC,cAAc;oBAChB;oBAEA,+DAA+D;oBAC/DC,IAAAA,mBAAU,EAACR;oBAELC,WAAWD,IAAIS,OAAO,CAACV;oBACvBG,QAAQD,SAASJ;oBAEvB,IAAI,CAACK,OAAO;;wBACJC,SAASF,EAAAA,mBAAAA,SAASE,MAAM,cAAfF,uCAAAA,iBAAiBS,GAAG,CAAC,SAACC;mCAAmB,AAAC,OAAoCA,OAA9BA,EAAEC,YAAY,IAAI,UAAS,KAAa,OAAVD,EAAEE,OAAO;2BAAIvB,IAAI,CAAC,UAAS;wBAExH,MAAM,IAAIG,MAAM,AAAC,4BAA4CU,OAAjBL,YAAW,QAAa,OAAPK,QAAO;oBACtE;;;;;;IACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/lib/json-schema.ts"],"sourcesContent":["import { Ajv, type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport * as fs from 'fs';\nimport moduleRoot from 'module-root-sync';\nimport * as path from 'path';\nimport * as url from 'url';\n\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\nconst packageRoot = moduleRoot(__dirname);\n\nexport const SCHEMA_URL = 'https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json';\n\nlet schemaCache: object | null = null;\n\n/**\n * Get MCP server.json schema (fetches once, then caches)\n *\n * Strategy:\n * 1. Return cached schema if available\n * 2. Try fetching latest schema from URL\n * 3. Fall back to bundled schema if network fails\n */\nexport async function getSchema(): Promise<object> {\n // Return cached schema\n if (schemaCache) {\n return schemaCache;\n }\n\n try {\n // Try fetching latest schema\n const response = await fetch(SCHEMA_URL);\n if (response.ok) {\n schemaCache = (await response.json()) as object;\n return schemaCache;\n }\n } catch {\n // Network error - fall through to bundled version\n }\n\n // Fallback to bundled schema\n const schemaPath = path.join(packageRoot, './schemas/server.schema.json');\n if (!fs.existsSync(schemaPath)) {\n throw new Error('Failed to fetch MCP schema from URL and no bundled schema found. ' + 'Check network connection or report this as a bug.');\n }\n\n schemaCache = JSON.parse(fs.readFileSync(schemaPath, 'utf8')) as object;\n return schemaCache;\n}\n\n/**\n * Validate server.json against MCP schema\n *\n * @param serverJson - Parsed server.json content to validate\n * @param serverName - Server name for error messages\n * @throws Error with detailed validation messages if invalid\n */\nexport async function validateSchema(serverJson: unknown, serverName: string): Promise<void> {\n const schema = await getSchema();\n\n const ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strictSchema: false, // Allow non-standard keywords like \"example\", \"choices\"\n });\n\n // Add format validators (uri, email, etc.) to silence warnings\n addFormats(ajv);\n\n const validate = ajv.compile(schema);\n const valid = validate(serverJson);\n\n if (!valid) {\n const errors = validate.errors?.map((e: ErrorObject) => ` - ${e.instancePath || '(root)'} ${e.message}`).join('\\n') || 'Unknown validation error';\n\n throw new Error(`Invalid server.json for '${serverName}':\\n${errors}\\n\\nThe server.json file does not conform to the MCP specification.\\nSee: https://modelcontextprotocol.io/specification/server\\n\\nTo fix: Update the server.json file to match the schema requirements above.`);\n }\n}\n"],"names":["SCHEMA_URL","getSchema","validateSchema","__dirname","path","dirname","__filename","url","fileURLToPath","packageRoot","moduleRoot","schemaCache","response","schemaPath","fetch","ok","json","join","fs","existsSync","Error","JSON","parse","readFileSync","serverJson","serverName","schema","ajv","validate","valid","errors","Ajv","allErrors","verbose","strictSchema","addFormats","compile","map","e","instancePath","message"],"mappings":";;;;;;;;;;;QAUaA;eAAAA;;QAYSC;eAAAA;;QAkCAC;eAAAA;;;mBAxDgB;iEACf;0DACH;qEACG;4DACD;2DACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAErB,IAAMC,YAAYC,MAAKC,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaC,KAAIC,aAAa,CAAC;AAClG,IAAMC,cAAcC,IAAAA,uBAAU,EAACP;AAExB,IAAMH,aAAa;AAE1B,IAAIW,cAA6B;AAU1B,SAAeV;;YAQZW,kBAUFC;;;;oBAjBN,uBAAuB;oBACvB,IAAIF,aAAa;wBACf;;4BAAOA;;oBACT;;;;;;;;;oBAImB;;wBAAMG,MAAMd;;;oBAAvBY,WAAW;yBACbA,SAASG,EAAE,EAAXH;;;;oBACa;;wBAAMA,SAASI,IAAI;;;oBAAlCL,cAAe;oBACf;;wBAAOA;;;;;;;;;;;;;;oBAMX,6BAA6B;oBACvBE,aAAaT,MAAKa,IAAI,CAACR,aAAa;oBAC1C,IAAI,CAACS,IAAGC,UAAU,CAACN,aAAa;wBAC9B,MAAM,IAAIO,MAAM,sEAAsE;oBACxF;oBAEAT,cAAcU,KAAKC,KAAK,CAACJ,IAAGK,YAAY,CAACV,YAAY;oBACrD;;wBAAOF;;;;IACT;;AASO,SAAeT,eAAesB,UAAmB,EAAEC,UAAkB;;YACpEC,QAEAC,KASAC,UACAC,OAGWD,kBAATE;;;;oBAfO;;wBAAM7B;;;oBAAfyB,SAAS;oBAETC,MAAM,IAAII,QAAG,CAAC;wBAClBC,WAAW;wBACXC,SAAS;wBACTC,cAAc;oBAChB;oBAEA,+DAA+D;oBAC/DC,IAAAA,mBAAU,EAACR;oBAELC,WAAWD,IAAIS,OAAO,CAACV;oBACvBG,QAAQD,SAASJ;oBAEvB,IAAI,CAACK,OAAO;;wBACJC,SAASF,EAAAA,mBAAAA,SAASE,MAAM,cAAfF,uCAAAA,iBAAiBS,GAAG,CAAC,SAACC;mCAAmB,AAAC,OAAoCA,OAA9BA,EAAEC,YAAY,IAAI,UAAS,KAAa,OAAVD,EAAEE,OAAO;2BAAIvB,IAAI,CAAC,UAAS;wBAExH,MAAM,IAAIG,MAAM,AAAC,4BAA4CU,OAAjBL,YAAW,QAAa,OAAPK,QAAO;oBACtE;;;;;;IACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/lib/resolve-server-config.ts"],"sourcesContent":["/**\n * resolve-server-config.ts\n *\n * Shared config resolution for CLI commands.\n * Supports both config file-based and inline server configurations.\n */\n\nimport type { McpServerEntry, ServersConfig } from '@mcp-z/client';\nimport { validateServers } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ServerConfig } from '../types.ts';\nimport { findConfigPath } from './find-config.ts';\n\n/**\n * Options for inline server configuration.\n */\nexport interface InlineConfigOptions {\n /** Server name (optional when inline config provided) */\n server?: string;\n /** Config file path (mutually exclusive with inline options) */\n config?: string;\n /** Stdio run command string (e.g., \"npx -y @echo/server\") */\n run?: string;\n /** HTTP server URL */\n url?: string;\n /** Full server config as JSON string */\n serverConfig?: string;\n}\n\n/**\n * Resolved server configuration.\n */\nexport interface ResolvedServerConfig {\n /** Server name for display purposes */\n serverName: string;\n /** The server configuration object */\n serverConfig: ServerConfig;\n /** Working directory for the server (cwd for inline, config dir for file) */\n configDir: string;\n /** Full servers config (for HTTP auth flow that needs full config) */\n fullConfig: ServersConfig;\n}\n\n/**\n * Resolve server configuration from CLI options.\n *\n * Supports three modes:\n * 1. Config file: --config path + server positional\n * 2. Inline stdio: --run \"npx server\"\n * 3. Inline HTTP: --url \"https://...\"\n * 4. Full JSON: --server '{\"command\":\"npx\",...}'\n *\n * @param opts - CLI options for config resolution\n * @returns Resolved server configuration\n * @throws Error if configuration is invalid\n */\nexport function resolveServerConfig(opts: InlineConfigOptions): ResolvedServerConfig {\n // Validate mutual exclusivity of inline options\n const inlineOptions = [opts.run, opts.url, opts.serverConfig].filter(Boolean);\n if (inlineOptions.length > 1) {\n throw new Error('Cannot use multiple inline config options. Use only one of: --run, --url, or --server');\n }\n\n const hasInlineConfig = inlineOptions.length > 0;\n\n // Validate mutual exclusivity with config file\n if (hasInlineConfig && opts.config) {\n throw new Error('Cannot use --config with inline config options (--run, --url, --server)');\n }\n\n // Handle inline configuration\n if (hasInlineConfig) {\n return resolveInlineConfig(opts);\n }\n\n // Handle config file-based configuration\n return resolveFileConfig(opts);\n}\n\n/**\n * Resolve inline server configuration.\n */\nfunction resolveInlineConfig(opts: InlineConfigOptions): ResolvedServerConfig {\n const serverName = opts.server || 'inline';\n const configDir = process.cwd();\n let serverConfig: ServerConfig;\n\n if (opts.run) {\n // Parse run string into command + args (simple helper, no schema validation needed)\n serverConfig = parseRunString(opts.run);\n } else if (opts.url) {\n // Create HTTP server config (simple helper, no schema validation needed)\n serverConfig = {\n type: 'http',\n url: opts.url,\n };\n } else if (opts.serverConfig) {\n // Parse full JSON config with schema validation\n serverConfig = parseServerConfigJson(opts.serverConfig, serverName);\n } else {\n throw new Error('No inline config provided');\n }\n\n // Create a minimal servers config for the resolved server\n const fullConfig: ServersConfig = {\n [serverName]: serverConfig,\n };\n\n return {\n serverName,\n serverConfig,\n configDir,\n fullConfig,\n };\n}\n\n/**\n * Resolve config file-based server configuration.\n */\nfunction resolveFileConfig(opts: InlineConfigOptions): ResolvedServerConfig {\n if (!opts.server) {\n throw new Error('Server name is required when using config file');\n }\n\n const cfgPath = findConfigPath(opts.config);\n const raw = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));\n const servers: ServersConfig = raw.mcpServers ?? raw.servers ?? raw;\n\n const serverNames = Object.keys(servers || {});\n if (!serverNames.includes(opts.server)) {\n throw new Error(`Server '${opts.server}' not found in config\\n\\nAvailable servers: ${serverNames.join(', ')}`);\n }\n\n const serverConfig = servers[opts.server];\n if (!serverConfig) {\n throw new Error(`Server ${opts.server} not found in config`);\n }\n\n return {\n serverName: opts.server,\n serverConfig: serverConfig as ServerConfig,\n configDir: path.dirname(cfgPath),\n fullConfig: servers,\n };\n}\n\n/**\n * Parse a run string into a ServerConfigStdio.\n *\n * @example\n * parseRunString(\"npx -y @echo/server\")\n * // => { command: \"npx\", args: [\"-y\", \"@echo/server\"] }\n */\nfunction parseRunString(runStr: string): ServerConfig {\n const parts = runStr.trim().split(/\\s+/);\n if (parts.length === 0 || !parts[0]) {\n throw new Error('Run string cannot be empty');\n }\n\n return {\n command: parts[0],\n args: parts.slice(1),\n };\n}\n\n/**\n * Parse and validate a full server config JSON string against the MCP schema.\n *\n * @example\n * parseServerConfigJson('{\"command\":\"npx\",\"args\":[\"-y\",\"@echo/server\"]}')\n * parseServerConfigJson('{\"url\":\"https://example.com/mcp\",\"type\":\"http\"}')\n */\nfunction parseServerConfigJson(jsonStr: string, serverName: string): ServerConfig {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch (error) {\n throw new Error(`Failed to parse server config JSON: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Server config must be a JSON object');\n }\n\n const config = parsed as McpServerEntry;\n\n // Validate: must have either 'command' (stdio) or 'url' (http)\n if (!config.command && !config.url) {\n throw new Error('Server config must have either \"command\" (for stdio) or \"url\" (for http)');\n }\n\n // Normalize: if url is present without explicit type, set type to 'http'\n if (config.url && !config.type) {\n config.type = 'http';\n }\n\n // Validate against the MCP servers schema\n const serversMap = { [serverName]: config };\n const validation = validateServers(serversMap);\n if (!validation.valid) {\n const errorDetails = validation.errors?.join('\\n ') || 'Unknown validation error';\n throw new Error(`Invalid server config:\\n ${errorDetails}`);\n }\n\n // Return as ServerConfig (compatible with McpServerEntry)\n return config as ServerConfig;\n}\n"],"names":["resolveServerConfig","opts","inlineOptions","run","url","serverConfig","filter","Boolean","length","Error","hasInlineConfig","config","resolveInlineConfig","resolveFileConfig","serverName","server","configDir","process","cwd","parseRunString","type","parseServerConfigJson","fullConfig","raw","cfgPath","findConfigPath","JSON","parse","fs","readFileSync","servers","mcpServers","serverNames","Object","keys","includes","join","path","dirname","runStr","parts","trim","split","command","args","slice","jsonStr","parsed","error","message","String","serversMap","validation","validateServers","valid","errorDetails","errors"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/lib/resolve-server-config.ts"],"sourcesContent":["/**\n * resolve-server-config.ts\n *\n * Shared config resolution for CLI commands.\n * Supports both config file-based and inline server configurations.\n */\n\nimport type { McpServerEntry, ServersConfig } from '@mcp-z/client';\nimport { validateServers } from '@mcp-z/client';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ServerConfig } from '../types.ts';\nimport { findConfigPath } from './find-config.ts';\n\n/**\n * Options for inline server configuration.\n */\nexport interface InlineConfigOptions {\n /** Server name (optional when inline config provided) */\n server?: string;\n /** Config file path (mutually exclusive with inline options) */\n config?: string;\n /** Stdio run command string (e.g., \"npx -y @echo/server\") */\n run?: string;\n /** HTTP server URL */\n url?: string;\n /** Full server config as JSON string */\n serverConfig?: string;\n}\n\n/**\n * Resolved server configuration.\n */\nexport interface ResolvedServerConfig {\n /** Server name for display purposes */\n serverName: string;\n /** The server configuration object */\n serverConfig: ServerConfig;\n /** Working directory for the server (cwd for inline, config dir for file) */\n configDir: string;\n /** Full servers config (for HTTP auth flow that needs full config) */\n fullConfig: ServersConfig;\n}\n\n/**\n * Resolve server configuration from CLI options.\n *\n * Supports three modes:\n * 1. Config file: --config path + server positional\n * 2. Inline stdio: --run \"npx server\"\n * 3. Inline HTTP: --url \"https://...\"\n * 4. Full JSON: --server '{\"command\":\"npx\",...}'\n *\n * @param opts - CLI options for config resolution\n * @returns Resolved server configuration\n * @throws Error if configuration is invalid\n */\nexport function resolveServerConfig(opts: InlineConfigOptions): ResolvedServerConfig {\n // Validate mutual exclusivity of inline options\n const inlineOptions = [opts.run, opts.url, opts.serverConfig].filter(Boolean);\n if (inlineOptions.length > 1) {\n throw new Error('Cannot use multiple inline config options. Use only one of: --run, --url, or --server');\n }\n\n const hasInlineConfig = inlineOptions.length > 0;\n\n // Validate mutual exclusivity with config file\n if (hasInlineConfig && opts.config) {\n throw new Error('Cannot use --config with inline config options (--run, --url, --server)');\n }\n\n // Handle inline configuration\n if (hasInlineConfig) {\n return resolveInlineConfig(opts);\n }\n\n // Handle config file-based configuration\n return resolveFileConfig(opts);\n}\n\n/**\n * Resolve inline server configuration.\n */\nfunction resolveInlineConfig(opts: InlineConfigOptions): ResolvedServerConfig {\n const serverName = opts.server || 'inline';\n const configDir = process.cwd();\n let serverConfig: ServerConfig;\n\n if (opts.run) {\n // Parse run string into command + args (simple helper, no schema validation needed)\n serverConfig = parseRunString(opts.run);\n } else if (opts.url) {\n // Create HTTP server config (simple helper, no schema validation needed)\n serverConfig = {\n type: 'http',\n url: opts.url,\n };\n } else if (opts.serverConfig) {\n // Parse full JSON config with schema validation\n serverConfig = parseServerConfigJson(opts.serverConfig, serverName);\n } else {\n throw new Error('No inline config provided');\n }\n\n // Create a minimal servers config for the resolved server\n const fullConfig: ServersConfig = {\n [serverName]: serverConfig,\n };\n\n return {\n serverName,\n serverConfig,\n configDir,\n fullConfig,\n };\n}\n\n/**\n * Resolve config file-based server configuration.\n */\nfunction resolveFileConfig(opts: InlineConfigOptions): ResolvedServerConfig {\n if (!opts.server) {\n throw new Error('Server name is required when using config file');\n }\n\n const cfgPath = findConfigPath(opts.config);\n const raw = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));\n const servers: ServersConfig = raw.mcpServers ?? raw.servers ?? raw;\n\n const serverNames = Object.keys(servers || {});\n if (!serverNames.includes(opts.server)) {\n throw new Error(`Server '${opts.server}' not found in config\\n\\nAvailable servers: ${serverNames.join(', ')}`);\n }\n\n const serverConfig = servers[opts.server];\n if (!serverConfig) {\n throw new Error(`Server ${opts.server} not found in config`);\n }\n\n return {\n serverName: opts.server,\n serverConfig: serverConfig as ServerConfig,\n configDir: path.dirname(cfgPath),\n fullConfig: servers,\n };\n}\n\n/**\n * Parse a run string into a ServerConfigStdio.\n *\n * @example\n * parseRunString(\"npx -y @echo/server\")\n * // => { command: \"npx\", args: [\"-y\", \"@echo/server\"] }\n */\nfunction parseRunString(runStr: string): ServerConfig {\n const parts = runStr.trim().split(/\\s+/);\n if (parts.length === 0 || !parts[0]) {\n throw new Error('Run string cannot be empty');\n }\n\n return {\n command: parts[0],\n args: parts.slice(1),\n };\n}\n\n/**\n * Parse and validate a full server config JSON string against the MCP schema.\n *\n * @example\n * parseServerConfigJson('{\"command\":\"npx\",\"args\":[\"-y\",\"@echo/server\"]}')\n * parseServerConfigJson('{\"url\":\"https://example.com/mcp\",\"type\":\"http\"}')\n */\nfunction parseServerConfigJson(jsonStr: string, serverName: string): ServerConfig {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch (error) {\n throw new Error(`Failed to parse server config JSON: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Server config must be a JSON object');\n }\n\n const config = parsed as McpServerEntry;\n\n // Validate: must have either 'command' (stdio) or 'url' (http)\n if (!config.command && !config.url) {\n throw new Error('Server config must have either \"command\" (for stdio) or \"url\" (for http)');\n }\n\n // Normalize: if url is present without explicit type, set type to 'http'\n if (config.url && !config.type) {\n config.type = 'http';\n }\n\n // Validate against the MCP servers schema\n const serversMap = { [serverName]: config };\n const validation = validateServers(serversMap);\n if (!validation.valid) {\n const errorDetails = validation.errors?.join('\\n ') || 'Unknown validation error';\n throw new Error(`Invalid server config:\\n ${errorDetails}`);\n }\n\n // Return as ServerConfig (compatible with McpServerEntry)\n return config as ServerConfig;\n}\n"],"names":["resolveServerConfig","opts","inlineOptions","run","url","serverConfig","filter","Boolean","length","Error","hasInlineConfig","config","resolveInlineConfig","resolveFileConfig","serverName","server","configDir","process","cwd","parseRunString","type","parseServerConfigJson","fullConfig","raw","cfgPath","findConfigPath","JSON","parse","fs","readFileSync","servers","mcpServers","serverNames","Object","keys","includes","join","path","dirname","runStr","parts","trim","split","command","args","slice","jsonStr","parsed","error","message","String","serversMap","validation","validateServers","valid","errorDetails","errors"],"mappings":"AAAA;;;;;CAKC;;;;+BAoDeA;;;eAAAA;;;sBAjDgB;0DACZ;4DACE;4BAES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CxB,SAASA,oBAAoBC,IAAyB;IAC3D,gDAAgD;IAChD,IAAMC,gBAAgB;QAACD,KAAKE,GAAG;QAAEF,KAAKG,GAAG;QAAEH,KAAKI,YAAY;KAAC,CAACC,MAAM,CAACC;IACrE,IAAIL,cAAcM,MAAM,GAAG,GAAG;QAC5B,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAMC,kBAAkBR,cAAcM,MAAM,GAAG;IAE/C,+CAA+C;IAC/C,IAAIE,mBAAmBT,KAAKU,MAAM,EAAE;QAClC,MAAM,IAAIF,MAAM;IAClB;IAEA,8BAA8B;IAC9B,IAAIC,iBAAiB;QACnB,OAAOE,oBAAoBX;IAC7B;IAEA,yCAAyC;IACzC,OAAOY,kBAAkBZ;AAC3B;AAEA;;CAEC,GACD,SAASW,oBAAoBX,IAAyB;IACpD,IAAMa,aAAab,KAAKc,MAAM,IAAI;IAClC,IAAMC,YAAYC,QAAQC,GAAG;IAC7B,IAAIb;IAEJ,IAAIJ,KAAKE,GAAG,EAAE;QACZ,oFAAoF;QACpFE,eAAec,eAAelB,KAAKE,GAAG;IACxC,OAAO,IAAIF,KAAKG,GAAG,EAAE;QACnB,yEAAyE;QACzEC,eAAe;YACbe,MAAM;YACNhB,KAAKH,KAAKG,GAAG;QACf;IACF,OAAO,IAAIH,KAAKI,YAAY,EAAE;QAC5B,gDAAgD;QAChDA,eAAegB,sBAAsBpB,KAAKI,YAAY,EAAES;IAC1D,OAAO;QACL,MAAM,IAAIL,MAAM;IAClB;IAEA,0DAA0D;IAC1D,IAAMa,aACJ,qBAACR,YAAaT;IAGhB,OAAO;QACLS,YAAAA;QACAT,cAAAA;QACAW,WAAAA;QACAM,YAAAA;IACF;AACF;AAEA;;CAEC,GACD,SAAST,kBAAkBZ,IAAyB;QAOnBsB,MAAAA;IAN/B,IAAI,CAACtB,KAAKc,MAAM,EAAE;QAChB,MAAM,IAAIN,MAAM;IAClB;IAEA,IAAMe,UAAUC,IAAAA,4BAAc,EAACxB,KAAKU,MAAM;IAC1C,IAAMY,MAAMG,KAAKC,KAAK,CAACC,IAAGC,YAAY,CAACL,SAAS;IAChD,IAAMM,WAAyBP,QAAAA,kBAAAA,IAAIQ,UAAU,cAAdR,6BAAAA,kBAAkBA,IAAIO,OAAO,cAA7BP,kBAAAA,OAAiCA;IAEhE,IAAMS,cAAcC,OAAOC,IAAI,CAACJ,WAAW,CAAC;IAC5C,IAAI,CAACE,YAAYG,QAAQ,CAAClC,KAAKc,MAAM,GAAG;QACtC,MAAM,IAAIN,MAAM,AAAC,WAAoEuB,OAA1D/B,KAAKc,MAAM,EAAC,gDAAqE,OAAvBiB,YAAYI,IAAI,CAAC;IACxG;IAEA,IAAM/B,eAAeyB,OAAO,CAAC7B,KAAKc,MAAM,CAAC;IACzC,IAAI,CAACV,cAAc;QACjB,MAAM,IAAII,MAAM,AAAC,UAAqB,OAAZR,KAAKc,MAAM,EAAC;IACxC;IAEA,OAAO;QACLD,YAAYb,KAAKc,MAAM;QACvBV,cAAcA;QACdW,WAAWqB,MAAKC,OAAO,CAACd;QACxBF,YAAYQ;IACd;AACF;AAEA;;;;;;CAMC,GACD,SAASX,eAAeoB,MAAc;IACpC,IAAMC,QAAQD,OAAOE,IAAI,GAAGC,KAAK,CAAC;IAClC,IAAIF,MAAMhC,MAAM,KAAK,KAAK,CAACgC,KAAK,CAAC,EAAE,EAAE;QACnC,MAAM,IAAI/B,MAAM;IAClB;IAEA,OAAO;QACLkC,SAASH,KAAK,CAAC,EAAE;QACjBI,MAAMJ,MAAMK,KAAK,CAAC;IACpB;AACF;AAEA;;;;;;CAMC,GACD,SAASxB,sBAAsByB,OAAe,EAAEhC,UAAkB;IAChE,IAAIiC;IACJ,IAAI;QACFA,SAASrB,KAAKC,KAAK,CAACmB;IACtB,EAAE,OAAOE,OAAO;QACd,MAAM,IAAIvC,MAAM,AAAC,uCAA6F,OAAvDuC,AAAK,YAALA,OAAiBvC,SAAQuC,MAAMC,OAAO,GAAGC,OAAOF;IACzG;IAEA,IAAI,CAAA,OAAOD,uCAAP,SAAOA,OAAK,MAAM,YAAYA,WAAW,MAAM;QACjD,MAAM,IAAItC,MAAM;IAClB;IAEA,IAAME,SAASoC;IAEf,+DAA+D;IAC/D,IAAI,CAACpC,OAAOgC,OAAO,IAAI,CAAChC,OAAOP,GAAG,EAAE;QAClC,MAAM,IAAIK,MAAM;IAClB;IAEA,yEAAyE;IACzE,IAAIE,OAAOP,GAAG,IAAI,CAACO,OAAOS,IAAI,EAAE;QAC9BT,OAAOS,IAAI,GAAG;IAChB;IAEA,0CAA0C;IAC1C,IAAM+B,aAAe,qBAACrC,YAAaH;IACnC,IAAMyC,aAAaC,IAAAA,uBAAe,EAACF;IACnC,IAAI,CAACC,WAAWE,KAAK,EAAE;YACAF;QAArB,IAAMG,eAAeH,EAAAA,qBAAAA,WAAWI,MAAM,cAAjBJ,yCAAAA,mBAAmBhB,IAAI,CAAC,YAAW;QACxD,MAAM,IAAI3B,MAAM,AAAC,6BAAyC,OAAb8C;IAC/C;IAEA,0DAA0D;IAC1D,OAAO5C;AACT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/cli/src/types.ts"],"sourcesContent":["// Type definitions for MCP config files\n\nexport interface MCPConfiguration {\n mcpServers: Record<string, ServerConfig>;\n}\n\n// Stdio server: spawns with stdio transport\nexport interface ServerConfigStdio {\n type?: 'stdio'; // Optional: absence means stdio\n command: string;\n args?: string[]; // OPTIONAL per .mcp.json standard\n env?: Record<string, string>;\n}\n\n// HTTP server: connects to URL, optionally spawns the server locally\nexport interface ServerConfigHttp {\n type: 'http';\n url: string;\n headers?: Record<string, string>;\n start?: ServerConfigStdio; // Extension: reuse stdio config for spawning HTTP servers\n}\n\nexport type ServerConfig = ServerConfigStdio | ServerConfigHttp;\n\n// Type guards\nexport function isHttpServer(config: ServerConfig): config is ServerConfigHttp {\n return config.type === 'http';\n}\n\nexport function isStdioServer(config: ServerConfig): config is ServerConfigStdio {\n return !isHttpServer(config);\n}\n\nexport function hasStartBlock(config: ServerConfig): config is ServerConfigHttp & { start: ServerConfigStdio } {\n return isHttpServer(config) && config.start !== undefined;\n}\n"],"names":["hasStartBlock","isHttpServer","isStdioServer","config","type","start","undefined"],"mappings":"AAAA,wCAAwC;;;;;;;;;;;;QAiCxBA;eAAAA;;QARAC;eAAAA;;QAIAC;eAAAA;;;AAJT,SAASD,aAAaE,MAAoB;IAC/C,OAAOA,OAAOC,IAAI,KAAK;AACzB;AAEO,SAASF,cAAcC,MAAoB;IAChD,OAAO,CAACF,aAAaE;AACvB;AAEO,SAASH,cAAcG,MAAoB;IAChD,OAAOF,aAAaE,WAAWA,OAAOE,KAAK,KAAKC;AAClD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/cli/src/types.ts"],"sourcesContent":["// Type definitions for MCP config files\n\nexport interface MCPConfiguration {\n mcpServers: Record<string, ServerConfig>;\n}\n\n// Stdio server: spawns with stdio transport\nexport interface ServerConfigStdio {\n type?: 'stdio'; // Optional: absence means stdio\n command: string;\n args?: string[]; // OPTIONAL per .mcp.json standard\n env?: Record<string, string>;\n}\n\n// HTTP server: connects to URL, optionally spawns the server locally\nexport interface ServerConfigHttp {\n type: 'http';\n url: string;\n headers?: Record<string, string>;\n start?: ServerConfigStdio; // Extension: reuse stdio config for spawning HTTP servers\n}\n\nexport type ServerConfig = ServerConfigStdio | ServerConfigHttp;\n\n// Type guards\nexport function isHttpServer(config: ServerConfig): config is ServerConfigHttp {\n return config.type === 'http';\n}\n\nexport function isStdioServer(config: ServerConfig): config is ServerConfigStdio {\n return !isHttpServer(config);\n}\n\nexport function hasStartBlock(config: ServerConfig): config is ServerConfigHttp & { start: ServerConfigStdio } {\n return isHttpServer(config) && config.start !== undefined;\n}\n"],"names":["hasStartBlock","isHttpServer","isStdioServer","config","type","start","undefined"],"mappings":"AAAA,wCAAwC;;;;;;;;;;;;QAiCxBA;eAAAA;;QARAC;eAAAA;;QAIAC;eAAAA;;;AAJT,SAASD,aAAaE,MAAoB;IAC/C,OAAOA,OAAOC,IAAI,KAAK;AACzB;AAEO,SAASF,cAAcC,MAAoB;IAChD,OAAO,CAACF,aAAaE;AACvB;AAEO,SAASH,cAAcG,MAAoB;IAChD,OAAOF,aAAaE,WAAWA,OAAOE,KAAK,KAAKC;AAClD"}
@@ -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":["Command","fs","moduleRoot","path","url","callToolCommand","getPromptCommand","inspectCommand","createManifestCommand","readResourceCommand","searchCommand","upCommand","pkg","JSON","parse","readFileSync","join","fileURLToPath","cli","argv","programName","program","name","description","version","command","option","action","options","clusterResult","config","stdioOnly","httpOnly","servers","size","process","exit","shutdown","sig","console","log","close","timeoutMs","_","on","catch","Promise","error","Error","message","String","tools","resources","prompts","health","json","verbose","attach","server","tool","args","opts","run","serverConfig","uri","Number","parseInt","parseFloat","query","addCommand","startsWith","modulePath","replace","slice"],"mappings":"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"}
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":["Command","fs","moduleRoot","path","url","callToolCommand","getPromptCommand","inspectCommand","createManifestCommand","readResourceCommand","searchCommand","upCommand","pkg","JSON","parse","readFileSync","join","fileURLToPath","cli","argv","programName","program","name","description","version","command","option","action","options","clusterResult","config","stdioOnly","httpOnly","servers","size","process","exit","shutdown","sig","console","log","close","timeoutMs","_","on","catch","Promise","error","Error","message","String","tools","resources","prompts","health","json","verbose","attach","server","tool","args","opts","run","serverConfig","uri","Number","parseInt","parseFloat","query","addCommand","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":["createServerRegistry","ToolResponseError","resolveServerConfig","isHttpServer","callToolCommand","opts","registry","client","serverName","serverConfig","configDir","start","Date","now","json","console","log","command","Error","cwd","connect","elapsed","toFixed","toolArgs","parsed","JSON","parse","args","error","message","String","tool","response","callTool","handleToolError","parsedResult","parseToolResult","undefined","stringify","close","_","errorText","extractToolErrorText","content","Array","isArray","first","type","text","isError"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,oBAAoB,EAA+DC,iBAAiB,QAAkC,gBAAgB;AAC/J,SAAmCC,mBAAmB,QAAQ,kCAAkC;AAChG,SAASC,YAAY,QAAQ,cAAc;AAQ3C;;;;;;;;;;;;CAYC,GACD,OAAO,eAAeC,gBAAgBC,IAAqB;IACzD,IAAIC;IACJ,IAAIC;IAEJ,IAAI;QACF,uEAAuE;QACvE,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAEC,SAAS,EAAE,GAAGR,oBAAoBG;QAEpE,iCAAiC;QACjC,MAAMM,QAAQC,KAAKC,GAAG;QAEtB,IAAIV,aAAaM,eAAe;YAC9B,mCAAmC;YACnC,IAAI,CAACJ,KAAKS,IAAI,EAAE;gBACdC,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAER,WAAW,GAAG,CAAC;YACjD;QACF,OAAO;YACL,iCAAiC;YACjC,IAAI,CAACH,KAAKS,IAAI,EAAE;gBACdC,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAER,WAAW,UAAU,CAAC;YACnD;YAEA,IAAI,CAACC,aAAaQ,OAAO,EAAE;gBACzB,MAAM,IAAIC,MAAM,CAAC,aAAa,EAAEV,WAAW,iCAAiC,CAAC;YAC/E;QACF;QAEA,iEAAiE;QACjEF,WAAWN,qBAAqB;YAAE,CAACQ,WAAW,EAAEC;QAAa,GAAG;YAAEU,KAAKT;QAAU;QACjFH,SAAS,MAAMD,SAASc,OAAO,CAACZ;QAEhC,IAAI,CAACL,aAAaM,iBAAiB,CAACJ,KAAKS,IAAI,EAAE;YAC7C,MAAMO,UAAU,AAAC,CAAA,AAACT,CAAAA,KAAKC,GAAG,KAAKF,KAAI,IAAK,IAAG,EAAGW,OAAO,CAAC;YACtDP,QAAQC,GAAG,CAAC,CAAC,kBAAkB,EAAEK,QAAQ,GAAG,CAAC;QAC/C;QAEA,0BAA0B;QAC1B,IAAIE;QACJ,IAAI;YACF,MAAMC,SAASC,KAAKC,KAAK,CAACrB,KAAKsB,IAAI;YACnC,IAAI,OAAOH,WAAW,YAAYA,WAAW,MAAM;gBACjD,MAAM,IAAIN,MAAM;YAClB;YACAK,WAAWC;QACb,EAAE,OAAOI,OAAO;YACd,MAAM,IAAIV,MAAM,CAAC,wCAAwC,EAAEU,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF,OAAO,mBAAmB,EAAEvB,KAAKsB,IAAI,EAAE;QACpJ;QAEA,kBAAkB;QAClB,IAAI,CAACtB,KAAKS,IAAI,EAAE;YACdC,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEX,KAAK0B,IAAI,CAAC,GAAG,CAAC;QAC1C;QAEA,IAAIC;QACJ,IAAI;YACFA,WAAW,MAAMzB,OAAO0B,QAAQ,CAAC5B,KAAK0B,IAAI,EAAER;QAC9C,EAAE,OAAOK,OAAO;YACdM,gBAAgBN,OAAOvB;YACvB,MAAMuB;QACR;QAEA,MAAMO,eAAeC,gBAAgBJ;QAErC,IAAIG,iBAAiBE,WAAW;YAC9B,eAAe;YACf,IAAIhC,KAAKS,IAAI,EAAE;gBACb,mBAAmB;gBACnBC,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAACH,cAAc,MAAM;YACjD,OAAO;gBACL,wBAAwB;gBACxBpB,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAEX,KAAK0B,IAAI,CAAC,YAAY,CAAC;gBACxChB,QAAQC,GAAG,CAAC;gBACZ,IAAI,OAAOmB,iBAAiB,UAAU;oBACpCpB,QAAQC,GAAG,CAACmB;gBACd,OAAO;oBACLpB,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAACH,cAAc,MAAM;gBACjD;YACF;QACF;IACF,EAAE,OAAOP,OAAO;QACd,IAAIvB,KAAKS,IAAI,EAAE;YACbC,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAAC;gBAAEV,OAAOA,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF;YAAO,GAAG,MAAM;QACtG,OAAO;YACLb,QAAQa,KAAK,CAAC,CAAC,IAAI,EAAEA,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF,QAAQ;QAC/E;QACA,MAAMA;IACR,SAAU;QACR,qEAAqE;QACrE,IAAItB,UAAU;YACZ,IAAI;gBACF,MAAMA,SAASiC,KAAK;YACtB,EAAE,OAAOC,GAAG;YACV,sBAAsB;YACxB;QACF;IACF;AACF;AAEA,SAASN,gBAAgBN,KAAc,EAAEvB,IAAqB;IAC5D,IAAI,CAAEuB,CAAAA,iBAAiB3B,iBAAgB,GAAI;QACzC;IACF;IAEA,MAAMwC,YAAYC,qBAAqBd,UAAUA,MAAMC,OAAO;IAE9D,IAAIxB,KAAKS,IAAI,EAAE;QACbC,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAAC;YAAEV,OAAOa;QAAU,GAAG,MAAM;IACzD,OAAO;QACL1B,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAEX,KAAK0B,IAAI,CAAC,SAAS,CAAC;QACrChB,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAEyB,WAAW;IACnC;AACF;AAEA,SAASC,qBAAqBd,KAAwB;IACpD,MAAMe,UAAUC,MAAMC,OAAO,CAACjB,MAAMI,QAAQ,CAACW,OAAO,IAAIf,MAAMI,QAAQ,CAACW,OAAO,GAAG,EAAE;IACnF,MAAMG,QAAQH,OAAO,CAAC,EAAE;IACxB,IAAIG,CAAAA,kBAAAA,4BAAAA,MAAOC,IAAI,MAAK,UAAU,OAAOD,MAAME,IAAI,KAAK,UAAU;QAC5D,OAAOF,MAAME,IAAI;IACnB;IACA,OAAOX;AACT;AAEA,SAASD,gBAAgBJ,QAA6B;IACpD,IAAI;QACF,OAAOA,SAASlB,IAAI;IACtB,EAAE,OAAOc,OAAO;QACd,IAAIA,iBAAiB3B,mBAAmB;YACtC,IAAI,aAAa2B,MAAMI,QAAQ,IAAIJ,MAAMI,QAAQ,CAACiB,OAAO,EAAE;gBACzD,MAAMrB;YACR;YACA,IAAI;gBACF,OAAOI,SAASgB,IAAI;YACtB,EAAE,OAAM;gBACN,OAAOX;YACT;QACF;QACA,MAAMT;IACR;AACF"}
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":["createServerRegistry","ToolResponseError","resolveServerConfig","isHttpServer","callToolCommand","opts","registry","client","serverName","serverConfig","configDir","start","Date","now","json","console","log","command","Error","cwd","connect","elapsed","toFixed","toolArgs","parsed","JSON","parse","args","error","message","String","tool","response","callTool","handleToolError","parsedResult","parseToolResult","undefined","stringify","close","_","errorText","extractToolErrorText","content","Array","isArray","first","type","text","isError"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,oBAAoB,EAA+DC,iBAAiB,QAAkC,gBAAgB;AAC/J,SAAmCC,mBAAmB,QAAQ,kCAAkC;AAChG,SAASC,YAAY,QAAQ,cAAc;AAQ3C;;;;;;;;;;;;CAYC,GACD,OAAO,eAAeC,gBAAgBC,IAAqB;IACzD,IAAIC;IACJ,IAAIC;IAEJ,IAAI;QACF,uEAAuE;QACvE,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAEC,SAAS,EAAE,GAAGR,oBAAoBG;QAEpE,iCAAiC;QACjC,MAAMM,QAAQC,KAAKC,GAAG;QAEtB,IAAIV,aAAaM,eAAe;YAC9B,mCAAmC;YACnC,IAAI,CAACJ,KAAKS,IAAI,EAAE;gBACdC,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAER,WAAW,GAAG,CAAC;YACjD;QACF,OAAO;YACL,iCAAiC;YACjC,IAAI,CAACH,KAAKS,IAAI,EAAE;gBACdC,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAER,WAAW,UAAU,CAAC;YACnD;YAEA,IAAI,CAACC,aAAaQ,OAAO,EAAE;gBACzB,MAAM,IAAIC,MAAM,CAAC,aAAa,EAAEV,WAAW,iCAAiC,CAAC;YAC/E;QACF;QAEA,iEAAiE;QACjEF,WAAWN,qBAAqB;YAAE,CAACQ,WAAW,EAAEC;QAAa,GAAG;YAAEU,KAAKT;QAAU;QACjFH,SAAS,MAAMD,SAASc,OAAO,CAACZ;QAEhC,IAAI,CAACL,aAAaM,iBAAiB,CAACJ,KAAKS,IAAI,EAAE;YAC7C,MAAMO,UAAU,AAAC,CAAA,AAACT,CAAAA,KAAKC,GAAG,KAAKF,KAAI,IAAK,IAAG,EAAGW,OAAO,CAAC;YACtDP,QAAQC,GAAG,CAAC,CAAC,kBAAkB,EAAEK,QAAQ,GAAG,CAAC;QAC/C;QAEA,0BAA0B;QAC1B,IAAIE;QACJ,IAAI;YACF,MAAMC,SAASC,KAAKC,KAAK,CAACrB,KAAKsB,IAAI;YACnC,IAAI,OAAOH,WAAW,YAAYA,WAAW,MAAM;gBACjD,MAAM,IAAIN,MAAM;YAClB;YACAK,WAAWC;QACb,EAAE,OAAOI,OAAO;YACd,MAAM,IAAIV,MAAM,CAAC,wCAAwC,EAAEU,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF,OAAO,mBAAmB,EAAEvB,KAAKsB,IAAI,EAAE;QACpJ;QAEA,kBAAkB;QAClB,IAAI,CAACtB,KAAKS,IAAI,EAAE;YACdC,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEX,KAAK0B,IAAI,CAAC,GAAG,CAAC;QAC1C;QAEA,IAAIC;QACJ,IAAI;YACFA,WAAW,MAAMzB,OAAO0B,QAAQ,CAAC5B,KAAK0B,IAAI,EAAER;QAC9C,EAAE,OAAOK,OAAO;YACdM,gBAAgBN,OAAOvB;YACvB,MAAMuB;QACR;QAEA,MAAMO,eAAeC,gBAAgBJ;QAErC,IAAIG,iBAAiBE,WAAW;YAC9B,eAAe;YACf,IAAIhC,KAAKS,IAAI,EAAE;gBACb,mBAAmB;gBACnBC,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAACH,cAAc,MAAM;YACjD,OAAO;gBACL,wBAAwB;gBACxBpB,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAEX,KAAK0B,IAAI,CAAC,YAAY,CAAC;gBACxChB,QAAQC,GAAG,CAAC;gBACZ,IAAI,OAAOmB,iBAAiB,UAAU;oBACpCpB,QAAQC,GAAG,CAACmB;gBACd,OAAO;oBACLpB,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAACH,cAAc,MAAM;gBACjD;YACF;QACF;IACF,EAAE,OAAOP,OAAO;QACd,IAAIvB,KAAKS,IAAI,EAAE;YACbC,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAAC;gBAAEV,OAAOA,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF;YAAO,GAAG,MAAM;QACtG,OAAO;YACLb,QAAQa,KAAK,CAAC,CAAC,IAAI,EAAEA,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF,QAAQ;QAC/E;QACA,MAAMA;IACR,SAAU;QACR,qEAAqE;QACrE,IAAItB,UAAU;YACZ,IAAI;gBACF,MAAMA,SAASiC,KAAK;YACtB,EAAE,OAAOC,GAAG;YACV,sBAAsB;YACxB;QACF;IACF;AACF;AAEA,SAASN,gBAAgBN,KAAc,EAAEvB,IAAqB;IAC5D,IAAI,CAAEuB,CAAAA,iBAAiB3B,iBAAgB,GAAI;QACzC;IACF;IAEA,MAAMwC,YAAYC,qBAAqBd,UAAUA,MAAMC,OAAO;IAE9D,IAAIxB,KAAKS,IAAI,EAAE;QACbC,QAAQC,GAAG,CAACS,KAAKa,SAAS,CAAC;YAAEV,OAAOa;QAAU,GAAG,MAAM;IACzD,OAAO;QACL1B,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAEX,KAAK0B,IAAI,CAAC,SAAS,CAAC;QACrChB,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAEyB,WAAW;IACnC;AACF;AAEA,SAASC,qBAAqBd,KAAwB;IACpD,MAAMe,UAAUC,MAAMC,OAAO,CAACjB,MAAMI,QAAQ,CAACW,OAAO,IAAIf,MAAMI,QAAQ,CAACW,OAAO,GAAG,EAAE;IACnF,MAAMG,QAAQH,OAAO,CAAC,EAAE;IACxB,IAAIG,CAAAA,kBAAAA,4BAAAA,MAAOC,IAAI,MAAK,UAAU,OAAOD,MAAME,IAAI,KAAK,UAAU;QAC5D,OAAOF,MAAME,IAAI;IACnB;IACA,OAAOX;AACT;AAEA,SAASD,gBAAgBJ,QAA6B;IACpD,IAAI;QACF,OAAOA,SAASlB,IAAI;IACtB,EAAE,OAAOc,OAAO;QACd,IAAIA,iBAAiB3B,mBAAmB;YACtC,IAAI,aAAa2B,MAAMI,QAAQ,IAAIJ,MAAMI,QAAQ,CAACiB,OAAO,EAAE;gBACzD,MAAMrB;YACR;YACA,IAAI;gBACF,OAAOI,SAASgB,IAAI;YACtB,EAAE,OAAM;gBACN,OAAOX;YACT;QACF;QACA,MAAMT;IACR;AACF"}
@@ -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":["createServerRegistry","resolveServerConfig","isHttpServer","getPromptCommand","opts","registry","client","serverName","serverConfig","configDir","start","Date","now","json","console","log","command","Error","cwd","connect","elapsed","toFixed","promptArgs","args","parsed","JSON","parse","error","message","String","name","promptResponse","getPrompt","prompt","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":["createServerRegistry","resolveServerConfig","isHttpServer","getPromptCommand","opts","registry","client","serverName","serverConfig","configDir","start","Date","now","json","console","log","command","Error","cwd","connect","elapsed","toFixed","promptArgs","args","parsed","JSON","parse","error","message","String","name","promptResponse","getPrompt","prompt","raw","stringify","description","messages","role","content","type","text","mimeType","resource","uri","close","_"],"mappings":"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"}