@claude-flow/cli 3.0.0-alpha.13 → 3.0.0-alpha.15

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 (106) hide show
  1. package/dist/src/commands/doctor.d.ts.map +1 -1
  2. package/dist/src/commands/doctor.js +75 -2
  3. package/dist/src/commands/doctor.js.map +1 -1
  4. package/dist/tsconfig.tsbuildinfo +1 -1
  5. package/package.json +12 -4
  6. package/.agentic-flow/intelligence.json +0 -17
  7. package/.claude-flow/agents/store.json +0 -16
  8. package/.claude-flow/daemon-state.json +0 -123
  9. package/.claude-flow/daemon-test.log +0 -0
  10. package/.claude-flow/daemon.log +0 -0
  11. package/.claude-flow/daemon2.log +0 -0
  12. package/.claude-flow/daemon3.log +0 -0
  13. package/.claude-flow/hive-mind/state.json +0 -51
  14. package/.claude-flow/metrics/agent-metrics.json +0 -1
  15. package/.claude-flow/metrics/codebase-map.json +0 -11
  16. package/.claude-flow/metrics/consolidation.json +0 -6
  17. package/.claude-flow/metrics/performance.json +0 -87
  18. package/.claude-flow/metrics/security-audit.json +0 -10
  19. package/.claude-flow/metrics/task-metrics.json +0 -10
  20. package/.claude-flow/metrics/test-gaps.json +0 -6
  21. package/__tests__/README.md +0 -140
  22. package/__tests__/TEST_SUMMARY.md +0 -144
  23. package/__tests__/cli.test.ts +0 -558
  24. package/__tests__/commands.test.ts +0 -726
  25. package/__tests__/config-adapter.test.ts +0 -362
  26. package/__tests__/config-loading.test.ts +0 -106
  27. package/__tests__/coverage/.tmp/coverage-0.json +0 -1
  28. package/__tests__/coverage/.tmp/coverage-1.json +0 -1
  29. package/__tests__/coverage/.tmp/coverage-2.json +0 -1
  30. package/__tests__/coverage/.tmp/coverage-3.json +0 -1
  31. package/__tests__/coverage/.tmp/coverage-4.json +0 -1
  32. package/__tests__/coverage/.tmp/coverage-5.json +0 -1
  33. package/__tests__/mcp-client.test.ts +0 -480
  34. package/__tests__/p1-commands.test.ts +0 -1064
  35. package/agents/architect.yaml +0 -11
  36. package/agents/coder.yaml +0 -11
  37. package/agents/reviewer.yaml +0 -10
  38. package/agents/security-architect.yaml +0 -10
  39. package/agents/tester.yaml +0 -10
  40. package/docs/CONFIG_LOADING.md +0 -236
  41. package/docs/IMPLEMENTATION_COMPLETE.md +0 -421
  42. package/docs/MCP_CLIENT_GUIDE.md +0 -620
  43. package/docs/REFACTORING_SUMMARY.md +0 -247
  44. package/scripts/publish.sh +0 -46
  45. package/src/commands/agent.ts +0 -955
  46. package/src/commands/claims.ts +0 -317
  47. package/src/commands/completions.ts +0 -558
  48. package/src/commands/config.ts +0 -452
  49. package/src/commands/daemon.ts +0 -621
  50. package/src/commands/deployment.ts +0 -323
  51. package/src/commands/doctor.ts +0 -382
  52. package/src/commands/embeddings.ts +0 -686
  53. package/src/commands/hive-mind.ts +0 -928
  54. package/src/commands/hooks.ts +0 -2603
  55. package/src/commands/index.ts +0 -154
  56. package/src/commands/init.ts +0 -597
  57. package/src/commands/mcp.ts +0 -753
  58. package/src/commands/memory.ts +0 -1161
  59. package/src/commands/migrate.ts +0 -447
  60. package/src/commands/neural.ts +0 -253
  61. package/src/commands/performance.ts +0 -292
  62. package/src/commands/plugins.ts +0 -316
  63. package/src/commands/process.ts +0 -695
  64. package/src/commands/providers.ts +0 -259
  65. package/src/commands/security.ts +0 -288
  66. package/src/commands/session.ts +0 -891
  67. package/src/commands/start.ts +0 -457
  68. package/src/commands/status.ts +0 -736
  69. package/src/commands/swarm.ts +0 -648
  70. package/src/commands/task.ts +0 -792
  71. package/src/commands/workflow.ts +0 -742
  72. package/src/config-adapter.ts +0 -210
  73. package/src/index.ts +0 -443
  74. package/src/infrastructure/in-memory-repositories.ts +0 -310
  75. package/src/init/claudemd-generator.ts +0 -631
  76. package/src/init/executor.ts +0 -762
  77. package/src/init/helpers-generator.ts +0 -628
  78. package/src/init/index.ts +0 -60
  79. package/src/init/mcp-generator.ts +0 -83
  80. package/src/init/settings-generator.ts +0 -284
  81. package/src/init/statusline-generator.ts +0 -211
  82. package/src/init/types.ts +0 -447
  83. package/src/mcp-client.ts +0 -241
  84. package/src/mcp-server.ts +0 -577
  85. package/src/mcp-tools/agent-tools.ts +0 -466
  86. package/src/mcp-tools/config-tools.ts +0 -370
  87. package/src/mcp-tools/hive-mind-tools.ts +0 -521
  88. package/src/mcp-tools/hooks-tools.ts +0 -1888
  89. package/src/mcp-tools/index.ts +0 -16
  90. package/src/mcp-tools/memory-tools.ts +0 -270
  91. package/src/mcp-tools/session-tools.ts +0 -359
  92. package/src/mcp-tools/swarm-tools.ts +0 -105
  93. package/src/mcp-tools/task-tools.ts +0 -347
  94. package/src/mcp-tools/types.ts +0 -33
  95. package/src/mcp-tools/workflow-tools.ts +0 -573
  96. package/src/output.ts +0 -639
  97. package/src/parser.ts +0 -417
  98. package/src/prompt.ts +0 -619
  99. package/src/services/index.ts +0 -15
  100. package/src/services/worker-daemon.ts +0 -726
  101. package/src/suggest.ts +0 -245
  102. package/src/types.ts +0 -287
  103. package/tmp.json +0 -0
  104. package/tsconfig.json +0 -16
  105. package/tsconfig.tsbuildinfo +0 -1
  106. package/vitest.config.ts +0 -13
