Files
mcp-tool/verify-and-update-tools.js
nasir@endelospay.com 8c74b0e23f first
2025-07-11 20:22:12 +05:00

252 lines
9.1 KiB
JavaScript

#!/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;
}