Skip to main content
Glama
ry-ops

fortigate-mcp-server

by ry-ops

fortigate-mcp-server lets Claude (or any MCP client) run a Fortinet FortiGate through the FortiOS REST API: firewall policies, NAT and port forwards, DNS and DHCP, application control, inspection, live traffic and logs. It was built and tested against a FortiGate-VM on the free permanent evaluation license fronting a k3s cluster on Proxmox, so it knows that license's limits and FortiOS 7.6's quirks, and it can connect the firewall to the cluster and to the hypervisor around it.

What makes it different

  • Built for the free FortiGate-VM. The permanent evaluation license allows 3 policies, 3 interfaces and 3 static routes, has no FortiGuard services and runs in low-encryption mode. get_license_limits shows what is used; port forwards attach to existing policies instead of needing new ones; service groups fold several ports into one policy; and this README says what does not work there (deep inspection) before you lose an afternoon to it.

  • It knows FortiOS 7.6's traps. VIPs cannot share a policy with ordinary addresses, app-control profiles start with a catch-all pass rule, DHCP reservations need action=reserved, vci-match silently ignores normal clients, and local DNS zones cannot hold wildcards. The tools check for these up front and say so plainly. See FortiOS 7.6 field notes.

  • It speaks your infrastructure. Optional integrations read your k3s cluster (Ingress hostnames become FortiGate DNS records; node IPs keep the address objects your policies use in sync) and your Proxmox VE host (every IP and MAC in leases, sessions, FortiView and logs gets the name of the VM behind it).

  • Safe by default. A read-only switch refuses every write before it leaves your machine; sync tools dry-run first; license activation needs confirm=true; a failed port forward rolls itself back; credentials come from the environment (or your keychain), never from tool arguments.

  • Errors that explain. FortiOS hides the reason for a failure in the response body (cli_error). Every error message includes it, so "HTTP 500" becomes "Addresses/groups cannot be mixed with virtual IPs".

  • Tested against a real FortiGate. Every tool was run against FortiOS 7.6.7 on a FortiGate-VM, on top of a unit-test suite that runs in CI on Python 3.10 to 3.13.

Related MCP server: FortiOS 7.6.x MCP Server

Quick start

You need Python 3.10+ with uv, a FortiGate running FortiOS 7.6 (appliance or VM, licensed; see zero to firewall to deploy a free one), and a REST API token.

1. Create an API token on the FortiGate

In the GUI: System > Administrators > Create New > REST API Admin. Pick an administrator profile (super_admin to allow changes, or a read-only profile so FortiOS also refuses writes), set Trusted Hosts to the machine that runs this server, and save. The key is shown once.

Or on the CLI (FortiOS asks for your admin password before it creates an admin):

config system api-user
    edit mcp-api
        set accprofile super_admin
        set vdom root
        config trusthost
            edit 1
                set ipv4-trusthost 192.168.1.50 255.255.255.255
            next
        end
    next
end
execute api-user generate-key mcp-api

2. Add it to Claude Code

claude mcp add fortigate --scope user \
  -e FORTIGATE_HOST=192.168.1.99 \
  -e FORTIGATE_API_TOKEN=your-token \
  -e FORTIGATE_READ_ONLY=true \
  -- uvx --from git+https://github.com/ry-ops/fortigate-mcp-server@v0.4.1 fortigate-mcp-server

On macOS you can keep the token in your Keychain instead of in Claude's config:

security add-generic-password -a mcp-api -s fortigate-api-token -w   # paste the token when asked

claude mcp add fortigate --scope user -e FORTIGATE_HOST=192.168.1.99 -e FORTIGATE_READ_ONLY=true -- \
  sh -c 'FORTIGATE_API_TOKEN="$(security find-generic-password -a mcp-api -s fortigate-api-token -w)" exec uvx --from git+https://github.com/ry-ops/fortigate-mcp-server@v0.4.1 fortigate-mcp-server'
{
  "mcpServers": {
    "fortigate": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/ry-ops/fortigate-mcp-server@v0.4.1", "fortigate-mcp-server"],
      "env": {
        "FORTIGATE_HOST": "192.168.1.99",
        "FORTIGATE_API_TOKEN": "your-token",
        "FORTIGATE_READ_ONLY": "true"
      }
    }
  }
}
git clone https://github.com/ry-ops/fortigate-mcp-server && cd fortigate-mcp-server
uv sync
cp .env.example .env   # fill in FORTIGATE_HOST and FORTIGATE_API_TOKEN
uv run fortigate-mcp-server

3. Ask

Start read-only and look around:

  • "What's the license status, and how many policies can I still add?"

  • "Show the firewall policies and how often each one is hit."

  • "Who is using the most bandwidth right now?"

  • "Which HTTPS sites did 192.168.150.11 visit in the last few minutes?"

  • "Back up the running config." (allowed in read-only mode; it writes a local file)

When you want Claude to make changes, set FORTIGATE_READ_ONLY=false.

Zero to firewall

With proxmox-mcp-server (v2.3.0+) alongside, Claude can take an empty Proxmox host to a working firewall:

  1. Deploy. Download Fortinet's FortiGate-VM KVM image (the .qcow2 inside the .zip from the Fortinet support site) and serve it over HTTP. deploy_fortigate_vm (proxmox-mcp-server) imports it, creates the VM with port1 (WAN) and port2 (LAN) on the bridges and VLANs you choose, and returns each port's MAC.

  2. License. On the VM console, log in as admin with an empty password and set a new one (12+ characters with upper, lower, number and symbol). port1 comes up as a DHCP client. An unlicensed VM refuses most API calls and its GUI goes blank after login, so run activate_vm_eval_license with session auth (FORTIGATE_USERNAME/FORTIGATE_PASSWORD) and your FortiCloud account in FORTICLOUD_ACCOUNT/FORTICLOUD_PASSWORD. The FortiGate reboots with the free permanent license. Then create the API token (step 1 of the quick start) and switch to it.

  3. Hide the setup popup. The GUI's "FortiGate Setup" popup waits on a FortiConverter eligibility check that evaluation VMs never pass, so it comes back at every login. forticonverter_setup_prompt with hide=true turns it off.

  4. Build the lab network. Give port2 an address, then set_dns_server, create_dns_zone, update_dhcp_server and add_dhcp_reservation for DNS and DHCP, and create_firewall_policy for egress and ingress.

  5. Name the apps. k8s_sync_ingress_dns turns every Ingress hostname in your cluster into FortiGate DNS records.

Built for the free license

The FortiGate-VM permanent evaluation license (FortiOS 7.2.1+) is free with a FortiCloud account and never expires. Its limits, and how this server deals with them:

Limit

What the tools do

3 firewall policies

get_license_limits counts them. create_port_forward attaches to an existing policy (attach_to_policy) and says so when no slot is free. Service groups let one policy cover several ports.

3 interfaces, 3 static routes

Counted by get_license_limits.

1 vCPU, 2 GB RAM

deploy_fortigate_vm (proxmox-mcp-server) defaults to exactly that and warns above it.

No FortiGuard services (AV, IPS, web filter) or FortiCare

App control works with the signatures bundled in FortiOS. Category blocking needs a subscription.

Low-encryption mode

Certificate inspection works: the app-ctrl log names every HTTPS site without decrypting anything. Deep inspection does not: the factory CA is 512-bit, and even with your own 2048-bit CA, sites with RSA keys are re-signed with 512-bit keys that curl, Go and containerd reject (container image pulls fail). list_certificates flags those weak keys.

Integrations

Both are optional. They switch on when their variables are set, and their tools only appear then.

k3s / Kubernetes (K8S_KUBECONFIG, optional K8S_CONTEXT). The cluster is only read; kubeconfigs with certificate, token or basic users work (not exec plugins).

  • k8s_cluster_overview: nodes, LoadBalancer services (such as Traefik on k3s ServiceLB) and every Ingress or Traefik IngressRoute hostname.

  • k8s_sync_ingress_dns: FortiOS local DNS zones cannot hold a wildcard like *.lab, so this creates one A record per ingress IP for each hostname inside the zone. Wildcard, apex and out-of-zone hosts are skipped and listed. prune=true removes stale records that point at ingress IPs.

  • k8s_sync_node_addresses: keeps the address object your policies use (default K3S-NODES) matched to the node IPs: a range when they are contiguous, otherwise one /32 address per node in an address group.

Both sync tools return their plan with dry_run=true (the default) and change the FortiGate only with dry_run=false.

Proxmox VE (PROXMOX_HOST, PROXMOX_USER, PROXMOX_TOKEN_NAME, PROXMOX_TOKEN_VALUE; the same names as proxmox-mcp-server). Only GET requests are made, so create the token with privilege separation and just the PVEAuditor role.

  • identify_clients: every DHCP lease and ARP entry on the FortiGate, matched by MAC to the Proxmox VM or container behind it (VMID, name, node, bridge, VLAN tag).

  • resolve_vms=true on get_logs, list_sessions, get_top_traffic and list_dhcp_leases adds labels such as srcip_vm: "112 k3s-worker2 (qemu on pve01)".

Tools

74 tools in 12 areas. Expand an area for one line per tool; your MCP client shows each tool's full description and input schema.

Tool

What it does

get_system_status

FortiGate model, serial, firmware version/build, hostname and uptime.

get_license_status

License and FortiGuard contract status.

get_license_limits

How much of the license's object limits is used.

get_resource_usage

Current CPU, memory, disk and session usage.

list_interfaces

List interface configuration (IP, mode, role, alias, allowaccess).

get_interface

Get one interface's full configuration.

get_interface_status

Live interface state: link, speed, IP and traffic counters.

update_interface

Update an interface.

list_admin_sessions

Administrators currently logged in (GUI, SSH, API) and where from.

backup_config

Back up the full running configuration (FortiOS CLI text) to a local file and return its path and size.

forticonverter_setup_prompt

Show or hide the 'Migrate Config with FortiConverter' step of the GUI's FortiGate Setup popup.

activate_vm_eval_license

Activate the free permanent evaluation license on an unlicensed FortiGate-VM by logging in to FortiCloud from the FortiGate (the same call the GUI makes).

Tool

What it does

list_firewall_policies

List IPv4 firewall policies in evaluation order.

get_firewall_policy

Get one firewall policy.

create_firewall_policy

Create a firewall policy.

update_firewall_policy

Update a firewall policy.

delete_firewall_policy

Delete a firewall policy.

move_firewall_policy

Move a policy before or after another one (policies match top-down).

get_policy_stats

Hit counts, bytes, packets and last-used time per policy.

list_sessions

Current firewall sessions, optionally filtered.

list_addresses

List firewall address objects.

get_address

Get one firewall address object.

create_address

Create a firewall address: a subnet/host, an IP range, or an FQDN.

update_address

Update a firewall address object.

delete_address

Delete a firewall address (fails while a policy or group still uses it).

list_address_groups

List firewall address groups and their members.

create_address_group

Create an address group.

update_address_group

Update an address group. members replaces the whole member list.

delete_address_group

Delete an address group (fails while a policy still uses it).

list_services

List custom firewall services (port definitions).

create_service

Create a custom TCP/UDP service.

list_service_groups

List service groups and their members.

create_service_group

Create a service group, e.g.

update_service_group

Update a service group. members replaces the whole member list.

delete_service_group

Delete a service group (fails while a policy still uses it).

delete_service

Delete a custom service (fails while a policy still uses it).

Tool

What it does

list_port_forwards

List virtual IPs (port forwards / static NAT) and the policies that use each one.

create_port_forward

Create a port forward (VIP): traffic arriving on extintf at extip:extport goes to mappedip:mappedport.

delete_port_forward

Delete a VIP.

Tool

What it does

search_applications

Search application-control signatures by name (contains, case-insensitive) and/or category, e.g. query=YouTube or category=P2P.

list_app_categories

Application-control categories (id and name), e.g.

list_app_control_profiles

App-control profiles with their rules, showing application and category names instead of ids.

add_app_control_rule

Add a rule to an app-control profile matching applications and/or categories by name (or id).

delete_app_control_rule

Remove a rule from an app-control profile by its id (see list_app_control_profiles).

Tool

What it does

list_ssl_ssh_profiles

List SSL/SSH inspection profiles with the CA each one re-signs with.

update_ssl_ssh_profile

Update an SSL/SSH inspection profile, e.g. the CA used to re-sign certificates during deep inspection.

list_certificates

List local and CA certificates with key type and size, validity and usage flags.

download_certificate

Download a certificate's PEM (public part only), e.g. the deep-inspection CA Fortinet_CA_SSL so clients can be told to trust it.

Tool

What it does

get_top_traffic

Live FortiView summary of the sessions passing through right now, grouped by source, destination, application, country, interface, policy or protocol.

get_arp_table

IPv4 ARP table: which MAC answers for which IP on each interface.

Tool

What it does

get_logs

Read FortiGate logs, newest first.

Tool

What it does

get_routing_table

Active IPv4 routing table (connected, static, DHCP-learned and dynamic routes).

list_static_routes

List configured static routes.

create_static_route

Add a static route.

delete_static_route

Delete a static route by its sequence number (seq-num from list_static_routes).

Tool

What it does

get_dns_settings

System DNS settings: upstream resolvers the FortiGate itself uses and forwards to.

list_dns_servers

Interfaces where the FortiGate answers DNS queries, and in which mode.

set_dns_server

Serve DNS on an interface.

delete_dns_server

Stop serving DNS on an interface.

list_dns_zones

List local DNS zones (dns-database) with their records.

create_dns_zone

Create a local DNS zone. view=shadow serves internal clients.

delete_dns_zone

Delete a local DNS zone and all its records.

add_dns_record

Add a record to a local DNS zone.

delete_dns_record

Delete a record from a local DNS zone by its id (see list_dns_zones).

list_dhcp_servers

List DHCP servers with their ranges, options and reservations.

list_dhcp_leases

Current DHCP leases handed out by the FortiGate.

update_dhcp_server

Update a DHCP server.

add_dhcp_reservation

Reserve an IP for a MAC address on a DHCP server (the IP may sit outside the pool).

delete_dhcp_reservation

Remove a DHCP reservation by its id (see list_dhcp_servers).

Tool

What it does

k8s_cluster_overview

