OPNsense MCP
OPNsense MCP
Un servidor remoto de Model Context Protocol orientado a la seguridad para la API MVC de OPNsense. Expone HTTP Streamable con estado para agentes remotos, utiliza la autenticación HTTP Basic nativa de la API en el upstream y bloquea la operación en modo seguro (fail closed) cuando no puede determinar si un comando de OPNsense es de solo lectura.
Una instancia del servidor representa un firewall de OPNsense. La URL del firewall y las credenciales de la API permanecen en el entorno del servidor; los agentes se autentican ante el MCP con un token de autorización independiente y no pueden redirigir solicitudes a destinos de red arbitrarios. Al gestionar varios equipos, despliegue una instancia aislada por firewall.
Arquitectura
Remote agent --HTTPS + MCP bearer token--> OPNsense MCP --HTTPS + API key/secret--> OPNsenseEl endpoint MCP utiliza el transporte Streamable HTTP actual en /mcp. Las sesiones tienen estado, de modo que los tokens de mutación de un solo uso siguen vinculados a la sesión MCP del agente. Las sesiones tienen un límite máximo, caducan por inactividad y se autentican en cada solicitud HTTP.
El listener HTTP incorporado está pensado para colocarse detrás de un proxy inverso TLS, un controlador de ingress, una VPN o una red superpuesta privada. No exponga su puerto HTTP sin cifrar directamente a una red no fiable.
Modelo de API de OPNsense
OPNsense enruta las solicitudes de API de la siguiente manera:
/api/<module>/<controller>/<command>/<parameter...>Los comportamientos importantes para la automatización son:
Las combinaciones de API usan autenticación HTTP Basic: la clave como nombre de usuario y el secreto como contraseña.
El acceso sigue estando restringido por los privilegios ACL que el propietario de la clave tiene en OPNsense.
Las solicitudes y la mayoría de las respuestas son JSON. Las descargas y los flujos de datos pueden no serlo.
GETyPOSTno se corresponden claramente con operaciones seguras e inseguras. Algunas lecturas usanPOSTy algunas mutaciones usanGET.Los controladores de modelos mutables suelen exponer operaciones
get,search,add,set,delytoggle.Los registros de modelos de tipo vector utilizan UUID. Una llamada
getsin UUID suele devolver un registro en blanco cumplimentado con valores predeterminados.Una mutación de modelo exitosa suele escribir la configuración en etapas provisionales. Una llamada
applyoreconfigurela activa.Las escrituras de modelo devuelven valores como
{"result":"saved"}o{"result":"failed","validations":...}; un HTTP 200 por sí solo no demuestra el éxito semántico.El bloqueo de configuración de OPNsense, la validación de modelos, el contexto de revisión y las comprobaciones ACL se realizan en el servidor y no deben eludirse.
Referencias oficiales:
https://docs.opnsense.org/development/frontend/controller.html
https://docs.opnsense.org/development/frontend/models_fieldtypes.html
Modelo de seguridad
opnsense_request solo acepta comandos clasificados como lectura. La clasificación se basa en el comando, no en el método HTTP.
Las mutaciones se realizan con dos herramientas:
opnsense_plan_changeinforma de la solicitud exacta y de su riesgo sin contactar con OPNsense.opnsense_execute_changerequiere un token de un solo uso coincidente que caduca pasados cinco minutos.
Las clases de riesgo distinguen entre escrituras provisionales, activación, operaciones disruptivas de servicio o firmware y operaciones catastróficas de restablecimiento/restauración. Los comandos desconocidos se tratan como mutaciones y se bloquean en modo seguro (fail closed).
El modo de escritura se controla fuera del agente:
disabledsolo permite lecturas.planpermite analizar mutaciones, pero nunca genera un token de ejecución.enabledpermite la ejecución con un token coincidente.
Utilice un usuario OPNsense dedicado y otorgue únicamente los privilegios efectivos que requieran las herramientas previstas. Para implementaciones de solo lectura, conceda también System: Deny config write (user-config-readonly) en OPNsense.
Herramientas de lectura seleccionadas
El cliente genérico protegido se complementa con herramientas de solo lectura fijas para tareas operativas habituales:
opnsense_get_firewall_logslee eventos estructurados del filtro de paquetes.opnsense_get_logslee páginas limitadas de los registros del núcleo y los servicios, incluidos los registros de sistema, configd, pasarelas, VPN, DNS, DHCP, IDS, enrutamiento y la interfaz web.opnsense_list_firewall_ruleslee las reglas de filtro visibles para la API de automatización.opnsense_list_nat_ruleslee las reglas de destino, de origen, de uno a uno o de NPT.opnsense_get_route_tablelee la tabla de rutas del kernel en tiempo real o las rutas estáticas configuradas.
Estas herramientas invocan directamente endpoints de consulta determinados. No pueden implementar acciones alternativas de mutación, como limpiar registros, vaciar estados, modificar reglas o implementar cambios. Los resultados siguen estando sujetos a los privilegios ACL del usuario de API en OPNsense.
Configuración inicial
npm install
npm run buildConfigure elenlace con el entorno usando .env.example como referencia. Los archivos de entorno no se cargan automáticamente y Git los ignora. Genere un token MCP independiente con openssl rand -hex 32; no reutilice una credencial de API de OPNsense.
Para ejecutar, prefiera un certificado de confianza pública o establezca OPNSENSE_CA_FILE para indicar el certificado de la CA privada. OPNSENSE_TLS_VERIFY=false existe únicamente para desarrollo aislado.
Ejecute el servidor remoto en bucle de retorno local parao darle un proxy TSL inverso local:
OPNSENSE_URL=https://firewall.example \
OPNSENSE_API_KEY=... \
OPNSENSE_API_SECRET=... \
MCP_AUTH_TOKEN=<random-token-at-least-32-characters> \
node dist/index.jsLa URL MCP es http://127.0.0.1:3000/mcp. Publíquela como HTTPS a través del proxy inverso inverso y transmite el token de la siguiente manera:
Authorization: Bearer <MCP_AUTH_TOKEN>Ejemplo de configuración de cliente remoto para clientes que admiten URL y encabezados personalizados:
{
"mcpServers": {
"opnsense": {
"url": "https://mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer ${MCP_AUTH_TOKEN}"
}
}
}
}Los formatos de configuración del cliente varían. Almacene el token en el gestor de secretos del cliente en lugar de guardarlo en un archivo de configuración.
Docker Compose
compose.yaml vincula el puerto 3000 al loopback del host para que un proxy inverso pueda neutralizar TLS con seguridad.
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 --buildCuando se conecte directamente a localhost:3000 durante el desarrollo, incluya localhost en MCP_ALLOWED_HOSTS. El endpoint de salud no autenticado está disponible en /health y no proporciona detalles sobre el destino ni las credenciales.
Seguridad remota
MCP_AUTH_TOKENes obligatorio para el transporte HTTP y debe contener al menos 32 caracteres.MCP_ALLOWED_HOSTSes obligatorio cuando se conecta a una dirección distinta de loopback y evita el "DNS rebinding" con la cabecera Host.Las solicitudes con la cabecera
Originde un navegador se rechazan a menos que el origen exacto esté presente enMCP_ALLOWED_ORIGINS.MCP_MAX_SESSIONS,MCP_SESSION_TTL_MSyMCP_RATE_LIMIT_PER_MINUTElimitan el uso remoto de recursos.Mantenga
OPNSENSE_TLS_VERIFY=true. UseOPNSENSE_CA_FILEpara una CA interna en lugar de desactivar la verificación.Mantenga
OPNSENSE_WRITE_MODE=disabledpara implementaciones de solo supervisión.Restrinja el usuario de API OPNsense con privilegios ACL efectivos y
user-config-readonlydonde corresponda.Coloque el endpoint MCP detrás de HTTPS, con política de firewall y preferiblemente detrás de una VPN o una red privada.
MCP_ALLOW_UNAUTHENTICATED=true existe solo para desarrollo local aislado y nunca debe utilizarse con un listener accesible remotamente.
Compatibilidad con Stdio
Los clientes locales pueden continuar lanzando el servidor como subproceso:
OPNSENSE_URL=https://firewall.example \
OPNSENSE_API_KEY=... \
OPNSENSE_API_SECRET=... \
MCP_TRANSPORT=stdio \
node dist/index.jsConfiguración
OPNSENSE_URL: URL base fija del firewall.OPNSENSE_API_KEY: clave de API del usuario OPNsense dedicado.OPNSENSE_API_SECRET: secreto de API para esa clave.OPNSENSE_WRITE_MODE:disabled,planoenabled.OPNSENSE_CA_FILE: archivo PEM opcional de la CA privada.OPNSENSE_TLS_VERIFY: por defectotrue.MCP_TRANSPORT:httpde forma predeterminada, ostdio.MCP_HOST: dirección del listener, por defecto127.0.0.1.MCP_PORT: puerto del listener, por defecto3000.MCP_PATH: ruta del endpoint MCP, por defecto/mcp.MCP_AUTH_TOKEN: token portador para los agentes remotos.MCP_ALLOWED_HOSTS: nombres de host aceptados en la cabecera HTTP Host, separados por comas.MCP_ALLOWED_ORIGINS: orígenes de navegador aceptados, separados por callbacks; vacío rechaza suspensiones de navegador.MCP_MAX_SESSIONS: tope de sesiones simultáneas, por defecto100.MCP_SESSION_TTL_MS: tiempo de vida de una sesión inactiva, por defecto una hora.MCP_RATE_LIMIT_PER_MINUTE: límite de solicitudes HTTP por cliente y minuto, por defecto120.
Por ejemplo, una llamada de lectura sobre el estado del sistema utiliza:
{
"module": "core",
"controller": "system",
"command": "status"
}Limitaciones actuales
OPNsense no publica un contrato OpenAPI completo. La referencia generada identifica rutas y métodos probables, pero normalmente omite los esquemas de los cuerpos de solicitud.
Los endpoints de los plugins solo existen cuando sus paquetes están instalados y autorizados por ACL.
La validación semántica de las respuestas aún no es específica de cada endpoint.
El clasificador de riesgo léxico es deliberadamente conservador. Las herramientas seleccionadas deberían emplear, con el tiempo, un manifiesto de endpoints auditado con esquemas explícitos de solicitud y respuesta.
Los tokens de planificación reducen la ejecución accidental o no deseada, pero los hosts MCP deben seguir presentando la aprobación de una persona para herramientas destructivas.
La autenticación remota utiliza un token portador estático para todo el despliegue, en lugar de un servidor de autorización OAuth. Utilice despliegues separados o un proxy inverso autenticador cuando los agentes necesiten identidades distintas.
El estado de las sesiones se guarda en memoria y no se comparte entre réplicas. Ejecute una única réplica salvo que se agreguen almacenamiento de sesión externo y afinidad de enrutamiento.
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