UNPKG

ecowitt-mcp

Version:

MCP server for Ecowitt Weather API v3 integration

86 lines (76 loc) 2.87 kB
import { readFileSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { z } from "zod"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Environment variables schema const EnvSchema = z.object({ ECOWITT_APPLICATION_KEY: z.string().min(1, "ECOWITT_APPLICATION_KEY is required").trim(), ECOWITT_API_KEY: z.string().min(1, "ECOWITT_API_KEY is required").trim(), ECOWITT_BASE_URL: z.string().url().optional().default("https://api.ecowitt.net/api/v3"), REQUEST_TIMEOUT: z .string() .optional() .default("10000") .pipe( z.coerce .number() .positive("REQUEST_TIMEOUT must be a positive number") .max(300000, "REQUEST_TIMEOUT cannot exceed 5 minutes") ), }); // Cache for the loaded configuration let cachedConfig = null; /** * Loads and validates configuration from environment variables and package.json * @returns {Object} Application configuration object * @property {Object} ecowitt - Ecowitt API configuration * @property {string} ecowitt.applicationKey - Ecowitt application key from ECOWITT_APPLICATION_KEY env var * @property {string} ecowitt.apiKey - Ecowitt API key from ECOWITT_API_KEY env var * @property {string} ecowitt.baseUrl - Base URL for Ecowitt API (default: https://api.ecowitt.net/api/v3) * @property {number} ecowitt.requestTimeout - Request timeout in milliseconds (default: 10000) * @property {Object} server - Server configuration * @property {string} server.name - MCP server name * @property {string} server.version - Server version from package.json */ export function getConfig() { // Return cached config if already loaded if (cachedConfig) { return cachedConfig; } // Validate environment variables with better error handling let env; try { env = EnvSchema.parse(process.env); } catch (error) { if (error instanceof z.ZodError) { const errorMessages = error.errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n"); throw new Error(`Configuration validation failed:\n${errorMessages}`); } throw error; } // Get package.json for version info const packageJsonPath = join(__dirname, "../..", "package.json"); const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8")); // Build and cache the configuration cachedConfig = { ecowitt: { applicationKey: env.ECOWITT_APPLICATION_KEY, apiKey: env.ECOWITT_API_KEY, baseUrl: env.ECOWITT_BASE_URL, requestTimeout: env.REQUEST_TIMEOUT, }, server: { name: "ecowitt-weather-server", version: packageJson.version, }, }; return cachedConfig; } /** * Clears the cached configuration (useful for testing or reloading config) */ export function clearConfigCache() { cachedConfig = null; }