fortigate-mcp-server
Manages a FortiGate firewall through the FortiOS REST API, providing tools for firewall policies, NAT and port forwarding, DNS and DHCP, application control, inspection, live traffic, logs, and license limit checks.
Reads a k3s cluster to synchronize Kubernetes Ingress hostnames into FortiGate DNS records and keep firewall address objects aligned with cluster node IPs.
Synchronizes Kubernetes Ingress hostnames into FortiGate DNS records and keeps node IP address objects in sync with the cluster.
Reads a Proxmox VE host to enrich FortiGate leases, sessions, FortiView, and logs by mapping IPs and MACs to the names of the VMs behind them.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fortigate-mcp-serverShow me the current firewall policies and any port forwards"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 also audits the firewall's security, and it can reach every setting FortiOS has. 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. Licensed VMs and hardware units are supported too.
What makes it different
A security review in one call.
audit_hardeningchecks admin access, local-in policies, crypto and TLS settings, SSL VPN, logging, password policy, FortiGuard updates, policy protection and HA. It returns findings in the order to fix them and marks the fixes that could lock you out.audit_admin_accessandaudit_policy_protectiongo deeper on their areas, and checking against an advisory shows how to hunt for a published campaign with the same read-only tools.Every FortiOS setting, not just the common ones. Besides the dedicated tools,
search_api,describe_config,get_config,set_configandget_monitorwork from the FortiGate's own API schema, so Claude can find and change anything the firmware has (BGP, SD-WAN, IPsec, VDOMs).set_configvalidates every field against that schema and dry-runs first.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_limitsshows 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-matchsilently 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; TLS certificates are verified; tool arguments are checked against their schema before anything is sent; 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: fortigate-mcp
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-api2. 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@v1.1.3 fortigate-mcp-serverOn 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@v1.1.3 fortigate-mcp-server'TLS. The server verifies the FortiGate's certificate by default. A factory certificate won't pass, so either:
give the FortiGate an admin certificate from a CA you trust (
config system global→set admin-server-cert) whose name or IP matchesFORTIGATE_HOST, and setFORTIGATE_VERIFY_SSL=/path/to/your-ca.pemunless the CA is already in the system store; orin a lab only, set
FORTIGATE_VERIFY_SSL=false. The server then prints a warning at startup, and anyone on the network path can read the API token.
Trusting the FortiGate's own Fortinet_CA_SSL doesn't work on evaluation VMs: it has a 512-bit key, and Python rejects it as too weak.
{
"mcpServers": {
"fortigate": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ry-ops/fortigate-mcp-server@v1.1.3", "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-server3. 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?"
"Run a hardening audit and tell me what to fix first."
"Here's a Fortinet PSIRT advisory. Is this FortiGate affected, and do the logs show anything?"
"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:
Deploy. Download Fortinet's FortiGate-VM KVM image (the
.qcow2inside the.zipfrom 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.License. On the VM console, log in as
adminwith 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 runactivate_vm_eval_licensewith session auth (FORTIGATE_USERNAME/FORTIGATE_PASSWORD) and your FortiCloud account inFORTICLOUD_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.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_promptwithhide=trueturns it off.Build the lab network. Give port2 an address, then
set_dns_server,create_dns_zone,update_dhcp_serverandadd_dhcp_reservationfor DNS and DHCP, andcreate_firewall_policyfor egress and ingress.Name the apps.
k8s_sync_ingress_dnsturns 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 |
|
3 interfaces, 3 static routes | Counted by |
1 vCPU, 2 GB RAM |
|
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). |
On a licensed FortiGate
The same server works on licensed FortiGate-VMs and hardware units (ADR-0002). The tools read the license, apply the evaluation limits only on the evaluation license, and say which FortiGuard service is missing instead of failing with a 401.
get_license_featuresreports the edition, which FortiGuard services are licensed or expiring, and how old each signature database is.get_fortiguard_status,update_fortiguardandget_firmware_statusshow whether updates are actually arriving, refresh them, and list newer firmware with its upgrade path.get_log_targets,set_syslog_target,get_ha_status,list_fortitokensandset_admin_mfacover log shipping, HA clusters and administrator two-factor.list_security_profilesandaudit_policy_protectionshow which profiles policies really use, and flag WAN-facing traffic without IPS, profiles that never run, and profiles whose FortiGuard service has lapsed.The schema-driven tools (
search_api,describe_config,get_config,set_config,get_monitor) reach every setting the firmware has, including HA, VDOMs, SD-WAN and VPN.
Not yet verified on a licensed unit. These tools are tested against the evaluation VM and against fixtures built from FortiOS 7.6's schema. If you run a licensed FortiGate, a read-only run of
get_license_featuresandget_fortiguard_statuswith the output attached to an issue would help confirm them.
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=trueremoves stale records that point at ingress IPs.k8s_sync_node_addresses: keeps the address object your policies use (defaultK3S-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=trueonget_logs,list_sessions,get_top_trafficandlist_dhcp_leasesadds labels such assrcip_vm: "112 k3s-worker2 (qemu on pve01)".
Tools
92 tools in 15 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 |
| FortiGate model, serial, firmware version/build, hostname and uptime. |
| License and FortiGuard contract status. |
| How much of the license's object limits is used. |
| What this FortiGate is licensed for: free evaluation VM, licensed VM or hardware; whether it reaches FortiGuard; which FortiGuard services (IPS, antivirus, web filter, application control, Internet Service Database, FortiCloud logging...) are licensed, not licensed or expiring within 30 days; and the version and age of each signature database. |
| Current CPU, memory, disk and session usage. |
| List interface configuration (IP, mode, role, alias, allowaccess). |
| Get one interface's full configuration. |
| Live interface state: link, speed, IP and traffic counters. |
| Update an interface. |
| Administrators currently logged in (GUI, SSH, API) and where from. |
| Read-only audit of how the FortiGate can be administered: admins without trusted hosts or MFA, the default 'admin' account, API keys, HTTPS/SSH/HTTP/telnet admin access on WAN interfaces, local-in policies, and admin passwords still stored as legacy SHA-256 instead of PBKDF2. |
| Read-only hardening audit: everything audit_admin_access checks, plus admin access on LAN interfaces, local-in coverage, telnet, FortiCloud SSO, crypto and TLS settings, SSL VPN, logging (implicit deny, local-in denies, remote targets, cleartext syslog), password policy, NTP, FortiGuard updates and stale signatures, whether accept policies are protected by security profiles, and HA heartbeat hardening. |
| Back up the full running configuration (FortiOS CLI text) to a local file and return its path and size. |
| Show or hide the 'Migrate Config with FortiConverter' step of the GUI's FortiGate Setup popup. |
| 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). |
| High availability: the mode (standalone, active-passive, active-active), group, heartbeat interfaces and monitored interfaces, each cluster member with its role, priority and uptime, and whether members' configurations are in sync. |
| FortiTokens on the FortiGate (serial, status, license) and which administrators use two-factor authentication, by which method and token. |
| Turn on two-factor authentication for an administrator: fortitoken (needs an activated token serial), email (needs email_to and a working email server) or sms (needs sms_phone and SMS service); or disable it. |
Tool | What it does |
| Whether FortiGuard updates are actually reaching this FortiGate: connection state, each FortiGuard server's reachability and packet loss, the update schedule, which services are licensed, and how old each signature database is. |
| Ask the FortiGate to contact FortiGuard now and refresh its entitlements and signature packages (the GUI's 'Check update now'). |
| Running firmware (version, build, maturity, release notes), newer images FortiGuard offers, the supported upgrade path, and the automatic firmware upgrade settings. |
Tool | What it does |
| List IPv4 firewall policies in evaluation order. |
| Get one firewall policy. |
| Create a firewall policy. |
| Update a firewall policy. |
| Delete a firewall policy. |
| Move a policy before or after another one (policies match top-down). |
| Hit counts, bytes, packets and last-used time per policy. |
| Current sessions through the firewall, optionally filtered, with the matched and total session counts. |
| List firewall address objects. |
| Get one firewall address object. |
| Create a firewall address: a subnet/host, an IP range, or an FQDN. |
| Update a firewall address object. |
| Delete a firewall address (fails while a policy or group still uses it). |
| List firewall address groups and their members. |
| Create an address group. |
| Update an address group. members replaces the whole member list. |
| Delete an address group (fails while a policy still uses it). |
| List custom firewall services (port definitions). |
| Create a custom TCP/UDP service. |
| List service groups and their members. |
| Create a service group, e.g. K3S-MGMT = [SSH, K8S-API, PING]. |
| Update a service group. members replaces the whole member list. |
| Delete a service group (fails while a policy still uses it). |
| Delete a custom service (fails while a policy still uses it). |
Tool | What it does |
| List virtual IPs (port forwards / static NAT) and the policies that use each one. |
| Create a port forward (VIP): traffic arriving on extintf at extip:extport goes to mappedip:mappedport. |
| Delete a VIP. |
Tool | What it does |
| Search application-control signatures by name (contains, case-insensitive) and/or category, e.g. query=YouTube or category=P2P. |
| Application-control categories (id and name), e.g. P2P, Proxy, Game, Video/Audio. |
| App-control profiles with their rules, showing application and category names instead of ids. |
| Add a rule to an app-control profile matching applications and/or categories by name (or id). |
| Remove a rule from an app-control profile by its id (see list_app_control_profiles). |
Tool | What it does |
| Security profiles by kind (ips, antivirus, webfilter, dnsfilter, application, emailfilter, dlp, file-filter, waf, videofilter, ssh-filter, virtual-patch), each with the firewall policies that use it, and whether the FortiGuard service behind the kind is licensed (and what the profile can still do if not). |
| Check that accept policies are actually protected: traffic from or to a WAN interface with no IPS sensor, profiles attached while security profiles are disabled on the policy, antivirus/DLP/file filter with an inspection profile that can't see inside HTTPS, profiles whose FortiGuard service isn't licensed, and policies that don't log. |
Tool | What it does |
| List SSL/SSH inspection profiles with the CA each one re-signs with. |
| Update an SSL/SSH inspection profile, e.g. the CA used to re-sign certificates during deep inspection. |
| List local and CA certificates with key type and size, validity and usage flags. |
| 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 |
| Live FortiView summary of the sessions passing through right now, grouped by source, destination, application, country, interface, policy or protocol. |
| IPv4 ARP table: which MAC answers for which IP on each interface. |
Tool | What it does |
| Read FortiGate logs, newest first. |
| Where logs go: each syslog server (up to 4), FortiAnalyzer (up to 3), FortiGuard Cloud, local disk and memory, with transport and encryption. |
| Send logs to a syslog server: sets server, port and transport on one of the four syslog slots and enables it. mode is udp (default), reliable (TCP) or legacy-reliable; with reliable, enc_algorithm (high, high-medium, low) adds TLS. |
Tool | What it does |
| Active IPv4 routing table (connected, static, DHCP-learned and dynamic routes). |
| List configured static routes. |
| Add a static route. |
| Delete a static route by its sequence number (seq-num from list_static_routes). |
Tool | What it does |
| System DNS settings: upstream resolvers the FortiGate itself uses and forwards to. |
| Interfaces where the FortiGate answers DNS queries, and in which mode. |
| Serve DNS on an interface. |
| Stop serving DNS on an interface. |
| List local DNS zones (dns-database) with their records. |
| Create a local DNS zone. view=shadow serves internal clients. |
| Delete a local DNS zone and all its records. |
| Add a record to a local DNS zone. |
| Delete a record from a local DNS zone by its id (see list_dns_zones). |
| List DHCP servers with their ranges, options and reservations. |
| Current DHCP leases handed out by the FortiGate. |
| Update a DHCP server. |
| Reserve an IP for a MAC address on a DHCP server (the IP may sit outside the pool). |
| Remove a DHCP reservation by its id (see list_dhcp_servers). |
Tool | What it does |
| Read the Kubernetes cluster from K8S_KUBECONFIG: nodes with IPs and readiness, LoadBalancer services with their IPs (e.g. Traefik on k3s ServiceLB) and every Ingress or Traefik IngressRoute hostname. |
| 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. |
| Keep a FortiGate address object in step with the cluster's node IPs so policies follow the cluster. |
Tool | What it does |
| 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 |
| Find FortiOS API endpoints by keyword, from the FortiGate's own schema: configuration (cmdb, e.g. 'bgp' -> router/bgp) and live state (monitor, e.g. 'ha peer' -> system/ha-peer). |
| Describe a configuration endpoint from the FortiGate's schema: whether it is a table (many entries, keyed by mkey) or a single settings object, and each field's type, allowed values, range and default. |
| Read any configuration endpoint: a whole settings object, every entry of a table, or one entry by mkey. |
| Change any configuration endpoint, validated against the FortiGate's schema first: field names, option values, integer ranges, string lengths, and table vs single-object rules. action is update (default), create or delete. |
| Read any monitor (live state) endpoint, e.g. system/ha-peer, router/ipv4, vpn/ipsec, user/firewall. |
Tool | What it does |
| 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 |
| The client refuses every POST, PUT and DELETE before it reaches the FortiGate. The only exception is |
TLS verification | Certificates are verified by default ( |
Argument validation | Every tool call is checked against the tool's input schema before any request is made. |
Dry runs |
|
Confirmation |
|
Checks before writes |
|
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 JSONPOST /api/v2/authentication, and the CSRF cookie is namedccsrf_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 defaultassigntheipfield does not exist.New DHCP servers can default to
vci-matchfor FortiSwitch/FortiExtender vendor classes, which silently ignores ordinary clients.update_dhcp_servertakesvci_match=false.Local DNS zones cannot hold
*records.add_dns_recordrefuses them;k8s_sync_ingress_dnswrites 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 oldstatisticsis gone), sessions aremonitor/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/setwith{"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).Log filters fail silently. FortiOS ignores a comma OR across different fields (
dstip==X,dstport==Y) or an&in a filter, and returns unfiltered rows.event/<subtype>endpoints are not scoped to their subtype either.get_logsrefuses the bad filters and adds the subtype term itself. docs/threat-hunting.md shows how to check the FortiGate against a security advisory with the existing tools.
Configuration
Variable | Default | |
| (required) | Hostname or IP |
|
| HTTPS admin port |
| REST API admin token (recommended) | |
| Session login, used when no token is set (needed on an unlicensed VM) | |
|
| VDOM for every call (tools also take |
|
| Verify the TLS certificate: |
|
| Refuse every POST/PUT/DELETE before it reaches the FortiGate |
|
| Request timeout in seconds |
| Enables the Kubernetes tools | |
| Enables the Proxmox tools. | |
| Only for |
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@v1.1.3; 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.svgCI 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.
Related
proxmox-mcp-server: the Proxmox VE API as MCP tools, including
deploy_fortigate_vm.
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
Available Tools
88 toolsactivate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| confirm | Yes | Must be true: the FortiGate reboots | |
| is_government | No | Government account (default false) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| log | No | Log matches (default true) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| action | No | block, pass, monitor (default) or reset | |
| profile | Yes | Profile name, e.g. default | |
| position | No | top (default) or bottom | |
| categories | No | Category names or ids, e.g. [P2P, Proxy] | |
| applications | No | Application names or ids, e.g. [YouTube, BitTorrent] |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| ip | Yes | IP to reserve | |
| mac | Yes | Client MAC address | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| server_id | Yes | DHCP server id | |
| description | No | Description |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | ||
| ttl | No | ||
| ipv6 | No | ||
| type | No | A, AAAA, CNAME, MX, NS or PTR (default A) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| zone | Yes | Zone object name | |
| hostname | Yes | ||
| canonical_name | No | Target for CNAME records |
TDQS
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.
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.
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.
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.
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.
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.
audit_admin_accessA
Read-only audit of how the FortiGate can be administered: admins without trusted hosts or MFA, the default 'admin' account, API keys, HTTPS/SSH/HTTP/telnet admin access on WAN interfaces, local-in policies, and admin passwords still stored as legacy SHA-256 instead of PBKDF2. Returns findings graded critical/warn/info, each with a suggested fix. The hash check reads a config backup, which the FortiGate logs as a config download; set check_hashes=false to skip it.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| check_hashes | No | Check stored password hashes via a config backup (default true) |
TDQS
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 declares the operation read-only, discloses a genuine side effect (the hash check reads a config backup, which the FortiGate logs as a config download), and describes the return shape (findings graded critical/warn/info with a suggested fix). These are behavioral traits beyond any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the scope, followed by return shape, then the side-effect caveat with its opt-out. It is dense and long, but every sentence carries distinct information (checks, return format, side effect) rather than padding, so the length is earned by the tool's breadth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 supplies the return semantics (graded findings with suggested fixes). Both parameters are accounted for (vdom via schema, check_hashes via schema plus description detail), and the one non-obvious behavioral caveat is disclosed. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters (baseline 3). The description adds real semantic value beyond the schema by explaining the why and consequence of check_hashes (it triggers a logged config download) that the raw schema does not convey. The vdom parameter is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read-only audit of how the FortiGate can be administered') and then enumerates the exact checks (trusted hosts/MFA, default admin, API keys, WAN admin access, local-in policies, legacy SHA-256 hashes). The scope is clearly admin-access focused, distinguishing it from audit_hardening and audit_policy_protection, which an agent can infer even though they aren't named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides usage guidance for one parameter (set check_hashes=false to avoid the logged config download) but never says when to choose this audit over the sibling audits (audit_hardening, audit_policy_protection). Usage context is implied by the enumerated checks rather than explicitly framed as when/when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_hardeningA
Read-only hardening audit: everything audit_admin_access checks, plus admin access on LAN interfaces, local-in coverage, telnet, FortiCloud SSO, crypto and TLS settings, SSL VPN, logging (implicit deny, local-in denies, remote targets, cleartext syslog), password policy, NTP, FortiGuard updates and stale signatures, whether accept policies are protected by security profiles, and HA heartbeat hardening. Each finding carries the order to fix it in and whether the fix can cut off admin access, and fix_plan lists them in that order. On the evaluation license it lists the FortiGuard features that don't apply and what to rely on instead. check_hashes reads a config backup, as in audit_admin_access.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| check_hashes | No | Check stored password hashes via a config backup (default true) |
TDQS
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 well: it declares read-only behavior, that each finding carries a fix order and a 'can cut off admin access' warning, that fix_plan lists them in that order, and how behavior differs on the evaluation license. It omits permission/authentication requirements, which is the main remaining gap for a tool of this scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before the enumeration, and every clause names a concrete check area rather than filler. The single very long sentence and dense comma-list make it less scannable than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 convey return shape, and it does: per-finding remediation ordering, the admin-cutoff flag, the fix_plan ordering, and license-specific annotations. For a two-param read-only audit, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two parameters, so the schema already documents vdom and check_hashes. The description adds a modest clarification that check_hashes reads a config backup 'as in audit_admin_access', but nothing beyond baseline for vdom.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read-only hardening audit') and then enumerates the exact check areas covered, from local-in and telnet through HA heartbeat. It explicitly positions itself relative to the sibling audit_admin_access ('everything audit_admin_access checks, plus...'), so an agent can tell which audit tool is the superset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'everything audit_admin_access checks, plus...' framing implies this is the comprehensive option versus the narrower sibling, and the eval-license note gives a situational caveat. It does not, however, explicitly state when NOT to use it or name audit_policy_protection as the narrower alternative for policy-profile checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_policy_protectionA
Check that accept policies are actually protected: traffic from or to a WAN interface with no IPS sensor, profiles attached while security profiles are disabled on the policy, antivirus/DLP/file filter with an inspection profile that can't see inside HTTPS, profiles whose FortiGuard service isn't licensed, and policies that don't log. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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 key trait ('Read-only') plus the precise detection semantics that determine what the tool reports. It does not mention permission requirements or rate behavior, but the safety profile and detection scope are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The check scope is front-loaded and the long enumerated clause is dense but each item earns its place by telling the agent what the audit surfaces. 'Read-only' is efficiently separated at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema audit tool, the description conveys enough about scope and detection targets for correct invocation. It could say more about what the results look like, but the coverage of what is audited is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the only parameter (vdom) is fully documented in the schema, including its default. The description adds nothing about the vdom parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and resource ('accept policies are actually protected') and then enumerates the exact misconfigurations it detects (WAN traffic without IPS, disabled profiles, HTTPS-blind inspection, unlicensed FortiGuard, missing logging). This clearly distinguishes it from sibling audit tools like audit_admin_access and audit_hardening.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool's role (security-posture auditing of firewall policies) and flags 'Read-only', but never states when to reach for it versus the other audit tools or list_firewall_policies/get_policy_stats. Usage must be inferred from scope rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| output_path | No | File to write (default ./fortigate-<hostname>-<timestamp>.conf) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fqdn | No | FQDN (instead of subnet or range) | |
| name | Yes | Address name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| end_ip | No | Range end | |
| subnet | No | Subnet in CIDR (10.0.0.0/24) or 'ip mask' form; a host is /32 | |
| comment | No | Comment | |
| start_ip | No | Range start (use with end_ip instead of subnet) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| comment | No | Comment | |
| members | Yes | Member address names |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Default TTL in seconds (default 300) | |
| name | Yes | Zone object name, e.g. lab | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| view | No | shadow (internal, default) or public | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| domain | Yes | Domain, e.g. lab or lab.home.arpa | |
| records | No | Initial records | |
| authoritative | No | Answer NXDOMAIN for unknown names in the zone (default true) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| nat | No | Source NAT to the outgoing interface IP | |
| name | Yes | Policy name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| action | No | accept or deny | |
| status | No | enable or disable | |
| dstaddr | Yes | Destination addresses or groups | |
| dstintf | Yes | Destination interfaces, e.g. [port1] | |
| service | Yes | Services, e.g. [HTTP, HTTPS] or [ALL] | |
| srcaddr | Yes | Source addresses or groups, e.g. [LAB-NET] or [all] | |
| srcintf | Yes | Source interfaces, e.g. [port2] | |
| comments | No | Comment | |
| policyid | No | Policy ID (optional; FortiOS picks the next free ID) | |
| schedule | No | Schedule (default always) | |
| av_profile | No | Antivirus profile ('' to detach) | |
| ips_sensor | No | IPS sensor ('' to detach) | |
| logtraffic | No | all, utm or disable | |
| utm_status | No | Enable security profiles on the policy. Turned on automatically when a profile is given | |
| ssl_ssh_profile | No | SSL/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_list | No | Application control profile, e.g. default ('' to detach) | |
| webfilter_profile | No | Web filter profile ('' to detach) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | VIP name, e.g. VIP-TRAEFIK-HTTPS | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extip | No | External IP (default 0.0.0.0 = the extintf's own address) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| comment | No | Comment | |
| extintf | Yes | Interface the traffic arrives on, e.g. port1 | |
| extport | Yes | External port or range, e.g. 8443 | |
| mappedip | Yes | Internal IP or range a-b, e.g. 192.168.150.10 or 192.168.150.10-192.168.150.12 | |
| protocol | No | tcp (default), udp or sctp | |
| mappedport | No | Internal port or range (default: same as extport) | |
| attach_to_policy | No | Add this VIP to an existing policy's destinations (recommended) | |
| replace_destinations | No | With attach_to_policy: replace the policy's ordinary-address destinations with this VIP |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Service name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| comment | No | Comment | |
| tcp_portrange | No | TCP ports, e.g. '6443' or '8000-8080 9000' | |
| udp_portrange | No | UDP ports |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| comment | No | Comment | |
| members | Yes | Service or group names |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dst | Yes | Destination in CIDR (10.1.0.0/16) or 'ip mask' form; 0.0.0.0/0 for default | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| device | Yes | Outgoing interface, e.g. port1 | |
| comment | No | Comment | |
| gateway | No | Next-hop IP | |
| distance | No | Administrative distance (default 10) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Address name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Rule id | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| profile | Yes | Profile name |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Reservation id | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| server_id | Yes | DHCP server id |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record id | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| zone | Yes | Zone object name |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| interface | Yes | Interface |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Zone object name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| policyid | Yes | Policy ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | VIP name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| detach | No | Remove the VIP from policies first (default false) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Service name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| seq_num | Yes | Route sequence number |
TDQS
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.
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.
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.
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.
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.
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.
describe_configA
Describe a configuration endpoint from the FortiGate's schema: whether it is a table (many entries, keyed by mkey) or a single settings object, and each field's type, allowed values, range and default. Pass field for one field in full, including the sub-fields of a nested table.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| field | No | One field to describe in full (optional) | |
| endpoint | Yes | e.g. router/bgp, log.syslogd/setting, firewall/local-in-policy |
TDQS
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 essential behavioral trait: this is a read-only schema introspection whose response varies in shape (table keyed by mkey vs. single settings object) and expands nested sub-fields when 'field' is supplied. It stops short of stating permission requirements, behavior for an unknown endpoint, or output size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and then the drill-down behavior. The first sentence is dense with enumerated return content, but every clause contributes and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must explain results, and it does: response shape, field metadata, and nested expansion. Gaps remain around missing/unknown endpoint handling and any privilege or VDOM scoping caveats, but for an introspection tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so endpoint and vdom semantics are already documented in the schema; baseline is 3. The description adds a modest amount for 'field' — that it returns the field in full including nested sub-fields — but gives no guidance on accepted endpoint path syntax beyond the schema's examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Describe a configuration endpoint from the FortiGate's schema") and immediately clarifies what the answer contains: table vs. single settings object, plus field type/values/range/default. This implicitly separates it from value-returning siblings like get_config, but it never names or contrasts 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this to inspect the schema of an endpoint before reading or writing config, and pass 'field' to drill into one field. There is no explicit when-to-use/when-not or reference to alternatives such as get_config (current values), set_config (mutation), or search_api (discovery), leaving the routing decision to inference.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Certificate name, e.g. Fortinet_CA_SSL | |
| type | No | local-ca (default), local-cer, remote-cer, ca or crl | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hide | No | true hides the step, false shows it again; omit to read | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON body for POST/PUT | |
| path | Yes | e.g. /api/v2/cmdb/system/global or /api/v2/monitor/system/ha-peer | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| method | Yes | GET, POST, PUT or DELETE | |
| params | No | Query parameters |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Address name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| interface | No | Only this interface, e.g. port2 |
TDQS
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.
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.
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.
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.
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.
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_configA
Read any configuration endpoint: a whole settings object, every entry of a table, or one entry by mkey. Password and key fields are shown as '', never their values.
| Name | Required | Description | Default |
|---|---|---|---|
| mkey | No | Entry key for a table endpoint (optional) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action | |
| endpoint | Yes | e.g. system/global, router/static, user/local |
TDQS
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 genuinely non-obvious behavior — password and key fields are returned as '<set>' rather than values — which is valuable beyond the schema. However it says nothing about permissions/authentication, output size or pagination, error behavior, or explicitly that the operation is read-only and non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the core capability (read any config endpoint, three modes) front-loaded and the redaction caveat appended where it is most useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generic config pass-through tool with no output schema and no annotations, the description covers the essential scope and the redaction behavior. It stops short of describing result envelope shape or whether large tables are truncated/paginated, which would help an agent plan calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (endpoint, mkey, vdom, filter, format) are already documented in the schema; baseline 3 applies. The description only restates the mkey idea ('one entry by mkey') without adding syntax, defaulting, or interaction rules among filter/format/vdom.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') plus a broad resource ('any configuration endpoint') and enumerates the three read shapes (whole settings object, full table, single entry by mkey). This clearly separates it from set_config and describe_config among its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb and the three enumerated shapes, but there is no explicit when-to-use guidance and no mention of the neighboring siblings (describe_config for schema, set_config for writes, get_monitor for runtime data). The agent must infer the boundary.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| policyid | Yes | Policy ID |
TDQS
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.
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.
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.
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.
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.
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_firmware_statusA
Running firmware (version, build, maturity, release notes), newer images FortiGuard offers, the supported upgrade path, and the automatic firmware upgrade settings. Images and upgrade paths come from FortiGuard, so the evaluation license lists none; check https://www.fortiguard.com/psirt for the running release by hand there.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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 meaningful trait: images and upgrade paths are sourced from FortiGuard, so an eval license returns none, with a psirt URL for manual lookup. It does not state read-only nature, permissions, or rate limits, so disclosure is partial rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, both earning their place: the first front-loads the returned data, the second carries the eval-license caveat and the manual-check pointer. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description itself enumerates the returned fields and the key edge case (eval license producing empty image lists), which is enough for an agent to call and interpret it. It could go further on read-only/authorization context, but for a one-parameter status readout it is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 with its default documented, so the schema does the heavy lifting and baseline 3 applies. The description adds no syntax or format detail about vdom beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb-and-resource readout, enumerating exactly what is returned: running version/build/maturity/release notes, newer FortiGuard images, supported upgrade path, and auto-upgrade settings. Purpose is unambiguous, though it never distinguishes itself from close siblings like get_fortiguard_status or get_system_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (check the firmware status) but there is no explicit when-to-use vs. when-not, and no routing to alternative tools such as get_fortiguard_status. The one conditional hint — evaluation licenses list no images — is genuinely useful but is a data caveat rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fortiguard_statusA
Whether FortiGuard updates are actually reaching this FortiGate: connection state, each FortiGuard server's reachability and packet loss, the update schedule, which services are licensed, and how old each signature database is. Adds findings for failing servers, stale signatures on licensed services and a disabled update schedule. On the free evaluation license it says that FortiGuard is unavailable by design.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that it synthesizes findings (failing servers, stale signatures, disabled schedule) and explains an edge case (free eval license reports FortiGuard unavailable by design). It does not state auth requirements or whether live queries make the call slow, which are the remaining gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every clause corresponds to real output content, so little is wasted despite the dense, semicolon-heavy sentence. It is on the long side but earns its length through specificity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must explain returns, and it does comprehensively — enumerating the fields reported and the derived findings. Nothing an agent needs to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (vdom) with 100% schema description coverage, so the schema fully documents it. The description adds no extra meaning about the vdom argument, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states precisely what the tool reports: FortiGuard connection state, per-server reachability and packet loss, update schedule, licensed services, and signature database age. It reads as a status/read tool, implicitly distinct from the mutating sibling update_fortiguard. It never explicitly names a sibling to differentiate, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus update_fortiguard, get_license_status, or get_firmware_status, all of which live nearby. The description covers content, not invocation context, so the agent must infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ha_statusA
High availability: the mode (standalone, active-passive, active-active), group, heartbeat interfaces and monitored interfaces, each cluster member with its role, priority and uptime, and whether members' configurations are in sync. Flags out-of-sync members, unencrypted or unauthenticated heartbeats, a single heartbeat interface and no session pickup.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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 real work: it discloses the anomaly-flagging behavior (out-of-sync members, unencrypted/unauthenticated heartbeats, single heartbeat interface, no session pickup), which tells the agent what negative results mean. It does not state that the call is strictly read-only, nor any auth/rate-limit constraints, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences: the first enumerates returned fields, the second the warning flags. It is front-loaded ('High availability: the mode...') and free of filler, though the first sentence is a very long list that could be structured more scannably.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 describe returns — and it does so thoroughly, including diagnostic flags an agent would otherwise misinterpret. The only real gap is absent usage/prerequisite guidance for a status tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the single vdom parameter is fully documented in the schema with its default and meaning. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (HA cluster state) and enumerates exactly what it reports: mode, group, heartbeat/monitored interfaces, member roles/priorities/uptime, and sync state. This clearly separates it from siblings like get_system_status or get_interface_status, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The text is entirely about what the tool returns; it gives no when-to-use framing, no prerequisites, and no alternative tools for related diagnostics (e.g., get_system_status). Usage is only implied by the tool name and content.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Interface name, e.g. port1 | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| interface | No | Limit to one interface (optional) |
TDQS
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.
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.
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.
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.
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.
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_featuresA
What this FortiGate is licensed for: free evaluation VM, licensed VM or hardware; whether it reaches FortiGuard; which FortiGuard services (IPS, antivirus, web filter, application control, Internet Service Database, FortiCloud logging...) are licensed, not licensed or expiring within 30 days; and the version and age of each signature database. Tools that need a FortiGuard service check this and say so when it's missing.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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 the substance of the operation: the license mode, FortiGuard reachability, per-service licensed/not-licensed/expiring status, a 30-day expiry window, and database versions and ages. It stops short of stating read-only/side-effect-free behavior or any permission requirements, but for a read tool the disclosed output scope is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense, front-loaded sentence covers the purpose and contents, followed by a short usage note. The FortiGuard service enumeration is long but each item is informative rather than padding, and the key point (license entitlements) leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must describe the return payload, and it does so thoroughly enough for an agent to know what it will receive. Minor gaps remain: no mention of the vdom parameter's effect or the fact that the call is a safe read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 itself with a default. The description adds nothing about vdom scope or defaults, so the baseline 3 for schema-covered parameters applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource pair (get license/feature entitlements) and enumerates exactly what is reported: VM vs hardware licensing, FortiGuard reachability, per-service license state, and signature DB version/age. It is clearly distinct from a generic status read, though it never explicitly contrasts itself with 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence ('Tools that need a FortiGuard service check this and say so when it's missing') gives useful context about how the tool is consumed, but it describes its role in a workflow rather than telling the agent when to call it versus get_license_status or get_fortiguard_status. No explicit when/when-not or alternative routing is provided.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Return every entitlement (default false) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Rows to return (default 50, max 1000) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| start | No | Offset for paging (default 0) | |
| fields | No | Only return these fields per row, e.g. [date, time, srcip, dstip, hostname, app, action] | |
| filter | No | FortiOS log filter, e.g. srcip==192.168.150.10 or hostname=@github. A comma ORs values of one field (dstport==4332,dstport==4432); pass a list to AND terms ([srcip==10.0.0.5, dstport==443]). | |
| source | No | memory (default), disk, fortianalyzer or forticloud | |
| log_type | Yes | One 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_vms | No | Label IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*) |
TDQS
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 two non-obvious behaviors: results are ordered newest-first, and on FortiGate-VMs without a log disk, logs live only in memory and are lost on reboot. It does not cover pagination semantics or required permissions, but the retention caveat is genuinely useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and ordering, then a compact catalog of log types, then the retention caveat. The type enumeration is long but each entry carries differentiating information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All 8 parameters are documented in the schema and there is no output schema to explain, so the description only needs to add orientation. It supplies result ordering, log-type meaning, and a deployment caveat; the main gap is paging behavior (start/rows) and any authorization requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description earns a bump by explaining what several log_type values actually contain ('traffic/forward' = sessions through policies with app identification; 'app-ctrl' = per-connection app and HTTPS hostname under certificate inspection). This adds meaning beyond the bare enum list in the schema, and the memory/disk remark contextualizes the 'source' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 the ordering convention ('newest first'), which tells an agent exactly what comes back. It never names a sibling (e.g. get_log_targets, which configures destinations rather than reading), so the differentiation from the many list_/get_ siblings is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains which log types are 'useful' and what each contains, which implicitly guides log_type selection, but it never states when to reach for get_logs versus related tools like get_log_targets, list_sessions, or audit_admin_access. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_log_targetsB
Where logs go: each syslog server (up to 4), FortiAnalyzer (up to 3), FortiGuard Cloud, local disk and memory, with transport and encryption. Flags logs that only live in memory (lost on reboot), syslog sent as cleartext UDP, and FortiAnalyzer without certificate verification.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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 substantive behavioral context: it surfaces risk flags such as memory-only logs lost on reboot, cleartext UDP syslog, and FortiAnalyzer without certificate verification. However, it never states that this is a read-only operation, nor does it mention permissions or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the primary answer ('where logs go') before listing destinations and risk flags. No filler, though the warning clauses make it slightly long for one sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must describe the return content, and it does so reasonably well — destination types, transports, encryption, and notable warnings. It is nearly complete, missing only read-only/auth framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 fully documented in the schema, so the description provides no additional parameter 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('where logs go') and enumerates the destinations returned (syslog servers, FortiAnalyzer, FortiGuard Cloud, local disk/memory) with transport and encryption context. This clearly distinguishes it from siblings like get_logs and set_syslog_target, though it never names those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives such as get_logs (retrieve log data) or set_syslog_target (configure destinations). Usage is only implied by 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_monitorA
Read any monitor (live state) endpoint, e.g. system/ha-peer, router/ipv4, vpn/ipsec, user/firewall. Only endpoints FortiOS serves with GET are allowed: monitor POST endpoints act on the device (reboots, disconnects, updates), so they stay in the dedicated tools or fortigate_api.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| params | No | Query parameters the endpoint documents (see search_api) | |
| endpoint | Yes | e.g. system/ha-peer or system/available-certificates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden. It usefully discloses that this is a read-only path and that POST monitor endpoints cause device actions (reboots, disconnects, updates), which is genuinely valuable risk context. However, it says nothing about authentication requirements, rate limits, pagination, or error behavior for the GET endpoints it does allow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core capability before the constraint. Every clause earns its place: the examples establish scope, and the reboots/disconnects/updates parenthetical justifies the POST exclusion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 could say more about what live-state data comes back, but for a generic endpoint proxy that is inherently endpoint-specific. Parameters are schema-covered and the GET/POST boundary is covered, leaving only return-format and multi-request behavior unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so vdom, params, and endpoint are already documented in the schema. The description only reinforces endpoint examples (system/ha-peer, router/ipv4) already implied by the schema's examples, adding little syntax or format detail beyond it. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and a specific resource (any monitor / live-state endpoint) and names its scope with concrete examples (system/ha-peer, router/ipv4, vpn/ipsec, user/firewall). It also distinguishes itself from siblings by routing POST monitor endpoints to the dedicated tools or fortigate_api.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when NOT to use it: endpoints FortiOS only serves with POST belong to dedicated tools or fortigate_api. That is a clear usage boundary. It doesn't spell out when to prefer a dedicated read tool (e.g. get_system_status) over this generic one, which keeps it from a 5.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| policyid | No | Limit to one policy (optional) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| count | No | Rows to return (default 10) | |
| dstaddr | No | Only sessions to this IP | |
| sort_by | No | bytes (default), sessions, bandwidth or packets | |
| srcaddr | No | Only sessions from this IP | |
| policyid | No | Only sessions matched by this policy | |
| report_by | No | source, destination (default), application, country, interface, policy or protocol | |
| resolve_vms | No | Label IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only this profile | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| name_contains | No | Only certificates whose name contains this text | |
| include_bundle | No | Include the ~150 bundled public CAs |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| resolve_vms | No | Label IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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_fortitokensA
FortiTokens on the FortiGate (serial, status, license) and which administrators use two-factor authentication, by which method and token. Tokens are activated through FortiGuard, so the evaluation license has none.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
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 a useful operational caveat — tokens come from FortiGuard so the evaluation license has none — which explains empty results. However, it never confirms the operation is read-only, mentions no auth/permission requirements, and says nothing about pagination or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the returned data front-loaded and the FortiGuard caveat as a secondary note. No filler text; every sentence contributes information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 a single fully-documented parameter, the description adequately conveys what is returned and adds a caveat about eval-license token absence. No output schema exists, so a brief return-value sketch would have helped, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the vdom parameter is fully documented in the schema (default FORTIGATE_VDOM, usually root). The description adds no parameter context, which is the expected baseline when the schema already covers it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (FortiTokens) and the fields returned (serial, status, license) plus the related admin 2FA data (method, token). It is clear what the tool lists, though it does not explicitly name a sibling to disambiguate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content — an agent would call this to inspect FortiToken inventory and admin MFA configuration. There is no explicit when-to-use framing, no alternative tools named, and no conditions or prerequisites stated.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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_security_profilesA
Security profiles by kind (ips, antivirus, webfilter, dnsfilter, application, emailfilter, dlp, file-filter, waf, videofilter, ssh-filter, virtual-patch), each with the firewall policies that use it, and whether the FortiGuard service behind the kind is licensed (and what the profile can still do if not). Read or change a profile's settings with get_config / set_config on the endpoint shown.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | One kind only (optional), e.g. ips | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and does well: it discloses that results include the policies consuming each profile and the FortiGuard licensing state, including fallback behavior when unlicensed. It stops short of describing pagination, default scope beyond vdom, or output format, but adds genuine context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and result contents, followed by a routing instruction. Dense but every clause earns its place; the long parenthetical kind list is the only slight bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 is responsible for explaining returns and does so (profiles, consuming policies, license status). With vdom default noted in the schema and the modification path named, an agent has enough to call it correctly, though cross-references to related profile-list tools are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 enriches the 'kind' parameter by enumerating all twelve accepted values (ips, antivirus, webfilter, dnsfilter, application, emailfilter, dlp, file-filter, waf, videofilter, ssh-filter, virtual-patch), which the schema only hints at with 'e.g. ips'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Security profiles by kind") and enumerates the kinds covered, so an agent immediately knows this is the listing tool for security profiles. It also states what the result includes (using firewall policies, FortiGuard license state), though it does not explicitly name a 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear read-vs-change fork: use this tool to list/inspect, and route to get_config / set_config to read or change settings. That is actionable routing, but it does not state when to prefer this over e.g. describe_config or list_ssl_ssh_profiles.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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_sessionsA
Current sessions through the firewall, optionally filtered, with the matched and total session counts. Sessions to the FortiGate itself (admin GUI/API) may be counted but not listed.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| count | No | Maximum sessions to return (default 50) | |
| dstaddr | No | Filter by destination IP | |
| dstport | No | Filter by destination port | |
| srcaddr | No | Filter by source IP | |
| policyid | No | Filter by policy ID | |
| resolve_vms | No | Label IPs/MACs with the Proxmox VM that owns them (needs PROXMOX_*) |
TDQS
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 useful behavior: the response carries matched and total counts, and FortiGate-self sessions are counted but omitted from the listing. However, it says nothing about read-only nature, pagination/truncation behavior beyond the count default, or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and followed by the one genuinely surprising edge case. No filler, though the first sentence is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description partially compensates by stating the result includes matched and total session counts. For a risk-free list tool with fully documented parameters, that is nearly sufficient; only the exact result shape and any limit behavior remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 seven parameters (vdom, count, dstaddr, dstport, srcaddr, policyid, resolve_vms). The description adds only the general notion of optional filtering and no syntax, format, or interaction detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (current sessions through the firewall) and the scope of the result (matched and total session counts). The caveat that FortiGate admin sessions may be counted but not listed implicitly separates it from list_admin_sessions, but it never names that sibling, so the differentiation is indirect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'optionally filtered' implies how the tool is used but gives no explicit when-to-use, when-not-to-use, or named alternative. The admin-session caveat is a scoping note, not routing guidance, leaving the agent to infer when this is preferable to list_admin_sessions or get_top_traffic.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| filter | No | FortiOS filter expression, e.g. name=@k3s (contains) or action==accept | |
| format | No | Only return these fields, '|'-separated, e.g. policyid|name|action |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| after | No | Place it after this policy ID | |
| before | No | Place it before this policy ID | |
| policyid | Yes | Policy ID to move |
TDQS
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.
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.
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.
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.
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.
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_apiA
Find FortiOS API endpoints by keyword, from the FortiGate's own schema: configuration (cmdb, e.g. 'bgp' -> router/bgp) and live state (monitor, e.g. 'ha peer' -> system/ha-peer). Use it to reach any setting no dedicated tool covers, then describe_config, get_config, set_config or get_monitor.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | cmdb, monitor or both (default both) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| limit | No | Maximum results (default 20) | |
| query | Yes | Keywords, e.g. 'ospf area', 'syslog', 'ipsec phase1' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden, and it does disclose the data source (FortiGate's own schema), the cmdb-vs-monitor split, and what to do next. It does not explicitly state that the operation is read-only or discuss result limits/pagination, so it is not fully complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tight two-sentence structure that front-loads the core capability and the domain split before the follow-up routing. Dense but every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must set expectations, and it does explain the nature of the results and how to consume them via the follow-up tools. It leaves the exact result shape and limit behavior unstated, a minor gap given the concrete examples.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 by explaining the 'kind' domain (configuration vs. live state) and giving keyword-to-path examples ('bgp' -> router/bgp, 'ha peer' -> system/ha-peer) that clarify how 'query' matching works.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find FortiOS API endpoints by keyword') and grounds it in a concrete source ('the FortiGate's own schema'). It also distinguishes the two searchable domains (configuration/cmdb vs. live state/monitor) with worked examples, which no sibling tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('to reach any setting no dedicated tool covers') and names the follow-up tools (describe_config, get_config, set_config, get_monitor), giving a clear workflow. It stops short of stating an explicit when-not rule (e.g. prefer dedicated tools), though that is strongly implied.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| limit | No | Maximum results (default 25) | |
| query | No | Text the application name contains | |
| category | No | Category name or id, e.g. P2P, Proxy, Video/Audio |
TDQS
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.
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.
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.
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.
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.
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_admin_mfaA
Turn on two-factor authentication for an administrator: fortitoken (needs an activated token serial), email (needs email_to and a working email server) or sms (needs sms_phone and SMS service); or disable it. Checks the prerequisites first. dry_run (the default) shows the change. Test a login in a private window before closing your current session.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| admin | Yes | Administrator name | |
| method | Yes | fortitoken, email, sms or disable | |
| dry_run | No | Only validate and show the change (default true) | |
| email_to | No | Address for method email | |
| sms_phone | No | Phone number for method sms | |
| fortitoken | No | Token serial for method fortitoken |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it delivers real operational context: dry_run is the default and only shows the change, prerequisites are validated first, and it warns to test a login in a private window before closing the current session (an implicit lockout-risk disclosure). It omits required privilege level and whether disabling takes effect immediately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and method matrix, then the prerequisite check, then the safe-usage tip. The opening sentence is dense and slightly run-on, but every clause carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, the description covers method selection, per-method prerequisites, and the dry_run safety default. It leaves auth/permission requirements and the effect on active sessions unstated, but the core invocation guidance is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning beyond the schema by binding method values to their dependent parameters (fortitoken→serial, email→email_to, sms→sms_phone) and restating the dry_run default. That dependency mapping is not explicit in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (turn on/disable) and resource (two-factor authentication for an administrator), and enumerates the three supported methods. An agent can distinguish this from sibling admin tools like audit_admin_access or list_admin_sessions 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives per-method conditions clearly: fortitoken needs an activated token serial, email needs email_to plus a working email server, sms needs sms_phone plus SMS service. It also notes prerequisites are checked first. It does not name alternative tools, but no sibling overlaps this function, so context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_configA
Change any configuration endpoint, validated against the FortiGate's schema first: field names, option values, integer ranges, string lengths, and table vs single-object rules. action is update (default), create or delete. With dry_run (the default) nothing is sent; the result shows the request and each field's current and new value. Fields that reference other objects take a list of names, e.g. srcaddr: ['LAB-NET'].
| Name | Required | Description | Default |
|---|---|---|---|
| mkey | No | Entry key; required to update or delete a table entry | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| action | No | update, create or delete (default update) | |
| fields | No | Field values, using the schema's hyphenated names | |
| dry_run | No | Only validate and show the change (default true) | |
| endpoint | Yes | e.g. log/setting, firewall/local-in-policy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden and does most of it: it discloses that validation happens before sending, that dry_run defaults to nothing being sent, and what the result contains (request plus each field's current and new value). It omits permission requirements and whether delete is irreversible, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability and validation behavior, then defaults, then a concrete example. Four dense sentences with no filler; slightly packed but every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generic mutation tool with six params (one nested object) and no output schema, the description covers validation, defaults, and result shape adequately. Missing only sibling routing guidance and any mention of permissions or side effects on delete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does add value beyond the schema by explaining dry_run behavior, the action default, and the notable rule that reference fields take a list of names (e.g. srcaddr: ['LAB-NET']) — but on balance it largely restates what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource scope: changing any configuration endpoint, with pre-validation against the FortiGate schema. It implies a generic setter distinct from read-side siblings like get_config/describe_config, though it never explicitly names those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It documents the action modes (update default, create, delete) and that dry_run defaults to no-op, which is real usage guidance. However, with dozens of dedicated siblings (create_firewall_policy, update_interface, set_dns_server, create_address…), it gives no guidance on when to use this generic tool versus those task-specific ones — the biggest gap in the definition.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | recursive, non-recursive or forward-only | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| interface | Yes | Interface, e.g. port2 |
TDQS
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.
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.
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.
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.
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.
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.
set_syslog_targetA
Send logs to a syslog server: sets server, port and transport on one of the four syslog slots and enables it. mode is udp (default), reliable (TCP) or legacy-reliable; with reliable, enc_algorithm (high, high-medium, low) adds TLS. Validated against the FortiGate's schema; dry_run (the default) shows the change without sending it.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | udp, reliable or legacy-reliable (default udp) | |
| port | No | Port (default 514; 6514 is usual for TLS) | |
| slot | No | Syslog slot 1-4 (default 1) | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| server | No | Collector IP or FQDN | |
| disable | No | Turn the slot off instead (server ignored) | |
| dry_run | No | Only validate and show the change (default true) | |
| enc_algorithm | No | TLS for reliable mode: high, high-medium, low or disable |
TDQS
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 that dry_run is the default and that changes are validated against the FortiGate schema, and it indicates the slot is enabled. However, it does not state permission requirements, persistence, or the effect of disabling a slot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds only operationally relevant detail about modes, TLS, validation, and dry_run. Every clause earns its place, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter configuration mutation with no annotations and no output schema, the description covers the important behavioral settings: slot, server, port, transport, TLS, and dry_run. It omits vdom and disable, but the schema documents those fully, so the description is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The description adds cross-parameter context such as reliable mode plus enc_algorithm adding TLS, but most of its parameter detail duplicates the schema. It does not mention vdom or disable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'sets server, port and transport on one of the four syslog slots and enables it.' It clearly identifies the tool as a syslog-target configuration operation. It does not explicitly differentiate from siblings such as get_log_targets, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose: configure and enable a syslog target. The description mentions default behavior (dry_run, udp) and transport choices, but gives no explicit when-to-use guidance, prerequisites, or alternatives to consider.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fqdn | No | FQDN (instead of subnet or range) | |
| name | Yes | Address name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| end_ip | No | Range end | |
| subnet | No | Subnet in CIDR (10.0.0.0/24) or 'ip mask' form; a host is /32 | |
| comment | No | Comment | |
| start_ip | No | Range start (use with end_ip instead of subnet) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| comment | No | Comment | |
| members | No | Complete new member list |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| domain | No | Domain name handed to clients | |
| status | No | enable or disable | |
| server_id | Yes | DHCP server id | |
| vci_match | No | Only answer clients matching vci-string | |
| lease_time | No | Lease time in seconds | |
| dns_service | No | local (hand out the FortiGate itself), default (system DNS) or specify | |
| default_gateway | No | Gateway handed to clients |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| nat | No | Source NAT to the outgoing interface IP | |
| name | No | Policy name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| action | No | accept or deny | |
| status | No | enable or disable | |
| dstaddr | No | Destination addresses or groups | |
| dstintf | No | Destination interfaces, e.g. [port1] | |
| service | No | Services, e.g. [HTTP, HTTPS] or [ALL] | |
| srcaddr | No | Source addresses or groups, e.g. [LAB-NET] or [all] | |
| srcintf | No | Source interfaces, e.g. [port2] | |
| comments | No | Comment | |
| policyid | Yes | Policy ID | |
| schedule | No | Schedule (default always) | |
| av_profile | No | Antivirus profile ('' to detach) | |
| ips_sensor | No | IPS sensor ('' to detach) | |
| logtraffic | No | all, utm or disable | |
| utm_status | No | Enable security profiles on the policy. Turned on automatically when a profile is given | |
| ssl_ssh_profile | No | SSL/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_list | No | Application control profile, e.g. default ('' to detach) | |
| webfilter_profile | No | Web filter profile ('' to detach) |
TDQS
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.
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.
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.
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.
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.
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_fortiguardA
Ask the FortiGate to contact FortiGuard now and refresh its entitlements and signature packages (the GUI's 'Check update now'). Needs a FortiGuard license. With dry_run (the default) it only reports what would happen and the current signature ages.
| Name | Required | Description | Default |
|---|---|---|---|
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| dry_run | No | Only report (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose a critical behavioral fact: dry_run defaults to true, so by default nothing is changed and only a report is produced. That default-safe disclosure is genuinely valuable. It omits expected duration, whether the refresh can be interrupted, and any rate limits on repeated checks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the action, the prerequisite, and the dry_run default behavior, with the action front-loaded. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, yet the description covers the mutation's side effects and what the dry-run path returns (a report plus signature ages). It is slightly incomplete for a no-annotation mutation in that it doesn't describe the non-dry-run result or how long the FortiGuard contact takes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 for dry_run: it explains that the flag reports what would happen plus the current signature ages, going beyond the schema's terse 'Only report (default true)'. The vdom parameter is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: contact FortiGuard and refresh entitlements and signature packages, with the GUI equivalent ('Check update now') as an anchor. It is clearly distinguished from the read-only sibling get_fortiguard_status because this one triggers an actual refresh action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition (the GUI's 'Check update now') and names a hard prerequisite (FortiGuard license). It does not explicitly say when to prefer this over get_fortiguard_status or get_license_status, so the agent must infer that those are read-only checks and this is the action.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Address in CIDR form (10.0.0.1/24) or 'ip mask' | |
| mode | No | Addressing mode: static, dhcp or pppoe | |
| name | Yes | Interface name, e.g. port2 | |
| role | No | Role: lan, wan, dmz or undefined | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| alias | No | Alias | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| status | No | up or down | |
| allowaccess | No | Management access, e.g. [ping, https, ssh] | |
| description | No | Description |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| comment | No | Comment | |
| members | No | Complete new member list |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Profile name, e.g. custom-deep-inspection | |
| vdom | No | VDOM (default: FORTIGATE_VDOM, usually root) | |
| extra | No | Extra FortiOS attributes merged into the request body as-is (hyphenated keys) | |
| caname | No | CA certificate used to re-sign trusted sites | |
| comment | No | Comment | |
| untrusted_caname | No | CA used to re-sign sites with untrusted certificates |
TDQS
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.
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.
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.
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.
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.
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.
19 tool updates
v1.1.3- Added
audit_admin_access - Added
audit_hardening - Added
audit_policy_protection - Added
describe_config - Added
get_config - Added
get_firmware_status - Added
get_fortiguard_status - Added
get_ha_status - Added
get_license_features - Added
get_log_targets - Changed
get_logs3 fields changed- added
Input schema / properties / filter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / filter / descriptionPrevious value: -"FortiOS log filter, e.g. srcip==192.168.150.10 or policyid==1 or hostname=@github"New value: +"FortiOS log filter, e.g. srcip==192.168.150.10 or hostname=@github. A comma ORs values of one field (dstport==4332,dstport==4432); pass a list to AND terms ([srcip==10.0.0.5, dstport==443])." - removed
Input schema / properties / filter / typeRemoved value: -"string"
- Added
get_monitor - Added
list_fortitokens - Added
list_security_profiles - Added
search_api - Added
set_admin_mfa - Added
set_config - Added
set_syslog_target - Added
update_fortiguard
70 tool updates
v0.4.1- First observed
activate_vm_eval_license - First observed
add_app_control_rule - First observed
add_dhcp_reservation - First observed
add_dns_record - First observed
backup_config - First observed
create_address - First observed
create_address_group - First observed
create_dns_zone - First observed
create_firewall_policy - First observed
create_port_forward - First observed
create_service - First observed
create_service_group - First observed
create_static_route - First observed
delete_address - First observed
delete_address_group - First observed
delete_app_control_rule - First observed
delete_dhcp_reservation - First observed
delete_dns_record - First observed
delete_dns_server - First observed
delete_dns_zone - First observed
delete_firewall_policy - First observed
delete_port_forward - First observed
delete_service - First observed
delete_service_group - First observed
delete_static_route - First observed
download_certificate - First observed
forticonverter_setup_prompt - First observed
fortigate_api - First observed
get_address - First observed
get_arp_table - First observed
get_dns_settings - First observed
get_firewall_policy - First observed
get_interface - First observed
get_interface_status - First observed
get_license_limits - First observed
get_license_status - First observed
get_logs - First observed
get_policy_stats - First observed
get_resource_usage - First observed
get_routing_table - First observed
get_system_status - First observed
get_top_traffic - First observed
list_address_groups - First observed
list_addresses - First observed
list_admin_sessions - First observed
list_app_categories - First observed
list_app_control_profiles - First observed
list_certificates - First observed
list_dhcp_leases - First observed
list_dhcp_servers - First observed
list_dns_servers - First observed
list_dns_zones - First observed
list_firewall_policies - First observed
list_interfaces - First observed
list_port_forwards - First observed
list_service_groups - First observed
list_services - First observed
list_sessions - First observed
list_ssl_ssh_profiles - First observed
list_static_routes - First observed
move_firewall_policy - First observed
search_applications - First observed
set_dns_server - First observed
update_address - First observed
update_address_group - First observed
update_dhcp_server - First observed
update_firewall_policy - First observed
update_interface - First observed
update_service_group - First observed
update_ssl_ssh_profile
TDQS
Scored across 88 tools
Most tools target distinct resources and actions (e.g., list_addresses vs create_address_group vs list_firewall_policies), and descriptions clarify boundaries. Some overlap exists between the generic API tools (get_config/set_config/fortigate_api) and dedicated update/create tools, and audit_admin_access overlaps with audit_hardening, but descriptions generally resolve which to use.
The set predominantly follows a consistent verb_noun snake_case pattern (list_, get_, create_, update_, delete_, audit_, set_). A couple of tools break the pattern (forticonverter_setup_prompt and fortigate_api are noun phrases), but overall naming is predictable and readable.
88 tools is far beyond the typical 3-15 range and qualifies as an extreme mismatch. The presence of generic config tools (search_api, get_config, set_config, fortigate_api) makes many dedicated tools redundant, bloating the surface and increasing selection cost.
Coverage is exceptionally thorough: firewall policies, addresses, services, DNS/DHCP, routing, interfaces, licenses, HA, audits, logs, security profiles, certificates, and a generic REST escape hatch. There are no obvious gaps for managing a FortiGate.
Maintenance
Related MCP Connectors
Real-time MCP & A2A prompt-injection, jailbreak, and tool-schema poisoning firewall for AI agents.
Run field service from Claude, ChatGPT or Copilot: dispatch, billing, customer messages, photos, and change the software itself, with a confirm step before every change. This address is the India region; US East, Canada, Norway and NZ addresses are at fieldproxy.ai/mcp.
Manage hosts, redirects, SSL, and traffic analytics from Claude and other AI assistants.
- sentinelOAuthio.rootstuff
Uptime, SSL, DNS and domain monitoring you can talk to from Claude or any MCP client.
Related MCP Servers
- AlicenseBqualityDmaintenanceA complete MCP server for Fortinet FortiOS 7.6.x that exposes the entire REST API as typed MCP tools for use with MCP-compatible clients like Claude Desktop.10011MIT
- FlicenseAqualityDmaintenanceConnects Claude Desktop to FortiGate firewalls via REST API for read-only config inspection and safe write operations with dry-run confirmation.18-
- AlicenseNot gradedqualityDmaintenanceProvides programmatic access to FortiGate devices for managing firewall policies, routing, virtual IPs, and device operations, enabling integration with MCP-compatible clients like Claude Desktop.MIT
- FlicenseNot gradedqualityAmaintenanceEnables natural-language management of a pfSense firewall from Claude Desktop, Claude Code, or any MCP client, covering firewall rules, NAT, VPNs, routing, DNS, DHCP, certificates, and diagnostics across 332 wire-format-verified tools. Every destructive change passes through confirmation guardrails, rate limits, and config-revision rollback with secrets redacted from logs.-