pfSense MCP Server
Permite la interacción en lenguaje natural con firewalls pfSense a través de aplicaciones GenAI.
Documentación
🛡️ pfSense MCP Server
Gestiona tu firewall pfSense en lenguaje natural — desde Claude Desktop, Claude Code o cualquier cliente MCP.
332 herramientas en todos los subsistemas · formato de cable verificado contra la API REST de pfSense · protecciones de seguridad en cada cambio
You: Block all traffic from 203.0.113.5 on WAN
Claude: ✓ created block rule → ✓ applied changes → rollback point: config revision 42
You: Why can't 192.168.1.50 reach the internet?
Claude: ran diagnostics → gateway WAN_DHCP is down, and a block rule on LAN matches this host
You: Add a WireGuard peer for my laptop and show me the config
Claude: ✓ created peer on tun_wg0 → here's the client config to import
pfSense MCP Server conecta Claude Desktop, Claude Code y cualquier otro cliente MCP a tu firewall pfSense. Haz preguntas, diagnostica problemas y cambia la configuración mediante conversación. Cada acción destructiva requiere confirmación explícita, y el servidor registra la revisión de configuración a la que se puede revertir.
Permitir que una IA modifique un firewall de producción solo es seguro si los detalles son correctos, y ahí es donde se ha puesto el esfuerzo:
- Una capa de pruebas de contrato verifica el formato de solicitud de cada herramienta contra el esquema de la API REST de pfSense.
- Cada cambio pasa por un pipeline de protección de múltiples capas.
- CI ejecuta 661 pruebas en Python 3.11–3.13, además de una prueba de protocolo MCP de extremo a extremo.
Última versión: v1.1.0 · Registro de cambios
[!TIP] Ve directamente a la Guía de inicio rápido. La configuración toma unos dos minutos con
uvx, y no necesitas clonar nada. Si este proyecto te resulta útil, una ⭐ ayuda a que otros lo encuentren.
Contenido
Por qué existe · Inicio rápido · Qué puedes hacer · Seguridad · Versiones compatibles · Autenticación · Despliegue · Configuración · Pruebas · Cumplimiento MCP · Limitaciones conocidas · Arquitectura · Contribuciones
Por Qué Existe
Gestionar un firewall pfSense significa hacer clic en pestañas de la interfaz web, recordar nombres de campos y esperar no equivocarte con una regla que te deje fuera. Con este servidor MCP, describes lo que quieres en lenguaje natural y la IA se encarga de las llamadas a la API REST, valida las entradas y te advierte antes de que ocurra algo destructivo.
Qué lo hace diferente:
- Cada operación destructiva requiere confirmación explícita y te muestra exactamente qué va a ocurrir
- La revisión de configuración se captura antes de cada cambio de alto riesgo. La respuesta proporciona el ID de revisión para restaurar desde Diagnostics › Backup & Restore › Config History en la webGUI, o advierte explícitamente si no se pudo capturar ninguna revisión.
- Los límites de velocidad en cada herramienta que modifica la configuración evitan que un bucle de IA descontrolado inunde tu firewall
- Validación positiva de entradas (IP/puerto/MAC/CIDR) más filtrado de path-traversal/XSS, y secretos redactados de los registros y de las respuestas de error de la API
- Formato de cable verificado contra el esquema de la API REST de pfSense v2.10.2 mediante una capa de pruebas de contrato, para que las herramientas envíen exactamente lo que la API espera
Inicio Rápido
Requisitos previos:
- Python 3.11 o posterior.
- pfSense con el paquete REST API v2 instalado. Consulta Versiones de pfSense compatibles.
- Para la Opción A, uv.
[!IMPORTANT] Este proyecto no está publicado en PyPI. Un proyecto diferente y no relacionado usa el nombre de PyPI
pfsense-mcp-server, así que nunca ejecutespip install pfsense-mcp-server. Instala desde Git o desde los archivos de versión como se muestra a continuación.
Opción A: ejecutar sin clonar (uvx):
uvx --from git+https://github.com/gensecaihq/pfsense-mcp-server@v1.1.0 pfsense-mcp-server
Opción B: clonar para desarrollo:
git clone https://github.com/gensecaihq/pfsense-mcp-server.git
cd pfsense-mcp-server
pip install -r requirements.txt
cp .env.example .env
# Edit .env: set PFSENSE_URL, AUTH_METHOD, and credentials
Conéctate a Claude Desktop. Añade el servidor a claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/ - Windows:
%APPDATA%\Claude\
Usando el punto de entrada instalado (Opción A):
{
"mcpServers": {
"pfsense": {
"command": "uvx",
"args": ["--from", "git+https://github.com/gensecaihq/pfsense-mcp-server@v1.1.0", "pfsense-mcp-server"],
"env": {
"PFSENSE_URL": "https://192.168.1.1",
"AUTH_METHOD": "basic",
"PFSENSE_USERNAME": "admin",
"PFSENSE_PASSWORD": "your-password",
"PFSENSE_VERSION": "CE_2_8_1",
"PFSENSE_CA_FILE": "/path/to/pfsense-ca.pem"
}
}
}
}
O ejecutando desde un clon (Opción B):
{
"mcpServers": {
"pfsense": {
"command": "python3",
"args": ["-m", "src.main"],
"cwd": "/path/to/pfsense-mcp-server",
"env": {
"PFSENSE_URL": "https://192.168.1.1",
"AUTH_METHOD": "basic",
"PFSENSE_USERNAME": "admin",
"PFSENSE_PASSWORD": "your-password",
"PFSENSE_VERSION": "CE_2_8_1",
"PFSENSE_CA_FILE": "/path/to/pfsense-ca.pem"
}
}
}
}
Elimina PFSENSE_CA_FILE si el certificado de tu pfSense está firmado por una CA pública.
Acerca del archivo CA. pfSense incluye un certificado autofirmado de su propia
CA, y Python no lee el almacén de confianza de tu sistema operativo, por lo que la
verificación falla de forma predeterminada. Exporta la CA en System > Cert. Manager > CAs (el icono de exportar certificado),
guarda el PEM en cualquier ubicación legible y apunta PFSENSE_CA_FILE a él. Un
archivo faltante o ilegible es un error de inicio, nunca una degradación silenciosa.
VERIFY_SSL=false también se conecta, y es adecuado para un laboratorio desechable. Comprende lo que
cuesta: nada autentica el firewall, por lo que cualquier cosa que pueda interceptar la
conexión puede leer la clave API y actuar como el firewall. Esta herramienta cambia
reglas de firewall — trata esa credencial en consecuencia.
Empieza a hablar con tu firewall. Abre Claude Desktop y pregunta:
- "Muéstrame todo el tráfico bloqueado en la última hora"
- "¿Qué servicios están en ejecución?"
- "Crea una redirección de puerto para el puerto 443 a 192.168.1.50"
- "Ejecuta una verificación completa de salud del sistema"
Qué Puedes Hacer
332 herramientas en todos los subsistemas principales de pfSense:
| Dominio | Herramientas | Qué Puedes Hacer |
|---|---|---|
| Reglas de Firewall | 9 | Crear, actualizar, eliminar, reordenar reglas. Bloquear IPs en bloque. Ver el ruleset pf compilado. |
| Aliases | 5 | Gestionar aliases de host/red/puerto/URL. Añadir y eliminar direcciones. |
| NAT | 16 | Redirecciones de puerto, NAT de salida, NAT 1:1 — gestión completa del ciclo de vida. |
| VPN | 51 | Servidores y clientes OpenVPN, túneles IPsec, pares WireGuard — CRUD, estado, aplicar. |
| Enrutamiento | 16 | Gateways, grupos de gateways, rutas estáticas, gestión del gateway predeterminado. |
| DNS | 23 | Resolvedor Unbound y reenviador dnsmasq: anulaciones de host, anulaciones de dominio, listas de acceso. |
| DHCP | 17 | Concesiones, asignaciones estáticas, pools de direcciones, opciones personalizadas, configuración del servidor. |
| Certificados | 15 | Certificados, CAs, CRLs — generar, renovar, exportar PKCS12. |
| Usuarios | 12 | Cuentas de usuario, grupos, configuración del servidor de autenticación LDAP/RADIUS. |
| Interfaces | 14 | Configuración de interfaces, VLANs, puentes, grupos. |
| Sistema | 43 | Estado, ajustes, diagnósticos, tabla de estados, historial de configuración, reinicio, ping. |
| Servicios | 14 | Iniciar/detener/reiniciar servicios. NTP, cron, SSH, vigilante de servicios. |
| Registros | 4 | Análisis de registros de firewall con datos filterlog IPv4/IPv6 analizados. Lecturas tail/grep de los archivos de registro dhcpd/filter/resolver/system/auth. |
| Modelado de Tráfico | 12 | Modeladores, colas y limitadores para gestión de ancho de banda. |
| Horarios | 8 | Programación de reglas de firewall basada en tiempo. |
| IPs Virtuales | 5 | Gestión de CARP, ProxyARP y Alias IP. |
| Solución de Problemas | 10 | Diagnosticar conectividad, tráfico bloqueado, VPN, DHCP, DNS, HA. Informe de salud completo. |
| Paquetes | 49 | HAProxy, ACME/Let's Encrypt, BIND DNS, FreeRADIUS. |
| Utilidades | 9 | Navegación HATEOAS, gestión de IDs de objetos, estado de protecciones. |
Seguridad Primero
Una IA gestionando un firewall de producción necesita protecciones. Este servidor tiene 9 capas:
"Delete firewall rule 5"
1. CLASSIFY → HIGH risk (destructive)
2. ALLOWLIST → tool is permitted
3. SANITIZE → parameters clean (no injection)
4. RATE LIMIT → under 10 deletes/minute
5. DRY RUN? → user can preview first
6. CONFIRM → blocked until confirm=True
7. BACKUP → config revision captured
8. EXECUTE → API call made
9. AUDIT LOG → action recorded with redacted params
Response includes:
"config_backup": {
"pre_change_revision_id": 42,
"rollback_instruction": "To undo this change, restore revision 42 manually in the pfSense webGUI: Diagnostics > Backup & Restore > Config History."
}
Las 201 herramientas que modifican la configuración llevan una protección, y una prueba falla la compilación si una nueva se publica sin ella.
- Cada herramienta de cambio tiene límite de velocidad, registro de auditoría y verificación contra la lista de permitidos.
- Herramientas de alto riesgo (51): eliminaciones, desconexiones, reinicios, apagados y bloqueos en bloque también están bloqueadas hasta que el llamante pase
confirm=True. - Herramientas
manage_*: estas requierenconfirm=Truepara sus acciones de eliminación y borrado. - Secretos: contraseñas, claves, PSKs, contraseñas de enlace y tokens se redactan en el registro de auditoría y en las respuestas de error de la API reflejadas.
confirm=True es un parámetro que envía el cliente MCP. No es un paso separado de aprobación humana, así que mantén activadas las indicaciones de aprobación de herramientas de tu cliente para las herramientas destructivas.
También puedes:
- Pasar
dry_run=Truepara previsualizar cualquier operación destructiva sin ejecutarla. - Pasar
verify_descr="Allow HTTPS"para verificar que estás cambiando o eliminando la regla que esperas. Esto protege contra IDs de reglas que cambian. - Establecer
MCP_READ_ONLY=truepara exponer solo las 131 herramientas de solo lectura (búsqueda, obtención, diagnóstico). - Establecer
MCP_ALLOWED_TOOLS=create_firewall_rule_advanced,delete_firewall_rulepara permitir solo las herramientas de escritura listadas. Las herramientas de lectura permanecen disponibles.
Consulta SECURITY.md para la política de divulgación de vulnerabilidades y las guías de endurecimiento del despliegue.
Versiones de pfSense Compatibles
| Versión | Paquete REST API | Estado |
|---|---|---|
| pfSense CE 2.9.0 | v2.10.2 (última) | Compatible |
| pfSense CE 2.8.1 | v2.10.2 (última) | Verificada |
| pfSense Plus 26.07 | v2.10.2 (última) | Compatible |
| pfSense Plus 26.03.1 | v2.10.2 (última) | Compatible |
| pfSense Plus 26.03 | v2.10.2 (última) | Verificada |
| pfSense Plus 25.11.1 | v2.10.2 (última) | Compatible |
| pfSense Plus 25.11 | v2.7.3 (heredada) | Verificada |
| pfSense CE 2.8.0 | v2.7.3 (heredada) | Compatible |
| pfSense Plus 24.11 | v2.7.3 (heredada) | Compatible |
Requiere el paquete pfSense REST API v2 de jaredhendrickson13. El paquete v2.8.x+ incluye compilaciones solo para CE 2.8.1 y Plus 25.11.1/26.03/26.03.1; CE 2.9.0 y Plus 26.07 necesitan v2.10.1+; v2.7.3 es la última versión con compilaciones para CE 2.8.0 y Plus 24.11/25.11.
Nota de seguridad: ejecuta el paquete REST API v2.10.0+. Corrige una falla de inyección de comandos en los endpoints de grupos de interfaces (GHSA-w3w4-mvcc-vmgr) y añade auto-escape de comandos del núcleo; v2.9.0 corrigió una escalada de privilegios anterior en la sincronización de ajustes (GHSA-8q8g-9f77-8g8g).
v2.10.0 también marca
OpenVPNClient.auth_pass,User.ipsecpskyWireGuardPeer.presharedkeycomo sensibles, por lo que la API ya no los devuelve de forma predeterminada. Este servidor aún los establece normalmente; si un flujo de trabajo necesita leer uno de vuelta, añade una anulación de campo sensible en la configuración de REST API.
Autenticación
Tres métodos compatibles (configurar en .env):
| Método | Configuración | Mejor Para |
|---|---|---|
| Autenticación Básica | AUTH_METHOD=basic + nombre de usuario/contraseña | Configuración rápida, usuarios locales |
| Clave API | AUTH_METHOD=api_key + clave de System > REST API > Keys | Automatización, cuentas de servicio |
| JWT | AUTH_METHOD=jwt + nombre de usuario/contraseña | Tokens de corta duración, obtenidos y renovados automáticamente (asume la vida útil predeterminada de 1 hora de pfSense) |
Opciones de Despliegue
stdio (predeterminado) — para Claude Desktop y Claude Code:
python3 -m src.main # from a clone
pfsense-mcp-server # via the installed console entry point (pip/uvx/pipx)
HTTP: para acceso remoto y configuraciones con múltiples clientes. Requiere MCP_API_KEY, y el servidor se niega a iniciar con un token vacío, de marcador de posición o corto.
export MCP_API_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')"
python3 -m src.main -t streamable-http --port 3000
El transporte HTTP es HTTP simple. Colócalo detrás de un proxy inverso con terminación TLS antes de exponerlo más allá de localhost.
Docker: un contenedor endurecido que ejecuta el transporte HTTP.
cp .env.example .env # set PFSENSE_URL, credentials, and MCP_API_KEY
docker compose up -d
El puerto publicado se vincula a 127.0.0.1 de forma predeterminada. Establece MCP_BIND_ADDR=0.0.0.0 para exponerlo, pero solo detrás de TLS. Para una CA privada, coloca el PEM en ./certs/ y establece PFSENSE_CA_FILE=/certs/<file>.pem.
Seguridad del contenedor:
- Se ejecuta como un usuario no root (
mcp:1000). - Sistema de archivos de solo lectura, un tmpfs
noexecyno-new-privileges. - Todas las capacidades de Linux eliminadas.
La verificación de salud sondea un endpoint /health no autenticado, porque /mcp requiere el token de portador.
Detrás de una puerta de enlace MCP — el transporte HTTP es un endpoint Streamable
HTTP compatible con la especificación con autenticación de token de portador, por lo que puede
registrarse como destino de servidor MCP detrás de puertas de enlace gestionadas como
AWS Bedrock AgentCore Gateway
(usa su proveedor de credenciales de clave API para suministrar el token de portador MCP_API_KEY,
y añade el origen de la puerta de enlace a MCP_ALLOWED_ORIGINS). Dichas puertas de enlace añaden
OAuth/IAM centralizado al frente y traducen entre revisiones de protocolo,
incluida 2026-07-28. No se requiere ninguna puerta de enlace — esto es puramente una opción para
entornos que ya ejecutan una.
Configuración
| Variable | Requerido | Predeterminado | Descripción |
|---|---|---|---|
PFSENSE_URL | Sí | — | URL de pfSense (p. ej., https://192.168.1.1) |
AUTH_METHOD | api_key | api_key, basic o jwt | |
PFSENSE_API_KEY | * | — | Clave de API REST |
PFSENSE_USERNAME | * | — | Nombre de usuario de pfSense (para basic/jwt) |
PFSENSE_PASSWORD | * | — | Contraseña de pfSense (para basic/jwt) |
PFSENSE_VERSION | CE_2_8_1 | Actual: CE_2_8_1, CE_2_9_0, PLUS_25_11_1, PLUS_26_03, PLUS_26_03_1, PLUS_26_07. Heredado (aún aceptado): CE_2_8_0, PLUS_24_11, PLUS_25_11, CE_26_03 | |
VERIFY_SSL | true | false desactiva la verificación de certificados por completo; prefiere PFSENSE_CA_FILE | |
PFSENSE_CA_FILE | — | Archivo PEM para la CA privada o autofirmada de pfSense, para mantener la verificación activa | |
API_TIMEOUT | 30 | Tiempo de espera de solicitud en segundos | |
MCP_READ_ONLY | false | Exponer solo herramientas de solo lectura | |
MCP_ENABLE_LOG_FILES | true | Establece false para eliminar get_log_file (lecturas de /var/log/* sin procesar mediante el sumidero de comandos) |
Los ajustes booleanos aceptan true/false, 1/0, yes/no o on/off. Cualquier otro valor detiene el servidor al inicio en lugar de adivinar, para que un error tipográfico no pueda desactivar la verificación TLS.
Todas las opciones de configuración
| Variable | Predeterminado | Descripción |
|---|---|---|
ENABLE_HATEOAS | false | Habilitar enlaces HATEOAS en las respuestas de la API |
LOG_LEVEL | INFO | DEBUG, INFO, WARNING, ERROR |
MCP_TRANSPORT | stdio | stdio o streamable-http |
MCP_HOST | 127.0.0.1 | Dirección de enlace para el modo HTTP |
MCP_PORT | 3000 | Puerto para el modo HTTP |
MCP_BIND_ADDR | 127.0.0.1 | Solo Docker Compose: dirección del host a la que se enlaza el puerto publicado |
MCP_API_KEY | — | Token Bearer para transporte HTTP (requerido) |
MCP_ALLOWED_ORIGINS | localhost | Orígenes permitidos separados por comas |
MCP_AUDIT_LOG | — | Ruta al archivo de registro de auditoría (líneas JSON) |
MCP_RATE_LIMIT_DELETE | 10 | Máximo de eliminaciones por 60 segundos |
MCP_RATE_LIMIT_CREATE | 20 | Máximo de creaciones por 60 segundos |
MCP_RATE_LIMIT_UPDATE | 30 | Máximo de cambios de ajustes (update_*, apply_*, enable_*/disable_*) por 60 segundos |
MCP_RATE_LIMIT_CRITICAL | 2 | Máximo de operaciones críticas por 300 segundos |
MCP_ALLOWED_TOOLS | all | Lista de permitidos separada por comas de herramientas de escritura. Las herramientas de lectura siempre están disponibles; get_log_file se controla mediante MCP_ENABLE_LOG_FILES |
MCP_ROLLBACK_BUFFER | 50 | Entradas de reversión mantenidas en memoria |
RESPONSE_FORMAT | json | gcf vuelve a codificar los resultados de las herramientas como Graph Compact Format para reducir tokens (requiere el extra gcf) |
Codificación de respuesta (GCF)
De forma predeterminada, las herramientas devuelven JSON. Establecer RESPONSE_FORMAT=gcf devuelve cada resultado elegible de herramienta como un solo bloque Graph Compact Format en su lugar: los arreglos de registros que producen estas herramientas de lectura (reglas de firewall, alias, concesiones DHCP, certificados, registros DNS) tienen sus nombres de campo repetidos factorizados en un encabezado, lo que reduce el costo de tokens cuando el resultado cruza el límite de la LLM. Los resultados que no son un solo cuerpo JSON — o que GCF no reduciría — permanecen como JSON (ver más abajo).
Instala el extra opcional en el entorno del servidor y establece la variable:
pip install '.[gcf]' # from a clone of this repo
export RESPONSE_FORMAT=gcf
# or, with uvx (the extra must go into uvx's isolated tool environment):
RESPONSE_FORMAT=gcf uvx --with 'gcf-python[fastmcp]==2.7.1' \
--from git+https://github.com/gensecaihq/pfsense-mcp-server pfsense-mcp-server
Es opcional y conservador: GCF se usa solo cuando es más pequeño que el JSON y es un viaje de ida y vuelta sin pérdida verificado; de lo contrario, se mantiene el JSON, por lo que ningún registro se elimina o altera. structuredContent se conserva, por lo que la validación del esquema de salida y los clientes que no son modelos siguen recibiendo JSON. Si el extra gcf no está instalado, el servidor registra una advertencia y continúa con JSON.
Ahorro de tokens en resultados representativos de 30 registros (tokens o200k, sin pérdida; reproducir con python benchmarks/gcf_benchmark.py):
| Resultado | JSON | GCF | Ahorro |
|---|---|---|---|
| Reglas de firewall | 1,995 | 936 | 53.1% |
| Alias | 1,065 | 594 | 44.2% |
| Concesiones DHCP | 2,314 | 1,606 | 30.6% |
Pruebas
python3 -m pytest tests/ -v # 661 tests
python3 -m pytest tests/ --cov=src # with coverage (~50%)
El conjunto incluye una capa de contrato de cable (tests/contract/) que verifica la carga útil de cada herramienta contra el esquema real de la API REST de pfSense v2.10.2 (destilado de la especificación OpenAPI ascendente), por lo que un nombre de campo o tipo incorrecto es una prueba fallida en lugar de una configuración incorrecta silenciosa. CI se ejecuta en Python 3.11/3.12/3.13 con escaneo de dependencias pip-audit.
Además del conjunto en proceso, una prueba de humo de protocolo de extremo a extremo impulsa el servidor a través del protocolo MCP real utilizando el CLI oficial MCP Inspector. Cubre ambos transportes y se ejecuta en CI en cada push:
make test-e2e # or: ./scripts/inspector_smoke.sh (needs node/npx, jq)
Verifica el protocolo de enlace de inicialización, el listado de 332 herramientas con anotaciones, la puerta de confirmación de salvaguardas a través del cable, el modo de solo lectura y la autenticación HTTP bearer más la aplicación de Origin — sin necesidad de una instancia de pfSense.
Cumplimiento de la especificación MCP
Cumple con MCP 2025-11-25 — la revisión más reciente con soporte estable de SDK — y negocia hacia revisiones anteriores por conexión, por lo que los clientes existentes siguen funcionando:
ToolAnnotationsen las 332 herramientas (readOnlyHint, destructiveHint, idempotentHint)serverInfo.versionyinstructionsproporcionados- Validación del encabezado Origin (requisito MUST)
- Autenticación con token Bearer con comparación de tiempo seguro
- Enlace predeterminado a localhost según el SHOULD de la especificación
- Transportes stdio y HTTP Streamable
La revisión sin estado 2026-07-28
MCP 2026-07-28 elimina el protocolo de enlace initialize y las sesiones a nivel de protocolo, por lo que cada solicitud se sostiene por sí misma. El soporte de SDK se envía en fastmcp 4, que ahora es estable (4.0.5).
Estado: esta versión fija fastmcp 3.x (MCP 2025-11-25). Un trabajo de CI no bloqueante ejecuta el conjunto completo de pruebas y la prueba de humo de MCP Inspector contra fastmcp 4.0.x, y ambos pasan sin cambios. El servidor no mantiene estado de sesión por diseño y no usa ninguna de las características que 2026-07-28 depreca (Roots, Sampling, MCP Logging).
El pin se moverá a fastmcp 4 una vez que la prueba de humo también cubra solicitudes sin sesión, que omiten initialize. fastmcp 4 negocia la versión del protocolo por conexión, por lo que los clientes que usan el protocolo de enlace seguirán funcionando.
Estructura del proyecto
src/
main.py Entry point (transports, read-only filter, key validation)
server.py FastMCP instance + API client
client.py pfSense REST API v2 HTTP client (retry/backoff, pooling)
guardrails.py Risk classification, confirm gate, rate limit, audit, redaction
helpers.py Validation, parsing, pagination, safety guards
models.py Data models
middleware.py HTTP bearer auth + Origin validation + /health
tools/ 34 tool modules (332 tools)
scripts/
generate_contract.py Regenerate the wire contract from an OpenAPI spec
generate_token.py Generate a secure MCP_API_KEY bearer token
inspector_smoke.sh End-to-end MCP protocol smoke test (MCP Inspector CLI)
tests/ 661 tests (incl. tests/contract/ wire-contract suite)
Consulta ARCHITECTURE.md para el ciclo de vida de la solicitud, el modelo de salvaguardas y la capa de contrato de cable; SECURITY.md para divulgación y endurecimiento; y RELEASE_AUDIT.md para la auditoría y la hoja de ruta.
Limitaciones conocidas
Estas se rastrean para la próxima versión:
- Alrededor de 11 herramientas de actualización/eliminación para objetos anidados no envían el
parent_idque requiere la API REST, por lo que esas llamadas fallan (#79). Los objetos afectados son grupos de direcciones DHCP y opciones personalizadas, colas de modelador de tráfico, entradas de cifrado IPsec y rangos de tiempo de programación. create_ipsec_phase1ycreate_ipsec_phase2aún no envían los ajustes de cifrado anidados que requiere la API. Arreglarlos necesita validación contra un pfSense en vivo.- La API REST no tiene un endpoint de restauración de configuración, por lo que revertir un cambio es un paso manual en la webGUI. Usa el ID de revisión que devuelven las herramientas protegidas.
- Cada proceso del servidor gestiona una sola instancia de pfSense.
Contribuciones
Necesitamos pruebas en el mundo real en diversos entornos pfSense. Consulta CONTRIBUTING o:
- Haz un fork y crea una rama de características
- Ejecuta
python3 -m pytest tests/ -v - Envía un PR
Ideas: pruebas de integración contra pfSense real, soporte adicional de paquetes (Snort, Suricata), puente LLM local Ollama, gestión de múltiples instancias.
Licencia
Agradecimientos
- jaredhendrickson13 / pfrest — paquete de API REST de pfSense v2
- JeremiahChurch — reescritura modular (PR #5), salvaguardas de OOM en endpoint de registro (PR #6), corrección de búsqueda de mapeo estático DHCP (PR #91)
- shawnpetersen — descubrimiento de endpoints de API v2 (PR #3)
- aemitic — corrección de cuerpo DELETE (PR #9),
ipprotocolde firewall para IPv6/doble pila (PR #10),logconfigchanges(PR #11) - pbhorjee — corrección de diagnóstico de estado en vivo (PR #21), frescura del registro de firewall + filtrado por IP exacta (PR #23), salvaguarda de credenciales de redirección (PR #72), corrección de reintento de escritura 503 (PR #74), contexto de error de transporte (PR #75), bloqueo de edición de alias (PR #76), jitter y presupuesto de reintentos (PR #77), informe de CA privada (#73)
- DrewKolstad — direccionamiento de interfaz, filtros de búsqueda seguros contra nulos, IPs permitidas de WireGuard, tiempos de concesión DHCP (PR #78)
- msarg44 — corrección de
get_pf_table/get_config_revision(PR #80) - cbrown350 — lecturas de registro sin procesar
get_log_file(PR #90) - blackwell-systems — codificación de respuesta GCF opcional (PR #87)
- bholland-bh — solicitud de soporte pfSense CE 2.9.0 / Plus 26.07 (#88)
- hossamnagy — inicio resiliente en fallo de verificación previa transitorio (PR #14)
- bill-mccormick-dg — corrección independiente de cuerpo DELETE (PR #16)
- w1ld3r — informes de errores de DELETE y syslog remoto (#12, #13)
- tvlc — informe de desajuste de tipo de puerto WebGUI (#7)
- renanwilliam — solicitud de empaquetado uvx/pipx (#8)
- Netgate — pfSense
- FastMCP — framework MCP