Skip to main content
Glama
coreyhines

coreyhines/opnsense-mcp

by coreyhines

OPNsense MCP Server

opnsense-mcp MCP server opnsense-mcp MCP server

MCP server for OPNsense firewall operations (ARP, DHCP, logs, rules, interfaces, system status, packet capture).

Use one of two deployment modes:

  • STDIO (local): best for Cursor/Claude Code/Continue running the server process directly.

  • SSE (centralized): best for shared, long-lived service over HTTPS.

Demo

Query your firewall with Claude Code CLI. Live example with real network data:

opnsense-mcp demo

Related MCP server: OPNSense MCP Server

Why This Exists

Built this because SSH'ing into the firewall to check logs or grab ARP data got old fast. Now you can ask Claude:

  • "What's happening on the network right now?"

  • "Show me the latest firewall blocks"

  • "Tell me about that host"

  • "Capture packets from the suspicious traffic"

Claude handles the firewall query via MCP and gives you analysis + context in one shot. Works on homelab or business deployments equally well.

Quick Start

1) Local setup (required for both modes)

uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
cp examples/.env.example ~/.env

Edit ~/.env:

OPNSENSE_API_KEY=your_api_key
OPNSENSE_API_SECRET=your_api_secret
OPNSENSE_FIREWALL_HOST=your.firewall.host
MCP_SECRET_KEY=replace_me

2) Choose mode

Mode A: STDIO (local IDE/client)

Configure your MCP client to launch mcp_start.sh:

{
  "mcpServers": {
    "opnsense-mcp": {
      "command": "/bin/bash",
      "args": ["/absolute/path/to/opnsense-mcp/mcp_start.sh"],
      "cwd": "/absolute/path/to/opnsense-mcp"
    }
  }
}

See full guide: docs/GETTING_STARTED.md.

Mode B: SSE (centralized service)

Run the Linux installer (Podman + quadlet + Caddy TLS):

sudo bash deploy/install.sh

Clients connect to:

https://<your-hostname>/sse

See deployment docs:

What Is Available

Primary tools:

  • Discovery: arp, dhcp, lldp

  • Monitoring: system, get_logs, packet_capture

  • Firewall rules: fw_rules, mkfw_rule, set_fw_rule, toggle_fw_rule, rmfw_rule

  • Interfaces: interface_list

Full reference: docs/REFERENCE/FUNCTION_REFERENCE.md

What's New (June 2026)

Five PRs landed recently. See docs/FEATURES_UPDATE.md for full details and usage examples.

  • Streamable HTTP transport — native FastMCP server supports stdio, sse, and streamable-http (MCP spec 2025-03-26). Deployed via deploy/install.sh.

  • DHCP client_id (DUID) supportmk_dhcp_host and move_dhcp_host accept an optional DUID for stateful DHCPv6 matching.

  • Semver image tags — images are tagged from pyproject.toml version + git short SHA (1.0.0-dev.a1b2c3d) or release tags (1.0.0).

  • Container registry — pinned tags only; :latest is rejected. Set OPNSENSE_MCP_IMAGE_REPO, or build locally with --build-local.

  • install.sh readonly fix — Bash readonly clash between install.sh and lib.sh resolved.

Use Cases

  • Homelab network troubleshooting — Query firewall logs from terminal, get Claude's take on what's happening

  • Security operations — Automate incident triage: "Analyze the last hour of blocks"

  • Infrastructure automation — Write MCP-aware scripts that query firewall state dynamically

  • DevOps troubleshooting — Quick VLAN/interface status checks without SSH sessions

Feedback

First 10 users get feedback incorporated into the tool. If you find bugs or have ideas, file an issue or discussion.

Where to look first when reviewing

scripts/risk_map.py ranks source files by defect likelihood from git history — churn times fix density — so a review reads the risky files first and can stop early. It finds no bugs; it finds where they concentrate.

python3 scripts/risk_map.py --top 15

CI runs it on every pull request alongside a complexity report (radon) and a security-pattern pass (bandit) in the advisory Insights workflow, which never blocks a merge. Thresholds that gate the build come later, once the numbers are trusted.

Documentation Map

License

This project is released under the MIT License.

Available Tools

14 tools
aliasB

Manage firewall aliases, the named address and port groups rules reference. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo[create] Alias name
typeNo[create] Alias type, one of: host, network, port, url, urltable, geoip, networkgroup, mac, asn, dynipv6host, authgroup, internal, external
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
searchNo[list] Filter by alias name, type, or content
confirmNoToken returned by the previous call, to confirm.
contentNo[create, update] Members: addresses, networks, ports or codes
enabledNoTarget state, set explicitly rather than flipped.
descriptionNoFree-text note stored on the record.

TDQS

B3.3/5.0
Behavior2/5

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

There are no annotations, so the description carries the full burden of behavioral disclosure. It says 'Manage' but does not disclose staging/apply semantics, destructive operations, confirmation requirements, or return behavior. The schema hints at apply and confirm, but the description itself is silent.

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?

Two sentences, front-loaded with purpose and a direct next-step instruction. There is no filler, and the help guidance 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?

For a 10-parameter, multi-action tool with no output schema and no annotations, the description is thin. However, the explicit 'call action=help' hand-off mitigates some gaps. It still omits staging/apply behavior, deletion confirmation, and return-value expectations, so it is adequate but not complete.

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%, so the baseline is 3 even without parameter details in the description. The 'action=help' hint is a useful addition, but the description does not explain individual parameters beyond what the schema already provides.

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 names a specific resource ('firewall aliases') and clarifies that these are the named address and port groups that rules reference. This distinguishes it from siblings like fw_rule, though the verb 'Manage' is broad and does not enumerate the concrete actions.

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 instruction to call action='help' is actionable and gives the agent a path to discover each action's fields and rules. However, it does not explicitly contrast with sibling tools or state when this tool should be preferred over them; the context implies alias management but not exclusions.

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

