qbo-mcp-ts
Version:
TypeScript QuickBooks Online MCP Server with enhanced features and dual transport support
279 lines • 9.09 kB
JavaScript
"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