v3/mcp/tools/README.md
This directory contains the MCP-first tool implementations following ADR-005: MCP-First API Design. CLI commands should call these MCP tools rather than directly implementing functionality.
The MCP-first architecture ensures that:
agent-tools.ts)MCP tools for agent lifecycle operations:
| Tool | Description | Category |
|---|---|---|
agent/spawn | Spawn a new agent with specified type and configuration | agent |
agent/list | List all agents with optional filtering and pagination | agent |
agent/terminate | Terminate a running agent gracefully or forcefully | agent |
agent/status | Get detailed status information for a specific agent | agent |
Example Usage:
import { spawnAgentTool } from './mcp/tools/agent-tools.js';
// Spawn a new coder agent
const result = await spawnAgentTool.handler({
agentType: 'coder',
config: { maxConcurrentTasks: 5 },
priority: 'high',
});
console.log(`Agent spawned: ${result.agentId}`);
swarm-tools.ts)MCP tools for swarm coordination operations:
| Tool | Description | Category |
|---|---|---|
swarm/init | Initialize swarm coordination with specified topology | swarm |
swarm/status | Get current swarm status including agents, metrics, topology | swarm |
swarm/scale | Scale swarm up or down to target number of agents | swarm |
Example Usage:
import { initSwarmTool } from './mcp/tools/swarm-tools.js';
// Initialize hierarchical-mesh swarm
const result = await initSwarmTool.handler({
topology: 'hierarchical-mesh',
maxAgents: 15,
config: {
communicationProtocol: 'message-bus',
consensusMechanism: 'majority',
},
});
console.log(`Swarm initialized: ${result.swarmId}`);
memory-tools.ts)MCP tools for memory operations (AgentDB integration):
| Tool | Description | Category |
|---|---|---|
memory/store | Store a memory entry with specified type and metadata | memory |
memory/search | Search memories using semantic and keyword search | memory |
memory/list | List memory entries with filtering, sorting, pagination | memory |
Example Usage:
import { searchMemoryTool } from './mcp/tools/memory-tools.js';
// Search memories semantically
const result = await searchMemoryTool.handler({
query: 'authentication implementation',
searchType: 'hybrid',
type: 'semantic',
limit: 10,
minRelevance: 0.8,
});
console.log(`Found ${result.total} relevant memories`);
config-tools.ts)MCP tools for configuration management:
| Tool | Description | Category |
|---|---|---|
config/load | Load configuration from file with optional merging | config |
config/save | Save configuration to file with optional backup | config |
config/validate | Validate configuration with optional auto-fix | config |
Example Usage:
import { validateConfigTool } from './mcp/tools/config-tools.js';
// Validate configuration
const result = await validateConfigTool.handler({
config: myConfig,
strict: true,
fixIssues: true,
});
if (!result.valid) {
console.error(`Validation issues: ${result.issues.length}`);
if (result.fixed) {
console.log('Using fixed configuration');
}
}
index.ts)The index.ts file provides convenient functions for working with tools:
getAllTools()Get all MCP tools for registration:
import { getAllTools } from './mcp/tools/index.js';
const tools = getAllTools();
server.registerTools(tools);
getToolsByCategory(category)Get tools by category:
import { getToolsByCategory } from './mcp/tools/index.js';
const agentTools = getToolsByCategory('agent');
const memoryTools = getToolsByCategory('memory');
getToolByName(name)Get a specific tool:
import { getToolByName } from './mcp/tools/index.js';
const spawnTool = getToolByName('agent/spawn');
if (spawnTool) {
await spawnTool.handler({ agentType: 'coder' });
}
getToolsByTag(tag)Get tools by tag:
import { getToolsByTag } from './mcp/tools/index.js';
const lifecycleTools = getToolsByTag('lifecycle');
const agentdbTools = getToolsByTag('agentdb');
getToolStats()Get tool statistics:
import { getToolStats } from './mcp/tools/index.js';
const stats = getToolStats();
console.log(`Total tools: ${stats.total}`);
console.log(`Categories: ${stats.categories.join(', ')}`);
console.log(`Cacheable tools: ${stats.cacheable}`);
validateToolRegistration()Validate all tools:
import { validateToolRegistration } from './mcp/tools/index.js';
const validation = validateToolRegistration();
if (!validation.valid) {
console.error('Tool validation failed:', validation.issues);
}
CLI commands should follow this pattern:
// ❌ BAD: Direct implementation in CLI
async function cliSpawnAgent(args: SpawnArgs) {
// Direct business logic here
const agent = new Agent(args.type);
await agent.initialize();
return agent;
}
// ✅ GOOD: Call MCP tool
async function cliSpawnAgent(args: SpawnArgs) {
const { spawnAgentTool } = await import('./mcp/tools/agent-tools.js');
const result = await spawnAgentTool.handler({
agentType: args.type,
config: args.config,
priority: args.priority,
});
return result;
}
All tools use Zod schemas for input validation:
const spawnAgentSchema = z.object({
agentType: z.string().describe('Type of agent to spawn'),
id: z.string().optional().describe('Optional agent ID'),
config: z.record(z.unknown()).optional(),
priority: z.enum(['low', 'normal', 'high', 'critical']).default('normal'),
});
Handlers should:
async function handleSpawnAgent(
input: z.infer<typeof spawnAgentSchema>,
context?: ToolContext
): Promise<SpawnAgentResult> {
// TODO: Integrate with actual agent manager when available
// const agentManager = context?.agentManager as AgentManager;
// Stub implementation
const result: SpawnAgentResult = {
agentId: generateId(),
agentType: input.agentType,
status: 'active',
createdAt: new Date().toISOString(),
};
return result;
}
Tool definitions include:
/ separator for namespacing)export const spawnAgentTool: MCPTool = {
name: 'agent/spawn',
description: 'Spawn a new agent with specified type and configuration',
inputSchema: {
type: 'object',
properties: { /* ... */ },
required: ['agentType'],
},
handler: async (input, context) => {
const validated = spawnAgentSchema.parse(input);
return handleSpawnAgent(validated, context);
},
category: 'agent',
tags: ['agent', 'lifecycle', 'spawn'],
version: '1.0.0',
};
Tools that query data should enable caching:
export const listAgentsTool: MCPTool = {
// ...
cacheable: true,
cacheTTL: 2000, // 2 seconds
};
Tools with long-running operations should specify timeouts:
export const scaleSwarmTool: MCPTool = {
// ...
timeout: 30000, // 30 seconds
};
Tools should be tested with:
import { describe, it, expect } from 'vitest';
import { spawnAgentTool } from './agent-tools.js';
describe('agent/spawn', () => {
it('should spawn agent with valid input', async () => {
const result = await spawnAgentTool.handler({
agentType: 'coder',
});
expect(result.agentId).toBeDefined();
expect(result.agentType).toBe('coder');
expect(result.status).toBe('active');
});
it('should reject invalid input', async () => {
await expect(
spawnAgentTool.handler({ agentType: '' })
).rejects.toThrow();
});
});
Each tool includes TODO comments marking where actual service integration should occur:
// TODO: Call actual agent manager
// const agentManager = context?.agentManager as AgentManager;
// if (agentManager) {
// await agentManager.spawnAgent({ ... });
// }
When implementing actual services:
This implementation follows:
Current implementation includes:
/workspaces/claude-flow/v3/mcp/types.ts - MCP type definitions/workspaces/claude-flow/v3/mcp/server.ts - MCP server implementation/workspaces/claude-flow/v3/mcp/tool-registry.ts - Tool registration system/workspaces/claude-flow/CLAUDE.md - Project documentation