arpC

Show ARP/NDP table

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNoFilter by IP address
macNoFilter by MAC address
searchNoTargeted search by IP/MAC/hostname

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'Show', implying a read-only operation, but does not explicitly confirm safety, describe output format, or mention any side effects or prerequisites. This is minimal disclosure for a tool with no annotation support.

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 a single concise sentence with no filler or redundant details. It is appropriately sized for a simple show command and front-loads the core purpose effectively.

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

Completeness2/5

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

The tool has no output schema and no annotations, yet the description provides only the barest functionality statement. It does not explain what the returned table looks like, how filters behave, or any limitations. For a tool with filters, this is incomplete 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?

Schema description coverage is 100%, so all three parameters (ip, mac, search) are already documented in the schema. The description adds no extra meaning about these filters, such as syntax or interaction between them, so it stays at the baseline score of 3.

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 states a clear action ('Show') and a specific resource ('ARP/NDP table'), which is distinct from the sibling tools. It is not a tautology and communicates the tool's core function immediately, though it does not explicitly contrast with siblings like 'diagnostics' or 'ipv6'.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention any conditions, use cases, or exclusions, leaving the agent to infer from the name alone.

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

bgpC

FRR BGP: peering state and neighbours. FRR ships disabled, so an empty result usually means it has not been turned on yet. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
bfdNo[create_neighbor] Use BFD for fast failure detection
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
addressNo[create_neighbor] Peer address
confirmNoToken returned by the previous call, to confirm.
enabledNoTarget state, set explicitly rather than flipped.
multihopNo[create_neighbor] Peer is not on a directly connected subnet
passwordNo[create_neighbor] MD5 session password; stored in clear by OPNsense
as_numberNo[configure] Local AS number. Required the first time BGP is enabled
remote_asNo[create_neighbor] Peer AS number. Give this or remote_as_mode, not both
router_idNo[configure] Router id, conventionally a loopback address
descriptionNoFree-text note stored on the record.
update_sourceNo[create_neighbor] Interface to source the session from, e.g. lo0
remote_as_modeNo[create_neighbor] internal or external, deriving the peer AS from the local one

TDQS

C2.9/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 the full burden of behavioral disclosure. It does add one useful trait: an empty result often means FRR has not been enabled. However, it omits that this tool can mutate system state (configure, create/delete/toggle_neighbor), presumably requires confirmation and staging in some actions, and may have irreversible effects. The description leans on the schema and the help action rather than disclosing these behaviors.

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 compact, only two sentences, and front-loads the domain before the critical empty-result caveat. No sentence is wasted. The first sentence is a fragment and could be a bit more explicit, but it does not bloate the text.

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 complex – 15 parameters, 7 actions, no output schema, and no annotations – yet the description provides only the domain, one environment caveat, and a help-action instructon. The rich input schema compensates significantly, and the help action fills gaps. Still, the description does not cover side effects, when to use confirmed/staged flows, or relationship to siblings like 'routing', so it is not fully complete.

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%, so the parameters are already well-documented in the input schema. The description's pointer to action='help' adds a meta-layer for discovering per-action fields and rules, but it does not directly clarify individual parameter meanings. This matches the baseline of 3 for high schema coverage.

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

Purpose3/5

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

The description 'FRR BGP: peering state and neighbours' identifies the resource (FRR BGP) but lacks a verb; it reads like a label rather than a full statement of function. It does not explicitly say the tool can configure BGP or manage neighbors, which the action enum reveals. It is distinguishable from siblings like 'routing' by name, but the description itself is telegraphic.

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?

No alternatives or exclusion conditions are mentioned, and no sibling tools are referenced. The FRR-disabled caveat and the instruction to call action='help' provide operational context but do not tell an agent when to choose this tool over 'routing' or other siblings. Usage is implied by the resource name and scope rather than stated.

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

config_backupC

Configuration backups, revision history and boot environment snapshots. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo[list] Maximum revisions to return (default 25)
rev_aNo[diff] Older revision id, from list_config_backups
rev_bNo[diff] Newer revision id, from list_config_backups
actionYesOperation to run. 'help' lists fields.
providerNo[diff, download, list] Backup provider id (default 'this')
revisionNo[download] Revision id to fetch; omit for the running config
descriptionNoFree-text note stored on the record.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry the behavioral disclosure burden, but it only names resource areas and points to help. It does not reveal which actions are mutating, whether snapshots affect the boot environment, any side effects, or return behavior. There is no contradiction with annotations because none are provided.

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 short front-loaded sentences with no filler, and the second sentence gives a concrete next step. It is concise, though the first sentence is a noun fragment rather than a complete purpose statement.

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 complex with 7 parameters and no output schema, and the description is not self-contained. However, the explicit action='help' instruction provides a viable discovery path for action-level rules, and the schema documents every parameter. It still lacks return shapes and side-effect warnings, making it adequate but not complete.

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%, so the schema already documents each parameter with action-scoped tags such as [list], [diff], and [download]. The description adds only the pointer to action='help' for action-specific fields and rules, which is a discovery aid rather than new parameter semantics; baseline 3 is appropriate.

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

Purpose3/5

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

The description identifies the domain—configuration backups, revision history, and boot environment snapshots—and distinguishes it from sibling config-editing tools by resource type. However, it provides no verb: it never states what the tool does with these resources (e.g., create, diff, download, list), so the purpose must be inferred from the action enum in the schema.

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?

