UNPKG

@etm-professional-control/winccoa-mcp-server

Version:

MCP Server for WinCC OA with field-specific configurations

96 lines 3.72 kB
/** * Tool Loader * * Dynamically loads and registers MCP tools based on configuration. */ import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); /** * Dynamically load and register tools based on TOOLS environment variable * @param server - The MCP server instance * @param context - Shared server context */ export async function loadAllTools(server, context) { const toolsToLoad = process.env.TOOLS ? process.env.TOOLS.split(',').map(t => t.trim()) : []; if (toolsToLoad.length === 0) { console.log('No tools configured in TOOLS environment variable'); return; } let totalTools = 0; console.log(`Loading ${toolsToLoad.length} configured tools`); for (const toolPath of toolsToLoad) { try { const relativePath = `./tools/${toolPath}.js`; // Dynamic import of the tool module const toolModule = (await import(relativePath)); // Register tools if the module has a registerTools function if (typeof toolModule.registerTools === 'function') { const toolCount = await toolModule.registerTools(server, context); totalTools += toolCount || 0; console.log(` ✓ Loaded ${toolPath} (${toolCount || 'unknown'} tools)`); } else { console.warn(` ⚠ ${toolPath} does not export registerTools function`); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error(` ✗ Failed to load ${toolPath}:`, errorMessage); } } console.log(`Total tools registered: ${totalTools}`); } /** * Load tools from a specific category (for testing) * @param server - The MCP server instance * @param context - Shared context * @param category - Tool category to load * @returns Results of tool registration */ export async function loadToolCategory(server, context, category) { const results = []; try { const fs = await import('fs/promises'); const path = await import('path'); const categoryPath = path.join(__dirname, 'tools', category); const files = await fs.readdir(categoryPath); const jsFiles = files.filter(file => file.endsWith('.js')); for (const file of jsFiles) { try { const relativePath = `./tools/${category}/${file}`; const toolModule = (await import(relativePath)); if (typeof toolModule.registerTools === 'function') { const count = await toolModule.registerTools(server, context); results.push({ category: `${category}/${file}`, count: count || 0, success: true }); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); results.push({ category: `${category}/${file}`, count: 0, success: false, error: errorMessage }); } } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error(`Failed to load category ${category}:`, errorMessage); results.push({ category, count: 0, success: false, error: errorMessage }); } return results; } //# sourceMappingURL=tool_loader.js.map