Mcp Pfsense

io.github.felhen-ai由 GitHub 帳號 felhen-ai 發布v0.3.1更新於 Nov 4, 2026

Manage pfSense firewalls through AI assistants — rules, DHCP, DNS, and more

概覽

AI 產生的概覽

本機 MCP 伺服器,讓助理檢視與管理 pfSense 防火牆:規則、DHCP 保留、DNS 覆寫、服務與日誌。

可以做什麼
  • 讀取系統與網路狀態:版本、CPU、記憶體、運作時間、介面、閘道健康、ARP 表、DHCP 租約、服務狀態與最近的防火牆日誌
  • 列出防火牆規則與別名,並暫存新增或刪除的規則
  • 列出、新增與刪除 DHCP 靜態對應(IP 保留)
  • 列出、新增與刪除 Unbound DNS 主機覆寫
  • 依子系統查看暫存變更並套用,或重新啟動某項服務
適用情境
適合透過 pfrest REST API 管理 pfSense 防火牆的情境,想用對話方式查詢狀態或調整規則、DHCP 與 DNS,而不必操作 WebGUI。
執行需求
以 Python 套件形式在本機執行(Python 3.11+),可用 uvx 或 pip 安裝。需要已安裝 pfrest REST API v2 的 pfSense 2.7.x/2.8.x、具備 API 權限的使用者帳號,以及 PFSENSE_HOST 與 PFSENSE_PASSWORD 環境變數(可選 PFSENSE_USERNAME、PFSENSE_PORT、PFSENSE_SCHEME、PFSENSE_VERIFY_SSL)。需要能連線到防火牆的網路。
安裝前請注意
需要在 PFSENSE_PASSWORD 中提供防火牆管理員 API 密碼,且預設不驗證 SSL 憑證(PFSENSE_VERIFY_SSL=false)。寫入操作會變更防火牆、DHCP 與 DNS 設定;刪除、重啟服務與 apply_changes 需 confirm=true,而 apply_changes 也會一併啟用他人在 WebGUI 中暫存但尚未審核的變更。給 API 使用者授予廣泛的 api-v2 或 page-all 權限會擴大助理可執行的操作範圍。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mcp Pfsense,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

mcp-pfsense

[PyPI] [Python] [License: MIT]

MCP server for managing pfSense firewalls through AI assistants like Claude, ChatGPT, and Copilot.

Requires: pfrest package installed on your pfSense instance (provides the REST API).

Features

20 tools across 7 categories:

CategoryToolsDescription
Systemget_system_status, get_interfacesVersion, CPU, memory, uptime, temperature, network interfaces
Firewalllist_firewall_rules, add_firewall_rule, delete_firewall_rule, list_firewall_aliasesRule management with interface filtering, alias listing
DHCPlist_dhcp_leases, list_dhcp_static_mappings, add_dhcp_static_mapping, delete_dhcp_static_mappingActive leases, IP reservations
DNSlist_dns_host_overrides, add_dns_host_override, delete_dns_host_overrideUnbound DNS Resolver host overrides
Pending changesget_pending_changes, apply_changesSee what is staged per subsystem (firewall, dhcp, dns) and apply it
Monitoringget_gateway_status, get_arp_table, list_services, get_firewall_logsGateway health, connected devices, service status, recent raw firewall log entries
Servicesrestart_serviceRestart any pfSense service

Safety

  • Two-step confirmation for destructive operations (delete rules, delete mappings, restart services, apply changes): the tool returns a warning on first call and only executes when called again with confirm=true.
  • Writes are staged, not live. Like the pfSense WebGUI, add_* and delete_* store the change in the config but do not activate it. The tool response says so (applied: false, plus a pending note). Activate with apply_changes(subsystem, confirm=true) — which reloads that subsystem, including anything a human left staged in the WebGUI — or pass apply=true on the write itself when you explicitly want a one-shot change. Nothing the assistant does reaches the packet filter without one of those two explicit steps.
  • delete_dhcp_static_mapping takes the mapping's interface (its parent_id in list_dhcp_static_mappings) and mapping_id; a mapping is addressed by both.

