Skip to main content
Glama
OPNsense MCP Server

OPNsense MCP Server

by lucamarien

OPNsense MCP 서버

OPNsense 방화벽을 Claude Code, Cursor 및 기타 MCP 호환 도구와 같은 AI 어시스턴트를 통해 관리하기 위한 보안 Model Context Protocol (MCP) 서버입니다.

10개 도메인에 걸친 81개 도구: 시스템, 방화벽, 네트워크, DNS, DHCP, VPN, HAProxy, 서비스, 진단 및 보안.

요구 사항

  • Python 3.11 이상

  • OPNsense 24.7 이상 — MCP 서버는 OPNsense 24.7에서 도입된 MVC 기반 API 엔드포인트에 의존합니다. 이전 버전은 호환되지 않는 다른 API 구조를 사용합니다. 서버는 첫 연결 시 OPNsense 버전을 자동 감지하여 올바른 엔드포인트 명명 방식(camelCase for pre-25.7, snake_case for 25.7+)을 선택합니다. OPNsense 26.x는 변경된 펌웨어 상태 응답 형식을 포함하여 완전히 지원됩니다.

Related MCP server: OPNsense MCP Server

보안 모델

이 MCP 서버는 보안을 최우선으로 설계되었습니다:

  • 기본적으로 읽기 전용 — 쓰기 작업은 OPNSENSE_ALLOW_WRITES=true를 통한 명시적 동의가 필요합니다

  • 저장점/롤백 (OPNsense < 26.7 전용) — OPNsense가 여전히 저장점 API를 제공하는 경우, 방화벽 수정은 내장된 60초 자동 복귀 기능을 사용합니다. 변경 사항은 명시적으로 확인되어야 하며, 그렇지 않으면 자동으로 롤백됩니다. OPNsense 26.7은 해당 API를 상위 버전에서 제거했습니다 — 서버는 런타임에 누락된 엔드포인트를 감지하고 자동 롤백 없이 방화벽 변경 사항을 즉시 적용합니다

  • 엔드포인트 차단 목록 — 위험한 엔드포인트(halt, reboot, poweroff, firmware update/upgrade)는 API 클라이언트 수준에서 하드 차단되며 절대 호출할 수 없습니다

  • API 전용 — SSH 액세스 없음, 명령 실행 없음, 직접적인 구성 파일 조작 없음

  • 로컬 전송 — STDIO 전용, 네트워크에 노출된 HTTP/SSE 엔드포인트 없음

  • 자격 증명 노출 없음 — API 키는 도구 출력, 로그 또는 오류 메시지에 절대 포함되지 않습니다

  • 입력 검증 — 호스트 이름 매개변수는 셸 메타문자 주입에 대해 검증됩니다

  • 민감 데이터 제거 — 구성 백업은 기본적으로 비밀번호와 키를 제거합니다

빠른 시작

1. OPNsense API 키 생성

  1. OPNsense 웹 인터페이스에 로그인합니다

  2. 시스템 > 액세스 > 사용자로 이동합니다

  3. 기존 사용자를 편집하거나 전용 API 사용자를 생성합니다:

    • 프로덕션 사용의 경우 필요한 권한만 가진 전용 사용자(예: mcp-api)를 생성합니다

    • 읽기 전용 액세스의 경우 사용자를 읽기 전용 API 액세스 권한이 있는 그룹에 할당합니다

  4. API 키 섹션까지 아래로 스크롤하고 + 버튼을 클릭합니다

  5. 키/시크릿 쌍이 생성되고 파일(apikey.txt)이 다운로드됩니다

  6. 파일에는 key=your-api-key-here 및 secret=your-api-secret-here 두 줄이 포함되어 있습니다

  7. 이러한 자격 증명을 안전하게 보관하세요 — 시크릿은 OPNsense에서 다시 검색할 수 없습니다

팁: 읽기 전용 설정(시작 시 권장)의 경우 권한을 변경할 필요가 없습니다 — 기본 API 액세스로 모든 읽기 전용 도구에 충분합니다.

2. 설치

# Using pip
pip install opnsense-mcp-server

# Using uv (recommended for isolated environments)
uv pip install opnsense-mcp-server

# Using Docker
docker pull uhlenheide/opnsense-mcp-server

# From source
git clone https://github.com/lucamarien/opnsense-mcp-server
cd opnsense-mcp-server
pip install -e .

Docker 이미지: 공식 이미지는 uhlenheide/opnsense-mcp-server이며, 이 저장소의 .github/workflows/publish-docker.yml에서 모든 v* 태그에 대해 게시됩니다. lucamarien/opnsense-mcp-server 이미지는 존재하지 않습니다 — 이전 README 버전에서 실수로 명명되었습니다.

3. AI 어시스턴트 구성

Claude Code

프로젝트의 .mcp.json에 추가합니다:

{
  "mcpServers": {
    "opnsense": {
      "command": "opnsense-mcp",
      "env": {
        "OPNSENSE_URL": "https://192.168.1.1/api",
        "OPNSENSE_API_KEY": "your-api-key-here",
        "OPNSENSE_API_SECRET": "your-api-secret-here",
        "OPNSENSE_VERIFY_SSL": "false",
        "OPNSENSE_ALLOW_WRITES": "false"
      }
    }
  }
}

대안: opnsense-mcp CLI가 PATH에 없는 경우 "command": "python", "args": ["-m", "opnsense_mcp"]를 사용합니다.

또는 ~/.claude/claude_code_config.json에 전역으로 추가합니다.

Claude Code (Docker)

{
  "mcpServers": {
    "opnsense": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "OPNSENSE_URL=https://192.168.1.1/api",
        "-e", "OPNSENSE_API_KEY=your-api-key-here",
        "-e", "OPNSENSE_API_SECRET=your-api-secret-here",
        "-e", "OPNSENSE_VERIFY_SSL=false",
        "-e", "OPNSENSE_ALLOW_WRITES=false",
        "uhlenheide/opnsense-mcp-server"
      ]
    }
  }
}

Cursor

Cursor MCP 설정(설정 > MCP)에 추가합니다:

{
  "mcpServers": {
    "opnsense": {
      "command": "opnsense-mcp",
      "env": {
        "OPNSENSE_URL": "https://192.168.1.1/api",
        "OPNSENSE_API_KEY": "your-api-key-here",
        "OPNSENSE_API_SECRET": "your-api-secret-here",
        "OPNSENSE_VERIFY_SSL": "false"
      }
    }
  }
}

구성

환경 변수

기본값

설명

OPNSENSE_URL

(필수)

OPNsense API 기본 URL (/api로 끝나야 함)

OPNSENSE_API_KEY

(필수)

OPNsense 사용자 설정의 API 키

OPNSENSE_API_SECRET

(필수)

OPNsense 사용자 설정의 API 시크릿

OPNSENSE_VERIFY_SSL

true

SSL 인증서 검증 (false는 자체 서명 인증서용)

OPNSENSE_ALLOW_WRITES

false

쓰기 작업 활성화 (방화벽 규칙, 서비스 제어)

사용자 지정 포트: OPNsense 웹 GUI가 비표준 포트(예: 10443)에서 실행되는 경우 URL에 포함하세요: https://192.168.1.1:10443/api

사용 가능한 도구 (81개)

시스템 (7개 도구)

도구

설명

opn_system_status

펌웨어 버전, 제품 이름, 아키텍처를 포함한 시스템 정보

opn_list_services

모든 서비스와 실행 상태를 나열합니다. 매개변수: search, limit

opn_gateway_status

게이트웨이 가용성, 지연 시간 및 dpinger 상태 확인

opn_download_config

선택적 민감 데이터 제거 기능이 있는 config.xml 백업을 다운로드합니다. 매개변수: include_sensitive (기본값: false — 비밀번호와 키는 편집됨)

opn_scan_config

전체 구성을 스캔하고 섹션으로 구문 분석하며 런타임 인벤토리(펌웨어, 플러그인, DHCP, DNS, 인터페이스, 서비스)를 수집합니다. 결과는 세션별로 캐시됩니다. 매개변수: force

opn_get_config_section

특정 구성 섹션을 구조화된 JSON으로 가져옵니다. 매개변수: section, include_sensitive

opn_mcp_info

MCP 서버 버전, 쓰기 모드 상태, 감지된 OPNsense 버전, API 스타일 및 방화벽 쓰기가 여전히 저장점/롤백 보호를 받는지 여부

네트워크 (5개 도구)

도구

설명

opn_interface_stats

인터페이스별 트래픽 통계 (바이트 인/아웃, 패킷, 오류)

opn_arp_table

IP-to-MAC 주소 매핑을 보여주는 ARP 테이블

opn_ndp_table

IPv6-to-MAC 주소 매핑을 보여주는 NDP(이웃 발견 프로토콜) 테이블

opn_ipv6_status

모든 인터페이스의 IPv6 구성 및 주소 상태 (방법, 라이브 주소, 요약)

opn_list_static_routes

구성된 정적 경로. 매개변수: search, limit

방화벽 (21개 도구)

도구

설명

쓰기

opn_list_firewall_rules

MVC 방화벽 필터 규칙을 나열합니다. 매개변수: search, limit

아니요

opn_list_firewall_aliases

별칭 정의(IP 목록, 포트 그룹, GeoIP, URL)를 나열합니다. 매개변수: search, limit

아니요

opn_list_nat_rules

NAT 포트 포워딩(DNAT) 규칙을 나열합니다. 매개변수: search, limit

아니요

opn_list_firewall_categories

방화벽 규칙 범주와 해당 UUID를 나열합니다. 매개변수: search, limit

아니요

opn_firewall_log

클라이언트 측 필터링이 적용된 최근 방화벽 로그 항목입니다. 매개변수: source_ip, destination_ip, action, interface, limit

아니요

opn_confirm_changes

보류 중인 변경 사항을 확인하고 60초 자동 롤백을 취소합니다(OPNsense < 26.7, 26.7 이상에서는 not_applicable을 반환하는 no-op). 매개변수: revision

예

opn_toggle_firewall_rule

세이브포인트로 규칙의 활성화/비활성화 상태를 전환합니다(OPNsense < 26.7). 매개변수: uuid

예

opn_add_firewall_rule

세이브포인트로 새 필터 규칙을 생성합니다(OPNsense < 26.7). 매개변수: action, direction, interface, ip_protocol, protocol, source_net, destination_net, destination_port, description

예

opn_delete_firewall_rule

세이브포인트로 UUID로 필터 규칙을 삭제합니다(OPNsense < 26.7). 매개변수: uuid

예

opn_add_alias

새 별칭을 생성합니다. 매개변수: name, alias_type, content, description

예

opn_add_nat_rule

세이브포인트로 NAT 포트 포워딩 규칙을 생성합니다(OPNsense < 26.7). 매개변수: destination_port, target_ip, interface, protocol, target_port, description

예

opn_add_firewall_category

새 방화벽 규칙 범주를 생성합니다. 매개변수: name, color

예

opn_delete_firewall_category

세이브포인트로 UUID로 방화벽 규칙 범주를 삭제합니다(OPNsense < 26.7). 매개변수: uuid

예

opn_set_rule_categories

세이브포인트로 방화벽 규칙에 범주를 할당합니다(OPNsense < 26.7). 매개변수: uuid, categories

예

opn_add_icmpv6_rules

RFC 4890에 따라 IPv6 운영에 필요한 필수 ICMPv6 규칙(NDP, RA, ping6)을 생성합니다. 매개변수: interface

예

opn_update_alias

기존 별칭(이름, 내용, 유형, 설명)을 업데이트합니다. 읽기-수정-쓰기 방식입니다. 매개변수: uuid, name, content, description, alias_type, enabled

예

opn_delete_alias

UUID로 별칭을 삭제합니다. 먼저 규칙 참조를 확인합니다. 매개변수: uuid

예

opn_toggle_alias

별칭의 활성화/비활성화 상태를 전환합니다. 매개변수: uuid

예

opn_update_firewall_rule

세이브포인트로 필터 규칙 필드를 업데이트합니다(OPNsense < 26.7). 매개변수: uuid, action, direction, interface, ip_protocol, protocol, source_net, source_not, source_port, destination_net, destination_not, destination_port, gateway, log, quick, sequence, categories, description, enabled

예

opn_update_nat_rule

세이브포인트로 NAT 포트 포워딩 규칙을 업데이트합니다(OPNsense < 26.7). 매개변수: uuid, interface, protocol, destination_port, target_ip, target_port, description, enabled

예

opn_delete_nat_rule

세이브포인트로 UUID로 NAT 포트 포워딩 규칙을 삭제합니다(OPNsense < 26.7). 매개변수: uuid

예

참고: 세이브포인트 보호는 OPNsense < 26.7에서만 제공됩니다. 26.7 이상에서는 이러한 도구가 변경 사항을 즉시 영구적으로 적용합니다 — 쓰기 작업 및 세이브포인트를 참조하세요.

DNS (13개 도구)

도구

설명

쓰기

opn_list_dns_overrides

Unbound 호스트 오버라이드(로컬 DNS 레코드)를 나열합니다. 매개변수: search, limit

아니요

opn_list_dns_forwards

DNS 포워드 영역(도메인별 서버)을 나열합니다. 매개변수: search, limit

아니요

opn_dns_stats

Unbound 리졸버 통계(쿼리, 캐시 적중, 가동 시간)

아니요

opn_reconfigure_unbound

보류 중인 DNS 리졸버 구성 변경 사항을 적용합니다

예

opn_add_dns_override

Unbound DNS 호스트 오버라이드(A/AAAA 레코드)를 추가하고 즉시 적용합니다. 매개변수: hostname, domain, server, description

예

opn_list_dnsbl

제공자 및 상태와 함께 DNSBL 차단 목록 구성을 나열합니다. 매개변수: search, limit

아니요

opn_get_dnsbl

UUID로 전체 DNSBL 구성(제공자, 허용 목록, 설정)을 가져옵니다. 매개변수: uuid

아니요

opn_set_dnsbl

DNSBL 설정을 업데이트합니다(읽기-수정-쓰기). 매개변수: uuid, enabled, providers, allowlists, blocklists, wildcards 등

예

opn_add_dnsbl_allowlist

덮어쓰지 않고 DNSBL 허용 목록에 도메인을 추가합니다. 매개변수: uuid, domains

예

opn_remove_dnsbl_allowlist

DNSBL 허용 목록에서 도메인을 제거합니다. 매개변수: uuid, domains

예

opn_update_dnsbl

DNSBL 차단 목록 파일을 다시 로드하고 Unbound를 재시작합니다(구성 변경 없음, 복구 도구)

예

opn_update_dns_override

Unbound DNS 호스트 오버라이드를 업데이트하고 즉시 적용합니다. 매개변수: uuid, hostname, domain, server, description, enabled

예

opn_delete_dns_override

Unbound DNS 호스트 오버라이드를 삭제하고 즉시 적용합니다. 매개변수: uuid

예

DHCP (8개 도구)

도구

설명

쓰기

opn_list_dhcp_leases

ISC DHCP 서버의 활성 DHCPv4 임대

아니요

opn_list_kea_leases

Kea DHCP 서버의 DHCPv4 임대. 매개변수: search, limit

아니요

opn_list_dnsmasq_leases

dnsmasq DNS/DHCP 서버의 DHCPv4 및 DHCPv6 임대. 매개변수: search, limit

아니요

opn_list_dnsmasq_ranges

구성된 DHCP 주소 범위(RA 구성이 포함된 DHCPv4 및 DHCPv6 모두). 매개변수: search, limit

아니요

opn_add_dnsmasq_range

새 DHCP 범위 생성(라우터 광고 구성이 포함된 IPv4 또는 IPv6). 매개변수: interface, start_addr, end_addr, prefix_len, ra_mode, lease_time, description

예

opn_reconfigure_dnsmasq

보류 중인 dnsmasq DNS/DHCP 구성 변경 사항 적용

예

opn_update_dnsmasq_range

DHCP 범위 업데이트(주소, 임대 시간, RA 구성) 후 적용. 매개변수: uuid, interface, start_addr, end_addr, prefix_len, ra_mode, lease_time, description, enabled

예

opn_delete_dnsmasq_range

UUID로 DHCP 범위 삭제 후 적용. 매개변수: uuid

예

VPN (도구 3개)

도구

설명

opn_wireguard_status

WireGuard 터널 및 피어 상태(os-wireguard 플러그인 필요)

opn_ipsec_status

IPsec VPN 터널 상태 — IKE(1단계) 및 ESP/AH(2단계) 세션

opn_openvpn_status

OpenVPN 연결 상태 — 인스턴스, 세션 및 경로

HAProxy (도구 8개)

HAProxy 로드 밸런서용 전체 구성 관리(os-haproxy 플러그인 필요).

도구

설명

쓰기

opn_haproxy_status

HAProxy 서비스 상태 및 백엔드 상태

아니요

opn_haproxy_search

유형별 HAProxy 리소스 검색. 매개변수: resource_type (frontends/backends/servers/acls/healthchecks/errorfiles/resolvers/mailers), search, limit

아니요

opn_haproxy_get

특정 리소스의 상세 구성 가져오기. 매개변수: resource_type, uuid

아니요

opn_haproxy_configtest

적용 전 HAProxy 구성 구문 검증

아니요

opn_haproxy_add

새 HAProxy 리소스 생성. 매개변수: resource_type, config (필드 값의 사전)

예

opn_haproxy_update

기존 HAProxy 리소스 업데이트(부분 업데이트). 매개변수: resource_type, uuid, config

예

opn_haproxy_delete

UUID로 HAProxy 리소스 삭제. 매개변수: resource_type, uuid

예

opn_reconfigure_haproxy

보류 중인 HAProxy 구성 변경 사항 적용

예

참고: HAProxy 변경 사항은 저장 지점(savepoint) 보호를 사용하지 않습니다 — 재구성 시 즉시 적용됩니다. opn_reconfigure_haproxy 전에 항상 opn_haproxy_configtest를 호출하세요.

서비스 (도구 11개)

도구

설명

쓰기

opn_list_acme_certs

ACME/Let's Encrypt 인증서 및 상태. 매개변수: search, limit

아니요

opn_list_cron_jobs

예약된 cron 작업. 매개변수: search, limit

아니요

opn_crowdsec_status

CrowdSec 보안 엔진 상태 및 위협 탐지

아니요

opn_crowdsec_alerts

CrowdSec 보안 경고(탐지된 위협). 매개변수: search, limit

아니요

opn_list_ddns_accounts

Dynamic DNS 계정 및 업데이트 상태. 매개변수: search, limit

아니요

opn_add_ddns_account

새 Dynamic DNS 계정 생성. 매개변수: service, hostname, username, password, checkip, interface, description

예

opn_reconfigure_ddclient

보류 중인 Dynamic DNS 구성 변경 사항 적용

예

opn_update_ddns_account

Dynamic DNS 계정 업데이트(비밀번호는 쓰기 전용). 매개변수: uuid, service, hostname, username, password, checkip, interface, description, enabled

예

opn_delete_ddns_account

UUID로 Dynamic DNS 계정 삭제. 매개변수: uuid

예

opn_mdns_repeater_status

mDNS 반복기 상태 및 구성

아니요

opn_configure_mdns_repeater

