@mcp-z/cli 1.0.0

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 (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/bin/cli.js +5 -0
  4. package/dist/cjs/cli.d.cts +1 -0
  5. package/dist/cjs/cli.d.ts +1 -0
  6. package/dist/cjs/cli.js +576 -0
  7. package/dist/cjs/cli.js.map +1 -0
  8. package/dist/cjs/commands/call-tool.d.cts +26 -0
  9. package/dist/cjs/commands/call-tool.d.ts +26 -0
  10. package/dist/cjs/commands/call-tool.js +362 -0
  11. package/dist/cjs/commands/call-tool.js.map +1 -0
  12. package/dist/cjs/commands/get-prompt.d.cts +26 -0
  13. package/dist/cjs/commands/get-prompt.d.ts +26 -0
  14. package/dist/cjs/commands/get-prompt.js +335 -0
  15. package/dist/cjs/commands/get-prompt.js.map +1 -0
  16. package/dist/cjs/commands/inspect.d.cts +35 -0
  17. package/dist/cjs/commands/inspect.d.ts +35 -0
  18. package/dist/cjs/commands/inspect.js +896 -0
  19. package/dist/cjs/commands/inspect.js.map +1 -0
  20. package/dist/cjs/commands/manifest/env-prompting.d.cts +21 -0
  21. package/dist/cjs/commands/manifest/env-prompting.d.ts +21 -0
  22. package/dist/cjs/commands/manifest/env-prompting.js +657 -0
  23. package/dist/cjs/commands/manifest/env-prompting.js.map +1 -0
  24. package/dist/cjs/commands/manifest/generate.d.cts +124 -0
  25. package/dist/cjs/commands/manifest/generate.d.ts +124 -0
  26. package/dist/cjs/commands/manifest/generate.js +2541 -0
  27. package/dist/cjs/commands/manifest/generate.js.map +1 -0
  28. package/dist/cjs/commands/manifest/index.d.cts +2 -0
  29. package/dist/cjs/commands/manifest/index.d.ts +2 -0
  30. package/dist/cjs/commands/manifest/index.js +229 -0
  31. package/dist/cjs/commands/manifest/index.js.map +1 -0
  32. package/dist/cjs/commands/manifest/metadata-reader.d.cts +71 -0
  33. package/dist/cjs/commands/manifest/metadata-reader.d.ts +71 -0
  34. package/dist/cjs/commands/manifest/metadata-reader.js +441 -0
  35. package/dist/cjs/commands/manifest/metadata-reader.js.map +1 -0
  36. package/dist/cjs/commands/manifest/validate.d.cts +1 -0
  37. package/dist/cjs/commands/manifest/validate.d.ts +1 -0
  38. package/dist/cjs/commands/manifest/validate.js +525 -0
  39. package/dist/cjs/commands/manifest/validate.js.map +1 -0
  40. package/dist/cjs/commands/read-resource.d.cts +24 -0
  41. package/dist/cjs/commands/read-resource.d.ts +24 -0
  42. package/dist/cjs/commands/read-resource.js +311 -0
  43. package/dist/cjs/commands/read-resource.js.map +1 -0
  44. package/dist/cjs/commands/search.d.cts +31 -0
  45. package/dist/cjs/commands/search.d.ts +31 -0
  46. package/dist/cjs/commands/search.js +464 -0
  47. package/dist/cjs/commands/search.js.map +1 -0
  48. package/dist/cjs/commands/up.d.cts +49 -0
  49. package/dist/cjs/commands/up.d.ts +49 -0
  50. package/dist/cjs/commands/up.js +235 -0
  51. package/dist/cjs/commands/up.js.map +1 -0
  52. package/dist/cjs/index.d.cts +7 -0
  53. package/dist/cjs/index.d.ts +7 -0
  54. package/dist/cjs/index.js +85 -0
  55. package/dist/cjs/index.js.map +1 -0
  56. package/dist/cjs/lib/find-config.d.cts +14 -0
  57. package/dist/cjs/lib/find-config.d.ts +14 -0
  58. package/dist/cjs/lib/find-config.js +93 -0
  59. package/dist/cjs/lib/find-config.js.map +1 -0
  60. package/dist/cjs/lib/json-schema.d.cts +18 -0
  61. package/dist/cjs/lib/json-schema.d.ts +18 -0
  62. package/dist/cjs/lib/json-schema.js +306 -0
  63. package/dist/cjs/lib/json-schema.js.map +1 -0
  64. package/dist/cjs/lib/resolve-server-config.d.cts +50 -0
  65. package/dist/cjs/lib/resolve-server-config.d.ts +50 -0
  66. package/dist/cjs/lib/resolve-server-config.js +214 -0
  67. package/dist/cjs/lib/resolve-server-config.js.map +1 -0
  68. package/dist/cjs/package.json +1 -0
  69. package/dist/cjs/types.d.cts +21 -0
  70. package/dist/cjs/types.d.ts +21 -0
  71. package/dist/cjs/types.js +32 -0
  72. package/dist/cjs/types.js.map +1 -0
  73. package/dist/esm/cli.d.ts +1 -0
  74. package/dist/esm/cli.js +129 -0
  75. package/dist/esm/cli.js.map +1 -0
  76. package/dist/esm/commands/call-tool.d.ts +26 -0
  77. package/dist/esm/commands/call-tool.js +151 -0
  78. package/dist/esm/commands/call-tool.js.map +1 -0
  79. package/dist/esm/commands/get-prompt.d.ts +26 -0
  80. package/dist/esm/commands/get-prompt.js +118 -0
  81. package/dist/esm/commands/get-prompt.js.map +1 -0
  82. package/dist/esm/commands/inspect.d.ts +35 -0
  83. package/dist/esm/commands/inspect.js +438 -0
  84. package/dist/esm/commands/inspect.js.map +1 -0
  85. package/dist/esm/commands/manifest/env-prompting.d.ts +21 -0
  86. package/dist/esm/commands/manifest/env-prompting.js +213 -0
  87. package/dist/esm/commands/manifest/env-prompting.js.map +1 -0
  88. package/dist/esm/commands/manifest/generate.d.ts +124 -0
  89. package/dist/esm/commands/manifest/generate.js +1087 -0
  90. package/dist/esm/commands/manifest/generate.js.map +1 -0
  91. package/dist/esm/commands/manifest/index.d.ts +2 -0
  92. package/dist/esm/commands/manifest/index.js +23 -0
  93. package/dist/esm/commands/manifest/index.js.map +1 -0
  94. package/dist/esm/commands/manifest/metadata-reader.d.ts +71 -0
  95. package/dist/esm/commands/manifest/metadata-reader.js +143 -0
  96. package/dist/esm/commands/manifest/metadata-reader.js.map +1 -0
  97. package/dist/esm/commands/manifest/validate.d.ts +1 -0
  98. package/dist/esm/commands/manifest/validate.js +167 -0
  99. package/dist/esm/commands/manifest/validate.js.map +1 -0
  100. package/dist/esm/commands/read-resource.d.ts +24 -0
  101. package/dist/esm/commands/read-resource.js +95 -0
  102. package/dist/esm/commands/read-resource.js.map +1 -0
  103. package/dist/esm/commands/search.d.ts +31 -0
  104. package/dist/esm/commands/search.js +145 -0
  105. package/dist/esm/commands/search.js.map +1 -0
  106. package/dist/esm/commands/up.d.ts +49 -0
  107. package/dist/esm/commands/up.js +74 -0
  108. package/dist/esm/commands/up.js.map +1 -0
  109. package/dist/esm/index.d.ts +7 -0
  110. package/dist/esm/index.js +11 -0
  111. package/dist/esm/index.js.map +1 -0
  112. package/dist/esm/lib/find-config.d.ts +14 -0
  113. package/dist/esm/lib/find-config.js +42 -0
  114. package/dist/esm/lib/find-config.js.map +1 -0
  115. package/dist/esm/lib/json-schema.d.ts +18 -0
  116. package/dist/esm/lib/json-schema.js +66 -0
  117. package/dist/esm/lib/json-schema.js.map +1 -0
  118. package/dist/esm/lib/resolve-server-config.d.ts +50 -0
  119. package/dist/esm/lib/resolve-server-config.js +154 -0
  120. package/dist/esm/lib/resolve-server-config.js.map +1 -0
  121. package/dist/esm/package.json +1 -0
  122. package/dist/esm/types.d.ts +21 -0
  123. package/dist/esm/types.js +11 -0
  124. package/dist/esm/types.js.map +1 -0
  125. package/package.json +99 -0
  126. package/schemas/server.schema.json +489 -0
@@ -0,0 +1,21 @@
1
+ export interface MCPConfiguration {
2
+ mcpServers: Record<string, ServerConfig>;
3
+ }
4
+ export interface ServerConfigStdio {
5
+ type?: 'stdio';
6
+ command: string;
7
+ args?: string[];
8
+ env?: Record<string, string>;
9
+ }
10
+ export interface ServerConfigHttp {
11
+ type: 'http';
12
+ url: string;
13
+ headers?: Record<string, string>;
14
+ start?: ServerConfigStdio;
15
+ }
16
+ export type ServerConfig = ServerConfigStdio | ServerConfigHttp;
17
+ export declare function isHttpServer(config: ServerConfig): config is ServerConfigHttp;
18
+ export declare function isStdioServer(config: ServerConfig): config is ServerConfigStdio;
19
+ export declare function hasStartBlock(config: ServerConfig): config is ServerConfigHttp & {
20
+ start: ServerConfigStdio;
21
+ };
@@ -0,0 +1,32 @@
1
+ // Type definitions for MCP config files
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ function _export(target, all) {
7
+ for(var name in all)Object.defineProperty(target, name, {
8
+ enumerable: true,
9
+ get: Object.getOwnPropertyDescriptor(all, name).get
10
+ });
11
+ }
12
+ _export(exports, {
13
+ get hasStartBlock () {
14
+ return hasStartBlock;
15
+ },
16
+ get isHttpServer () {
17
+ return isHttpServer;
18
+ },
19
+ get isStdioServer () {
20
+ return isStdioServer;
21
+ }
22
+ });
23
+ function isHttpServer(config) {
24
+ return config.type === 'http';
25
+ }
26
+ function isStdioServer(config) {
27
+ return !isHttpServer(config);
28
+ }
29
+ function hasStartBlock(config) {
30
+ return isHttpServer(config) && config.start !== undefined;
31
+ }
32
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export default function cli(argv: string[], programName: string): void;
@@ -0,0 +1,129 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'fs';
3
+ import moduleRoot from 'module-root-sync';
4
+ import * as path from 'path';
5
+ import * as url from 'url';
6
+ import { callToolCommand } from './commands/call-tool.js';
7
+ import { getPromptCommand } from './commands/get-prompt.js';
8
+ import { inspectCommand } from './commands/inspect.js';
9
+ import { createManifestCommand } from './commands/manifest/index.js';
10
+ import { readResourceCommand } from './commands/read-resource.js';
11
+ import { searchCommand } from './commands/search.js';
12
+ import { upCommand } from './commands/up.js';
13
+ const pkg = JSON.parse(fs.readFileSync(path.join(moduleRoot(url.fileURLToPath(import.meta.url)), 'package.json'), 'utf-8'));
14
+ export default function cli(argv, programName) {
15
+ const program = new Command();
16
+ program.name(programName).description('mcp-z helper CLI').version(pkg.version);
17
+ program.command('up').description('Start MCP server cluster (starts all servers by default)').option('--config <path>', 'Config file path (searches up to home directory)').option('--stdio-only', 'Start only stdio servers (Claude Code compatible)').option('--http-only', 'Start only HTTP servers with start blocks (Claude Code Desktop)').action(async (options)=>{
18
+ try {
19
+ const clusterResult = await upCommand({
20
+ config: options.config,
21
+ stdioOnly: options.stdioOnly,
22
+ httpOnly: options.httpOnly
23
+ });
24
+ // If httpOnly mode and no servers were spawned, exit immediately
25
+ if (options.httpOnly && clusterResult.servers.size === 0) process.exit(0);
26
+ const shutdown = async (sig)=>{
27
+ console.log('Shutting down (signal=', sig, ')');
28
+ if (clusterResult && typeof clusterResult.close === 'function') {
29
+ try {
30
+ await clusterResult.close(sig === 'SIGTERM' ? 'SIGTERM' : 'SIGINT', {
31
+ timeoutMs: 1000
32
+ });
33
+ } catch (_) {
34
+ /* ignore */ }
35
+ }
36
+ process.exit(0);
37
+ };
38
+ // Signal handlers trigger async shutdown then exit
39
+ process.on('SIGINT', ()=>{
40
+ shutdown('SIGINT').catch(()=>process.exit(1));
41
+ });
42
+ process.on('SIGTERM', ()=>{
43
+ shutdown('SIGTERM').catch(()=>process.exit(1));
44
+ });
45
+ // Keep process alive - wait for signal
46
+ await new Promise(()=>{});
47
+ } catch (error) {
48
+ console.error(`\nāŒ ${error instanceof Error ? error.message : String(error)}`);
49
+ process.exit(1);
50
+ }
51
+ });
52
+ program.command('inspect').description('Inspect MCP servers: explore tools, resources, prompts, and health status').option('--config <path>', 'Config file path (searches up to home directory)').option('--servers <list>', 'Comma-separated server names to inspect').option('--tools', 'Show tools only').option('--resources', 'Show resources only').option('--prompts', 'Show prompts only').option('--health', 'Show health diagnostics only').option('--json', 'Output as JSON').option('--verbose', 'Include detailed schemas').option('--attach', 'Connect to running servers (default: spawn servers)').action(async (options)=>{
53
+ try {
54
+ await inspectCommand({
55
+ config: options.config,
56
+ servers: options.servers,
57
+ tools: options.tools,
58
+ resources: options.resources,
59
+ prompts: options.prompts,
60
+ health: options.health,
61
+ json: options.json,
62
+ verbose: options.verbose,
63
+ attach: options.attach
64
+ });
65
+ } catch (error) {
66
+ console.error(`\nāŒ ${error instanceof Error ? error.message : String(error)}`);
67
+ process.exit(1);
68
+ }
69
+ });
70
+ program.command('call-tool [server] <tool> <args>').description('Execute an MCP tool with JSON arguments').option('--config <path>', 'Custom config file path (default: .mcp.json)').option('--run <cmd>', 'Stdio run command (e.g., "npx -y @echo/server")').option('--url <url>', 'HTTP server URL').option('--server <json>', 'Full server config as JSON').option('--json', 'Output as JSON').action(async (server, tool, args, options)=>{
71
+ // Handle case where server is actually the tool when using inline config
72
+ // Commander parses: call-tool [server] <tool> <args>
73
+ // With --run: server=undefined, tool=actualTool, args=actualArgs
74
+ // Without --run: server=serverName, tool=actualTool, args=actualArgs
75
+ const opts = {
76
+ server,
77
+ tool,
78
+ args,
79
+ ...options,
80
+ run: options.run,
81
+ serverConfig: options.server
82
+ };
83
+ await callToolCommand(opts);
84
+ });
85
+ program.command('read-resource [server] <uri>').description('Read an MCP resource by URI').option('--config <path>', 'Custom config file path (default: .mcp.json)').option('--run <cmd>', 'Stdio run command (e.g., "npx -y @echo/server")').option('--url <url>', 'HTTP server URL').option('--server <json>', 'Full server config as JSON').option('--json', 'Output as JSON').action(async (server, uri, options)=>{
86
+ const opts = {
87
+ server,
88
+ uri,
89
+ ...options,
90
+ run: options.run,
91
+ serverConfig: options.server
92
+ };
93
+ await readResourceCommand(opts);
94
+ });
95
+ program.command('get-prompt [server] <name> [args]').description('Get an MCP prompt with optional JSON arguments').option('--config <path>', 'Custom config file path (default: .mcp.json)').option('--run <cmd>', 'Stdio run command (e.g., "npx -y @echo/server")').option('--url <url>', 'HTTP server URL').option('--server <json>', 'Full server config as JSON').option('--json', 'Output as JSON').action(async (server, name, args, options)=>{
96
+ const opts = {
97
+ server,
98
+ name,
99
+ args: args || '{}',
100
+ ...options,
101
+ run: options.run,
102
+ serverConfig: options.server
103
+ };
104
+ await getPromptCommand(opts);
105
+ });
106
+ program.command('search <query>').description('Search for tools, prompts, and resources across MCP servers').option('--config <path>', 'Custom config file path (default: .mcp.json)').option('--servers <list>', 'Comma-separated server names to search').option('--types <list>', 'Comma-separated types: tool,prompt,resource (default: all)').option('--fields <list>', 'Comma-separated fields: name,description,schema,server (default: name,description,schema)').option('--limit <number>', 'Maximum results to return (default: 20)', Number.parseInt).option('--threshold <number>', 'Minimum relevance score 0-1 (default: 0)', Number.parseFloat).option('--json', 'Output as JSON').option('--attach', 'Connect to running servers (default: spawn servers)').action(async (query, options)=>{
107
+ try {
108
+ await searchCommand(query, options);
109
+ } catch (error) {
110
+ console.error(`\nāŒ ${error instanceof Error ? error.message : String(error)}`);
111
+ process.exit(1);
112
+ }
113
+ });
114
+ // Add config command
115
+ program.addCommand(createManifestCommand());
116
+ program.parse([
117
+ 'node',
118
+ 'cli',
119
+ ...argv
120
+ ]);
121
+ }
122
+ // Entry point: run CLI when executed directly (not imported)
123
+ import { fileURLToPath } from 'url';
124
+ if (import.meta.url.startsWith('file:')) {
125
+ const modulePath = fileURLToPath(import.meta.url);
126
+ if (process.argv[1] === modulePath || process.argv[1] === modulePath.replace(/\.ts$/, '.js')) {
127
+ cli(process.argv.slice(2), 'mcp-z');
128
+ }
129
+ }
@@ -0,0 +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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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * call-tool.ts
3
+ *
4
+ * Execute MCP tools from the command line.
5
+ * Supports stdio (spawned) and http (remote) servers per MCP spec.
6
+ */
7
+ import { type InlineConfigOptions } from '../lib/resolve-server-config.js';
8
+ export interface CallToolOptions extends InlineConfigOptions {
9
+ tool: string;
10
+ args: string;
11
+ json?: boolean;
12
+ }
13
+ /**
14
+ * Main call-tool command implementation.
15
+ *
16
+ * @param opts - Call tool options from CLI flags
17
+ *
18
+ * @example
19
+ * // Call a tool with JSON args
20
+ * await callToolCommand({
21
+ * server: 'echo',
22
+ * tool: 'echo',
23
+ * args: '{"message": "hello"}',
24
+ * });
25
+ */
26
+ export declare function callToolCommand(opts: CallToolOptions): Promise<void>;
@@ -0,0 +1,151 @@
1
+ /**
2
+ * call-tool.ts
3
+ *
4
+ * Execute MCP tools from the command line.
5
+ * Supports stdio (spawned) and http (remote) servers per MCP spec.
6
+ */ import { createServerRegistry, ToolResponseError } from '@mcp-z/client';
7
+ import { resolveServerConfig } from '../lib/resolve-server-config.js';
8
+ import { isHttpServer } from '../types.js';
9
+ /**
10
+ * Main call-tool command implementation.
11
+ *
12
+ * @param opts - Call tool options from CLI flags
13
+ *
14
+ * @example
15
+ * // Call a tool with JSON args
16
+ * await callToolCommand({
17
+ * server: 'echo',
18
+ * tool: 'echo',
19
+ * args: '{"message": "hello"}',
20
+ * });
21
+ */ export async function callToolCommand(opts) {
22
+ let registry;
23
+ let client;
24
+ try {
25
+ // 1. Resolve server configuration (from config file or inline options)
26
+ const { serverName, serverConfig, configDir } = resolveServerConfig(opts);
27
+ // 2. Create registry and connect
28
+ const start = Date.now();
29
+ if (isHttpServer(serverConfig)) {
30
+ // HTTP server - no spawning needed
31
+ if (!opts.json) {
32
+ console.log(`šŸ”— Connecting to ${serverName}...`);
33
+ }
34
+ } else {
35
+ // Stdio server - will be spawned
36
+ if (!opts.json) {
37
+ console.log(`šŸš€ Spawning ${serverName} server...`);
38
+ }
39
+ if (!serverConfig.command) {
40
+ throw new Error(`Stdio server ${serverName} missing required "command" field`);
41
+ }
42
+ }
43
+ // Create registry (spawns stdio servers, registers HTTP servers)
44
+ registry = createServerRegistry({
45
+ [serverName]: serverConfig
46
+ }, {
47
+ cwd: configDir
48
+ });
49
+ client = await registry.connect(serverName);
50
+ if (!isHttpServer(serverConfig) && !opts.json) {
51
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
52
+ console.log(`āœ“ Server ready in ${elapsed}s\n`);
53
+ }
54
+ // 5. Parse tool arguments
55
+ let toolArgs;
56
+ try {
57
+ const parsed = JSON.parse(opts.args);
58
+ if (typeof parsed !== 'object' || parsed === null) {
59
+ throw new Error('Arguments must be a JSON object');
60
+ }
61
+ toolArgs = parsed;
62
+ } catch (error) {
63
+ throw new Error(`Failed to parse tool arguments as JSON: ${error instanceof Error ? error.message : String(error)}\n\nProvided args: ${opts.args}`);
64
+ }
65
+ // 6. Execute tool
66
+ if (!opts.json) {
67
+ console.log(`šŸ”§ Calling ${opts.tool}...`);
68
+ }
69
+ let response;
70
+ try {
71
+ response = await client.callTool(opts.tool, toolArgs);
72
+ } catch (error) {
73
+ handleToolError(error, opts);
74
+ throw error;
75
+ }
76
+ const parsedResult = parseToolResult(response);
77
+ if (parsedResult !== undefined) {
78
+ // Success case
79
+ if (opts.json) {
80
+ // JSON output mode
81
+ console.log(JSON.stringify(parsedResult, null, 2));
82
+ } else {
83
+ // Human-readable output
84
+ console.log(`āœ… ${opts.tool} succeeded\n`);
85
+ console.log('Result:');
86
+ if (typeof parsedResult === 'string') {
87
+ console.log(parsedResult);
88
+ } else {
89
+ console.log(JSON.stringify(parsedResult, null, 2));
90
+ }
91
+ }
92
+ }
93
+ } catch (error) {
94
+ if (opts.json) {
95
+ console.log(JSON.stringify({
96
+ error: error instanceof Error ? error.message : String(error)
97
+ }, null, 2));
98
+ } else {
99
+ console.error(`\nāŒ ${error instanceof Error ? error.message : String(error)}`);
100
+ }
101
+ throw error;
102
+ } finally{
103
+ // 8. Cleanup - registry.close() handles both client and server close
104
+ if (registry) {
105
+ try {
106
+ await registry.close();
107
+ } catch (_) {
108
+ // Ignore close errors
109
+ }
110
+ }
111
+ }
112
+ }
113
+ function handleToolError(error, opts) {
114
+ if (!(error instanceof ToolResponseError)) {
115
+ return;
116
+ }
117
+ const errorText = extractToolErrorText(error) || error.message;
118
+ if (opts.json) {
119
+ console.log(JSON.stringify({
120
+ error: errorText
121
+ }, null, 2));
122
+ } else {
123
+ console.log(`āŒ ${opts.tool} failed\n`);
124
+ console.log(`Error: ${errorText}`);
125
+ }
126
+ }
127
+ function extractToolErrorText(error) {
128
+ const content = Array.isArray(error.response.content) ? error.response.content : [];
129
+ const first = content[0];
130
+ if ((first === null || first === void 0 ? void 0 : first.type) === 'text' && typeof first.text === 'string') {
131
+ return first.text;
132
+ }
133
+ return undefined;
134
+ }
135
+ function parseToolResult(response) {
136
+ try {
137
+ return response.json();
138
+ } catch (error) {
139
+ if (error instanceof ToolResponseError) {
140
+ if ('isError' in error.response && error.response.isError) {
141
+ throw error;
142
+ }
143
+ try {
144
+ return response.text();
145
+ } catch {
146
+ return undefined;
147
+ }
148
+ }
149
+ throw error;
150
+ }
151
+ }
@@ -0,0 +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":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * get-prompt.ts
3
+ *
4
+ * Get MCP prompts from the command line.
5
+ * Supports stdio (spawned) and http (remote) servers per MCP spec.
6
+ */
7
+ import { type InlineConfigOptions } from '../lib/resolve-server-config.js';
8
+ export interface GetPromptOptions extends InlineConfigOptions {
9
+ name: string;
10
+ args: string;
11
+ json?: boolean;
12
+ }
13
+ /**
14
+ * Main get-prompt command implementation.
15
+ *
16
+ * @param opts - Get prompt options from CLI flags
17
+ *
18
+ * @example
19
+ * // Get a prompt with JSON args
20
+ * await getPromptCommand({
21
+ * server: 'assistant',
22
+ * name: 'compose-email',
23
+ * args: '{"tone": "formal"}',
24
+ * });
25
+ */
26
+ export declare function getPromptCommand(opts: GetPromptOptions): Promise<void>;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * get-prompt.ts
3
+ *
4
+ * Get MCP prompts from the command line.
5
+ * Supports stdio (spawned) and http (remote) servers per MCP spec.
6
+ */ import { createServerRegistry } from '@mcp-z/client';
7
+ import { resolveServerConfig } from '../lib/resolve-server-config.js';
8
+ import { isHttpServer } from '../types.js';
9
+ /**
10
+ * Main get-prompt command implementation.
11
+ *
12
+ * @param opts - Get prompt options from CLI flags
13
+ *
14
+ * @example
15
+ * // Get a prompt with JSON args
16
+ * await getPromptCommand({
17
+ * server: 'assistant',
18
+ * name: 'compose-email',
19
+ * args: '{"tone": "formal"}',
20
+ * });
21
+ */ export async function getPromptCommand(opts) {
22
+ let registry;
23
+ let client;
24
+ try {
25
+ // 1. Resolve server configuration (from config file or inline options)
26
+ const { serverName, serverConfig, configDir } = resolveServerConfig(opts);
27
+ // 2. Create registry and connect
28
+ const start = Date.now();
29
+ if (isHttpServer(serverConfig)) {
30
+ // HTTP server - no spawning needed
31
+ if (!opts.json) {
32
+ console.log(`šŸ”— Connecting to ${serverName}...`);
33
+ }
34
+ } else {
35
+ // Stdio server - will be spawned
36
+ if (!opts.json) {
37
+ console.log(`šŸš€ Spawning ${serverName} server...`);
38
+ }
39
+ if (!serverConfig.command) {
40
+ throw new Error(`Stdio server ${serverName} missing required "command" field`);
41
+ }
42
+ }
43
+ // Create registry (spawns stdio servers, registers HTTP servers)
44
+ registry = createServerRegistry({
45
+ [serverName]: serverConfig
46
+ }, {
47
+ cwd: configDir
48
+ });
49
+ client = await registry.connect(serverName);
50
+ if (!isHttpServer(serverConfig) && !opts.json) {
51
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
52
+ console.log(`āœ“ Server ready in ${elapsed}s\n`);
53
+ }
54
+ // 5. Parse prompt arguments
55
+ let promptArgs;
56
+ if (opts.args && opts.args !== '{}') {
57
+ try {
58
+ const parsed = JSON.parse(opts.args);
59
+ if (typeof parsed !== 'object' || parsed === null) {
60
+ throw new Error('Arguments must be a JSON object');
61
+ }
62
+ promptArgs = parsed;
63
+ } catch (error) {
64
+ throw new Error(`Failed to parse prompt arguments as JSON: ${error instanceof Error ? error.message : String(error)}\n\nProvided args: ${opts.args}`);
65
+ }
66
+ }
67
+ // 6. Get prompt
68
+ if (!opts.json) {
69
+ console.log(`šŸ’¬ Getting ${opts.name}...`);
70
+ }
71
+ const promptResponse = await client.getPrompt(opts.name, promptArgs);
72
+ const prompt = promptResponse.raw();
73
+ // Success case
74
+ if (opts.json) {
75
+ // JSON output mode
76
+ console.log(JSON.stringify(prompt, null, 2));
77
+ } else {
78
+ // Human-readable output
79
+ console.log('āœ… Get prompt succeeded\n');
80
+ // Display description if available
81
+ if (prompt.description) {
82
+ console.log(`Description: ${prompt.description}\n`);
83
+ }
84
+ // Display messages
85
+ console.log('Messages:');
86
+ for (const message of prompt.messages){
87
+ console.log(` [${message.role}]:`);
88
+ if (typeof message.content === 'string') {
89
+ console.log(` ${message.content}`);
90
+ } else if (message.content.type === 'text') {
91
+ console.log(` ${message.content.text}`);
92
+ } else if (message.content.type === 'image') {
93
+ console.log(` [Image: ${message.content.mimeType}]`);
94
+ } else if (message.content.type === 'resource') {
95
+ console.log(` [Resource: ${message.content.resource.uri}]`);
96
+ }
97
+ }
98
+ }
99
+ } catch (error) {
100
+ if (opts.json) {
101
+ console.log(JSON.stringify({
102
+ error: error instanceof Error ? error.message : String(error)
103
+ }, null, 2));
104
+ } else {
105
+ console.error(`\nāŒ ${error instanceof Error ? error.message : String(error)}`);
106
+ }
107
+ throw error;
108
+ } finally{
109
+ // 8. Cleanup - registry.close() handles both client and server close
110
+ if (registry) {
111
+ try {
112
+ await registry.close();
113
+ } catch (_) {
114
+ // Ignore close errors
115
+ }
116
+ }
117
+ }
118
+ }
@@ -0,0 +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":"AAAA;;;;;CAKC,GAED,SAASA,oBAAoB,QAAuE,gBAAgB;AACpH,SAAmCC,mBAAmB,QAAQ,kCAAkC;AAChG,SAASC,YAAY,QAAQ,cAAc;AAQ3C;;;;;;;;;;;;CAYC,GACD,OAAO,eAAeC,iBAAiBC,IAAsB;IAC3D,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,WAAWL,qBAAqB;YAAE,CAACO,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,4BAA4B;QAC5B,IAAIE;QACJ,IAAIlB,KAAKmB,IAAI,IAAInB,KAAKmB,IAAI,KAAK,MAAM;YACnC,IAAI;gBACF,MAAMC,SAASC,KAAKC,KAAK,CAACtB,KAAKmB,IAAI;gBACnC,IAAI,OAAOC,WAAW,YAAYA,WAAW,MAAM;oBACjD,MAAM,IAAIP,MAAM;gBAClB;gBACAK,aAAaE;YACf,EAAE,OAAOG,OAAO;gBACd,MAAM,IAAIV,MAAM,CAAC,0CAA0C,EAAEU,iBAAiBV,QAAQU,MAAMC,OAAO,GAAGC,OAAOF,OAAO,mBAAmB,EAAEvB,KAAKmB,IAAI,EAAE;YACtJ;QACF;QAEA,gBAAgB;QAChB,IAAI,CAACnB,KAAKS,IAAI,EAAE;YACdC,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEX,KAAK0B,IAAI,CAAC,GAAG,CAAC;QAC1C;QAEA,MAAMC,iBAAiB,MAAMzB,OAAO0B,SAAS,CAAC5B,KAAK0B,IAAI,EAAER;QACzD,MAAMW,SAASF,eAAeG,GAAG;QAEjC,eAAe;QACf,IAAI9B,KAAKS,IAAI,EAAE;YACb,mBAAmB;YACnBC,QAAQC,GAAG,CAACU,KAAKU,SAAS,CAACF,QAAQ,MAAM;QAC3C,OAAO;YACL,wBAAwB;YACxBnB,QAAQC,GAAG,CAAC;YAEZ,mCAAmC;YACnC,IAAIkB,OAAOG,WAAW,EAAE;gBACtBtB,QAAQC,GAAG,CAAC,CAAC,aAAa,EAAEkB,OAAOG,WAAW,CAAC,EAAE,CAAC;YACpD;YAEA,mBAAmB;YACnBtB,QAAQC,GAAG,CAAC;YACZ,KAAK,MAAMa,WAAWK,OAAOI,QAAQ,CAAE;gBACrCvB,QAAQC,GAAG,CAAC,CAAC,GAAG,EAAEa,QAAQU,IAAI,CAAC,EAAE,CAAC;gBAClC,IAAI,OAAOV,QAAQW,OAAO,KAAK,UAAU;oBACvCzB,QAAQC,GAAG,CAAC,CAAC,IAAI,EAAEa,QAAQW,OAAO,EAAE;gBACtC,OAAO,IAAIX,QAAQW,OAAO,CAACC,IAAI,KAAK,QAAQ;oBAC1C1B,QAAQC,GAAG,CAAC,CAAC,IAAI,EAAEa,QAAQW,OAAO,CAACE,IAAI,EAAE;gBAC3C,OAAO,IAAIb,QAAQW,OAAO,CAACC,IAAI,KAAK,SAAS;oBAC3C1B,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAEa,QAAQW,OAAO,CAACG,QAAQ,CAAC,CAAC,CAAC;gBACxD,OAAO,IAAId,QAAQW,OAAO,CAACC,IAAI,KAAK,YAAY;oBAC9C1B,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEa,QAAQW,OAAO,CAACI,QAAQ,CAACC,GAAG,CAAC,CAAC,CAAC;gBAC/D;YACF;QACF;IACF,EAAE,OAAOjB,OAAO;QACd,IAAIvB,KAAKS,IAAI,EAAE;YACbC,QAAQC,GAAG,CAACU,KAAKU,SAAS,CAAC;gBAAER,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,SAASwC,KAAK;YACtB,EAAE,OAAOC,GAAG;YACV,sBAAsB;YACxB;QACF;IACF;AACF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * inspect.ts
3
+ *
4
+ * Inspect MCP servers: explore tools, resources, prompts, and health status.
5
+ * Supports stdio (spawned) and http (remote) servers per MCP spec.
6
+ */
7
+ export interface InspectOptions {
8
+ config?: string;
9
+ servers?: string;
10
+ tools?: boolean;
11
+ resources?: boolean;
12
+ prompts?: boolean;
13
+ health?: boolean;
14
+ json?: boolean;
15
+ verbose?: boolean;
16
+ attach?: boolean;
17
+ }
18
+ /**
19
+ * Main inspect command implementation.
20
+ *
21
+ * @param opts - Inspect options from CLI flags
22
+ *
23
+ * @example
24
+ * // Show summary of .mcp.json servers (spawns servers)
25
+ * await inspectCommand({});
26
+ *
27
+ * @example
28
+ * // Show all tools from echo server (spawns server)
29
+ * await inspectCommand({ servers: 'echo', tools: true });
30
+ *
31
+ * @example
32
+ * // Connect to running servers (attach mode)
33
+ * await inspectCommand({ config: 'http-servers.json', attach: true, health: true });
34
+ */
35
+ export declare function inspectCommand(opts?: InspectOptions): Promise<void>;