@edicarlos.lds/businessmap-mcp
Version:
Model Context Protocol server for BusinessMap (Kanbanize) integration
104 lines • 3.66 kB
JavaScript
import dotenv from 'dotenv';
import path from 'node:path';
import { logger } from '../utils/logger.js';
// Load environment variables
// Load environment variables from current working directory
const envPath = path.resolve(process.cwd(), '.env');
const result = dotenv.config({ path: envPath });
if (result.error) {
// If .env file doesn't exist, dotenv returns an error.
// We'll try loading without path (default behavior) as fallback,
// but also log that we checked CWD.
logger.info(`No .env file found at ${envPath}, checking default locations...`);
dotenv.config();
}
else {
logger.info(`Loaded environment variables from ${envPath}`);
}
function getRequiredEnvVar(name) {
const value = process.env[name];
if (!value) {
throw new Error(`Required environment variable ${name} is not set`);
}
return value;
}
function getBooleanEnvVar(name, defaultValue = false) {
const value = process.env[name];
if (value === undefined)
return defaultValue;
return value.toLowerCase() === 'true';
}
function getNumberEnvVar(name, defaultValue) {
const value = process.env[name];
if (value === undefined || value === '')
return defaultValue;
const parsed = Number.parseInt(value, 10);
if (Number.isNaN(parsed)) {
throw new TypeError(`Environment variable ${name} must be a valid number`);
}
return parsed;
}
function getCsvEnvVar(name, defaultValue) {
const value = process.env[name];
if (!value)
return defaultValue;
return value
.split(',')
.map((item) => item.trim())
.filter((item) => item.length > 0);
}
function getTransportType() {
const transport = (process.env.TRANSPORT || 'stdio').toLowerCase();
if (transport === 'stdio' || transport === 'http') {
return transport;
}
if (transport === 'sse') {
logger.warn('TRANSPORT=sse is deprecated. Falling back to TRANSPORT=http');
return 'http';
}
throw new Error(`TRANSPORT must be either "stdio" or "http" (received: "${transport}")`);
}
const port = getNumberEnvVar('PORT') || 3000;
const defaultAllowedHosts = [
'localhost',
'127.0.0.1',
'[::1]',
`localhost:${port}`,
`127.0.0.1:${port}`,
`[::1]:${port}`,
];
export const config = {
businessMap: {
apiUrl: getRequiredEnvVar('BUSINESSMAP_API_URL'),
apiToken: getRequiredEnvVar('BUSINESSMAP_API_TOKEN'),
defaultWorkspaceId: getNumberEnvVar('BUSINESSMAP_DEFAULT_WORKSPACE_ID'),
readOnlyMode: getBooleanEnvVar('BUSINESSMAP_READ_ONLY_MODE', false),
},
server: {
name: process.env.MCP_SERVER_NAME || 'businessmap-mcp',
version: process.env.MCP_SERVER_VERSION || '1.0.0',
port,
allowedOrigins: getCsvEnvVar('ALLOWED_ORIGINS', ['http://localhost']),
allowedHosts: getCsvEnvVar('ALLOWED_HOSTS', defaultAllowedHosts),
},
transport: {
type: getTransportType(),
},
};
export function validateConfig() {
// Validate API URL format
try {
new URL(config.businessMap.apiUrl);
}
catch {
throw new Error('BUSINESSMAP_API_URL must be a valid URL');
}
// Validate API token is not empty
if (!config.businessMap.apiToken.trim()) {
throw new Error('BUSINESSMAP_API_TOKEN cannot be empty');
}
logger.success(`Configuration validated for ${config.server.name} v${config.server.version}`);
logger.info(`📡 BusinessMap API: ${config.businessMap.apiUrl}`);
logger.info(`🔒 Read-only mode: ${config.businessMap.readOnlyMode ? 'enabled' : 'disabled'}`);
}
//# sourceMappingURL=environment.js.map