VLAN 간 장치 검색을 위한 mDNS 반복기 구성. 매개변수: enabled, interfaces

예

진단 (도구 4개)

도구

설명

쓰기

opn_ping

호스트에 ICMP ping 전송. 매개변수: host, count

아니요

opn_traceroute

호스트로의 경로 추적. 매개변수: host, protocol, ip_version

아니요

opn_dns_lookup

DNS 조회 수행. 매개변수: hostname, server (선택 사항)

아니요

opn_pf_states

pf 방화벽 상태 테이블(현재 연결). 매개변수: search, limit

아니요

보안 (도구 1개)

도구

설명

opn_security_audit

방화벽 규칙, DNS 보안, VPN 구성을 포함한 보안 상태 종합 감사

IPv6 지원

MCP를 통한 완전 자동화

  • IPv6 방화벽 규칙 — ip_protocol="inet6"로 규칙 생성 (OPNsense < 26.7에서는 savepoint로 보호됨)

  • HAProxy IPv6 바인딩 — [::]:443 또는 [2001:db8::1]:443 바인드 주소를 사용하는 프론트엔드

  • HAProxy IPv6 백엔드 — IPv6 주소를 사용하는 서버, 백엔드의 resolvePrefer: ipv6

  • IPv6 동적 DNS — IPv6 지원 checkip 방식을 사용하는 DDNS 계정

  • DHCPv6 범위 (dnsmasq) — 라우터 광고(Router Advertisement) 구성이 포함된 IPv6 DHCP 범위

  • DNS AAAA 레코드 — IPv6 주소를 사용하는 Unbound 호스트 오버라이드

  • IPv6 진단 — ip_version="6"을 사용한 Traceroute, 호스트 이름을 통한 ping

수동 GUI 구성 필요

이 설정들은 OPNsense에서 MVC API를 지원하지 않으므로 웹 GUI를 통해 구성해야 합니다:

  • WAN IPv6 설정 — DHCPv6 프리픽스 위임을 사용하는 PPPoE, 정적 IPv6, SLAAC

  • LAN IPv6 주소 지정 — Track Interface 모드, 정적 /64 할당, 프리픽스 ID

  • 인터페이스 할당 — WAN/LAN/OPT 역할에 물리적 포트 할당

  • 6to4/6rd 터널 — 전환 터널 메커니즘

알려진 제한 사항

  • ISC DHCP / Kea DHCPv6: 구현되지 않았습니다. DHCPv6 범위 및 라우터 광고에 대해서는 dnsmasq(현대적 기본값)만 지원됩니다. ISC DHCP는 더 이상 사용되지 않으며, Kea DHCPv6 임대 정보는 API에서 제한적으로만 확인할 수 있습니다.

  • radvd: 별도의 도구 세트로 구현되지 않았습니다. Dnsmasq는 범위 구성을 통해 라우터 광고를 기본적으로 처리합니다. 인터페이스당 하나의 RA 데몬만 실행해야 합니다.

  • 이중 스택 방화벽 규칙: inet46(이중 스택)은 MVC API 규칙(opn_add_firewall_rule)에서 올바르게 작동합니다. 그러나 레거시 XML 필터 규칙(GUI)의 inet46은 조용히 PF 출력을 생성하지 않습니다 — 이는 레거시 규칙에만 영향을 미치는 알려진 OPNsense 버그입니다.

  • 레거시 GUI 규칙: 기존 OPNsense GUI를 통해 생성된 방화벽 규칙은 MVC API를 통해 접근할 수 없습니다. 읽기 전용 접근에는 opn_get_config_section("filter")를 사용하세요.

권장 IPv6 마이그레이션 워크플로

  1. 수동(GUI): WAN IPv6 구성 (ISP의 DHCPv6-PD 또는 정적)

  2. 수동(GUI): LAN 인터페이스 구성 (프리픽스 위임을 위한 Track Interface 모드)

  3. MCP: RA 플래그와 함께 opn_add_dnsmasq_range를 통해 라우터 광고 구성

  4. MCP: IPv6 방화벽 규칙 생성 (NDP/RA/PMTUD를 위해 ICMPv6를 허용해야 함)

  5. MCP: opn_add_dns_override를 통해 IPv6 DNS 레코드 추가

  6. MCP: IPv6 checkip 방식으로 Dynamic DNS 구성

  7. MCP: HAProxy 프론트엔드에 IPv6 바인드 주소 추가

  8. MCP: opn_ping, opn_traceroute (ip_version="6"), opn_gateway_status로 검증

버전 호환성

OPNsense 버전

상태

24.7 (Thriving Tiger)

지원됨

25.1 (Ultimate Unicorn)

지원됨

25.7 (Visionary Viper)

지원됨 (snake_case API 자동 감지)

26.1+

지원됨

서버는 첫 연결 시 OPNsense 버전을 자동으로 감지하여 올바른 API 엔드포인트 명명 규칙(25.7 이전은 camelCase, 25.7 이후는 snake_case)을 선택합니다.

방화벽 규칙 참고: opn_list_firewall_rules는 MVC/자동화 API를 통해 관리되는 규칙을 표시합니다. OPNsense GUI를 통해 구성된 규칙은 이 API에서 접근할 수 없는 레거시 형식을 사용합니다. 이는 알려진 OPNsense 제한 사항입니다.

문제 해결

연결 문제

"Connection refused" 또는 시간 초과 오류

  • OPNSENSE_URL이 /api로 끝나는지 확인하세요 (예: https://192.168.1.1/api)

  • 비표준 포트를 사용하는 경우 포함하세요: https://192.168.1.1:10443/api

  • MCP 서버가 실행 중인 머신에서 OPNsense 웹 GUI에 접근할 수 있는지 확인하세요

SSL 인증서 오류

  • 자체 서명 인증서(기본 OPNsense 설정)를 사용하는 경우 OPNSENSE_VERIFY_SSL=false로 설정하세요

  • 프로덕션 환경에서는 OPNsense에 적절한 인증서를 설치하고 OPNSENSE_VERIFY_SSL=true를 유지하세요

인증 문제

401 Unauthorized

  • OPNSENSE_API_KEY와 OPNSENSE_API_SECRET이 올바른지 확인하세요

  • API 키는 대소문자를 구분합니다 — 다운로드한 apikey.txt에서 정확히 복사하세요

  • API 사용자가 OPNsense에서 비활성화되지 않았는지 확인하세요

  • API 사용자가 수행하려는 작업에 충분한 권한을 가지고 있는지 확인하세요

403 Forbidden

  • API 사용자에게 요청한 엔드포인트에 대한 권한이 없을 수 있습니다

  • 쓰기 작업의 경우 OPNSENSE_ALLOW_WRITES=true가 설정되어 있는지 확인하세요

도구별 문제

opn_list_firewall_rules가 빈 결과를 반환함

  • 이 도구는 레거시 GUI 규칙이 아닌 MVC/자동화 규칙만 표시합니다

  • 자동화 API 또는 opn_add_firewall_rule을 통해 규칙을 생성하면 해당 규칙을 볼 수 있습니다

opn_ping 시간 초과

  • 방화벽에 대상 호스트로의 경로가 없을 수 있습니다

  • opn_gateway_status로 게이트웨이 상태를 확인하세요

  • 기본 시간 초과는 30초입니다 (30회 폴링 주기)

opn_download_config에 [REDACTED] 값이 표시됨

  • 보안을 위한 기본 동작입니다. 비밀번호와 키를 포함하려면 include_sensitive=true를 전달하세요 (AI 대화에서는 주의해서 사용)

쓰기 작업이 "writes not enabled" 오류로 실패함

  • MCP 서버 구성에서 OPNSENSE_ALLOW_WRITES=true를 설정하세요

  • 안전을 위해 의도적으로 기본 비활성화되어 있습니다

Savepoint 확인 실패

  • revision 매개변수는 쓰기 작업에서 반환된 값과 정확히 일치해야 합니다

  • 확인은 60초 이내에 이루어져야 하며, 그렇지 않으면 변경 사항이 자동으로 되돌아갑니다

  • OPNsense 26.7 이상에서는 savepoint API가 없습니다: 쓰기 도구가 빈 revision을 반환하고 opn_confirm_changes는 status: "not_applicable"을 반환합니다. 이는 오류가 아니라 예상된 동작입니다 — 변경 사항은 이미 영구적으로 적용되었습니다

진단 명령

MCP 서버를 디버깅해야 하는 경우:

# Test API connectivity directly
curl -k -u "your-key:your-secret" https://your-opnsense-ip/api/core/firmware/status

# Run the server directly
python -m opnsense_mcp

# Run tests to verify installation
pytest -v

개발

# Clone and install dev dependencies
git clone https://github.com/lucamarien/opnsense-mcp-server
cd opnsense-mcp-server
pip install -e ".[dev]"

# Run all tests (no real OPNsense needed — all tests use mocked API)
pytest -v

# Full CI pipeline (lint, format, type check, security scan, tests)
make validate

# Individual checks
ruff check src/ tests/          # Lint (includes bandit security checks)
ruff format src/ tests/          # Format
mypy src/ --strict               # Type checking

모범 사례

일반적인 방화벽 구성 작업에 대한 도메인별 가이드:

  • WhatsApp 통화 방화벽 규칙 — URL 테이블 별칭과 범위 지정 규칙을 사용하여 기본 거부 방화벽에서 WhatsApp 음성/영상 통화 허용

이 가이드들은 실제 MCP 도구 사용 패턴을 보여주고 각 접근 방식의 보안 고려 사항을 설명합니다.

기여

자세한 지침은 CONTRIBUTING.md를 참조하세요. 주요 사항:

  1. 모든 테스트는 모의(mock) API 응답을 사용해야 합니다 — 실제 OPNsense에 연결하지 마세요

  2. 중복되는 도구 없음 — 각 도구는 고유한 목적이 있어야 합니다

  3. 명확한 docstring을 작성하세요 — 이는 AI가 도구 선택 시 참고하는 유일한 안내입니다

  4. 형식화된 문자열이 아닌 구조화된 데이터(dict)를 반환하세요

  5. 제출 전에 make validate를 실행하세요

라이선스

MIT

Available Tools

81 tools
opn_add_aliasA

Create a new firewall alias (IP list, network group, port group, etc.).

Use this when you need to create a reusable alias for use in firewall rules. Aliases group IPs, networks, or ports under a single name.

This does NOT require savepoint protection — aliases are metadata definitions that only affect traffic when referenced by a firewall rule.

Parameters:

  • name: alias name (alphanumeric and underscores only, no spaces)

  • alias_type: 'host' (IPs), 'network' (CIDRs), 'port' (ports/ranges), 'urltable' (URL-based IP list), 'geoip' (country codes)

  • content: alias entries separated by newlines. For GeoIP, use country codes (one per line, e.g. 'DE\nFR\nNL'). For host/network, use IPs/CIDRs.

  • description: human-readable description

Returns: dict with 'result' (str) and 'uuid' (str) of the new alias.

NameRequiredDescriptionDefault
nameYes
contentNo
alias_typeNohost
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so description carries full burden. It states aliases are 'metadata definitions that only affect traffic when referenced by a firewall rule' and that no savepoint protection is needed. This discloses non-destructive behavior. However, it does not mention authentication or other potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear lead sentence, usage guidance, and a parameter list. It is not overly verbose, though the parameter explanation could be slightly more concise. Still, every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for the tool's complexity. It explains the tool's purpose, parameter details, return format (dict with result and uuid), and behavioral notes (no savepoint). With output schema present and no annotations needed, the description fully enables correct agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description explains all four parameters in detail. It provides constraints (e.g., name: alphanumeric and underscores only), examples for content (GeoIP country codes like 'DE\nFR\nNL'), and enumerates alias_type options. This adds significant value beyond the basic schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new firewall alias' with specific verb and resource. It lists the types of aliases (IP list, network group, port group, etc.), distinguishing it from sibling tools like list, delete, update, and toggle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use this when you need to create a reusable alias for use in firewall rules.' Also notes that savepoint protection is not required. While it doesn't explicitly exclude other use cases, the context makes it clear when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_ddns_accountA

Create a new Dynamic DNS account and apply the configuration.

Use this to register a hostname with a DDNS provider so the firewall automatically updates the DNS record when the public IP changes.

NameRequiredDescriptionDefault
checkipNoIP check method — 'web_dyndns' (default), 'web_freedns', 'web_he', 'if' (use interface IP), or 'cmd'. For IPv6: use 'web_dyndns6', 'web_freedns6', etc. The global 'allowipv6' setting must ALSO be enabled or IPv6 updates silently fail.web_dyndns
serviceYesDDNS provider name (e.g. 'cloudflare', 'dyndns', 'noip', 'freedns', 'he', 'namecheap', 'desec', 'godaddy').
hostnameYesFully qualified domain name to update (e.g. 'fw.example.com').
passwordNoProvider password or API token.
usernameNoProvider username or API key (leave empty for token-only providers).
interfaceNoNetwork interface name (e.g. 'wan', 'opt1'). Required when checkip='if'. Optional otherwise.
descriptionNoOptional description for this account.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose all behavioral traits. It implies a write operation but does not mention authentication requirements, side effects (e.g., immediate application, need for commit), or potential failure modes. This is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, the first stating the action and the second providing context. It is concise, front-loaded, and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and high schema coverage, the description is mostly complete for parameter understanding. However, it lacks behavioral transparency and usage exclusions, leaving some gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with detailed parameter descriptions (e.g., checkip explains IPv6). The description adds no extra semantics beyond the schema, meeting baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new Dynamic DNS account and applies configuration. It distinguishes from sibling tools like opn_list_ddns_accounts, opn_update_ddns_account, opn_delete_ddns_account by focusing on creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to register a hostname with a DDNS provider for automatic IP updates). It does not explicitly state when not to use it or compare alternatives, but the context is clear enough for most agents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_dnsbl_allowlistA

Add domains to a DNSBL allowlist (whitelist) without overwriting existing entries.

Use this when a domain is blocked by DNSBL and you need to allowlist it (e.g. googleads.g.doubleclick.net blocking YouTube). Existing allowlist entries are preserved. Changes are applied immediately.

Get the UUID from opn_list_dnsbl first.

Parameters:

  • uuid: blocklist UUID from opn_list_dnsbl

  • domains: domains to add, comma or newline-separated

Returns: dict with 'added' (list), 'already_present' (list), 'dnsbl_status', and 'service_status'.

NameRequiredDescriptionDefault
uuidYes
domainsYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It explains key behaviors: 'without overwriting existing entries,' 'Changes are applied immediately,' and lists the return structure (dict with added, already_present, etc.). While it doesn't detail permissions or persistency, it provides sufficient behavioral context for an additive write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It starts with the core purpose, then usage context, prerequisite, parameter list, and return fields. Every sentence adds value with no redundancies. Information is front-loaded and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 required params, simple return dict) and presence of output schema (explained in description), the description covers all essential aspects: purpose, when to use, prerequisite, parameter details, and return format. No gaps remain for an AI agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It clearly defines each parameter: uuid as 'blocklist UUID from opn_list_dnsbl' and domains as 'domains to add, comma or newline-separated'. This adds significant meaning beyond the bare schema types and includes format guidance for the domains string.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Add domains to a DNSBL allowlist (whitelist) without overwriting existing entries,' specifying the action (add), resource (DNSBL allowlist), and key behavior (non-destructive). It distinguishes from sibling tools like opn_remove_dnsbl_allowlist and opn_set_dnsbl by emphasizing additive nature and preservation of existing entries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this when a domain is blocked by DNSBL and you need to allowlist it,' providing a clear use case with an example. It also instructs to 'Get the UUID from opn_list_dnsbl first,' indicating a prerequisite. However, it does not explicitly mention when not to use or point to alternative tools (e.g., opn_remove_dnsbl_allowlist for removal), which would improve differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_dnsmasq_rangeA

Create a new dnsmasq DHCP range and apply the configuration.

Use this to add DHCPv4 or DHCPv6 address ranges with optional Router Advertisement (RA) configuration.

NameRequiredDescriptionDefault
ra_modeNoRouter Advertisement mode for IPv6. Options: - 'slaac' — clients use SLAAC (stateless autoconfiguration) - 'ra-stateless' — RA + stateless DHCPv6 (DNS via DHCP) - 'ra-only' — RA only, no DHCPv6 address assignment Omit for IPv4 ranges.
end_addrYesEnd of address range. IPv4: '192.168.1.200'. IPv6: '::200'.
interfaceYesNetwork interface name (e.g. 'lan', 'opt1', 'opt2').
lease_timeNoLease duration (e.g. '24h', '1h', '12h'). Default: '24h'.24h
prefix_lenNoIPv6 prefix length (e.g. '64'). Include this for IPv6 ranges, omit for IPv4 ranges.
start_addrYesStart of address range. IPv4: '192.168.1.100'. IPv6: uses suffix notation — '::100' (OPNsense auto-prepends the delegated prefix from the interface config).
descriptionNoOptional description for this range.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must cover behavioral traits. It mentions 'apply the configuration' indicating a side effect, but does not disclose permissions needed, potential conflicts, reversibility, or what happens on failure. This is insufficient for a configuration mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: first states the core action and effect, second provides usage context. Every sentence is necessary and front-loaded. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, optional RA), the description adequately covers purpose and IPv4/v6 distinction. It does not explain return values (output schema exists) or error conditions, but it is sufficient for a create operation with good schema documentation. Slightly incomplete for a high-complexity tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are well-documented in the schema. The description adds minimal extra value beyond the schema, like clarifying 'apply the configuration'. It does not explain parameter dependencies or provide extensive additional context. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (create) and resource (dnsmasq DHCP range) with the specific verbs 'Create' and 'apply'. It distinguishes from sibling tools like opn_delete_dnsmasq_range and opn_update_dnsmasq_range by specifying 'add' and describing DHCP range creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to add DHCPv4 or DHCPv6 address ranges with optional Router Advertisement (RA) configuration', providing clear context for usage. However, it does not explicitly state when not to use this tool or mention alternatives among siblings, though the sibling names imply distinct roles.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_dns_overrideA

Add an Unbound DNS host override (A/AAAA record) and apply immediately.

Use this when you need to create a local DNS record that resolves a hostname to a specific IP address. Useful for split-horizon DNS, internal services, or overriding external DNS for specific hosts.

Changes are applied immediately (Unbound is reconfigured automatically). DNS overrides cannot be auto-reverted — verify settings before calling. Use opn_list_dns_overrides to check existing overrides first.

Parameters:

  • hostname: the hostname part (e.g. 'myserver')

  • domain: the domain part (e.g. 'local.lan')

  • server: the IP address to resolve to (IPv4 or IPv6)

  • description: optional description

Returns: dict with 'result', 'uuid', 'hostname', 'server', and 'applied' status.