Installation

bash
# Using uvx (recommended)uvx mcp-pfsense
# Using pippip install mcp-pfsense

Prerequisites

  1. pfSense with pfrest package installed
  2. A user account with API access (typically admin)

Configuration

Set environment variables:

VariableRequiredDefaultDescription
PFSENSE_HOSTYes—pfSense hostname or IP
PFSENSE_PASSWORDYes—API user password
PFSENSE_USERNAMENoadminAPI username
PFSENSE_PORTNo443API port
PFSENSE_SCHEMENohttpshttp or https
PFSENSE_VERIFY_SSLNofalseVerify SSL certificate

Claude Desktop

Add to claude_desktop_config.json:

json
{  "mcpServers": {    "pfsense": {      "command": "uvx",      "args": ["mcp-pfsense"],      "env": {        "PFSENSE_HOST": "10.10.10.1",        "PFSENSE_PASSWORD": "your-password"      }    }  }}

Claude Code

bash
claude mcp add pfsense -- uvx mcp-pfsense

Then set environment variables in your shell or .env file.

Usage Examples

Once connected, ask your AI assistant:

  • "What's the pfSense system status?"
  • "Show me all firewall rules on the LAN interface"
  • "List active DHCP leases"
  • "Add a DNS entry for nas.home.lan pointing to 10.10.10.50"
  • "What devices are connected to the network?" (ARP table)
  • "Show gateway health and latency"
  • "Show the 50 most recent firewall log entries" (read-only get_firewall_logs)
  • "Create a firewall rule to allow TCP port 8080 on LAN"
  • "Reserve IP 10.10.10.60 for MAC aa:bb:cc:dd:ee:20"

API Compatibility

  • pfSense: 2.7.x and 2.8.x
  • pfrest: REST API v2 — any v2.x release, except list_dhcp_static_mappings, which needs v2.7.0 or later (it uses the /services/dhcp_server/static_mappings collection endpoint added in that release).
  • Python: 3.11+

The endpoint, parameters and encoding each tool uses are pinned by tests/test_client_endpoints.py and tests/test_wire_format.py, derived from the pfrest v2 endpoint definitions. Versions before 0.2.0 called several endpoints that do not exist in pfrest v2 (see Troubleshooting).

Note: pfrest runs on nginx (port 80 by default), separate from the pfSense WebGUI (lighttpd on port 443). If your pfrest is configured on a non-standard port, set PFSENSE_PORT and PFSENSE_SCHEME accordingly.

Troubleshooting

Only get_system_status and get_arp_table work; everything else returns 400/404

mcp-pfsense 0.1.1 and earlier called singular endpoints for listing (/interface, /firewall/rule, /firewall/alias) and legacy paths that pfrest v2 does not serve (/status/dhcp_leases, /services/dhcpd/static_mapping, /services/unbound/host_override, /status/gateway, /status/service for GET). Upgrade to 0.2.0 or later.

403 on list_services or other reads

pfrest checks the privileges of the API user per endpoint. Grant the user the api-v2-* privileges for the endpoints you need (or page-all for full access) under System → User Manager.

ModuleNotFoundError: No module named 'mcp.server.fastmcp'

The MCP Python SDK 2.0 removed the module that mcp-pfsense 0.1.1 and earlier import, so fresh installs (uvx mcp-pfsense, pip install) failed on startup. Upgrade to 0.2.0 or later, which pins mcp<2. If you must stay on an older mcp-pfsense: uvx --with "mcp<2" mcp-pfsense.

A rule / mapping / override was created but is not in effect

That is the default: writes are staged (see Safety). Check with get_pending_changes(subsystem) and activate with apply_changes(subsystem, confirm=true), or in the WebGUI. If a write returns 200 but nothing is stored at all, the pfrest read_only setting is on (System → REST API → Settings).

Development

bash
git clone https://github.com/felhen-ai/mcp-pfsense.gitcd mcp-pfsensepython -m venv .venvsource .venv/bin/activatepip install -e ".[dev]"
# Run testspytest
# Lint and type checkruff check .mypy src/

License

MIT

Repository and registry compatibility

The canonical repository is https://github.com/felhen-ai/mcp-pfsense. Existing GitHub clone and issue URLs redirect to this repository. Do not recreate a repository at the old address, which would remove those redirects.

The canonical MCP Registry identifier is io.github.felhen-ai/mcp-pfsense. The legacy identifier io.github.antonio-mello-ai/mcp-pfsense remains supported with a separate server.legacy.json manifest. Both identifiers install the same mcp-pfsense package from PyPI, and the package name and CLI command remain unchanged. Keep both ownership markers in this README so future releases can be registered under either identifier.

來源:README.md,提交 91891e0

工具

20

get_system_status

Get pfSense system status including version, CPU, memory, uptime, and temperature.

無需輸入參數。

get_interfaces

List all network interfaces with status and configuration.

無需輸入參數。

list_firewall_rules

List firewall rules, optionally filtered by interface.

輸入參數interface

add_firewall_rule

Add a firewall rule. Type is 'pass', 'block', or 'reject'. The rule is staged (not active) until apply_changes('firewall') is called or apply=true is passed here.

輸入參數type必填applydescrsourcedstportprotocolinterface必填ipprotocoldestination

delete_firewall_rule

Delete a firewall rule by its ID (the `id` from list_firewall_rules). Requires confirm=true. Staged until apply_changes('firewall') is called or apply=true is passed.

輸入參數applyconfirmrule_id必填

list_firewall_aliases

List firewall aliases (IP groups, port groups, URL lists).

無需輸入參數。

list_dhcp_leases

List active DHCP leases showing IP, MAC, hostname, and lease times.

無需輸入參數。

list_dhcp_static_mappings

List DHCP static mappings (IP reservations), optionally filtered by interface. Each mapping carries `parent_id` (its DHCP server / interface) — pass that as `interface` to delete_dhcp_static_mapping.

輸入參數interface

add_dhcp_static_mapping

Create a DHCP static mapping (IP reservation) for a MAC address. Staged until apply_changes('dhcp') is called or apply=true is passed.

輸入參數mac必填applydescripaddr必填hostnameinterface必填

delete_dhcp_static_mapping

Delete a DHCP static mapping. Requires confirm=true. `interface` is the mapping's DHCP server — the `parent_id` value returned by list_dhcp_static_mappings; `mapping_id` is its `id` there. Staged until apply_changes('dhcp') is called or apply=true is passed.

輸入參數applyconfirminterface必填mapping_id必填

list_dns_host_overrides

List DNS Resolver host overrides (local DNS entries).

無需輸入參數。

add_dns_host_override

Create a DNS host override entry in Unbound DNS Resolver. Staged until apply_changes('dns') is called or apply=true is passed.

輸入參數ip必填host必填applydescrdomain必填

delete_dns_host_override

Delete a DNS host override by ID. Requires confirm=true. Staged until apply_changes('dns') is called or apply=true is passed.

輸入參數applyconfirmoverride_id必填

get_pending_changes

Check whether a subsystem ('firewall', 'dhcp' or 'dns') has staged, unapplied changes.

輸入參數subsystem必填

apply_changes

Apply ALL staged changes of a subsystem ('firewall', 'dhcp' or 'dns'). Requires confirm=true. This reloads the subsystem, activating every pending change — including any a human staged in the pfSense WebGUI and has not reviewed yet.

輸入參數confirmsubsystem必填

get_gateway_status

Get gateway status including latency, packet loss, and online state.

無需輸入參數。

get_arp_table

Get ARP table showing connected devices (IP, MAC, interface).

無需輸入參數。

list_services

List all services and their running status.

無需輸入參數。

restart_service

Restart a service by name. Requires confirm=true.

輸入參數name必填confirm

get_firewall_logs

Read-only view of recent firewall log entries. Each entry contains its ID and raw log text from pfrest. `limit` caps the number of entries (default 50). This tool only reads logs; it never writes to the firewall.

輸入參數limit

版本歷史

1
  1. v0.3.1最新Nov 4, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分