Skip to main content
Glama
tool-handlers.ts7.31 kB
import type { Services } from './services.js'; export class ToolError extends Error { constructor( public code: string, message: string ) { super(message); this.name = 'ToolError'; } } export async function handleToolCall( name: string, args: Record<string, unknown>, services: Services ) { const { storagePath, planService, requirementService, solutionService, decisionService, phaseService, artifactService, linkingService, queryService, } = services; const action = args.action as string; try { let result: unknown; switch (name) { case 'plan': switch (action) { case 'create': result = await planService.createPlan(args as any); break; case 'list': result = await planService.listPlans(args as any); break; case 'get': result = await planService.getPlan(args as any); break; case 'update': result = await planService.updatePlan(args as any); break; case 'archive': result = await planService.archivePlan(args as any); break; case 'set_active': result = await planService.setActivePlan(args as any); break; case 'get_active': result = await planService.getActivePlan(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for plan: ${action}`); } break; case 'requirement': switch (action) { case 'add': result = await requirementService.addRequirement(args as any); break; case 'get': result = await requirementService.getRequirement(args as any); break; case 'update': result = await requirementService.updateRequirement(args as any); break; case 'list': result = await requirementService.listRequirements(args as any); break; case 'delete': result = await requirementService.deleteRequirement(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for requirement: ${action}`); } break; case 'solution': switch (action) { case 'propose': result = await solutionService.proposeSolution(args as any); break; case 'get': result = await solutionService.getSolution(args as any); break; case 'update': result = await solutionService.updateSolution(args as any); break; case 'compare': result = await solutionService.compareSolutions(args as any); break; case 'select': result = await solutionService.selectSolution(args as any); break; case 'delete': result = await solutionService.deleteSolution(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for solution: ${action}`); } break; case 'decision': switch (action) { case 'record': result = await decisionService.recordDecision(args as any); break; case 'get': result = await decisionService.getDecision(args as any); break; case 'list': result = await decisionService.listDecisions(args as any); break; case 'supersede': result = await decisionService.supersedeDecision(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for decision: ${action}`); } break; case 'phase': switch (action) { case 'add': result = await phaseService.addPhase(args as any); break; case 'get_tree': result = await phaseService.getPhaseTree(args as any); break; case 'update_status': result = await phaseService.updatePhaseStatus(args as any); break; case 'move': result = await phaseService.movePhase(args as any); break; case 'delete': result = await phaseService.deletePhase(args as any); break; case 'get_next_actions': result = await phaseService.getNextActions(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for phase: ${action}`); } break; case 'artifact': switch (action) { case 'add': result = await artifactService.addArtifact(args as any); break; case 'get': result = await artifactService.getArtifact(args as any); break; case 'update': result = await artifactService.updateArtifact(args as any); break; case 'list': result = await artifactService.listArtifacts(args as any); break; case 'delete': result = await artifactService.deleteArtifact(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for artifact: ${action}`); } break; case 'link': switch (action) { case 'create': result = await linkingService.linkEntities(args as any); break; case 'get': result = await linkingService.getEntityLinks(args as any); break; case 'delete': result = await linkingService.unlinkEntities(args as any); break; default: throw new ToolError('InvalidAction', `Unknown action for link: ${action}`); } break; case 'query': switch (action) { case 'search': result = await queryService.searchEntities(args as any); break; case 'trace': result = await queryService.traceRequirement(args as any); break; case 'validate': result = await queryService.validatePlan(args as any); break; case 'export': result = await queryService.exportPlan(args as any); break; case 'health': result = { status: 'healthy', version: '1.0.0', storagePath, timestamp: new Date().toISOString(), }; break; default: throw new ToolError('InvalidAction', `Unknown action for query: ${action}`); } break; default: throw new ToolError('MethodNotFound', `Unknown tool: ${name}`); } return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { if (error instanceof ToolError) { throw error; } const message = error instanceof Error ? error.message : 'Unknown error'; throw new ToolError('InternalError', message); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cppmyjob/cpp-mcp-planner'

If you have feedback or need assistance with the MCP directory API, please join our Discord server