NameRequiredDescriptionDefault
domainYes
serverYes
hostnameYes
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavioral traits: changes are applied immediately (Unbound reconfigured automatically), and DNS overrides cannot be auto-reverted. This allows the agent to understand the consequence of calling the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, usage context, behavioral notes, parameter list, and return format. It is slightly verbose but every sentence adds necessary information; could be tightened without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, zero schema coverage, and presence of output schema, the description is remarkably complete. It covers purpose, usage guidelines, behavior, parameter semantics, and return format, leaving no important gaps for agent decision-making.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description explains each parameter's meaning: hostname as 'e.g. 'myserver'', domain as 'e.g. 'local.lan'', server as 'IP address to resolve to (IPv4 or IPv6)', and description as optional. This adds significant value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'Add an Unbound DNS host override (A/AAAA record) and apply immediately.' It distinguishes from sibling tools like opn_list_dns_overrides (to check existing) and opn_delete_dns_override, making the action and resource specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use: 'when you need to create a local DNS record... for split-horizon DNS, internal services, or overriding external DNS.' It also advises caution: 'cannot be auto-reverted — verify settings before calling' and recommends checking existing overrides with opn_list_dns_overrides first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_firewall_categoryA

Create a new firewall rule category.

Use this when you need to create a category for organizing firewall rules. Categories are metadata — creating one does not affect traffic or rules.

Parameters:

  • name: category name (1-255 chars, no commas)

  • color: hex color code without '#' (e.g. 'ff0000' for red, default '000000')

Returns: dict with 'result' (str), 'uuid' (str), and 'name' (str).

NameRequiredDescriptionDefault
nameYes
colorNo000000

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description notes that 'creating one does not affect traffic or rules,' providing safety context. It also states the return type, but lacks details on error conditions or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise with clear sections: purpose, usage guide, parameter list, return info. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple parameter set (2 params, no nested objects) and presence of output schema, the description fully covers what the tool does, its parameters, and what it returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds constraints not in schema: name length (1-255 chars), no commas, and color format (hex without '#') with example and default. Schema coverage is 0%, so this is valuable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Create a new firewall rule category' as a specific verb+resource. Distinguishes from siblings like opn_add_firewall_rule by emphasizing categories are metadata and do not affect traffic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this when you need to create a category for organizing firewall rules.' While it doesn't mention when not to use, the context makes it clear for category creation vs. rule creation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_firewall_ruleA

Create a new MVC firewall filter rule with savepoint protection where supported.

Use this when you need to add a firewall rule.

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out.

IMPORTANT: This creates MVC rules (Settings > Firewall > Automation), not legacy GUI rules.

Parameters:

  • action: 'pass', 'block', or 'reject'

  • direction: 'in' or 'out'

  • interface: interface name (e.g. 'lan', 'wan', 'opt1')

  • ip_protocol: 'inet' (IPv4), 'inet6' (IPv6), or 'inet46' (dual-stack)

  • protocol: 'any', 'TCP', 'UDP', 'TCP/UDP', 'ICMP', etc.

  • source_net: source address/network or 'any'

  • source_not: invert source match (True = NOT source_net)

  • source_port: source port number or range, or empty for any

  • destination_net: destination address/network or 'any'

  • destination_not: invert destination match (True = NOT destination_net, e.g. !Private_Networks)

  • destination_port: port number or range (e.g. '80', '1000-2000'), or empty for any

  • gateway: force traffic via specific gateway (e.g. 'WAN_GW') for policy routing, or empty for default

  • log: enable logging for this rule (default: off)

  • quick: first-match wins (default: True). Set False for last-match-wins logic

  • sequence: rule ordering within priority group (default: 1, higher = later)

  • categories: comma-separated category UUIDs to assign to this rule

  • description: human-readable rule description

Returns: dict with 'revision' (str), 'uuid' (str), and 'result' (str).

NameRequiredDescriptionDefault
logNo
quickNo
actionNopass
gatewayNo
protocolNoany
sequenceNo
directionNoin
interfaceNolan
categoriesNo
source_netNoany
source_notNo
descriptionNo
ip_protocolNoinet
source_portNo
destination_netNoany
destination_notNo
destination_portNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must carry behavioral info. It explains savepoint auto-revert behavior (60 seconds, version-dependent), the need to confirm changes via opn_confirm_changes, and the distinction from legacy rules. This is exactly what an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a summary then parameter list Baby steps, but it's long. However every sentence adds value (savepoint, version behavior, param details). Could be slightly trimmed but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 17 params and version-dependent behavior, the description covers savepoint semantics, version differences, backup guidance, and every parameter's meaning. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% coverage; the description's parameter list gives meaning to all 17 params including defaults and inversion semantics (source_not: invert match). Each param has a brief but clear explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Create[s] a new MVC firewall filter rule' with a specific verb and resource. It also distinguishes from other firewall tools by noting it's for MVC rules, not legacy GUI rules, and references related tools in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Use this when you need to add a firewall rule' and warns to check opn_mcp_info for savepoint support. However it doesn't explicitly state when NOT to use it (e.g., for legacy rules), though the MVC emphasis essentially implies that. No explicit alternatives mentioned beyond savepoint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_icmpv6_rulesA

Create essential ICMPv6 firewall rules required for IPv6 operation.

Use this when setting up IPv6 on an interface. ICMPv6 is MANDATORY for IPv6 — without it, Neighbor Discovery (NDP), Router Advertisements (RA), and Path MTU Discovery (PMTUD) all break.

Creates 5 rules per RFC 4890:

  1. NDP Neighbor Solicitation (link-local -> multicast)

  2. NDP Neighbor Advertisement (link-local -> any)

  3. NDP Router Solicitation (link-local -> all-routers multicast)

  4. NDP Router Advertisement (link-local -> all-nodes multicast)

  5. ICMPv6 Echo (ping6) inbound

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out.

Parameters:

  • interface: target interface (e.g. 'lan', 'opt1', 'opt2')

Returns: dict with 'revision' (str), 'rules' (list of created UUIDs), and instructions to confirm.

NameRequiredDescriptionDefault
interfaceNolan

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavioral disclosure. It details the created rules, savepoint behavior on OPNsense <26.7 (auto-revert in 60s unless confirmed), and immediate application on 26.7+. It also warns about potential lockout and suggests mitigation, covering important side effects without contradicting any annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with purpose and usage. It lists the 5 rules concisely, then notes version-specific behavior, parameters, and return type. Every sentence adds value; no fluff, and it's easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that creates multiple rules with version-dependent behavior, the description is remarkably complete. It explains the rules created, version differences, confirmation process, and required pre-checks (savepoint_support and backups). The return format (revision, rules, instructions) is also specified, making the tool fully understandable without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It clarifies the sole parameter 'interface' with examples ('lan', 'opt1', 'opt2') and indicates default 'lan'. While minimal, it adds enough meaning for a simple parameter, though it could explicitly state it's the OPNsense interface name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates essential ICMPv6 firewall rules for IPv6 operation. It specifies the exact resource (ICMPv6 rules) and distinguishes from generic firewall rule tools by focusing on the mandatory ICMPv6 set (5 specific rules per RFC 4890).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this when setting up IPv6 on an interface' and explains why ICMPv6 is mandatory, providing strong context. It also gives operational guidance for different OPNsense versions, recommending checks via opn_mcp_info and backups via opn_download_config. This well differentiates from alternatives like opn_add_firewall_rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_add_nat_ruleA

Create a NAT port forwarding rule with savepoint protection where supported.

Use this when you need to forward an external port to an internal host. Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out.

Parameters:

  • destination_port: external port to forward (e.g. '8080', '3000-3010') — required

  • target_ip: internal IP address to forward to (e.g. '192.168.1.100') — required

  • interface: source interface (default 'wan')

  • protocol: 'TCP', 'UDP', or 'TCP/UDP' (default 'TCP')

  • target_port: internal port (default: same as destination_port)

  • description: human-readable description

Returns: dict with 'revision' (str), 'uuid' (str), and 'result' (str).

NameRequiredDescriptionDefault
protocolNoTCP
interfaceNowan
target_ipNo
descriptionNo
target_portNo
destination_portNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses the savepoint protection mechanism, including the version-specific behavior (auto-revert on <26.7, immediate on 26.7+), and warns about the risk of lockout if not handled properly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively concise but contains redundant warnings about the savepoint behavior, repeating information in multiple sentences. It could be streamlined, but remains clear and structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives enough context for the tool's purpose and key behaviors, but it does not mention the return value (though output schema exists) or any prerequisites. It does cover the main warning about savepoint and lockout. Overall, it is adequate but could be enhanced with parameter explanations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not explain the meaning of any of the parameters (protocol, interface, target_ip, description, target_port, destination_port). It only refers to 'external port' and 'internal host' without linking to specific parameter names, leaving the parameter semantics unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool creates a NAT port forwarding rule and explains the use case: forwarding an external port to an internal host. This distinguishes it from general firewall rules and aligns with its name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this when you need to forward an external port to an internal host' and provides important caveats about savepoint behavior and steps to check opn_mcp_info and take backup if needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_arp_tableA

Get the ARP table showing IP-to-MAC address mappings.

Use this when you need to find which MAC address is associated with an IP, identify devices on a network segment, or troubleshoot connectivity. Returns: dict with 'rows' (list of ARP entries including ip, mac, intf, and hostname fields) and 'rowCount' (total).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden, and it does most of the job: 'Get' implies a non-mutating read, and the return body is spelled out (rows with ip, mac, intf, hostname, plus rowCount). It omits whether entries come from the live cache versus static config, or how multiple interfaces are reported, which matters for interpreting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences: purpose, usage, return shape. The returns sentence partially duplicates the output schema that already exists, but it is compact and does not bloat the definition. No filler wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with an output schema present, the description covers purpose, when to call, and what comes back — nothing essential is missing. The only real gap is the absent pointer to opn_ndp_table for IPv6 neighbors, which would help in an environment with many similar monitoring tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the baseline this scores 4; there is no parameter meaning the description needs to add. It does explicitly say the query is unfiltered (whole ARP table returned), which usefully implies no scoping arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete verb+resource pair, 'Get the ARP table showing IP-to-MAC address mappings', which tells the agent exactly what data comes back. It does not explicitly distinguish itself from the sibling opn_ndp_table (IPv6 neighbor table), leaving that IPv4-vs-IPv6 split to inference from the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this when you need to find which MAC address is associated with an IP, identify devices on a network segment, or troubleshoot connectivity' gives three concrete triggering scenarios. It stops short of exclusions or naming an alternative tool (e.g. opn_ndp_table for IPv6, opn_list_dhcp_leases for lease lookups), so routing to the right sibling is only partly supported.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_configure_mdns_repeaterA

Enable and configure the mDNS Repeater to relay multicast DNS between interfaces.

Use this to set up cross-VLAN mDNS discovery. The repeater relays mDNS packets (224.0.0.251:5353) between selected interfaces, enabling HomeKit, Chromecast, AirPlay, and other mDNS-based device discovery across VLANs.

NameRequiredDescriptionDefault
enabledNoWhether to enable the mDNS Repeater service.
interfacesNoComma-separated list of interface names to relay between (e.g. 'lan,opt1'). Minimum 2 interfaces required for cross-VLAN relay. Maximum 5 interfaces supported.lan

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavior. It mentions relaying mDNS packets (224.0.0.251:5353) between selected interfaces and enabling specific protocols, but does not cover potential side effects (e.g., whether it overwrites existing config, requires restart, or is reversible). This is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, efficiently front-loading the purpose in the first sentence. The second sentence adds valuable context (cross-VLAN, specific devices). No wasted words. Concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only two simple parameters, the description provides sufficient context for use. It explains the use case (cross-VLAN mDNS) and typical supported devices. The presence of an output schema (not shown) likely covers return values. Completeness is good for a configuration tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100% and both parameters ('enabled' and 'interfaces') are clearly described. The description does not add new meaning beyond the schema; it restates that the repeater relays between interfaces. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Enable and configure the mDNS Repeater to relay multicast DNS between interfaces.' It uses specific verbs ('configure') and resources ('mDNS Repeater'), distinguishing it from sibling tools like 'opn_mdns_repeater_status' which only retrieves status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises when to use this tool: 'Use this to set up cross-VLAN mDNS discovery.' This is clear context, though it does not mention when not to use it or provide alternative tools for related tasks. However, given the sibling set includes a status-only tool, the recommendation is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_confirm_changesA

Confirm pending firewall changes, cancelling the 60-second auto-rollback.

Use this AFTER applying firewall changes (rule add/edit/delete) to make them permanent. If not called within 60 seconds of applying, OPNsense automatically reverts all changes for safety.

Only relevant on OPNsense < 26.7. Newer versions have no savepoint API; there the write tools return an empty revision and this call is a no-op. Returns: dict with confirmation status, or status 'not_applicable'.

NameRequiredDescriptionDefault
revisionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It transparently discloses the effect (cancels auto-rollback), the timing constraint, and the no-op behavior on newer versions. It also mentions the return type, which is helpful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (about 4 sentences) and front-loaded with the main purpose. It uses clear sections for timing and version notes without any unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple confirmation tool, the description covers the purpose, when to use, the 60-second window, version dependency, and return type. It is complete enough for an agent to invoke correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has a single required parameter 'revision' with no description (0% coverage). The tool description implies that revision comes from a prior write operation, mentioning that write tools return an empty revision on newer versions. This provides some context but does not explicitly define the parameter's format or how to obtain it, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool confirms pending firewall changes, distinguishing it from sibling write tools. It uses a specific verb (confirm) and resource (firewall changes), and the phrase 'cancelling the 60-second auto-rollback' adds specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs to use AFTER applying firewall changes and mentions the 60-second window. It also states that it's only relevant on OPNsense < 26.7, providing clear exclusions and alternatives (no-op on newer versions).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_crowdsec_alertsA

List CrowdSec security alerts (detected threats and attacks).

Use this when you need to review security events detected by CrowdSec, including brute-force attempts, port scans, and other threats. Note: Requires the CrowdSec plugin (os-crowdsec). Returns: dict with 'rows' (list of alerts) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but the description implies a read-only operation ('List') and specifies the return format. No contradictions or destructive hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, with two sentences plus a note, front-loading the purpose and structure efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output format is described, and the prerequisite is stated, but parameter explanations are missing, making the tool somewhat incomplete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the purpose or behavior of parameters 'search' and 'limit', offering no additional meaning beyond defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists CrowdSec security alerts (detected threats and attacks), specifying types like brute-force and port scans. It distinguishes from sibling tool opn_crowdsec_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context (review security events) and notes a prerequisite (CrowdSec plugin). It lacks explicit alternatives or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_crowdsec_statusA

Get CrowdSec security engine status and active decisions summary.

Use this when you need to check if CrowdSec is running, see how many active security decisions (bans/captchas) are in effect, and get a quick overview of the threat protection state. Note: Requires the CrowdSec plugin (os-crowdsec). Returns: dict with 'service_status', 'decisions_count', and 'alerts_count'.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, but description clearly states it's a read operation returning specific keys. Discloses plugin dependency. Does not detail any side effects (likely none), which is fine.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three succinct sentences: purpose, usage guidance, return info. No wasted words, front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of output schema, description covers all needed: purpose, when to use, prerequisite, return keys. Complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters. Schema coverage is 100%, so description need not add param info. Baseline 4 for zero-param tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves CrowdSec status and decisions summary. Distinguished from sibling opn_crowdsec_alerts by focusing on status and total counts, not individual alerts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: to check if CrowdSec is running, see active decisions count, and get threat overview. Mentions plugin requirement. Could mention when not to use, but overall helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_aliasA

Delete a firewall alias by UUID.

IMPORTANT: Check if any firewall rules reference this alias BEFORE deleting. Deleting an alias that is referenced by rules may cause those rules to stop matching traffic. Use opn_list_firewall_rules to check for references first.

This does NOT use savepoint protection — aliases are metadata definitions. The deletion takes effect immediately.

Use opn_list_firewall_aliases first to find the UUID. Returns: dict with 'result' (str) and 'uuid' (str).

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that deletion is immediate, does not use savepoint protection, and that referenced aliases cause rules to stop matching traffic. With no annotations, this provides essential behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with the action, then important warnings and usage hints. Every sentence adds value, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the single parameter, preconditions (finding UUID, checking rules), side effects (immediate, no savepoint), and return format. With output schema present and description covering return keys, it is fully adequate for use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Though schema has 0% coverage, the description tells that the uuid is from opn_list_firewall_aliases and the action is deletion by UUID. Adds meaning beyond the bare schema by explaining the source and purpose of the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Delete a firewall alias by UUID', which is a specific verb+resource. It distinguishes from siblings like opn_list_firewall_aliases, opn_add_alias, and opn_update_alias by focusing on deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use opn_list_firewall_aliases first to find the UUID, and warns to check for referencing firewall rules using opn_list_firewall_rules. Provides clear when-to-use guidance with step-by-step prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_ddns_accountA

Delete a Dynamic DNS account by UUID and apply the configuration.

The deletion is applied immediately (ddclient is reconfigured automatically). Use opn_list_ddns_accounts first to find the UUID. Returns: dict with 'result' (str), 'uuid' (str), and 'reconfigure_status'.

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the deletion is applied immediately and triggers automatic reconfiguration of ddclient. It also specifies the return format. However, it could mention that the action is irreversible or note permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences, each providing essential information: the action, immediate effect, prerequisite, and return format. No redundant or verbose phrasing. Very efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core action, prerequisite steps, behavioral side effects, and return value structure. For a simple one-parameter deletion tool, this is fully complete and aids correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description explains the parameter's purpose ('by UUID') and directs the user to list DDNS accounts to find it. This adds meaningful context beyond the schema's type-only definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Delete a Dynamic DNS account by UUID'. It distinguishes the tool from siblings like opn_add_ddns_account and opn_update_ddns_account by specifying deletion. The verb and resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using opn_list_ddns_accounts first to obtain the UUID, which is a clear prerequisite. It mentions that deletion is applied immediately with automatic reconfiguration. However, it does not explicitly state when to avoid using the tool (e.g., irreversible action), but the context is sufficient for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_dnsmasq_rangeA

Delete a dnsmasq DHCP range by UUID and apply the configuration.

The deletion is applied immediately (dnsmasq is reconfigured automatically). Use opn_list_dnsmasq_ranges first to find the UUID. Returns: dict with 'result' (str), 'uuid' (str), and 'reconfigure_status'.

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses immediate application and automatic reconfiguration. With no annotations, description carries full burden; however, it lacks details on irreversibility, permissions, or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each serving a purpose: action, immediacy, prerequisite and return type. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key aspects: what it does, how to prepare (list prerequisite), immediate effect, and return value. For a simple one-param delete, it is sufficient; missing error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage; description compensates by explaining UUID parameter's role (identifier for the range). Could include format hint like 'UUID string'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'Delete', resource 'dnsmasq DHCP range', and method 'by UUID'. Distinguishes from siblings like opn_add_dnsmasq_range and opn_update_dnsmasq_range.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit prerequisite: 'Use opn_list_dnsmasq_ranges first to find the UUID.' Mentions immediate application. Does not mention when-not-to-use or alternative tools, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_dns_overrideA

Delete an Unbound DNS host override by UUID and apply immediately.