It gives an explicit entry strategy: call action='help' to get each action's fields and rules, which is useful for an agent unsure of sub-action semantics. It does not, however, explain when to choose config_backup over sibling tools or which scenarios call for backups/revisions versus live configuration changes.

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

dhcpB

DHCP: leases, static reservations, ranges, options and per-subnet DNS. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNo[delete_lease] IP address to delete
macNo[create_host, delete_lease] MAC address (e.g. 'aa:bb:cc:dd:ee:ff')
tagNo[set_router] Tag uuid to scope to instead of an interface
hostNo[delete_host, move_host] Hostname, MAC, or reservation uuid to delete
ipv4No[create_host, move_host] IPv4 address to assign (e.g. '172.20.8.50')
ipv6No[create_host, move_host] IPv6 suffix: integer (e.g. 50 → ::50) or '::abcd'
slotNo[set_dns] Optional slot index (1 or 2) for single-address updates
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
descrNo[create_host, list_hosts] Optional description
forceNo[set_router] Send the option even when the client did not ask
actionYesOperation to run. 'help' lists fields.
domainNo[create_host, create_range, update_range] Optional domain for the host (e.g. 'lan')
familyNo[set_dns] Address family to update: ipv4 or ipv6
routerNo[set_router] Gateway address to advertise
searchNo[leases, list_hosts] Filter leases by hostname, IP, or MAC address. Omit for full table.
subnetNo[list_dns, set_dns, toggle_range] Subnet in CIDR notation (e.g. 172.20.2.0/24)
confirmNoToken returned by the previous call, to confirm.
enabledNoTarget state, set explicitly rather than flipped.
end_addrNo[create_range, update_range] Last address
hostnameNo[create_host, delete_lease] Hostname for the reservation (e.g. 'mydevice')
client_idNo[create_host, move_host] Optional DHCP client identifier / DUID for IPv6 (e.g. '52:54:00:7e:9c:f4:00:ab:cd:01'). Accepts optional 'id:' prefix.
interfaceNo[create_range, list_dns, set_dns, set_router, toggle_range] Interface key, e.g. opt3
dns_serverNo[set_dns] Single DNS server address
lease_timeNo[create_range, update_range] Seconds, or a suffixed value like 2h
start_addrNo[create_range, update_range] First address
descriptionNoFree-text note stored on the record.
dns_serversNo[set_dns] One or two DNS server addresses
subnet_maskNo[create_range, update_range] subnet_mask
missing_ipv6No[list_hosts] When true, return only reservations with IPv4 but no ::N IPv6 suffix
new_hostnameNo[move_host] New dnsmasq host reservation name (optional rename)

TDQS

B3.2/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 the full burden of behavioral disclosure. It only says to call action='help' for rules, but it does not mention that many actions mutate state, that changes may be staged rather than applied, that some actions require a confirm token,, or that delete actions exist. The schema hints at these behaviors via 'apply' and 'confirm' params, but the description itself gives no behavioral transparency.

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?

Two short sentences: the first states scope, the second gives an actionable pointer for details. No filler. For a tool with 31 params, this concise front-loaded structure is appropriate and every sentence earns its place.

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

Completeness2/5

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

For a 31-parameter, 17-action tool with no output schema and no annotations, this description is not complete enough. It does give a useful help hook, but it fails to convey the breadth of actions, the mutation vs read distinction, the staging/confirmation model, or any guidance on choosing among sibling network tools. An agent can begin but cannot safely invoke correctly without extra calls and risky inference.

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%, so the baseline is 3; the schema already documents all 31 parameters and their action-specific scoping. The description adds nothing about parameter semantics, only directing the user to action='help' for per-action field rules. It doesn't add value beyond schema but also doesn't mislead.

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 names the resource domain clearly ('DHCP: leases, static reservations, ranges, options and per-subnet DNS') and distinguishes it from sibling tools by domain and resource types. It does not use a single specific verb, but for a multi-action dispatcher tool this is acceptable. The pointer to action='help' adds practical clarity about how to learn the available operations.

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 scope statement implies 'use this for DHCP management', which is reasonable given sibling names like bgp, alias, and dns_override. It does not explicitly say when not to use this tool or name alternatives. The instruction to call action='help' for field and rules is useful usage guidance, but only within the tool, not between tools.

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

diagnosticsA

Read-only views of what the firewall currently sees: neighbours, interfaces, state table, logs, captures, and reachability. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNo[pf_states] ip
rawNo[packet_capture] Return raw PCAP file if true (default: false)
countNo[packet_capture, ping] Packet count limit (optional)
limitNo[logs, pf_states] limit
stateNo[pf_states] state
actionYesOperation to run. 'help' lists fields.
dst_ipNo[logs, pf_states] dst_ip
familyNo[ping] inet or inet6 (default inet)
filterNo[packet_capture] BPF filter expression (optional)
src_ipNo[logs, pf_states] src_ip
streamNo[packet_capture] If true, stream pcap data to chat (hex preview)
targetNo[ping] Address or hostname to ping
sort_byNo[interface_health] sort_by
summaryNo[pf_states] summary
dst_portNo[logs, pf_states] dst_port
durationNo[packet_capture] Duration in seconds (default: 30)
protocolNo[logs, pf_states] protocol
src_portNo[logs, pf_states] src_port
interfaceNo[interface_health, logs, packet_capture, pf_states] interface
local_pathNo[packet_capture] Local path to save PCAP (optional)
log_actionNo[logs] log_action
packetsizeNo[ping] Payload bytes, for checking MTU on a transit
include_rawNo[interface_health, pf_statistics] include_raw
max_resultsNo[interface_health] max_results
include_downNo[interface_health] include_down
summary_onlyNo[logs] summary_only
include_rulesNo[logs] include_rules
preview_bytesNo[packet_capture] Number of bytes to preview (default: 1000)
warnings_onlyNo[interface_health] warnings_only
capture_actionNo[packet_capture] start, stop, or fetch (default: start)
source_addressNo[ping] Source address, to test a specific path

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 behavioral disclosure burden. It explicitly declares 'Read-only views', which is the key safety trait. However, it does not surface nuances such as packet_capture's start/stop/fetch lifecycle or ping's active network probes, which a fully transparent description for a 9-action tool would mention.

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?

