Skip to Content

whatsapp-mcp


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.