The deletion is applied immediately (Unbound is reconfigured automatically). DNS changes cannot be auto-reverted — verify the UUID before calling. Use opn_list_dns_overrides first to find the UUID. Returns: dict with 'result' (str), 'uuid' (str), and 'applied' status.

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral burden. It states the deletion is applied immediately, Unbound is reconfigured automatically, and changes cannot be auto-reverted. It also describes the return value structure, which adds transparency beyond the bare action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three sentences, each serving a purpose: action, effect, warning/prerequisite, and return. No superfluous words, but could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with one parameter, the description covers the essential aspects: what it does, the immediate effect, prerequisites, and return format. It is nearly complete but lacks details on error handling or UUID format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'by UUID' but provides no format, example, or explanation of what constitutes a valid UUID for the uuid parameter. The description adds minimal value over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Delete an Unbound DNS host override by UUID' and specifies the resource (DNS host override) and method (by UUID). It is distinct from sibling tools like opn_add_dns_override and opn_update_dns_override.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a prerequisite: 'Use opn_list_dns_overrides first to find the UUID.' It also warns about irreversibility and to verify UUID before calling. It does not explicitly mention when to avoid the tool, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_firewall_categoryA

Delete a firewall rule category by UUID with savepoint protection where supported.

IMPORTANT: Reassign rules to other categories BEFORE deleting to avoid orphaned category references. Use opn_list_firewall_categories to find categories and opn_set_rule_categories to reassign rules first.

System default categories (auto=1) cannot be deleted. Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out. Returns: dict with 'revision' (str) for confirming and 'result' (str).

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: savepoint protection on OPNsense < 26.7 with auto-revert, immediate changes on 26.7+, and the return dict structure. It also warns about potential lockout and advises checking opn_mcp_info for support and taking a config backup if needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is several sentences long but each adds value, covering purpose, prerequisites, version nuances, backup advice, and return info. It is front-loaded with the core purpose and structured into logical paragraphs, though it could be slightly more succinct without losing essential details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, version-sensitive operation, the description covers all critical aspects: pre-deletion steps, version-specific behavior, backup strategy, and return format. It addresses the complexity of the tool and compensates for the lack of annotations and parameter descriptions thoroughly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'uuid' is described as 'by UUID' and the description points to the list tool for finding categories, adding guidance beyond the schema. However, it does not detail the expected format or constraints of the UUID, leaving some ambiguity for a single undocumented parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Delete a firewall rule category by UUID' with a specific verb and resource, distinguishing it from sibling tools like add, list, and set categories. It also mentions savepoint protection, adding scope and context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: 'IMPORTANT: Reassign rules to other categories BEFORE deleting... Use opn_list_firewall_categories to find categories and opn_set_rule_categories to reassign rules first.' It also specifies that system defaults cannot be deleted and gives version-specific instructions, including a backup recommendation when savepoint support is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_firewall_ruleA

Delete a firewall filter rule by UUID with savepoint protection where supported.

Use this when you need to remove an existing MVC firewall rule.

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out. Use opn_list_firewall_rules first to find the UUID of the rule to delete. Returns: dict with 'revision' (str) for confirming and 'result' (str).

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses savepoint behavior including version differences (OPNsense < 26.7 vs 26.7+), auto-revert timing, and the need for confirmation or backup. It also notes that changes apply immediately on 26.7+, which is critical behavioral context. However, it doesn't detail potential side effects like lockout risk beyond the hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded. The first sentence states the action, and subsequent paragraphs cover usage, savepoint protection, and return values without redundancy. It is concise yet detailed, with every sentence providing necessary context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (savepoint handling, version differences, backup recommendation) and the absence of annotations, the description is thorough. It explains the return values ('revision' and 'result'), and references prerequisite tools. With a single parameter and output schema, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explicitly states the parameter 'uuid' and its purpose: 'Delete a firewall filter rule by UUID', and instructs to find the UUID. This adds meaning beyond the bare schema, though it doesn't provide format or validation details, which are not needed for a simple UUID.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Delete a firewall filter rule by UUID'. It specifies the resource (firewall firewall rule) and the method (delete), and distinguishes from siblings by mentioning savepoint protection and referencing other tools like opn_list_firewall_rules and opn_confirm_changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: 'Use this when you need to remove an existing MVC firewall rule.' It also instructs to use opn_list_firewall_rules first to find the UUID, and mentions taking a backup if savepoint_support is false, providing clear when-to-use and when-not-to-use scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_delete_nat_ruleA

Delete a NAT port forwarding rule by UUID with savepoint protection where supported.

Use this when you need to remove an existing NAT rule.

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out. Use opn_list_nat_rules first to find the UUID of the rule to delete. Returns: dict with 'revision' (str) for confirming and 'result' (str).

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It thoroughly discloses the savepoint behavior across OPNsense versions: auto-revert on <26.7 unless confirmed via opn_confirm_changes, and immediate unrevertible changes on 26.7+. It also explains the return value ('revision' and 'result') and warns about potential lockout, making the tool's behavior highly transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and every sentence adds value, but it is slightly verbose. The opening sentence is front-loaded, and the version-specific paragraphs are necessary. The line 'Use this when you need to remove an existing NAT rule' is somewhat redundant with the first sentence, but it reinforces usage intent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no annotations, the description covers all critical context: purpose, when to use, version-specific behavior, prerequisites, backup safety, and return value. The output schema exists but the description adds clarification for the return keys. The tool's complexity (savepoint behavior, lockout risk) is fully addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does so by explaining that the 'uuid' parameter is the identifier of the NAT rule to delete, and instructs the agent to find it via opn_list_nat_rules. This fully clarifies the meaning and origin of the only parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Delete a NAT port forwarding rule by UUID'. This clearly distinguishes it from sibling tools like opn_add_nat_rule and opn_update_nat_rule, and the 'by UUID' qualifier makes the operation precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Use this when you need to remove an existing NAT rule.' It also provides critical usage context: check opn_mcp_info for savepoint support, back up with opn_download_config if needed, and find the UUID via opn_list_nat_rules. This is clear, actionable guidance with sibling-tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_dns_lookupA

Perform a DNS lookup from the OPNsense firewall.

Use this when you need to test DNS resolution from the firewall's perspective, verify Unbound is resolving correctly, or check if a specific DNS server returns expected results. Returns: dict with 'result' (str) and 'response' (DNS query results).

NameRequiredDescriptionDefault
serverNo
hostnameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden of disclosing behavior. It describes a lookup operation but does not specify safety, permissions, or whether it modifies state. It is minimal beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: first states purpose, second gives use cases, third describes return format. No redundant words, information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, 1 required), the description covers purpose, use cases, and return format. It lacks error behavior or parameter details but is adequate for a diagnostic tool with an output schema (mentioned).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should add meaning. It implies that 'server' is for specifying a DNS server, but does not explicitly link to the parameter. 'hostname' is obvious. Adds some value but not enough to fully compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Perform a DNS lookup from the OPNsense firewall' with a specific verb and resource. It also lists use cases that distinguish it from sibling tools like opn_dns_stats or opn_ping, though not explicitly naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit scenarios for use: testing DNS resolution, verifying Unbound, checking a specific DNS server. Does not mention when not to use or alternatives, but the positive guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_dns_statsA

Get Unbound DNS resolver statistics (queries, cache hits, uptime).

Use this when you need to check DNS resolver performance, cache hit rates, or troubleshoot DNS resolution issues. Returns: dict with resolver statistics fields.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. It states returns a dict with fields but lacks details on side effects, auth requirements, or behavior if resolver is unavailable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences front-loading purpose, use case, and return type with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema, the description adequately covers purpose, usage, and return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; schema coverage is 100% (empty). Baseline 4 applies as description adds no parameter meanings, but none are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get Unbound DNS resolver statistics' with specific metrics (queries, cache hits, uptime), distinguishing it from sibling DNS tools like opn_dns_lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: 'Use this when you need to check DNS resolver performance, cache hit rates, or troubleshoot DNS resolution issues.' No alternatives or exclusions, but clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_download_configA

Download OPNsense config.xml backup as raw XML.

Use this ONLY when you need a full XML backup for archival purposes. For analyzing specific config sections, use opn_scan_config to build a cached inventory, then opn_get_config_section to query individual sections.

By default, sensitive data (passwords, keys, secrets) is redacted; a config that cannot be parsed for redaction is refused, never returned raw. include_sensitive=true additionally requires OPNSENSE_ALLOW_SENSITIVE=true in the server environment — without it, the call is refused. Returns: dict with 'config_xml' (str), 'stripped' (bool), 'size_bytes' (int), or 'error'/'error_type' when the config cannot be parsed.

NameRequiredDescriptionDefault
include_sensitiveNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so: it discloses default redaction of secrets, the fail-closed behavior when the config cannot be parsed (refused, never returned raw), and the environment prerequisite OPNSENSE_ALLOW_SENSITIVE=true for include_sensitive. These are exactly the safety facts an agent needs before invoking a config-exfiltration-style tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then usage constraint, then safety semantics, then return shape. Every sentence carries distinct information; nothing is restated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A single-parameter tool with an output schema and no annotations is fully covered: purpose, alternatives, redaction/refusal behavior, env precondition, and response keys are all present. The return-value sentence is mildly redundant given the output schema but adds error-key detail that aids handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter has no schema description, so the description must compensate — and it does, explaining include_sensitive's default, its interaction with the server env var, and the refusal outcome when the env var is absent. That is meaning well beyond the bare boolean type and default in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Download OPNsense config.xml backup as raw XML'), including the output format, and explicitly names the sibling tools (opn_scan_config, opn_get_config_section) that serve adjacent purposes. An agent can distinguish this from the section-query siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use constraint ('ONLY when you need a full XML backup for archival purposes') plus a concrete alternative path for the other common case: opn_scan_config then opn_get_config_section. When-not and alternatives are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_firewall_logA

Get recent firewall log entries (blocked and passed packets).

Use this when you need to check what traffic has been blocked or passed, troubleshoot connectivity issues, or audit firewall activity. All filter parameters are optional substring matches applied client-side. Returns: dict with 'entries' (list of log rows) and 'total' (count after filtering).

NameRequiredDescriptionDefault
limitNo
actionNo
interfaceNo
source_ipNo
destination_ipNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior. It explains that filter parameters apply substring matches client-side and outlines the return format. However, it omits details like default time range, ordering, or any destructive implications (none expected). The description is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three sentences. The first sentence immediately states the purpose, and subsequent sentences add usage context and behavior. Every sentence adds value, and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema, the description adequately explains the return structure (entries list and total count). It covers the key aspects of the tool for typical usage. However, it does not mention potential pagination or default time range, which could enhance completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It states that all filter parameters are optional substring matches applied client-side, which adds meaning beyond the schema. However, it does not describe each parameter individually (e.g., valid values for 'action'), and the general description is somewhat vague.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get recent firewall log entries (blocked and passed packets)', specifying the verb, resource, and scope. However, it does not explicitly distinguish from sibling tools like opn_pf_states or opn_interface_stats, which could serve similar purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit use cases: 'check what traffic has been blocked or passed, troubleshoot connectivity issues, or audit firewall activity'. However, it lacks guidance on when not to use this tool or alternative tools for similar tasks, such as opn_pf_states for stateful inspection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_gateway_statusA

Get gateway status including dpinger health checks.

Use this when you need to check if WAN gateways are up, their latency, packet loss, or failover state. Returns: dict with gateway items including status, loss, and delay fields. (If the API answers with a bare array, it arrives wrapped in the 'rows'/'rowCount' envelope.)

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description must carry the full burden of behavioral disclosure. It says the tool is a read-style getter and discloses the return shape ('gateway items including status, loss, and delay fields') plus a concrete envelope quirk, which adds real value, but it omits whether all gateways or only WAN gateways are included, and whether authentication or permissions matter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition leads with purpose, then use cases, then the return shape. Each sentence contributes, and there is no filler; even the parenthetical about the array envelope carries information an agent would otherwise have to discover at runtime.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not enumerate return fields, yet it summarises them briefly and explains the envelope fallback. It is complete for a zero-parameter read tool, missing only scope details such as whether only WAN gateways are covered or what an empty result looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies that no filtering input is required, and its mention of a 'rows'/'rowCount' wrapper clarifies output structure rather than input semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get gateway status'), then narrows it further with 'including dpinger health checks'. This distinguishes it from siblings such as opn_system_status, opn_interface_stats, and opn_pf_states, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear use cases (WAN gateways up, latency, packet loss, failover state), so the agent can decide when the tool applies. It stops short of stating exclusions or naming alternatives; for example, it does not say which tool to choose for interface-level versus gateway-level health.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_get_config_sectionA

Get a specific configuration section as structured JSON.

Use this after opn_scan_config to drill into a specific area of the OPNsense configuration. If the config hasn't been scanned yet, it will be loaded automatically.

Available sections vary by OPNsense installation. Common sections include: system, interfaces, vlans, filter (legacy firewall rules), nat, OPNsense (MVC plugin config), unbound, dnsmasq, dhcpd, staticroutes, syslog.

The 'filter' section is particularly useful — it contains legacy GUI firewall rules that are NOT visible via opn_list_firewall_rules.

Sensitive values are redacted by default; include_sensitive=true requires OPNSENSE_ALLOW_SENSITIVE=true in the server environment. Returns: dict with 'section' name and 'data' (structured config data).

NameRequiredDescriptionDefault
sectionYes
include_sensitiveNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does most of it well: it discloses the implicit config-load side effect, that available sections vary per installation, and that sensitive values are redacted by default unless OPNSENSE_ALLOW_SENSITIVE=true is set server-side. The only gap is that it never states read-only/non-destructive intent outright or what happens on an invalid section name, which matters given the free-form string parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the scan-then-drill workflow are front-loaded, and the section enumeration earns its space by standing in for a missing enum. The 'filter' callout paragraph is also justified, though the description runs slightly long for a two-parameter read tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description still notes the 'section'/'data' shape. Combined with prerequisites, redaction policy, and per-installation section variance, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: it enumerates common section values (system, interfaces, vlans, filter, nat, OPNsense, unbound, dnsmasq, dhcpd, staticroutes, syslog), effectively substituting for the missing enum, and it fully explains include_sensitive including the environment-variable gate. It stops short of saying whether section names are case-sensitive or how unknown names are handled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a specific configuration section as structured JSON') and immediately scopes it against the sibling opn_scan_config, which is the closest conceptual neighbor. It also explicitly distinguishes the 'filter' section from what opn_list_firewall_rules returns, so an agent can tell exactly what data this tool uniquely exposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit sequencing rule ('Use this after opn_scan_config to drill into a specific area') plus a concrete when-to-prefer-this case: filter sections holding legacy GUI rules not visible via opn_list_firewall_rules. The auto-load fallback ('If the config hasn't been scanned yet, it will be loaded automatically') removes the only precondition an agent might worry about.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_get_dnsblA

Get full DNSBL configuration for a specific blocklist by UUID.

Use this when you need to see all available providers and their selection state, current allowlist/blocklist entries, and other DNSBL settings. Get the UUID from opn_list_dnsbl first.

Returns: dict with 'selected_providers', 'available_providers', 'allowlists', 'blocklists', 'wildcards', and config fields.

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must convey behavioral traits. It indicates a read operation ('Get') and lists return fields, implying no side effects. However, it does not disclose permissions, rate limits, or potential errors. The description adds some context beyond the name but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of three short sentences and a bulleted list. The first sentence states the purpose, followed by usage guidance and return structure. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one required parameter and an output schema (mentioned but not provided), the description covers the purpose, usage context, prerequisite, and return fields. It doesn't discuss error handling or authentication, but for a straightforward read operation, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'uuid' is not described in the input schema (0% coverage), but the description explicitly states 'by UUID' and instructs to fetch the UUID from 'opn_list_dnsbl first'. This adds significant meaning beyond the raw schema, explaining how to obtain and use the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the full DNSBL configuration for a specific blocklist by UUID. It specifies the action ('Get'), the resource ('DNSBL configuration'), and the identifier needed. It also distinguishes from the sibling tool 'opn_list_dnsbl' by mentioning it as a prerequisite.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use the tool: 'when you need to see all available providers and their selection state' and similar. It also instructs to 'Get the UUID from opn_list_dnsbl first,' providing a clear prerequisite. However, it does not explicitly state when not to use or mention alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_haproxy_addA

Create a new HAProxy resource.

Use this to add frontends, backends, servers, actions, ACLs, health checks, error files, resolvers, or mailers.

The config dict contains field name-value pairs. Only specify fields you want to set — the API fills in defaults for omitted fields.

Health check example:

  • config={"name": "hc_web", "type": "http", "interval": "5000", "checkport": "8080", "http_method": "get", "http_uri": "/", "http_version": "http11"}

  • For apps returning non-2xx (e.g. 401 behind auth), add: "http_expressionEnabled": "1", "http_expression": "rstatus", "http_value": "^[2-4][0-9]{2}$"

  • After creating, link to a backend with opn_haproxy_update: config={"healthCheck": ""}

IPv6 examples:

  • Frontend bind: config={"name": "web-v6", "bind": "[::]:443,0.0.0.0:443", "mode": "http", "ssl_enabled": "1", "defaultBackend": ""}

  • Server address: config={"name": "srv1", "address": "2001:db8::1", "port": "8080"}

  • Backend resolvePrefer: config={"name": "pool1", "mode": "http", "algorithm": "roundrobin", "resolvePrefer": "ipv6"}

NOTE: Changes are NOT applied until you call opn_reconfigure_haproxy. Call opn_haproxy_configtest first to validate the configuration.

Returns: dict with 'result' (str) and 'uuid' (str) of the new resource.

NameRequiredDescriptionDefault
configYes
resource_typeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that changes are not applied until opn_reconfigure_haproxy, recommends testing first, and explains that omitted config fields get defaults. Return format is specified. This is sufficient for a creation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose, examples, and notes. It is relatively long but each section adds value. Could be slightly trimmed without losing essential info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, parameter usage, example configurations, post-creation steps, and return value. Given the complexity of the tool (creating multiple resource types), it is complete and informative.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds significant value by explaining the config dict usage, providing detailed examples for health checks and IPv6 setups, and listing example fields. However, it does not enumerate valid resource_type values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Create a new HAProxy resource' and lists the specific resource types (frontends, backends, servers, etc.), clearly distinguishing the tool from siblings like opn_haproxy_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool, including examples and a note about calling opn_haproxy_configtest before reconfigure. It mentions opn_haproxy_update as an alternative but does not explicitly state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_haproxy_configtestA

Validate HAProxy configuration syntax before applying.

Use this BEFORE calling opn_reconfigure_haproxy to verify the configuration is valid. This runs 'haproxy -c' internally and reports any syntax errors.

Returns: dict with validation result (typically 'status' key).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes internal mechanism ('haproxy -c') and return type (dict with 'status' key). No annotations provided, so description carries burden; could add more detail about error reporting or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five concise sentences with no waste. Front-loaded purpose, then usage, mechanism, and return. Ideal structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, when to use, how it works, and return format. Output schema exists, so return details are partially covered. Lacks prerequisites or error handling nuances, but sufficient for a simple validation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters. Schema coverage is 100% (empty). Baseline 4 applies per rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool validates HAProxy configuration syntax before applying. Distinguishes from sibling opn_reconfigure_haproxy by explicitly saying 'Use this BEFORE calling opn_reconfigure_haproxy'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises using before opn_reconfigure_haproxy. Lacks explicit when-not-to-use or alternatives, but the directive is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_haproxy_deleteA