Two sentences, front-loaded with a concrete scope list and followed by a single high-value self-help instruction. No filler or redundant elaboration.

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 31-parameter, 9-action tool with no output schema and no annotations, this description is deliberately broad and routes the agent to action='help' for per-action details. The schema's per-parameter action tags compensate for missing prose, but return semantics and per-action behavioral differences are not covered in the tool description itself.

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% and every parameter already has an action-tagged description, so the schema does the heavy lifting. The description only adds a meta-instruction to call action='help' for per-action fields and rules, which is useful but does not explain individual parameters. Baseline 3 is appropriate.

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 states a specific purpose: read-only views of the firewall's current state, listing six concrete domains (neighbours, interfaces, state table, logs, captures, reachability). This makes the tool's scope clear and distinguishes it from config-oriented siblings by the 'read-only' framing, though it does not explicitly name an alternative.

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 'Read-only views' qualifier gives clear context: use this for inspecting current firewall state rather than modifying configuration. The explicit instruction to call action='help' for each action's fields and rules is actionable entry-point guidance. It does not state exclusions or name sibling tools, so it stops 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.

dns_overrideA

Manage Unbound host overrides. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo[flush] name: flush one hostname via unbound-control (default); restart: restart Unbound via API (clears full cache)
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
domainNo[create] Domain (e.g. 'local' or 'example.com')
searchNo[list] Filter by hostname, IP, or description
serverNo[create, update] IP address this hostname resolves to
enabledNoTarget state, set explicitly rather than flipped.
hostnameNo[create, flush] Hostname (without domain, e.g. 'myserver')
descriptionNoFree-text note stored on the record.

TDQS

A3.5/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 the full burden. It only says 'call action=help' and reveals nothing about side effects, whether changes are staged or applied immediately, restart/flush semantics, or other behavioral traits. The schema has hints, but the description itself is very thin.

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?

Two short sentences with no filler. The purpose is front-loaded and the help pointer is actionable, making this 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?

With 10 parameters, no annotations, and no output schema, the description is minimal. The action='help' escape hatch mitigates missing details, but the description alone doesn't explain behavior, prerequisites, or when to use this tool versus alternatives. It is barely 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?

Schema description coverage is 100%, so the schema already documents all parameters. The description's tip to use action='help' adds a meta-level way to get per-action rules, which is helpful but does not add meaning beyond the schema's built-in documentation.

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 identifies a specific resource ('Unbound host overrides') and a verb ('Manage'), making the tool's domain clear. It doesn't enumerate the specific actions, but the schema's action enum covers that. The resource name distinguishes it from sibling tools like alias, bgp, or dhcp.

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 the agent to call action='help' for each action's fields and rules, which is a concrete usage directive. It doesn't contrast with sibling tools, but the specific resource makes the intended context clear and no exclusions are needed.

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

fw_ruleC

Firewall filter rules, and the interface groups a rule can target so one rule covers several networks. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
logNo[update] Log packets matched by this rule
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
descrNo[set_group] descr
quickNo[update] Stop evaluating further rules on a match
actionYesOperation to run. 'help' lists fields.
confirmNoToken returned by the previous call, to confirm.
enabledNoTarget state, set explicitly rather than flipped.
gatewayNo[create, update] gateway
membersNo[set_group] Interface keys the group should contain, e.g. ['opt3', 'opt4']. This replaces the membership rather than adding to it.
protocolNo[create, list, update] protocolany
directionNo[create, update] directionin
interfaceNo[create, list, update] interfacelan
rule_uuidNo[delete, toggle, update] UUID of the rule to delete
ipprotocolNo[create, update] ipprotocolinet
source_netNo[create, update] source_netany
source_notNo[update] Invert the source match
descriptionNoFree-text note stored on the record.
rule_actionNo[create, list, update] rule_actionpass
source_portNo[create, update] source_portany
interfacenotNo[update] Invert the interface match
destination_netNo[create, update] destination_netany
destination_notNo[update] Invert the destination match
destination_portNo[create, update] destination_portany

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does not mention that changes can be staged, that apply/confirm may be required, that delete/toggle are destructive, or that set_group replaces membership rather than appending.

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 very concise and front-loaded with the domain. The pointer to action='help' earns its place, though the overall terseness leaves behavioral aspects unaddressed.

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

Completeness2/5

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

This is a complex tool with 24 parameters, 9 actions, no annotations, and no output schema. The description gives only a high-level domain and a help pointer, which is insufficient orientation for correct selection and invocation of all these operations.

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%, so the schema does the heavy lifting for parameter semantics. The description's mention of interface groups adds mild context for group-related parameters, but it does not add meaningful meaning beyond the schema.

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

Purpose3/5

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

The description identifies the resource domain clearly: firewall filter rules and interface groups. However, it lacks a specific verb or action statement, leaving the actual operations to be inferred from the schema's action enum.

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

Usage Guidelines2/5

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

The only usage guidance is to call action='help' for field-level details. There is no statement about when to use fw_rule versus sibling tools like nat_outbound or alias, and no exclusions or alternatives are given.

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

