#!/usr/bin/env node /** * Verify and Update All Tool Names * Compares actual generated tools with documentation and updates MD file */ import fs from 'fs'; import path from 'path'; console.log('šŸ” Verifying and updating all tool names...\n'); // Import the MCP server modules import('./src/tools/ToolGenerator.js').then(async ({ ToolGenerator }) => { import('./src/proxy/ApiClient.js').then(async ({ ApiClient }) => { import('./src/auth/AuthManager.js').then(async ({ AuthManager }) => { import('./src/config/ConfigManager.js').then(async ({ ConfigManager }) => { try { console.log('šŸ“‹ Loading MCP server components...'); // Initialize components const config = new ConfigManager(); const authManager = new AuthManager(null, config.getAll(true)); const apiClient = new ApiClient(config.getAll(true), authManager); const toolGenerator = new ToolGenerator(apiClient, authManager); console.log('āœ… Components loaded successfully\n'); // Generate actual tools console.log('šŸ”§ Generating actual tools from MCP server...'); const actualTools = toolGenerator.generateAllTools(); console.log(`āœ… Generated ${actualTools.length} actual tools\n`); // Organize tools by auth type const toolsByAuthType = { PUBLIC: [], PROVIDER: [], PATIENT: [], PARTNER: [], AFFILIATE: [], NETWORK: [] }; actualTools.forEach(tool => { const name = tool.name; if (name.startsWith('public_')) { toolsByAuthType.PUBLIC.push(tool); } else if (name.startsWith('provider_')) { toolsByAuthType.PROVIDER.push(tool); } else if (name.startsWith('patient_')) { toolsByAuthType.PATIENT.push(tool); } else if (name.startsWith('partner_')) { toolsByAuthType.PARTNER.push(tool); } else if (name.startsWith('affiliate_')) { toolsByAuthType.AFFILIATE.push(tool); } else if (name.startsWith('network_')) { toolsByAuthType.NETWORK.push(tool); } }); console.log('šŸ“Š Tools by authentication type:'); Object.keys(toolsByAuthType).forEach(authType => { console.log(`${authType}: ${toolsByAuthType[authType].length} tools`); }); console.log(''); // Generate new documentation console.log('šŸ“ Generating updated documentation...'); const documentation = generateDocumentationFromActualTools(toolsByAuthType); // Save documentation const docPath = path.join(process.cwd(), 'MCP-TOOLS-REFERENCE.md'); fs.writeFileSync(docPath, documentation); console.log(`āœ… Documentation updated: ${docPath}\n`); // Verify specific tools console.log('šŸ” Verifying specific tools:'); const loginTool = actualTools.find(tool => tool.name === 'public_create_login'); if (loginTool) { console.log('āœ… Found public_create_login tool'); console.log(` Description: ${loginTool.description}`); console.log(` Parameters: ${Object.keys(loginTool.inputSchema?.properties || {}).join(', ')}`); } else { console.log('āŒ public_create_login tool NOT FOUND'); } const resetPasswordTool = actualTools.find(tool => tool.name.includes('reset') && tool.name.includes('password')); if (resetPasswordTool) { console.log(`āœ… Found password reset tool: ${resetPasswordTool.name}`); } console.log('\nāœ… Verification and update complete!'); } catch (error) { console.error('āŒ Error:', error.message); console.error(error.stack); } }).catch(error => { console.error('āŒ Error loading ConfigManager:', error.message); }); }).catch(error => { console.error('āŒ Error loading AuthManager:', error.message); }); }).catch(error => { console.error('āŒ Error loading ApiClient:', error.message); }); }).catch(error => { console.error('āŒ Error loading ToolGenerator:', error.message); }); /** * Generate documentation from actual tools */ function generateDocumentationFromActualTools(toolsByAuthType) { const totalTools = Object.values(toolsByAuthType).reduce((sum, arr) => sum + arr.length, 0); const currentDate = new Date().toISOString().split('T')[0]; let doc = `# Laravel Healthcare MCP Server - Complete Tools Reference ## Overview This document provides a comprehensive reference for all MCP (Model Context Protocol) tools available in the Laravel Healthcare MCP Server. The server provides **${totalTools}** tools organized by authentication type and functionality (updated ${currentDate}). ## Authentication Types - **PUBLIC**: No authentication required (login, registration, public data) - **PROVIDER**: Provider authentication required (clinical data, EMR operations) - **PATIENT**: Patient authentication required (patient portal operations) - **PARTNER**: Partner authentication required (business operations) - **AFFILIATE**: Affiliate authentication required (affiliate management) - **NETWORK**: Network authentication required (network operations) ## Tool Naming Convention All tools follow the pattern: \`{auth_type}_{action}_{resource}\` - **auth_type**: Authentication type (public, provider, patient, etc.) - **action**: Action type (get, create, update, delete, manage) - **resource**: API resource or endpoint identifier --- `; // Generate sections for each auth type const authTypes = ['PUBLIC', 'PROVIDER', 'PATIENT', 'PARTNER', 'AFFILIATE', 'NETWORK']; authTypes.forEach(authType => { if (toolsByAuthType[authType] && toolsByAuthType[authType].length > 0) { doc += generateAuthTypeSection(authType, toolsByAuthType[authType]); } }); // Add summary doc += `## Summary | Authentication Type | Tool Count | Coverage | | ------------------- | ---------- | -------- | `; authTypes.forEach(authType => { const count = toolsByAuthType[authType] ? toolsByAuthType[authType].length : 0; doc += `| ${authType} | ${count} | 100% |\n`; }); doc += `| **TOTAL** | **${totalTools}** | **100%** | --- *This documentation is automatically generated from actual MCP server tools and provides 100% coverage of all available tools.* `; return doc; } /** * Generate documentation section for auth type */ function generateAuthTypeSection(authType, tools) { const authTypeNames = { PUBLIC: 'Public Tools', PROVIDER: 'Provider Tools', PATIENT: 'Patient Tools', PARTNER: 'Partner Tools', AFFILIATE: 'Affiliate Tools', NETWORK: 'Network Tools' }; const authDescriptions = { PUBLIC: 'No authentication required. These tools handle login, registration, password management, and public data access.', PROVIDER: 'Provider authentication required. These tools handle clinical data, EMR operations, and healthcare data requiring HIPAA compliance.', PATIENT: 'Patient authentication required. These tools handle patient portal operations and personal health data access.', PARTNER: 'Partner authentication required. These tools handle business operations and partner management.', AFFILIATE: 'Affiliate authentication required. These tools handle affiliate management and referral operations.', NETWORK: 'Network authentication required. These tools handle network operations and multi-partner management.' }; let section = `## ${authTypeNames[authType]} (${tools.length} tools)\n\n`; section += `*${authDescriptions[authType]}*\n\n`; section += `| Tool Name | Description | Key Parameters |\n`; section += `| --------- | ----------- | -------------- |\n`; // Sort tools alphabetically tools.sort((a, b) => a.name.localeCompare(b.name)); tools.forEach(tool => { const parameters = formatToolParameters(tool); section += `| \`${tool.name}\` | ${tool.description || 'No description'} | ${parameters} |\n`; }); section += '\n---\n\n'; return section; } /** * Format tool parameters for documentation */ function formatToolParameters(tool) { const properties = tool.inputSchema?.properties || {}; const required = tool.inputSchema?.required || []; if (Object.keys(properties).length === 0) { return 'No parameters'; } const requiredParams = []; const optionalParams = []; Object.entries(properties).forEach(([name, schema]) => { const type = schema.type || 'string'; if (required.includes(name)) { requiredParams.push(`${name} (${type})`); } else { optionalParams.push(`${name} (${type})`); } }); let result = ''; if (requiredParams.length > 0) { result += '**Required:** ' + requiredParams.join(', '); } if (optionalParams.length > 0) { if (result) result += ', '; result += '**Optional:** ' + optionalParams.join(', '); } return result; }