Delete a HAProxy resource by UUID.

IMPORTANT: Check for dependencies before deleting:

  • Delete servers before deleting backends that reference them

  • Delete actions/ACLs before deleting frontends/backends that link them

  • Delete backends before deleting frontends that use them as defaultBackend

Resource types: frontends, backends, servers, actions, acls, healthchecks, errorfiles, resolvers, mailers.

NOTE: Changes are NOT applied until you call opn_reconfigure_haproxy.

Returns: dict with 'result' indicating success.

NameRequiredDescriptionDefault
uuidYes
resource_typeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses key behaviors: the deletion is permanent, requires dependency checks, and changes are not applied immediately until reconfigure. It does not detail error handling or side effects, but the essential behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It opens with the main action, then clearly presents dependency warnings, resource types, a reconfigure note, and return value. Every sentence adds necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (dependencies, deferred application), the description covers the essential context: resource types, deletion order, and reconfigure requirement. It lacks information about error responses or what happens if the resource doesn't exist, but the output schema and basic return dict are mentioned. Overall, it is sufficiently complete for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description adds value by enumerating valid resource types (frontends, backends, servers, etc.). However, the uuid parameter is not described beyond being a UUID. The list of resource types helps understand the 'resource_type' parameter, but it is not explicitly linked as a parameter value list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Delete a HAProxy resource by UUID.' It specifies the resource type (HAProxy) and identifier (UUID), and lists the specific resource types that can be deleted. This distinguishes it from other delete tools in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides critical usage guidelines, including dependency order (e.g., delete servers before backends) and the need to call opn_reconfigure_haproxy to apply changes. It does not explicitly compare to alternative tools (e.g., opn_haproxy_update), but the context is clear enough for the agent to use it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_haproxy_getA

Get detailed configuration for a specific HAProxy resource.

Use this to inspect all fields of a single resource before modifying it. Returns the full field set including SSL, tuning, persistence, and linked resources.

Resource types: frontends, backends, servers, actions, acls, healthchecks, errorfiles, resolvers, mailers.

Returns: dict with the resource type as key containing all field values.

NameRequiredDescriptionDefault
uuidYes
resource_typeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes return format ('dict with the resource type as key containing all field values') and mentions included fields (SSL, tuning, persistence, linked resources). No annotation provided, but read behavior is implied; could mention idempotence or lack of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is 7 sentences, front-loaded with purpose, and every sentence provides value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has two straightforward params and an output schema; description covers resource types and return format. Lacks mention of error handling or authentication, but context is sufficient for a get tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It lists resource types in text but does not explain the 'uuid' parameter or provide value constraints beyond the list. Adds some meaning but insufficient detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Get detailed configuration for a specific HAProxy resource' and lists resource types, distinguishing from sibling tools like add/delete/update/search/status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this to inspect all fields of a single resource before modifying it', providing clear context for when to use, though it does not explicitly exclude other use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_haproxy_statusA

Get HAProxy load balancer status and backend health.

Use this when you need to check HAProxy server status, backend availability, or connection statistics. Note: Requires the HAProxy plugin (os-haproxy). Returns: dict with HAProxy status including servers and backends.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It states the tool is read-only (get) and lists a prerequisite, but does not mention potential errors, data freshness, or authorization needs. This is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, each serving a distinct purpose: purpose, usage, prerequisite, and return type. No unnecessary words, well-structured, and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple status tool with no parameters and an existing output schema, the description covers all essential aspects: what it does, when to use, a key prerequisite, and return type. No additional details are needed for an AI agent to correctly invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no input parameters, so the description has no additional parameter info to provide. According to rules, 0 parameters yields a baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves HAProxy load balancer status and backend health, using a specific verb and resource. It distinguishes from sibling HAProxy tools like configuration or search by focusing on status and health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case (checking status, availability, statistics) and a prerequisite (requires os-haproxy plugin). However, it does not explicitly mention when not to use it or suggest alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_haproxy_updateA

Update an existing HAProxy resource.

Use this to modify any field on a HAProxy resource. Only provide the fields you want to change — omitted fields keep their current values.

To enable/disable a resource, set config={"enabled": "1"} or {"enabled": "0"}.

Resource types: frontends, backends, servers, actions, acls, healthchecks, errorfiles, resolvers, mailers.

NOTE: Changes are NOT applied until you call opn_reconfigure_haproxy. Call opn_haproxy_configtest first to validate the configuration.

Returns: dict with 'result' indicating success.

NameRequiredDescriptionDefault
uuidYes
configYes
resource_typeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses that changes are not applied until opn_reconfigure_haproxy is called, that configtest should be performed first, and the return format. It also explains the config parameter behavior (partial updates) and enable/disable pattern. No annotations exist to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured, and front-loaded. Each sentence serves a distinct purpose: purpose, usage, config pattern, resource types, and workflow notes. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (update on multiple HAProxy resource types) and absence of output schema, the description provides all necessary context: purpose, parameters, allowed values, workflow dependencies, and return format. It enables correct invocation without missing critical information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds essential meaning: lists valid resource_type values, explains config as a partial update object with enable/disable example, and implies uuid as identifier. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update an existing HAProxy resource' and lists specific resource types, distinguishing it from sibling tools like opn_haproxy_add, opn_haproxy_delete, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use (modify any field on an existing resource) and provides critical workflow guidance (call configtest first, then reconfigure). However, it does not explicitly mention when not to use or compare to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_interface_statsA

Get per-interface traffic statistics (bytes in/out, packets, errors).

Use this when you need to see network utilization, check for interface errors, or compare traffic across interfaces. Returns: dict with 'statistics' (per-interface counters keyed by interface label).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. 'Get' implies a safe read and the return shape is disclosed, but it says nothing about permissions, data freshness/sampling window, or whether counters are cumulative vs. rate-based – details that matter for interpreting traffic stats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the verb and resource, with a separate 'Returns:' line. Slightly duplicative given an output schema exists, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read tool with an output schema, the description covers purpose, usage and return shape adequately. The only meaningful gap is behavioral context around what the counters represent (interval, reset behavior), which annotations would normally have covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. Nothing in the description misleads about inputs, and it correctly implies no filtering arguments exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get per-interface traffic statistics') and enumerates the counters returned (bytes in/out, packets, errors). An agent can distinguish it from siblings like opn_pf_states or opn_system_status, though the description never explicitly names those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete triggers: 'when you need to see network utilization, check for interface errors, or compare traffic across interfaces.' That is clear usage context, but there are no explicit exclusions or pointers to sibling tools for adjacent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_ipsec_statusA

Get IPsec VPN tunnel status (IKE and ESP phases).

Use this when you need to check IPsec site-to-site tunnel health, see connected peers, or troubleshoot VPN connectivity. Shows both Phase 1 (IKE negotiation) and Phase 2 (ESP/AH tunnels). Note: Requires IPsec to be configured. Based on strongSwan (OPNsense 23.1+). Returns: dict with 'service_status', 'phase1' (IKE sessions), and 'phase2' (tunnels).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description covers behavior. It discloses the two phases, return structure, and strongSwan dependency. Lacks details on error handling or empty status, but sufficient for a read-only status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured: first sentence states purpose, then usage guidance, then technical details and return format. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of output schema (described), the description fully covers the tool's behavior, prerequisites, and return value, leaving no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema is empty (0 parameters), so description does not need to add parameter info. Baseline for 0 params is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get IPsec VPN tunnel status (IKE and ESP phases)' and distinguishes from sibling VPN status tools like opn_openvpn_status and opn_wireguard_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: 'check IPsec site-to-site tunnel health, see connected peers, or troubleshoot VPN connectivity' and notes prerequisite 'Requires IPsec to be configured'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_ipv6_statusA

Get IPv6 configuration and address status for all interfaces.

Use this when you need a quick overview of which interfaces have IPv6 configured, what addresses are assigned, and the IPv6 method (DHCPv6-PD, Track Interface, SLAAC, static).

Returns: dict with 'interfaces' (list of per-interface IPv6 info) and 'summary' (counts of configured/unconfigured interfaces).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It describes the output structure and that it's a read operation. No contradictions; could mention privilege requirements but not needed for this simple query.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each serving a distinct purpose: purpose, usage guidance, return format. No wasted words, front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an output schema, the description covers the essential: what tool does, when to use, and what it returns. Could mention error behavior but not necessary for this simple status tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters. Description correctly indicates no parameters needed. Baseline for zero parameters is 4, and description adds no misleading info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves IPv6 configuration and address status for all interfaces, with a specific verb and resource. It distinguishes from siblings like opn_interface_stats or opn_gateway_status by focusing on IPv6.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use this when you need a quick overview of which interfaces have IPv6 configured...' It doesn't mention when not to use or alternatives, but the use case is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_acme_certsA

List ACME (Let's Encrypt) certificates and their status.

Use this when you need to check certificate expiry dates, renewal status, or which domains have ACME certificates configured. Note: Requires the ACME client plugin (os-acme-client). Returns: dict with 'rows' (list of certificates) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It states it returns a dict with 'rows' and 'rowCount', which implies no side effects for a list operation. However, it does not explicitly state that the operation is read-only or safe, nor does it disclose authentication needs or rate limits. The description is adequate but not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus a note and return format. It is clear and front-loaded with the core purpose. While it could be slightly more concise by integrating the usage guidance, it is not verbose and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (though not shown), the description provides a summary of the return type. It mentions the required plugin, which is important context. However, it does not explain the effect of the 'search' and 'limit' parameters, nor does it mention potential pagination or other caveats. The description is adequate but incomplete regarding parameter behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the description does not explain the parameters 'search' and 'limit'. The description adds no meaning beyond what the input schema already provides. This is a significant gap, as the agent must infer parameter usage from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it lists ACME certificates and their status, and explains what information can be obtained (expiry, renewal, domains). It clearly differentiates from sibling tools, as no other sibling is specifically for ACME certificate listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage guidance: 'Use this when you need to check certificate expiry dates, renewal status, or which domains have ACME certificates configured.' It also mentions a prerequisite (ACME client plugin required). There are no explicit exclusions or alternatives, but given the sibling tools list, this is the only tool for this purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_cron_jobsA

List scheduled cron jobs configured in OPNsense.

Use this when you need to check what scheduled tasks are configured, their frequency, or which commands they run. Returns: dict with 'rows' (list of cron jobs) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It states the return format (dict with 'rows' and 'rowCount') and implies a read-only operation. However, it does not disclose any other behavioral traits like permissions or side effects. This is adequate but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences: one for purpose, one for usage, and one for return format. No wasted words, front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite missing parameter explanations, the description covers purpose, usage, and return format. The presence of an output schema (implied) reduces the need to explain return values. The tool is simple, and the description is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning no parameter descriptions in the schema. The description does not explain the 'search' and 'limit' parameters, failing to compensate for the low coverage. The parameters remain undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List', the resource 'scheduled cron jobs', and the context 'in OPNsense'. It distinguishes this tool from sibling list tools by specifying it lists cron jobs specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you need to check what scheduled tasks are configured, their frequency, or which commands they run.' This provides clear usage context, though it does not mention when not to use it or list alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_ddns_accountsA

List Dynamic DNS (DDNS) accounts and their update status.

Use this to check which hostnames have DDNS configured, their current IP addresses, last update time, and which service provider is used.

Key fields: service (provider), hostname, checkip (method), current_ip, current_mtime (last update), interface, enabled.

For IPv6 DDNS: the global setting 'allowipv6' must be enabled AND an IPv6-capable checkip method must be used (e.g. 'cloudflare-ipv6'). Both must be set or IPv6 updates silently fail.

Note: Requires the Dynamic DNS plugin (os-ddclient). Returns: dict with 'rows' (list of accounts) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Explains return format (dict with rows/rowCount) and important edge case (IPv6 silent failure). Good transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear first sentence, bulleted key fields, and separate notes. Slightly verbose but efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers return structure and important context (IPv6, plugin requirement). Lacks parameter descriptions. Balanced for a list tool with output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage 0%; description does not explain 'search' and 'limit' parameters. Missing crucial guidance on filtering and pagination.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'List Dynamic DNS (DDNS) accounts and their update status' – specific verb+resource, distinguishes from add/delete/update siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Mentions 'Use this to check which hostnames have DDNS configured' and notes prerequisite (os-ddclient plugin), but does not explicitly state when not to use it. Adequate given sibling clarity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_dhcp_leasesA

List current DHCPv4 leases from the ISC DHCP server (legacy).

Use this when the OPNsense instance uses the ISC DHCP plugin (os-isc-dhcp). ISC DHCP is legacy and being phased out — most 26.x instances use dnsmasq or Kea. Use opn_scan_config first to check which DHCP backend is active. Returns: dict with DHCP lease entries including address, mac, and hostname fields. (If the API answers with a bare array, it arrives wrapped in the 'rows'/'rowCount' envelope.)

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden, and it does disclose meaningful behavior: the read-only listing nature, the legacy/deprecation status of the backend, and the prerequisite backend check. What it omits is the failure behavior when ISC DHCP is not installed or not running (error vs. empty list), which is the main remaining unknown for a mutation-free call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then backend caveat, then prerequisite, then return shape — a sensible ordering with no filler. The trailing parenthetical about a bare array arriving in a 'rows'/'rowCount' envelope is slightly awkwardly worded and partly overlaps the existing output schema, but it carries real value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an existing output schema, the description covers what an agent needs to select the tool and route to the right backend sibling. The one gap is the missing statement of what the call returns or errors with when the ISC DHCP plugin is absent, which would fully close the loop on the deprecation warning it raises.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly spends no words on inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List current DHCPv4 leases") plus the exact backend it targets (ISC DHCP server / os-isc-dhcp plugin). This cleanly separates it from the sibling lease lister opn_list_kea_leases and opn_list_dnsmasq_leases without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it (the instance runs the ISC DHCP plugin), warns that ISC DHCP is legacy and most 26.x systems use dnsmasq or Kea, and prescribes a concrete prerequisite action: call opn_scan_config first to determine the active backend. That is when-to-use, when-not-to-use, and the alternative-selection path all in one place.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_dnsblA

List DNSBL (DNS Blocklist) configurations with providers and status.

Use this when you need to see which DNS blocklists are configured, which providers are active, and what allowlist/blocklist entries exist. Use opn_get_dnsbl with a UUID from the results for full details. Returns: dict with 'rows' (list of blocklist configs) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It only describes the return format but does not mention behavioral aspects such as read-only nature, authentication requirements, or performance implications. The tool is likely safe, but this is not disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each adding value: purpose, usage scenario, alternative tool, and return structure. It is front-loaded with the key idea and contains no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a listing tool with two optional parameters, the description covers the core purpose, usage context, and return structure. It lacks parameter details but otherwise provides sufficient context for an AI agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (search, limit) with defaults but no descriptions. The description does not explain their meaning or usage, leaving a gap especially given 0% schema description coverage. No per-parameter guidance is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists DNSBL configurations with providers and status. It distinguishes from the sibling tool opn_get_dnsbl by noting that the latter provides full details, making the purpose and differentiation explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies when to use this tool (to see configured blocklists, active providers, allowlist/blocklist entries) and provides an alternative (opn_get_dnsbl for full details). It does not explicitly mention when not to use it, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_dns_forwardsA

List Unbound DNS forward zones (domain-specific DNS servers).

Use this when you need to check which domains are forwarded to specific upstream DNS servers or DNS-over-TLS resolvers. Returns: dict with 'rows' (list of forward zones) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses the return format (dict with 'rows' and 'rowCount'), indicating it's a read operation. However, it does not mention any potential side effects, permissions, or limitations. This is adequate for a simple listing tool but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of three sentences that are front-loaded with the core purpose. Each sentence adds value: function, use case, and return structure. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (list with two optional parameters) and the presence of an output schema, the description covers the main aspects: what it lists, when to use, and what it returns. The missing parameter explanations are a minor gap in an otherwise complete description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (search, limit) with 0% description coverage in the schema. The description provides no explanation of these parameters, leaving the agent to infer their meaning from the schema types and defaults. This is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists 'Unbound DNS forward zones' and defines them as 'domain-specific DNS servers'. It uses specific verb ('List') and resource ('DNS forward zones'), distinguishing it from sibling list tools like opn_list_dns_overrides or opn_dns_lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you need to check which domains are forwarded to specific upstream DNS servers or DNS-over-TLS resolvers'. This provides clear context for when to use, though it does not mention alternatives or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_dnsmasq_leasesA

List current DHCPv4 and DHCPv6 leases from the dnsmasq DNS/DHCP server.

Use this when the OPNsense instance uses dnsmasq for DHCP (default in 26.x). dnsmasq is a lightweight combined DNS/DHCP server that handles both DHCPv4 and DHCPv6. IPv6 leases appear alongside IPv4 leases in the results. Use opn_scan_config first to check which DHCP backend is active. Returns: dict with 'rows' (list of leases) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that it lists both DHCPv4 and DHCPv6, and that IPv6 leases appear alongside IPv4. It also describes the return format (dict with 'rows' and 'rowCount'). However, it lacks details on permissions, rate limits, or any side effects. Overall adequate for a read-only list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is six sentences, front-loaded with the main purpose. Each sentence adds value (purpose, usage context, IPv6 handling, output format). It is concise but could be improved by including parameter descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has two optional parameters with no descriptions and no annotations, the description is incomplete. It adequately describes the output but fails to explain input parameters. For a simple list tool, it is partially complete but has a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for both parameters ('search' and 'limit'). The description provides no explanation of these parameters or their expected values, leaving the agent to rely solely on the schema defaults, which is insufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' and the resource 'DHCPv4 and DHCPv6 leases from the dnsmasq DNS/DHCP server'. It distinguishes from sibling tools like opn_list_kea_leases by specifying dnsmasq and referencing opn_scan_config to check the backend.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells when to use this tool ('when the OPNsense instance uses dnsmasq for DHCP') and advises to check the backend first via opn_scan_config. It implies alternatives (kea), though it doesn't explicitly list when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_dnsmasq_rangesA

List dnsmasq DHCP ranges (both DHCPv4 and DHCPv6 with RA config).

Use this to see configured DHCP address pools and Router Advertisement settings for each interface. Both IPv4 and IPv6 ranges appear in the same list.

Key fields: interface, start_addr, end_addr, prefix_len (IPv6) or subnet_mask (IPv4), ra_mode (slaac/ra-stateless/ra-only), ra_priority, lease_time, enabled.

Note: Requires the dnsmasq DNS/DHCP server (os-dnsmasq-dns or built-in). Returns: dict with 'rows' (list of ranges) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It notes that both IPv4 and IPv6 ranges appear in same list, lists key fields, and describes return format (dict with 'rows' and 'rowCount'). However, it omits pagination behavior (limit parameter) and search filtering details, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is about 80 words in two paragraphs. Purpose is front-loaded, and key details follow. Some redundancy ('both DHCPv4 and DHCPv6' appears twice) but overall efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and presence of an output schema, the description covers the output structure, key fields, and prerequisite. However, missing parameter explanations slightly reduce completeness. Still adequate for a list tool with existing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It only mentions 'search' and 'limit' but does not describe their semantics (e.g., what search filters, how limit controls pagination). The listed key fields are for the output, not the input parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'List dnsmasq DHCP ranges (both DHCPv4 and DHCPv6 with RA config).' Verb 'list' and resource 'dnsmasq DHCP ranges' are explicit, and the description distinguishes from sibling tools like opn_list_dhcp_leases by specifying ranges (pools) versus leases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: 'Use this to see configured DHCP address pools and Router Advertisement settings for each interface.' Also mentions prerequisite ('Requires the dnsmasq DNS/DHCP server'). Does not explicitly state when not to use or name alternative tools, but the context is sufficient for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_dns_overridesB

List Unbound DNS host overrides (local DNS records).

Use this when you need to see which hostnames are overridden to specific IP addresses in the local DNS resolver. Returns: dict with 'rows' (list of overrides) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool returns a dict with 'rows' and 'rowCount', indicating the action is read-only. However, it does not explicitly state that the operation is non-destructive or describe any side effects, which is acceptable for a listing tool but could be more transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of three sentences that front-load the purpose, provide usage context, and mention the return format. Every sentence adds value without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity and the presence of an output schema, the description covers the core purpose and usage context. However, it lacks parameter semantics, which are important for effective use. This gap reduces completeness, making it adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (search, limit) with default values, but schema description coverage is 0%. The description does not explain what these parameters do (e.g., search filters by hostname, limit controls page size). Since it fails to compensate for the lack of schema descriptions, the score is low.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists Unbound DNS host overrides (local DNS records). It uses a specific verb ('List') and resource ('DNS host overrides'). However, it does not explicitly differentiate from sibling tools like opn_list_dns_forwards, but the name and context make the distinction clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you need to see which hostnames are overridden to specific IP addresses', providing clear context for when to use the tool. It does not mention when not to use it or provide alternatives, but the guidance is direct and adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_firewall_aliasesA

List firewall alias definitions (IP lists, port groups, GeoIP, URLs).

Use this when you need to see which aliases are defined, their types, or what IP addresses/networks they resolve to. Returns: dict with 'rows' (list of aliases) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses return format (dict with 'rows' and 'rowCount'). Does not detail side effects (read-only), pagination, or authentication. Adequate but could elaborate on search behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise: 2 sentences including return value. Main action is front-loaded. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, description still includes return structure, which is helpful. However, it lacks parameter behavior details (e.g., search matching, limit default). Adequate for a simple list tool but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and description does not explain the 'search' or 'limit' parameters. Only implies search functionality via 'what IP addresses/networks they resolve to.' Fails to compensate for missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List firewall alias definitions' with specific verb and resource, and lists types (IP lists, port groups, GeoIP, URLs). Differentiated from sibling tools like opn_list_firewall_categories by focusing on aliases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'when you need to see which aliases are defined, their types, or what IP addresses/networks they resolve to.' Does not mention when not to use or alternatives, but context is clear for a list operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_firewall_categoriesA

List firewall rule categories.

Use this when you need to see which categories exist, check their names and colors, or find category UUIDs for assigning to rules. Returns: dict with 'rows' (list of categories) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It discloses the return structure (dict with 'rows' and 'rowCount') but does not mention safety (read-only), permissions, or potential performance characteristics. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with the purpose, followed by usage guidance and return format. No redundant information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the description covers return structure and usage scenarios, but lacks parameter explanations. Given the existence of an output schema (which we know but not shown), the return description is redundant but not harmful. Overall, incomplete due to missing parameter details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It fails to explain the 'search' and 'limit' parameters, their purpose, or how they affect behavior. No value added beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and resource 'firewall rule categories', and the context of 'check their names and colors' or 'find category UUIDs' distinguishes it from sibling tools like add/delete or list rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'when you need to see which categories exist, check their names and colors, or find category UUIDs for assigning to rules.' This provides clear usage context and implicitly differentiates from alternative operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_firewall_rulesA

List firewall filter rules configured via the MVC API.

IMPORTANT: This only returns rules created through the OPNsense MVC filter API (Settings > Firewall > Automation). Legacy rules configured via the traditional GUI (Firewall > Rules) are NOT visible through this endpoint. Most users have legacy rules — a result of 0 rules does not mean no rules exist.

Use this when you need to inspect MVC-managed firewall filter rules. Returns: dict with 'rows' (list of rules) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It transparently discloses that only MVC API rules are returned and legacy rules are invisible, even noting that a result of 0 does not mean no rules exist. It also describes the return format as dict with 'rows' and 'rowCount'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a clear one-line purpose, an important note in a separate paragraph, and a usage line. Every sentence adds value, and it is front-loaded with the core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only 2 parameters and no annotations, the description covers the essential context: scope, limitation (legacy rules excluded), and return format. The only gap is the lack of parameter explanations, which prevents a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (search and limit) with no descriptions (0% coverage). The description does not explain these parameters at all, failing to add meaning beyond what the schema provides. With zero schema coverage, the description must compensate but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists firewall filter rules configured via the MVC API, distinguishing it from legacy rules. The verb 'List', resource 'firewall filter rules', and scope are specific, and it differentiates from sibling tools like opn_list_nat_rules and opn_list_firewall_aliases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you need to inspect MVC-managed firewall filter rules.' It warns that legacy rules are not included, providing important context for when not to rely on this tool. However, it does not name alternative tools for legacy rules, so a slight deduction for lack of explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_kea_leasesA

List current DHCPv4 leases from the Kea DHCP server.

Use this when the OPNsense instance uses Kea for DHCP (available since 24.7). Kea is the modern replacement for ISC DHCP, recommended for HA setups. Use opn_scan_config first to check which DHCP backend is active. Returns: dict with 'rows' (list of leases) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must cover behavioral traits. It mentions the return format (dict with rows/rowCount) and version requirement (24.7+). However, it omits parameter behavior, edge cases, or performance implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 sentences) and front-loaded with purpose. The third sentence adds background about Kea being a modern replacement, which is slightly extraneous but not harmful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool, it covers usage context and return format but fails to document parameters. The existence of an output schema helps, but missing parameter semantics leaves a gap in completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description provides no information about the two parameters (search, limit). The agent is left without any guidance on how to use them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'current DHCPv4 leases from the Kea DHCP server'. It distinguishes this tool from siblings like opn_list_dhcp_leases and opn_list_dnsmasq_leases by specifying the Kea backend.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance: 'Use this when the OPNsense instance uses Kea for DHCP' and suggests using opn_scan_config first to check the backend. It also mentions Kea is for HA setups, but does not explicitly exclude other backends.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_nat_rulesA