Read the Kubernetes cluster from K8S_KUBECONFIG: nodes with IPs and readiness, LoadBalancer services with their IPs (e.g.

k8s_sync_ingress_dns

Create FortiGate DNS records for the cluster's Ingress hostnames that fall inside a local zone (e.g. whoami.lab in zone 'lab'), pointing at the IPs the ingress is served on.

k8s_sync_node_addresses

Keep a FortiGate address object in step with the cluster's node IPs so policies follow the cluster.

Tool

What it does

identify_clients

Every client the FortiGate knows (DHCP leases and ARP entries) matched by MAC address to the Proxmox VM or container that owns it: VMID, name, node, status, bridge and VLAN tag.

Tool

What it does

fortigate_api

Call any FortiOS REST endpoint directly. path must start with /api/v2/ (cmdb/... for configuration, monitor/... for live state).

Tools take friendly arguments and build the FortiOS body for you: CIDR (10.0.0.0/24) instead of ip mask, plain lists (["port1"]) instead of [{"name": "port1"}], and booleans instead of enable/disable. Create and update tools also accept extra, merged into the request body as-is, for attributes a tool does not model. Anything without a dedicated tool is reachable through fortigate_api.

Safety model

Guard

What it does

FORTIGATE_READ_ONLY=true

The client refuses every POST, PUT and DELETE before it reaches the FortiGate. The only exception is backup_config, whose POST only reads. Pair it with a read-only admin profile so FortiOS enforces the same thing.

Dry runs

k8s_sync_ingress_dns and k8s_sync_node_addresses show their plan unless dry_run=false.

Confirmation

activate_vm_eval_license reboots the FortiGate, so it requires confirm=true, and does nothing on a licensed VM.

Checks before writes

create_port_forward checks the target policy's interface and destinations before creating the VIP; wildcard DNS records and edits to read-only built-in profiles are refused up front.

Rollback

A VIP that its policy refuses is deleted again, so nothing is left half-done.

Secrets

API tokens and the FortiCloud login come from environment variables (or a keychain, see the quick start), never from tool arguments, so they do not end up in chat transcripts.

FortiOS 7.6 field notes

Things this server handles because they bit us on a real FortiGate-VM:

  • 7.6 dropped /logincheck. Session login is a JSON POST /api/v2/authentication, and the CSRF cookie is named ccsrf_token_<port>_<hash>. The client does both and logs in again once if the session times out.

  • VIPs cannot share a policy's destinations with ordinary addresses ("Addresses/groups cannot be mixed with virtual IPs").

  • App-control profiles start with a catch-all pass rule, so rules appended after it never match. New rules go to the top.

  • DHCP reservations need action=reserved. With the default assign the ip field does not exist.

  • New DHCP servers can default to vci-match for FortiSwitch/FortiExtender vendor classes, which silently ignores ordinary clients. update_dhcp_server takes vci_match=false.

  • Local DNS zones cannot hold * records. add_dns_record refuses them; k8s_sync_ingress_dns writes one record per name instead.

  • An SSL inspection profile does nothing on its own in flow mode. Traffic is only inspected once a security profile (e.g. application control default) is attached; policy tools warn when that is missing.

  • Endpoints moved in 7.6. FortiView is monitor/fortiview/realtime-statistics (the old statistics is gone), sessions are monitor/firewall/sessions, and config backups are a POST.

  • The setup popup on evaluation VMs never completes its FortiConverter step. The undocumented POST /api/v2/monitor/forticonverter/show-in-startup/set with {"hide": true} hides it (forticonverter_setup_prompt).

  • Unlicensed VMs answer most calls with 401, and the GUI goes blank after login, so activate the license through the API (activate_vm_eval_license).

Configuration

Variable

Default

FORTIGATE_HOST

(required)

Hostname or IP

FORTIGATE_PORT

443

HTTPS admin port

FORTIGATE_API_TOKEN

REST API admin token (recommended)

FORTIGATE_USERNAME / FORTIGATE_PASSWORD

Session login, used when no token is set (needed on an unlicensed VM)

FORTIGATE_VDOM

root

VDOM for every call (tools also take vdom)

FORTIGATE_VERIFY_SSL

false

Verify the TLS certificate

FORTIGATE_READ_ONLY

false

Refuse every POST/PUT/DELETE before it reaches the FortiGate

FORTIGATE_TIMEOUT

30

Request timeout in seconds

K8S_KUBECONFIG / K8S_CONTEXT

Enables the Kubernetes tools

PROXMOX_HOST, PROXMOX_USER, PROXMOX_TOKEN_NAME, PROXMOX_TOKEN_VALUE, PROXMOX_PORT, PROXMOX_VERIFY_SSL

Enables the Proxmox tools

FORTICLOUD_ACCOUNT / FORTICLOUD_PASSWORD

Only for activate_vm_eval_license (main FortiCloud account, 2FA off)

Variables can also go in a .env file next to the server; see .env.example.

Compatibility

Tested

Expected to work

FortiOS

7.6.7 (build 3704), FortiGate-VM on KVM/Proxmox, permanent evaluation license

Other 7.6 builds and licensed FortiGate-VMs or appliances. 7.4 and older have not been tested; a few endpoints differ (see the field notes).

Python

3.10, 3.11, 3.12, 3.13 (CI)

MCP clients

Claude Code

Claude Desktop and other stdio MCP clients

Integrations

k3s v1.36 with Traefik; Proxmox VE 9.2

Other Kubernetes distributions (standard Ingress); Proxmox VE 8.x

Releases and versioning

Versions follow Semantic Versioning. Every release is tagged and listed on the releases page, and CHANGELOG.md records what changed. Pin a release with git+https://github.com/ry-ops/fortigate-mcp-server@v0.4.1; drop the @v… to track main. The version is in pyproject.toml and fortigate_mcp.__version__.

Development

uv sync
uv run pytest
uv run ruff check .
python3 scripts/gen_tool_catalog.py        # refresh the tool catalog above
python3 scripts/build_demo_svg.py          # rebuild docs/demo.svg

CI runs ruff, the tests on Python 3.10 to 3.13, and a check that the tool catalog matches the code. Each tool module (fortigate_mcp/tools/*.py) has a TOOLS list and a handle() function; server.py registers them, and the Kubernetes and Proxmox modules only when configured.

Disclaimer

This is an independent project, not affiliated with or endorsed by Fortinet. Fortinet, FortiGate, FortiOS, FortiGuard, FortiCare and FortiCloud are trademarks of Fortinet, Inc.

License

MIT


Available Tools

70 tools
activate_vm_eval_licenseA

Activate the free permanent evaluation license on an unlicensed FortiGate-VM by logging in to FortiCloud from the FortiGate (the same call the GUI makes). The FortiCloud account comes from the FORTICLOUD_ACCOUNT and FORTICLOUD_PASSWORD environment variables, never from tool arguments. The FortiGate reboots to apply it. Unlicensed VMs refuse most API calls, so use session auth (FORTIGATE_USERNAME/PASSWORD) on a fresh VM. FortiCare error 10 means wrong credentials, an IAM sub-user, or 2FA on the account.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
confirmYesMust be true: the FortiGate reboots
is_governmentNoGovernment account (default false)

TDQS

A4.5/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 well: it discloses the reboot side effect, that credentials come from environment variables rather than arguments, the auth mode required, and the meaning of FortiCare error 10. These are exactly the operational facts an agent needs before invoking a mutation.

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 action and mechanism, then prerequisites and error semantics. Every sentence earns its place, though the error-10 sentence is somewhat tangential to selecting and invoking the tool.

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 no-annotation, no-output-schema mutation tool, the description covers the critical behaviors: side effect, auth requirements, credential sourcing, and a common failure mode. It stops short of describing the response or idempotency, which are minor 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?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying that FortiCloud credentials are sourced from env vars and never from arguments, and it reinforces that confirm triggers a reboot, which the schema already notes.

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 ('Activate the free permanent evaluation license on an unlicensed FortiGate-VM') and explains the mechanism (FortiCloud login, same call the GUI makes). It is clearly distinguishable from siblings like get_license_status or get_license_limits.

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 clear conditions: use on an unlicensed/fresh VM, and use session auth because unlicensed VMs refuse most API calls. It does not explicitly name sibling alternatives or state when NOT to use it, but the preconditions are concrete enough to route the agent correctly.

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

add_app_control_ruleA

Add a rule to an app-control profile matching applications and/or categories by name (or id). Rules are checked top-down and the built-in profiles start with a catch-all pass rule, so new rules are inserted at the top by default (position=bottom to append). Only affects policies whose application_list is this profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
logNoLog matches (default true)
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
actionNoblock, pass, monitor (default) or reset
profileYesProfile name, e.g. default
positionNotop (default) or bottom
categoriesNoCategory names or ids, e.g. [P2P, Proxy]
applicationsNoApplication names or ids, e.g. [YouTube, BitTorrent]

TDQS

A4.1/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 well: it discloses evaluation order (top-down), the built-in catch-all pass rule, the default top insertion and how to override it, and the blast radius (only policies whose application_list is this profile). It omits persistence/auth requirements and any return-value expectations, but the behavioral core is unusually rich.

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 tight sentences with no filler, and the default-position behavior is front-loaded alongside the scope constraint. Density is high but each clause 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?

For a mutation tool with no annotations and no output schema, the description covers evaluation semantics, insertion behavior, and effect scope well enough to call it correctly. Minor gaps remain around permissions and result format, but nothing critical 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?

Schema coverage is already 100%, so the baseline is 3, but the description adds genuine meaning: it explains why position defaults to top (rules evaluate top-down above the catch-all pass rule) and clarifies that applications/categories accept names or ids. That is more than the schema's terse field 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?

States a specific verb (add) and resource (a rule to an app-control profile) with the matching criteria (applications and/or categories by name or id). It is immediately distinguishable from the delete_app_control_rule sibling without opening 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 Guidelines3/5

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

The description explains rule behavior (top-down checking, insertion at top by default, position=bottom to append) which implies how to use it, but never states when to reach for this tool versus alternatives like delete_app_control_rule or list_app_control_profiles. Usage is inferable rather than explicit.

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

add_dhcp_reservationA

Reserve an IP for a MAC address on a DHCP server (the IP may sit outside the pool).

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesIP to reserve
macYesClient MAC address
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
server_idYesDHCP server id
descriptionNoDescription

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 full behavioral burden. It does disclose one real trait beyond the schema: the reserved IP may fall outside the DHCP pool. However, it omits permission requirements, idempotency/duplicate handling, and what a successful call returns, which matters 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.

Conciseness5/5

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

A single front-loaded sentence that states the action first and appends one clarifying constraint in parentheses. No filler or redundant restatement of the tool name.

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 mutation tool with no annotations and no output schema, the description covers the core action and one nuance but leaves failure modes, permissions, and duplicate handling unaddressed. Given the fully documented parameters, this 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 all five parameters (ip, mac, vdom, server_id, description) are already documented in the schema. The description only restates mac/ip/server implicitly and adds no format, default, or constraint detail beyond what the schema provides, so the baseline 3 applies.

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 gives a specific verb (Reserve) plus resource (IP for a MAC address on a DHCP server), and the parenthetical clarifies the scope of what can be reserved. It is immediately distinguishable from the sibling delete_dhcp_reservation and from list_dhcp_servers/list_dhcp_leases.

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?

Usage is implied by the name and description (create a fixed DHCP reservation), but there is no explicit statement of when to prefer this over alternatives, no prerequisites, and no note about behavior when a reservation for the MAC/IP already exists. The parenthetical about the IP sitting outside the pool is a useful scope hint but not usage routing.

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

add_dns_recordB

Add a record to a local DNS zone. Wildcard (*) hostnames are rejected by FortiOS.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNo
ttlNo
ipv6No
typeNoA, AAAA, CNAME, MX, NS or PTR (default A)
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
zoneYesZone object name
hostnameYes
canonical_nameNoTarget for CNAME records

TDQS

B3/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 does disclose one real behavioral constraint beyond the schema ('Wildcard (*) hostnames are rejected by FortiOS'), which is useful. However, for a mutation tool it omits permissions, whether the zone must pre-exist, reversibility, and error 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?

Two short sentences with zero waste, and the core purpose is front-loaded ahead of the constraint. 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 mutation tool with 8 parameters, no annotations, no output schema, and 50% schema coverage, the description is far too thin. It should at minimum clarify prerequisites, parameter semantics, and expected effects of the write.

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 only 50%, so the description must compensate for undocumented parameters (ip, ttl, ipv6, hostname) — and it does not. It adds no parameter meaning at all, leaving half the parameters with no explanation in either the schema or the description.

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 verb+resource: 'Add a record to a local DNS zone.' This is clear and distinct from sibling DNS tools like create_dns_zone, delete_dns_record, or list_dns_zones. It lacks explicit sibling differentiation, 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?

No guidance on when to use this versus alternatives, no prerequisites (e.g. whether the zone must already exist via create_dns_zone), and no mention of related operations like delete_dns_record. The only constraint given is a data-validation rule, not usage context.

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

backup_configA

Back up the full running configuration (FortiOS CLI text) to a local file and return its path and size. Allowed in read-only mode. Configs are hundreds of KB, so the text itself is not returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
output_pathNoFile to write (default ./fortigate-<hostname>-<timestamp>.conf)

TDQS

A4/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 discloses key behaviors: writes to a local file, returns path and size, does not return the config text itself, and is allowed in read-only mode. It omits edge cases like file overwrite behavior or failure handling, but covers the essential behavioral traits well.

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 tightly written sentences, front-loaded with the core action and output, followed by permission context and the rationale for not returning text. Every sentence earns its place with 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?

For a simple two-parameter tool with no output schema, the description explains the return values (path and size) and the key constraint that the config text is not returned. Minor gaps such as overwrite behavior or error cases exist, but overall it provides enough context 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.

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 both optional parameters. The description adds no parameter-specific syntax or format details beyond the obvious 'local file' reference, matching the baseline for high schema coverage.

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 ('Back up') and resource ('full running configuration'), and clarifies the output is a local file path and size rather than config text. This clearly distinguishes it from all read/list/delete siblings.

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 implies usage through its purpose and notes 'Allowed in read-only mode', but does not explicitly say when to use it versus alternatives or offer exclusions. No alternative backup tool exists among siblings, so implied usage is sufficient, but explicit guidance is absent.

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

create_addressC

Create a firewall address: a subnet/host, an IP range, or an FQDN.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqdnNoFQDN (instead of subnet or range)
nameYesAddress name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
end_ipNoRange end
subnetNoSubnet in CIDR (10.0.0.0/24) or 'ip mask' form; a host is /32
commentNoComment
start_ipNoRange start (use with end_ip instead of subnet)

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 behavioral burden, yet it says nothing about write semantics, permissions, duplicate-name behavior, or what the VDOM default means. For a mutation tool with zero annotation coverage, 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.

Conciseness4/5

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

A single front-loaded sentence with no filler or redundancy. It is efficient, though its brevity is partly the same under-specification reflected elsewhere.

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 create tool with eight parameters, a nested `extra` object, no annotations, and no output schema, the description omits the response shape, error/duplicate behavior, and any mention of the passthrough `extra` attribute. It covers the resource shape but leaves the agent without enough to call it confidently.

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 eight parameters, including the subnet/FQDN/range distinction. The description's enumeration of the three address forms largely restates the schema, 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?

States a specific verb and resource ("Create a firewall address") and enumerates the three supported forms (subnet/host, IP range, FQDN), so an agent can distinguish it from siblings like create_address_group. It does not explicitly name the alternative tools, but the resource itself is unambiguous.

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 when-to-use context, prerequisites, or exclusions are given. The address-form enumeration implies which parameter set applies, but nothing tells the agent when to choose this tool over create_address_group or update_address.

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

create_address_groupC

Create an address group.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGroup name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
commentNoComment
membersYesMember address names

TDQS

C2.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 carries the full behavioral burden, yet it discloses nothing beyond the name. It does not state whether the operation is idempotent, what happens on duplicate names, which permissions are needed, or how the VDOM parameter affects behavior.

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

Conciseness3/5

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

One short sentence with no filler, which is appropriately front-loaded, but the extreme brevity reflects under-specification rather than disciplined conciseness.

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 mutation tool with no annotations and no output schema, the description is inadequate: it omits required-parameter expectations, VDOM/default behavior, and the arbitrary 'extra' attribute merging. The schema covers parameters, but nothing covers the tool's behavioral contract.

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 every parameter (name, vdom, extra, comment, members) is already documented in the schema; the description adds no extra meaning. Baseline 3 applies when the schema does the heavy lifting.

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 verb (Create) and resource (address group), so an agent immediately knows the operation. However, it offers no differentiation from nearby siblings such as create_address, create_service_group, or update_address_group.

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 on when to use this tool versus the many other create/update tools, no prerequisites, and no note about required inputs. The agent must infer everything from the schema alone.

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

create_dns_zoneB

Create a local DNS zone. view=shadow serves internal clients. FortiOS does not accept wildcard (*) hostnames, so add one record per name.

ParametersJSON Schema
NameRequiredDescriptionDefault
ttlNoDefault TTL in seconds (default 300)
nameYesZone object name, e.g. lab
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
viewNoshadow (internal, default) or public
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
domainYesDomain, e.g. lab or lab.home.arpa
recordsNoInitial records
authoritativeNoAnswer NXDOMAIN for unknown names in the zone (default true)

TDQS

B3.4/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 disclosure burden. It adds genuinely useful behavioral context (the wildcard restriction, the internal-vs-public view semantics), but says nothing about idempotency, behavior on a duplicate zone, permissions required, or what is returned.

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 core action, then two operational caveats. No filler; each clause carries information an agent needs.

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 an 8-parameter creation tool with a nested records array, no annotations and no output schema, the description covers the notable FortiOS quirk and the view flag. It leaves gaps around failure modes, duplicate handling, and what a successful call yields, which matters more here because annotations provide no safety profile.

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 every parameter is already documented, including ttl defaults, vdom, authoritative, and the nested record fields. The description's view=shadow remark largely restates the schema's own 'shadow (internal, default) or public' text, so it adds little beyond 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?

States a specific verb+resource ('Create a local DNS zone'), which cleanly distinguishes it from siblings like list_dns_zones, delete_dns_zone and add_dns_record. It stops short of explicitly naming those alternatives, but the action is unambiguous.

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 hints at selection context by explaining that view=shadow serves internal clients, and warns that wildcard hostnames must be expanded into per-name records. It never says when to create a zone versus adding records to an existing zone, nor what prerequisites (existing VDOM, DNS profile) apply.

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

create_firewall_policyA

Create a firewall policy. New policies are added at the end of the list; use move_firewall_policy to reorder. FortiGate-VM evaluation licenses allow only 3 policies.

ParametersJSON Schema
NameRequiredDescriptionDefault
natNoSource NAT to the outgoing interface IP
nameYesPolicy name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
actionNoaccept or deny
statusNoenable or disable
dstaddrYesDestination addresses or groups
dstintfYesDestination interfaces, e.g. [port1]
serviceYesServices, e.g. [HTTP, HTTPS] or [ALL]
srcaddrYesSource addresses or groups, e.g. [LAB-NET] or [all]
srcintfYesSource interfaces, e.g. [port2]
commentsNoComment
policyidNoPolicy ID (optional; FortiOS picks the next free ID)
scheduleNoSchedule (default always)
av_profileNoAntivirus profile ('' to detach)
ips_sensorNoIPS sensor ('' to detach)
logtrafficNoall, utm or disable
utm_statusNoEnable security profiles on the policy. Turned on automatically when a profile is given
ssl_ssh_profileNoSSL/SSH inspection profile: no-inspection, certificate-inspection (hostname/cert visibility, no decryption) or deep-inspection / a custom profile (decrypts; clients must trust the CA)
application_listNoApplication control profile, e.g. default ('' to detach)
webfilter_profileNoWeb filter profile ('' to detach)

TDQS

A4.2/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 disclose two non-obvious traits: new policies are appended to the end of the list, and evaluation licenses cap at 3 policies. It omits permissions, error behavior on name collision, and idempotency, but the constraints it does surface are valuable.

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: purpose, ordering behavior plus alternative, and license constraint. The core action is front-loaded with zero filler.

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 21-parameter mutation tool the schema is fully self-documenting on inputs, and the description adds the key operational caveats (append ordering, license cap). It lacks return-value guidance (no output schema exists, e.g. the resulting policyid) and permission requirements, but is otherwise adequate.

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 21 parameters (including the nested 'extra' object) are already documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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 ("Create a firewall policy") and immediately distinguishes itself from the sibling move_firewall_policy, which handles reordering. An agent can identify this as the creation path 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 Guidelines4/5

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

Explicitly routes reordering to move_firewall_policy and warns about the 3-policy cap on FortiGate-VM evaluation licenses, which are genuine when-to-use signals. It stops short of stating prerequisites (required VDOM, permissions) or when not to create, so it is clear but not exhaustive.

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

create_port_forwardA

Create a port forward (VIP): traffic arriving on extintf at extip:extport goes to mappedip:mappedport. A VIP only passes traffic once a policy from extintf uses it as a destination. With attach_to_policy, the VIP is added to that existing policy's destinations instead of needing a new policy (the evaluation license allows only 3). FortiOS does not allow VIPs and ordinary addresses in the same policy's destinations, so the target must already use only VIPs, or pass replace_destinations=true to turn it into a VIP-only policy (its old destinations stop being reachable through it). In that policy, services match the mapped (internal) port.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesVIP name, e.g. VIP-TRAEFIK-HTTPS
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extipNoExternal IP (default 0.0.0.0 = the extintf's own address)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
commentNoComment
extintfYesInterface the traffic arrives on, e.g. port1
extportYesExternal port or range, e.g. 8443
mappedipYesInternal IP or range a-b, e.g. 192.168.150.10 or 192.168.150.10-192.168.150.12
protocolNotcp (default), udp or sctp
mappedportNoInternal port or range (default: same as extport)
attach_to_policyNoAdd this VIP to an existing policy's destinations (recommended)
replace_destinationsNoWith attach_to_policy: replace the policy's ordinary-address destinations with this VIP

TDQS

A4.3/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 well: it discloses the license constraint, the VIP-only-vs-ordinary-address restriction, and the destructive side effect that replace_destinations makes old destinations unreachable. It omits auth/permission requirements and error/idempotency behavior, so it is not complete.

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?

Four dense sentences, front-loaded with the core mapping and with no filler; each sentence contributes required context. Scannability suffers slightly from parentheticals and semicolons, but nothing is redundant.

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 12-parameter, nested, no-annotation mutation tool, the description covers the behavioral and workflow context an agent needs to call it correctly. It does not describe the response shape, and there is no output schema to compensate, leaving a minor gap.

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 100%, so the schema already documents all 12 parameters (baseline 3). The description adds genuine meaning beyond the schema for the two most consequential params: the purpose of attach_to_policy and the destructive consequence of replace_destinations, plus the note that services match the mapped internal port.

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 first sentence states a specific verb (Create) and resource (port forward / VIP) and immediately defines the traffic mapping semantics. It clearly distinguishes this from list_port_forwards/delete_port_forward and from create_firewall_policy by describing the VIP-plus-policy relationship.

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 strong conditional guidance: use attach_to_policy to reuse an existing policy because the eval license allows only 3, and pass replace_destinations=true only when the target policy already uses only VIPs. It stops short of explicitly naming the alternative tool (create_firewall_policy) for the new-policy path.

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

create_serviceC

Create a custom TCP/UDP service.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesService name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
commentNoComment
tcp_portrangeNoTCP ports, e.g. '6443' or '8000-8080 9000'
udp_portrangeNoUDP ports

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 behavioral burden. It only implies a write operation via 'Create' and does not describe permissions, side effects, validation behavior, or how the new service can be used afterward.

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?

It is a single front-loaded sentence with no wasted words. For its length, it is as concise and structured as possible.

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 mutation tool with no annotations and no output schema, the description is too thin. It does not cover usage context, required permissions, side effects, or how the created service integrates with firewall policies or service groups.

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 parameter meanings are already well documented in the schema. The description adds only the overarching TCP/UDP context and does not contribute parameter-level detail beyond what the schema 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 states a specific verb and resource: create a custom TCP/UDP service. It clearly identifies the object being created, though it does not distinguish this tool from sibling create tools such as create_service_group or create_address.

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 on when to use this tool versus alternatives, no prerequisites, and no exclusions. The agent must infer that this is for standalone custom services rather than service groups.

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

create_service_groupA

Create a service group, e.g. K3S-MGMT = [SSH, K8S-API, PING]. Grouping services lets one policy cover what would otherwise need several, which helps under the evaluation license's 3-policy limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGroup name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
commentNoComment
membersYesService or group names

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 behavioral burden. It adds genuinely useful context (the evaluation license's 3-policy limit motivating group creation) but omits operational traits: required permissions, whether members must already exist, failure behavior, 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.

Conciseness4/5

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

Front-loaded with the verb and resource, then a compact example and a one-line rationale. No filler, though the license-limit sentence is context rather than strictly necessary to invoke the tool.

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 5-param create tool with no annotations and no output schema, the description covers purpose and the members example but leaves the 'extra' passthrough object, vdom defaulting, and mutation outcomes unexplained. Adequate but with clear 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?

Schema coverage is 100%, so the baseline is 3, and the example adds meaning beyond the schema by illustrating the shape of both required params (name = group label, members = list of service/group names). It does not explain the vdom or extra parameters, but the example lifts it above 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?

States a specific verb and resource (create a service group) and reinforces it with a concrete example (K3S-MGMT = [SSH, K8S-API, PING]). It is distinguishable from create_service (a single service) and create_address_group, 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 Guidelines3/5

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

It gives a rationale for when to use grouping (covering several services with one policy under the 3-policy license limit), which implies usage. However it never states when NOT to use it or points to alternatives like create_service or update_service_group, leaving the agent to infer the routing.

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

create_static_routeB

Add a static route. FortiGate-VM evaluation licenses allow only 3 routes.

ParametersJSON Schema
NameRequiredDescriptionDefault
dstYesDestination in CIDR (10.1.0.0/16) or 'ip mask' form; 0.0.0.0/0 for default
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
deviceYesOutgoing interface, e.g. port1
commentNoComment
gatewayNoNext-hop IP
distanceNoAdministrative distance (default 10)

TDQS

B3.4/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 behavioral burden. It usefully discloses the eval-license route cap, a genuine operational constraint, but says nothing about required permissions, whether the change is immediately active, or what happens on exceeding the limit.

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 short sentences, front-loaded with the action and followed by the most consequential constraint. Minimal waste, though the license note is terse enough to be slightly ambiguous about what happens when the limit is hit.

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?

A mutation tool with no annotations and no output schema. The schema fully documents inputs, and the license cap is a useful addition, but the description leaves behavioral gaps (permissions, activation, error behavior on exceeding the limit) that an agent might need.

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 7 parameters including dst, device, vdom, and the nested 'extra' object are already documented in the schema. The description adds no parameter-level detail beyond that, so the baseline of 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?

'Add a static route' gives a specific verb (create) and resource, unambiguous against siblings like delete_static_route and list_static_routes. It doesn't explicitly differentiate from those siblings, but the verb makes the distinction self-evident.

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 explicit when-to-use or alternatives, but the second sentence encodes a real usage constraint: evaluation licenses cap routes at 3, which affects whether the call will succeed. That is implied guidance rather than a full when/when-not statement.

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

delete_addressA

Delete a firewall address (fails while a policy or group still uses it).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAddress name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 the full burden. It usefully discloses the dependency failure mode (a policy or group reference blocks deletion), which is the highest-risk behavior for this tool. However, it omits permission/auth requirements, whether the call is idempotent on a missing name, and whether success returns anything — gaps that matter for a destructive operation with zero annotation coverage.

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?

A single front-loaded sentence naming the action and target, with the constraint in a compact parenthetical. Every clause earns its place and 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 two-parameter delete tool with full schema coverage and no output schema, the description supplies the one piece of context an agent genuinely needs before calling — the reference dependency that causes failure. It is nearly complete, missing only auth/idempotency notes.

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% for both parameters ('name' and 'vdom'), so the schema already documents them fully. The description adds no syntax, naming convention, or default details beyond what the schema provides, so the baseline 3 applies.

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 ('Delete') and a precise resource ('a firewall address'), which cleanly separates it from delete_address_group, delete_firewall_policy, and delete_static_route in the sibling list. An agent can identify the target object type without opening 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?

The parenthetical establishes one real precondition ('fails while a policy or group still uses it'), which implicitly tells the agent to detach references first, but no alternatives or when-to-use routing is given (e.g., delete_address_group for groups, update_address to modify instead). Usage is inferable but not explicit.

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

delete_address_groupA

Delete an address group (fails while a policy still uses it).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGroup name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 the full behavioral burden. It usefully discloses the failure condition tied to policy usage, but says nothing about irreversibility, required permissions, or what happens to group members on deletion.

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?

A single tight sentence with zero waste, front-loading the action and appending the key constraint.

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 two-parameter delete tool with no output schema this is minimally adequate; it identifies the target and one constraint, but a delete operation with no annotation coverage would benefit from noting irreversibility or permission requirements.

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 only two parameters (name, vdom), both documented in the schema. The description adds no syntax, format, or defaulting detail beyond what the schema already provides, so 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 states a specific verb+resource ('Delete an address group'), which clearly distinguishes it from the many other delete_* siblings (delete_address, delete_service, delete_dns_zone). It is precise but does not explicitly name alternatives.

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 parenthetical 'fails while a policy still uses it' is an implied precondition that tells the agent when the call will be rejected, but it never states when to prefer this tool over alternatives or what to do first (e.g., remove the group from the policy).

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

delete_app_control_ruleB

Remove a rule from an app-control profile by its id (see list_app_control_profiles).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRule id
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
profileYesProfile name

TDQS

B3.3/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 behavioral burden. 'Remove' signals a destructive mutation, but the description does not disclose permissions, reversibility, failure behavior, 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?

It is a single front-loaded sentence with no wasted words. The essential action, resource, and id prerequisite are all communicated 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?

For a simple delete operation with full schema coverage, the description is adequate about what is deleted and how to identify it. With no annotations and no output schema, it should do more to disclose destructive behavior, permissions, or expected result.

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 id, profile, and vdom. The description adds only 'by its id' and a cross-reference for finding the id, which is marginal beyond the schema.

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 verb and resource: 'Remove a rule from an app-control profile by its id.' It distinguishes the operation from list/add siblings and points to list_app_control_profiles for the required id, though it does not explicitly name alternative tools or conditions.

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 parenthetical reference to list_app_control_profiles gives an implied prerequisite for obtaining the rule id. However, it does not explain when to choose this delete operation over alternatives or any conditions/exclusions.

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

delete_dhcp_reservationC

Remove a DHCP reservation by its id (see list_dhcp_servers).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesReservation id
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
server_idYesDHCP server id

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 behavioral burden. 'Remove' implies a destructive mutation, but the description does not state whether deletion is permanent, whether it is idempotent on a missing id, what permissions are required, or what happens to related leases. For a delete tool with zero annotation coverage this is a substantial gap.

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?

A single short sentence with the action and target front-loaded and no wasted words. The trailing parenthetical is the only slightly loose element, but overall it is tight and scannable.

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 destructive mutation with no annotations and no output schema, the description omits the key context an agent needs: permanence, error behavior on unknown ids, and permission requirements. Fully covered schema helps, but the behavioral side is thin for a delete operation.

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 id, server_id, and vdom all documented in the schema, so the baseline is 3. The description adds only 'by its id' and does not clarify the required server_id/vdom relationship or id format beyond what the schema already states.

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 (Remove) and resource (DHCP reservation) with the identifier ('by its id'), which cleanly separates it from add_dhcp_reservation, update_dhcp_server, and list_dhcp_leases. The parenthetical '(see list_dhcp_servers)' is a slightly imprecise pointer, since that tool lists servers rather than reservations, but the core purpose is unambiguous.

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 explicit when-to-use or when-not-to-use guidance and no mention of alternatives or prerequisites. The '(see list_dhcp_servers)' hint gestures at where to source the id but does not describe any selection condition. Minimal routing value.

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

delete_dns_recordB

Delete a record from a local DNS zone by its id (see list_dns_zones).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRecord id
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
zoneYesZone object name

TDQS

B3.4/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 behavioral burden. It only states that a deletion occurs; it does not disclose irreversibility, required permissions, side effects, or any confirmation/error behavior expected from a destructive 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?

A single front-loaded sentence with no wasted words. It efficiently conveys the action, target, and key identifier.

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 destructive tool with no annotations and no output schema, the description omits important behavioral context such as irreversibility, authorization expectations, and side effects. The pointer to list_dns_zones is also potentially misleading for obtaining a record id, since that sibling lists zones.

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 three parameters, including the VDOM default. The description adds only a reference to list_dns_zones and does not supplement the meaning of id or zone beyond what the schema provides.

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 ('Delete a record from a local DNS zone'), names the key identifier ('by its id'), and implicitly distinguishes itself from sibling delete_dns_zone by operating on a record rather than a zone.

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?

Usage is implied by the tool name and description, and it points to list_dns_zones for context. However, it does not explain when to prefer this over related tools, nor does it clarify prerequisites such as needing the zone to exist or how to obtain the record id.

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

delete_dns_serverC

Stop serving DNS on an interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
interfaceYesInterface

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 carries the full behavioral burden. It implies a destructive removal but never states whether the interface DNS config is deleted or just disabled, whether the change is reversible, whether it needs elevated permissions, or what confirmation/response follows.

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?

A single front-loaded sentence with no filler, which is appropriate for a simple two-parameter delete. It is efficient, though it is arguably too terse given what it omits.

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 destructive delete operation with no annotations, no output schema, and no usage guidance, this description is thin. It leaves the agent without any information on side effects, reversibility, or how it differs from the adjacent DNS tools.

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 both the vdom and interface parameters; baseline 3 applies. The description only echoes the interface concept and adds no format or default details beyond the schema.

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 action and resource: stopping DNS service on an interface, which is a clear verb+resource pair. It distinguishes itself from list_dns_servers and set_dns_server implicitly, though it never explicitly names them or delete_dns_zone as the sibling for a different object.

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 versus set_dns_server or delete_dns_zone, and no prerequisites or warnings are given. The agent must infer that this removes DNS service rather than merely listing or configuring it.

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

delete_dns_zoneB

Delete a local DNS zone and all its records.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesZone object name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

B3.3/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 behavioral burden. It does disclose the cascading destruction of child records, which is genuinely useful and not in the schema, but it says nothing about irreversibility, required permissions, or confirmation semantics for what is clearly a destructive 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?

One short sentence, front-loaded with the verb and resource, with the destructive scope folded in rather than buried. 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?

For a destructive, zero-annotation tool with no output schema, the description covers effect scope but omits irreversibility, permission requirements, and failure behavior. Adequate but with clear gaps an agent would want before issuing a delete.

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 both 'name' and 'vdom' are already documented with meaning and defaults. The description adds no syntax, format, or selection guidance beyond that, 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?

Specific verb (Delete) plus resource (local DNS zone) with an added scope note ('and all its records'). It is distinguishable from sibling delete_dns_record and delete_dns_server by the resource noun alone, though it does not explicitly name them.

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 when-to-use guidance, no prerequisites, and no alternatives cited. The cascade note implies the tool's effect but not when an agent should reach for it over delete_dns_record or list_dns_zones first.

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

delete_firewall_policyC

Delete a firewall policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
policyidYesPolicy ID

TDQS

C2.4/5.0
Behavior1/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, yet it only restates the operation. It omits that deletion is destructive and irreversible, whether it requires admin rights, what happens to associated rules/references, and what the return looks like. Nothing beyond the verb is disclosed.

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?

A single, front-loaded sentence with no waste. It is appropriately sized but is arguably too terse for a destructive operation, which is a completeness concern rather than a conciseness one.

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

Completeness1/5

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

For a destructive delete tool with no annotations, no output schema, and no behavioral notes, the description is severely lacking. An agent cannot determine safety, reversibility, permissions, or side effects from this definition.

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 policyid and vdom both documented in the schema (including the VDOM default). The description adds no parameter detail, but the schema already does the heavy lifting, making the baseline 3 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?

States a specific verb and resource ('Delete a firewall policy'), which is clear and unambiguous on its own. However, it does not differentiate itself from siblings like update_firewall_policy or get_firewall_policy beyond the verb, and offers no scope detail (e.g. what a policy controls or what deletion entails).

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

Usage Guidelines1/5

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

No when-to-use guidance, no prerequisites, no mention of alternatives. An agent gets zero help deciding between this and update_firewall_policy or move_firewall_policy.

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

delete_port_forwardA

Delete a VIP. FortiOS refuses while a policy uses it; detach=true first removes it from every policy's destinations. A policy whose only destination is this VIP blocks the delete: change or delete that policy first.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesVIP name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
detachNoRemove the VIP from policies first (default false)

TDQS

A3.9/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 it well: it discloses the failure condition (policy still references the VIP), the effect of detach=true (removes the VIP from every policy's destinations), and the hard blocker case (sole destination policy). It stops short of auth/permission or response details, but the destructive semantics are clearly conveyed.

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-loads the core action ('Delete a VIP') then layers the conditional behavior in three tight sentences. No filler, though the conditional clauses could be slightly denser.

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 destructive tool with no annotations and no output schema, the description covers the important edge cases (in-use refusal, sole-destination blocker) and the detach workflow. Missing only ancillary details such as permission requirements, which for this domain are minor.

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 name, vdom, and detach; baseline is 3. The description adds some behavioral meaning to detach ('removes it from every policy's destinations') but leaves name/vdom to the schema.

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 ('Delete a VIP') that clearly identifies the operation. It maps to the port-forward VIP concept matching the tool name and its list_port_forwards/create_port_forward siblings, though it doesn't explicitly name those 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?

Gives concrete usage context: it tells the agent the delete will be refused while a policy uses the VIP, offers detach=true as the workaround, and warns that a policy whose only destination is this VIP blocks the delete. This is actionable pre-invocation guidance, though it is framed as prerequisites rather than as tool selection.

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

delete_serviceA

Delete a custom service (fails while a policy still uses it).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesService name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 the full behavioral burden. It usefully discloses a dependency failure mode (fails while a policy still uses it), but says nothing about irreversibility, required permissions, or the effect on references. For an unannotated destructive mutation this leaves meaningful gaps.

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?

One sentence, front-loaded with the action, with the parenthetical carrying only genuinely load-bearing failure information. No wasted 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?

Covers the essential dependency caveat for a delete tool, and the schema fully documents both parameters. However, with no annotations and no output schema, the description should also address irreversibility or auth requirements to be complete for a destructive operation.

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 both 'name' and 'vdom' are already documented in the schema. The description adds no parameter-level detail beyond that, making the baseline 3 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?

States a specific verb+resource ('Delete a custom service'), and the 'custom' qualifier helps separate this from predefined/built-in services and from the sibling delete_service_group. It does not, however, explicitly name the sibling it must not be confused with.

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 parenthetical gives an implied precondition (a policy must not still reference the service), which is useful usage context. There is no explicit when-to-use statement, no mention of the sibling delete_service_group or delete_firewall_policy, and no guidance on confirming intent before a destructive call.

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

delete_service_groupA

Delete a service group (fails while a policy still uses it).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGroup name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 the full behavioral burden. It usefully discloses the referential-integrity failure mode, which is real added value. However, it omits permission requirements, whether deletion is reversible, and confirmation behavior expected of a destructive 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?

A single sentence that front-loads the action and parenthetically attaches the one constraint that matters. No filler, nothing to trim.

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 two-parameter destructive tool with a fully documented schema and no output schema, the description covers purpose and the key failure condition. The remaining gap is the safety/permission profile, which nothing else supplies given the absence of annotations.

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 both 'name' and 'vdom' are already documented in the schema, including the VDOM default. The description adds no parameter-level meaning beyond that, 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?

States a specific verb (Delete) and resource (service group), which is distinguishable from siblings like delete_service, delete_address_group, and delete_firewall_policy. It does not explicitly contrast itself with those siblings, but the noun phrase is specific enough to route correctly.

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 a concrete precondition for success: deletion fails while a policy still references the group. This tells the agent when the call will not work and implies it must detach policies first. It stops short of naming alternatives (e.g., update_service_group) or stating what to do instead.

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

delete_static_routeA

Delete a static route by its sequence number (seq-num from list_static_routes).

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
seq_numYesRoute sequence number

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 behavioral burden. It states that this is a delete but says nothing about irreversibility, whether a confirmation is required, permission needs, or what happens on an invalid seq_num.

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?

One sentence, zero filler, and the identifying selector is front-loaded. Nothing is wasted.

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 two-parameter delete with full schema coverage and no output schema, the description is adequate but thin. With no annotations to carry the destructive-operation profile, the missing disclosure of irreversibility and error behavior leaves a real gap.

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 both parameters are already documented. The description adds only the hint that seq_num originates from list_static_routes; it does not explain the VDOM parameter or validate constraints. Baseline 3 for full schema coverage applies.

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 (Delete) and resource (static route) plus the exact selection criterion (sequence number). It is clearly distinguishable from its siblings list_static_routes and create_static_route.

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 parenthetical '(seq-num from list_static_routes)' implies an ordering workflow: list first, then delete by the returned identifier. However, there is no explicit when-to-use/when-not guidance, no mention of prerequisites, and no warning about consequences.

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

download_certificateA

Download a certificate's PEM (public part only), e.g. the deep-inspection CA Fortinet_CA_SSL so clients can be told to trust it. Returns the PEM and its SHA-256 fingerprint.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCertificate name, e.g. Fortinet_CA_SSL
typeNolocal-ca (default), local-cer, remote-cer, ca or crl
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

A3.8/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 it does meaningfully disclose that only the public part is returned (implying the private key is never exposed) and what the return contains (PEM + SHA-256 fingerprint). It stops short of stating read-only/non-destructive nature, auth requirements, or error 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?

Two tight sentences with zero filler; the core action and its scope are front-loaded before the example and the return-value note.

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?

With no output schema, the description correctly covers return values (PEM and fingerprint), and the schema fully covers the three parameters. It is nearly complete for a simple read tool, with only the safety/permission profile left implicit.

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 name, type, and vdom are already documented in the schema, including the type value list. The description only echoes the name example already present in the schema, adding no new parameter meaning.

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+resource ('Download a certificate's PEM') and scopes it precisely with '(public part only)' plus a concrete example (Fortinet_CA_SSL). An agent can distinguish it from list_certificates by the download/retrieve framing, though no sibling is named explicitly.

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 implies the use case ('so clients can be told to trust it') but never states when to use this versus list_certificates or get_interface-style siblings, and gives no prerequisites. Usage is inferable but not spelled out.

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

forticonverter_setup_promptA

Show or hide the 'Migrate Config with FortiConverter' step of the GUI's FortiGate Setup popup. Without hide, only reports the current state. FortiGate-VM evaluation licenses are not eligible for FortiConverter, so that step never completes and the popup reappears at every login until it is hidden. There is no CLI equivalent.

ParametersJSON Schema
NameRequiredDescriptionDefault
hideNotrue hides the step, false shows it again; omit to read
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 and mostly succeeds: it discloses read-vs-write semantics (omit = report only), reversibility (false shows the step again), the persistence problem it solves, and the notable absence of a CLI equivalent. It does not mention permission requirements or what the call returns, which keeps it short of a 5.

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?

Four sentences, front-loaded with the action and immediately followed by the read-only default. The VM-eval rationale and the no-CLI note each add decision-relevant information rather than padding, though the explanation could be tightened slightly.

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?

With no output schema and no annotations, the description supplies the behavioral context an agent needs: default read behavior, both write directions, and the operational reason to use it. Only the return payload and any permission prerequisites are left unstated, which is acceptable for a two-parameter GUI toggle.

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 both parameters are fully documented inline, so the baseline is 3. The description reinforces the omit-to-read behavior but adds no syntax, default, or format detail beyond what the schema already states for `hide` and `vdom`.

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 pair (show/hide), the exact resource ('Migrate Config with FortiConverter' step of the FortiGate Setup popup), and the scope (GUI setup popup). No sibling tool covers this surface, and the description makes that unambiguous without opening 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 Guidelines4/5

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

Explains the trigger condition clearly: without `hide` it only reports state, and VM evaluation licenses are ineligible for FortiConverter so the step never completes and the popup recurs at every login until hidden. That tells the agent exactly when hiding is warranted. It stops short of framing alternatives, but no alternative tool exists, so the gap is minor.

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

fortigate_apiA

Call any FortiOS REST endpoint directly. path must start with /api/v2/ (cmdb/... for configuration, monitor/... for live state). FORTIGATE_READ_ONLY still applies. Prefer the dedicated tools when one exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON body for POST/PUT
pathYese.g. /api/v2/cmdb/system/global or /api/v2/monitor/system/ha-peer
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
methodYesGET, POST, PUT or DELETE
paramsNoQuery parameters

TDQS

A4/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, and it does disclose the FORTIGATE_READ_ONLY gate plus the /api/v2/ path requirement. However, for a tool that can issue POST/PUT/DELETE against arbitrary endpoints, it says nothing about destructive-operation warnings, permissions, or error 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?

Four short sentences, each carrying a distinct fact, with the core purpose and the sibling-routing rule front-loaded. Zero filler.

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 generic REST passthrough, the description covers the essentials an agent needs to invoke it correctly: path format, config-vs-monitor intent, read-only enforcement, and fallback routing. No output schema exists, so return values need not be explained, though it could say more about write safety.

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 five parameters, setting the baseline at 3. The description adds path-prefix and cmdb/monitor semantics beyond the schema, but gives no extra meaning for method, body, vdom, or params.

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: 'Call any FortiOS REST endpoint directly,' and explicitly positions itself against siblings with 'Prefer the dedicated tools when one exists.' An agent can immediately tell this is the generic escape hatch versus the many dedicated CRUD tools.

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 a clear routing rule (prefer dedicated tools) and distinguishes cmdb/... for configuration from monitor/... for live state, which directs endpoint choice. It stops short of stating explicit exclusions or edge cases, but the primary when-to-use condition is present.

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

get_addressC

Get one firewall address object.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAddress name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 implies a non-destructive read, but says nothing about required permissions, behavior when the name is absent, or whether VDOM scoping affects visibility.

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?

A single short sentence with no padding, and the operation is stated up front. It is efficient, though its brevity reflects under-specification rather than disciplined editing.

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 no annotations and no output schema, the description should describe what is returned (the address object fields) and error behavior for an unknown name. Neither is covered, leaving an agent unable to anticipate the response shape.

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 both parameters (name, vdom) are already documented in the schema, including the VDOM default. The description adds no meaning beyond that, 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 gives a specific verb ("Get") and resource ("firewall address object") with the scope narrowed to a single object, which implicitly distinguishes it from the sibling list_addresses. It stops short of explicitly naming that alternative, so it is clear but not fully differentiated from its siblings.

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 statement of when to use this tool versus list_addresses, get_firewall_policy, or any other retrieval sibling, and no prerequisites (e.g., that the address must already exist). Usage is only inferable from the word "one".

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

get_arp_tableB

IPv4 ARP table: which MAC answers for which IP on each interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
interfaceNoOnly this interface, e.g. port2

TDQS

B3.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 the full burden; it does explain the data model returned (which MAC answers for which IP per interface), which is genuinely useful given no output schema exists. It is silent on read-only semantics, permissions, and pagination, but for a simple listing the content description is a reasonable partial 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?

A single front-loaded sentence with no filler, stating resource and payload immediately. It is efficient, though its brevity is partly why usage guidance is absent.

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 two-optional-parameter read tool with 100% schema coverage and no output schema, the description adequately conveys what is returned. However, it omits any usage context or scoping notes, leaving the definition minimally viable rather than 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 both the vdom and interface parameters are already documented in the schema, including the 'e.g. port2' example and the VDOM default. The description adds no parameter detail beyond this, which matches the baseline 3 when the schema does the heavy lifting.

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 (the IPv4 ARP table) and clarifies its contents as MAC-to-IP mappings per interface, which an agent can distinguish from siblings like get_routing_table or get_system_status. The verb is implied by the 'get_' name rather than stated, but the scope is unambiguous.

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 explicit when-to-use guidance, no mention of when this is preferable to alternatives such as get_routing_table or list_interfaces, and no prerequisites (e.g., VDOM context) called out. The agent must infer the use case entirely from the resource name.

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

get_dns_settingsC

System DNS settings: upstream resolvers the FortiGate itself uses and forwards to.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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. It conveys no safety profile (read-only vs mutation), no return shape, and no auth/permission notes. The only behavioral hint is the noun 'settings,' implying a retrieval, which is weak for an unannotated 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?

A single, front-loaded sentence with no filler; the defining clause follows immediately after the resource name. It is efficient, though it slightly under-specifies relative to its brevity.

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 one-parameter read with full schema coverage and no output schema, the description gives a hint about the returned content but no when-to-use context and no behavioral disclosure. It is minimally viable but leaves gaps an agent would need to close.

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% for the single vdom parameter, so the schema already documents it fully (default FORTIGATE_VDOM, usually root). The description adds nothing about the parameter, so the baseline of 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 resource (system DNS settings) and clarifies what those settings contain (upstream resolvers the FortiGate itself uses and forwards to), which helps distinguish it from list_dns_servers. However, it omits a leading verb and does not explicitly name the sibling it differs from, so an agent must infer the boundary between this and the DNS server list tools.

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 when-to-use guidance, no conditions, and no mention of alternatives such as list_dns_servers or get_system_status. The agent is left to guess whether this returns the FortiGate's own resolver config versus configured DNS servers for clients.

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

get_firewall_policyC

Get one firewall policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
policyidYesPolicy ID

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 behavioral burden, yet it only restates the operation. It does not disclose error behavior for an unknown policyid, required permissions, VDOM resolution behavior, or what the returned payload contains.

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?

A single short sentence with the operation front-loaded and zero padding. It is appropriately sized for a simple getter, though it is arguably terse to the point of under-specification.

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 two-parameter read tool with full schema coverage and no output schema, the essentials are covered by the schema. Still, a getter should say what it returns and what happens on a missing policyid, neither of which is present.

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 policyid and the vdom default both documented in the schema, so the baseline is 3. The description adds no syntax, format, or lookup guidance beyond what the schema already supplies.

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 (Get) and resource (firewall policy) with a scope qualifier (one), which distinguishes it from the plural list_firewall_policies sibling. However, it never names that sibling or otherwise differentiates itself from the other firewall_policy-family tools explicitly.

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 statement of when to use this tool versus list_firewall_policies, get_policy_stats, or the mutation siblings, and no prerequisites or exclusions are given. The agent must infer that a single policy is fetched by ID.

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

get_interfaceC

Get one interface's full configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesInterface name, e.g. port1
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 disclosure burden. 'Get' implies read-only, but it says nothing about authentication needs, required permissions, pagination, or what 'full configuration' actually includes.

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?

A single tight sentence with the key scope qualifier ('one interface's full configuration') front-loaded. No wasted words, though there is little content to structure.

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 config-retrieval tool with no output schema and no annotations, the description is too thin to tell the agent what a caller receives or how it differs from get_interface_status. More detail on the returned configuration would be needed here.

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 only two parameters, so the schema already documents 'name' (with the port1 example) and 'vdom' (with a default). The description adds nothing beyond that 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?

States a specific verb ('Get') and resource ('one interface's full configuration'), making it clear this is a single-object read rather than a list. It does not explicitly distinguish itself from the close sibling get_interface_status, so it falls short of the top tier.

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 choose this over list_interfaces (enumerate all) or get_interface_status (status vs. full config), nor any prerequisite or VDOM context advice. The agent must infer the selection criteria from the sibling names alone.

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

get_interface_statusB

Live interface state: link, speed, IP and traffic counters.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
interfaceNoLimit to one interface (optional)

TDQS

B3.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 the full burden. It signals a non-persistent, live read of current state and enumerates the values returned, which is useful behavioral context, but it says nothing about required permissions, whether it is strictly read-only, or behavior on an invalid interface.

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?

A single tight sentence with the key noun ('Live interface state') front-loaded and no filler. It is efficient, though its brevity leaves the usage gap that other dimensions penalize.

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 no output schema, the description usefully names the returned fields, partially compensating for the missing return documentation. But it omits usage context relative to sibling interface tools and any behavioral/permission detail, leaving meaningful gaps for a 2-parameter 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?

Schema description coverage is 100%, so the schema already documents both vdom and interface, including the default note for vdom. The description adds no parameter-level meaning beyond what the schema states, so the 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?

States a specific resource (interface state) and enumerates the fields returned (link, speed, IP, traffic counters), so the agent knows exactly what it gets. However it does not distinguish itself from siblings like get_interface or list_interfaces, which an agent could easily confuse with it.

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 explicit when-to-use guidance, no statement of prerequisites, and no reference to the sibling tools (get_interface, list_interfaces) that an agent must choose between. The word 'Live' faintly implies real-time status versus config, but this is inference, not guidance.

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

get_license_limitsB

How much of the license's object limits is used. The free FortiGate-VM evaluation license allows 1 vCPU, 2 GB RAM and at most 3 interfaces, 3 firewall policies and 3 static routes; this lists what counts against each so you can plan before hitting one.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

B3.4/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 implies a read-only query and adds genuinely useful domain context (the free eval license ceilings of 1 vCPU, 2 GB RAM, 3 interfaces/policies/routes), but it says nothing about required permissions, whether counters are live or cached, or what the response contains.

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, front-loaded with the core purpose, followed by actionable context about the eval limits. The second sentence is long but earns its place by explaining what counts against each limit; nothing is redundant 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?

For a one-optional-parameter read tool with no output schema, the description gives a reasonable sense of what is returned ('lists what counts against each'), but it does not describe the shape of the output or how the limits are represented, leaving a gap that the absent output schema cannot fill.

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 single vdom parameter is fully documented in the schema (100% coverage), so the schema does the heavy lifting. The description adds no meaning about vdom scoping or defaults beyond what the schema provides, making the 3 baseline correct.

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 verb+resource ('how much of the license's object limits is used') and enumerates the concrete limits tracked. It is clear on its own, but it does not differentiate itself from siblings like get_license_status or get_resource_usage, which an agent may confuse it with.

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?

Usage is only implied through the phrase 'so you can plan before hitting one', which suggests checking headroom ahead of provisioning. There is no explicit when-to-use, when-not-to-use, or comparison against get_license_status / get_resource_usage, so the routing decision is left to inference.

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

get_license_statusA

License and FortiGuard contract status. By default returns only the VM license, FortiCare and FortiGuard sections; set all=true for every entitlement. An unlicensed FortiGate-VM reports vm.status=vm_invalid and refuses most other API calls with 401.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoReturn every entitlement (default false)
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

A3.9/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 well: it discloses the default return scope, what all=true expands to, and the notable side effect that an unlicensed FortiGate-VM reports vm.status=vm_invalid and refuses most other API calls with 401. It does not cover auth requirements or pagination, but the behavioral disclosure is substantive.

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 dense, front-loaded sentences with no filler. The default-scope behavior and the failure mode are each stated once and earn their place, though the 401 note is a minor tangent to the tool's core purpose.

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?

With no output schema and no annotations, the description does most of the heavy lifting: it names the returned sections (VM license, FortiCare, FortiGuard) and a key return field (vm.status=vm_invalid). This is nearly complete for a simple two-parameter read tool, though it omits the full response shape.

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 both parameters are already documented, establishing a baseline of 3. The description's statement about default vs all=true return scope slightly enriches the meaning of `all`, but adds little beyond the schema text ('Return every entitlement (default false)').

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+resource: retrieving license and FortiGuard contract status. It is clearly distinct from the sibling get_license_limits (status vs limits), though it does not name the sibling explicitly. The purpose is unambiguous without opening 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 Guidelines4/5

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

Gives clear context on when to set all=true ('set all=true for every entitlement') versus the default subset, and explains a diagnostic use case (unlicensed VM refusing calls with 401). It lacks an explicit routing statement to alternatives like get_license_limits, but the usage context is strong.

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

get_logsA

Read FortiGate logs, newest first. Useful types: traffic/forward (sessions through policies, with app identification), app-ctrl (per-connection application and, with certificate inspection, the HTTPS hostname), event/system (admin and config events), ips, webfilter. FortiGate-VMs without a log disk only keep logs in memory, which is lost on reboot.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoRows to return (default 50, max 1000)
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
startNoOffset for paging (default 0)
fieldsNoOnly return these fields per row, e.g. [date, time, srcip, dstip, hostname, app, action]
filterNoFortiOS log filter, e.g. srcip==192.168.150.10 or policyid==1 or hostname=@github
sourceNomemory (default), disk, fortianalyzer or forticloud
log_typeYesOne of: traffic/forward, traffic/local, traffic/multicast, traffic/sniffer, event/system, event/user, event/router, event/vpn, event/wad, event/endpoint, event/ha, event/security-rating, event/fortiextender, event/connector, app-ctrl, ips, virus, webfilter, dns, ssl, ssh, file-filter, anomaly, waf, emailfilter, dlp, voip, gtp, icap, virtual-patch
resolve_vmsNoLabel IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*)

TDQS

A4.2/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 disclose real behavioral traits: results are ordered newest-first, and FortiGate-VMs without a log disk hold logs only in memory, lost on reboot. It omits auth/permission requirements and any rate-limit behavior, keeping it short of a 5.

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 core action and ordering, then a compact type breakdown, then the operational caveat. Every sentence carries information and none repeats the schema.

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 an 8-parameter read tool with no output schema and no annotations, the description supplies ordering, log-type semantics, and the memory-volatility caveat. It leaves the shape of returned rows and any permission requirements unstated, but the fields/rows parameters imply row-level output.

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 100%, so the baseline is 3, but the description goes further by explaining what several log_type values actually contain (traffic/forward = sessions through policies with app ID; app-ctrl = per-connection app and, with cert inspection, HTTPS hostname), adding semantics beyond the schema's flat enumeration.

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 ('Read FortiGate logs') plus a scoping trait ('newest first'), which clearly separates it from siblings like list_sessions, get_top_traffic and get_policy_stats that surface derived rather than raw log data.

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 'Useful types' list implicitly guides which log_type to pick and what each contains, but there is no explicit when-to-use/when-not-to-use guidance and no named alternative (e.g. list_sessions for live session state vs. get_logs for historical records).

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

get_policy_statsC

Hit counts, bytes, packets and last-used time per policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
policyidNoLimit to one policy (optional)

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 reveals the returned metrics but says nothing about whether this is a read-only operation, permission requirements, whether counters are cumulative/resettable, or how stale last-used data might be.

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?

A single front-loaded sentence listing the metric set with zero filler. It is efficient, though terse enough that it under-specifies rather than over-explains.

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?

There is no output schema, so the description does useful work by naming the returned metrics. However, with no annotations and no usage or caveat context for a stats tool, it is only minimally complete for an agent that needs to know when and why to call it.

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%: the vdom default (FORTIGATE_VDOM, usually root) and the optional policyid filter are fully documented in the schema. The description adds no parameter-level information beyond that, 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 names the resource (policy) and enumerates the returned statistics (hit counts, bytes, packets, last-used time), so an agent knows this is a per-policy counters/metrics reader distinct from get_firewall_policy or list_firewall_policies. It lacks an explicit verb like 'retrieve', but the resource and payload are clear.

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 statement of when to use this versus alternatives such as get_top_traffic, get_firewall_policy, or get_system_status. It does not mention the vdom scoping default or the one-policy filter as a usage consideration, leaving the agent to infer everything from the schema.

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

get_resource_usageC

Current CPU, memory, disk and session usage.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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 carries the full behavioral burden. It implies a read-only snapshot via 'Current' but says nothing about permissions, whether the call is expensive, or whether values are instantaneous vs averaged. For a monitoring tool with zero annotation coverage, this is thin.

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?

A single short sentence with no filler, and the metric list is front-loaded. It is a fragment without an explicit verb, which costs a little clarity but wastes no space.

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 read tool with one optional, fully documented parameter and no output schema, the description is roughly sufficient to invoke correctly. It is still ambiguous about what 'session usage' means relative to the sibling list_sessions, and gives no sense of the returned shape.

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?

There is a single optional parameter (vdom) and schema description coverage is 100%, so the schema already explains the default and meaning. The description adds no additional detail about scoping behavior, 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 names the resource metrics it returns (CPU, memory, disk, session usage) with a clear point-in-time scope ('Current'), which is more specific than a bare name restatement. It does not, however, distinguish itself from the sibling get_system_status, which an agent could easily confuse it with.

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 when-to-use guidance, no mention of alternatives such as get_system_status or get_policy_stats, and no indication of what to do with the result. The agent must infer the tool's place in the toolset entirely on its own.

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

get_routing_tableB

Active IPv4 routing table (connected, static, DHCP-learned and dynamic routes).

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

B3.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 carries the full burden. It discloses that the output reflects the live/active table and covers multiple route-source categories (connected, static, DHCP-learned, dynamic), which adds real behavioral context about what is returned. It falls short of stating whether the query is read-only (implied by 'get', but not explicit), whether it requires elevated permissions, or whether it is scoped per-VDOM.

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?

A single, front-loaded sentence that states exactly what the tool returns. There is no filler, and the parenthetical scope qualifier is placed where it is most useful.

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 read-only retrieval with one fully documented parameter and no output schema, the description is adequate: it states scope and content. However, it omits any mention of VDOM scoping in prose, has no usage guidance, and provides no return-shape expectations, leaving marginal gaps an agent might need.

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%: the single 'vdom' parameter is fully documented in the schema, including its default. The description adds no parameter-level detail, so the baseline of 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 names a specific resource (the active IPv4 routing table) and enumerates the route types it contains, which distinguishes it from siblings like list_static_routes. It's clear what the tool retrieves, though the verb 'get' is implied rather than stated.

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 when-to-use guidance, no mention of alternatives, and no exclusion criteria. An agent cannot tell from the description whether this is preferred over list_static_routes, get_arp_table, or get_interface_status for a given diagnostic task.

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

get_system_statusC

FortiGate model, serial, firmware version/build, hostname and uptime.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

C2.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 the full behavioral burden, yet it only lists returned fields. It says nothing about whether the call is read-only, what permissions/VDOM access it needs, or how the status is scoped, leaving an agent to assume safety.

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?

It is a single compact fragment with no filler, and the most useful identifiers are front-loaded. It loses a point only because it is a bare field list with no framing verb to anchor it.

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 no output schema, listing the returned fields is genuinely useful and partially compensates. But for a tool with no annotations, the absence of any usage or behavioral context leaves the definition only minimally 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% and the single 'vdom' parameter already documents its default and meaning. The description adds no parameter detail beyond the schema, so the baseline of 3 applies.

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 enumerates the specific data returned (model, serial, firmware version/build, hostname, uptime), which conveys the resource. However it omits any verb and does not distinguish this tool from neighbors that also report read-only status (get_license_status, get_resource_usage, get_license_limits), so the agent must infer intent 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 Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, no mention of alternatives such as get_resource_usage or get_license_status, and no stated prerequisites. The only hint of context is the implicit read nature of a 'get' tool.

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

get_top_trafficA

Live FortiView summary of the sessions passing through right now, grouped by source, destination, application, country, interface, policy or protocol. Destinations include the resolved hostname; application IDs are translated to names. Empty when nothing is flowing (it reflects current sessions, not history).

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
countNoRows to return (default 10)
dstaddrNoOnly sessions to this IP
sort_byNobytes (default), sessions, bandwidth or packets
srcaddrNoOnly sessions from this IP
policyidNoOnly sessions matched by this policy
report_byNosource, destination (default), application, country, interface, policy or protocol
resolve_vmsNoLabel IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*)

TDQS

A3.8/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 it does disclose real behavioral traits: the data is a live snapshot, hostnames and application names are resolved for readability, and the tool returns empty rather than historical data when no traffic flows. It omits permission/authentication requirements and any cost or performance characteristics.

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 tightly packed sentences with the live/non-historical nature front-loaded, followed by output-shaping details and the empty-state caveat. No sentence is filler and nothing is buried.

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?

No output schema exists, so the description must carry return semantics — and it does, explaining the grouping, the resolved hostname and application-name enrichment, and the empty-when-idle behavior. Remaining gaps are row/pagination semantics tied to the count parameter and any concurrency or rate considerations.

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 eight parameters including the report_by and sort_by enums. The description's enumeration of group-by dimensions loosely mirrors report_by but adds no syntax, format, or defaulting detail beyond what the schema provides. 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 gives a specific verb+resource (live FortiView summary of current sessions) and states the grouping dimensions, which clearly separates it from a raw session list. It never names a sibling tool such as list_sessions or get_logs, so an agent must infer the boundary rather than being told it.

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?

Usage is implied rather than stated: 'Live ... sessions passing through right now' and 'not history' signals real-time monitoring versus log/history queries, which is genuinely useful context. However, no alternative tool is named and no explicit when-not-to-use rule is given beyond the empty-result note.

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

list_addressesC

List firewall address objects.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

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 behavioral burden. 'List' implies a non-destructive read, but the description says nothing about pagination, result limits, VDOM scoping behavior, or required permissions. For a FortiOS list operation with zero annotation coverage, this is a notable gap.

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?

A single, front-loaded sentence with no wasted words. It is efficient, though arguably so terse that it borders on under-specification rather than being admirably concise.

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 no output schema, no annotations, and three query parameters, the description should explain what is returned and how filter/format behave. As written, an agent knows the tool lists address objects but not the shape or scope of results.

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 documents all three parameters (vdom, filter, format) with examples. The description adds no parameter meaning beyond that, 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?

States a specific verb (list) and resource (firewall address objects), which is clear enough to distinguish it from the many other list_* tools in the environment. However, it offers no differentiation from close siblings such as get_address or list_address_groups, which share the same resource domain.

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 indication of when to use this tool versus get_address (single object), list_address_groups, or the list_* siblings generally. No prerequisites, no conditions, no alternatives are named.

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

list_address_groupsB

List firewall address groups and their members.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden but discloses little beyond the basic action. It does note that members are included in the output, which is useful, but omits read-only safety implications, permission requirements, default VDOM handling, and pagination/return-format 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?

A single front-loaded sentence with no wasted words. It efficiently communicates the resource and the notable inclusion of member data.

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 low-complexity list tool with 100% schema coverage and no output schema, the definition is minimally viable. It lacks usage routing, behavioral context (e.g., default VDOM is only in the schema), and any output-shape hints, leaving clear gaps for an agent unfamiliar with the environment.

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 vdom, filter, and format in detail. The description adds no parameter meaning beyond what the schema provides, making the baseline score of 3 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 verb ('List') and resource ('firewall address groups') and adds scope ('their members'), which distinguishes it from list_addresses and list_service_groups. However, it does not explicitly contrast itself with sibling list 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?

No when-to-use guidance, prerequisites, or alternatives are provided. The agent is left to infer that this is the appropriate tool for listing address groups, with no mention of when to prefer get_address_group or list_addresses instead.

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

list_admin_sessionsC

Administrators currently logged in (GUI, SSH, API) and where from.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

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. It discloses that results cover GUI, SSH, and API logins, but says nothing about permissions required, whether session data is a live snapshot, rate limits, or how 'where from' is represented. For an unannotated tool this leaves major behavioral gaps.

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?

One short, front-loaded sentence with no filler. It is a fragment rather than a full sentence, but every word contributes and nothing is wasted.

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 read-only list tool with full schema coverage and no output schema, this is minimally adequate. However, since there are no annotations and no output schema, the description could have clarified the read-only nature and what the session/location fields contain; that omission is a clear but non-critical gap.

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% with a single optional 'vdom' parameter that the schema already documents with its default. The description adds no additional meaning about the VDOM parameter, so the baseline of 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 phrase 'Administrators currently logged in (GUI, SSH, API) and where from' names a specific resource (active admin sessions) and the login channels covered, which distinguishes it from siblings like list_sessions or get_system_status. It lacks an explicit verb, but the scope is unambiguous for a read-only listing.

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 on when to use this versus list_sessions, get_system_status, or other status-listing tools. The agent must infer the distinction from the description alone, with no stated conditions or exclusions.

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

list_app_categoriesB

Application-control categories (id and name), e.g. P2P, Proxy, Game, Video/Audio.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

B3.1/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 disclosure burden. It hints at the return shape (id and name) but says nothing about read-only safety, whether results are static or per-VDOM, pagination, or how the default VDOM affects output. For an unannotated tool this is a notable 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?

A single compact line that front-loads the resource and then the returned fields. No filler, no redundancy, and the examples earn their place by anchoring the domain.

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 read-only list tool with one optional parameter this is roughly adequate, and it does indicate the returned fields in lieu of an output schema. However, with no annotations and no usage guidance, an agent lacks enough context to know when this tool is the right call versus search_applications or list_app_control_profiles.

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 single optional 'vdom' parameter is already documented in the schema including its default. The description adds nothing beyond the schema, so the baseline of 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 names the resource ('application-control categories') and the fields returned (id and name), with concrete examples (P2P, Proxy, Game, Video/Audio) that make the domain unambiguous. It is clear what the tool surfaces, but it does not explicitly distinguish itself from nearby siblings such as search_applications or list_app_control_profiles, so it stops 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 statement of when to use this tool, when not to, or which sibling to prefer. An agent must infer that categories feed app-control profiles or rule creation from the name alone. No prerequisites or context are given.

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

list_app_control_profilesB

App-control profiles with their rules, showing application and category names instead of ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOnly this profile
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

B3.2/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 does disclose one genuinely useful behavioral trait — application and category names are resolved instead of raw ids — but says nothing about read-only safety, pagination, result size, or whether unset filters return everything.

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?

A single short clause with zero filler, and the name-resolution behavior is stated up front. It is arguably too terse rather than padded, so it loses a point only for under-specification rather than verbosity.

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 two-parameter, no-annotation, no-output-schema list tool, the description covers the core intent but omits return-shape expectations and the read-only nature. It is minimally adequate rather than 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 both parameters (name, vdom) are already documented in the schema, establishing a baseline of 3. The description adds no parameter-level detail such as what happens when name is omitted or how vdom defaults interact.

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 fragment names the exact resource (app-control profiles) and states what each entry contains (their rules), which is enough for an agent to distinguish it from siblings like add_app_control_rule or list_app_categories. It is a noun phrase with no explicit verb ('List') and does no explicit sibling routing, 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 when-to-use guidance, no mention of prerequisites, and no routing to alternatives such as add_app_control_rule or delete_app_control_rule. The only implicit signal is that it is a read operation, which the agent must infer from the name.

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

list_certificatesA

List local and CA certificates with key type and size, validity and usage flags. Certificates with RSA keys under 2048 bits are flagged weak: FortiGate-VM evaluation licenses generate 512-bit factory certificates. Bundled public CAs are omitted unless include_bundle is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
name_containsNoOnly certificates whose name contains this text
include_bundleNoInclude the ~150 bundled public CAs

TDQS

A4.1/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 delivers real behavioral context: RSA keys under 2048 bits are flagged weak, FortiGate-VM eval licenses produce 512-bit factory certs, and bundled public CAs are excluded by default. It does not cover permissions or result volume/pagination, keeping it below 5.

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 sentences, each carrying distinct information (output fields, weakness flagging with rationale, bundle default), and the core purpose is front-loaded. Slightly dense but free of filler.

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?

No output schema and no annotations, so the description must supply everything, and it does cover scope, returned attributes, and the notable default. Missing only error/permission behavior and result-size expectations for a large inventory call.

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 100% (baseline 3), and the description adds genuine meaning beyond it by disclosing the default-exclusion behavior of include_bundle and the size of the bundle (~150 CAs). The vdom and name_contains semantics are left entirely to 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 (List) and resource (local and CA certificates) and enumerates what is returned: key type/size, validity, usage flags. This clearly distinguishes it from the sibling download_certificate, which retrieves rather than enumerates.

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?

Usage context is implied rather than stated: the tool is for inspecting certificate inventory, and the include_bundle clause implies the default hides bundled CAs. There is no explicit when-to-use versus alternatives (e.g., download_certificate) or prerequisite guidance.

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

list_dhcp_leasesC

Current DHCP leases handed out by the FortiGate.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
resolve_vmsNoLabel IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*)

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 behavioral burden. 'List' implies a read-only operation, but nothing is said about scope, pagination, whether results are live or cached, or the effect of the resolve_vms flag. With zero structured safety hints, this is a substantial gap for a tool whose behavior is otherwise undocumented.

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?

A single efficient sentence with the resource front-loaded and no filler. It is arguably under-specified rather than padded, but structurally it is clean and wastes no 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?

For a simple two-parameter read tool with no output schema and complete schema coverage, the description is minimally adequate. It omits any note about the environment assumptions baked into the parameters (e.g. VDOM default, Proxmox credentials), leaving the agent to rely solely on the schema.

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 both parameters (vdom, resolve_vms) are already documented in the schema, including defaults and dependencies. The description adds no additional meaning about either parameter, 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 states a specific verb and resource ('Current DHCP leases handed out by the FortiGate'), which clearly identifies a read/list operation. It implicitly distinguishes itself from siblings like list_dhcp_servers (configuration) and delete_dhcp_reservation, but never explicitly names or contrasts 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 Guidelines2/5

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

There is no when-to-use guidance, no mention of prerequisites, and no routing to related tools such as list_dhcp_servers or add_dhcp_reservation. The agent is left to infer usage entirely from the noun phrase.

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

list_dhcp_serversB

List DHCP servers with their ranges, options and reservations.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

TDQS

B3.1/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. 'List' implies a read-only operation, but the description says nothing about pagination, permission/VDOM requirements, or whether the full server config is returned — significant gaps for an unannotated 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?

A single front-loaded sentence with no filler. Every word (verb, resource, returned sub-objects) 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?

With no output schema, the description partially compensates by naming the returned sub-objects, but it omits pagination behavior, result volume, and the effect of the filter/format parameters. Adequate but with clear gaps for a list 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 description coverage is 100% (vdom, filter, format all documented), so the baseline of 3 applies. The description's mention of 'ranges, options and reservations' describes return content rather than adding meaning to the parameters.

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 (List) and resource (DHCP servers) and names the sub-objects returned (ranges, options, reservations), which distinguishes it from siblings like list_dhcp_leases and update_dhcp_server. It stops short of explicitly naming alternatives, but the resource is unambiguous.

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 when-to-use guidance, no prerequisites, and no routing to alternatives such as list_dhcp_leases for active leases or update_dhcp_server for modifications. The agent must infer the use case 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.

list_dns_serversC

Interfaces where the FortiGate answers DNS queries, and in which mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)

TDQS

C2.4/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 behavioral burden. It does not state that this is a read-only list operation, whether it requires specific permissions, how vdom defaults behave, or what the response structure looks like beyond a brief hint about interfaces and mode.

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

Conciseness2/5

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

The description is a single fragment rather than a clear, front-loaded action statement. It is short but under-specified for an agent trying to understand the tool's operation and structure.

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 no annotations and no output schema, the description is the main source of behavioral context. It only vaguely describes returned content and omits usage context, read/write safety, and operational details, leaving significant 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% for the single vdom parameter, so the schema already documents the parameter including its default. The description adds no additional parameter meaning, which matches the baseline of 3 when schema coverage is high.

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 the resource being returned (interfaces where FortiGate answers DNS queries) and adds the mode detail, so the subject is identifiable. However, it is a noun phrase with no explicit verb indicating a list/retrieve operation, and it does not distinguish this tool from siblings such as get_dns_settings or list_dns_zones.

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 on when to use this tool versus alternatives like get_dns_settings, set_dns_server, or delete_dns_server. The description provides no context, prerequisites, or exclusions.

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

list_dns_zonesB

List local DNS zones (dns-database) with their records.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It does disclose a meaningful return trait — that zones come back with their records — but says nothing about read-only nature, pagination, filtering behavior, or result size limits.

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?

A single front-loaded sentence with zero filler; the resource and its scope are stated immediately and nothing is repeated from the schema or name.

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 three-parameter read-only list tool with fully documented params, the description covers purpose and rough return content. However, with no annotations and no output schema, it could have said more about the shape of the returned records and how the filter/format params affect the result.

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 vdom, filter, and format each documented in the schema including examples, so the schema does the heavy lifting. The description adds no additional parameter meaning beyond that 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?

States a specific verb and resource (list local DNS zones / dns-database) and adds scope ('with their records'), which distinguishes it from the nearby list_dns_servers and get_dns_settings siblings. It stops short of explicitly naming those siblings as alternatives, but the resource is unambiguous.

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 when-to-use guidance, no mention of the related tools (list_dns_servers, get_dns_settings, create_dns_zone) and no statement of prerequisites or scope conditions. The intended use is only implied by the verb 'List'.

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

list_firewall_policiesC

List IPv4 firewall policies in evaluation order.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

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 carries the full behavioral burden. It discloses the return ordering ('evaluation order'), which is genuinely useful, but says nothing about read-only nature, pagination, result volume, or auth requirements for a tool that can return many policies.

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?

A single front-loaded sentence with zero waste; the ordering constraint is stated immediately. It is arguably too terse to be a 5, since brevity here comes at the cost of behavioral 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?

For a no-annotation list tool with no output schema, the description is minimally adequate. It conveys scope and ordering but omits return-shape, pagination, and read-only reassurance, leaving gaps an agent must infer.

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%, with each parameter documented including filter-expression examples and a format field. The description adds nothing beyond the schema, so the baseline 3 is appropriate when structured fields do the heavy lifting.

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 (List) and resource (IPv4 firewall policies), plus a meaningful ordering detail ('evaluation order'). It is clearly distinguishable from the singular get_firewall_policy, though it does not explicitly name siblings to differentiate itself.

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 when-to-use guidance, no prerequisites, and no alternatives. 'IPv4' implicitly scopes it, but an agent gets no help deciding between this and get_firewall_policy or get_policy_stats.

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

list_interfacesB

List interface configuration (IP, mode, role, alias, allowaccess).

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

TDQS

B3.1/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. 'List' implies read-only, but there is no statement about permissions, whether results are paginated, or the default VDOM behavior, and no output schema exists to fill the 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?

A single front-loaded sentence with the verb, resource, and return fields, with zero 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?

Adequate for a read-only list tool with fully documented params and no output schema, but it omits anything about result volume, pagination, or how filter/format interact, which an agent invoking this against a firewall would benefit from.

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 vdom, filter, and format are already documented in the schema. The description's field list loosely maps to what format can select but adds no syntax beyond what the schema provides. 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?

States a specific verb (List) and resource (interface configuration) plus the fields returned. It is distinguishable from get_interface/update_interface by the enumeration verb, though it does not explicitly contrast with the singular get_interface sibling.

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 when-to-use guidance, no prerequisites, and no alternatives named. The agent is left to infer that this is for browsing all interfaces rather than fetching one via get_interface.

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

list_port_forwardsB

List virtual IPs (port forwards / static NAT) and the policies that use each one.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

TDQS

B3.1/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 behavioral burden. It implies a read operation by saying 'List' and mentions the cross-referenced policy output, but says nothing about pagination, result volume, permissions, or whether optional filters default to all VIPs. Significant gaps for a tool with zero annotation coverage.

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?

A single sentence with zero waste, front-loaded with the primary resource. It uses the parenthetical to clarify the domain-specific synonym, which is efficient use of space.

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 list tool with no output schema and no annotations, the description is minimally adequate: it names the resource and notes the policy cross-reference. However, it leaves return shape, volume, and filtering semantics entirely to the schema and inference, which is thin given the absence of structured behavioral metadata.

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 (vdom, filter, format) are already documented with examples. The description adds no parameter-level detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.

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 verb ('List') and resource ('virtual IPs (port forwards / static NAT)'), and clarifies the Fortinet terminology mapping. It also adds that each VIP is returned alongside the policies using it, which helps an agent anticipate scope. It does not explicitly differentiate from siblings like list_firewall_policies, so it stops 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 on when to use this versus alternatives (e.g., list_firewall_policies, get_firewall_policy, or the create/delete port-forward siblings). Usage is only implied by the name. No prerequisites or exclusions are stated.

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

list_service_groupsC

List service groups and their members.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

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. 'List' implies a read operation, but it says nothing about pagination, result size limits, VDOM scoping behavior, or whether member expansion can be expensive. For a zero-annotation tool this is a significant disclosure gap.

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?

A single short sentence with no filler, and the core action is front-loaded. It is arguably too terse rather than too verbose, but there is no wasted 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?

For a simple read-only list tool with no required parameters and a fully documented schema, this is minimally adequate. However, with no annotations and no output schema, the description should at least hint at the return shape (group names plus member lists) and any result-size caveats.

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 vdom, filter, and format all documented in the schema itself (including filter syntax examples). The description adds no parameter meaning beyond that, 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?

States a clear verb+resource ('List service groups') and adds scope by noting it also returns members. The resource name distinguishes it from siblings like list_services and list_address_groups, though it never explicitly contrasts itself with them.

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 when-to-use guidance, no prerequisites, and no mention of alternatives such as list_services (for individual services) or update_service_group. The agent must infer when this tool is appropriate.

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

list_servicesC

List custom firewall services (port definitions).

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

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 behavioral burden. Read-only is implied by 'List', but nothing is said about required permissions, VDOM defaults, pagination, result limits, or what fields are returned.

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?

A single front-loaded sentence with no filler; every word earns its place. It is arguably too terse for a tool with zero annotation coverage, but the structure itself is efficient.

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 read-only list tool with fully documented parameters and no output schema, the minimum viable information is present. However, with no annotations the description omits scoping behavior (VDOM) and result-size/pagination expectations that an agent would benefit from.

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 all three optional parameters (vdom, filter, format) documented with examples, so the schema does the heavy lifting. The description adds no parameter detail beyond the parenthetical defining 'services'.

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+resource ('List custom firewall services') and the parenthetical '(port definitions)' clarifies what a service is, implicitly separating it from the sibling list_service_groups. It does not explicitly name that alternative, but the scope is unambiguous.

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 when-to-use guidance, no mention of prerequisites (e.g. VDOM scoping), and no routing to alternatives like list_service_groups or list_firewall_policies. Usage is only implied by the verb 'List'.

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

list_sessionsC

Current firewall sessions, optionally filtered.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
countNoMaximum sessions to return (default 50)
dstaddrNoFilter by destination IP
dstportNoFilter by destination port
srcaddrNoFilter by source IP
policyidNoFilter by policy ID
resolve_vmsNoLabel IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*)

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 behavioral disclosure. 'Current' weakly implies a live snapshot read, but nothing is said about whether this is read-only, what a session record contains, whether results are paginated/truncated by the count default, or what permissions are required.

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?

One short sentence with no filler, and the resource is front-loaded. It is efficient, though the extreme brevity sits near the line between concise and under-specified for a tool with seven parameters.

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?

Seven all-optional parameters, no annotations, and no output schema, yet the description explains nothing about return contents, result limits, or the distinction between this and list_admin_sessions. For a tool of this surface area the description leaves substantial gaps.

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 every filter parameter (vdom, count, dstaddr, dstport, srcaddr, policyid, resolve_vms) is already documented in the schema. The description adds no filter syntax, combination semantics, or defaults beyond what the schema states, so the baseline 3 applies.

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?

Names the resource (firewall sessions) and implies a list verb, which is the minimum viable. However it is a bare noun phrase with no verb, and it does not distinguish itself from the nearby sibling list_admin_sessions, which an agent could easily confuse for the same thing.

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 statement of when to use this tool, when not to, or which alternatives exist (e.g. list_admin_sessions, get_top_traffic, get_logs). 'Optionally filtered' hints that filters exist but gives no guidance on choosing between the unfiltered and filtered modes.

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

list_ssl_ssh_profilesA

List SSL/SSH inspection profiles with the CA each one re-signs with. The built-in no-inspection, certificate-inspection and deep-inspection profiles are read-only; edit custom-deep-inspection or a copy instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

TDQS

A4/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 usefully discloses that built-in profiles are read-only and shouldn't be edited, which is real behavioral context beyond the name. However, it says nothing about pagination, result volume, or required permissions for listing across VDOMs.

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, zero filler. The purpose is front-loaded and the read-only caveat follows immediately, with no repetition of the name or title.

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 list tool with no output schema, the description covers purpose and the key editing caveat. It is nearly complete; only pagination/return-shape guidance is absent, which is minor at this complexity.

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 vdom, filter and format parameters are already fully documented in the schema. The description adds no parameter-level detail beyond what the structured fields provide, so the baseline of 3 applies.

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 ('List SSL/SSH inspection profiles') and adds the distinctive detail that the CA each profile re-signs with is included. It also implicitly differentiates from the sibling update_ssl_ssh_profile by pointing at what should be edited instead of these profiles.

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 the agent that the built-in no-inspection, certificate-inspection and deep-inspection profiles are read-only and that custom-deep-inspection or a copy should be edited instead. This is clear when-not guidance, though it doesn't name update_ssl_ssh_profile as the mutating alternative.

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

list_static_routesC

List configured static routes.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
filterNoFortiOS filter expression, e.g. name=@k3s (contains) or action==accept
formatNoOnly return these fields, '|'-separated, e.g. policyid|name|action

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. 'List' implies a read operation, but there's no statement about permissions required, pagination, return format, or scope defaults (the vdom default is only in the schema). The description adds nothing beyond the tautological verb-resource restatement.

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?

A single, front-loaded sentence with zero waste. It is appropriately sized for a simple list tool.

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 tool with no annotations and no output schema, the description is incomplete. It doesn't state the scope (vdom default), does not explain the filter parameter behavior, and does not describe the response shape. An agent cannot confidently call this without checking the schema and making assumptions about 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%, so the schema already documents vdom, filter, and format with examples. The description adds no parameter syntax or constraints beyond what the schema provides. Baseline 3 applies when schema does the heavy lifting.

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?

State a specific verb and resource: 'Configured static routes' is clearly what's listed. It distinguishes the tool from siblings like get_routing_table and create_static_route by naming the static route resource, but doesn't clarify the relationship to the existing routing table tool.

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. With siblings like get_routing_table and list_port_forwards, the agent must infer that 'static routes' are distinct configured entries versus the active routing table. No when-to-use or exclusion conditions are stated.

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

move_firewall_policyB

Move a policy before or after another one (policies match top-down).

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
afterNoPlace it after this policy ID
beforeNoPlace it before this policy ID
policyidYesPolicy ID to move

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden but only explains top-down matching. It omits whether before/after are mutually exclusive, what happens if neither is supplied, permission requirements, and whether the move is atomic or reversible.

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?

A single tight sentence with the action front-loaded and a useful clarifying clause appended; there is no filler or redundancy.

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 mutation tool with no annotations and no output schema, the description is minimally viable. It leaves open the key edge cases an agent must resolve (before/after exclusivity, neither-specified behavior, VDOM defaulting) that the schema alone does not settle.

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 four parameters are already documented, which sets the baseline at 3. The description reinforces that before/after are policy IDs but adds no mutual-exclusivity or conflict rules beyond the schema.

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 (move) and resource (firewall policy), and the parenthetical clarifies the domain semantics of ordering. It is distinguishable from update_firewall_policy or create_firewall_policy, though it does not name 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 Guidelines3/5

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

Usage is implied: reorder an existing policy relative to another. There is no explicit when-to-use vs alternatives guidance, and no note about prerequisites such as needing the target policy to exist or how this differs from update_firewall_policy.

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

search_applicationsA

Search application-control signatures by name (contains, case-insensitive) and/or category, e.g. query=YouTube or category=P2P. Returns id, name, category and risk.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
limitNoMaximum results (default 25)
queryNoText the application name contains
categoryNoCategory name or id, e.g. P2P, Proxy, Video/Audio

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 confirms a read-only search with case-insensitive substring matching and discloses the returned fields (id, name, category, risk), but says nothing about permissions, result caps, or pagination beyond the schema's limit default.

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 tight sentences: the search mechanics and examples come first, then the return shape. Every clause earns its place with 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?

For a 4-param read-only tool with no output schema, the description covers matching behavior, parameter combination, and the returned fields. It lacks any note on default/no-filter behavior or result-size implications, which would complete the picture.

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 100%, so the baseline is 3, but the description adds value beyond the schema by stating that name matching is case-insensitive and 'contains', and that query and category can be combined ('and/or'). vdom and limit semantics remain schema-only.

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 (search) and resource (application-control signatures), plus match modes (contains, case-insensitive) and examples. It reads as a filtered-list tool distinct from list_app_categories or list_app_control_profiles, though it never names those siblings explicitly.

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 examples (query=YouTube, category=P2P) imply when the tool is useful, but there is no explicit when-to-use guidance, no exclusions, and no routing to alternatives such as list_app_categories for browsing the full category set.

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

set_dns_serverA

Serve DNS on an interface. Modes: recursive (local zones first, then forward to the system resolvers), non-recursive (local zones only), forward-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNorecursive, non-recursive or forward-only
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
interfaceYesInterface, e.g. port2

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 behavioral burden. It usefully explains how each mode resolves DNS queries, but it omits whether the tool mutates configuration, what permissions are required, and how existing DNS settings are affected.

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 sentences with no filler. The purpose is front-loaded, and the mode semantics follow immediately.

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 no annotations and no output schema, the description should carry more operational context. It covers the purpose and mode behavior adequately, but leaves mutation status, required permissions, prerequisites, and sibling differentiation unstated.

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 real meaning for the mode parameter by explaining recursive, non-recursive, and forward-only behavior beyond the schema's bare value list.

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 action and resource: 'Serve DNS on an interface', and it lists the available modes. It does not explicitly distinguish this tool from siblings such as get_dns_settings or list_dns_servers, 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 Guidelines3/5

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

There is no explicit guidance on when to use this tool versus alternatives. The modes imply a configuration use case, but the agent must infer when to select this over get_dns_settings, list_dns_servers, or delete_dns_server.

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

update_addressC

Update a firewall address object.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqdnNoFQDN (instead of subnet or range)
nameYesAddress name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
end_ipNoRange end
subnetNoSubnet in CIDR (10.0.0.0/24) or 'ip mask' form; a host is /32
commentNoComment
start_ipNoRange start (use with end_ip instead of subnet)

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 behavioral burden, and it discloses almost nothing. It does not say whether this is a full replace or a partial merge, whether omitted fields are preserved or cleared, whether it is idempotent, or what permissions/VDOM scoping apply. The schema's 'extra' bag (arbitrary attributes merged into the request body) hints at merge semantics, but the description never confirms or explains this.

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?

A single front-loaded sentence with zero filler, so it is not bloated. It is arguably over-terse for a mutation tool with a nested 'extra' object, but on the conciseness axis it 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 an 8-parameter mutation tool with a nested free-form 'extra' object, no annotations, and no output schema, one sentence is not enough. The agent lacks any information about update semantics, error behavior, or VDOM handling that the structured fields do not supply.

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 every parameter (fqdn, subnet, start_ip/end_ip, comment, vdom, extra) is already documented in the schema. The description adds no parameter meaning beyond that, which is the expected baseline when the schema does the heavy lifting.

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 verb and resource ('Update a firewall address object'), which cleanly separates it from the sibling read/write variants like create_address, delete_address, and get_address. It stops short of naming the object type's scope (firewall address object on a FortiGate VDOM) or what 'update' covers, so it is clear but not maximally differentiating.

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 on when to use this versus create_address, delete_address, or update_address_group, and no stated prerequisites such as the object needing to exist or a VDOM context being required. The agent must infer all usage conditions 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.

update_address_groupB

Update an address group. members replaces the whole member list.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGroup name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
commentNoComment
membersNoComplete new member list

TDQS

B3.3/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 usefully discloses that 'members replaces the whole member list' — a real mutation-behavior detail — but says nothing about required permissions, whether the update is partial or full for other fields, idempotency, or error behavior on missing groups.

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 terse sentences, with the core action front-loaded and the replacement-semantics caveat immediately after. No wasted 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?

For a 5-parameter mutation tool with no annotations and no output schema, the description is thin: it omits permission/auth requirements, how 'extra' attributes interact with the request, and VDOM scoping behavior. The rich schema compensates for parameter documentation, but behavioral completeness is only minimally adequate.

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 name, vdom, extra, comment, and members (including 'Complete new member list'). The description's note on members adds emphasis but not meaning beyond the schema, so the baseline of 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?

States a specific verb and resource ('Update an address group'), which is clear and distinct from sibling operations like create_address_group or delete_address_group. However, it does not explicitly name or contrast with those siblings, so differentiation relies on the agent reading 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 Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives (e.g., use create_address_group for new groups). The only contextual hint is the replacement semantics of members, which is about mechanics rather than usage selection.

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

update_dhcp_serverB

Update a DHCP server. Note: vci_match=true makes the server answer only clients whose vendor class matches vci-string (FortiOS defaults to FortiSwitch/FortiExtender), which silently ignores ordinary clients.

ParametersJSON Schema
NameRequiredDescriptionDefault
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
domainNoDomain name handed to clients
statusNoenable or disable
server_idYesDHCP server id
vci_matchNoOnly answer clients matching vci-string
lease_timeNoLease time in seconds
dns_serviceNolocal (hand out the FortiGate itself), default (system DNS) or specify
default_gatewayNoGateway handed to clients

TDQS

B3.3/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, and it does disclose one genuinely non-obvious behavior: vci_match=true silently ignores ordinary clients and defaults to FortiSwitch/FortiExtender vendor classes. However, for a mutation tool it omits whether updates are partial or full-replace, permission requirements, and any response/error semantics.

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 tight sentences with the core purpose front-loaded and the caveat following. The warning is dense but earns its place; nothing is wasted.

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 9-parameter mutation tool with no annotations and no output schema, the description covers purpose and one behavioral gotcha but leaves patch-vs-replace semantics, permissions, and failure modes unaddressed. It is adequate but has clear 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema for vci_match by explaining the silent-ignore consequence and the FortiOS vendor-class defaults, effectively giving the vci-string semantics the schema omits.

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+resource ("Update a DHCP server"), which is unambiguous against siblings like list_dhcp_servers and add_dhcp_reservation. It does not explicitly contrast itself with any sibling, and no update sibling is called out, so it stops short of the top score.

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 never says when to use this tool versus alternatives, nor does it state prerequisites such as required server_id or permissions. The vci_match note is a caveat about behavior, not usage routing, so guidance is essentially absent.

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

update_firewall_policyA

Update a firewall policy. Only the fields given change; list fields are replaced, not appended.

ParametersJSON Schema
NameRequiredDescriptionDefault
natNoSource NAT to the outgoing interface IP
nameNoPolicy name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
actionNoaccept or deny
statusNoenable or disable
dstaddrNoDestination addresses or groups
dstintfNoDestination interfaces, e.g. [port1]
serviceNoServices, e.g. [HTTP, HTTPS] or [ALL]
srcaddrNoSource addresses or groups, e.g. [LAB-NET] or [all]
srcintfNoSource interfaces, e.g. [port2]
commentsNoComment
policyidYesPolicy ID
scheduleNoSchedule (default always)
av_profileNoAntivirus profile ('' to detach)
ips_sensorNoIPS sensor ('' to detach)
logtrafficNoall, utm or disable
utm_statusNoEnable security profiles on the policy. Turned on automatically when a profile is given
ssl_ssh_profileNoSSL/SSH inspection profile: no-inspection, certificate-inspection (hostname/cert visibility, no decryption) or deep-inspection / a custom profile (decrypts; clients must trust the CA)
application_listNoApplication control profile, e.g. default ('' to detach)
webfilter_profileNoWeb filter profile ('' to detach)

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 behavioral burden, and it does disclose a genuinely non-obvious trait: only supplied fields change and list fields are replaced rather than appended. However, it omits permission requirements, reversibility, and any confirmation that the change was applied, which a mutation tool with no annotation coverage should ideally state.

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, zero filler, with the core action and the most important merge-semantics caveat front-loaded. Nothing needs to be cut.

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 21-parameter mutation tool with a nested free-form "extra" object, no output schema, and no annotations, the description covers the essential merge behavior but leaves the agent guessing about return values and failure modes. It is adequate but not complete given the tool's complexity.

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 documents all 21 parameters (including enums-by-convention like "accept or deny" and detach semantics with ''). The description adds no per-parameter meaning beyond what the schema already provides, so the baseline of 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?

States a specific verb+resource ("Update a firewall policy") that cleanly distinguishes it from the create/delete/get/list/move siblings. It does not explicitly name the sibling boundaries, but the CRUD verb alone is unambiguous.

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?

Usage is implied by the name and the partial-update semantics, but there is no explicit when-to-use guidance, no statement of prerequisites (policy must already exist), and no routing to alternatives like create_firewall_policy when the policy is absent.

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

update_interfaceA

Update an interface. Changing the interface this server connects through (its IP, mode or allowaccess) can cut off API access, so double-check those changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNoAddress in CIDR form (10.0.0.1/24) or 'ip mask'
modeNoAddressing mode: static, dhcp or pppoe
nameYesInterface name, e.g. port2
roleNoRole: lan, wan, dmz or undefined
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
aliasNoAlias
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
statusNoup or down
allowaccessNoManagement access, e.g. [ping, https, ssh]
descriptionNoDescription

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 behavioral burden, and it does disclose one critical hazard: modifying connection-related fields can sever API access. However, it says nothing about partial-update semantics, whether omitted fields are preserved, permissions required, or reversibility.

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, tightly front-loaded with the action and followed by the one piece of genuinely non-obvious information. Nothing is wasted.

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 mutation tool with no annotations and no output schema, the description covers purpose and the key risk but leaves partial-update behavior, the 'extra' merge semantics, and vdom interaction to the schema alone. Adequate but with clear gaps for a tool this consequential.

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 ten parameters with formats and enum-like values. The description names only three fields (ip, mode, allowaccess) for the risk warning, adding no semantic detail beyond the schema. 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?

Specific verb+resource ('Update an interface'), clearly distinguishable from siblings like update_address or update_firewall_policy. It does not, however, explicitly differentiate from create/delete interface operations beyond the verb.

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 implies when caution is warranted (changing IP/mode/allowaccess risks cutting off API access), but it never states when to use this tool versus get_interface/list_interfaces or what prerequisites exist. Usage is implied rather than guided.

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

update_service_groupB

Update a service group. members replaces the whole member list.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGroup name
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
commentNoComment
membersNoComplete new member list

TDQS

B3.2/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 behavioral burden, and it does disclose one important trait: members is a wholesale replacement, not a merge. That is a genuinely useful destruction warning, but it largely restates the schema's "Complete new member list" and says nothing about permissions, reversibility, or how other fields behave.

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 purpose front-loaded and the replacement warning immediately after. Every word earns its place with no filler or repetition.

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 mutation tool with no annotations, no output schema, a nested free-form extra object, and a vdom scoping parameter that interacts with the environment default. The description should cover permissions, side effects, and what happens to unspecified fields, but it only handles the members case.

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 description's only parameter-level addition is the replacement semantics of members, which the schema already conveys; vdom, extra, and comment get no additional explanation.

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 ("Update a service group"), so the agent immediately knows this mutates an existing group object. It does not, however, distinguish itself from siblings like create_service_group or update_address_group, which the example rubric uses as the marker for 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?

The description offers no when-to-use guidance, no prerequisites, and no pointer to alternatives such as create_service_group for new groups. The update verb implies the context but nothing in the text states it.

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

update_ssl_ssh_profileB

Update an SSL/SSH inspection profile, e.g. the CA used to re-sign certificates during deep inspection. Clients must trust that CA, and FortiGate-VM evaluation licenses re-sign RSA sites with 512-bit keys regardless of the CA, which modern clients reject.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProfile name, e.g. custom-deep-inspection
vdomNoVDOM (default: FORTIGATE_VDOM, usually root)
extraNoExtra FortiOS attributes merged into the request body as-is (hyphenated keys)
canameNoCA certificate used to re-sign trusted sites
commentNoComment
untrusted_canameNoCA used to re-sign sites with untrusted certificates

TDQS

B3.2/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, and it does add a genuinely non-obvious behavioral caveat: clients must trust the chosen CA, and FortiGate-VM eval licenses re-sign RSA sites with 512-bit keys that modern clients reject. However, it omits permissions required, reversibility, and what happens to settings not supplied, so a mutation tool is only partially covered.

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 action is front-loaded in the first clause, and the second sentence delivers a high-value caveat. It is slightly verbose, but no sentence is wasted and both sentences earn their 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 6-parameter mutation tool with a nested 'extra' object, no output schema, and no annotations, the description covers CA semantics and one important caveat but omits return behavior, permission requirements, and how 'extra' is used. Adequate but with clear gaps for a full-coverage update 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 description coverage is 100%, so each parameter is already documented (caname, untrusted_caname, comment, vdom, extra). The description's mention of the re-signing CA conceptually reinforces caname but adds no syntax, constraints, or format detail beyond the schema; 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?

States a specific verb+resource ("Update an SSL/SSH inspection profile") and illustrates the kind of field it governs (the CA used to re-sign certificates during deep inspection). It doesn't explicitly contrast with list_ssl_ssh_profiles, but the read/write relationship is unambiguous from the names.

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 explicit when-to-use, when-not-to-use, or alternative-tool guidance. The description explains the CA concept but never tells the agent under what circumstances it should call this update rather than reading the profile or another tool.

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. 70 tool updatesv0.4.1
    • First observedactivate_vm_eval_license
    • First observedadd_app_control_rule
    • First observedadd_dhcp_reservation
    • First observedadd_dns_record
    • First observedbackup_config
    • First observedcreate_address
    • First observedcreate_address_group
    • First observedcreate_dns_zone
    • First observedcreate_firewall_policy
    • First observedcreate_port_forward
    • First observedcreate_service
    • First observedcreate_service_group
    • First observedcreate_static_route
    • First observeddelete_address
    • First observeddelete_address_group
    • First observeddelete_app_control_rule
    • First observeddelete_dhcp_reservation
    • First observeddelete_dns_record
    • First observeddelete_dns_server
    • First observeddelete_dns_zone
    • First observeddelete_firewall_policy
    • First observeddelete_port_forward
    • First observeddelete_service
    • First observeddelete_service_group
    • First observeddelete_static_route
    • First observeddownload_certificate
    • First observedforticonverter_setup_prompt
    • First observedfortigate_api
    • First observedget_address
    • First observedget_arp_table
    • First observedget_dns_settings
    • First observedget_firewall_policy
    • First observedget_interface
    • First observedget_interface_status
    • First observedget_license_limits
    • First observedget_license_status
    • First observedget_logs
    • First observedget_policy_stats
    • First observedget_resource_usage
    • First observedget_routing_table
    • First observedget_system_status
    • First observedget_top_traffic
    • First observedlist_address_groups
    • First observedlist_addresses
    • First observedlist_admin_sessions
    • First observedlist_app_categories
    • First observedlist_app_control_profiles
    • First observedlist_certificates
    • First observedlist_dhcp_leases
    • First observedlist_dhcp_servers
    • First observedlist_dns_servers
    • First observedlist_dns_zones
    • First observedlist_firewall_policies
    • First observedlist_interfaces
    • First observedlist_port_forwards
    • First observedlist_service_groups
    • First observedlist_services
    • First observedlist_sessions
    • First observedlist_ssl_ssh_profiles
    • First observedlist_static_routes
    • First observedmove_firewall_policy
    • First observedsearch_applications
    • First observedset_dns_server
    • First observedupdate_address
    • First observedupdate_address_group
    • First observedupdate_dhcp_server
    • First observedupdate_firewall_policy
    • First observedupdate_interface
    • First observedupdate_service_group
    • First observedupdate_ssl_ssh_profile

TDQS

B3.2/5.0

Scored across 70 tools

Disambiguation3/5

While many tools have distinct resource+action purposes, there is significant overlap in generic tools such as fortigate_api (which can do anything) and get_system_status/get_resource_usage/get_license_status all providing system-level info. Some naming like get_interface_status vs get_interface vs list_interfaces could confuse, though descriptions help.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (e.g., list_, get_, create_, update_, delete_), with a few exceptions like backup_config, activate_vm_eval_license, and fortigate_api which are action-oriented but still descriptive. Overall predictable.

Tool Count3/5

70 tools is heavy for a single MCP server, likely overwhelming for an agent and increasing selection complexity. It covers many FortiGate domains but may be better split into sub-servers by function.

Completeness5/5

The tool set provides comprehensive coverage across interfaces, policies, addresses, services, certificates, DNS, DHCP, routing, logs, and more. CRUD operations are present for most resources, with no obvious dead ends for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers