Skip to main content
Glama

MCP Time Server Node

by pshempel
analyze-calculateDuration-main.js5.58 kB
#!/usr/bin/env node /** * Research script to understand calculateDuration main function complexity * Current: 122 lines, complexity 32 */ console.log('=== calculateDuration Main Function Complexity Analysis ===\n'); console.log('Current Implementation Structure:'); console.log('1. Parameter validation (string lengths)'); console.log('2. Cache key generation and lookup'); console.log('3. Unit validation'); console.log('4. Timezone validation'); console.log('5. Parse start_time (Unix timestamp, local time, ISO)'); console.log('6. Parse end_time (same logic)'); console.log('7. Calculate differences (ms, seconds, minutes, hours, days)'); console.log('8. Format result based on unit parameter'); console.log('9. Cache and return result\n'); console.log('Complexity Contributors (32 total):'); console.log('1. Function entry: +1'); console.log('2. if (typeof start_time === \'string\'): +1'); console.log('3. if (typeof end_time === \'string\'): +1'); console.log('4. ?? operator for unit: +1'); console.log('5. Ternary for timezone (=== \'\'): +1'); console.log('6. ?? operator for timezone default: +1'); console.log('7. if (cached): +1'); console.log('8. if (unit && !validUnits.includes): +2'); console.log('9. if (timezone && !validateTimezone): +2'); console.log('10-11. Start time parsing: ~7-8 complexity'); console.log(' - try block: +1'); console.log(' - if (regex test): +1'); console.log(' - && operator: +1'); console.log(' - if (isNaN): +1'); console.log(' - else if (timezone && !includes && !regex): +3'); console.log(' - if (!isValid): +1'); console.log('12-13. End time parsing: ~7-8 complexity (duplicate)'); console.log('14. if (unit !== \'auto\' && unit !== \'milliseconds\'): +2'); console.log('15. Nested ternaries for value: +3'); console.log('16. Total: ~32\n'); console.log('=== Refactoring Strategy ===\n'); console.log('Phase 1 - Extract validation helpers:'); console.log('1. validateUnit(unit: string | undefined): string'); console.log(' - Returns validated unit or \'auto\''); console.log(' - Throws if invalid\n'); console.log('2. resolveTimezone(timezone: string | undefined, defaultTimezone: string): string'); console.log(' - Handles empty string → UTC logic'); console.log(' - Returns resolved timezone\n'); console.log('Phase 2 - Extract date parsing:'); console.log('3. parseTimeParameter(time: string, timezone: string): Date'); console.log(' - Handles Unix timestamp, local time, ISO parsing'); console.log(' - Reduces complexity by ~7-8 per time parameter\n'); console.log('Phase 3 - Extract calculation helpers:'); console.log('4. calculateDurationValues(startDate: Date, endDate: Date): DurationValues'); console.log(' - Returns all duration calculations'); console.log(' - Simplifies main function\n'); console.log('5. formatDurationResult(values: DurationValues, unit: string): string'); console.log(' - Handles unit-specific formatting'); console.log(' - Removes nested ternaries\n'); console.log('Expected Phases:'); console.log('- Phase 1: Validation helpers (commit after tests pass)'); console.log('- Phase 2: Date parsing helper (commit after tests pass)'); console.log('- Phase 3: Calculation helpers (commit after tests pass)'); console.log('- Final: Update main function to use all helpers\n'); console.log('Expected Result:'); console.log('- Main function complexity: ~10-12'); console.log('- 4-5 logical commits'); console.log('- Good breaking points between phases\n'); // Test current patterns console.log('=== Testing Current Behavior Patterns ===\n'); // Unit validation function validateUnit(unit) { const validUnits = ['auto', 'milliseconds', 'seconds', 'minutes', 'hours', 'days']; const resolved = unit ?? 'auto'; if (!validUnits.includes(resolved)) { throw new Error(`Invalid unit: ${resolved}`); } return resolved; } console.log('Unit Validation Tests:'); const unitTests = [ { input: undefined, expected: 'auto' }, { input: 'auto', expected: 'auto' }, { input: 'seconds', expected: 'seconds' }, { input: 'invalid', shouldThrow: true }, ]; unitTests.forEach(({ input, expected, shouldThrow }) => { try { const result = validateUnit(input); const pass = !shouldThrow && result === expected ? '✓' : '✗'; console.log(`${pass} validateUnit(${input === undefined ? 'undefined' : `'${input}'`}) = '${result}'`); } catch (e) { const pass = shouldThrow ? '✓' : '✗'; console.log(`${pass} validateUnit('${input}') threw: ${e.message}`); } }); // Timezone resolution function resolveTimezone(timezone, defaultTimezone) { return timezone === '' ? 'UTC' : (timezone ?? defaultTimezone); } console.log('\nTimezone Resolution Tests:'); const timezoneTests = [ { input: undefined, default: 'America/New_York', expected: 'America/New_York' }, { input: '', default: 'America/New_York', expected: 'UTC' }, { input: 'Europe/London', default: 'America/New_York', expected: 'Europe/London' }, ]; timezoneTests.forEach(({ input, default: def, expected }) => { const result = resolveTimezone(input, def); const pass = result === expected ? '✓' : '✗'; console.log(`${pass} resolveTimezone(${input === undefined ? 'undefined' : `'${input}'`}, '${def}') = '${result}'`); }); console.log('\nGood Breaking Points:'); console.log('1. After Phase 1 (validation helpers) - Quick win, low complexity'); console.log('2. After Phase 2 (date parsing) - Major complexity reduction'); console.log('3. After Phase 3 (calculations) - Clean separation'); console.log('4. After final integration - Complete refactoring');

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pshempel/mcp-time-server-node'

If you have feedback or need assistance with the MCP directory API, please join our Discord server