List NAT port forwarding (DNAT) rules.

Use this when you need to see which ports are forwarded to internal hosts, check NAT rule configuration, or troubleshoot port forwarding issues.

Like firewall filter rules, this only returns MVC-managed NAT rules. Legacy NAT rules from the traditional GUI may not appear here — use opn_get_config_section('nat') to see all NAT configuration.

Returns: dict with 'rows' (list of NAT rules) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully discloses that only MVC-managed NAT rules are returned, not legacy ones. It also describes return format (dict with 'rows' and 'rowCount'). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise, front-loaded with purpose, and each sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers scope, return format, and provides alternative for legacy rules. Missing parameter semantics reduces completeness slightly, but output schema exists and overall information is sufficient for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet description does not explain the parameters 'search' or 'limit'. It does not add meaning beyond the schema's type and default values. This is a significant gap for effective use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists NAT port forwarding (DNAT) rules, using specific verb and resource. It distinguishes from sibling opn_get_config_section('nat') which returns all NAT configuration including legacy rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (seeing forwarded ports, checking config, troubleshooting) and when not to use (legacy rules not shown), providing alternative opn_get_config_section('nat').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_servicesA

List system services and their running status.

Use this when you need to check which services are running, stopped, or available on the OPNsense instance. Returns: dict with 'rows' (list of services) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return format (dict with 'rows' and 'rowCount') and implies a read-only operation. It does not mention auth or rate limits, but for a list tool this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three brief sentences: purpose, usage, return format. No unnecessary words, and key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with an output schema, the description covers the purpose and return structure. However, the lack of parameter explanations reduces completeness given the low schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the parameters (search, limit). The agent has no guidance on how to use them, which is a significant gap for a tool with two optional parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists system services and their running status, with a specific verb and resource. It distinguishes from sibling list tools (e.g., opn_list_dhcp_leases) by targeting system services.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use: 'when you need to check which services are running, stopped, or available.' It does not provide when-not-to-use or alternatives, but the context of sibling tools helps differentiate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_list_static_routesA

List configured static routes.

Use this when you need to see custom routing table entries, check which networks are routed through which gateways, or troubleshoot routing issues. Note: This shows configured static routes, not the full kernel routing table. Returns: dict with 'rows' (list of static routes) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the return format (dict with 'rows' and 'rowCount') but does not mention permissions, idempotency, or potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is four sentences with no fluff. First sentence gives purpose, second gives usage, third clarifies scope, last describes output. Efficiently structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the description mentions return format, it covers that well. However, input parameters are not explained, which is a gap for a tool with 0% schema description coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description fails to explain the 'search' and 'limit' parameters, leaving the agent unsure of their purpose and syntax.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List configured static routes' and provides specific use cases. It distinguishes itself from sibling list tools by specifying the resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use the tool and clarifies it does not show the full kernel routing table, providing clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_mcp_infoA

Get MCP server version and runtime configuration.

Use this to check the MCP server version, whether write mode is enabled, the detected OPNsense API version, and whether firewall writes still get savepoint/rollback protection. Version detection runs here if no earlier call triggered it; if the firewall is unreachable, the failure is reported instead of raised. Returns: dict with 'mcp_version', 'write_mode', 'opnsense_version', 'api_style', 'savepoint_support' and, only when detection failed, 'version_detection_error'. 'savepoint_support' is true when the 60-second auto-revert is available, false when OPNsense no longer offers it (26.7+ removed it upstream, so firewall changes are immediate and permanent), and null when no firewall write has probed for it yet.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses a non-obvious side effect (lazy version detection triggered by this call), the failure mode ('failure is reported instead of raised' when the firewall is unreachable), and precise tri-state semantics for 'savepoint_support' including the upstream 26.7+ removal. The consequence of that removal ('firewall changes are immediate and permanent') is exactly the kind of risk context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and usage are front-loaded in the first two sentences, and the detail sentences are all substantive rather than filler. The 'Returns:' block restates field names that an output schema already carries, which is mild redundancy, though the surrounding semantic notes on each field are not redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter introspection tool, the description covers trigger conditions, side effects, error behavior, and the meaning of every returned field including the conditional 'version_detection_error'. Nothing an agent needs in order to call it correctly or interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies and there is nothing for the description to disambiguate. It correctly adds no invented parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Get MCP server version and runtime configuration') and then enumerates exactly which configuration facets are reported (write mode, detected OPNsense API version, savepoint protection). Every sibling tool operates on firewall/DNS/VPN data, so an agent can immediately tell this is the meta/introspection tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to check ...' explicitly names the situations that select this tool, and the note that version detection runs here if no earlier call triggered it gives a concrete reason to call it early. There is no explicit when-not or named alternative, but no sibling offers the same server-level information, so the routing decision is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_mdns_repeater_statusA

Get mDNS Repeater service status and configuration.

Use this to check if the mDNS Repeater is installed, enabled, running, and which interfaces it is configured to relay multicast DNS between.

The mDNS Repeater relays mDNS (224.0.0.251:5353) packets between selected interfaces, enabling device discovery (HomeKit, Chromecast, AirPlay, etc.) across VLANs.

Note: Requires the mDNS Repeater plugin (os-mdns-repeater). Returns: dict with 'service_running', 'enabled', 'interfaces', 'blocklist'.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden. It explains the tool retrieves status and configuration, mentions the plugin requirement, and outlines return fields. It implies read-only behavior but does not explicitly state it is non-destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence serves a purpose: purpose, usage, background, prerequisites, and return format. It is well-structured and front-loaded with the core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter status tool with an output schema, the description covers necessary context: what it does, when to use it, prerequisites, and return fields. It is comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, baseline is 4. The description does not need to add param meaning, but it compensates by describing the return value structure, which aligns with the existing output schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get mDNS Repeater service status and configuration' which clearly identifies the verb and resource. It distinguishes itself from sibling tools like 'opn_configure_mdns_repeater' by focusing on status retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this to check if...' and lists conditions, providing a clear scenario. It also notes the prerequisite plugin. However, it does not explicitly contrast with alternatives like the configure tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_ndp_tableA

Get the NDP table showing IPv6-to-MAC address mappings.

Use this when you need to find which MAC address is associated with an IPv6 address, identify IPv6-enabled devices on a network segment, or troubleshoot IPv6 neighbor reachability. This is the IPv6 equivalent of the ARP table. Returns: dict with 'rows' (list of NDP entries including ip, mac, intf, and manufacturer fields) and 'rowCount' (total).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does a decent job: "Get" plus the purely observational use cases make clear this is a non-mutating read with no side effects. It also names the returned fields (ip, mac, intf, manufacturer), which tells the agent what data will be available for follow-up reasoning; only explicit read-only framing and any permission/size caveats are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then use cases, then a comparison anchor; no filler sentences. The closing "Returns:" sentence partly duplicates the existing output schema, which is the only genuinely redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only lookup with an output schema, this is complete: the agent knows what it returns, when to reach for it, and which sibling it parallels. Nothing needed to invoke it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline of 4 applies for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Get the NDP table") and immediately qualifies the scope as IPv6-to-MAC mappings. The line "This is the IPv6 equivalent of the ARP table" cleanly separates it from the sibling opn_arp_table without requiring the agent to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete triggering scenarios: resolving an IPv6 address to a MAC, enumerating IPv6-enabled devices on a segment, and troubleshooting neighbor reachability. The ARP analogy implicitly routes IPv4 lookups to opn_arp_table, but no explicit "use X instead" exclusion is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_openvpn_statusA

Get OpenVPN connection status (instances, sessions, routes).

Use this when you need to check OpenVPN server/client status, see connected clients, active VPN routes, or troubleshoot OpenVPN tunnels. Note: OpenVPN is built-in (no plugin needed) but must be configured. Returns: dict with 'instances', 'sessions' (connected clients), and 'routes'.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes the return structure but does not explicitly state that the tool is read-only or has no side effects. For a status tool, this is adequate but could be more transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences long, front-loads the purpose, and contains no redundant words. Every sentence provides necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an existing output schema, the description adequately explains the return values and notes the requirement that OpenVPN must be configured. It lacks details on error conditions or real-time nature but is sufficient for a status tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With no parameters, schema coverage is 100%, giving a baseline of 3. The description adds value by explaining the return format, but this is more about output than parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get OpenVPN connection status' and lists the components (instances, sessions, routes). Among sibling tools like opn_ipsec_status and opn_wireguard_status, it explicitly names OpenVPN, making it distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage scenarios: 'when you need to check OpenVPN server/client status, see connected clients, active VPN routes, or troubleshoot OpenVPN tunnels.' It does not mention when not to use it or alternatives, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_pf_statesA

Query the active PF (packet filter) state table.

Use this when you need to see active connections through the firewall, debug NAT issues, or identify which hosts are communicating. Returns: dict with 'rows' (list of state entries) and 'rowCount' (total).

NameRequiredDescriptionDefault
limitNo
searchNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes the return format (dict with 'rows' and 'rowCount'), but does not disclose whether the tool is read-only, requires permissions, or has side effects. Adequate for a query tool but missing safety disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with no redundancy. First sentence states purpose, second gives usage context, third specifies return format. Efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and two undocumented parameters, the description is incomplete. It covers the purpose and return structure, but the lack of parameter documentation and behavioral details makes it only partially complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description fails to mention either parameter ('search' or 'limit'). The agent receives no guidance on how to use these parameters, which is a critical omission.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool queries the active PF state table, with a specific verb and resource. It is distinguishable from sibling tools like opn_firewall_log and opn_list_firewall_rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear use cases: seeing active connections, debugging NAT, identifying hosts. It does not explicitly mention when not to use or alternatives, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_pingA

Ping a host from the OPNsense firewall to test connectivity.

Use this when you need to check if a host is reachable from the firewall, measure round-trip latency, or diagnose network connectivity issues. The ping runs on the firewall itself, not locally. Returns: dict with ping results including loss percentage and RTT stats.

NameRequiredDescriptionDefault
hostYes
countNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the full burden. It discloses that the ping runs on the firewall (not locally) and mentions the return format (dict with loss and RTT stats). No contradictory information. It lacks details on side effects or permissions, but for a ping tool, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: four sentences, no unnecessary words. The purpose is front-loaded, and each sentence adds value (purpose, usage, execution context, return info).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (two parameters, no nested objects, output schema present), the description is reasonably complete. It covers purpose, usage, and return format. It could mention error handling or timeout behavior, but for a ping tool this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions (0% coverage), so the description should compensate. While 'host' is implicitly clear from the purpose, the 'count' parameter is not described. The description does not add meaning beyond the schema. Baseline 3 due to low coverage, and the description only partially addresses the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Ping a host from the OPNsense firewall to test connectivity.' The verb and resource are specific, and it distinguishes from sibling tools like opn_traceroute and opn_dns_lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage scenarios: 'Use this when you need to check if a host is reachable from the firewall, measure round-trip latency, or diagnose network connectivity issues.' It also notes that the ping runs on the firewall itself, which is important context. However, it does not mention when not to use or suggesting alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_reconfigure_ddclientA

Apply pending Dynamic DNS configuration changes.

Use this after manually editing DDNS account settings to apply the changes to the running ddclient service.

Note: opn_add_ddns_account auto-reconfigures, so this is only needed for manual edits or troubleshooting.

Note: Requires the Dynamic DNS plugin (os-ddclient). Returns: dict with 'status' indicating success or failure.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses dependency (os-ddclient plugin) and return format (dict with status). Does not mention potential side effects or permissions, but for a reconfiguration tool this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences plus a note, no unnecessary words. Purpose is front-loaded. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and existence of output schema, the description covers purpose, usage guidelines, dependencies, and return value. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so schema coverage is 100%. Description adds context about when to use and prerequisites, going beyond the schema. Baseline 3 is appropriate, but the extra context raises the score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool applies pending DDNS configuration changes, and distinguishes from opn_add_ddns_account which auto-reconfigures. The verb 'apply' and resource 'DDNS configuration changes' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (after manual edits, for troubleshooting) and when not needed (after opn_add_ddns_account). Provides clear context for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_reconfigure_dnsmasqA

Apply pending dnsmasq DNS/DHCP configuration changes.

Use this after manually editing dnsmasq settings to apply the changes to the running dnsmasq service.

Note: opn_add_dnsmasq_range auto-reconfigures, so this is only needed for manual edits or troubleshooting.

