@the_cfdude/productboard-mcp
Version:
Model Context Protocol server for Productboard REST API with dynamic tool loading
81 lines (80 loc) • 2.2 kB
TypeScript
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;
}