interface_deviceC

Create the devices interfaces are built on: 802.1Q VLANs and loopbacks. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
pcpNo[create_vlan] Priority code point
tagNo[create_vlan] VLAN id, 1 to 4094
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
deviceNo[delete_loopback] Device name, e.g. lo1. Given, the tool refuses to delete a device an interface is still assigned to
parentNo[create_vlan] Parent device, for example ax0
reasonNo[set_address] Recorded in the configuration history
addressNo[set_address] IPv4 or IPv6 address
confirmNoToken returned by the previous call, to confirm.
interfaceNo[set_address] Interface identifier, e.g. opt12, from the assignment list
descriptionNoFree-text note stored on the record.
subnet_bitsNo[set_address] Prefix length; 32 or 128 for a loopback. 0 is refused: it would claim the whole address space on the interface
planned_addressNo[create_loopback] An address you intend this loopback to carry. Not written here — OPNsense has no per-interface addressing API — but echoed back as the exact step to perform. Use set_interface_address to actually write one
planned_subnet_bitsNo[create_loopback] Prefix length for planned_address, normally 32 or 128

TDQS

C2.6/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 the burden of explaining side effects and operational behavior. It only says resources are created and directs users to action='help'; it does not disclose deletion behavior, staging versus applying changes, failure modes, or consequences of actions despite some hints existing in parameter descriptions.

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 compact and front-loads the core purpose in the first sentence. The second sentence provides a useful pointer to action='help' without cluttering the main description, though the phrasing 'devices interfaces are built on' is grammatically awkward.

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

Completeness2/5

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

This is a multi-action tool with 15 parameters and no output schema or annotations, so a complete description would need to at least outline the main action categories and their effects. Instead, it mentions only creation and defers to dynamic help, leaving significant context for the agent to discover on its own.

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%, and the individual parameter descriptions are rich, including refusal cases and action-specific context. The tool description itself adds little parameter meaning, but with full schema coverage, the baseline score of 3 is appropriate.

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

Purpose3/5

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

The description identifies a specific resource—VLANs and loopbacks—and a create action, which gives some clarity. However, the action enum includes set_address, delete, and list operations that the description never mentions, so it understates the tool's actual scope and could mislead an agent into thinking it only creates resources.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus sibling tools such as ipv6, routing, or fw_rule. The instruction to call action='help' is a fallback for field details, not a usage guideline that helps an agent choose this tool appropriately.

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

ipv6C

IPv6: NPTv6 prefix translation, virtual IPs, router advertisements, and planning or applying a ULA conversion. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo[create_vip, set_advert] One of: ipalias, carp, proxyarp, other (default ipalias)
uuidNoRecord to act on, identified by a list action.
vhidNo[create_vip] CARP virtual host id; required only for mode=carp
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
subnetNo[create_vip] Address, without the prefix length
confirmNoToken returned by the previous call, to confirm.
domainsNo[apply_ula] Subset of ['vip', 'npt', 'ra', 'unbound'], in that order
dry_runNo[apply_ula] Report what would run without doing it (default true)
enabledNoTarget state, set explicitly rather than flipped.
trackifNo[create_npt] Interface whose delegated prefix supplies the external side
interfaceNo[create_npt, create_vip] Interface the translation applies on, usually wan
gua_prefixNo[plan_ula] Current delegated prefix, for example 2001:db8:1::/64
source_netNo[create_npt] Internal prefix, for example fd00:...:2::/64
ula_prefixNo[plan_ula] Target ULA prefix of the same length
descriptionNoFree-text note stored on the record.
subnet_bitsNo[create_vip] Prefix length, e.g. 64
public_namesNo[plan_ula] Fully qualified names the outside world resolves; these keep their delegated address
valid_lifetimeNo[set_advert] valid_lifetime
destination_netNo[create_npt] External prefix; omit when using trackif
deprecate_prefixNo[set_advert] Advertise the prefix as deprecated
preferred_lifetimeNo[set_advert] Advertised preferred lifetime; 0 deprecates the prefix

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry the behavioral burden. It names the feature areas but does not mention that many actions mutate state, that some changes are staged until apply, that confirmation tokens may be required, or that delete/toggle/apply actions exist. The help pointer is useful but not a substitute for behavioral disclosure.

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?

Two sentences with no filler; the scope is front-loaded and the help pointer is useful. It is slightly too terse for such a complex multi-action tool, but as a concise overview it earns a 4.

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

Completeness2/5

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

This is a 22-parameter, 12-action tool with no output schema and no annotations. The description only gives a high-level feature list and defers to an action='help' call, so an agent still lacks context about which action to choose, what each returns, prerequisites, and staged-vs-applied behavior.

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%, and the schema already adds per-parameter context such as [create_npt], [create_vip], and defaults like dry_run defaulting to true. The description itself contributes no parameter meaning beyond directing users to the help action, so the baseline 3 applies.

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 identifies the domain and resources: NPTv6 prefix translation, virtual IPs, router advertisements, and ULA conversion. It is clear about the tool's scope but does not use a single specific verb or contrast it with sibling tools, so it falls short of a 5.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool instead of siblings such as routing, interface_device, or nat_outbound. The only usage note is to call action='help' for each action's fields and rules, which helps within the tool but does not establish selection criteria.

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

nat_outboundC

Outbound source NAT rules and how they are generated. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo[mode] When setting: one of automatic, hybrid
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
targetNo[create] Translation address; empty means the interface address
confirmNoToken returned by the previous call, to confirm.
enabledNoTarget state, set explicitly rather than flipped.
interfaceNo[create] Outgoing interface, usually wan
source_netNo[create] Source network or alias name to translate
action_modeNo[mode] get or set (default get)
descriptionNoFree-text note stored on the record.
static_portNo[create] Preserve the source port
destination_netNo[create] Destination to match (default any)

