Configuration¶
All configuration is managed through sources.yaml and the Web UI, which is the same file viewed two ways. Changes via the UI persist immediately, no restart needed.
Where does my config live?¶
| Mode | Host path | Path inside container |
|---|---|---|
npx / global install |
~/.observability-mcp/sources.yaml |
— |
| Docker (GHCR image) | any host path you mount | /home/node/.observability-mcp/sources.yaml |
| docker-compose (this repo) | mcp-server/config/sources.yaml |
/app/config/sources.yaml |
| Custom | $CONFIG_PATH |
$CONFIG_PATH |
The Web UI writes to whichever path resolves first: CONFIG_PATH → ./config/sources.yaml → ~/.observability-mcp/sources.yaml.
Environment variables¶
For quick setup without a config file — picked up when sources.yaml does not exist or the corresponding source is absent:
| Variable | Description | Example |
|---|---|---|
PORT |
HTTP port for MCP endpoint and Web UI (default 3000) |
8080 |
PROMETHEUS_URL |
Prometheus URL(s), comma-separated for multiple | http://prom1:9090,http://prom2:9090 |
LOKI_URL |
Loki URL(s), comma-separated for multiple | http://loki1:3100,http://loki2:3100 |
PROMETHEUS_SERVICE_LABELS |
Labels probed for the service filter in metric queries (default job,service,app,service_name) |
service,job |
LOKI_SERVICE_LABELS |
Labels probed for service discovery and log queries (default service_name,service,job,app,container) |
service_name,container,job |
CONFIG_PATH |
Custom path to sources.yaml |
/etc/observability-mcp/sources.yaml |
Example:
PROMETHEUS_URL=http://prom1:9090,http://prom2:9090 \
LOKI_URL=http://loki1:3100 \
PORT=8080 \
npx @thotischner/observability-mcp
${VAR} substitution¶
Placeholders in sources.yaml are expanded from process.env at load time. Both ${VAR} and ${VAR:-default} are supported. Undefined vars without a default produce a warning and an empty string (no crash).
sources:
- name: grafana-cloud-prom
type: prometheus
url: "${GRAFANA_PROM_URL}"
enabled: true
auth:
type: basic
username: "${GRAFANA_PROM_USER}"
password: "${GRAFANA_TOKEN}"
This lets you commit sources.yaml to source control while keeping secrets in a .env file.
Full sources.yaml reference¶
sources:
- name: prometheus # display name, must be unique
type: prometheus # connector type: prometheus | loki
url: http://localhost:9090
enabled: true
auth: # optional, see auth-and-tls.md
type: basic # none | basic | bearer
username: admin
password: secret
tls: # optional, see auth-and-tls.md
caCert: /path/to/ca.pem
clientCert: /path/to/client.pem
clientKey: /path/to/client-key.pem
skipVerify: false
metrics: # optional per-source overrides; merge with defaults by name
- name: cpu
query: 'rate(my_cpu_metric{ {{selector}} }[1m])'
unit: percent
description: Custom CPU query
settings:
checkIntervalMs: 30000 # agent detection loop interval
defaultSensitivity: medium # low | medium | high
healthThresholds:
weights: { errorRate: 0.35, latency: 0.25, cpu: 0.20, logErrors: 0.20 }
cpu: { good: 50, warn: 80, crit: 95 }
errorRate: { good: 0.01, warn: 0.1, crit: 0.5 }
latencyP99: { good: 0.5, warn: 1.0, crit: 3.0 }
logErrors: { good: 1, warn: 5, crit: 20 }
statusBoundaries: { healthy: 80, degraded: 50 }
Per-source metrics overrides merge with the connector's defaults by name. Pin one metric to a custom query without re-listing the rest.