import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; // Get current file's directory const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Project root directory should be the parent directory of src const rootDir = dirname(dirname(__dirname)); /** * Find the path to a configuration file by checking multiple potential locations. * @param filename The name of the file to locate (e.g., 'servers.json', 'mcp_settings.json') * @param description Brief description of the file for logging purposes * @returns The path to the file */ export const getConfigFilePath = (filename: string, description = 'Configuration'): string => { const envPath = process.env.MCPHUB_SETTING_PATH; const potentialPaths = [ ...(envPath ? [envPath] : []), // Prioritize process.cwd() as the first location to check path.resolve(process.cwd(), filename), // Use path relative to the root directory path.join(rootDir, filename), // If installed with npx, may need to look one level up path.join(dirname(rootDir), filename) ]; for (const filePath of potentialPaths) { if (fs.existsSync(filePath)) { return filePath; } } // If all paths do not exist, use default path // Using the default path is acceptable because it ensures the application can proceed // even if the configuration file is missing. This fallback is particularly useful in // development environments or when the file is optional. const defaultPath = path.resolve(process.cwd(), filename); console.debug(`${description} file not found at any expected location, using default path: ${defaultPath}`); return defaultPath; };