first
This commit is contained in:
251
verify-and-update-tools.js
Normal file
251
verify-and-update-tools.js
Normal file
@@ -0,0 +1,251 @@
|
||||
#!/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;
|
||||
}
|
Reference in New Issue
Block a user