Note: Requires the dnsmasq DNS/DHCP server. Returns: dict with 'status' indicating success or failure.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It mentions requiring the dnsmasq server and returning a status dict, but omits details like whether the service is restarted, potential downtime, or error conditions. More transparency on side effects would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences plus two notes, all front-loaded with the main action. Every sentence adds value: purpose, usage context, exception, prerequisite, return info. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no params) and presence of an output schema, the description covers the core: action, usage context, prerequisite, and return format. It does not explain 'pending changes' or failure modes, but is adequate for a no-param tool with good sibling differentiation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters with 100% coverage (trivially). No parameter documentation needed; baseline 4 applies as per rules. Description adds no param info, but none is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool applies pending dnsmasq configuration changes, explicitly naming the resource and action. It differentiates from siblings like opn_add_dnsmasq_range by noting auto-reconfiguration, and from other reconfigure tools by specifying dnsmasq.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: after manual edits. Also states when not needed: opn_add_dnsmasq_range auto-reconfigures, so only for manual edits or troubleshooting. This clear guidance helps avoid misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_reconfigure_haproxyA

Apply pending HAProxy load balancer configuration changes.

Use this after making HAProxy configuration changes to apply them to the running HAProxy service. This reconfigures HAProxy with the new settings.

NOTE: This does not use savepoint protection. HAProxy changes take effect immediately. Requires the HAProxy plugin (os-haproxy). IMPORTANT: Do NOT call haproxy/service/start after reconfigure — reconfigure already starts the service, and start will error if already running. IMPORTANT: Always call opn_haproxy_configtest before reconfiguring to validate the configuration syntax. Returns: dict with 'status' indicating success or failure.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that changes take effect immediately, no savepoint protection, and that reconfigure starts the service. No annotations provided, so description carries full burden. Could mention potential service interruption but is sufficiently transparent for this type of tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise but includes necessary warnings and notes. Front-loaded with purpose, then usage context and important reminders. Slightly verbose due to multiple warnings but each is essential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all relevant aspects: purpose, usage context, prerequisite (plugin), required sequence (configtest), behavior (immediate, no savepoint), and output format. Zero-parameter tool with high completeness given no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters defined in schema. Baseline score of 4 applies. Description does not need to add parameter information, and it doesn't repeat anything from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'apply' and resource 'pending HAProxy load balancer configuration changes'. Distinguishes from siblings by indicating it is for applying changes after making HAProxy configuration modifications, and explicitly warns against calling haproxy/service/start.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: after making HAProxy configuration changes. Includes important warnings: always call configtest before, do not call start after. Also notes lack of savepoint protection and requirement for os-haproxy plugin.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_reconfigure_unboundA

Apply pending Unbound DNS resolver configuration changes.

Use this after making DNS configuration changes (adding overrides, forward zones, etc.) to apply them to the running Unbound service. This restarts Unbound with the new configuration.

NOTE: This does not use savepoint protection. DNS changes take effect immediately and cannot be auto-reverted. Verify settings before calling. Returns: dict with 'status' indicating success or failure.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it restarts Unbound, changes take effect immediately, and cannot be auto-reverted. Also mentions return type. Could add detail on whether operation is blocking, but overall very informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with main action, then context, caution, and return type. No redundant words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and simple tool, description fully covers purpose, usage context, behavioral notes, and return value. Output schema exists but not needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so baseline 4. Description does not need to add parameter info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action 'Apply pending Unbound DNS resolver configuration changes' and resource 'Unbound DNS resolver'. Distinguishes from sibling reconfigure tools for other services (ddclient, dnsmasq, haproxy).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use after making DNS configuration changes (adding overrides, forward zones) and warns about the lack of savepoint protection and immediate effect. Provides a clear when-to-use and caution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_remove_dnsbl_allowlistA

Remove domains from a DNSBL allowlist.

Use this when you no longer need a domain allowlisted and want to re-enable DNSBL blocking for it. Changes are applied immediately.

Get the UUID from opn_list_dnsbl first.

Parameters:

  • uuid: blocklist UUID from opn_list_dnsbl

  • domains: domains to remove, comma or newline-separated

Returns: dict with 'removed' (list), 'not_found' (list), 'dnsbl_status', and 'service_status'.

NameRequiredDescriptionDefault
uuidYes
domainsYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It states that changes are applied immediately and describes the return dict with 'removed', 'not_found', 'dnsbl_status', and 'service_status'. It does not mention authentication or rate limits, but covers the essential behavioral aspects of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with no unnecessary words. It follows a logical structure: purpose, usage context, prerequisite, parameter list, and return value. The key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters), the description covers all necessary aspects: purpose, usage scenario, parameter details, and return format. The presence of an output schema doesn't reduce the need for completeness, and the description adequately covers the return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the uuid as 'blocklist UUID from opn_list_dnsbl' and the domains parameter as 'comma or newline-separated', adding meaningful detail beyond the raw schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Remove domains from a DNSBL allowlist', specifying the verb 'Remove' and the resource 'domains from a DNSBL allowlist'. This distinguishes it from siblings like opn_add_dnsbl_allowlist and opn_update_dnsbl.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'when you no longer need a domain allowlisted and want to re-enable DNSBL blocking for it.' It also provides a prerequisite by referencing opn_list_dnsbl to get the UUID. It does not explicitly mention when not to use it, but the guidance is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_scan_configA

Scan the OPNsense configuration and build a cached inventory.

Use this FIRST when starting a new session. Downloads the full config, parses it into queryable sections, and detects runtime state (services, DHCP backend, DNS servers). Results are cached for the session — subsequent calls return the cached version unless force=True.

Call with force=True to rescan after manual config changes on the firewall. Use opn_get_config_section(section) to drill into specific sections.

Returns: dict with 'firmware', 'plugins', 'dhcp', 'dns', 'interfaces', 'services', and 'config_sections' (list of available sections with sizes).

NameRequiredDescriptionDefault
forceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Although no annotations are provided, the description fully discloses behavior: downloads full config, parses into sections, detects runtime state, caches results, and that subsequent calls return cached version unless force=True. It also lists the returned keys. This is comprehensive for a tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short paragraphs, each serving a clear purpose: purpose/initial use, caching behavior, and force usage with sibling recommendation. No redundant sentences. Front-loaded with the main verb.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (full config scan) and the presence of an output schema, the description still details what the return dict contains (firmware, plugins, dhcp, etc.) and notes caching behavior. It also mentions the sibling tool for deeper access. This is complete and leaves no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter is 'force' (boolean with default false). The description adds meaning by explaining 'Call with force=True to rescan after manual config changes on the firewall.' This clarifies when and why to use it. Schema coverage is 0% but the description fully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Scan the OPNsense configuration and build a cached inventory.' It specifies the action (scan/build), resource (configuration), and outcome (cached inventory). It also distinguishes itself from sibling tools by recommending opn_get_config_section for drilling into specific sections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to 'Use this FIRST when starting a new session.' Provides clear guidance on when to use force=True (after manual config changes) and directs to a sibling tool for further drilling: 'Use opn_get_config_section(section) to drill into specific sections.' This covers both when to use and when not to.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_security_auditA

Run a comprehensive security audit of the OPNsense firewall.

Checks 11 security areas: firmware, firewall rules (MVC + legacy), NAT/port forwarding, DNS resolver security, system hardening (SSH, HTTPS, syslog), services, certificates, VPN status (incl. WireGuard config audit), HAProxy reverse proxy security, and gateway health.

Findings are tagged with applicable compliance frameworks: PCI DSS v4.0, BSI IT-Grundschutz, NIST SP 800-41, CIS Benchmarks.

Returns a structured audit report with findings categorized by severity (critical, warning, info). Each finding includes a recommendation and applicable compliance framework references.

Use this when you need to assess the security posture of the firewall, identify misconfigurations, or perform a routine health check.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully carries the burden. It transparently describes the audit scope (11 areas), output structure (findings with severity, recommendations, compliance references), and implies it is a read-only assessment. It provides sufficient behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear title sentence, bullet-like list, and usage guidance. It is concise, front-loading the main purpose, and every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a security audit covering multiple areas and the existence of an output schema, the description provides a complete picture of what the tool does and what the output contains (structured report with severity, recommendations, compliance). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters (coverage 100%), so baseline is 4. The description adds no parameter-specific meaning, which is appropriate since there are none. It correctly focuses on tool behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it runs a comprehensive security audit of OPNsense firewall, listing 11 specific security areas checked and mentioning compliance frameworks. It distinguishes itself from sibling tools (which perform individual management operations) by being a holistic audit tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'assess the security posture, identify misconfigurations, or perform a routine health check.' While it doesn't explicitly list when not to use or alternatives, the unique audit purpose makes usage clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_set_dnsblA

Update a DNSBL blocklist configuration (read-modify-write).

Use this when you need to change DNSBL settings — providers, allowlists, blocklists, etc. Only the parameters you provide are changed; all other settings are preserved. Changes are applied immediately.

Get the UUID from opn_list_dnsbl first.

Parameters:

  • uuid: blocklist UUID from opn_list_dnsbl

  • enabled: enable/disable this blocklist

  • providers: comma-separated provider shortcodes (e.g. 'hgz002,hgz011,ag')

  • custom_urls: newline-separated custom blocklist URLs

  • allowlists: newline-separated allowlist entries (domains or regex patterns)

  • blocklists: newline-separated custom block domains

  • wildcards: newline-separated wildcard block domains

  • source_nets: comma-separated source networks (empty = all)

  • nxdomain: return NXDOMAIN instead of 0.0.0.0 for blocked domains

  • cache_ttl: cache TTL in seconds for DNSBL responses

  • description: human-readable description

Returns: dict with 'result', 'dnsbl_status', and 'service_status'.

NameRequiredDescriptionDefault
uuidYes
enabledNo
nxdomainNo
cache_ttlNo
providersNo
wildcardsNo
allowlistsNo
blocklistsNo
custom_urlsNo
descriptionNo
source_netsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states 'Only the parameters you provide are changed; all other settings are preserved' and 'Changes are applied immediately,' which are useful. However, it omits details like authentication requirements, concurrency behavior, or rollback, leaving gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose line, usage guidance, pre-requisite, then parameter list. It is clear and concise, though the parameter list is lengthy. Every sentence serves a purpose with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters with 1 required and the mention of output keys ('result', 'dnsbl_status', 'service_status'), the description covers main aspects. However, it does not explain error conditions or what the 'service_status' field indicates, leaving minor gaps for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides a bullet list explaining each parameter (e.g., 'uuid: blocklist UUID from opn_list_dnsbl', 'enabled: enable/disable this blocklist'), adding clear meaning beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update a DNSBL blocklist configuration (read-modify-write).' It uses a specific verb ('Update') and identifies the resource ('DNSBL blocklist configuration'), distinguishing it from sibling tools like opn_list_dnsbl (list) and opn_get_dnsbl (get).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs 'Use this when you need to change DNSBL settings' and provides a pre-requisite: 'Get the UUID from opn_list_dnsbl first.' However, it does not mention when not to use it or compare with sibling tools like opn_add_dnsbl_allowlist for single entry changes, missing exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_set_rule_categoriesA

Assign categories to a firewall rule by UUID with savepoint protection where supported.

Use this when you need to categorize or re-categorize a firewall rule. Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out.

Parameters:

  • uuid: the firewall rule UUID (from opn_list_firewall_rules)

  • categories: comma-separated category UUIDs (from opn_list_firewall_categories), or empty string to clear all categories

Returns: dict with 'revision' (str) for confirming and 'uuid' (str).

NameRequiredDescriptionDefault
uuidYes
categoriesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the burden of behavioral disclosure. It explains savepoint auto-revert on OPNsense < 26.7, immediate persistence on 26.7+, the 60-second confirmation window with opn_confirm_changes, and lockout risk mitigation. It also discloses the return value shape, which is not specified elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but well-structured, with a clear lead action, usage statement, behavioral warnings, parameter bullets, and return type. Despite its length, every sentence adds necessary context for safe invocation, especially given version-dependent behavior and no annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's mutation risk, version-specific savepoint behavior, and minimal schema with no annotations, the description covers purpose, when to use, safety precautions, parameter semantics, and return values. This is fully adequate for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully compensate. It explains that 'uuid' comes from opn_list_firewall_rules and that 'categories' is a comma-separated list of category UUIDs from opn_list_firewall_categories, including the empty-string behavior to clear categories. This provides source and formatting guidance beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and target: 'Assign categories to a firewall rule by UUID.' This clearly distinguishes it from sibling tools like opn_update_firewall_rule or opn_toggle_firewall_rule, which handle different aspects of rule management.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states 'Use this when you need to categorize or re-categorize a firewall rule' and provides preconditions, including checking opn_mcp_info and taking a backup with opn_download_config when savepoint support is unavailable. It does not explicitly name alternative tools for cases where this tool is not appropriate, but the version-specific guidance makes usage context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_system_statusA

Get OPNsense system status including firmware version and product info.

Use this when you need to check the current firmware version, system name, or verify the OPNsense appliance is reachable and responding. Returns: dict with firmware/product info. On OPNsense 26.x+, product fields are nested under a 'product' key; earlier versions have them at the top level.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but the description fully discloses return format and version-dependent nesting. It implies a read operation with no side effects, which is accurate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: purpose, usage guidance, return details. Front-loaded and no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an output schema, the description adequately covers return format and version differences. Could mention error cases or rate limiting but it's not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description adds value by explaining the return structure, exceeding the baseline expectation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves OPNsense system status including firmware version and product info. This distinguishes it from sibling tools that perform mutations or other queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: to check firmware version, system name, or verify reachability. Does not mention when not to use, but given no direct sibling overlap, it's sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_toggle_aliasA

Toggle a firewall alias's enabled/disabled state.

Use this when you need to temporarily disable an alias without deleting it, or re-enable a previously disabled alias. The toggle flips the current state.

This does NOT use savepoint protection — aliases are metadata definitions. Use opn_list_firewall_aliases first to find the UUID. Returns: dict with 'result' (str) and 'uuid' (str).

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It explains toggle behavior ('flips the current state'), notes no savepoint protection, and describes return format. Lacks details on side effects (e.g., immediate effect vs. apply) and error handling, but adequate for a simple toggle.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six sentences, each with distinct value: purpose, usage context, behavior, savepoint note, prerequisite, and return value. No redundancy or fluff; front-loaded with core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, behavior, prerequisite, and output. Missing explicit error scenarios or confirmation of immediate effect, but sufficiently complete for a single-parameter toggle tool with no output schema provided in structured data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage for the uuid parameter. Description compensates by explaining how to obtain the UUID ('Use opn_list_firewall_aliases first'). While it doesn't specify format or constraints, the guidance is valuable and clarifies the parameter's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear verb+resource: 'Toggle a firewall alias's enabled/disabled state.' It uniquely identifies the tool's function among siblings (e.g., opn_toggle_firewall_rule for rules, other alias tools for add/delete/update).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: 'temporarily disable an alias without deleting it, or re-enable a previously disabled alias.' Includes a prerequisite: 'Use opn_list_firewall_aliases first to find the UUID.' Does not explicitly mention when not to use, but context implies alternatives for other operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_toggle_firewall_ruleA

Toggle a firewall filter rule's enabled/disabled state with savepoint protection where supported.

Use this when you need to temporarily disable a rule for testing or re-enable a previously disabled rule. The toggle flips the current state.

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out. Use opn_list_firewall_rules first to find the UUID of the rule. Returns: dict with 'revision' (str) for confirming and 'uuid' (str).

NameRequiredDescriptionDefault
uuidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses important behavioral traits: savepoint protection details for OPNsense < 26.7, auto-revert in 60 seconds unless confirmed, and the change in behavior on 26.7+. It also warns about the risk of lockout and guides the user to check opn_mcp_info. This adds significant context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and structured with clear paragraphs: first sentence is the core purpose, then usage, then savepoint specifics, then pre-conditions. It is a bit longer than needed but every sentence provides essential operational detail, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (version-dependent behavior, destructive risk, and single parameter), the description covers key aspects: prerequisites, safety measures, and return format. It lacks some details like error handling or exact response structure, but the output schema exists, so the description complements it well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage for the 'uuid' parameter, but the description explicitly states to find the UUID via opn_list_firewall_rules and that the uuid is returned in the output. This adds enough semantic context to compensate for the schema's lack of description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Toggle a firewall filter rule's enabled/disabled state' with a specific verb (toggle) and resource (firewall filter rule), and distinguishes it from sibling tools like opn_list_firewall_rules and opn_update_firewall_rule by focusing on the enable/disable flip.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'when you need to temporarily disable a rule for testing or re-enable a previously disabled rule' and offers clear alternatives: 'Use opn_list_firewall_rules first to find the UUID' and 'take a config backup with opn_download_config'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_tracerouteB

Trace the network path from OPNsense to a destination host.

Use this when you need to diagnose routing issues, identify where packets are being dropped, or visualize the network hops to a destination. Returns: dict with 'result' (str) and 'response' (list of hops).

NameRequiredDescriptionDefault
hostYes
protocolNoICMP
ip_versionNo4

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Description mentions tracing path but does not disclose potential side effects (e.g., sending packets), permissions required, or that it is a read-only operation. Lacks behavioral context beyond purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is extremely concise: two sentences on purpose and usage, plus a clear return format. No extraneous content, front-loaded with actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and low schema coverage, the description provides general usage context and return structure but fails to document parameter options (protocol, ip_version) that are crucial for correct invocation. Output schema mitigates return understanding but does not compensate for parameter gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, and description fails to explain parameters (host, protocol, ip_version). No details on valid protocol values (e.g., ICMP, UDP, TCP) or IP versions, leaving the agent without guidance on parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Trace the network path' with specific verb and resource, and distinguishes from sibling tool opn_ping by focusing on hop-by-hop visualization of routing issues.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: diagnosing routing issues, packet drops, or visualizing network hops. However, it does not mention when not to use or suggest alternatives like opn_ping for simple reachability tests.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_aliasA

Update an existing firewall alias by UUID (read-modify-write).

Use this when you need to rename an alias, change its content (IPs, networks, ports), modify its description, or change its type. Only the parameters you provide are changed; all other settings are preserved.

This does NOT require savepoint protection — aliases are metadata definitions that only affect traffic when referenced by a firewall rule.

Use opn_list_firewall_aliases first to find the UUID.

Parameters:

  • uuid: alias UUID (from opn_list_firewall_aliases)

  • name: new alias name (alphanumeric and underscores only)

  • content: new alias entries separated by newlines

  • description: new description

  • alias_type: new type ('host', 'network', 'port', 'urltable', 'geoip')

  • enabled: enable/disable the alias

Returns: dict with 'result' (str) and 'uuid' (str).

NameRequiredDescriptionDefault
nameNo
uuidYes
contentNo
enabledNo
alias_typeNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It describes the read-modify-write behavior, states that only provided parameters are changed, and notes that aliases are metadata definitions not affecting traffic until referenced. This provides good insight into the tool's behavior, though it could mention error handling or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a clear action statement, usage scenarios, behavioral note, prerequisite, parameter list with descriptions, and return format. No unnecessary words, highly front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, 1 required) and the presence of an output schema, the description is complete. It covers purpose, when to use, prerequisites, parameter details, and return value. It also provides a behavioral note about savepoint protection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaning to each parameter: uuid as alias UUID from list, name format, content separated by newlines, alias_type with enumerated values, and enabled as boolean. This far exceeds the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it updates an existing firewall alias by UUID, specifying the exact actions (rename, change content, description, type) and differentiates from siblings like opn_add_alias, opn_delete_alias, and opn_toggle_alias.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use (rename, change content, etc.) and recommends using opn_list_firewall_aliases first. It also explains that savepoint protection is not needed. However, it does not explicitly contrast with alternative update tools for other resources (e.g., opn_update_firewall_rule), but it is clear within its own domain.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_ddns_accountA