TDQS

C2.6/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 the full burden of disclosing behavior, but it does not mention staged changes, apply semantics, confirm tokens, or that actions mutate state. Saying rules are 'generated' hints at behavior but remains vague for a stateful multi-action 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 a single compact sentence with no filler and front-loads the resource name and the help directive. It earns its place, though its brevity contributes to the lack of behavioral context.

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

Completeness2/5

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

With 13 parameters, six actions, no annotations, and no output schema, a one-sentence description is insufficient for safe invocation. The schema covers parameter syntax, but the operational context—staging, apply behavior, confirm flow, and sibling differentiation—is missing.

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%, and parameter descriptions already include bracketed action contexts like [create] and [mode], so the schema does the heavy lifting. The description adds only the pointer to action='help' for per-action details, which is useful but minimal.

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

Purpose3/5

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

The description names a specific resource, 'Outbound source NAT rules,' and mentions how they are generated, which distinguishes it from general routing or firewall tools. However, it lacks an explicit operation verb; the actual actions only appear in the input schema enum.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool versus sibling tools such as fw_rule or routing. The only use instruction, 'Call action=help', explains how to explore fields but not when this tool should be selected.

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

routingA

Static routes and gateways. Note routes use enabled and gateways use disabled, so a toggle means the opposite thing on each. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo[create_gateway] Gateway name
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
actionYesOperation to run. 'help' lists fields.
confirmNoToken returned by the previous call, to confirm.
enabledNoTarget state, set explicitly rather than flipped.
gatewayNo[create_gateway, create_route] Next hop address
networkNo[create_route] Destination prefix, for example 172.20.2.0/24
interfaceNo[create_gateway] Interface identifier
ipprotocolNo[create_gateway] inet or inet6 (default inet)
descriptionNoFree-text note stored on the record.
far_gatewayNo[create_gateway] Next hop outside the interface subnet
monitor_disableNo[create_gateway] Turn off monitoring, usual for a point-to-point transit

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 carries the behavioral disclosure burden. It discloses a genuinely important quirk: routes use 'enabled' while gateways use 'disabled,' so toggling means the opposite thing on each. However, it does not warn that delete/toggle operations are mutating, that changes may be staged, or that confirmation tokens are needed, so the behavioral picture remains incomplete.

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, each earning its place: the first states scope, the second warns about a non-obvious toggling asymmetry, and the third tells the agent how to get action-specific rules. There is no filler or repetition.

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 complex: 13 parameters, 10 actions, and no output schema, so the description alone is light. The action='help' directive mitigates this by pointing to authoritative per-action rules, but the description does not cover overall workflows like list-then-confirm or whether changes apply immediately. It is adequate as a pointer but not fully self-sufficient.

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 100%, so the baseline is 3. The description adds crucial parameter semantics by explaining that 'enabled' vs 'disabled' has inverted meaning for routes vs gateways, which is not obvious from the schema's 'Target state, set explicitly rather than flipped.' It also directs the agent to action='help' for per-action field details.

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 identifies the resource domain as 'Static routes and gateways,' which clearly distinguishes it from dynamic routing siblings like bgp. It lacks an explicit verb like 'manage' or 'configure,' but the action enum in the schema supplies the operation vocabulary.

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 phrase 'Static routes and gateways' implies when this tool should be used, but it never names an alternative or states when not to use it. The instruction to call action='help' for each action's fields and rules is useful for learning the tool, but it is not guidance about selecting between sibling tools.

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

shaperB

Traffic shaper: pipes, queues, rules, and applying or auditing them. Call action='help' for each action's fields and rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidNoRecord to act on, identified by a list action.
applyNoApply now rather than leaving the change staged. The default differs by action; action='help' reports each one.
protoNo[create_rule, update_rule] proto
actionYesOperation to run. 'help' lists fields.
presetNo[apply_preset] presetbufferbloat_wan
weightNo[create_queue, update_queue] weight
confirmNoToken returned by the previous call, to confirm.
enabledNoTarget state, set explicitly rather than flipped.
sequenceNo[create_rule] Rule order; auto-assigned when omitted
bandwidthNo[create_pipe, update_pipe] bandwidth
directionNo[create_rule, update_rule] direction
fetch_allNo[list_pipes, list_queues, list_rules] When true, paginate until all rows are returned
interfaceNo[create_rule, list_rules, update_rule] interface
pipe_uuidNo[create_queue, update_queue] pipe_uuid
row_countNo[list_pipes, list_queues, list_rules] Search API page size (default 50, max 500)
schedulerNo[create_pipe, update_pipe] schedulerfq_codel
baseline_idNo[statistics] Optional baseline id from a prior shaper_statistics call for pkts/bytes delta comparison
descriptionNoFree-text note stored on the record.
snapshot_idNo[restore_snapshot] snapshot_id
target_uuidNo[create_rule, update_rule] target_uuid
upload_mbitNo[apply_preset] upload_mbit
download_mbitNo[apply_preset] download_mbit
include_auditNo[explain] When true, run audit first and weave findings into the narrative
wan_interfaceNo[apply_preset] wan_interfacewan
remove_orphansNo[restore_snapshot] Delete live objects whose UUID is absent from the snapshot
isp_upload_mbitNo[audit] Reference ISP upload rate in Mbit/s
bandwidth_metricNo[create_pipe, update_pipe] bandwidth_metricMbit
capture_snapshotNo[create_pipe, create_queue, create_rule, update_pipe, update_queue, update_rule] capture_snapshot
isp_download_mbitNo[audit] Reference ISP download rate in Mbit/s
wan_line_rate_mbitNo[audit] WAN physical line rate cap in Mbit/s
mutation_snapshot_idNo[create_pipe, create_queue, create_rule, update_pipe, update_queue, update_rule] mutation_snapshot_id

