-
Notifications
You must be signed in to change notification settings - Fork 178
Expand file tree
/
Copy path.env.example
More file actions
912 lines (815 loc) · 58.4 KB
/
Copy path.env.example
File metadata and controls
912 lines (815 loc) · 58.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
# NetClaw Environment Variables
# Copy this to .env and fill in your values:
# cp .env.example .env
# Device credentials (used by pyATS testbed via %ENV{} syntax)
NETCLAW_USERNAME=admin
NETCLAW_PASSWORD=changeme
NETCLAW_ENABLE_PASSWORD=changeme
# Anthropic API Key (if not using Claude Code CLI auth)
# ANTHROPIC_API_KEY=sk-ant-...
# Token Optimization - Override default model pricing (optional)
# Format: JSON string with model-specific input/output prices per 1M tokens
# NETCLAW_TOKEN_PRICING_OVERRIDE={"claude-opus-4-6": {"input": 5.0, "output": 25.0}}
# pyATS paths (set automatically by install.sh)
# PYATS_TESTBED_PATH=./testbed/testbed.yaml
# PYATS_MCP_SCRIPT=./mcp-servers/pyATS_MCP/pyats_mcp_server.py
# GitHub MCP (Personal Access Token)
# GITHUB_PERSONAL_ACCESS_TOKEN=ghp_...
# Packet Buddy MCP (pcap analysis)
# PACKET_BUDDY_MCP_SCRIPT=./mcp-servers/packet-buddy-mcp/server.py
# PCAP_UPLOAD_DIR=/tmp/netclaw-pcaps
# NetBox (DCIM/IPAM source of truth)
# NETBOX_URL=https://netbox.example.com
# NETBOX_TOKEN=your_netbox_api_token
# Nautobot (alternative to NetBox for IPAM/DCIM source of truth)
# NAUTOBOT_URL=https://nautobot.example.com
# NAUTOBOT_TOKEN=your_nautobot_api_token
# OpsMill Infrahub (schema-driven infrastructure source of truth)
# INFRAHUB_ADDRESS=http://infrahub.example.com:8000
# INFRAHUB_API_TOKEN=your_infrahub_api_token
# Itential Automation Platform (65+ tools: config mgmt, compliance, workflows, golden config)
# ITENTIAL_MCP_PLATFORM_HOST=itential.example.com
# ITENTIAL_MCP_PLATFORM_USER=admin
# ITENTIAL_MCP_PLATFORM_PASSWORD=changeme
# ITENTIAL_MCP_PLATFORM_PORT=443
# ITENTIAL_MCP_PLATFORM_TIMEOUT=30
# Cisco Modeling Labs (CML) MCP
# CML_URL=https://cml.example.com
# CML_USERNAME=admin
# CML_PASSWORD=changeme
# CML_VERIFY_SSL=true
# Cisco NSO MCP (Network Services Orchestrator)
# NSO_SCHEME=https
# NSO_ADDRESS=sandbox-nso-1.cisco.com
# NSO_PORT=443
# NSO_USERNAME=admin
# NSO_PASSWORD=changeme
# NSO_VERIFY=true
# NSO_TIMEOUT=10
# AWS Cloud (IAM credentials for 6 AWS MCP servers)
# AWS_ACCESS_KEY_ID=AKIA...
# AWS_SECRET_ACCESS_KEY=wJalr...
# AWS_REGION=us-east-1
# Or use a named profile instead:
# AWS_PROFILE=my-profile
# Google Cloud Platform (4 GCP remote MCP servers)
# GCP_PROJECT_ID=my-project-123
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
# Or use gcloud auth instead: gcloud auth application-default login
# Azure Network MCP (19 tools: VNets, NSGs, ExpressRoute, VPN, Firewall, LB, DNS)
# Create service principal: az ad sp create-for-rbac --name "netclaw-reader" --role "Reader" --scopes /subscriptions/<sub-id>
# AZURE_TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# AZURE_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# AZURE_CLIENT_SECRET=your-client-secret-value
# AZURE_SUBSCRIPTION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Cisco Meraki — official remote MCP (494 read-only Dashboard capabilities, 2 tools)
# Use a READ-ONLY dashboard key: Dashboard > My Profile > API access.
# Org and network IDs are discovered at runtime (getOrganizations), not configured here.
# Writes are structurally absent upstream, so there is no read-only toggle to set.
# MERAKI_DASHBOARD_API_KEY=your_read_only_api_key_here
# Cisco ThousandEyes (community + official MCP servers)
# TE_TOKEN=your_oauth_bearer_token_here
# Cisco RADKit (cloud-relayed remote device access)
# RADKIT_IDENTITY=user@example.com
# RADKIT_DEFAULT_SERVICE_SERIAL=your_service_serial
# For container/CI deployment (base64-encoded credentials):
# RADKIT_CERT_B64=base64_encoded_certificate
# RADKIT_KEY_B64=base64_encoded_private_key
# RADKIT_CA_B64=base64_encoded_ca_chain
# RADKIT_KEY_PASSWORD_B64=base64_encoded_password
# Juniper JunOS (PyEZ/NETCONF device automation — 10 tools)
# JUNOS_DEVICES_FILE=devices.json # Path to device inventory JSON
# JUNOS_TIMEOUT=360 # Default command timeout in seconds
# Juniper Mist (spec 095 / R5 — measured, NOT yet registered; see specs/095-juniper-mist/)
# MIST_API_HOST=api.mist.com # Regional cloud: api.eu / api.gc1 / api.ac5 ... — a wrong
# # region 401s identically to a bad token. Take it from the
# # manage.<region>.mist.com URL you log in to.
# MIST_ORG_ID=00000000-0000-0000-0000-000000000000 # Org UUID (the org NAME is not usable by the API)
# MIST_API_TOKEN=your_observer_role_org_token # Observer role — an admin token holds write reach
# Arista ANTA validation (spec 098 / R25 — 4 tools, 208 tests, read-only, own venv)
# Verdicts are pass/fail/not_applicable/skipped/error. A test for a feature the device does
# not run reports not_applicable, NEVER a failure. No health percentage is ever emitted.
# ANTA_USERNAME=admin # EOS device credentials — environment only, never tool args
# ANTA_PASSWORD=your_device_password
# ANTA_ENABLE_PASSWORD= # Optional, if tests need enable mode
# ANTA_VERIFY_TLS=false # Lab switches ship self-signed certs; always DISCLOSED in output
# ANTA_TIMEOUT=30 # Per-device timeout in seconds
# Elasticsearch Logs (adopted Elastic MCP, 5 tools, read-only — spec 096)
# ES_URL is resolved INSIDE the container: a cluster on this host is host.docker.internal,
# NOT localhost. Counting via ESQL or track_total_hits — a bare search total caps at 10,000.
# ES_URL=http://host.docker.internal:9200 # Local cluster; remote: https://<host>:9243
# ES_API_KEY=your_read_only_api_key # Preferred; grant read + view_index_metadata only
# ES_USERNAME=elastic # Basic-auth alternative to ES_API_KEY
# ES_PASSWORD=your_password
# ES_SSL_SKIP_VERIFY=false # true only for lab clusters with self-signed certs
# Arista CloudVision Portal (CVP) — inventory, events, connectivity, tags (4 tools)
# CVP=www.arista.io # CloudVision hostname (no https://)
# CVPTOKEN=your_service_account_token # Service account token from CVP Settings
# UML MCP (27+ diagram types via Kroki rendering)
# KROKI_SERVER=https://kroki.io # Default: public Kroki; set to local instance for sensitive data
# PLANTUML_SERVER=http://localhost:8080 # Optional: local PlantUML server
# MCP_OUTPUT_DIR=./output # Diagram output directory
# Protocol Participation (BGP + OSPF + GRE — live control-plane peering)
# NETCLAW_ROUTER_ID=4.4.4.4 # BGP/OSPF router ID
# NETCLAW_LOCAL_AS=65001 # BGP local AS number
# NETCLAW_BGP_PEERS=[{"ip":"172.16.0.1","as":65000}] # JSON array of BGP peers
# NETCLAW_OSPF_AREAS=["0.0.0.0"] # JSON array of OSPF area IDs
# NETCLAW_GRE_TUNNELS=[{"name":"gre-netclaw","local":"10.0.100.100","remote":"10.0.100.1","inside_local":"172.16.0.2/30"}]
# NETCLAW_LAB_MODE=true # Relaxes ServiceNow CR requirement for lab
# NetClaw-to-NetClaw (N2N) Federation (feature 052) — capability exchange,
# remote tool/skill invocation, and claw-to-claw chat over the existing BGP mesh.
# N2N_ENABLED=false # Master switch for the federation layer
# N2N_DISPLAY_NAME= # Operator display name in n2n/hello (default: hostname)
# N2N_DAILY_REQUESTS=200 # Default per-peer daily request budget
# N2N_DAILY_TOKENS=500000 # Default per-peer daily token budget
# N2N_RATE_PER_MIN=10 # Default per-peer requests/minute
# N2N_APPROVAL_WINDOW_S=900 # Human-approval expiry window (seconds)
# N2N_INVENTORY_REFRESH_S=21600 # Periodic inventory re-advertisement (seconds)
# N2N_TOOL_TIMEOUT_S=120 # Remote tool invocation timeout (seconds)
# N2N_SKILL_TIMEOUT_S=600 # Delegated skill task timeout (seconds)
# N2N_CHAT_IDLE_TIMEOUT_S=300 # Chat session idle close (seconds)
# N2N Ergonomics & Reliability (feature 053)
# N2N_TASK_RETENTION_S=3600 # Completed delegated-task result retention (seconds)
# N2N_TASK_POLL_S=15 # Requester-side task status poll cadence (seconds)
# N2N_RECONNECT_BACKOFF_MIN_S=5 # Channel auto-reconnect backoff floor (seconds)
# N2N_RECONNECT_BACKOFF_MAX_S=60 # Channel auto-reconnect backoff cap (seconds)
# N2N_RECONNECT_UNREACHABLE_AFTER=5 # Consecutive reconnect failures before "unreachable" display
# ── Dead-peer log dampening (feature 100) ──────────────────────────────────────
# A permanently-unreachable peer used to be re-dialled every 60s forever, one WARNING
# per attempt — 23,366 log lines in 7 days, which buried the inbound calls that matter.
# These bound that volume WITHOUT delaying any peer that is only transiently down:
# escalation requires BOTH many consecutive failures AND a stale endpoint.
# N2N_RECONNECT_DAMPEN=1 # 0 = full bypass: per-attempt WARNING + flat 60s ceiling (pre-100 behavior)
# N2N_RECONNECT_DEAD_CEILING_S=900 # Retry ceiling for a durably-dead peer (15 min)
# N2N_RECONNECT_DEAD_AFTER=20 # Consecutive failures before a peer is ELIGIBLE for the escalated ceiling
# N2N_RECONNECT_ENDPOINT_STALE_S=86400 # Endpoint older than this counts as stale (second required signal)
# N2N_RECONNECT_SUMMARY_INTERVAL_S=300 # Cadence of the collapsed failure summary (also probe summaries)
# N2N_RECONNECT_STABLE_AFTER_S=120 # Uptime required before dampening clears — a flapping peer stays dampened
# iN2N — Internal NetClaw Federation (feature 056): a "risk" of focused claws
# behind one Border. Members dial the Border outbound; no ngrok, no public mesh.
# N2N_ROLE=standalone # standalone | border | member (default standalone = risk of one)
# N2N_RISK_NAME= # the risk's name (border/member roles)
# N2N_RISK_DESCRIPTION= # the risk's description
# N2N_ENABLED_STACKS=en2n # border only: en2n | in2n | both
# N2N_IN2N_PORT= # border only: optional dedicated iN2N listener port
# N2N_BORDER_ENDPOINT= # member only: host:port to dial the Border outbound
# N2N_QUARANTINE_THRESHOLD=5 # consecutive member auth/health failures before auto-quarantine
# N2N_EDGE_WS_PORT= # border only: WebSocket listener port for NetClaw Mobile
# # edge nodes (feature 066) — TLS via the same domain-verified
# # or self-signed host credential as eN2N/iN2N (host_credential())
# Push-notification fallback for a disconnected edge node (feature 066, US3) — only
# needed if you want delivery to a backgrounded/offline phone; connected-phone push
# (n2n_notify_phone while the app is foregrounded) works without any of these.
# FCM_SERVICE_ACCOUNT_JSON= # path to a Firebase service account JSON
# # (Firebase console > Project settings >
# # Service accounts > Generate new private key)
# APNS_KEY_PATH= # path to the APNs auth key (.p8) from your
# # Apple Developer account (Certificates, IDs &
# # Profiles > Keys)
# APNS_KEY_ID= # the .p8 key's Key ID
# APNS_TEAM_ID= # your Apple Developer Team ID
# APNS_BUNDLE_ID= # the app's bundle identifier (apns-topic)
# APNS_USE_SANDBOX= # 1/true to use api.sandbox.push.apple.com (dev builds)
# --- iN2N production enforcement + durable runtime (feature 057) ---
# N2N_RISK_MODE=testing # testing (guards off) | production (enforce: OpenShell sandbox + DefenseClaw guard + GAIT audit, fail-closed)
# N2N_STRICT_ALL= # set 1/true to block delegations on ANY missing control, incl. audit (default: audit gap warns, containment gap blocks)
# N2N_GAIT_DIR=~/.openclaw/n2n/gait # immutable GAIT git audit trail location (unbounded; git gc only)
# DEFENSECLAW_GUARD_PORT=4000 # DefenseClaw LLM guardrail proxy port (model-guard)
# Production model-guard requires the DefenseClaw guardrail sidecar running:
# defenseclaw setup guardrail --mode action # patches OpenClaw to route model I/O through the proxy
# defenseclaw-gateway start # start the proxy (:4000) + tool-policy sidecar
# The member sandbox is host-level systemd confinement (no extra config; applied by
# scripts/in2n-services.py). OpenShell is NOT required for the member sandbox.
# --- Claw certification: TLS channel security + cert rotation (feature 060) ---
# N2N_CERT_MODE=off # off | on (TLS + channel-bound mutual auth) | enforce (also refuse cleartext eN2N)
# Domain-verified identity (optional — pinned/TOFU model needs none of this):
# N2N_CLAW_DOMAIN= # e.g. netclaw.automateyournetwork.ca (a name you control; need not resolve)
# N2N_ACME_DNS_PROVIDER= # lego DNS provider id: godaddy | cloudflare | route53 | acme-dns | ...
# N2N_ACME_EMAIL= # ACME account contact address
# N2N_ACME_STAGING= # 1/true to use Let's Encrypt staging (testing)
# N2N_LEGO_BIN=~/.openclaw/n2n/bin/lego # path to the lego ACME client (installed by scripts/lib/fetch-lego.sh)
# Provider credentials per lego's convention, e.g.:
# GODADDY_API_KEY= / GODADDY_API_SECRET= # GoDaddy (needs production API access; else use acme-dns delegation)
# CLOUDFLARE_DNS_API_TOKEN= # Cloudflare (zone-scoped token)
# ACME_DNS_API_BASE= / ACME_DNS_STORAGE_PATH= # acme-dns delegation (universal fallback: one CNAME, then automatic)
# Rotation tunables (defaults shown):
# N2N_CERT_RENEW_FRACTION=0.667 # renew at 2/3 of lifetime elapsed (~30d left on a 90d cert)
# N2N_CERT_MEMBER_DAYS=90 # hub + member leaf lifetime
# N2N_CERT_CA_DAYS=730 # risk CA anchor lifetime (~2y)
# N2N_CERT_RENEW_CHECK_S=3600 # renewal scheduler check cadence
# --- NCFED wire hardening (feature 063) ---
# Endpoint persistence (P1) is automatic — a successful dial now remembers the peer's
# address so the supervisor auto-reconnects; no config needed.
# N2N_PQ_MODE=opportunistic # opportunistic (offer PQ hybrid where the stack supports it,
# # accept classical fallback) | require (hard-refuse classical).
# # 'require' FAILS FAST at startup on a stack without PQ
# # (needs OpenSSL >= 3.5 / Python >= 3.13 for X25519MLKEM768).
# Mesh-layer TLS (P2) is a coordinated flag day, gated by the SAME N2N_CERT_MODE flag
# as the eN2N channel (enforce = require mesh TLS + refuse un-upgraded mesh peers).
# Enable on ALL mesh peers together, exactly like the 060 rollout.
# --- Cloudflare Tunnel transport (feature 108) ---
# N2N_TRANSPORT_HEALTH_CHECK=true # Controls whether the daemon performs the local Cloudflare
# # Tunnel / DNS health probe (data-model.md §2). When disabled,
# # `local_transport_healthy` reports `n/a` without attempting
# # any check. Operators who never adopt Cloudflare Tunnel can
# # leave this at the default (enabled) — the probe is a no-op
# # when no peer uses transport=cloudflare_tunnel.
# # Values: true | false (default: true)
# --- Chroma-to-chroma vector replication (feature 065) ---
# N2N_REPLICATION_MAX_CHUNKS=20000 # max chunks a single replication/re-sync
# # will transfer; a source collection over
# # this is refused before any batch is sent
# N2N_REPLICATION_BATCH_SIZE=200 # chunks requested per replicate_batch call
# ContainerLab (containerized network labs via API)
# CLAB_API_SERVER_URL=http://localhost:8080 # ContainerLab API server URL
# CLAB_API_USERNAME=netclaw # Linux user on ContainerLab host (PAM auth)
# CLAB_API_PASSWORD=changeme # Linux user password
# Cisco SD-WAN (vManage read-only monitoring — 12 tools)
# VMANAGE_IP=10.10.10.1 # vManage IP or hostname
# VMANAGE_USERNAME=admin # vManage username
# VMANAGE_PASSWORD=changeme # vManage password
# Grafana (observability platform — 75+ tools: dashboards, Prometheus, Loki, alerting, incidents, OnCall)
# GRAFANA_URL=http://grafana.example.com:3000 # Grafana instance URL
# GRAFANA_SERVICE_ACCOUNT_TOKEN=glsa_abc123... # Service account token (preferred auth)
# GRAFANA_USERNAME=admin # Alternative: basic auth username
# GRAFANA_PASSWORD=changeme # Alternative: basic auth password
# GRAFANA_ORG_ID=1 # Optional: organization ID for multi-org setups
# Prometheus (direct PromQL queries — 6 tools: instant/range queries, metric discovery, targets, health)
# PROMETHEUS_URL=http://prometheus:9090 # Prometheus server endpoint
# PROMETHEUS_USERNAME=admin # Optional: basic auth username
# PROMETHEUS_PASSWORD=changeme # Optional: basic auth password
# PROMETHEUS_TOKEN=eyJhbG... # Optional: bearer token (Grafana Cloud, Thanos, Cortex)
# PROMETHEUS_URL_SSL_VERIFY=true # Optional: set false for self-signed certs
# PROMETHEUS_REQUEST_TIMEOUT=30 # Optional: request timeout in seconds
# PROMETHEUS_DISABLE_LINKS=true # Optional: disable UI links (saves context window)
# Kubeshark (Kubernetes L4/L7 traffic analysis — 6 tools: capture, pcap export, snapshots, flows, TLS decryption)
# KUBESHARK_MCP_URL=http://localhost:8898/mcp # Kubeshark MCP endpoint (requires Kubeshark in K8s cluster)
# KUBESHARK_MCP_PORT=8898 # Optional: MCP server port (default: 8898)
# TTS (edge-tts voice synthesis — 2 tools: text_to_speech, list_voices)
# TTS_MCP_SCRIPT=./mcp-servers/tts-mcp/server.py
# TTS_DEFAULT_VOICE=en-US-GuyNeural # Optional: override default voice
# TTS_OUTPUT_DIR=/tmp/netclaw-tts # Optional: override MP3 output directory
# Cisco WebEx (Bidirectional: inbound @mentions + outbound alerts/reports/incidents)
# Bot token from https://developer.webex.com/my-apps (long-lived, does not expire)
# WEBEX_BOT_TOKEN=your_bot_access_token_here
# Room/space IDs for outbound message routing (use same ID for all, or separate spaces)
# WEBEX_ALERTS_ROOM_ID=your_alerts_space_id
# WEBEX_REPORTS_ROOM_ID=your_reports_space_id
# WEBEX_INCIDENTS_ROOM_ID=your_incidents_space_id
# Webhook URL for inbound messages — must point to {base_url}/webhooks/webex/default
# Development: use ngrok (ngrok http 18789) to get a public HTTPS URL
# Production: use your public HTTPS domain
# WEBEX_WEBHOOK_URL=https://your-domain.com/webhooks/webex/default
# Optional: HMAC-SHA1 secret for webhook signature verification (recommended for production)
# WEBEX_WEBHOOK_SECRET=your_webhook_secret
# SuzieQ (Network Observability — 5 read-only tools: show, summarize, assert, unique, path)
# SUZIEQ_API_URL=http://suzieq-host:8000 # SuzieQ REST API base URL
# SUZIEQ_API_KEY=your_suzieq_api_key # SuzieQ REST API access token
# SUZIEQ_VERIFY_SSL=true # Verify SSL certificates (default: true)
# SUZIEQ_TIMEOUT=30 # Query timeout in seconds (default: 30)
# Batfish (network configuration analysis via Docker container)
# BATFISH_HOST=localhost # Batfish service hostname or IP
# BATFISH_PORT=9997 # Batfish coordinator port
# BATFISH_NETWORK=netclaw # Default Batfish network name
# Cisco FMC (Secure Firewall Management Center)
# FMC_BASE_URL=https://fmc.example.com
# FMC_USERNAME=api-user
# FMC_PASSWORD=changeme
# FMC_VERIFY_SSL=false
# FMC_PROFILES_DIR=./profiles # Optional: multi-FMC profile directory
# FMC_PROFILE_DEFAULT=dc-east # Optional: default FMC profile
# gNMI Streaming Telemetry MCP Server (10 tools: Get, Set, Subscribe, Capabilities, Browse, Compare)
# GNMI_TARGETS=[{"name":"router1","host":"10.1.1.1","port":57400,"username":"admin","password":"changeme","vendor":"cisco-iosxr"}]
# GNMI_TLS_CA_CERT=/path/to/ca.pem # CA certificate for TLS server verification
# GNMI_TLS_CLIENT_CERT=/path/to/client.pem # Client certificate for mTLS (optional)
# GNMI_TLS_CLIENT_KEY=/path/to/client.key # Client private key for mTLS (optional)
# GNMI_TLS_SKIP_VERIFY=false # Skip TLS verification (lab mode only)
# GNMI_DEFAULT_PORT=6030 # Override default gNMI port
# GNMI_MAX_RESPONSE_SIZE=1048576 # Response truncation threshold in bytes (default 1MB)
# GNMI_MAX_SUBSCRIPTIONS=50 # Max concurrent telemetry subscriptions (default 50)
# Canvas/A2UI Network Visualization (inline chat visualizations — no new credentials needed)
# This skill uses existing MCP server connections (pyATS, Grafana, Prometheus, ServiceNow, SuzieQ).
# No additional environment variables are required.
# The skill auto-discovers available data sources at visualization time.
# GitLab MCP (98+ tools: issues, merge requests, pipelines, repos, wikis, labels, milestones, releases)
# Community server: @zereight/mcp-gitlab via npx (any GitLab tier, SaaS or self-hosted)
# PAT scopes: "api" for full access, "read_api" for read-only
# GITLAB_PERSONAL_ACCESS_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
# GITLAB_API_URL=https://gitlab.com # Override for self-hosted: https://gitlab.example.com
# GITLAB_READ_ONLY_MODE=false # Set true to restrict to read-only operations
# Jenkins MCP (16 tools: jobs, builds, pipelines, SCM, system health)
# Official Jenkins plugin — runs natively inside Jenkins via Streamable HTTP
# Requires: Jenkins 2.533+ with MCP Server plugin v0.158+ installed
# Auth: HTTP Basic with API token (User → Configure → API Token in Jenkins)
# JENKINS_URL=https://jenkins.example.com
# JENKINS_USERNAME=your-username
# JENKINS_API_TOKEN=your-api-token
# JENKINS_AUTH_BASE64= # Base64 of "username:api_token" — generate: echo -n "$JENKINS_USERNAME:$JENKINS_API_TOKEN" | base64
# Atlassian MCP (72 tools: Jira issues, transitions, comments, projects, links; Confluence pages, comments, spaces)
# Community server: mcp-atlassian by sooperset via uvx (Cloud + Server/DC support)
# Atlassian Cloud: API token from https://id.atlassian.com/manage-profile/security/api-tokens
# Server/DC: Personal Access Token from Profile → Personal Access Tokens
# At least one product (Jira or Confluence) must be configured
# JIRA_URL=https://your-domain.atlassian.net
# JIRA_USERNAME=your-email@example.com
# JIRA_API_TOKEN=your-api-token
# CONFLUENCE_URL=https://your-domain.atlassian.net/wiki
# CONFLUENCE_USERNAME=your-email@example.com
# CONFLUENCE_API_TOKEN=your-api-token
# GNS3 Network Lab Management (26 tools: projects, nodes, links, captures, snapshots)
# Lab-only operations — no ServiceNow CR gating required
# GNS3_URL=http://localhost:3080 # GNS3 server URL (REST API v3)
# GNS3_USER=admin # GNS3 username
# GNS3_PASSWORD=changeme # GNS3 password
# GNS3_VERIFY_SSL=true # Verify SSL certificates (default: true)
# GNS3_TOKEN_TTL=3000 # Token cache TTL in seconds (default: 50 min)
# Palo Alto Networks Prisma SD-WAN (15+ tools: sites, elements, topology, status, alarms, config)
# Read-only visibility into Prisma SD-WAN fabric — no ServiceNow CR gating required
# Service account from Prisma Access/SASE portal with SD-WAN API permissions
# PAN_CLIENT_ID=name@tsg.iam.panserviceaccount.com # Service account client ID
# PAN_CLIENT_SECRET=your-secret-key # Service account secret
# PAN_TSG_ID=your-tenant-service-group-id # Tenant Service Group ID
# PAN_REGION=americas # API region: americas (default) or europe
# Datadog MCP Server (16+ tools: logs, metrics, incidents, APM, dashboards)
# Full observability stack with all optional toolsets (apm, error_tracking, feature_flags, dbm, security, llm_observability)
# API keys from https://app.datadoghq.com/organization-settings/api-keys
# DD_API_KEY=your_datadog_api_key # Datadog API key (required)
# DD_APP_KEY=your_datadog_app_key # Datadog application key (required)
# DD_SITE=datadoghq.com # Datadog site (datadoghq.eu for EU customers)
# PagerDuty MCP Server (70 tools: incidents, on-call, services, event orchestration)
# Full incident management with read/write operations (--enable-write-tools)
# API token from https://support.pagerduty.com/docs/api-access-keys
# PAGERDUTY_USER_API_KEY=your_pagerduty_api_token # PagerDuty User API key (required)
# PAGERDUTY_API_HOST=https://api.pagerduty.com # API host (https://api.eu.pagerduty.com for EU)
# Splunk MCP Server (30 tools: search, indexes, saved searches, alerts)
# Full Splunk Enterprise/Cloud integration with SPL queries
# SPLUNK_HOST=https://splunk.example.com:8089 # Splunk management port (required)
# SPLUNK_TOKEN=your_splunk_token # Splunk authentication token (required)
# SPLUNK_VERIFY_SSL=true # Verify SSL certificates (default: true)
# HashiCorp Terraform Cloud MCP Server (40+ tools: workspaces, runs, state, variables)
# Terraform Cloud/Enterprise integration with workspace management
# TFC_TOKEN=your_terraform_cloud_token # Terraform Cloud API token (required)
# TFC_ORG=your-organization # Terraform Cloud organization name (required)
# TFC_HOST=app.terraform.io # Terraform Cloud host (default: app.terraform.io)
# HashiCorp Vault MCP Server (35+ tools: secrets, PKI, auth, transit)
# Secrets management with multiple auth methods and secret engines
# VAULT_ADDR=https://vault.example.com:8200 # Vault server address (required)
# VAULT_TOKEN=your_vault_token # Vault authentication token (required for token auth)
# VAULT_NAMESPACE=admin # Vault namespace (Enterprise only)
# Zscaler MCP Server (300+ tools: ZIA, ZPA, ZDX, identity, insights)
# Complete Zscaler security platform integration (Zero Trust)
# Create API keys in Zscaler admin portal (ZIA/ZPA)
# ZSCALER_ZIA_API_KEY=your_zia_api_key # ZIA API key
# ZSCALER_ZIA_USERNAME=admin@example.com # ZIA admin username
# ZSCALER_ZIA_PASSWORD=your_password # ZIA admin password
# ZSCALER_ZIA_CLOUD=zscaler.net # ZIA cloud (zscaler.net, zscalerone.net, etc.)
# ZSCALER_ZPA_CLIENT_ID=your_client_id # ZPA API client ID
# ZSCALER_ZPA_CLIENT_SECRET=your_client_secret # ZPA API client secret
# ZSCALER_ZPA_CUSTOMER_ID=your_customer_id # ZPA customer ID
# Cloudflare MCP Server (5 remote servers: DNS, security, Zero Trust, analytics, Workers)
# Domain-specific remote MCP servers for complete Cloudflare platform coverage
# API token from https://dash.cloudflare.com/profile/api-tokens
# CLOUDFLARE_API_TOKEN=your_cloudflare_api_token # Cloudflare API token (required)
# CLOUDFLARE_ACCOUNT_ID=your_account_id # Cloudflare account ID (required)
# CLOUDFLARE_ZONE_ID=your_zone_id # Default zone ID (optional)
# Blender MCP Server (3D Network Topology Visualization)
# Community server: blender-mcp via uvx (requires Blender on Windows with addon)
# Addon: https://github.com/ahujasid/blender-mcp
# BLENDER_HOST= # Windows host IP (WSL: cat /etc/resolv.conf | grep nameserver)
# BLENDER_PORT=9876 # Blender addon socket port (default: 9876)
# Aruba CX MCP Server (16 tools: 11 read-only, 5 write for HPE Aruba CX switches)
# Community server: https://github.com/slientnight/aruba-cx-mcp-server
# Read: system info, interfaces, VLANs, configs, routing, LLDP, MAC table, DOM, ISSU, firmware, VSF
# Write: interface config, VLAN management, config save, ISSU upgrade, firmware (requires ITSM CR)
# ARUBA_CX_TARGETS='[{"name":"switch1","host":"10.1.1.1","username":"admin","password":"secret"}]'
# ARUBA_CX_CONFIG=/path/to/aruba-cx-config.json # Alternative: config file path
# ARUBA_CX_TIMEOUT=30 # Request timeout in seconds (default: 30)
# ITSM_ENABLED=false # Enable ServiceNow CR gating for write ops
# ITSM_LAB_MODE=false # Validate CR format without ServiceNow call
# MemPalace AI Memory (19 tools: palace read/write, knowledge graph, navigation, agent diary)
# Persistent, structured, local-only memory across sessions — no API keys required
# Source: https://github.com/milla-jovovich/mempalace
# MEMPALACE_MCP_SCRIPT=./mcp-servers/mempalace/mempalace/mcp_server.py
# ═══════════════════════════════════════════════════════════════════════════════
# Check Point Security Platform (15 MCP servers: policy, threat intel, gateway, SASE)
# Official Check Point MCPs from https://github.com/CheckPointSW/mcp-servers
# ═══════════════════════════════════════════════════════════════════════════════
# Management Server (on-premises) — required for policy, logs, threat prevention MCPs
# CHKP_MGMT_HOST=192.168.1.100 # Management server IP/hostname
# CHKP_MGMT_PORT=443 # Web API port (default: 443)
# CHKP_MGMT_API_KEY=your-api-key-here # API key auth (preferred)
# Alternative: username/password authentication
# CHKP_MGMT_USERNAME=admin # Management username
# CHKP_MGMT_PASSWORD=your-password # Management password
# CHKP_MGMT_DOMAIN= # Domain name (MDS deployments only)
# Smart-1 Cloud (alternative to on-prem management)
# CHKP_S1C_API_KEY=your-smart1-cloud-key # Smart-1 Cloud API key
# CHKP_S1C_URL=https://your-tenant.maas.checkpoint.com # Smart-1 Cloud Web-API URL
# Harmony SASE — cloud-delivered security for distributed networks
# CHKP_SASE_API_KEY=your-sase-api-key # Harmony SASE API key
# CHKP_SASE_MGMT_HOST=https://api.us1.sase.checkpoint.com/api # SASE management endpoint
# CHKP_SASE_ORIGIN=https://your-tenant.sase.checkpoint.com # SASE origin domain
# Reputation Service — IP/URL/file threat intelligence lookups
# Contact TCAPI_SUPPORT@checkpoint.com for API key
# CHKP_REPUTATION_API_KEY=your-reputation-api-key # Reputation Service API key
# Threat Emulation — cloud sandboxing for malware analysis
# CHKP_TE_API_KEY=your-threat-emulation-key # Threat Emulation API key
# Spark Management — MSP-oriented distributed firewall management
# Authenticates via Infinity Portal (client_id / secret_key), NOT a bare API key.
# CHKP_SPARK_CLIENT_ID=your-spark-client-id # Infinity Portal client ID (required)
# CHKP_SPARK_SECRET_KEY=your-spark-secret-key # Infinity Portal secret key (required)
# CHKP_SPARK_INFINITY_PORTAL_URL=https://cloudinfra-gw.portal.checkpoint.com # Portal URL (required)
# CHKP_SPARK_REGION= # Portal region (optional)
# Documentation Tool — Check Point Documentation Tool API
# Authenticates via Infinity Portal (client_id / secret_key + auth URL).
# CHKP_DOCS_CLIENT_ID=your-docs-client-id # Infinity Portal client ID (required)
# CHKP_DOCS_SECRET_KEY=your-docs-secret-key # Infinity Portal secret key (required)
# CHKP_DOCS_AUTH_URL=https://cloudinfra-gw.portal.checkpoint.com/auth/external # Auth URL (required)
# CHKP_DOCS_REGION= # Portal region (optional)
# Argos ERM — exposure and risk management platform
# Authenticates via its own server URL + integration token, NOT a bare API key.
# CHKP_ARGOS_SERVER_URL=https://your-argos-server # Argos server URL (required)
# CHKP_ARGOS_INTEGRATION_TOKEN=your-argos-token # Argos integration token (required)
# CHKP_ARGOS_CUSTOMER_ID= # Argos customer ID (optional)
# Gaia OS — networking/routing on a gateway; uses interactive dialog auth (prompts
# for gateway IP/user/password per call, cached ~15 min). No credential env vars.
# CHKP_GAIA_VERBOSE=false # Verbose logging (optional)
# Global Settings
# CHKP_TELEMETRY_DISABLED=true # Disable Check Point telemetry
# CHKP_LOG_LEVEL=standard # minimal|standard|verbose (query logging)
# ═══════════════════════════════════════════════════════════════════════════════
# IP Fabric Network Assurance Platform (10 MCP tools: health, path analysis, diagrams)
# Official IP Fabric MCP Server built into IP Fabric appliances
# Documentation: https://docs.ipfabric.io/latest/IP_Fabric_Settings/integration/mcp/
# Developed in collaboration with Daren Fulwell (Field CTO, IP Fabric)
# ═══════════════════════════════════════════════════════════════════════════════
# IP Fabric Appliance Connection
# IPFABRIC_HOST=https://ipfabric.example.com # IP Fabric appliance URL (no trailing slash)
# IPFABRIC_API_TOKEN=your-api-token-here # API token from IP Fabric UI → Settings → API Tokens
# Token RBAC permissions determine accessible data:
# - Read-only token: health, path lookups, inventory queries
# - Full access token: all capabilities including intent configuration
# Twitter/X MCP Server (9 tools: tweet posting, threads, heartbeat, deduplication)
# Free tier: one-way broadcast only (post tweets, no reading mentions)
# Create app at https://developer.twitter.com/en/portal/dashboard
# Required: OAuth 1.0a User Context credentials (for posting on behalf of user)
# TWITTER_API_KEY=your_consumer_api_key # Consumer Key (API Key)
# TWITTER_API_SECRET=your_consumer_api_secret # Consumer Secret (API Secret)
# TWITTER_ACCESS_TOKEN=your_access_token # Access Token for @John_Capobianco
# TWITTER_ACCESS_SECRET=your_access_token_secret # Access Token Secret
# TWITTER_HEARTBEAT_ENABLED=false # Enable autonomous tweets (default: false)
# TWITTER_HEARTBEAT_INTERVAL=14400 # Seconds between heartbeats (default: 4 hours)
# TWITTER_MENTION_POLL_INTERVAL=300 # Seconds between mention checks (default: 5 minutes)
# TWITTER_OAUTH2_TOKEN=your_oauth2_bearer_token # OAuth 2.0 token for reading mentions (pay-as-you-go)
# Claroty xDome MCP Server (21 tools: 15 read + 6 ITSM-gated writes)
# OT / IoT / IoMT visibility, vulnerability triage, alert response, Purdue Model classification
# Token: Admin Settings > User Management in xDome dashboard
# Reuses NETCLAW_LAB_MODE for ITSM-gate bypass — do NOT introduce a CLAROTY_LAB_MODE
# CLAROTY_API_URL=https://api.medigate.io # xDome base URL (default: Claroty SaaS)
# CLAROTY_API_TOKEN=your-bearer-token-here # Required Bearer token
# CLAROTY_VERIFY_SSL=true # Verify TLS certificates (default: true)
# CLAROTY_TIMEOUT=30 # Per-request timeout in seconds
# CLAROTY_RATE_LIMIT_PER_MIN=2000 # Sliding-window cap (xDome upstream is 2000/min/endpoint)
# Twitter/X Integration (OAuth 1.0a for posting, OAuth 2.0 for reading)
# Get these from https://developer.twitter.com/en/portal/projects-and-apps
# TWITTER_API_KEY=your_api_key
# TWITTER_API_SECRET=your_api_secret
# TWITTER_ACCESS_TOKEN=your_access_token
# TWITTER_ACCESS_SECRET=your_access_secret
# OAuth 2.0 with auto-refresh (for reading mentions - required for pay-as-you-go)
# Get from Developer Portal -> Your App -> Keys and Tokens -> OAuth 2.0
# TWITTER_CLIENT_ID=your_client_id
# TWITTER_CLIENT_SECRET=your_client_secret
# TWITTER_OAUTH2_ACCESS_TOKEN=your_oauth2_access_token
# TWITTER_OAUTH2_REFRESH_TOKEN=your_oauth2_refresh_token
# Twitter Heartbeat settings
# TWITTER_HEARTBEAT_ENABLED=false
# TWITTER_HEARTBEAT_INTERVAL=14400
# TWITTER_MENTION_POLL_INTERVAL=300
# Twilio Voice MCP Server (6 tools: emergency calls, on-demand calls, inbound conversations)
# Bidirectional voice calling for emergency alerts, status updates, and voice commands
# Get credentials from https://console.twilio.com (Account → API Keys)
# TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Account SID (starts with AC)
# TWILIO_API_KEY_SID=SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # API Key SID (starts with SK)
# TWILIO_API_SECRET=your_api_secret # API Key Secret
# TWILIO_PHONE_NUMBER=+1XXXXXXXXXX # Twilio phone number for inbound calls
# TWILIO_WEBHOOK_URL=https://your-domain/webhooks/twilio/voice # Public webhook URL (ngrok/Tailscale)
# Unreal Engine 5.8 MCP Server (3D Network Topology Visualization)
# Built-in UE5.8 MCP plugin — no external dependencies required
# Enable plugin: Edit > Plugins > "Unreal MCP" (or "ModelContextProtocol")
# Auto-starts on editor launch or manually: ModelContextProtocol.StartServer in console
# UE5_MCP_URL=http://127.0.0.1:8000/mcp # UE5 MCP server endpoint (default: localhost:8000)
# Sketchfab MCP Server (3D model search/download for real-stencil mode, spec 046)
# Get an API token from https://sketchfab.com/settings/password (API Tokens section)
# SKETCHFAB_API_KEY=your_sketchfab_api_token
# SKETCHFAB_USERNAME=your_sketchfab_username
# Chrome DevTools MCP Server (browser automation/inspection: viz QA, controller GUI gap-fill,
# undocumented API discovery, general web-GUI automation — spec 048). No environment variables
# to set here — chrome-devtools-mcp takes all of its configuration as CLI flags, not env vars,
# and its own default profile directory (~/.cache/chrome-devtools-mcp/chrome-profile) already
# works out of the box. No credentials involved; target-site auth happens via a one-time manual
# sign-in into that profile — see mcp-servers/chrome-devtools-mcp/README.md for the two patterns.
# Run ./scripts/chrome-devtools-enable.sh to check prerequisites (Node.js 18+, a Chrome binary).
# Computer Use (full-desktop automation for legacy tools with no browser or API path — spec 050).
# No environment variables to set here — this is an OpenClaw ClawHub skill (`computer-use`), not
# an MCP server, installed via `openclaw skills install --global computer-use` plus system apt
# packages (Xvfb/XFCE/x11vnc/noVNC). No credentials involved; a legacy app's own login (if any)
# happens manually through the VNC/noVNC live viewer — see workspace/skills/desktop-gui-inspect/SKILL.md.
# Run ./scripts/install.sh --components computer-use to provision it.
# ============================================================
# RAG Knowledge Base MCP Server (rag-mcp) — Feature 062
# Fully offline document knowledge base. No credentials needed.
# ============================================================
# Persistent data directory (ChromaDB + SQLite + BM25 + retained sources)
RAG_DATA_DIR=~/.openclaw/rag
# Local embedding model (downloaded once at install; upgrade: BAAI/bge-base-en-v1.5)
RAG_EMBEDDING_MODEL=BAAI/bge-small-en-v1.5
# Local cross-encoder reranker (upgrade: BAAI/bge-reranker-base)
RAG_RERANKER_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2
# Set false on low-resource hosts to skip reranking (hybrid fusion only)
RAG_RERANK_ENABLED=true
# Results scoring below this floor are flagged low_confidence (never dropped)
RAG_RELEVANCE_FLOOR=0.3
# Per-document ingestion soft caps (whichever is hit first)
RAG_MAX_DOC_MB=100
RAG_MAX_DOC_PAGES=1000
# Max same-domain pages listed in a depth-1 URL crawl preview
RAG_CRAWL_MAX_PAGES=30
# Snapshots older than this many days are flagged stale (warn only, never auto-deleted)
RAG_SNAPSHOT_WARN_DAYS=90
# Hard cap on retrieval rounds per sub-query (initial + refinements)
RAG_MAX_ROUNDS=3
# Auvik Network Management (20 read-only tools: inventory, alerts, lifecycle/warranty, performance)
# API credentials from Auvik Settings → API Credentials (requires admin or manager role)
# Auth: HTTP Basic (user email + API key) — no extra OAuth required
# AUVIK_USERNAME=your-email@example.com # Auvik account email address
# AUVIK_API_KEY=your-auvik-api-key # Auvik API key from Settings → API Credentials
# AUVIK_BASE_URL=https://auvikapi.us1.my.auvik.com # API base URL; use us2/eu1/etc for other regions
# AUVIK_VERIFY_SSL=true # Verify SSL certificates (default: true)
# AUVIK_TIMEOUT=30 # Request timeout in seconds (default: 30)
# AUVIK_RATE_LIMIT=600 # Max API calls per minute (default: 600)
# AUVIK_MAX_PAGES=50 # Max result pages per paginated request (default: 50)
# HaloPSA / HaloITSM MCP Server (18 tools: change requests + asset/ticket context)
# OAuth2 client-credentials. Create an API application in Halo:
# Configuration > Integrations > Halo API > New (Client Credentials)
# HALO_BASE_URL=https://your-tenant.halopsa.com # Halo host (no trailing /api)
# HALO_TENANT=your-tenant # hosted multi-tenant id (blank for single-tenant)
# HALO_CLIENT_ID=your-client-id # API application client id
# HALO_CLIENT_SECRET=your-client-secret # API application secret
# HALO_SCOPE=all # OAuth scope (default: all)
# HALO_VERIFY_SSL=true # verify TLS certificates (default: true)
# HALO_TIMEOUT=30 # request timeout seconds (default: 30)
# HALO_PAGE_SIZE=50 # list page size (default 50, cap 100)
# HALO_MAX_PAGES=20 # max pages per list call (default: 20)
# ---------------------------------------------------------------------------
# Multivendor CLI Driver (spec 076) — ~90 platform families via Nornir/NAPALM/Netmiko
# Read-only by default. Cisco/Juniper stay with pyATS/junos-mcp.
# ---------------------------------------------------------------------------
# Inventory source: live_sot | generated | operator | auto (default auto)
MULTIVENDOR_INVENTORY_SOURCE=
# Operator-authored inventory. The server NEVER writes to this file.
MULTIVENDOR_INVENTORY_PATH=
# Generated inventory cache. Rendered from a source of truth; OVERWRITTEN on refresh.
MULTIVENDOR_GENERATED_PATH=
# Expose write tools at all. Absent from tools/list unless set (default off).
MULTIVENDOR_WRITE_ENABLED=
# Concurrency bound for fleet queries (default 10 — devices often cap sessions at 5-15)
MULTIVENDOR_MAX_WORKERS=
# Per-device timeout in seconds (default 30)
MULTIVENDOR_TIMEOUT_S=
# Credentials. NEVER put these in an inventory file. Vault preferred; these are the
# documented fallback and are fully supported (Vault is not required).
MULTIVENDOR_USERNAME=
MULTIVENDOR_PASSWORD=
MULTIVENDOR_ENABLE=
# Per-reference overrides for per-device/site/platform credentials, e.g.
# MULTIVENDOR_EDGE_SITE_USERNAME / MULTIVENDOR_EDGE_SITE_PASSWORD for credential_ref "edge-site"
# ---------------------------------------------------------------------------
# ServiceNow — ITSM change gating (Constitution Principle III)
# Required for production configuration changes: human approval and an approved
# Change Request are DISTINCT gates. Lab-classified devices are exempt.
# ---------------------------------------------------------------------------
SERVICENOW_AUTH_TYPE=
SERVICENOW_INSTANCE_URL=
SERVICENOW_USERNAME=
SERVICENOW_PASSWORD=
# ---------------------------------------------------------------------------
# Cisco PSIRT openVuln API (spec 078) — is a running version affected by an advisory?
# Register a SERVICE application with the Client Credentials grant at
# apiconsole.cisco.com and select "Cisco PSIRT openVuln API".
# Read-only. Never contacts a device — versions come from pyATS/multivendor-cli.
# ---------------------------------------------------------------------------
CISCO_CLIENT_ID=
CISCO_CLIENT_SECRET=
# Advisory cache location (default ~/.openclaw/cisco-psirt). Advisories only —
# the OAuth token is a credential and is never written to disk.
CISCO_PSIRT_CACHE_DIR=
# Cache lifetime in seconds (default 21600 = 6h). The rate budget is 5/sec and
# 30/min shared across every caller, so shortening this has a real cost.
CISCO_PSIRT_CACHE_TTL_S=
# ---------------------------------------------------------------------------
# Globalping (spec 079) — outside-in measurement from ~4,800 global probes
# Free token from https://www.globalping.io. Remote MCP, nothing to install.
# The endpoint returns 401 without a token; the token raises the hourly
# allowance from 250 to 500 probe-measurements. Charged PER PROBE, so a
# limit:20 test spends 20 units.
# Public targets only — private/internal addresses are refused.
# ---------------------------------------------------------------------------
GLOBALPING_TOKEN=
# ─────────────────────────────────────────────────────────────────────
# Fortinet — spec 080 (roadmap R3). Server: mcp-servers/fortinet-mcp
# Three planes, each independently optional. A plane with no credentials
# is simply not consulted, and NetClaw says so rather than answering
# from another plane.
# ─────────────────────────────────────────────────────────────────────
# Command the three Fortinet skills invoke (one server serves all planes)
FORTINET_MCP_CMD=
# Manager plane — FortiManager (policy intent: ADOMs, packages, objects)
FORTIMANAGER_HOST=
FORTIMANAGER_API_TOKEN=
# Device plane — FortiGate (observed state: interfaces, routes, VPN, HA)
FORTIGATE_HOST=
FORTIGATE_API_TOKEN=
# Analyzer plane — FortiAnalyzer (observed traffic: logs, policy activity)
# Token auth requires FortiAnalyzer 7.2.2 or later
FORTIANALYZER_HOST=
FORTIANALYZER_API_TOKEN=
# TLS verification. Defaults to true. Fortinet appliances ship self-signed
# certificates; import the appliance CA rather than disabling this, since
# disabling it exposes the API token to interception.
FORTINET_VERIFY_SSL=
# Write path. Defaults to false. Enabling it does NOT authorise a write —
# it only makes the two gates reachable. Every write additionally requires
# human approval AND an approved ServiceNow change record.
FORTINET_ALLOW_WRITES=
# ─────────────────────────────────────────────────────────────────────
# BGP & Registry Intelligence — spec 081 (roadmap R9)
# Server: mcp-servers/bgp-intel-mcp
#
# NO CREDENTIALS REQUIRED. All five sources (RPKI validator, RDAP, RIPEstat,
# PeeringDB, RIPE Atlas) are public unauthenticated APIs. There is nothing here
# to leak, rotate or scope — the only variables are optional tuning.
# ─────────────────────────────────────────────────────────────────────
# Command the bgp-registry-intel skill invokes
BGP_INTEL_MCP_CMD=
# Contact string sent to public APIs. These are volunteer-funded community
# services and identifying yourself is the courtesy they ask of automated
# consumers. Defaults to a NetClaw string with the project URL.
BGP_INTEL_USER_AGENT=
# Requests per second per source. Default 4, enforced as a true sliding window.
# May be LOWERED to be more polite; values above 4 are clamped, not honoured.
BGP_INTEL_MAX_RPS=
# GAIT audit trail path. Defaults under ~/.openclaw/gait/
BGP_INTEL_AUDIT_LOG=
# ─────────────────────────────────────────────────────────────────────
# Document Generation — spec 082 (roadmap R18)
# Server: mcp-servers/document-mcp
#
# NO CREDENTIALS REQUIRED. This server writes files and touches no device
# and no ticket. Everything below is optional tuning; the defaults are
# what you want unless you have a reason otherwise.
#
# The four libraries it needs (python-docx, openpyxl, python-pptx,
# PyMuPDF) are already installed by rag-mcp (feature 062), which READS
# these formats. This server WRITES them.
# ─────────────────────────────────────────────────────────────────────
# Command the two document skills invoke
DOCUMENT_MCP_CMD=
# Where generated documents land. Defaults to workspace/output/document-mcp/
# — persistent, timestamped, and never overwritten, so a regenerated report
# cannot replace one already attached to a ticket. There is deliberately no
# fallback to a temp directory: an unwritable path is reported as a failure.
DOCUMENT_OUTPUT_DIR=
# Data rows per worksheet before truncation. Default 50000. When a bound is
# applied it is written INTO the document, not only into the tool response.
DOCUMENT_MAX_ROWS=
# Blocks per Word document before truncation. Default 5000.
DOCUMENT_MAX_BLOCKS=
# Slides per deck before truncation. Default 200.
DOCUMENT_MAX_SLIDES=
# GAIT audit trail path. Defaults under ~/.openclaw/gait/
DOCUMENT_AUDIT_LOG=
# ─────────────────────────────────────────────────────────────────────
# Zabbix SNMP-Poller NMS — spec 083 (roadmap R11)
# Server: mcp-servers/zabbix-mcp (VENDORED third-party, GPL-3.0, unmodified)
#
# Runs from a DEDICATED VIRTUALENV. Not optional: it needs fastmcp 3.x while
# five NetClaw servers pin fastmcp<3. A shared install breaks all five.
#
# Strictly READ-ONLY. There is no write path in this integration.
# ─────────────────────────────────────────────────────────────────────
# Command the three zabbix skills invoke (the venv interpreter)
ZABBIX_MCP_CMD=
# Base URL of your Zabbix front end, e.g. https://zabbix.example.com
# (the API lives at <url>/api_jsonrpc.php)
ZABBIX_URL=
# API TOKEN, not a password. Users -> API tokens in the Zabbix UI.
# Token auth is required for forward-compatibility: the older in-request
# credential property still works on 7.0 but is REMOVED in 7.2+.
ZABBIX_TOKEN=
# TLS verification. Defaults to true. Import your CA rather than disabling
# this — disabling it exposes the API token to interception.
VERIFY_SSL=
# Read-only. NetClaw FORCES this to true in config/openclaw.json and you
# should not override it. The reason it is forced rather than inherited:
# the upstream library defaults it to true (utils.py:29) but the upstream
# LAUNCHER defaults it to false (scripts/start_server.py:139), so running
# it the documented upstream way would enable writes.
READ_ONLY=
# Destructive-method deny-list (regex, comma separated). Second layer, set
# in config/openclaw.json. Holds even if READ_ONLY is misconfigured.
ZABBIX_API_BLACKLIST=
# ─────────────────────────────────────────────────────────────────────
# Kubernetes (read-only) — spec 084 (roadmap R14)
# Server: mcp-servers/k8s-mcp (VENDORED third-party, Apache-2.0, pinned v0.0.66)
#
# STRICTLY READ-ONLY. No write path. Secrets are denied.
# ─────────────────────────────────────────────────────────────────────
# Command the three k8s skills invoke (the pinned binary)
K8S_MCP_CMD=
# Path to a kubeconfig. THIS MUST BE EXPLICIT AND DEDICATED.
#
# Do NOT point this at ~/.kube/config. Every Kubernetes MCP server defaults to
# the ambient current-context, so a server started against your personal
# kubeconfig talks to whatever cluster you last used — possibly production.
#
# Generate a token-only kubeconfig for a dedicated ServiceAccount bound to a
# ClusterRole with get/list/watch on pods, services, ingresses, networkpolicies,
# endpointslices, namespaces and events — and NO secrets.
#
# It must be TOKEN-ONLY: a kubeconfig that also carries a client certificate
# silently ignores the token and authenticates as the cert's identity instead.
#
# Cluster-wide read is required, not optional. With it, the upstream server's
# silent-narrowing path is unreachable; without it, a cluster-wide question can
# come back scoped to one namespace with no error and no caveat.
K8S_KUBECONFIG=
# ─────────────────────────────────────────────────────────────────────
# Cisco Catalyst Center (read-only) — spec 087
# Server: mcp-servers/catc-mcp (NetClaw client over Cisco's official catalogue)
#
# STRICTLY READ-ONLY. All 514 GET operations; the one mutating operation in
# the upstream bundle is excluded from the catalogue entirely.
# ─────────────────────────────────────────────────────────────────────
# Base URL, e.g. https://sandboxdnac.cisco.com
# NOTE the DevNet always-on sandboxes share credentials and are NOT equivalent:
# sandboxdnac.cisco.com -> 4 devices, 25 sites (use this one)
# sandboxdnac2.cisco.com -> 0 devices, 1 site (authenticates, but empty)
# An inventory answer from the second looks identical to a real empty estate,
# which is why every response names the appliance it came from.
CATALYST_CENTER_HOST=
# Use a DEDICATED, LEAST-PRIVILEGE, READ-ONLY account. The upstream project is
# explicit that its catalogue "does not enforce read-only access"; NetClaw's
# curation is one control and this account's RBAC is the other.
CATALYST_CENTER_USERNAME=
CATALYST_CENTER_PASSWORD=
# TLS verification. Defaults to true. The DevNet sandboxes use self-signed
# certificates, so a lab needs false — never disable it against production.
CATALYST_CENTER_VERIFY_SSL=
# ─────────────────────────────────────────────────────────────────────
# Lantronix Percepxion + SLC — spec 104. External/on-demand, not vendored:
# both are Lantronix's own actively co-developed repos. See
# specs/104-percepxion-oob-integration/spec.md and workspace/skills/
# percepxion-oob/SKILL.md for the full env var reference and install steps.
# ─────────────────────────────────────────────────────────────────────
# percepxion-mcp-server: fleet-wide OOB console-server SaaS
PERCEPXION_USERNAME=
PERCEPXION_PASSWORD=
# Default: https://api.percepxion.ai/api. Use api.gopercepxion.ai only for the
# Lantronix internal sandbox — the wrong domain causes silent auth failures.
PERCEPXION_API_URL=
# slc-mcp-server: direct, synchronous single-device OOB console-server access.
# {KEY} is the device identifier, uppercased, non-alphanumeric replaced with
# `_` (e.g. device_id "slc9000-dc-a" -> SLC_SLC9000_DC_A_IP). SLC_DEFAULT_IP/
# USERNAME/PASSWORD below apply when device_id isn't in the per-device set.
SLC_DEFAULT_IP=
SLC_USERNAME=
SLC_PASSWORD=
# SLC_{KEY}_IP=
# SLC_{KEY}_USERNAME=
# SLC_{KEY}_PASSWORD=
# --- Session Budget Guardrails (spec 109) ---
# Per-session cost ceiling in USD. Sessions halt when cumulative cost reaches this.
# Override this to set a quick cap without modifying openclaw.json.
# Default: 5.0 (safe for hobby/personal deployments)
NETCLAW_SESSION_BUDGET_USD=5.0
# --- NetClaw for Zoom: Meeting Intelligence (spec 118) ---
# Zoom Marketplace app credentials (General App, User-managed OAuth) — see
# docs/ZOOM-MEETING-INTELLIGENCE.md for setup.
ZOOM_CLIENT_ID=
ZOOM_CLIENT_SECRET=
ZOOM_ACCOUNT_ID=
# Event Subscription secret token — verifies the RTMS webhook handshake.
ZOOM_RTMS_WEBHOOK_SECRET=
# zoom-rtms-mcp's own local ports (not exposed publicly by NetClaw itself —
# front with your own HTTPS ingress, e.g. a tunnel or reverse proxy).
ZOOM_RTMS_WEBHOOK_PORT=8899
ZOOM_PANEL_FEED_PORT=8900
# Loopback-only channel between zoom-rtms-mcp and the Border federation daemon
# (bgp/federation/zoom_channel.py). Both must agree on the same port/secret.
N2N_ZOOM_CHANNEL_HOST=127.0.0.1
N2N_ZOOM_CHANNEL_PORT=
N2N_ZOOM_CHANNEL_SECRET=
# Official Zoom Meetings MCP credential (historical meeting search/assets) —
# exact shape TBD pending confirmation against Zoom's own connector setup flow.
ZOOM_MEETING_MCP_CREDENTIAL=