@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,464 @@
1
+ /**
2
+ * search.ts
3
+ *
4
+ * Search MCP server capabilities (tools, prompts, resources) without loading full schemas.
5
+ * Designed for agent discovery workflows.
6
+ */ "use strict";
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ Object.defineProperty(exports, "searchCommand", {
11
+ enumerable: true,
12
+ get: function() {
13
+ return searchCommand;
14
+ }
15
+ });
16
+ var _client = require("@mcp-z/client");
17
+ var _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
18
+ var _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
19
+ var _findconfigts = require("../lib/find-config.js");
20
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
21
+ try {
22
+ var info = gen[key](arg);
23
+ var value = info.value;
24
+ } catch (error) {
25
+ reject(error);
26
+ return;
27
+ }
28
+ if (info.done) {
29
+ resolve(value);
30
+ } else {
31
+ Promise.resolve(value).then(_next, _throw);
32
+ }
33
+ }
34
+ function _async_to_generator(fn) {
35
+ return function() {
36
+ var self = this, args = arguments;
37
+ return new Promise(function(resolve, reject) {
38
+ var gen = fn.apply(self, args);
39
+ function _next(value) {
40
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
41
+ }
42
+ function _throw(err) {
43
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
44
+ }
45
+ _next(undefined);
46
+ });
47
+ };
48
+ }
49
+ function _instanceof(left, right) {
50
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
51
+ return !!right[Symbol.hasInstance](left);
52
+ } else {
53
+ return left instanceof right;
54
+ }
55
+ }
56
+ function _getRequireWildcardCache(nodeInterop) {
57
+ if (typeof WeakMap !== "function") return null;
58
+ var cacheBabelInterop = new WeakMap();
59
+ var cacheNodeInterop = new WeakMap();
60
+ return (_getRequireWildcardCache = function(nodeInterop) {
61
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
62
+ })(nodeInterop);
63
+ }
64
+ function _interop_require_wildcard(obj, nodeInterop) {
65
+ if (!nodeInterop && obj && obj.__esModule) {
66
+ return obj;
67
+ }
68
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
69
+ return {
70
+ default: obj
71
+ };
72
+ }
73
+ var cache = _getRequireWildcardCache(nodeInterop);
74
+ if (cache && cache.has(obj)) {
75
+ return cache.get(obj);
76
+ }
77
+ var newObj = {
78
+ __proto__: null
79
+ };
80
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
81
+ for(var key in obj){
82
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
83
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
84
+ if (desc && (desc.get || desc.set)) {
85
+ Object.defineProperty(newObj, key, desc);
86
+ } else {
87
+ newObj[key] = obj[key];
88
+ }
89
+ }
90
+ }
91
+ newObj.default = obj;
92
+ if (cache) {
93
+ cache.set(obj, newObj);
94
+ }
95
+ return newObj;
96
+ }
97
+ function _ts_generator(thisArg, body) {
98
+ var f, y, t, _ = {
99
+ label: 0,
100
+ sent: function() {
101
+ if (t[0] & 1) throw t[1];
102
+ return t[1];
103
+ },
104
+ trys: [],
105
+ ops: []
106
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
107
+ return d(g, "next", {
108
+ value: verb(0)
109
+ }), d(g, "throw", {
110
+ value: verb(1)
111
+ }), d(g, "return", {
112
+ value: verb(2)
113
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
114
+ value: function() {
115
+ return this;
116
+ }
117
+ }), g;
118
+ function verb(n) {
119
+ return function(v) {
120
+ return step([
121
+ n,
122
+ v
123
+ ]);
124
+ };
125
+ }
126
+ function step(op) {
127
+ if (f) throw new TypeError("Generator is already executing.");
128
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
129
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
130
+ if (y = 0, t) op = [
131
+ op[0] & 2,
132
+ t.value
133
+ ];
134
+ switch(op[0]){
135
+ case 0:
136
+ case 1:
137
+ t = op;
138
+ break;
139
+ case 4:
140
+ _.label++;
141
+ return {
142
+ value: op[1],
143
+ done: false
144
+ };
145
+ case 5:
146
+ _.label++;
147
+ y = op[1];
148
+ op = [
149
+ 0
150
+ ];
151
+ continue;
152
+ case 7:
153
+ op = _.ops.pop();
154
+ _.trys.pop();
155
+ continue;
156
+ default:
157
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
158
+ _ = 0;
159
+ continue;
160
+ }
161
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
162
+ _.label = op[1];
163
+ break;
164
+ }
165
+ if (op[0] === 6 && _.label < t[1]) {
166
+ _.label = t[1];
167
+ t = op;
168
+ break;
169
+ }
170
+ if (t && _.label < t[2]) {
171
+ _.label = t[2];
172
+ _.ops.push(op);
173
+ break;
174
+ }
175
+ if (t[2]) _.ops.pop();
176
+ _.trys.pop();
177
+ continue;
178
+ }
179
+ op = body.call(thisArg, _);
180
+ } catch (e) {
181
+ op = [
182
+ 6,
183
+ e
184
+ ];
185
+ y = 0;
186
+ } finally{
187
+ f = t = 0;
188
+ }
189
+ if (op[0] & 5) throw op[1];
190
+ return {
191
+ value: op[0] ? op[1] : void 0,
192
+ done: true
193
+ };
194
+ }
195
+ }
196
+ function searchCommand(_0) {
197
+ return _async_to_generator(function(query) {
198
+ var opts, registry, _ref, _raw_mcpServers, _opts_limit, _opts_threshold, _searchOptions_servers, configPath, raw, servers, configDir, searchOptions, serverNames, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, serverName, error, err, response, _;
199
+ var _arguments = arguments;
200
+ return _ts_generator(this, function(_state) {
201
+ switch(_state.label){
202
+ case 0:
203
+ opts = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
204
+ _state.label = 1;
205
+ case 1:
206
+ _state.trys.push([
207
+ 1,
208
+ ,
209
+ 13,
210
+ 18
211
+ ]);
212
+ configPath = (0, _findconfigts.findConfigPath)(opts.config);
213
+ raw = JSON.parse(_fs.readFileSync(configPath, 'utf8'));
214
+ servers = (_ref = (_raw_mcpServers = raw.mcpServers) !== null && _raw_mcpServers !== void 0 ? _raw_mcpServers : raw.servers) !== null && _ref !== void 0 ? _ref : raw;
215
+ configDir = _path.dirname(configPath);
216
+ // Parse options
217
+ searchOptions = {
218
+ types: parseTypes(opts.types),
219
+ servers: parseServers(opts.servers),
220
+ searchFields: parseFields(opts.fields),
221
+ limit: (_opts_limit = opts.limit) !== null && _opts_limit !== void 0 ? _opts_limit : 20,
222
+ threshold: (_opts_threshold = opts.threshold) !== null && _opts_threshold !== void 0 ? _opts_threshold : 0
223
+ };
224
+ // Create registry (spawns stdio servers, registers HTTP servers)
225
+ // In attach mode, don't spawn - just register for connection
226
+ registry = (0, _client.createServerRegistry)(servers, {
227
+ cwd: configDir,
228
+ dialects: opts.attach ? [] : [
229
+ 'servers',
230
+ 'start'
231
+ ]
232
+ });
233
+ // Connect to all servers (or filtered subset)
234
+ serverNames = (_searchOptions_servers = searchOptions.servers) !== null && _searchOptions_servers !== void 0 ? _searchOptions_servers : Object.keys(servers || {});
235
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
236
+ _state.label = 2;
237
+ case 2:
238
+ _state.trys.push([
239
+ 2,
240
+ 9,
241
+ 10,
242
+ 11
243
+ ]);
244
+ _iterator = serverNames[Symbol.iterator]();
245
+ _state.label = 3;
246
+ case 3:
247
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
248
+ 3,
249
+ 8
250
+ ];
251
+ serverName = _step.value;
252
+ _state.label = 4;
253
+ case 4:
254
+ _state.trys.push([
255
+ 4,
256
+ 6,
257
+ ,
258
+ 7
259
+ ]);
260
+ return [
261
+ 4,
262
+ registry.connect(serverName)
263
+ ];
264
+ case 5:
265
+ _state.sent();
266
+ return [
267
+ 3,
268
+ 7
269
+ ];
270
+ case 6:
271
+ error = _state.sent();
272
+ // Log connection errors but continue with other servers
273
+ if (!opts.json) {
274
+ console.error("⚠ Failed to connect to ".concat(serverName, ": ").concat(_instanceof(error, Error) ? error.message : String(error)));
275
+ }
276
+ return [
277
+ 3,
278
+ 7
279
+ ];
280
+ case 7:
281
+ _iteratorNormalCompletion = true;
282
+ return [
283
+ 3,
284
+ 3
285
+ ];
286
+ case 8:
287
+ return [
288
+ 3,
289
+ 11
290
+ ];
291
+ case 9:
292
+ err = _state.sent();
293
+ _didIteratorError = true;
294
+ _iteratorError = err;
295
+ return [
296
+ 3,
297
+ 11
298
+ ];
299
+ case 10:
300
+ try {
301
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
302
+ _iterator.return();
303
+ }
304
+ } finally{
305
+ if (_didIteratorError) {
306
+ throw _iteratorError;
307
+ }
308
+ }
309
+ return [
310
+ 7
311
+ ];
312
+ case 11:
313
+ return [
314
+ 4,
315
+ registry.searchCapabilities(query, searchOptions)
316
+ ];
317
+ case 12:
318
+ response = _state.sent();
319
+ // Output results
320
+ if (opts.json) {
321
+ outputJSON(response);
322
+ } else {
323
+ outputPretty(response);
324
+ }
325
+ return [
326
+ 3,
327
+ 18
328
+ ];
329
+ case 13:
330
+ if (!registry) return [
331
+ 3,
332
+ 17
333
+ ];
334
+ _state.label = 14;
335
+ case 14:
336
+ _state.trys.push([
337
+ 14,
338
+ 16,
339
+ ,
340
+ 17
341
+ ]);
342
+ return [
343
+ 4,
344
+ registry.close()
345
+ ];
346
+ case 15:
347
+ _state.sent();
348
+ return [
349
+ 3,
350
+ 17
351
+ ];
352
+ case 16:
353
+ _ = _state.sent();
354
+ return [
355
+ 3,
356
+ 17
357
+ ];
358
+ case 17:
359
+ return [
360
+ 7
361
+ ];
362
+ case 18:
363
+ return [
364
+ 2
365
+ ];
366
+ }
367
+ });
368
+ }).apply(this, arguments);
369
+ }
370
+ /**
371
+ * Parse comma-separated types into CapabilityType array
372
+ */ function parseTypes(typesStr) {
373
+ if (!typesStr) return undefined;
374
+ var validTypes = [
375
+ 'tool',
376
+ 'prompt',
377
+ 'resource'
378
+ ];
379
+ var parsed = typesStr.split(',').map(function(t) {
380
+ return t.trim().toLowerCase();
381
+ });
382
+ var invalid = parsed.filter(function(t) {
383
+ return !validTypes.includes(t);
384
+ });
385
+ if (invalid.length > 0) {
386
+ throw new Error("Invalid types: ".concat(invalid.join(', '), ". Valid types: ").concat(validTypes.join(', ')));
387
+ }
388
+ return parsed;
389
+ }
390
+ /**
391
+ * Parse comma-separated server names
392
+ */ function parseServers(serversStr) {
393
+ if (!serversStr) return undefined;
394
+ return serversStr.split(',').map(function(s) {
395
+ return s.trim();
396
+ });
397
+ }
398
+ /**
399
+ * Parse comma-separated search fields
400
+ */ function parseFields(fieldsStr) {
401
+ if (!fieldsStr) return undefined;
402
+ var validFields = [
403
+ 'name',
404
+ 'description',
405
+ 'schema',
406
+ 'server'
407
+ ];
408
+ var parsed = fieldsStr.split(',').map(function(f) {
409
+ return f.trim().toLowerCase();
410
+ });
411
+ var invalid = parsed.filter(function(f) {
412
+ return !validFields.includes(f);
413
+ });
414
+ if (invalid.length > 0) {
415
+ throw new Error("Invalid fields: ".concat(invalid.join(', '), ". Valid fields: ").concat(validFields.join(', ')));
416
+ }
417
+ return parsed;
418
+ }
419
+ /**
420
+ * Output results as JSON
421
+ */ function outputJSON(response) {
422
+ console.log(JSON.stringify(response, null, 2));
423
+ }
424
+ /**
425
+ * Output results in human-readable format
426
+ */ function outputPretty(response) {
427
+ if (response.results.length === 0) {
428
+ console.log('No results found for "'.concat(response.query, '"'));
429
+ return;
430
+ }
431
+ console.log("Found ".concat(response.total, " result").concat(response.total !== 1 ? 's' : '', ' for "').concat(response.query, '"').concat(response.total > response.results.length ? " (showing ".concat(response.results.length, ")") : '', ":\n"));
432
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
433
+ try {
434
+ for(var _iterator = response.results[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
435
+ var result = _step.value;
436
+ var typeIcon = result.type === 'tool' ? '🔧' : result.type === 'prompt' ? '💬' : '📄';
437
+ var score = (result.score * 100).toFixed(0);
438
+ console.log("".concat(typeIcon, " ").concat(result.name, " [").concat(result.type, "] (").concat(score, "%)"));
439
+ console.log(" Server: ".concat(result.server));
440
+ if (result.description) {
441
+ var desc = result.description.length > 100 ? "".concat(result.description.slice(0, 97), "...") : result.description;
442
+ console.log(" ".concat(desc));
443
+ }
444
+ if (result.matchedOn.length > 0) {
445
+ console.log(" Matched: ".concat(result.matchedOn.join(', ')));
446
+ }
447
+ console.log('');
448
+ }
449
+ } catch (err) {
450
+ _didIteratorError = true;
451
+ _iteratorError = err;
452
+ } finally{
453
+ try {
454
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
455
+ _iterator.return();
456
+ }
457
+ } finally{
458
+ if (_didIteratorError) {
459
+ throw _iteratorError;
460
+ }
461
+ }
462
+ }
463
+ }
464
+ /* 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/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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"}
@@ -0,0 +1,49 @@
1
+ import { type ServerRegistry } from '@mcp-z/client';
2
+ /**
3
+ * Configuration options for the upCommand function
4
+ * @public
5
+ */
6
+ export interface UpOptions {
7
+ /** Optional path to custom .mcp.json configuration file */
8
+ config?: string;
9
+ /** Start only stdio servers (Claude Code compatible mode) */
10
+ stdioOnly?: boolean;
11
+ /** Start only HTTP servers with start blocks (for Claude Code Desktop) */
12
+ httpOnly?: boolean;
13
+ }
14
+ /**
15
+ * MCP server configuration entry per MCP specification.
16
+ *
17
+ * Supports two transport types:
18
+ * - stdio (default if no type): spawned process with stdin/stdout
19
+ * - http: remote HTTP server
20
+ *
21
+ * Transport can be inferred from URL protocol:
22
+ * - http:// or https:// → http
23
+ *
24
+ * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/transports
25
+ */
26
+ /**
27
+ * Start a cluster of MCP servers from a configuration file or object.
28
+ *
29
+ * @param opts - Configuration options
30
+ * @param opts.config - Optional path to custom .mcp.json file
31
+ * @returns ServerRegistry with servers map, config, connect method, and close function
32
+ *
33
+ * @example
34
+ * // Auto-discover .mcp.json in current directory
35
+ * const registry = await upCommand();
36
+ *
37
+ * @example
38
+ * // Load from specific config
39
+ * const registry = await upCommand({ config: '/path/to/.mcp.json' });
40
+ *
41
+ * @example
42
+ * // Use in-memory config
43
+ * const registry = await upCommand({
44
+ * mcpServers: {
45
+ * 'echo-stdio': { command: 'node', args: ['test/lib/servers/echo-stdio.ts'] }
46
+ * }
47
+ * });
48
+ */
49
+ export declare function upCommand(opts?: UpOptions): Promise<ServerRegistry>;
@@ -0,0 +1,49 @@
1
+ import { type ServerRegistry } from '@mcp-z/client';
2
+ /**
3
+ * Configuration options for the upCommand function
4
+ * @public
5
+ */
6
+ export interface UpOptions {
7
+ /** Optional path to custom .mcp.json configuration file */
8
+ config?: string;
9
+ /** Start only stdio servers (Claude Code compatible mode) */
10
+ stdioOnly?: boolean;
11
+ /** Start only HTTP servers with start blocks (for Claude Code Desktop) */
12
+ httpOnly?: boolean;
13
+ }
14
+ /**
15
+ * MCP server configuration entry per MCP specification.
16
+ *
17
+ * Supports two transport types:
18
+ * - stdio (default if no type): spawned process with stdin/stdout
19
+ * - http: remote HTTP server
20
+ *
21
+ * Transport can be inferred from URL protocol:
22
+ * - http:// or https:// → http
23
+ *
24
+ * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/transports
25
+ */
26
+ /**
27
+ * Start a cluster of MCP servers from a configuration file or object.
28
+ *
29
+ * @param opts - Configuration options
30
+ * @param opts.config - Optional path to custom .mcp.json file
31
+ * @returns ServerRegistry with servers map, config, connect method, and close function
32
+ *
33
+ * @example
34
+ * // Auto-discover .mcp.json in current directory
35
+ * const registry = await upCommand();
36
+ *
37
+ * @example
38
+ * // Load from specific config
39
+ * const registry = await upCommand({ config: '/path/to/.mcp.json' });
40
+ *
41
+ * @example
42
+ * // Use in-memory config
43
+ * const registry = await upCommand({
44
+ * mcpServers: {
45
+ * 'echo-stdio': { command: 'node', args: ['test/lib/servers/echo-stdio.ts'] }
46
+ * }
47
+ * });
48
+ */
49
+ export declare function upCommand(opts?: UpOptions): Promise<ServerRegistry>;