TDQS

B3.2/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 the full burden. It mentions applying and auditing, but does not disclose important behaviors like staged changes, snapshot/restore effects, confirm tokens, destructive operations, or the side effects of any of the many actions.

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 compact clauses with no filler: it states the domain and provides a concrete self-service mechanism for deeper details. Every sentence earns its place.

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

Completeness2/5

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

Given 31 parameters, 26 actions, no annotations, no output schema, and complex operations like snapshots and audits, this one-sentence definition is not complete. Pointing to action='help' mitigates the gap, but the description still leaves selection, behavioral, and side-effect context entirely undisclosed.

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%, so the schema itself documents all parameters, including action-name prefixes. The description adds no parameter meaning beyond pointing to the help action, which is useful but does not elevate it above the baseline.

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 identifies the tool as a traffic shaper operating on pipes, queues, and rules, and mentions applying/auditing. This is understandable and domain-specific, though it does not differentiate it from siblings beyond the domain label.

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 gives operational guidance by telling the agent to call action='help' for fields and rules, which is useful. However, it does not specify when to use this tool versus its siblings or when a particular action should be chosen.

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

systemA

Show system status information

ParametersJSON Schema
NameRequiredDescriptionDefault

No 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 carries full burden. 'Show' correctly indicates read-only behavior, but no additional traits (e.g., authentication needs) are disclosed. It's minimal but 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?

Single, clear sentence. No wasted words; front-loaded with 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?