Update a Dynamic DNS account by UUID and apply the configuration.

Use this when you need to change the hostname, provider, credentials, or other properties of a DDNS account. Only the parameters you provide are changed; all other settings are preserved.

After update, the ddclient service is automatically reconfigured. Changes take effect immediately. Use opn_list_ddns_accounts first to find the UUID.

Parameters:

  • uuid: account UUID (from opn_list_ddns_accounts)

  • service: DDNS provider name (e.g. 'cloudflare', 'dyndns', 'noip')

  • hostname: fully qualified domain name to update

  • username: provider username or API key

  • password: provider password or API token

  • checkip: IP check method (e.g. 'web_dyndns', 'if')

  • interface: network interface name (e.g. 'wan')

  • description: human-readable description

  • enabled: enable/disable the account

Returns: dict with 'result' (str), 'uuid' (str), and 'reconfigure_status'.

NameRequiredDescriptionDefault
uuidYes
checkipNo
enabledNo
serviceNo
hostnameNo
passwordNo
usernameNo
interfaceNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behaviors: only provided parameters are changed, ddclient is automatically reconfigured, changes take effect immediately, and return dict includes 'result', 'uuid', 'reconfigure_status'. This meets the full burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficiently structured: purpose first, then usage context, effect, prerequisite step, parameter list, and return value. No wasted words; each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (9 parameters, no enums, no nested objects) and presence of output schema, the description covers all necessary aspects: it explains when to use, how to prepare (list first), what happens after update, and what is returned. The sibling tools list is large but the description focuses on its own purpose without needing explicit comparisons.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description lists all 9 parameters with brief explanations (e.g., hostname: 'fully qualified domain name'). While it lacks detailed format or enum lists, it provides sufficient meaning beyond the schema for most parameters. Examples given for some values (e.g., 'cloudflare', 'web_dyndns') help.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Update', the resource 'Dynamic DNS account', and specifies 'by UUID'. It distinguishes from sibling tools like opn_add_ddns_account and opn_delete_ddns_account by the update action and applying configuration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: 'Use this when you need to change...' and recommends using opn_list_ddns_accounts first to find the UUID. Does not explicitly state when not to use, but the sibling tools cover create/delete/list/reconfigure separately, making the guideline clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_dnsblA

Reload DNSBL blocklist files and restart Unbound to apply them.

Use this when DNSBL lists need to be refreshed without changing the configuration — for example after a service restart that lost loaded lists, or to force Unbound to pick up previously generated blocklist files. This flushes the DNS cache, so previously cached blocked (or unblocked) domains will be re-evaluated.

NOTE: This does not use savepoint protection. DNS changes take effect immediately and cannot be auto-reverted. Returns: dict with 'dnsbl_status' and 'service_status'.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the burden. It discloses that it flushes DNS cache, does not use savepoint protection, changes are immediate and irreversible, and returns specific dict keys. All behavioral traits are transparently documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs with a note. The first sentence states the core action, then usage examples, then caution. Every sentence adds value, no fluff. It is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an existing output schema, the description covers all necessary aspects: what it does, when to use, side effects, return structure. It is complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is 100% trivially. Per guidelines, baseline for 0 params is 4. The description does not need to add param info, and it doesn't miss anything.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool reloads DNSBL blocklist files and restarts Unbound to apply them. This verb+resource pattern is specific and distinguishes it from sibling tools like opn_set_dnsbl (which probably configures rather than reloads) and opn_list_dnsbl (which lists).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use: when DNSBL lists need refreshing without configuration change, e.g., after service restart or to force picking up pre-generated blocklists. It also warns about immediate effect and lack of auto-revert, which implies when not to use (if rollback needed). This provides clear context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_dnsmasq_rangeA

Update a dnsmasq DHCP range by UUID and apply the configuration.

Use this when you need to change the address range, lease time, RA settings, or other properties. Only the parameters you provide are changed; all other settings are preserved.

After update, the dnsmasq service is automatically reconfigured. Changes take effect immediately. Use opn_list_dnsmasq_ranges first to find the UUID.

Parameters:

  • uuid: range UUID (from opn_list_dnsmasq_ranges)

  • interface: network interface name (e.g. 'lan', 'opt1')

  • start_addr: start of address range

  • end_addr: end of address range

  • prefix_len: IPv6 prefix length (e.g. '64')

  • ra_mode: Router Advertisement mode ('slaac', 'ra-stateless', 'ra-only')

  • lease_time: lease duration (e.g. '24h', '1h')

  • description: human-readable description

  • enabled: enable/disable the range

Returns: dict with 'result' (str), 'uuid' (str), and 'reconfigure_status'.

NameRequiredDescriptionDefault
uuidYes
enabledNo
ra_modeNo
end_addrNo
interfaceNo
lease_timeNo
prefix_lenNo
start_addrNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses that after update the service is automatically reconfigured and changes take effect immediately. It also explains that only provided parameters are changed. No mention of permissions or error handling, but the behavioral impact is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: opening statement, usage note, parameter list, return info. The parameter list is somewhat lengthy but each entry is necessary. Conciseness could be improved by grouping optional params, but overall it's readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (9 params, no annotations, update operation), the description is thorough. It covers partial update semantics, service reconfiguration, use of UUID, and return value. Only minor gaps like error handling, but sufficient for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 9 parameters are listed with explanations and examples (e.g., 'lease_time: lease duration (e.g. '24h', '1h')'). Since the schema has no descriptions, the description fully compensates with meaningful semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update a dnsmasq DHCP range by UUID and apply the configuration.' It specifies the verb (update), resource (dnsmasq DHCP range), and distinguishes from siblings like add and delete by focusing on change.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this when you need to change...' and advises to 'Use opn_list_dnsmasq_ranges first to find the UUID.' It mentions partial updates ('Only parameters you provide are changed'). However, it does not explicitly state when not to use it or compare to related tools like opn_reconfigure_dnsmasq.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_dns_overrideA

Update an Unbound DNS host override by UUID and apply immediately.

Use this when you need to change the hostname, domain, IP address, or other properties of a DNS override. Only the parameters you provide are changed; all other settings are preserved.

Changes are applied immediately (Unbound is reconfigured automatically). DNS overrides cannot be auto-reverted — verify settings before calling. Use opn_list_dns_overrides first to find the UUID.

Parameters:

  • uuid: override UUID (from opn_list_dns_overrides)

  • hostname: new hostname part (e.g. 'myserver')

  • domain: new domain part (e.g. 'local.lan')

  • server: new IP address (IPv4 or IPv6)

  • description: new description

  • enabled: enable/disable the override

Returns: dict with 'result' (str), 'uuid' (str), and 'applied' status.

NameRequiredDescriptionDefault
uuidYes
domainNo
serverNo
enabledNo
hostnameNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. Discloses immediate application (Unbound reconfigured), preservation of non-provided parameters, non-revertability, and return structure. Does not cover error handling or authentication.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: header, usage context, immediate effect warning, parameter list, return info. Each sentence adds value. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 params with 0% schema coverage, description covers parameters, usage, and return. Lacks error cases (e.g., missing UUID) and explicit mention of override type. Good overall.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must compensate. Lists all 6 parameters with explanations and examples (e.g., 'e.g. myserver', 'IPv4 or IPv6'). Adds meaning beyond bare schema types. Could improve with format constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update an Unbound DNS host override by UUID', specifying the verb (update), resource (DNS host override), and method (by UUID). It distinguishes from sibling tools like add and delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (to change properties), recommends using opn_list_dns_overrides first to get UUID, and warns that changes cannot be auto-reverted. Lacks mention of alternatives like add/delete but is clear overall.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_firewall_ruleA

Update an existing MVC firewall rule by UUID with savepoint protection where supported.

Use this when you need to modify a firewall rule's action, source/destination, protocol, ports, or other properties. Only the parameters you provide are changed; all other settings are preserved.

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out. Use opn_list_firewall_rules first to find the UUID.

Parameters:

  • uuid: rule UUID (from opn_list_firewall_rules)

  • action: 'pass', 'block', or 'reject'

  • direction: 'in' or 'out'

  • interface: interface name (e.g. 'lan', 'wan', 'opt1')

  • ip_protocol: 'inet' (IPv4), 'inet6' (IPv6), or 'inet46' (dual-stack)

  • protocol: 'any', 'TCP', 'UDP', 'TCP/UDP', 'ICMP', etc.

  • source_net: source address/network or 'any'

  • source_not: invert source match

  • source_port: source port number or range

  • destination_net: destination address/network or 'any'

  • destination_not: invert destination match

  • destination_port: port number or range

  • gateway: force traffic via specific gateway, or empty to clear

  • log: enable/disable logging

  • quick: first-match wins (True) or last-match-wins (False)

  • sequence: rule ordering within priority group

  • categories: comma-separated category UUIDs

  • description: human-readable rule description

  • enabled: enable/disable the rule

Returns: dict with 'revision' (str), 'uuid' (str), and 'result' (str).

NameRequiredDescriptionDefault
logNo
uuidYes
quickNo
actionNo
enabledNo
gatewayNo
protocolNo
sequenceNo
directionNo
interfaceNo
categoriesNo
source_netNo
source_notNo
descriptionNo
ip_protocolNo
source_portNo
destination_netNo
destination_notNo
destination_portNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it delivers extensively. It discloses savepoint auto-revert behavior, version-specific differences, the need to confirm changes on older OPNsense, the lack of automatic rollback on 26.7+, and recommends config backup when savepoint support is unavailable. This is rich, actionable behavioral context well beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but necessarily so for a 19-parameter, behaviorally complex tool. It is front-loaded with the core purpose, then usage guidance, then critical version caveats, then the parameter list, then return values. Every section earns its place with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 19 parameters, no annotations, zero schema-level parameter descriptions, and a mutation-heavy operation, this description is exceptionally complete. It covers invocation, prerequisites, operation scope, safety/rollback behavior, all parameter semantics, and return shape. The output schema exists, so the description appropriately does not need to elaborate return values beyond naming the keys.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does. Every one of the 19 parameters is listed with concise semantics and value hints (e.g., action: 'pass', 'block', or 'reject'; source_net: source address/network or 'any'; quick: first-match wins vs last-match-wins). This adds meaning the raw schema completely lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource statement: 'Update an existing MVC firewall rule by UUID with savepoint protection where supported.' It clearly distinguishes this from sibling tools like add/delete/toggle/list firewall rules by focusing on modifying existing rules by UUID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: 'Use this when you need to modify a firewall rule's action, source/destination, protocol, ports, or other properties.' It also directs agents to call opn_list_firewall_rules first to find the UUID and check opn_mcp_info for savepoint support. It does not explicitly state when not to use it versus alternatives like opn_toggle_firewall_rule, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_update_nat_ruleA

Update an existing NAT port forwarding rule by UUID with savepoint protection where supported.

Use this when you need to change the target IP, port, or other properties of a NAT rule. Only the parameters you provide are changed; all other settings are preserved.

Savepoint protection applies on OPNsense < 26.7 only: there changes auto-revert in 60 seconds unless confirmed with opn_confirm_changes. OPNsense 26.7 removed the savepoint API upstream, so on 26.7+ changes apply immediately and are NOT rolled back automatically. Check opn_mcp_info first: if 'savepoint_support' is false, take a config backup with opn_download_config before changing rules that could lock you out. Use opn_list_nat_rules first to find the UUID.

Parameters:

  • uuid: NAT rule UUID (from opn_list_nat_rules)

  • interface: source interface (e.g. 'wan', 'opt1')

  • protocol: 'TCP', 'UDP', or 'TCP/UDP'

  • destination_port: external port to forward (e.g. '8080', '3000-3010')

  • target_ip: internal IP address to forward to

  • target_port: internal port

  • description: human-readable description

  • enabled: enable/disable the rule

Returns: dict with 'revision' (str), 'uuid' (str), and 'result' (str).

NameRequiredDescriptionDefault
uuidYes
enabledNo
protocolNo
interfaceNo
target_ipNo
descriptionNo
target_portNo
destination_portNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavior: savepoint protection on OPNsense <26.7 with 60-second auto-revert, immediate changes on 26.7+, and the need to take a backup if savepoint_support is false. This adds crucial operational detail beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, usage, parameters, returns) and each sentence adds value. It is detailed yet not redundant, front-loading the core purpose and organizing the rest logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, no annotations, and the complexity of version-dependent behavior, the description covers all necessary aspects: parameter explanations, savepoint differences, workflow prerequisites, and return type. It is complete and actionable for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description lists every parameter with an explanation, example, or type (e.g., destination_port: '8080', '3000-3010'). This fully compensates for the lack of schema descriptions, giving agents the meaning and acceptable values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing NAT port forwarding rule by UUID, distinguishing it from add/delete/list operations. It specifies the verb, resource, and identifier method, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool (to change target IP, port, or properties), notes that only provided parameters are changed, and instructs to use opn_list_nat_rules first and check opn_mcp_info for savepoint support. This provides clear context and prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opn_wireguard_statusA

Get WireGuard VPN tunnel and peer status.

Use this when you need to check WireGuard tunnel health, peer handshake times, transferred bytes, or endpoint information. Note: Requires the WireGuard plugin (os-wireguard). Returns: dict with tunnel and peer details including endpoints and transfer stats.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return type (dict) and key fields (endpoints, transfer stats). Requires plugin is noted. No annotations, so description carries full burden; it sufficiently conveys a read-only, side-effect-free operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose, usage context, return info plus note. Front-loaded, no redundancy, every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a status tool with no parameters and an output schema, description covers purpose, usage, return structure, and a prerequisite. No gaps given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; schema coverage is 100% vacuously. Description adds no parameter info, but baseline for zero parameters is 4. No additional value needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description starts with 'Get WireGuard VPN tunnel and peer status', a specific verb-resource pair. Lists concrete outcomes (health, handshake times, bytes, endpoints), distinguishing it from sibling status tools like opn_openvpn_status or opn_ipsec_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Use this when you need to check WireGuard tunnel health...', providing clear context. Also notes plugin requirement. Lacks explicit when-not-to-use but differentiation from siblings is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 81 tool updatesv0.4.0
    • First observedopn_add_alias
    • First observedopn_add_ddns_account
    • First observedopn_add_dns_override
    • First observedopn_add_dnsbl_allowlist
    • First observedopn_add_dnsmasq_range
    • First observedopn_add_firewall_category
    • First observedopn_add_firewall_rule
    • First observedopn_add_icmpv6_rules
    • First observedopn_add_nat_rule
    • First observedopn_arp_table
    • First observedopn_configure_mdns_repeater
    • First observedopn_confirm_changes
    • First observedopn_crowdsec_alerts
    • First observedopn_crowdsec_status
    • First observedopn_delete_alias
    • First observedopn_delete_ddns_account
    • First observedopn_delete_dns_override
    • First observedopn_delete_dnsmasq_range
    • First observedopn_delete_firewall_category
    • First observedopn_delete_firewall_rule
    • First observedopn_delete_nat_rule
    • First observedopn_dns_lookup
    • First observedopn_dns_stats
    • First observedopn_download_config
    • First observedopn_firewall_log
    • First observedopn_gateway_status
    • First observedopn_get_config_section
    • First observedopn_get_dnsbl
    • First observedopn_haproxy_add
    • First observedopn_haproxy_configtest
    • First observedopn_haproxy_delete
    • First observedopn_haproxy_get
    • First observedopn_haproxy_search
    • First observedopn_haproxy_status
    • First observedopn_haproxy_update
    • First observedopn_interface_stats
    • First observedopn_ipsec_status
    • First observedopn_ipv6_status
    • First observedopn_list_acme_certs
    • First observedopn_list_cron_jobs
    • First observedopn_list_ddns_accounts
    • First observedopn_list_dhcp_leases
    • First observedopn_list_dns_forwards
    • First observedopn_list_dns_overrides
    • First observedopn_list_dnsbl
    • First observedopn_list_dnsmasq_leases
    • First observedopn_list_dnsmasq_ranges
    • First observedopn_list_firewall_aliases
    • First observedopn_list_firewall_categories
    • First observedopn_list_firewall_rules
    • First observedopn_list_kea_leases
    • First observedopn_list_nat_rules
    • First observedopn_list_services
    • First observedopn_list_static_routes
    • First observedopn_mcp_info
    • First observedopn_mdns_repeater_status
    • First observedopn_ndp_table
    • First observedopn_openvpn_status
    • First observedopn_pf_states
    • First observedopn_ping
    • First observedopn_reconfigure_ddclient
    • First observedopn_reconfigure_dnsmasq
    • First observedopn_reconfigure_haproxy
    • First observedopn_reconfigure_unbound
    • First observedopn_remove_dnsbl_allowlist
    • First observedopn_scan_config
    • First observedopn_security_audit
    • First observedopn_set_dnsbl
    • First observedopn_set_rule_categories
    • First observedopn_system_status
    • First observedopn_toggle_alias
    • First observedopn_toggle_firewall_rule
    • First observedopn_traceroute
    • First observedopn_update_alias
    • First observedopn_update_ddns_account
    • First observedopn_update_dns_override
    • First observedopn_update_dnsbl
    • First observedopn_update_dnsmasq_range
    • First observedopn_update_firewall_rule
    • First observedopn_update_nat_rule
    • First observedopn_wireguard_status

TDQS

A3.6/5.0

Scored across 81 tools

Disambiguation4/5

Most tools are clearly separated by resource and action, and descriptions explicitly warn about MVC vs legacy firewall rules and backend-specific DHCP lease tools. A few areas remain confusable, especially the three DHCP lease listings, opn_set_dnsbl vs opn_update_dnsbl, and the various HAProxy reconfigure/configtest/status tools.

Naming Consistency4/5

The opn_ prefix is used throughout and most names follow a predictable action_resource pattern such as opn_list_firewall_rules and opn_add_nat_rule. Minor deviations exist, including HAProxy's resource-first naming, alias singular/plural inconsistency, and opn_update_dnsbl meaning 'reload' rather than update configuration.

Tool Count1/5

81 tools is an extreme number for a single MCP server and far beyond the typical 3-15 well-scoped range. While OPNsense is broad, this surface is large enough to make discovery and correct selection burdensome for an agent.

Completeness3/5

Core areas such as firewall rules, aliases, NAT, DNS overrides, DNSMasq ranges, DDNS, and HAProxy have substantial CRUD coverage, while several other areas are only partially covered. Static routes, services, cron jobs, ACME certificates, and most VPN configuration are read-only or status-only, leaving notable lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessLimited data

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A modular MCP server that provides access to over 2,000 OPNsense firewall management methods through 88 specialized tools. It enables AI assistants to securely manage firewall rules, network interfaces, and system diagnostics using a type-safe TypeScript interface.
    147 npm
    93
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    This MCP server enables AI agents to inspect and modify an OPNsense firewall via natural language, using a compact set of generic tools and a resource registry to cover 96 CRUD operations.
    13 npm
    AGPL 3.0