UNPKG

ntfy-mcp-server

Version:

An MCP (Model Context Protocol) server designed to interact with the ntfy push notification service. It enables LLMs and AI agents to send notifications to your devices with extensive customization options.

112 lines (111 loc) 3.74 kB
import dotenv from 'dotenv'; import { createRequestContext } from '../utils/requestContext.js'; import { logger } from '../utils/logger.js'; // Initialize environment variables from .env file dotenv.config(); // Create a request context for logging const configContext = createRequestContext({ operation: 'ConfigInit', component: 'Config', }); // Create a logger specific to config const configLogger = logger.createChildLogger({ module: 'Config', service: 'Config', requestId: configContext.requestId, }); /** * Environment validation and parsing utilities */ const parsers = { /** * Parse environment string to number with validation * * @param value - String value from environment * @param defaultValue - Default value to use if parsing fails * @returns Parsed number value */ number: (value, defaultValue) => { if (!value) return defaultValue; const parsed = parseInt(value, 10); if (isNaN(parsed)) { configLogger.warn(`Invalid number for environment variable, using default: ${defaultValue}`, { value, defaultValue }); return defaultValue; } return parsed; }, /** * Parse environment string to boolean * * @param value - String value from environment * @param defaultValue - Default value to use if parsing fails * @returns Parsed boolean value */ boolean: (value, defaultValue) => { if (!value) return defaultValue; const normalized = value.toLowerCase().trim(); if (['true', '1', 'yes', 'y'].includes(normalized)) return true; if (['false', '0', 'no', 'n'].includes(normalized)) return false; configLogger.warn(`Invalid boolean for environment variable, using default: ${defaultValue}`, { value, defaultValue }); return defaultValue; }, /** * Parse environment string to an array of strings * * @param value - Comma-separated string value from environment * @param defaultValue - Default value to use if parsing fails * @returns Array of parsed string values */ array: (value, defaultValue = []) => { if (!value) return defaultValue; return value.split(',').map(item => item.trim()).filter(Boolean); } }; /** * Environment variable configuration */ export const config = { environment: process.env.NODE_ENV || 'development', logLevel: process.env.LOG_LEVEL || 'info', // HTTP server configuration server: { port: parsers.number(process.env.PORT, 3000), host: process.env.HOST || 'localhost', }, // Rate limiting settings rateLimit: { windowMs: parsers.number(process.env.RATE_LIMIT_WINDOW_MS, 60000), maxRequests: parsers.number(process.env.RATE_LIMIT_MAX_REQUESTS, 100), }, // Ntfy notification service configuration ntfy: { baseUrl: process.env.NTFY_BASE_URL || 'https://ntfy.sh', defaultTopic: process.env.NTFY_DEFAULT_TOPIC || '', apiKey: process.env.NTFY_API_KEY || '', maxMessageSize: parsers.number(process.env.NTFY_MAX_MESSAGE_SIZE, 4096), maxRetries: parsers.number(process.env.NTFY_MAX_RETRIES, 3), }, }; // Log the loaded configuration (excluding sensitive values) configLogger.info('Configuration loaded', { environment: config.environment, logLevel: config.logLevel, server: config.server, ntfy: { baseUrl: config.ntfy.baseUrl, defaultTopic: config.ntfy.defaultTopic || '(not set)', hasApiKey: !!config.ntfy.apiKey, }, }); export default config;