UNPKG

@siva-sub/mcp-public-transport

Version:

A Model Context Protocol server for Singapore transport data with real-time information and routing

62 lines (61 loc) 2.98 kB
import { z } from 'zod'; import dotenv from 'dotenv'; dotenv.config(); const ConfigSchema = z.object({ // Existing configs ltaAccountKey: z.string().min(1, 'LTA_ACCOUNT_KEY is required'), cacheDuration: z.coerce.number().default(300), logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'), maxWalkDistance: z.coerce.number().default(1000), enableCrowdPrediction: z.coerce.boolean().default(true), enableCostOptimization: z.coerce.boolean().default(true), requestTimeout: z.coerce.number().default(30000), // Increased for OneMap API maxConcurrentRequests: z.coerce.number().default(10), // OneMap authentication configs (required for routing) oneMapEmail: z.string().email('ONEMAP_EMAIL must be a valid email address'), oneMapPassword: z.string().min(1, 'ONEMAP_PASSWORD is required'), enableFuzzySearch: z.coerce.boolean().default(true), maxSearchResults: z.coerce.number().default(10), searchTimeout: z.coerce.number().default(5000), enableAutoComplete: z.coerce.boolean().default(true), enableLocationCaching: z.coerce.boolean().default(true), locationCacheDuration: z.coerce.number().default(3600), // Testing and maintenance enableApiTesting: z.coerce.boolean().default(false), skipTrafficApis: z.coerce.boolean().default(false), }); export function loadEnvironment() { try { const config = ConfigSchema.parse({ // Existing configs ltaAccountKey: process.env.LTA_ACCOUNT_KEY, cacheDuration: process.env.CACHE_DURATION, logLevel: process.env.LOG_LEVEL, maxWalkDistance: process.env.MAX_WALK_DISTANCE, enableCrowdPrediction: process.env.ENABLE_CROWD_PREDICTION, enableCostOptimization: process.env.ENABLE_COST_OPTIMIZATION, requestTimeout: process.env.REQUEST_TIMEOUT, maxConcurrentRequests: process.env.MAX_CONCURRENT_REQUESTS, // New location intelligence configs oneMapEmail: process.env.ONEMAP_EMAIL, oneMapPassword: process.env.ONEMAP_PASSWORD, enableFuzzySearch: process.env.ENABLE_FUZZY_SEARCH, maxSearchResults: process.env.MAX_SEARCH_RESULTS, searchTimeout: process.env.SEARCH_TIMEOUT, enableAutoComplete: process.env.ENABLE_AUTO_COMPLETE, enableLocationCaching: process.env.ENABLE_LOCATION_CACHING, locationCacheDuration: process.env.LOCATION_CACHE_DURATION, // Testing and maintenance enableApiTesting: process.env.ENABLE_API_TESTING, skipTrafficApis: process.env.SKIP_TRAFFIC_APIS, }); return config; } catch (error) { if (error instanceof z.ZodError) { const issues = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', '); throw new Error(`Environment configuration error: ${issues}`); } throw error; } }