Safety-first OPNsense firewall MCP: read-only by default, planned and auto-reverting writes.
MCPpedia last refreshed this data
io.github.d3ltasecurity/opnsense-guard-mcp is an MCP server that safety-first OPNsense firewall MCP: read-only by default, planned and auto-reverting writes. Its tool list has not been published yet over stdio and http, requires no API key, and scores 87/100 on MCPpedia's security, maintenance and efficiency rubric.
Config is the same across clients - only the file and path differ.
{
"mcpServers": {
"io-github-d3ltasecurity-opnsense-guard-mcp": {
"args": [
"opnsense-guard-mcp"
],
"command": "uvx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Safety-first OPNsense firewall MCP: read-only by default, planned and auto-reverting writes.
Run this in your terminal to verify the server starts. Then let us know if it worked - your result helps other developers.
uvx 'opnsense-guard-mcp' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories - click any category to see the underlying evidence.
No known CVEs.
Checked opnsense-guard-mcp against OSV.dev.
Click any tool to inspect its schema.
Be the first to review
Have you used this server?
Share your experience - it helps other developers decide.
Sign in to write a review.
Others in security
Search-first MCP server for JavaScript reverse engineering: 735 tools across 36 domains.
MCP security scanner. CI-native testing, attack simulation, health scoring, and SARIF.
MCP server for 1Password service accounts — tools and resources for vaults and credentials
Deterministic security scanning, no model or API key, plus offline-verifiable proof a fix worked.
MCP Security Weekly
Get CVE alerts and security updates for io.github.d3ltasecurity/opnsense-guard-mcp and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
A safety-first MCP server for OPNsense 26.7+.
Read-only by default. Every write is planned, policy-checked, logged, and auto-reverted unless you confirm it.
Status: alpha. Tested against a live OPNsense 26.7.4 with least-privilege API users: read tools, policy file, change planning with diffs, applying changes with verification and automatic revert, crash recovery, and a hash-chained audit log, over stdio or authenticated HTTPS. See DESIGN.md.
Not affiliated with Deciso B.V. "OPNsense" is a trademark of Deciso B.V.
| opnsense-guard-mcp | |
|---|---|
| Default mode | read-only |
| Read path | GET, plus POST to exactly two search endpoints (states, rules) with a fixed three-field body; path allowlist, verb denylist, traversal/encoding rejected, redirects not followed |
| Writes | separate API user, exact endpoint allowlist, plan → policy check → human approval → apply → verify → auto-revert unless confirmed |
| Rollback on 26.7+ | own object-level snapshots + revert (the savepoint API is gone in 26.7); survives restarts |
| Guardrails | allowlist policy file: interfaces, networks, rule limits, anti-lockout |
| Audit | hash-chained JSONL (audit verify detects edits); syslog planned |
| Transport | stdio, or Streamable HTTP that always needs a bearer token; optional TLS / mTLS |
| Dangerous tools | none exist: no reboot, firmware, service control, SSH or XML edits |
In OPNsense (System → Access → Users), create a user with a scrambled
password, no group (not admins) and these privileges, then create an
API key for it. Skip any that aren't installed; the matching tool just
reports "forbidden".
| Privilege | Used by |
|---|---|
| Firewall: Rules [new] | firewall_rules, firewall_rule_get, planning |
| Firewall: Aliases (view-only) | firewall_aliases, planning |
| Status: Interfaces | interfaces |
| Status: Services | service_list |
| Diagnostics: ARP Table | arp_table |
| Diagnostics: Routing tables | routing_table |
| Diagnostics: Show States | firewall_states |
| Diagnostics: Logs: Firewall: Live View | firewall_log |
| Diagnostics: Logs: System | system_log |
| Lobby: Dashboard | system_information, system_resources, health probe |
| Services: Intrusion Detection | suricata_* |
| Services: DHCP: Kea(v4) / Services: Dnsmasq DNS/DHCP: Settings / Status: DHCP leases (ISC) | dhcp_leases: only the one you use |
| System: Firmware (optional) | system_status. It also allows installing updates, so leave it out unless you need it. |
Most OPNsense privileges are not view-only (Firewall: Aliases is an
exception): several of these also allow edits through the API. The server
only sends GET requests with this key, except a search POST to two exact
endpoints (diagnostics/firewall/query_states, firewall/filter/searchRule)
with a body it builds itself (current, rowCount, searchPhrase);
OPNsense answers those lists properly only over POST. Still keep the list
short: the privileges are what OPNsense itself enforces.
Install:
pipx install opnsense-guard-mcp
Configure (copy .env.example to .env, or set env vars):
OPNSENSE_URL=https://firewall.example.internal
OPNSENSE_API_KEY=...
OPNSENSE_API_SECRET=...
OPNSENSE_CA_BUNDLE=/path/to/firewall-ca.pem # or OPNSENSE_VERIFY_SSL=false
Check the config (does not contact the firewall):
opnsense-guard-mcp --check
Add to your MCP client, e.g. Claude Code:
claude mcp add opnsense -- opnsense-guard-mcp --env-file /path/to/.env
HTTP never runs without authentication. The server refuses to start if: