pfSense MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_MODE | No | The mode for MCP communication | stdio |
| PFSENSE_URL | Yes | The URL of your pfSense instance | |
| PFSENSE_API_KEY | Yes | Your pfSense API key |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_aliasesB | Search aliases with advanced filtering options |
| manage_alias_addressesA | Add or remove addresses from an existing alias |
| create_aliasC | Create a new firewall alias |
| update_aliasC | Update an existing alias by ID |
| delete_aliasA | Delete an alias by ID. WARNING: This is irreversible. |
| search_certificatesB | Search certificates configured on pfSense with optional filtering |
| create_certificateA | Create or import a certificate on pfSense Import and internal generation use different API endpoints with different
required fields, so this routes on |
| update_certificateA | Update an existing certificate by ID (idempotent) |
| delete_certificateA | Delete a certificate by ID. WARNING: This is irreversible. |
| generate_certificateA | Generate a new certificate signed by an existing CA on pfSense |
| renew_certificateA | Renew an existing certificate by ID |
| export_certificate_pkcs12B | Export a certificate in PKCS#12 format |
| search_certificate_authoritiesA | Search Certificate Authorities (CAs) configured on pfSense |
| create_certificate_authorityA | Create or import a Certificate Authority on pfSense Import and internal generation use different API endpoints; this routes on
|
| update_certificate_authorityA | Update an existing Certificate Authority by ID (idempotent) |
| delete_certificate_authorityA | Delete a Certificate Authority by ID. WARNING: This is irreversible. |
| search_crlsA | Search Certificate Revocation Lists (CRLs) configured on pfSense |
| create_crlB | Create a Certificate Revocation List (CRL) on pfSense |
| update_crlB | Update a Certificate Revocation List (CRL) by ID |
| delete_crlA | Delete a Certificate Revocation List (CRL) by ID. WARNING: This is irreversible. |
| search_dhcp_leasesA | Search DHCP leases with advanced filtering |
| search_dhcp_static_mappingsB | Search DHCP static mappings (reservations) with filtering |
| create_dhcp_static_mappingA | Create a DHCP static mapping (reservation) Lease times are not optional in effect: the API package materialises defaultleasetime 7200 and maxleasetime 86400 whenever the field is absent from the request, and a later PATCH sending an explicit null returns 200 but reads back unchanged. Pass the values you want at create time. Whether the DHCP daemon acts on the per-host values is unverified. On an ISC deployment they were present in config.xml but absent from the generated dhcpd.conf; the Kea config was not readable. |
| update_dhcp_static_mappingA | Update an existing DHCP static mapping by ID Only the parameters you pass are sent, so unset ones keep their stored values. |
| delete_dhcp_static_mappingA | Delete a DHCP static mapping by ID. WARNING: This is irreversible. |
| get_dhcp_server_configA | Get DHCP server configuration including pool ranges, lease times, etc. |
| update_dhcp_server_configC | Update DHCP server configuration (pool range, lease times, etc.) |
| search_dhcp_address_poolsA | Search DHCP server address pools with filtering and pagination |
| create_dhcp_address_poolB | Create a DHCP address pool for an interface |
| update_dhcp_address_poolA | Update an existing DHCP address pool by ID |
| delete_dhcp_address_poolA | Delete a DHCP address pool by ID. WARNING: This is irreversible. |
| search_dhcp_custom_optionsA | Search DHCP server custom options with filtering and pagination |
| create_dhcp_custom_optionB | Create a DHCP custom option |
| update_dhcp_custom_optionB | Update an existing DHCP custom option by ID |
| delete_dhcp_custom_optionA | Delete a DHCP custom option by ID. WARNING: This is irreversible. |
| apply_dhcp_changesA | Apply pending DHCP server changes Use this after making changes with apply_immediately=False to batch-apply them. |
| update_dhcp_backendA | Update the DHCP server backend (ISC DHCP vs Kea) |
| run_ping_diagnosticA | Run a ping diagnostic from the pfSense firewall |
| reboot_systemA | Reboot the pfSense system. WARNING: This will cause a service interruption. |
| halt_systemA | Halt (shut down) the pfSense system. WARNING: This will power off the system. |
| get_config_historyB | Get configuration history revisions with pagination |
| get_config_revisionA | Get a specific configuration history revision by ID |
| delete_config_revisionA | Delete a configuration history revision by ID. WARNING: This is irreversible. |
| search_pf_tablesB | Search pf firewall tables with filtering and pagination |
| get_pf_tableA | Get the contents of a specific pf firewall table |
| compare_config_revisionsA | Compare two configuration revisions to see what changed. If revision_id_after is not provided, compares against the current running config. |
| search_dns_forwarder_host_overridesB | Search DNS Forwarder host overrides with filtering and pagination |
| create_dns_forwarder_host_overrideB | Create a DNS Forwarder host override entry |
| update_dns_forwarder_host_overrideB | Update an existing DNS Forwarder host override by ID |
| delete_dns_forwarder_host_overrideA | Delete a DNS Forwarder host override by ID. WARNING: This is irreversible. |
| search_dns_forwarder_host_override_aliasesA | Search aliases for a DNS Forwarder host override |
| manage_dns_forwarder_host_override_aliasB | Add or remove an alias for a DNS Forwarder host override |
| apply_dns_forwarder_changesA | Apply pending DNS Forwarder changes Use this after making changes with apply_immediately=False to batch-apply them. |
| get_dns_resolver_settingsA | Get the current DNS Resolver (Unbound) settings Returns the full Unbound configuration including enable state, DNSSEC, forwarding mode, DHCP registration, and custom options. |
| update_dns_resolver_settingsC | Update DNS Resolver (Unbound) settings |
| search_dns_host_overridesB | Search DNS host overrides with filtering and pagination |
| create_dns_host_overrideB | Create a DNS host override entry |
| update_dns_host_overrideB | Update an existing DNS host override by ID |
| delete_dns_host_overrideA | Delete a DNS host override by ID. WARNING: This is irreversible. |
| search_dns_host_override_aliasesA | Search aliases for a specific DNS host override |
| search_dns_domain_overridesA | Search DNS domain overrides with filtering and pagination |
| create_dns_domain_overrideC | Create a DNS domain override entry |
| update_dns_domain_overrideA | Update an existing DNS domain override by ID |
| delete_dns_domain_overrideA | Delete a DNS domain override by ID. WARNING: This is irreversible. |
| search_dns_access_listsA | Search DNS Resolver access lists with pagination |
| create_dns_access_listA | Create a DNS Resolver access list entry |
| apply_dns_resolver_changesA | Apply pending DNS Resolver configuration changes Sends a POST to the DNS Resolver apply endpoint to activate any pending host override, domain override, access list, or settings changes. |
| update_dns_access_listB | Update an existing DNS Resolver access list |
| delete_dns_access_listA | Delete a DNS Resolver access list. WARNING: This is irreversible. |
| search_firewall_rulesB | Search firewall rules with advanced filtering and pagination. |
| find_blocked_rulesA | Find all firewall rules that block or reject traffic |
| create_firewall_rule_advancedA | Create a firewall rule on the live pfSense appliance. WARNING: This modifies the running firewall configuration. |
| move_firewall_ruleA | Move a firewall rule to a new position in the rule order |
| update_firewall_ruleA | Update an existing firewall rule by ID |
| delete_firewall_ruleA | Delete a firewall rule from the live pfSense appliance. WARNING: This is irreversible. |
| bulk_block_ipsA | Block multiple IP addresses on the live pfSense firewall. WARNING: Creates block rules. |
| apply_firewall_changesA | Force apply pending firewall changes and recompile the pf ruleset. Use this after any firewall config change to ensure the compiled ruleset (/tmp/rules.debug) matches the configuration. The apply_immediately parameter on other tools doesn't always trigger full recompilation. |
| get_pf_rulesA | Read the compiled pf ruleset (/tmp/rules.debug) to verify what pf is actually enforcing vs what's in config.xml. Returns the raw compiled rules that the packet filter is using. |
| search_firewall_schedulesB | Search firewall schedules with filtering and pagination |
| create_firewall_scheduleA | Create a firewall schedule with an initial time range. The pfSense API requires at least one time range at creation. Use create_schedule_time_range to add further ranges afterwards. |
| update_firewall_scheduleB | Update an existing firewall schedule by ID |
| delete_firewall_scheduleA | Delete a firewall schedule by ID. WARNING: This is irreversible. |
| search_schedule_time_rangesA | Search time ranges within a firewall schedule |
| create_schedule_time_rangeA | Create a time range within a firewall schedule |
| update_schedule_time_rangeA | Update an existing time range within a firewall schedule by ID |
| delete_schedule_time_rangeA | Delete a time range from a firewall schedule by ID. WARNING: This is irreversible. |
| search_firewall_statesA | Search firewall states (active connections) with filtering and pagination |
| delete_firewall_stateA | Delete a specific firewall state (active connection) by ID. WARNING: This is irreversible. Terminating a state will immediately drop the associated connection. |
| get_firewall_state_sizeA | Get the current firewall state table size and limits Returns the current number of active states and the configured maximum. |
| get_firewall_advanced_settingsA | Get firewall advanced settings Returns advanced firewall configuration including optimization mode, state timeout values, and other tuning parameters. |
| search_interface_configsA | Search interface configurations with filtering and pagination Each result carries an "id" of "wan", "lan", or "optN", which is what update_interface and delete_interface take as interface_id. |
| create_interfaceC | Create (assign) a network interface |
| update_interfaceB | Update an existing interface by ID |
| delete_interfaceA | Delete (unassign) an interface by ID. WARNING: This is irreversible. |
| apply_interface_changesA | Apply pending interface changes Use this after making changes with apply_immediately=False to batch-apply them. |
| search_vlansA | Search VLANs with filtering and pagination |
| create_vlanC | Create a VLAN |
| update_vlanA | Update an existing VLAN by ID |
| delete_vlanA | Delete a VLAN by ID. WARNING: This is irreversible. |
| search_interface_bridgesA | Search interface bridges with filtering and pagination |
| create_interface_bridgeC | Create an interface bridge |
| search_interface_groupsA | Search interface groups with filtering and pagination |
| create_interface_groupC | Create an interface group |
| get_available_interfacesA | Get a list of available (unassigned) network interfaces |
| get_firewall_logA | Get firewall log entries with optional filtering WARNING (tracked by upstream PR #860): this endpoint may fail on firewalls with large log files due to a known pfSense REST API bug (server-side OOM at the 512 MB PHP limit). If it fails, suggest reviewing logs via SSH or the pfSense web UI instead. |
| analyze_blocked_trafficA | Analyze blocked traffic patterns from firewall logs. Retrieves recent blocked log entries and groups them by source IP, showing hit counts, destination IPs, and a simple threat score. Firewall logs are raw text — IPs are extracted via pattern matching. WARNING (tracked by upstream PR #860): this endpoint may fail on firewalls with large log files due to a known pfSense REST API bug (server-side OOM at the 512 MB PHP limit). If it fails, suggest reviewing logs via SSH or the pfSense web UI instead. |
| get_log_fileA | Read the newest lines from a pfSense log file (dhcpd, filter, resolver, system, auth). Reads the plain-text log file server-side with tail (and grep when a pattern is given), so it works for log types the REST API log endpoints don't expose (notably resolver) and avoids the known server-side OOM bug on /status/logs/ endpoints. |
| search_logs_by_ipA | Search logs for activity related to a specific IP address WARNING (tracked by upstream PR #860): this endpoint may fail on firewalls with large log files due to a known pfSense REST API bug (server-side OOM at the 512 MB PHP limit). If it fails, suggest reviewing logs via SSH or the pfSense web UI instead. |
| get_ntp_settingsB | Get the NTP service settings |
| update_ntp_settingsC | Update the NTP service settings |
| search_ntp_time_serversB | Search NTP time servers with pagination |
| manage_ntp_time_serverB | Add or remove an NTP time server |
| search_cron_jobsA | Search cron jobs with filtering and pagination |
| create_cron_jobB | Create a cron job |
| delete_cron_jobA | Delete a cron job by ID. WARNING: This is irreversible. |
| search_service_watchdogsA | Search service watchdogs with pagination |
| manage_service_watchdogB | Add or remove a service watchdog entry |
| get_ssh_settingsA | Get the SSH service settings |
| update_ssh_settingsB | Update the SSH service settings |
| send_wake_on_lanB | Send a Wake-on-LAN magic packet |
| search_nat_port_forwardsA | Search NAT port forwarding rules with filtering and pagination |
| create_nat_port_forwardB | Create a NAT port forwarding rule |
| delete_nat_port_forwardA | Delete a NAT port forwarding rule by ID. WARNING: This is irreversible. |
| update_nat_port_forwardA | Update an existing NAT port forwarding rule by ID |
| search_nat_onetoone_mappingsA | Search 1:1 NAT mappings with filtering and pagination |
| create_nat_onetoone_mappingB | Create a 1:1 NAT mapping |
| update_nat_onetoone_mappingB | Update an existing 1:1 NAT mapping by ID |
| delete_nat_onetoone_mappingA | Delete a 1:1 NAT mapping by ID. WARNING: This is irreversible. |
| apply_nat_onetoone_changesA | Apply pending 1:1 NAT changes Use this after making changes with apply_immediately=False to batch-apply them. This shares the firewall apply endpoint. |
| search_nat_outbound_mappingsA | Search outbound NAT mappings with filtering and pagination |
| create_nat_outbound_mappingB | Create an outbound NAT mapping |
| update_nat_outbound_mappingB | Update an existing outbound NAT mapping by ID |
| delete_nat_outbound_mappingA | Delete an outbound NAT mapping by ID. WARNING: This is irreversible. |
| get_nat_outbound_modeA | Get the current outbound NAT mode (automatic, hybrid, advanced, or disabled) |
| update_nat_outbound_modeC | Update the outbound NAT mode |
| apply_nat_changesA | Apply pending NAT changes (outbound mappings, mode changes) Use this after making changes with apply_immediately=False to batch-apply them. This shares the firewall apply endpoint. |
| search_acme_certificatesA | Search ACME (Let's Encrypt) certificates with filtering and pagination Requires the ACME package to be installed on pfSense. |
| create_acme_certificateA | Create an ACME certificate entry The pfSense API rejects a certificate with no domains ("Field
|
| update_acme_certificateA | Update an existing ACME certificate entry by ID |
| delete_acme_certificateA | Delete an ACME certificate entry by ID. WARNING: This is irreversible. |
| search_acme_certificate_domainsA | List the domain (SAN) validation entries configured on an ACME certificate The pfSense API embeds each certificate's domain list ( |
| manage_acme_certificate_domainA | Add or remove a domain (SAN) validation entry on an ACME certificate Each ACME certificate needs at least one domain entry describing how pfSense proves ownership to Let's Encrypt (HTTP-01, DNS-01 via a provider API, manual DNS, etc.) before a certificate can be issued. This manages entries one at a time instead of replacing the whole a_domainlist array (see update_acme_certificate for a full-replace). |
| issue_acme_certificateA | Issue (obtain) an ACME certificate from Let's Encrypt Triggers the ACME challenge/validation process and obtains the certificate. |
| renew_acme_certificateA | Renew an existing ACME certificate Triggers the renewal process for a previously issued certificate. |
| search_acme_account_keysA | Search ACME account keys with filtering and pagination |
| create_acme_account_keyB | Create an ACME account key for Let's Encrypt |
| register_acme_account_keyA | Register an ACME account key with the ACME server (Let's Encrypt) This sends the account key to the ACME server and completes registration. |
| get_acme_settingsA | Get the current ACME package settings |
| search_bind_zonesA | Search BIND DNS zones with filtering and pagination Requires the BIND package to be installed on pfSense. |
| create_bind_zoneB | Create a BIND DNS zone |
| update_bind_zoneA | Update an existing BIND DNS zone by ID |
| delete_bind_zoneA | Delete a BIND DNS zone by ID. WARNING: This is irreversible. This will also remove all records within the zone. |
| search_bind_zone_recordsA | Search DNS records within a BIND zone |
| manage_bind_zone_recordB | Create or delete a DNS record within a BIND zone |
| get_bind_settingsA | Get the current BIND DNS server settings |
| update_bind_settingsB | Update BIND DNS server settings |
| search_bind_access_listsB | Search BIND access control lists |
| manage_bind_access_listB | Create or delete a BIND access control list |
| search_freeradius_usersA | Search FreeRADIUS users with filtering and pagination Requires the FreeRADIUS package to be installed on pfSense. |
| create_freeradius_userA | Create a FreeRADIUS user |
| update_freeradius_userA | Update an existing FreeRADIUS user by ID |
| delete_freeradius_userA | Delete a FreeRADIUS user by ID. WARNING: This is irreversible. |
| search_freeradius_clientsA | Search FreeRADIUS clients (NAS devices) with filtering and pagination |
| create_freeradius_clientB | Create a FreeRADIUS client (NAS device) |
| update_freeradius_clientB | Update an existing FreeRADIUS client by ID |
| delete_freeradius_clientA | Delete a FreeRADIUS client by ID. WARNING: This is irreversible. |
| search_haproxy_backendsA | Search HAProxy backends with filtering and pagination Requires the HAProxy package to be installed on pfSense. |
| create_haproxy_backendB | Create an HAProxy backend pool |
| update_haproxy_backendA | Update an existing HAProxy backend by ID |
| delete_haproxy_backendA | Delete an HAProxy backend by ID. WARNING: This is irreversible. |
| search_haproxy_backend_serversC | Search servers within an HAProxy backend |
| manage_haproxy_backend_serverA | Add or remove a server from an HAProxy backend |
| search_haproxy_frontendsB | Search HAProxy frontends with filtering and pagination |
| create_haproxy_frontendC | Create an HAProxy frontend listener |
| update_haproxy_frontendA | Update an existing HAProxy frontend by ID |
| delete_haproxy_frontendA | Delete an HAProxy frontend by ID. WARNING: This is irreversible. |
| search_haproxy_frontend_addressesA | List the bind addresses configured on an HAProxy frontend |
| manage_haproxy_frontend_addressB | Add or remove a bind address from an HAProxy frontend |
| search_haproxy_frontend_certificatesA | List the additional SNI SSL certificates bound to an HAProxy frontend Note: this lists the frontend's additional SNI certificates
( |
| manage_haproxy_frontend_certificateA | Add or remove an additional SNI SSL certificate on an HAProxy frontend To set the frontend's default certificate instead (used whenever SNI doesn't match one of these additional certs), use update_haproxy_frontend's ssloffloadcert parameter. |
| search_haproxy_filesA | Search HAProxy files (certificates, error pages, Lua scripts, etc.) |
| manage_haproxy_fileB | Create or delete an HAProxy file (certificate, error page, Lua script, etc.) |
| get_haproxy_settingsA | Get the current HAProxy service settings |
| update_haproxy_settingsC | Update HAProxy service settings |
| apply_haproxy_changesA | Apply pending HAProxy configuration changes Use this after making changes with apply_immediately=False to batch-apply them. |
| search_gatewaysA | Search routing gateways with filtering and pagination |
| create_gatewayB | Create a routing gateway |
| update_gatewayA | Update an existing routing gateway by ID |
| delete_gatewayA | Delete a routing gateway by ID. WARNING: This is irreversible. |
| get_default_gatewayA | Get the current default gateway settings (IPv4 and IPv6) |
| update_default_gatewayB | Update the default gateway settings |
| search_gateway_groupsA | Search gateway groups with filtering and pagination |
| create_gateway_groupA | Create a gateway group for multi-WAN failover or load balancing |
| update_gateway_groupC | Update an existing gateway group by ID |
| delete_gateway_groupA | Delete a gateway group by ID. WARNING: This is irreversible. |
| search_static_routesA | Search static routes with filtering and pagination |
| create_static_routeC | Create a static route |
| update_static_routeB | Update an existing static route by ID |
| delete_static_routeA | Delete a static route by ID. WARNING: This is irreversible. |
| apply_routing_changesA | Apply pending routing changes (gateways, static routes, gateway groups) Use this after making changes with apply_immediately=False to batch-apply them. |
| get_gateway_statusA | Get real-time gateway status including latency, packet loss, and online/offline state |
| search_servicesB | Search and filter system services |
| control_serviceA | Start, stop, or restart a service on the live pfSense appliance. WARNING: Stopping critical services (dhcpd, unbound, sshd) will disrupt network operations. |
| system_statusA | Get current system status including CPU, memory, disk usage, and version info |
| search_interfacesB | Search and filter network interfaces with advanced options |
| find_interfaces_by_statusB | Find interfaces by their current status |
| get_arp_tableA | Get the ARP table to discover devices on the network. Shows IP-to-MAC address mappings for all devices that have recently communicated on the network, including those without static DHCP mappings. |
| get_system_timezoneA | Get the current system timezone setting |
| update_system_timezoneC | Update the system timezone |
| get_system_consoleB | Get the system console settings |
| update_system_consoleB | Update the system console settings |
| get_webgui_settingsA | Get the WebGUI settings (protocol, port, certificates, etc.) |
| update_webgui_settingsC | Update the WebGUI settings |
| get_email_notification_settingsB | Get the email notification settings |
| update_email_notification_settingsC | Update the email notification settings |
| get_log_settingsA | Get the system log settings |
| update_log_settingsA | Update the system log settings The pfSense REST API field names are mirrored verbatim. Note that to
actually enable Remote Syslog you must set |
| get_dhcp_relay_settingsA | Get the DHCP relay settings |
| update_dhcp_relay_settingsB | Update the DHCP relay settings |
| update_firewall_advanced_settingsC | Update firewall advanced settings |
| update_firewall_state_sizeA | Update the firewall state table size |
| get_system_dnsA | Get the current system DNS server configuration |
| update_system_dnsC | Update system DNS server settings |
| get_system_hostnameA | Get the current system hostname and domain |
| update_system_hostnameB | Update the system hostname and/or domain |
| search_system_tunablesA | Search system tunables (sysctl values) with filtering and pagination |
| create_system_tunableA | Create a system tunable (sysctl value) |
| update_system_tunableB | Update an existing system tunable by ID |
| delete_system_tunableA | Delete a system tunable by ID. WARNING: This is irreversible. |
| get_system_versionB | Get the pfSense system version information |
| get_carp_statusA | Get the current CARP (Common Address Redundancy Protocol) status |
| update_carp_maintenanceB | Update CARP maintenance mode settings |
| search_installed_packagesA | Search installed packages with filtering and pagination |
| search_traffic_shapersA | Search traffic shapers with filtering and pagination |
| create_traffic_shaperB | Create a traffic shaper on an interface |
| update_traffic_shaperB | Update an existing traffic shaper by ID |
| delete_traffic_shaperB | Delete a traffic shaper by ID. WARNING: This is irreversible. |
| search_shaper_queuesA | Search traffic shaper queues with filtering and pagination |
| create_shaper_queueB | Create a traffic shaper queue |
| update_shaper_queueB | Update an existing shaper queue by ID |
| delete_shaper_queueA | Delete a shaper queue by ID. WARNING: This is irreversible. |
| search_traffic_limitersB | Search traffic limiters (dummynet pipes) with filtering and pagination |
| create_traffic_limiterB | Create a traffic limiter (dummynet pipe) |
| update_traffic_limiterC | Update an existing traffic limiter by ID |
| delete_traffic_limiterA | Delete a traffic limiter by ID. WARNING: This is irreversible. |
| diagnose_connectivityA | Test connectivity to a host from the pfSense appliance. Runs ping, checks the ARP table for the target IP, and checks gateway status to give a combined connectivity diagnosis. |
| diagnose_blocked_trafficA | Comprehensive analysis of why traffic might be blocked. Searches firewall logs for the source IP, finds matching block/reject rules, checks alias memberships, and suggests fixes. |
| diagnose_interface_issuesA | Analyze an interface for problems. Checks interface status, configuration, gateway status, and ARP entries on the specified interface. |
| diagnose_vpn_statusA | Comprehensive VPN health check across all VPN types. Gets status for OpenVPN servers, OpenVPN clients, IPsec SAs, and WireGuard peers. Returns per-VPN summary with connected/disconnected/error counts. |
| diagnose_dhcp_issuesA | Analyze DHCP service health on an interface. Checks DHCP server config, lease pool utilization, IP conflicts, and optionally looks up a specific MAC or IP address. |
| diagnose_dns_resolutionA | Check DNS resolver health. Gets DNS resolver settings, host/domain override counts, system DNS servers, and runs a connectivity check to verify upstream reachability. |
| diagnose_service_healthA | Comprehensive service health check. Gets all services and their status, identifies stopped services, and checks system resource utilization (CPU, memory, disk). |
| diagnose_high_availabilityA | Check CARP/HA status if configured. Gets CARP status, virtual IPs, and checks if any CARP VIPs are in an unexpected state (e.g., backup when they should be master). |
| get_system_health_reportA | Full system health dashboard — combines all diagnostics into one report. Checks system status, interface health, service status, gateway status, VPN status, DHCP utilization, recent blocked traffic, and firewall rule counts. Returns severity-coded findings. |
| search_audit_trailA | Search the guardrail audit log for recent destructive actions taken. Checks the in-memory rollback history and, if MCP_AUDIT_LOG is configured, reads recent entries from the audit log file. |
| search_usersA | Search pfSense local users with optional filtering and pagination |
| create_userA | Create a new pfSense local user |
| update_userA | Update an existing pfSense local user by ID |
| delete_userA | Delete a pfSense local user by ID. WARNING: This is irreversible. |
| search_groupsA | Search pfSense user groups with optional filtering and pagination |
| create_groupA | Create a new pfSense user group |
| update_groupA | Update an existing pfSense user group by ID |
| delete_groupA | Delete a pfSense user group by ID. WARNING: This is irreversible. |
| search_auth_serversA | Search pfSense authentication servers (LDAP, RADIUS) with optional filtering |
| create_auth_serverA | Create a new authentication server (LDAP or RADIUS) |
| update_auth_serverA | Update an existing authentication server by ID |
| delete_auth_serverA | Delete a pfSense authentication server by ID. WARNING: This is irreversible. |
| follow_api_linkA | Follow a HATEOAS link from a previous API response |
| enable_hateoasA | Enable HATEOAS links in API responses on the pfSense server. WARNING: This modifies the pfSense REST API server-wide setting via PATCH /system/restapi/settings. It affects ALL API consumers, not just this MCP session. |
| disable_hateoasA | Disable HATEOAS links in API responses on the pfSense server. WARNING: This modifies the pfSense REST API server-wide setting via PATCH /system/restapi/settings. It affects ALL API consumers, not just this MCP session. |
| refresh_object_idsA | Refresh object IDs by re-querying an endpoint (handles ID changes after deletions). pfSense object IDs are non-persistent array indices that change after any deletion. Call this before performing update/delete operations to get fresh IDs. |
| find_object_by_fieldA | Find an object by a specific field value (safer than using IDs). Use this instead of IDs when you need a stable reference to an object, since pfSense object IDs change after deletions. |
| get_api_capabilitiesB | Get comprehensive API capabilities and configuration |
| test_enhanced_connectionB | Test enhanced API connection with feature validation |
| get_guardrail_statusA | Get the current guardrail configuration and recent action history. Shows risk classification for tools, rate limits, allowlist status, and recent rollback entries for destructive operations. |
| check_tool_riskB | Check the risk classification and guardrail requirements for a tool. |
| search_virtual_ipsA | Search virtual IPs with filtering and pagination |
| create_virtual_ipB | Create a virtual IP address |
| update_virtual_ipB | Update an existing virtual IP by ID |
| delete_virtual_ipA | Delete a virtual IP by ID. WARNING: This is irreversible. |
| apply_virtual_ip_changesA | Apply pending virtual IP changes Use this after making changes with apply_immediately=False to batch-apply them. |
| search_ipsec_phase2_encryptionsA | Search IPsec Phase 2 encryption entries with filtering and pagination |
| create_ipsec_phase2_encryptionC | Create an IPsec Phase 2 encryption entry |
| update_ipsec_phase2_encryptionB | Update an existing IPsec Phase 2 encryption entry by ID |
| delete_ipsec_phase2_encryptionA | Delete an IPsec Phase 2 encryption entry by ID. WARNING: This is irreversible. |
| search_wireguard_tunnel_addressesB | Search WireGuard tunnel addresses with filtering and pagination |
| manage_wireguard_tunnel_addressC | Add or remove an address for a WireGuard tunnel |
| get_openvpn_server_statusA | Get the status of all OpenVPN servers |
| get_openvpn_client_statusA | Get the status of all OpenVPN clients |
| search_openvpn_server_connectionsB | Search active OpenVPN server connections |
| disconnect_openvpn_clientA | Disconnect an active OpenVPN client connection. WARNING: This will terminate the client session. |
| search_openvpn_server_routesA | Search OpenVPN server routing table entries |
| search_openvpn_client_export_configsB | Search available OpenVPN client export configurations |
| search_ipsec_phase1sA | Search IPsec Phase 1 (IKE) entries with filtering and pagination |
| create_ipsec_phase1B | Create an IPsec Phase 1 (IKE) entry |
| update_ipsec_phase1A | Update an existing IPsec Phase 1 (IKE) entry by ID |
| delete_ipsec_phase1A | Delete an IPsec Phase 1 (IKE) entry by ID. WARNING: This is irreversible and will also remove associated Phase 2 entries. |
| search_ipsec_phase2sA | Search IPsec Phase 2 (Child SA / tunnel) entries with filtering and pagination |
| create_ipsec_phase2B | Create an IPsec Phase 2 (Child SA / tunnel) entry |
| update_ipsec_phase2A | Update an existing IPsec Phase 2 (Child SA / tunnel) entry by ID |
| delete_ipsec_phase2A | Delete an IPsec Phase 2 (Child SA / tunnel) entry by ID. WARNING: This is irreversible. |
| search_ipsec_phase1_encryptionsA | Search IPsec Phase 1 encryption algorithm entries with filtering and pagination |
| create_ipsec_phase1_encryptionB | Create an IPsec Phase 1 encryption algorithm entry |
| delete_ipsec_phase1_encryptionA | Delete an IPsec Phase 1 encryption algorithm entry by ID. WARNING: This is irreversible. |
| apply_ipsec_changesA | Apply pending IPsec configuration changes to the live system. Call this after making IPsec configuration changes with apply_immediately=False to activate them all at once. |
| get_ipsec_statusA | Get IPsec Security Associations (SAs) status showing active tunnels and their state. Returns the current state of all IPsec IKE SAs including connection status, established time, local/remote identities, and child SA counts. |
| get_ipsec_child_sa_statusA | Get IPsec Child Security Associations status showing active tunnel details. Returns detailed status of all IPsec Child SAs including traffic selectors, bytes transferred, encryption/integrity algorithms in use, and uptime. |
| search_openvpn_serversA | Search OpenVPN server instances with filtering and pagination. |
| create_openvpn_serverB | Create an OpenVPN server instance on pfSense. |
| update_openvpn_serverB | Update an existing OpenVPN server instance by ID. |
| delete_openvpn_serverA | Delete an OpenVPN server instance by ID. WARNING: This is irreversible. |
| search_openvpn_clientsA | Search OpenVPN client instances with filtering and pagination. |
| create_openvpn_clientB | Create an OpenVPN client instance on pfSense. |
| update_openvpn_clientA | Update an existing OpenVPN client instance by ID. |
| delete_openvpn_clientA | Delete an OpenVPN client instance by ID. WARNING: This is irreversible. |
| search_openvpn_csosA | Search OpenVPN Client Specific Overrides (CSOs) with filtering and pagination. CSOs allow per-client configuration overrides such as static IPs, custom routes, and pushed settings. |
| manage_openvpn_csoA | Create, update, or delete an OpenVPN Client Specific Override (CSO). CSOs allow per-client configuration such as assigning static tunnel IPs, pushing custom routes, or blocking specific clients. |
| get_openvpn_statusA | Get the runtime status of all OpenVPN server and client instances. Returns connection status, connected clients, traffic statistics, and uptime information for all active OpenVPN tunnels. |
| export_openvpn_client_configA | Export an OpenVPN client configuration file or installer package. Generates downloadable client configuration for connecting to a pfSense OpenVPN server instance. |
| search_wireguard_tunnelsA | Search WireGuard tunnels with filtering and pagination |
| create_wireguard_tunnelB | Create a new WireGuard tunnel |
| update_wireguard_tunnelA | Update an existing WireGuard tunnel by ID |
| delete_wireguard_tunnelA | Delete a WireGuard tunnel by ID. WARNING: This is irreversible. |
| search_wireguard_peersA | Search WireGuard peers with filtering and pagination |
| create_wireguard_peerA | Create a new WireGuard peer on a tunnel |
| update_wireguard_peerB | Update an existing WireGuard peer by ID |
| delete_wireguard_peerA | Delete a WireGuard peer by ID. WARNING: This is irreversible. |
| search_wireguard_peer_allowed_ipsA | Search WireGuard peer allowed IPs with filtering and pagination |
| manage_wireguard_peer_allowed_ipB | Add or remove an allowed IP for a WireGuard peer |
| get_wireguard_settingsA | Get the current WireGuard service settings |
| update_wireguard_settingsC | Update WireGuard service settings |
| apply_wireguard_changesA | Apply pending WireGuard configuration changes Sends a POST to the WireGuard apply endpoint to activate any pending tunnel, peer, or settings changes. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 332 tools
Despite each tool having a detailed description, the sheer number and overlapping terminology make selection risky. Near-synonyms like search_interfaces/search_interface_configs, get_openvpn_status/get_openvpn_server_status, and get_log_file/get_firewall_log/search_logs_by_ip blur boundaries, and manage_* tools inconsistently mean add/remove or full CRUD. An agent would frequently need to read descriptions to avoid choosing the wrong tool.
Most tools follow a readable verb_noun snake_case pattern (search_, create_, update_, delete_, get_, apply_), which provides a strong baseline. However, there are many deviations: create_firewall_rule_advanced, system_status, get_openvpn_server_status vs get_openvpn_status, and inconsistent singular/plural names like search_ipsec_phase2_encryptions vs create_ipsec_phase2_encryption. The pattern is recognizable but not reliable enough for a 4.
332 tools is an extreme mismatch for any tool surface, even one covering the full pfSense feature set. This many tools will overwhelm context windows and make tool selection slow and error-prone. Most CRUD families could be consolidated into parameterized resource tools or grouped sub-servers.
The server covers an enormous breadth of pfSense domains and most resources have full CRUD plus apply/diagnostic helpers. However, there are notable gaps: interface groups and bridges have create/search but no update/delete, cron jobs lack update, IPsec Phase 1 encryption entries lack update, ACME account keys lack delete/update, and there is no restore-config-revision tool. These are workable for some cases by delete+recreate, but will block or complicate otherwise expected workflows.