whatsapp-mcp / config/env / loadEnv
Function: loadEnv()
function loadEnv(source?): {
API_KEY_PEPPER?: string;
APP_BIND: string;
APP_HTTP_PORT: number;
APP_PUBLIC_URL?: string;
DATABASE_URL: string;
INNGEST_EVENT_KEY?: string;
INNGEST_SERVE_PATH: string;
INNGEST_SIGNING_KEY?: string;
LOCAL_OWNER_CLIENT_ID?: string;
LOG_LEVEL: "error" | "trace" | "debug" | "info" | "warn" | "fatal";
MCP_TRANSPORT: "http" | "stdio";
MEDIA_ROOT: string;
MEDIA_SIGNING_SECRET?: string;
MEDIA_URL_TTL_SECONDS: number;
NODE_ENV: "development" | "test" | "production";
RL_DEFAULT_DAILY_MSGS: number;
RL_DEFAULT_RPM: number;
RL_OWNER_DAILY: number;
RL_OWNER_RPM: number;
WA_APP_SECRET?: string;
WA_DEFAULT_ACCESS_TOKEN?: string;
WA_DEFAULT_PHONE_NUMBER_ID?: string;
WA_DEFAULT_WABA_ID?: string;
WA_GRAPH_API_VERSION: string;
WA_WEBHOOK_VERIFY_TOKEN?: string;
};Defined in: src/config/env.ts:102
Parse and validate process.env into a typed config object.
Parameters
source?
ProcessEnv = process.env
Returns
{
API_KEY_PEPPER?: string;
APP_BIND: string;
APP_HTTP_PORT: number;
APP_PUBLIC_URL?: string;
DATABASE_URL: string;
INNGEST_EVENT_KEY?: string;
INNGEST_SERVE_PATH: string;
INNGEST_SIGNING_KEY?: string;
LOCAL_OWNER_CLIENT_ID?: string;
LOG_LEVEL: "error" | "trace" | "debug" | "info" | "warn" | "fatal";
MCP_TRANSPORT: "http" | "stdio";
MEDIA_ROOT: string;
MEDIA_SIGNING_SECRET?: string;
MEDIA_URL_TTL_SECONDS: number;
NODE_ENV: "development" | "test" | "production";
RL_DEFAULT_DAILY_MSGS: number;
RL_DEFAULT_RPM: number;
RL_OWNER_DAILY: number;
RL_OWNER_RPM: number;
WA_APP_SECRET?: string;
WA_DEFAULT_ACCESS_TOKEN?: string;
WA_DEFAULT_PHONE_NUMBER_ID?: string;
WA_DEFAULT_WABA_ID?: string;
WA_GRAPH_API_VERSION: string;
WA_WEBHOOK_VERIFY_TOKEN?: string;
}API_KEY_PEPPER?
optional API_KEY_PEPPER?: string = optStr;APP_BIND
APP_BIND: string;APP_HTTP_PORT
APP_HTTP_PORT: number;APP_PUBLIC_URL?
optional APP_PUBLIC_URL?: string;DATABASE_URL
DATABASE_URL: string = urlStr;INNGEST_EVENT_KEY?
optional INNGEST_EVENT_KEY?: string = optStr;INNGEST_SERVE_PATH
INNGEST_SERVE_PATH: string;INNGEST_SIGNING_KEY?
optional INNGEST_SIGNING_KEY?: string = optStr;LOCAL_OWNER_CLIENT_ID?
optional LOCAL_OWNER_CLIENT_ID?: string = optStr;LOG_LEVEL
LOG_LEVEL: "error" | "trace" | "debug" | "info" | "warn" | "fatal";MCP_TRANSPORT
MCP_TRANSPORT: "http" | "stdio";MEDIA_ROOT
MEDIA_ROOT: string;MEDIA_SIGNING_SECRET?
optional MEDIA_SIGNING_SECRET?: string = optStr;MEDIA_URL_TTL_SECONDS
MEDIA_URL_TTL_SECONDS: number;NODE_ENV
NODE_ENV: "development" | "test" | "production";RL_DEFAULT_DAILY_MSGS
RL_DEFAULT_DAILY_MSGS: number;RL_DEFAULT_RPM
RL_DEFAULT_RPM: number;RL_OWNER_DAILY
RL_OWNER_DAILY: number;RL_OWNER_RPM
RL_OWNER_RPM: number;WA_APP_SECRET?
optional WA_APP_SECRET?: string = optStr;WA_DEFAULT_ACCESS_TOKEN?
optional WA_DEFAULT_ACCESS_TOKEN?: string = optStr;WA_DEFAULT_PHONE_NUMBER_ID?
optional WA_DEFAULT_PHONE_NUMBER_ID?: string = optStr;WA_DEFAULT_WABA_ID?
optional WA_DEFAULT_WABA_ID?: string = optStr;WA_GRAPH_API_VERSION
WA_GRAPH_API_VERSION: string;WA_WEBHOOK_VERIFY_TOKEN?
optional WA_WEBHOOK_VERIFY_TOKEN?: string = optStr;Remarks
Exposed as a function (not a top-level constant) so tests can call it directly with synthetic input. The exported config singleton below calls it once at module import time.
Errors are aggregated into a single thrown Error whose message lists each
invalid key on its own line — so a missing-env failure on container boot
surfaces every problem at once rather than one per restart.