OPNsense MCP
OPNsense MCP
Ein sicherheitsorientierter Remote-Server für das Model Context Protocol für die MVC-API von OPNsense. Er stellt zustandsbehaftetes Streamable HTTP für Remote-Agents bereit, verwendet die native HTTP-Basic-Authentifizierung der API und greift im Fehlerfall auf das Fail-Closed-Prinzip zu, wenn nicht festgestellt werden kann, ob ein OPNsense-Befehl schreibgeschützt ist.
Eine Serverinstanz repräsentiert eine OPNsense-Firewall. Die Firewall-URL und die API-Anmeldedaten bleiben in der Serverumgebung; Agents authentifizieren sich mit einem eigenen Bearer-Token am MCP und können Anfragen nicht auf beliebige Netzwerkziele umleiten. Stellen Sie bei der Verwaltung mehrerer Appliances eine isolierte Instanz pro Firewall bereit.
Architektur
Remote agent --HTTPS + MCP bearer token--> OPNsense MCP --HTTPS + API key/secret--> OPNsenseDer MCP-Endpunkt verwendet den aktuellen Streamable-HTTP-Transport unter /mcp. Die Sitzungen sind zustandsbehaftet, sodass einmalige Mutationspläne an die Sitzung des erzeugenden Agents gebunden bleiben. Sitzungen sind begrenzt, verfallen nach Inaktivität und werden bei jeder HTTP-Anfrage authentifiziert.
Der eingebaute HTTP-Listener ist dafür vorgesehen, hinter einem TLS-Reverse-Proxy, einem Ingress Controller, einem VPN oder einem privaten Overlay zu laufen. Setzen Sie seinen unverschlüsselten HTTP-Port nicht direkt einem nicht vertrauenswürdigen Netzwerk aus.
OPNsense-API-Modell
OPNsense routet API-Anfragen so:
/api/<module>/<controller>/<command>/<parameter...>Die für die Automatisierung wichtigen Eigenschaften:
API-Schlüssel verwenden HTTP-Basic-Authentifizierung: Der Schlüssel ist der Benutzername, das Secret das Passwort.
Der Zugriff bleibt weiterhin durch die OPNsense-ACL-Berechtigungen des Schlüsselinhabers eingeschränkt.
Anfragen und die meisten Antworten sind JSON. Downloads und Streams können davon abweichen.
GETundPOSTsind nicht eindeutig sicheren und unsicheren Operationen zuzuordnen. Manche Lesevorgänge nutzenPOST, manche SchreibvorgängeGET.Änderbare Modell-Controller stellen üblicherweise
get,search,add,set,delundtogglebereit.Datensätze vom Typ Array verwenden UUIDs. Ein
getohne UUID liefert oft einen leeren Datensatz.Eine erfolgreiche Modell-Mutation legt die Änderung meist nur in der Staging-Konfiguration ab; erst ein eigener
apply- oderreconfigure-Aufruf aktiviert sie.Modell-Schreibzugriffe geben Werte wie
{"result":"saved"}oder{"result":"failed","validations":...}zurück; HTTP 200 allein bedeutet keinen semantischen Erfolg.Konfigurationssperre, Modellvalidierung, Revisionskontext und ACL-Prüfungen passieren serverseitig und sind nicht zu umgehen.
Offizielle Referenzen:
https://docs.opnsense.org/development/frontend/controller.html
https://docs.opnsense.org/development/frontend/models_field.html
Sicherheitsmodell
opnsense_request akzeptiert nur Befehle, die als Lesen klassifiziert sind. Die Klassifizierung erfolgt anhand des Befehls, nicht der HTTP-Methode.
Für Mutationen sind zwei Werkzeuge vorgesehen:
opnsense_plan_changemeldet die konkrete Anfrage und ihr Risiko, ohne OPNsense zu kontaktieren.opnsense_execute_changeerfordert ein passendes Einmal-Token, das nach fünf Minuten abläuft.
Risikoklassen unterscheiden zwischen Staging-Schreibzugriffen, Aktivierung, einschneidenen Dienst- oder Firmware-Operationen sowie nicht wiedergutzumachenden Reset-/Restore-Operationen. Unbekannte Befehle werden im Fail-Closed-Fall als Mutationen behandelt.
Der Schreibmodus wird außerhalb des Agents konfiguriert:
disablederlaubt nur Lesezugriffe.planZKähl erlaubt die Mutationsanalyse, erzeugt aber nie ein Ausführungstoken.enablederlaubt die Ausführung mit einem passenden Token.
Verwenden Sie einen eigenen OPNsense-Benutzer und geben Sie diesem nur die effektiven Berechtigungen, die die vorgesehenen Werkzeuge wirklich benötigen. Für reine Lese-Deployments vergeben Sie in OPNsense zusätzlich System: Deny config write (user-config-readonly).
Kuratierte Reads Tools
Der geschützte generische Reads wird durch feste Nur-Lese-Resourcen für übliche Betriebsaufgaben ergänzt:
opnsense_get_firewall_logsliest strukturierte Paketfilter-Ereignisse.opnsense_get_logsliest fensterweise Seiten aus Core- und C-Protokollen, darunter System, config, Gateways, VPN, DNS, DHCP, IDS, Routing und Web-UI-Logs.opnsense_list_firewall_rulesliest die in der Automations-API sichtbaren Filterregeln.opnsense_list_nat_rulesliest Destination-, Source-, One-to-One- und NPT-Regeln.opnsense_get_route_tableliest entweder die aktive Kern-Routing-Tabelle oder die konfigurierten richtigen Routen.
Diese Werkzeuge rufen direkt fest definierte Query-Endpunkte auf. Sie können nicht auf mutierende Gegenstücke wie Log-Löschen, State-Flushes, Regeländerungen oder das Anwenden von Änderungen ausweichen. Die Ergebnisse bleiben an die fD des API-Benutzers freigegebenen OPNsense-ACL-Berechtigungen gebunden.
Einrichtung
npm install
npm run buildKonfigurieren Sie die Umgebung anhand von .env.example. Umgebungsdateien werden nicht automatisch geladen und von Git ignoriert. Erzeugen Sie einen separaten MCP-Token mit openssl rand -hex 32; verwenden Sie dafür nicht ein OPNsense-API-Life.
Bevorzugen Sie ein öffentlich vertrauenswürdiges Zertifikat oder setzen Sie OPNsense_CA_FILE auf das Zertifikat der privaten CA. OPNSENSE_TLS_VERIFY=false ist nur für eine isolierte Entwicklung gedacht.
Führen Sie den Remote-Server auf loopback hinter einem lokalen TLS-Reverse-Proxy aus:
OPNSENSE_URL=https://firewall.example \
OPNSENSE_API_KEY=... \
OPNSENSE_API_SECRET=... \
MCP_AUTH_TOKEN=<random-token-at-least-32-characters> \
node dist/index.jsDie nur über http://127.0.0.1:3000/mcp. Veröffentlichen Sie sie über den Reverse-Proxy als HTTPS und übergeben Sie den Token so:
Authorization: Bearer <MCP_AUTH_TOKEN>Beispielkonfiguration für einen Remote-Client, weil URLs und eigene Header unterstützt:
{
"mcpServers": {
"opnsense": {
"url": "https://mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer ${MCP_AUTH_TOKEN}"
}
}
}
}Die Formate für Client-Konfigurationen sind unterschiedlich. Legen Sie das Token in der Secret-Verwaltung des Clients ab, nicht in die Konfigurationsdatei.
Docker Compose
compose.yaml bindet Port 3000 an den Host-Loopvelop, damit ein Reverse-Proxy TLS sicher beenden kann.
export OPNSENSE_URL=https://firewall.example
export OPNSENSE_API_KEY=...
export OPNSENSE_API_SECRET=...
export MCP_AUTH_TOKEN="$(openssl rand -hex 32)"
export MCP_ALLOWED_HOSTS=mcp.example.com
docker compose up -d --buildWenn Sie sich während der Entwicklung direkt mit localhost:3000 verbinden, nehmen Sie localhost in MCP_ALLOWED_HOSTS auf. Der nicht authentifizierte Health-Endpunkt ist unter /health verfügbar und verrät weder Ziel- noch Zugangsdaten.
Remote-Sicherheit
MCP_AUTH_TOKENist für den HTTP-Transport Pflicht und muss aus mindestens 32 Zeichen bestehen.MCP_ALLOWED_HOSTSist Pflicht beim Binden an eine Nicht-Loopback-Adresse und unterbindet Host-Header-DNS-Rebinding.Anfragen mit einem Browser-
Origin-Header werden abgewiesen, es sei denn, exact diese Origin steht inMCP_ALLOWED_ORIGINS.MCP_MAX_SESSIONS,MCP_SESSION_TTL_MSundMCP_RATE_LIMIT_PER_MINUTEbegrenzen die Ressourcennutzung im Remote-Betrieb.Behalten Sie
OPNSENSE_TLS_VERIFY=truebei. Verwenden Sie für eigene CAsOPNSENSE_CA_FILE, statt die Prüfung abzuschalten.Behalten Sie
OPNSENSE_WRITE_MODE=disabledfür reine Monitoring-DDeployments bei.Schränken Sie den OPNsense-API-Benutzer auf effektive ACL privileges ein, einschließlich
user-config-readonly, wo angebracht.Setzen Sie den MCP-Endpunkt hinter HTTPS, eine Firewallregel und idealerweise hinter VPN oder Privatsnetz.
MCP_ALLOW_UNAUTHEENTICATED=true existiert nur für die isolierte lokale Entwicklung und darf niemals für einen remote Exposed Listener verwendet werden.
Stdio-Kompatibilität
Lokale Clients können den Server weiterhin als Subprozess starten:
OPNSENSE_URL=https://firewall.example \
OPNSENSE_API_KEY=... \
OPNSENSE_API_SECRET=... \
MCP_TRANSPORT=stdio \
node dist/index.jsSchrift sprache
OPNSENSE_URL: feste Basis URL der Firewall.OPNSENSE_API_KEY: API-Schlüssel für den dedizierten OPNsense-Benutzer.OPrpSENSE_API_SECRET: API-Secret key des Schlüssels.OPNsense_WRITE_MODE:disabled,planoderenabled.OPNSENSE_CA_FILE: optionale PEM-Datei der privaten CA.OPNsense_TLS_VERIFY: Standardtrue.MCP_TRANSPORT: standardhttp, alternativstdio.MCP_HOST: Listener-Adresse, Standard127.0.0.1.MCP_PORT: Listener-Port, Standard3000.MCP_PATH: Pfad des MCP-Endpunkts, Standard/mcp.MCP_AUTH_TOKEN: Bearer Token für das MCP-Remote-Agents.MCP_ALLOWED_HOSTS: kommgetrennte Hostnames für den HTTP-Host-Header.MCP_ALLOWED_ORIGINS: kommgesepararte Browser-Origins; leer verurteilt Anfragen von Browser.MCP_MAX_SESSIONS: maximale Parallelsitzungen, Standard100.MCP_SESSION_TTL_MS: Lebensdauer inaktiveres Sitzung, Standard eine Stunde.MCP_RATE_LIMIT_PER_MINUTE: HTTP-Anfragelimit pro Client, Standard120.
Ein Lesezugriff auf den Systemstatus sieht z. B. so aus:
{
"module": "core",
"controller": "system",
"command": "status"
}Aktuelle Grenzen
OPNsense veröffentlicht keinen vollständigen OpenAPI-Vertrag. Die generierte Referenz zeigt Routen und vermutliche Methoden, aber oft keine Body-Schemas.
Plugin-Endpunkte existieren nur, wenn die entsprechenden Pakete installiert und ACL autorisiert sind.
Die semantische Antwortvalidierung ist noch nicht endpunktspezifisch.
Die lexikalische Risikoklassifikation ist absichtlich konservativ. Die kuratierten Werkzeuge sollten später einen auditurten Endpunkt-Katalog erklären mit expliziten Request- und Response-Schemata.
Pläne verringern versehentliche oder angeletterte Ausführungen, aber MCP-Hosts sollten Beschädigungsbestätigungen Menschen weiterfallen lassen.
Remote-Authentifizerung verwendet derzeit ein statisches, deploymentweites Bearer-Tokenmusiationsserver. Verwenden Sie getrennte Deployments oder authentifizierende Reverse-Proxys, wenn Agents unterschiedliche Identitäten brauchen.
Der Sitzungszustand liegt im Arbeitsspeicher und wird nicht über Replicas verteilt. Betreiben Sie eine einzelne Replica, sofern kein externer Sitzungsstorage und Routing-Affinität vorhanden sind.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.
Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi
Remote MCP for Copilot CLI switch gate MCP, structured receipts, audit logs, and reviewer-ready evid
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ethereal-Jay/opnsense-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server