@@ -1,620 +0,0 @@
1
- # MCP Client Guide for CLI Commands
2
-
3
- ## Overview
4
-
5
- The MCP Client (`mcp-client.ts`) provides a thin wrapper for CLI commands to call MCP tools, implementing **ADR-005: MCP-First API Design** where CLI acts as a thin wrapper around MCP tools.
6
-
7
- ## Architecture
8
-
9
- ```
10
- ┌─────────────────┐
11
- │ CLI Command │ ← User interaction & display only
12
- └────────┬────────┘
13
- │ callMCPTool()
14
-
15
- ┌─────────────────┐
16
- │ MCP Client │ ← Tool registry & routing
17
- └────────┬────────┘
18
- │ tool.handler()
19
-
20
- ┌─────────────────┐
21
- │ MCP Tool │ ← Business logic lives here
22
- │ Handler │
23
- └─────────────────┘
24
- ```
25
-
26
- ## Quick Start
27
-
28
- ### 1. Import the MCP Client
29
-
30
- ```typescript
31
- import { callMCPTool, MCPClientError } from '../mcp-client.js';
32
- ```
33
-
34
- ### 2. Call an MCP Tool
35
-
36
- ```typescript
37
- try {
38
- const result = await callMCPTool('agent/spawn', {
39
- agentType: 'coder',
40
- priority: 'normal',
41
- config: { timeout: 300 }
42
- });
43
-
44
- // Handle success - display output
45
- output.printSuccess(`Agent ${result.agentId} spawned`);
46
- return { success: true, data: result };
47
-
48
- } catch (error) {
49
- if (error instanceof MCPClientError) {
50
- output.printError(`Failed: ${error.message}`);
51
- }
52
- return { success: false, exitCode: 1 };
53
- }
54
- ```
55
-
56
- ## Available MCP Tools
57
-
58
- ### Agent Tools
59
-
60
- | Tool Name | Description | Input Parameters |
61
- |-----------|-------------|------------------|
62
- | `agent/spawn` | Spawn a new agent | `agentType`, `id?`, `config?`, `priority?`, `metadata?` |
63
- | `agent/list` | List all agents | `status?`, `agentType?`, `limit?`, `offset?` |
64
- | `agent/status` | Get agent status | `agentId`, `includeMetrics?`, `includeHistory?` |
65
- | `agent/terminate` | Terminate an agent | `agentId`, `graceful?`, `reason?` |
66
-
67
- ### Swarm Tools
68
-
69
- | Tool Name | Description | Input Parameters |
70
- |-----------|-------------|------------------|
71
- | `swarm/init` | Initialize swarm | `topology`, `maxAgents?`, `config?`, `metadata?` |
72
- | `swarm/status` | Get swarm status | `includeAgents?`, `includeMetrics?`, `includeTopology?` |
73
- | `swarm/scale` | Scale swarm | `targetAgents`, `scaleStrategy?`, `agentTypes?`, `reason?` |
74
-
75
- ### Memory Tools
76
-
77
- | Tool Name | Description | Input Parameters |
78
- |-----------|-------------|------------------|
79
- | `memory/store` | Store memory | `content`, `type?`, `category?`, `tags?`, `importance?`, `ttl?` |
80
- | `memory/search` | Search memories | `query`, `searchType?`, `type?`, `category?`, `tags?`, `limit?`, `minRelevance?` |
81
- | `memory/list` | List memories | `type?`, `category?`, `tags?`, `sortBy?`, `sortOrder?`, `limit?`, `offset?` |
82
-
83
- ### Config Tools
84
-
85
- | Tool Name | Description | Input Parameters |
86
- |-----------|-------------|------------------|
87
- | `config/load` | Load configuration | `path?`, `scope?`, `merge?`, `includeDefaults?` |
88
- | `config/save` | Save configuration | `config`, `path?`, `scope?`, `merge?`, `createBackup?` |
89
- | `config/validate` | Validate config | `config`, `strict?`, `fixIssues?` |
90
-
91
- ## MCP Client API
92
-
93
- ### Core Functions
94
-
95
- #### `callMCPTool<T>(toolName, input, context?): Promise<T>`
96
-
97
- Call an MCP tool by name and return typed result.
98
-
99
- **Parameters:**
100
- - `toolName`: MCP tool name (e.g., `'agent/spawn'`)
101
- - `input`: Tool input parameters (validated by tool's schema)
102
- - `context?`: Optional context object
103
-
104
- **Returns:** Promise resolving to tool result
105
-
106
- **Throws:** `MCPClientError` if tool not found or execution fails
107
-
108
- **Example:**
109
- ```typescript
110
- const result = await callMCPTool<{ agentId: string }>('agent/spawn', {
111
- agentType: 'coder',
112
- priority: 'normal'
113
- });
114
- console.log(`Spawned agent: ${result.agentId}`);
115
- ```
116
-
117
- #### `getToolMetadata(toolName): ToolMetadata | undefined`
118
-
119
- Get tool metadata without executing it.
120
-
121
- **Example:**
122
- ```typescript
123
- const metadata = getToolMetadata('agent/spawn');
124
- if (metadata) {
125
- console.log(`Description: ${metadata.description}`);
126
- console.log(`Category: ${metadata.category}`);
127
- console.log(`Schema:`, metadata.inputSchema);
128
- }
129
- ```
130
-
131
- #### `listMCPTools(category?): ToolMetadata[]`
132
-
133
- List all available MCP tools, optionally filtered by category.
134
-
135
- **Example:**
136
- ```typescript
137
- // List all tools
138
- const allTools = listMCPTools();
139
-
140
- // List only agent tools
141
- const agentTools = listMCPTools('agent');
142
- ```
143
-
144
- #### `hasTool(toolName): boolean`
145
-
146
- Check if an MCP tool exists.
147
-
148
- **Example:**
149
- ```typescript
150
- if (hasTool('agent/spawn')) {
151
- console.log('Agent spawn tool is available');
152
- }
153
- ```
154
-
155
- #### `validateToolInput(toolName, input): { valid: boolean; errors?: string[] }`
156
-
157
- Validate input against tool schema before calling.
158
-
159
- **Example:**
160
- ```typescript
161
- const validation = validateToolInput('agent/spawn', {
162
- agentType: 'coder'
163
- // missing required field
164
- });
165
-
166
- if (!validation.valid) {
167
- console.error('Validation errors:', validation.errors);
168
- }
169
- ```
170
-
171
- #### `getToolCategories(): string[]`
172
-
173
- Get all unique tool categories.
174
-
175
- **Example:**
176
- ```typescript
177
- const categories = getToolCategories();
178
- console.log('Available categories:', categories);
179
- // Output: ['agent', 'swarm', 'memory', 'config']
180
- ```
181
-
182
- ### Error Handling
183
-
184
- #### `MCPClientError`
185
-
186
- Custom error class for MCP tool failures.
187
-
188
- **Properties:**
189
- - `message`: Error message
190
- - `toolName`: Name of the tool that failed
191
- - `cause?`: Original error if available
192
-
193
- **Example:**
194
- ```typescript
195
- try {
196
- await callMCPTool('agent/spawn', { ... });
197
- } catch (error) {
198
- if (error instanceof MCPClientError) {
199
- console.error(`Tool '${error.toolName}' failed: ${error.message}`);
200
- if (error.cause) {
201
- console.error('Caused by:', error.cause);
202
- }
203
- }
204
- }
205
- ```
206
-
207
- ## CLI Command Pattern
208
-
209
- ### Standard Pattern
210
-
211
- All CLI commands should follow this pattern:
212
-
213
- ```typescript
214
- import type { Command, CommandContext, CommandResult } from '../types.js';
215
- import { output } from '../output.js';
216
- import { select, confirm, input } from '../prompt.js';
217
- import { callMCPTool, MCPClientError } from '../mcp-client.js';
218
-
219
- const myCommand: Command = {
220
- name: 'my-command',
221
- description: 'Command description',
222
- options: [ /* command options */ ],
223
-
224
- action: async (ctx: CommandContext): Promise<CommandResult> => {
225
- // STEP 1: Gather input (interactive prompts if needed)
226
- let param = ctx.flags.param as string;
227
- if (!param && ctx.interactive) {
228
- param = await input({
229
- message: 'Enter parameter:',
230
- validate: (v) => v.length > 0 || 'Required'
231
- });
232
- }
233
-
234
- // STEP 2: Validate required inputs
235
- if (!param) {
236
- output.printError('Parameter is required');
237
- return { success: false, exitCode: 1 };
238
- }
239
-
240
- // STEP 3: Call MCP tool (business logic)
241
- try {
242
- const result = await callMCPTool<ResultType>('tool/name', {
243
- param,
244
- // ... other inputs
245
- });
246
-
247
- // STEP 4: Format and display output
248
- if (ctx.flags.format === 'json') {
249
- output.printJson(result);
250
- } else {
251
- output.printTable({
252
- columns: [ /* ... */ ],
253
- data: [ /* format result for display */ ]
254
- });
255
- }
256
-
257
- output.printSuccess('Operation successful');
258
- return { success: true, data: result };
259
-
260
- } catch (error) {
261
- // STEP 5: Handle errors
262
- if (error instanceof MCPClientError) {
263
- output.printError(`Failed: ${error.message}`);
264
- } else {
265
- output.printError(`Unexpected error: ${String(error)}`);
266
- }
267
- return { success: false, exitCode: 1 };
268
- }
269
- }
270
- };
271
- ```
272
-
273
- ### Key Principles
274
-
275
- 1. **CLI is thin**: Only handles UI/UX, no business logic
276
- 2. **MCP tool has logic**: All business logic in MCP tool handlers
277
- 3. **Type safety**: Use TypeScript generics for tool results
278
- 4. **Error handling**: Always catch and handle MCPClientError
279
- 5. **Display formatting**: CLI adds visual enhancements only
280
-
281
- ### What Belongs in CLI vs MCP Tool
282
-
283
- #### CLI Command Responsibilities (Display Layer)
284
-
285
- ✅ Interactive prompts (select, confirm, input)
286
- ✅ Flag/argument parsing
287
- ✅ Input validation (basic checks)
288
- ✅ Output formatting (tables, boxes, colors)
289
- ✅ Progress indicators
290
- ✅ Success/error messages
291
- ✅ JSON output formatting
292
-
293
- #### MCP Tool Responsibilities (Business Logic)
294
-
295
- ✅ Data validation (schema validation)
296
- ✅ Business rules enforcement
297
- ✅ Resource management (agents, swarms, memory)
298
- ✅ State changes
299
- ✅ Database operations
300
- ✅ External API calls
301
- ✅ Calculations and transformations
302
-
303
- ## Examples
304
-
305
- ### Example 1: Simple Tool Call
306
-
307
- ```typescript
308
- // Spawn an agent
309
- const spawnCommand: Command = {
310
- name: 'spawn',
311
- action: async (ctx: CommandContext) => {
312
- const agentType = ctx.flags.type as string;
313
-
314
- try {
315
- const result = await callMCPTool('agent/spawn', {
316
- agentType,
317
- priority: 'normal'
318
- });
319
-
320
- output.printSuccess(`Spawned agent: ${result.agentId}`);
321
- return { success: true, data: result };
322
-
323
- } catch (error) {
324
- if (error instanceof MCPClientError) {
325
- output.printError(error.message);
326
- }
327
- return { success: false, exitCode: 1 };
328
- }
329
- }
330
- };
331
- ```
332
-
333
- ### Example 2: Tool Call with Filtering
334
-
335
- ```typescript
336
- // List agents with filters
337
- const listCommand: Command = {
338
- name: 'list',
339
- action: async (ctx: CommandContext) => {
340
- try {
341
- const result = await callMCPTool<{
342
- agents: Agent[];
343
- total: number;
344
- }>('agent/list', {
345
- status: ctx.flags.status || 'all',
346
- agentType: ctx.flags.type,
347
- limit: 100
348
- });
349
-
350
- // Display results
351
- output.printTable({
352
- columns: [
353
- { key: 'id', header: 'ID', width: 20 },
354
- { key: 'type', header: 'Type', width: 15 },
355
- { key: 'status', header: 'Status', width: 10 }
356
- ],
357
- data: result.agents
358
- });
359
-
360
- output.printInfo(`Total: ${result.total} agents`);
361
- return { success: true, data: result };
362
-
363
- } catch (error) {
364
- if (error instanceof MCPClientError) {
365
- output.printError(error.message);
366
- }
367
- return { success: false, exitCode: 1 };
368
- }
369
- }
370
- };
371
- ```
372
-
373
- ### Example 3: Interactive Input with Tool Call
374
-
375
- ```typescript
376
- // Store memory with interactive input
377
- const storeCommand: Command = {
378
- name: 'store',
379
- action: async (ctx: CommandContext) => {
380
- // Get input interactively if not provided
381
- let content = ctx.flags.content as string;
382
- if (!content && ctx.interactive) {
383
- content = await input({
384
- message: 'Enter content to store:',
385
- validate: (v) => v.length > 0 || 'Content required'
386
- });
387
- }
388
-
389
- if (!content) {
390
- output.printError('Content is required');
391
- return { success: false, exitCode: 1 };
392
- }
393
-
394
- // Select memory type interactively
395
- let type = ctx.flags.type as string;
396
- if (!type && ctx.interactive) {
397
- type = await select({
398
- message: 'Select memory type:',
399
- options: [
400
- { value: 'episodic', label: 'Episodic' },
401
- { value: 'semantic', label: 'Semantic' },
402
- { value: 'procedural', label: 'Procedural' }
403
- ]
404
- });
405
- }
406
-
407
- try {
408
- const result = await callMCPTool('memory/store', {
409
- content,
410
- type: type || 'episodic',
411
- tags: ctx.flags.tags?.split(',') || [],
412
- importance: ctx.flags.importance
413
- });
414
-
415
- output.printSuccess(`Stored memory: ${result.id}`);
416
- return { success: true, data: result };
417
-
418
- } catch (error) {
419
- if (error instanceof MCPClientError) {
420
- output.printError(error.message);
421
- }
422
- return { success: false, exitCode: 1 };
423
- }
424
- }
425
- };
426
- ```
427
-
428
- ## Testing
429
-
430
- ### Unit Testing MCP Client
431
-
432
- ```typescript
433
- import { callMCPTool, MCPClientError, hasTool } from '../mcp-client.js';
434
-
435
- describe('MCP Client', () => {
436
- it('should call agent/spawn tool', async () => {
437
- const result = await callMCPTool('agent/spawn', {
438
- agentType: 'coder'
439
- });
440
-
441
- expect(result).toHaveProperty('agentId');
442
- expect(result).toHaveProperty('agentType', 'coder');
443
- });
444
-
445
- it('should throw MCPClientError for unknown tool', async () => {
446
- await expect(
447
- callMCPTool('unknown/tool', {})
448
- ).rejects.toThrow(MCPClientError);
449
- });
450
-
451
- it('should check if tool exists', () => {
452
- expect(hasTool('agent/spawn')).toBe(true);
453
- expect(hasTool('unknown/tool')).toBe(false);
454
- });
455
- });
456
- ```
457
-
458
- ### Integration Testing CLI Commands
459
-
460
- ```typescript
461
- import { execute } from '../cli.js';
462
-
463
- describe('Agent spawn command', () => {
464
- it('should spawn agent via MCP tool', async () => {
465
- const result = await execute(['agent', 'spawn', '--type', 'coder']);
466
-
467
- expect(result.success).toBe(true);
468
- expect(result.data).toHaveProperty('agentId');
469
- });
470
- });
471
- ```
472
-
473
- ## Best Practices
474
-
475
- ### 1. Type Safety
476
-
477
- Always provide type parameters to `callMCPTool`:
478
-
479
- ```typescript
480
- // ✅ Good: Type-safe
481
- const result = await callMCPTool<{ agentId: string }>('agent/spawn', { ... });
482
- console.log(result.agentId); // TypeScript knows this exists
483
-
484
- // ❌ Bad: No type safety
485
- const result = await callMCPTool('agent/spawn', { ... });
486
- console.log(result.agentId); // No type checking
487
- ```
488
-
489
- ### 2. Error Handling
490
-
491
- Always handle `MCPClientError`:
492
-
493
- ```typescript
494
- // ✅ Good: Specific error handling
495
- try {
496
- const result = await callMCPTool(...);
497
- } catch (error) {
498
- if (error instanceof MCPClientError) {
499
- output.printError(`Tool failed: ${error.message}`);
500
- } else {
501
- output.printError(`Unexpected error: ${String(error)}`);
502
- }
503
- return { success: false, exitCode: 1 };
504
- }
505
-
506
- // ❌ Bad: Generic error handling
507
- try {
508
- const result = await callMCPTool(...);
509
- } catch (error) {
510
- console.error(error); // User sees raw error
511
- }
512
- ```
513
-
514
- ### 3. Input Validation
515
-
516
- Validate inputs before calling tools:
517
-
518
- ```typescript
519
- // ✅ Good: Validate first
520
- if (!agentId) {
521
- output.printError('Agent ID is required');
522
- return { success: false, exitCode: 1 };
523
- }
524
-
525
- const result = await callMCPTool('agent/status', { agentId });
526
-
527
- // ❌ Bad: Let tool fail
528
- const result = await callMCPTool('agent/status', { agentId }); // Might be undefined
529
- ```
530
-
531
- ### 4. Output Formatting
532
-
533
- Keep display logic in CLI, not in tool results:
534
-
535
- ```typescript
536
- // ✅ Good: CLI formats output
537
- const result = await callMCPTool('agent/list', { ... });
538
- const displayData = result.agents.map(agent => ({
539
- id: agent.id,
540
- type: agent.agentType,
541
- created: new Date(agent.createdAt).toLocaleString() // Format in CLI
542
- }));
543
- output.printTable({ data: displayData });
544
-
545
- // ❌ Bad: Expect pre-formatted data from tool
546
- const result = await callMCPTool('agent/list', { ... });
547
- output.printTable({ data: result.formattedAgents }); // Tool shouldn't format
548
- ```
549
-
550
- ### 5. Progressive Enhancement
551
-
552
- Use feature detection for optional capabilities:
553
-
554
- ```typescript
555
- // Check if tool supports feature
556
- const metadata = getToolMetadata('agent/status');
557
- const supportsMetrics = metadata?.inputSchema.properties?.includeMetrics;
558
-
559
- const result = await callMCPTool('agent/status', {
560
- agentId,
561
- includeMetrics: supportsMetrics ? true : undefined
562
- });
563
- ```
564
-
565
- ## Troubleshooting
566
-
567
- ### Tool Not Found
568
-
569
- **Problem:** `MCPClientError: MCP tool not found: xyz/abc`
570
-
571
- **Solutions:**
572
- 1. Check tool name spelling
573
- 2. Verify tool is registered in `mcp-client.ts`
574
- 3. Import tool from correct tools file
575
-
576
- ### Type Errors
577
-
578
- **Problem:** TypeScript errors when calling `callMCPTool`
579
-
580
- **Solutions:**
581
- 1. Provide correct type parameter: `callMCPTool<ResultType>(...)`
582
- 2. Match input schema from tool definition
583
- 3. Check tool's TypeScript interfaces
584
-
585
- ### Validation Errors
586
-
587
- **Problem:** Tool execution fails with validation error
588
-
589
- **Solutions:**
590
- 1. Use `validateToolInput()` before calling
591
- 2. Check tool's input schema requirements
592
- 3. Provide all required parameters
593
-
594
- ## Contributing
595
-
596
- When adding new CLI commands:
597
-
598
- 1. Import `callMCPTool` and `MCPClientError`
599
- 2. Follow the standard CLI command pattern
600
- 3. Keep business logic in MCP tools
601
- 4. Add error handling for `MCPClientError`
602
- 5. Format output in CLI, not in tool
603
- 6. Add TypeScript types for tool results
604
- 7. Update this guide with new examples
605
-
606
- ## Related Documentation
607
-
608
- - [REFACTORING_SUMMARY.md](./REFACTORING_SUMMARY.md) - Overview of refactoring
609
- - [ADR-005: MCP-First API Design](/workspaces/claude-flow/docs/adr/ADR-005-mcp-first-api.md) - Architecture decision
610
- - [MCP Tool Implementations](/workspaces/claude-flow/v3/mcp/tools/) - Tool source code
611
-
612
- ## Summary
613
-
614
- The MCP Client provides a clean, type-safe way for CLI commands to call MCP tools while maintaining proper separation of concerns:
615
-
616
- - **CLI**: User interaction & display
617
- - **MCP Client**: Tool routing & error handling
618
- - **MCP Tools**: Business logic & data management
619
-
620
- This architecture ensures maintainability, testability, and consistency across all interfaces to the claude-flow system.