For a zero-parameter, read-only tool, the description fully covers what the agent needs. Sibling tools are all more specific, so 'system status' is adequately contextualized.

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 0 parameters, and schema coverage is 100%. Per guidelines, no parameter info is needed, so the baseline of 4 applies.

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 verb 'Show' and the resource 'system status information', which is distinct from sibling tools like arp or dns. However, it lacks specificity about what constitutes system status (e.g., uptime, load), so it's not a 5.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. While it's implied for general status checks, explicit context or exclusions are missing.

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. 29 tool updatesv1.0.0
    • Addedalias
    • Removedaliases
    • Changedarp3 fields changed
      • removedInput schema / properties / ip / optional
        Removed value: -true
      • removedInput schema / properties / mac / optional
        Removed value: -true
      • removedInput schema / properties / search / optional
        Removed value: -true
    • Addedbgp
    • Addedconfig_backup
    • Changeddhcp33 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "description": "Operation to run. 'help' lists fields.",
        +  "enum": [
        +    "create_host",
        +    "create_range",
        +    "delete_host",
        +    "delete_lease",
        +    "delete_option",
        +    "delete_range",
        +    "leases",
        +    "list_dns",
        +    "list_hosts",
        +    "list_options",
        +    "list_ranges",
        +    "move_host",
        +    "set_dns",
        +    "set_router",
        +    "toggle_range",
        +    "update_range",
        +    "help"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / apply
        Added value: +{
        +  "description": "Apply now rather than leaving the change staged. The default differs by action; action='help' reports each one.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / client_id
        Added value: +{
        +  "description": "[create_host, move_host] Optional DHCP client identifier / DUID for IPv6 (e.g. '52:54:00:7e:9c:f4:00:ab:cd:01'). Accepts optional 'id:' prefix.",
        +  "type": "string"
        +}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Token returned by the previous call, to confirm.",
        +  "type": "string"
        +}
      • addedInput schema / properties / descr
        Added value: +{
        +  "description": "[create_host, list_hosts] Optional description",
        +  "type": "string"
        +}
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "Free-text note stored on the record.",
        +  "type": "string"
        +}
      • addedInput schema / properties / dns_server
        Added value: +{
        +  "description": "[set_dns] Single DNS server address",
        +  "type": "string"
        +}
      • addedInput schema / properties / dns_servers
        Added value: +{
        +  "description": "[set_dns] One or two DNS server addresses",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "[create_host, create_range, update_range] Optional domain for the host (e.g. 'lan')",
        +  "type": "string"
        +}
      • addedInput schema / properties / enabled
        Added value: +{
        +  "description": "Target state, set explicitly rather than flipped.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / end_addr
        Added value: +{
        +  "description": "[create_range, update_range] Last address",
        +  "type": "string"
        +}
      • addedInput schema / properties / family
        Added value: +{
        +  "description": "[set_dns] Address family to update: ipv4 or ipv6",
        +  "type": "string"
        +}
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "[set_router] Send the option even when the client did not ask",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / host
        Added value: +{
        +  "description": "[delete_host, move_host] Hostname, MAC, or reservation uuid to delete",
        +  "type": "string"
        +}
      • addedInput schema / properties / hostname
        Added value: +{
        +  "description": "[create_host, delete_lease] Hostname for the reservation (e.g. 'mydevice')",
        +  "type": "string"
        +}
      • addedInput schema / properties / interface
        Added value: +{
        +  "description": "[create_range, list_dns, set_dns, set_router, toggle_range] Interface key, e.g. opt3",
        +  "type": "string"
        +}
      • addedInput schema / properties / ip
        Added value: +{
        +  "description": "[delete_lease] IP address to delete",
        +  "type": "string"
        +}
      • addedInput schema / properties / ipv4
        Added value: +{
        +  "description": "[create_host, move_host] IPv4 address to assign (e.g. '172.20.8.50')",
        +  "type": "string"
        +}
      • addedInput schema / properties / ipv6
        Added value: +{
        +  "description": "[create_host, move_host] IPv6 suffix: integer (e.g. 50 → ::50) or '::abcd'",
        +  "type": [
        +    "integer",
        +    "string"
        +  ]
        +}
      • addedInput schema / properties / lease_time
        Added value: +{
        +  "description": "[create_range, update_range] Seconds, or a suffixed value like 2h",
        +  "type": "string"
        +}
      • addedInput schema / properties / mac
        Added value: +{
        +  "description": "[create_host, delete_lease] MAC address (e.g. 'aa:bb:cc:dd:ee:ff')",
        +  "type": "string"
        +}
      • addedInput schema / properties / missing_ipv6
        Added value: +{
        +  "description": "[list_hosts] When true, return only reservations with IPv4 but no ::N IPv6 suffix",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / new_hostname
        Added value: +{
        +  "description": "[move_host] New dnsmasq host reservation name (optional rename)",
        +  "type": "string"
        +}
      • addedInput schema / properties / router
        Added value: +{
        +  "description": "[set_router] Gateway address to advertise",
        +  "type": "string"
        +}
      • changedInput schema / properties / search / description
        Previous value: -"Search by hostname/IP/MAC"New value: +"[leases, list_hosts] Filter leases by hostname, IP, or MAC address. Omit for full table."
      • removedInput schema / properties / search / optional
        Removed value: -true
      • addedInput schema / properties / slot
        Added value: +{
        +  "description": "[set_dns] Optional slot index (1 or 2) for single-address updates",
        +  "type": "integer"
        +}
      • addedInput schema / properties / start_addr
        Added value: +{
        +  "description": "[create_range, update_range] First address",
        +  "type": "string"
        +}
      • addedInput schema / properties / subnet
        Added value: +{
        +  "description": "[list_dns, set_dns, toggle_range] Subnet in CIDR notation (e.g. 172.20.2.0/24)",
        +  "type": "string"
        +}
      • addedInput schema / properties / subnet_mask
        Added value: +{
        +  "description": "[create_range, update_range] subnet_mask",
        +  "type": "string"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "description": "[set_router] Tag uuid to scope to instead of an interface",
        +  "type": "string"
        +}
      • addedInput schema / properties / uuid
        Added value: +{
        +  "description": "Record to act on, identified by a list action.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "action"
        +]
    • Removeddhcp_lease_delete
    • Addeddiagnostics
    • Removeddns
    • Addeddns_override
    • Addedfw_rule
    • Removedfw_rules
    • Removedgateway_status
    • Removedget_logs
    • Addedinterface_device
    • Removedinterface_list
    • Addedipv6
    • Removedlldp
    • Removedmkdns
    • Removedmkfw_rule
    • Addednat_outbound
    • Removedpacket_capture
    • Removedrmdns
    • Removedrmfw_rule
    • Addedrouting
    • Removedset_fw_rule
    • Addedshaper
    • Removedssh_fw_rule
    • Removedtoggle_fw_rule
  2. 19 tool updatesv1.8.0
    • First observedaliases
    • First observedarp
    • First observeddhcp
    • First observeddhcp_lease_delete
    • First observeddns
    • First observedfw_rules
    • First observedgateway_status
    • First observedget_logs
    • First observedinterface_list
    • First observedlldp
    • First observedmkdns
    • First observedmkfw_rule
    • First observedpacket_capture
    • First observedrmdns
    • First observedrmfw_rule
    • First observedset_fw_rule
    • First observedssh_fw_rule
    • First observedsystem
    • First observedtoggle_fw_rule

TDQS

B3.2/5.0

Scored across 14 tools

Disambiguation4/5

Each tool generally maps to a distinct OPNsense module, so firewall rules, NAT, aliases, routing, DHCP, and other concerns are clearly separated. Minor overlap exists among system, diagnostics, and arp for read-only status information, and ipv6 is broad, but the descriptions provide enough boundaries.

Naming Consistency4/5

Tool names follow a consistent lowercase domain-module convention, with snake_case for compound names like config_backup, dns_override, and nat_outbound. They do not use a verb-noun pattern, but the naming is predictable and uniform across the set.

Tool Count5/5

Fourteen tools is well within the ideal range, and each tool represents a coherent functional area of an OPNsense firewall. There are no redundant or filler tools that make the surface feel bloated.

Completeness3/5

The set covers core firewall workflows: filtering, NAT, aliases, routing, DHCP, DNS overrides, traffic shaping, diagnostics, and backups. However, major OPNsense areas such as VPN configuration, certificate management, interface assignment, and general Unbound settings are absent, which could create dead ends for common tasks.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server implementation for managing OPNsense firewalls. This server allows Claude and other MCP-compatible clients to interact with all features exposed by the OPNsense API.
    1
    AGPL 3.0
  • A
    license
    C
    quality
    C
    maintenance
    A server that enables managing OPNSense firewalls through natural language interactions with Claude Desktop, supporting VLAN management, firewall rules configuration, and network interface queries.
    64
    221 npm
    82
    MIT
  • A
    license
    Not graded
    quality
    F
    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.
    255 npm
    82
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Slim OPNsense MCP Server — 62 tools for managing firewall infrastructure via the OPNsense REST API. Covers DNS/Unbound, Firewall rules, Diagnostics, Interfaces, DHCP (ISC + Kea), System/Backups, ACME/Let's Encrypt, and Firmware. No SSH, no shell, API-only with 3 runtime dependencies. AGPL-3.0 + Commercial dual-licensed.
    100
    54 npm
    2
    AGPL 3.0