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 was built and tested against a FortiGate-VM on the free permanent evaluation license fronting a k3s cluster on Proxmox, so it knows that license's limits and FortiOS 7.6's quirks, and it can connect the firewall to the cluster and to the hypervisor around it.
What makes it different
Built for the free FortiGate-VM. The permanent evaluation license allows 3 policies, 3 interfaces and 3 static routes, has no FortiGuard services and runs in low-encryption mode.
get_license_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; sync tools dry-run first; license activation needs
confirm=true; a failed port forward rolls itself back; credentials come from the environment (or your keychain), never from tool arguments.Errors that explain. FortiOS hides the reason for a failure in the response body (
cli_error). Every error message includes it, so "HTTP 500" becomes "Addresses/groups cannot be mixed with virtual IPs".Tested against a real FortiGate. Every tool was run against FortiOS 7.6.7 on a FortiGate-VM, on top of a unit-test suite that runs in CI on Python 3.10 to 3.13.
Related MCP server: FortiOS 7.6.x MCP Server
Quick start
You need Python 3.10+ with uv, a FortiGate running FortiOS 7.6 (appliance or VM, licensed; see zero to firewall to deploy a free one), and a REST API token.
1. Create an API token on the FortiGate
In the GUI: System > Administrators > Create New > REST API Admin. Pick an administrator profile (super_admin to allow changes, or a read-only profile so FortiOS also refuses writes), set Trusted Hosts to the machine that runs this server, and save. The key is shown once.
Or on the CLI (FortiOS asks for your admin password before it creates an admin):
config system api-user
edit mcp-api
set accprofile super_admin
set vdom root
config trusthost
edit 1
set ipv4-trusthost 192.168.1.50 255.255.255.255
next
end
next
end
execute api-user generate-key mcp-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@v0.4.1 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@v0.4.1 fortigate-mcp-server'{
"mcpServers": {
"fortigate": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ry-ops/fortigate-mcp-server@v0.4.1", "fortigate-mcp-server"],
"env": {
"FORTIGATE_HOST": "192.168.1.99",
"FORTIGATE_API_TOKEN": "your-token",
"FORTIGATE_READ_ONLY": "true"
}
}
}
}git clone https://github.com/ry-ops/fortigate-mcp-server && cd fortigate-mcp-server
uv sync
cp .env.example .env # fill in FORTIGATE_HOST and FORTIGATE_API_TOKEN
uv run fortigate-mcp-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?"
"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). |
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
74 tools in 12 areas. Expand an area for one line per tool; your MCP client shows each tool's full description and input schema.
Tool | What it does |
| FortiGate model, serial, firmware version/build, hostname and uptime. |
| License and FortiGuard contract status. |
| How much of the license's object limits is used. |
| 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. |
| 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). |
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 firewall sessions, optionally filtered. |
| 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. |
| 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. |
| 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 |
| 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. |
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. |
| 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 |
| 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 |
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).
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@v0.4.1; drop the @v… to track main. The version is in pyproject.toml and fortigate_mcp.__version__.
Development
uv sync
uv run pytest
uv run ruff check .
python3 scripts/gen_tool_catalog.py # refresh the tool catalog above
python3 scripts/build_demo_svg.py # rebuild docs/demo.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
70 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.
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.
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_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_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_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 policyid==1 or hostname=@github | |
| 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 does disclose real behavioral traits: results are ordered newest-first, and FortiGate-VMs without a log disk hold logs only in memory, lost on reboot. It omits auth/permission requirements and any rate-limit behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and ordering, then a compact type breakdown, then the operational caveat. Every sentence carries information and none repeats the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter read tool with no output schema and no annotations, the description supplies ordering, log-type semantics, and the memory-volatility caveat. It leaves the shape of returned rows and any permission requirements unstated, but the fields/rows parameters imply row-level output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining what several log_type values actually contain (traffic/forward = sessions through policies with app ID; app-ctrl = per-connection app and, with cert inspection, HTTPS hostname), adding semantics beyond the schema's flat enumeration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read FortiGate logs') plus a scoping trait ('newest first'), which clearly separates it from siblings like list_sessions, get_top_traffic and get_policy_stats that surface derived rather than raw log data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Useful types' list implicitly guides which log_type to pick and what each contains, but there is no explicit when-to-use/when-not-to-use guidance and no named alternative (e.g. list_sessions for live session state vs. get_logs for historical records).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_policy_statsC
Hit counts, bytes, packets and last-used time per policy.
| 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_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_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_sessionsC
Current firewall sessions, optionally filtered.
| 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?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Current' weakly implies a live snapshot read, but nothing is said about whether this is read-only, what a session record contains, whether results are paginated/truncated by the count default, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler, and the resource is front-loaded. It is efficient, though the extreme brevity sits near the line between concise and under-specified for a tool with seven parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Seven all-optional parameters, no annotations, and no output schema, yet the description explains nothing about return contents, result limits, or the distinction between this and list_admin_sessions. For a tool of this surface area the description leaves substantial gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every filter parameter (vdom, count, dstaddr, dstport, srcaddr, policyid, resolve_vms) is already documented in the schema. The description adds no filter syntax, combination semantics, or defaults beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (firewall sessions) and implies a list verb, which is the minimum viable. However it is a bare noun phrase with no verb, and it does not distinguish itself from the nearby sibling list_admin_sessions, which an agent could easily confuse for the same thing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool, when not to, or which alternatives exist (e.g. list_admin_sessions, get_top_traffic, get_logs). 'Optionally filtered' hints that filters exist but gives no guidance on choosing between the unfiltered and filtered modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ssl_ssh_profilesA
List SSL/SSH inspection profiles with the CA each one re-signs with. The built-in no-inspection, certificate-inspection and deep-inspection profiles are read-only; edit custom-deep-inspection or a copy instead.
| 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_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_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.
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_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.
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 70 tools
While many tools have distinct resource+action purposes, there is significant overlap in generic tools such as fortigate_api (which can do anything) and get_system_status/get_resource_usage/get_license_status all providing system-level info. Some naming like get_interface_status vs get_interface vs list_interfaces could confuse, though descriptions help.
Most tools follow a consistent verb_noun pattern (e.g., list_, get_, create_, update_, delete_), with a few exceptions like backup_config, activate_vm_eval_license, and fortigate_api which are action-oriented but still descriptive. Overall predictable.
70 tools is heavy for a single MCP server, likely overwhelming for an agent and increasing selection complexity. It covers many FortiGate domains but may be better split into sub-servers by function.
The tool set provides comprehensive coverage across interfaces, policies, addresses, services, certificates, DNS, DHCP, routing, logs, and more. CRUD operations are present for most resources, with no obvious dead ends for the stated purpose.
Maintenance
Related MCP Connectors
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.
- sentinelOAuthio.rootstuff
Uptime, SSL, DNS and domain monitoring you can talk to from Claude or any MCP client.
Security firewall for AI agents — scans MCP calls for injection, secrets, and risks.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables programmatic management of FortiGate firewall devices through MCP, supporting firewall policies, network objects, virtual IPs, routing, and interface management with Cursor IDE integration.MIT
- 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
- AlicenseBqualityAmaintenanceEnables AI assistants to interact with FortiManager for centralized firewall policy management, device provisioning, and network configuration through the FortiManager JSON-RPC API.1006MIT
- FlicenseAqualityDmaintenanceConnects Claude Desktop to FortiGate firewalls via REST API for read-only config inspection and safe write operations with dry-run confirmation.18-