UNPKG

@the_cfdude/productboard-mcp

Version:

Model Context Protocol server for Productboard REST API with dynamic tool loading

81 lines (80 loc) 2.2 kB
import { ToolDefinition } from '../types/tool-types.js'; export type ToolHandler = (args: any) => Promise<any>; export type ToolLoader = () => Promise<ToolHandler>; export interface ToolManifest { version: string; generated: string; categories: Record<string, CategoryInfo>; tools: Record<string, ToolInfo>; } export interface CategoryInfo { displayName: string; description: string; tools: string[]; } export interface ToolInfo { category: string; operation: string; description: string; requiredParams: string[]; optionalParams: string[]; implementation: string; } /** * Dynamic tool registry that supports lazy loading */ export declare class ToolRegistry { private manifest; private toolLoaders; private loadedHandlers; private enabledCategories; private maxLoadedHandlers; private handlerAccessCount; private lastAccessTime; private customTools; constructor(enabledCategories?: string[]); /** * Load tool manifest */ loadManifest(manifestPath: string): void; /** * Register a tool loader function */ registerLoader(toolName: string, loader: ToolLoader): void; /** * Register tool loaders from manifest */ registerFromManifest(): Promise<void>; /** * Register a custom tool (not from manifest/OpenAPI) */ registerCustomTool(name: string, tool: ToolDefinition): void; /** * Get tool definitions for enabled categories */ getToolDefinitions(): Promise<ToolDefinition[]>; /** * Execute a tool by name */ executeTool(toolName: string, args: any): Promise<any>; /** * Update enabled categories at runtime */ updateEnabledCategories(categories: string[]): void; /** * Get available categories */ getCategories(): CategoryInfo[]; /** * Get tools for a specific category */ getToolsForCategory(category: string): string[]; /** * Cleanup least used handlers to prevent memory leaks */ private cleanupLeastUsedHandlers; /** * Clear all loaded handlers (for testing or manual cleanup) */ clearLoadedHandlers(): void; }