UNPKG

qbo-mcp-ts

Version:

TypeScript QuickBooks Online MCP Server with enhanced features and dual transport support

279 lines 9.09 kB
"use strict"; /** * Configuration management for QBOMCP-TS */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.config = exports.Config = void 0; const dotenv_1 = require("dotenv"); const zod_1 = require("zod"); const fs = __importStar(require("fs")); const path = __importStar(require("path")); // Load environment variables (0, dotenv_1.config)(); /** * Environment variable schema for validation */ const EnvSchema = zod_1.z.object({ // QuickBooks OAuth Configuration QBO_CLIENT_ID: zod_1.z.string().min(1), QBO_CLIENT_SECRET: zod_1.z.string().min(1), QBO_COMPANY_ID: zod_1.z.string().min(1), QBO_REFRESH_TOKEN: zod_1.z.string().min(1), QBO_ENVIRONMENT: zod_1.z.enum(['sandbox', 'production']).default('sandbox'), QBO_REDIRECT_URI: zod_1.z.string().url().optional(), // Server Configuration NODE_ENV: zod_1.z.enum(['development', 'production', 'test']).default('development'), LOG_LEVEL: zod_1.z.enum(['error', 'warn', 'info', 'http', 'verbose', 'debug']).default('info'), // Transport Configuration TRANSPORT_TYPE: zod_1.z.enum(['stdio', 'sse']).default('stdio'), SSE_PORT: zod_1.z.coerce.number().default(3000), SSE_HOST: zod_1.z.string().default('0.0.0.0'), // Cache Configuration CACHE_TTL: zod_1.z.coerce.number().default(300), // 5 minutes CACHE_MAX_SIZE: zod_1.z.coerce.number().default(100), // API Configuration API_RETRY_ATTEMPTS: zod_1.z.coerce.number().default(3), API_RETRY_DELAY: zod_1.z.coerce.number().default(1000), API_TIMEOUT: zod_1.z.coerce.number().default(30000), API_RATE_LIMIT_PER_MINUTE: zod_1.z.coerce.number().default(60), // Security Configuration CORS_ORIGIN: zod_1.z.string().default('*'), RATE_LIMIT_WINDOW_MS: zod_1.z.coerce.number().default(60000), RATE_LIMIT_MAX_REQUESTS: zod_1.z.coerce.number().default(100), // Feature Flags ENABLE_CACHE: zod_1.z.coerce.boolean().default(true), ENABLE_RETRY: zod_1.z.coerce.boolean().default(true), ENABLE_HEALTH_CHECK: zod_1.z.coerce.boolean().default(true), ENABLE_METRICS: zod_1.z.coerce.boolean().default(false), // File Paths LOG_DIR: zod_1.z.string().default('./logs'), CACHE_DIR: zod_1.z.string().default('./cache'), }); /** * Configuration class for managing application settings */ class Config { static instance; env; configFile; constructor() { // Parse and validate environment variables const parseResult = EnvSchema.safeParse(process.env); if (!parseResult.success) { const missingVars = parseResult.error.issues.map((e) => e.path.join('.')).join(', '); throw new Error(`Missing or invalid environment variables: ${missingVars}`); } this.env = parseResult.data; // Load additional config from file if exists this.loadConfigFile(); // Create necessary directories this.ensureDirectories(); } /** * Get singleton instance */ static getInstance() { if (!Config.instance) { Config.instance = new Config(); } return Config.instance; } /** * Load configuration from JSON file if it exists */ loadConfigFile() { const configPath = path.resolve(process.cwd(), 'config.json'); if (fs.existsSync(configPath)) { try { const configContent = fs.readFileSync(configPath, 'utf-8'); this.configFile = JSON.parse(configContent); } catch (error) { console.warn(`Failed to load config.json: ${error}`); } } } /** * Ensure required directories exist */ ensureDirectories() { const dirs = [this.env.LOG_DIR, this.env.CACHE_DIR]; dirs.forEach((dir) => { if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } }); } /** * Get QuickBooks configuration */ getQBOConfig() { return { clientId: this.env.QBO_CLIENT_ID, clientSecret: this.env.QBO_CLIENT_SECRET, companyId: this.env.QBO_COMPANY_ID, refreshToken: this.env.QBO_REFRESH_TOKEN, environment: this.env.QBO_ENVIRONMENT, redirectUri: this.env.QBO_REDIRECT_URI, }; } /** * Get transport configuration */ getTransportConfig() { return { type: this.env.TRANSPORT_TYPE, port: this.env.SSE_PORT, host: this.env.SSE_HOST, cors: { origin: this.env.CORS_ORIGIN.split(',').map((o) => o.trim()), credentials: true, }, rateLimit: { windowMs: this.env.RATE_LIMIT_WINDOW_MS, max: this.env.RATE_LIMIT_MAX_REQUESTS, }, healthCheckPath: this.env.ENABLE_HEALTH_CHECK ? '/health' : undefined, }; } /** * Get cache configuration */ getCacheConfig() { return { enabled: this.env.ENABLE_CACHE, ttl: this.env.CACHE_TTL, maxSize: this.env.CACHE_MAX_SIZE, dir: this.env.CACHE_DIR, }; } /** * Get API configuration */ getAPIConfig() { return { retryAttempts: this.env.API_RETRY_ATTEMPTS, retryDelay: this.env.API_RETRY_DELAY, timeout: this.env.API_TIMEOUT, rateLimitPerMinute: this.env.API_RATE_LIMIT_PER_MINUTE, enableRetry: this.env.ENABLE_RETRY, }; } /** * Get logger configuration */ getLoggerConfig() { return { level: this.env.LOG_LEVEL, dir: this.env.LOG_DIR, enableConsole: this.env.NODE_ENV !== 'production', enableFile: true, }; } /** * Get feature flags */ getFeatureFlags() { return { cache: this.env.ENABLE_CACHE, retry: this.env.ENABLE_RETRY, healthCheck: this.env.ENABLE_HEALTH_CHECK, metrics: this.env.ENABLE_METRICS, }; } /** * Get environment */ getEnv() { return this.env.NODE_ENV; } /** * Check if in development mode */ isDevelopment() { return this.env.NODE_ENV === 'development'; } /** * Check if in production mode */ isProduction() { return this.env.NODE_ENV === 'production'; } /** * Check if in test mode */ isTest() { return this.env.NODE_ENV === 'test'; } /** * Get a custom config value from config.json */ getCustom(path, defaultValue) { if (!this.configFile) { return defaultValue; } const keys = path.split('.'); let value = this.configFile; for (const key of keys) { if (value && typeof value === 'object' && key in value) { value = value[key]; } else { return defaultValue; } } return value; } /** * Get all configuration (for debugging) */ getAll() { return { qbo: this.getQBOConfig(), transport: this.getTransportConfig(), cache: this.getCacheConfig(), api: this.getAPIConfig(), logger: this.getLoggerConfig(), features: this.getFeatureFlags(), environment: this.getEnv(), custom: this.configFile, }; } } exports.Config = Config; // Export singleton instance exports.config = Config.getInstance(); //# sourceMappingURL=config.js.map